From cec788759d770e8b8305cd0e0084df8798a72c1e Mon Sep 17 00:00:00 2001 From: Theodore Date: Tue, 20 Dec 2022 23:11:41 +0100 Subject: [PATCH] v2.7 (#98) --- .github/workflows/dev-mkl-vtk.yml | 10 +- .github/workflows/dev-vtk.yml | 30 +- .github/workflows/master-mkl-vtk.yml | 12 +- CHANGELOG.md | 12 + CITATION.cff | 4 +- CMakeLists.txt | 9 +- Constraint/BC/MultiplierBC.cpp | 38 +- Constraint/LJPotential2D.h | 1 + Constraint/LinearSpring2D.h | 1 + Constraint/RestitutionWallPenalty.cpp | 5 +- Constraint/RestitutionWallPenalty.h | 3 +- Constraint/RigidWallPenalty.h | 1 + Converger/AbsDisp.cpp | 8 +- Converger/AbsDisp.h | 2 +- Converger/AbsError.cpp | 6 +- Converger/AbsError.h | 2 +- Converger/AbsIncreAcc.cpp | 47 ++ Converger/AbsIncreAcc.h | 45 ++ Converger/AbsIncreDisp.cpp | 5 +- Converger/AbsIncreDisp.h | 2 +- Converger/AbsIncreEnergy.cpp | 8 +- Converger/AbsIncreEnergy.h | 2 +- Converger/AbsResidual.cpp | 13 +- Converger/AbsResidual.h | 2 +- Converger/CMakeLists.txt | 2 + Converger/Converger | 2 + Converger/Converger.cpp | 13 + Converger/Converger.h | 4 +- Converger/ConvergerParser.cpp | 2 + Converger/FixedNumber.cpp | 9 +- Converger/FixedNumber.h | 7 +- Converger/LogicConverger.cpp | 18 +- Converger/LogicConverger.h | 6 +- Converger/RelDisp.cpp | 7 +- Converger/RelDisp.h | 2 +- Converger/RelError.cpp | 7 +- Converger/RelError.h | 2 +- Converger/RelIncreAcc.cpp | 37 + Converger/RelIncreAcc.h | 45 ++ Converger/RelIncreDisp.cpp | 10 +- Converger/RelIncreDisp.h | 2 +- Converger/RelIncreEnergy.cpp | 23 +- Converger/RelIncreEnergy.h | 2 +- Converger/RelResidual.cpp | 22 +- Converger/RelResidual.h | 4 +- Database/HDF.cpp | 2 +- Developer/Modifier/ModifierExample.cpp | 2 +- Domain/ConditionalModifier.cpp | 2 - Domain/ConditionalModifier.h | 2 +- Domain/Domain.cpp | 12 +- Domain/Domain.h | 7 +- Domain/DomainBase.h | 9 +- Domain/DomainState.cpp | 58 +- Domain/Factory.hpp | 108 +-- Domain/MetaMat/BandMat.hpp | 6 + Domain/MetaMat/BandSymmMat.hpp | 11 +- Domain/MetaMat/DenseMat.hpp | 7 +- Domain/MetaMat/MetaMat.hpp | 15 + Domain/MetaMat/SymmPackMat.hpp | 46 +- Domain/MetaMat/csc_form.hpp | 2 +- Domain/MetaMat/csr_form.hpp | 2 +- Domain/MetaMat/operator_times.hpp | 65 +- Domain/MetaMat/triplet_form.hpp | 2 +- Element/Beam/EB21.cpp | 8 +- Element/Cube/C3D20.cpp | 2 - Element/Cube/C3D8.cpp | 2 - Element/Cube/C3D8I.cpp | 4 +- Element/Cube/CIN3D8.cpp | 12 +- Element/Cube/DC3D8.cpp | 2 - Element/Membrane/Axisymmetric/CAX8.cpp | 2 - Element/Membrane/CSM/CSMQ.cpp | 3 - Element/Membrane/CSM/CSMQ4.cpp | 1 - Element/Membrane/CSM/CSMQ8.cpp | 3 - Element/Membrane/Drilling/GQ12.cpp | 3 - Element/Membrane/Infinite/CINP4.cpp | 3 - Element/Membrane/Mixed/PS.cpp | 3 - Element/Membrane/Mixed/QE2.cpp | 1 - Element/Membrane/PFM/DCP4.cpp | 1 - Element/Membrane/Plane/CP4.cpp | 1 - Element/Membrane/Plane/CP4I.cpp | 3 - Element/Membrane/Plane/CP5.cpp | 3 - Element/Membrane/Plane/CP7.cpp | 3 - Element/Membrane/Plane/CP8.cpp | 3 - Element/Membrane/Porous/PCPE4DC.cpp | 1 - Element/Membrane/Porous/PCPE4UC.cpp | 1 - Element/Membrane/Porous/PCPE8DC.cpp | 1 - Element/Membrane/Porous/PCPE8UC.cpp | 1 - Element/Special/Joint.cpp | 2 - Element/Visualisation/vtkBase.h | 1 + Enhancement/suanPan.iss | 5 +- Enhancement/suanPan.sublime-completions | 44 +- Enhancement/suanPan.sublime-syntax | 4 +- Enhancement/suanpan.nuspec | 2 +- Example/Element/Allman.supan | 12 +- Example/Element/C3D20.supan | 2 +- Example/Element/C3D20NL.supan | 6 +- Example/Element/C3D4.supan | 20 +- Example/Element/C3D4NL.supan | 6 +- Example/Element/C3D8R.supan | 12 +- Example/Element/CAX3.supan | 12 +- Example/Element/CAX4.supan | 18 +- Example/Element/CAX8.supan | 18 +- Example/Element/CIN3D8.supan | 6 +- Example/Element/CINP4.supan | 12 +- Example/Element/CP4NL.supan | 6 +- Example/Element/CP4R.supan | 6 +- Example/Element/CP5.supan | 12 +- Example/Element/CP7.supan | 12 +- Example/Element/CSMQ4.supan | 12 +- Example/Element/CSMQ7.supan | 12 +- Example/Element/CSMQ8.supan | 6 +- Example/Element/CSMT3.supan | 12 +- Example/Element/CSMT6.supan | 12 +- Example/Element/Contact2D.supan | 6 +- Example/Element/DC3D4.supan | 2 +- Example/Element/DCP4.supan | 2 +- Example/Element/DKT3.supan | 6 +- Example/Element/DKT4.supan | 6 +- Example/Element/DKT48.supan | 6 +- Example/Element/DKTS3.supan | 6 +- Example/Element/Damper01.supan | 15 +- Example/Element/Damper02.supan | 15 +- Example/Element/Damper03.supan | 15 +- Example/Element/Damper04.supan | 15 +- Example/Element/EB21.supan | 12 +- Example/Element/GCMQ.supan | 2 +- Example/Element/IP.supan | 2 +- Example/Element/Joint.supan | 12 +- Example/Element/MassPoint.supan | 15 +- Example/Element/PCPE4DC.supan | 12 +- Example/Element/PCPE4UC.supan | 12 +- Example/Element/PCPE8DC.supan | 18 +- Example/Element/PCPE8UC.supan | 18 +- Example/Element/PatchCube.supan | 24 +- Example/Element/PatchQuad.supan | 12 +- Example/Element/SingleSection.supan | 6 +- Example/Element/Spring01.supan | 6 +- Example/Element/Spring02.supan | 6 +- Example/Element/T3D2S.supan | 2 +- Example/Material/ArmstrongFrederick.supan | 24 +- Example/Material/ArmstrongFrederick1D.supan | 6 +- Example/Material/Bilinear1D.supan | 6 +- Example/Material/Bilinear2D.supan | 6 +- Example/Material/BilinearCC.supan | 6 +- Example/Material/BilinearElastic1D.supan | 6 +- Example/Material/BilinearHoffman.supan | 6 +- Example/Material/BilinearMises1D.supan | 6 +- Example/Material/BilinearPeric.supan | 24 +- Example/Material/BilinearViscosity.supan | 10 +- Example/Material/BlatzKo.supan | 6 +- Example/Material/CDP.supan | 28 +- Example/Material/CDPM2.supan | 33 +- Example/Material/CDPM2PS.supan | 12 +- Example/Material/CDPPS.supan | 12 +- Example/Material/Concrete01.supan | 6 +- Example/Material/ConcreteCM2.supan | 6 +- Example/Material/DP.supan | 6 +- Example/Material/ExpCC.supan | 6 +- Example/Material/ExpDP.supan | 6 +- Example/Material/ExpGurson.supan | 6 +- Example/Material/ExpGurson1D.supan | 6 +- Example/Material/ExpHoffman.supan | 6 +- Example/Material/ExpJ2.supan | 6 +- Example/Material/ExpMises1D.supan | 6 +- Example/Material/Kelvin.supan | 10 +- Example/Material/Laminated.supan | 12 +- Example/Material/LinearDamage.supan | 2 +- Example/Material/LinearHoffman.supan | 6 +- Example/Material/MPF.supan | 6 +- Example/Material/Maxwell.supan | 10 +- Example/Material/MooneyRivlin.supan | 6 +- Example/Material/MultilinearJ2.supan | 2 +- Example/Material/MultilinearMises1D.supan | 6 +- Example/Material/NLE1D01.supan | 6 +- Example/Material/OrthotropicElastic3D.supan | 2 +- Example/Material/ParabolicCC.supan | 2 +- Example/Material/Parallel.supan | 6 +- Example/Material/PolyJ2.supan | 24 +- Example/Material/RO.supan | 6 +- Example/Material/Sequential.supan | 6 +- Example/Material/SimpleSand.supan | 6 +- Example/Material/Sinh.supan | 66 ++ Example/Material/SlipLock.supan | 6 +- Example/Material/SteelBRB.supan | 6 +- Example/Material/Substepping.supan | 6 +- Example/Material/VAFCRP.supan | 24 +- Example/Material/VAFCRP1D.supan | 6 +- Example/Material/Yeoh.supan | 6 +- Example/Other/BodyForce.supan | 7 +- Example/Other/Collision2D.supan | 15 +- Example/Other/Collision3D.supan | 15 +- Example/Other/Embed2D.supan | 6 +- Example/Other/FixedLength.supan | 12 +- Example/Other/Group.supan | 7 +- Example/Other/GroupBodyForce.supan | 7 +- Example/Other/GroupDisplacement.supan | 7 +- Example/Other/GroupLoad.supan | 7 +- Example/Other/LJP2D.supan | 15 +- Example/Other/LinearParticle.supan | 17 +- Example/Other/MPC.supan | 12 +- Example/Other/MaxGap2D.supan | 12 +- Example/Other/MinGap2D.supan | 12 +- Example/Other/NodeFacet.supan | 31 + Example/Other/NodeLine.supan | 6 +- Example/Other/RestitutionWall1D.supan | 17 +- Example/Other/RestitutionWall2D.supan | 17 +- Example/Other/RestitutionWall3D.supan | 17 +- Example/Other/RigidWall1D.supan | 13 +- Example/Other/RigidWall2D.supan | 13 +- Example/Other/RigidWall3D.supan | 13 +- Example/Other/RigidWallMultiplier.supan | 4 +- Example/Section/Fibre1D.supan | 2 +- Example/Section/Fibre2D.supan | 6 +- Example/Section/HSection2D.supan | 6 +- Example/Section/ISection2D.supan | 6 +- Example/Section/ISection3D.supan | 6 +- Example/Section/TSection3D.supan | 6 +- Example/Solver/Amplitude.supan | 15 +- Example/Solver/BFGS.supan | 9 +- Example/Solver/BICGSTAB.supan | 6 +- Example/Solver/Band.supan | 6 +- Example/Solver/BandSymm.supan | 6 +- Example/Solver/BatheExplicit.supan | 59 ++ Example/Solver/BatheTwoStep.supan | 15 +- Example/Solver/ElementalModal.supan | 15 +- Example/Solver/FEAST.BAND.supan | 2 +- Example/Solver/FEAST.FULL.supan | 2 +- Example/Solver/FEAST.SPARSE.supan | 2 +- Example/Solver/FGMRES.supan | 6 +- Example/Solver/Frequency.supan | 2 +- Example/Solver/FullMat.supan | 6 +- Example/Solver/GMRES.supan | 6 +- Example/Solver/GSSSSOptimal.supan | 17 +- Example/Solver/GSSSSU0.supan | 15 +- Example/Solver/GSSSSV0.supan | 15 +- Example/Solver/GeneralizedAlpha.supan | 16 +- Example/Solver/Lee.supan | 14 +- Example/Solver/LeeElemental.supan | 10 +- Example/Solver/LeeFull.supan | 13 +- Example/Solver/LeeFullElastic.supan | 72 ++ Example/Solver/LeeFullIterative.supan | 10 +- Example/Solver/Momentum.supan | 15 +- Example/Solver/Newmark.supan | 13 +- Example/Solver/Newton.supan | 7 +- Example/Solver/PARDISO.supan | 6 +- Example/Solver/Ramm.supan | 9 +- Example/Solver/RayleighNewmark.supan | 15 +- Example/Solver/SHALLOW.ARC.supan | 6 +- Example/Solver/SuperLU.supan | 6 +- Example/Solver/SupportMotion.supan | 13 +- Example/Solver/SupportMotionA.supan | 13 +- Example/Solver/SupportMotionBatheA.supan | 15 +- Example/Solver/SupportMotionBatheV.supan | 15 +- Example/Solver/SupportMotionD.supan | 13 +- Example/Solver/SupportMotionGAE.supan | 50 ++ Example/Solver/SupportMotionGSSSSA.supan | 19 +- Example/Solver/SupportMotionGSSSSV.supan | 17 +- Example/Solver/SupportMotionOALTSA.supan | 50 ++ Example/Solver/SupportMotionOALTSV.supan | 50 ++ Example/Solver/SupportMotionTchamwaA.supan | 48 ++ Example/Solver/SupportMotionV.supan | 13 +- Example/Solver/SymmPack.supan | 6 +- Example/Solver/TabularSpline.supan | 12 +- Example/Solver/Tchamwa.supan | 59 ++ Example/Solver/WilsonPenzien.supan | 11 +- Example/Solver/mNewton.supan | 9 +- Example/Solver/mumps.supan | 6 +- Include/armadillo/armadillo | 41 +- .../armadillo/armadillo_bits/Col_bones.hpp | 6 +- Include/armadillo/armadillo_bits/Col_meat.hpp | 114 ++- .../armadillo/armadillo_bits/Cube_bones.hpp | 60 +- .../armadillo/armadillo_bits/Cube_meat.hpp | 518 ++++++++------ .../armadillo_bits/GenCube_bones.hpp | 11 +- .../armadillo/armadillo_bits/GenCube_meat.hpp | 104 +-- .../armadillo_bits/GenSpecialiser.hpp | 58 -- .../armadillo/armadillo_bits/Gen_bones.hpp | 11 +- Include/armadillo/armadillo_bits/Gen_meat.hpp | 161 +---- .../armadillo/armadillo_bits/MapMat_meat.hpp | 22 +- .../armadillo/armadillo_bits/Mat_bones.hpp | 14 +- Include/armadillo/armadillo_bits/Mat_meat.hpp | 209 +++--- Include/armadillo/armadillo_bits/Proxy.hpp | 96 +-- .../armadillo/armadillo_bits/ProxyCube.hpp | 92 +-- .../armadillo/armadillo_bits/Row_bones.hpp | 6 +- Include/armadillo/armadillo_bits/Row_meat.hpp | 114 ++- .../armadillo/armadillo_bits/SpMat_meat.hpp | 29 +- Include/armadillo/armadillo_bits/SpProxy.hpp | 10 +- .../armadillo/armadillo_bits/arma_config.hpp | 7 + .../armadillo/armadillo_bits/arma_forward.hpp | 3 +- Include/armadillo/armadillo_bits/arma_rng.hpp | 132 ++++ .../armadillo/armadillo_bits/arma_version.hpp | 6 +- .../armadillo_bits/arrayops_bones.hpp | 9 - .../armadillo_bits/arrayops_meat.hpp | 89 +-- .../armadillo/armadillo_bits/auxlib_bones.hpp | 31 +- .../armadillo/armadillo_bits/auxlib_meat.hpp | 200 ++---- .../armadillo_bits/compiler_setup.hpp | 16 +- Include/armadillo/armadillo_bits/config.hpp | 62 +- .../armadillo/armadillo_bits/config.hpp.cmake | 56 +- Include/armadillo/armadillo_bits/debug.hpp | 28 +- Include/armadillo/armadillo_bits/def_hdf5.hpp | 2 +- .../armadillo/armadillo_bits/distr_param.hpp | 55 +- .../armadillo_bits/eglue_core_meat.hpp | 40 +- Include/armadillo/armadillo_bits/eop_aux.hpp | 4 +- .../armadillo/armadillo_bits/field_bones.hpp | 4 +- .../armadillo/armadillo_bits/field_meat.hpp | 6 +- Include/armadillo/armadillo_bits/fn_accu.hpp | 33 +- .../armadillo/armadillo_bits/fn_as_scalar.hpp | 34 - Include/armadillo/armadillo_bits/fn_chol.hpp | 2 +- .../{fn_cond.hpp => fn_cond_rcond.hpp} | 4 +- Include/armadillo/armadillo_bits/fn_eye.hpp | 22 +- Include/armadillo/armadillo_bits/fn_find.hpp | 81 +++ Include/armadillo/armadillo_bits/fn_inv.hpp | 9 +- .../armadillo/armadillo_bits/fn_inv_sympd.hpp | 9 +- Include/armadillo/armadillo_bits/fn_norm.hpp | 26 +- Include/armadillo/armadillo_bits/fn_ones.hpp | 23 +- Include/armadillo/armadillo_bits/fn_pinv.hpp | 18 +- .../armadillo/armadillo_bits/fn_powext.hpp | 179 +++++ Include/armadillo/armadillo_bits/fn_randg.hpp | 50 +- Include/armadillo/armadillo_bits/fn_randi.hpp | 50 +- Include/armadillo/armadillo_bits/fn_randn.hpp | 262 +++++-- Include/armadillo/armadillo_bits/fn_randu.hpp | 258 +++++-- Include/armadillo/armadillo_bits/fn_speye.hpp | 11 +- .../armadillo/armadillo_bits/fn_spsolve.hpp | 2 +- Include/armadillo/armadillo_bits/fn_trace.hpp | 25 +- Include/armadillo/armadillo_bits/fn_zeros.hpp | 34 +- .../armadillo_bits/glue_kron_meat.hpp | 19 +- .../armadillo_bits/glue_powext_bones.hpp | 70 ++ .../armadillo_bits/glue_powext_meat.hpp | 674 ++++++++++++++++++ .../armadillo_bits/glue_solve_meat.hpp | 212 +++--- .../armadillo_bits/gmm_diag_meat.hpp | 4 + .../armadillo_bits/gmm_full_meat.hpp | 4 + .../armadillo/armadillo_bits/include_hdf5.hpp | 37 +- .../armadillo_bits/include_superlu.hpp | 265 +++---- .../armadillo_bits/injector_meat.hpp | 4 + Include/armadillo/armadillo_bits/memory.hpp | 2 + .../newarp_SparseGenRealShiftSolve_meat.hpp | 7 +- .../armadillo/armadillo_bits/op_chol_meat.hpp | 2 +- .../armadillo_bits/op_cond_bones.hpp | 7 +- .../armadillo/armadillo_bits/op_cond_meat.hpp | 169 +++-- .../armadillo_bits/op_expmat_meat.hpp | 2 +- .../armadillo_bits/op_find_bones.hpp | 11 + .../armadillo/armadillo_bits/op_find_meat.hpp | 46 ++ .../armadillo_bits/op_inv_gen_bones.hpp | 15 +- .../armadillo_bits/op_inv_gen_meat.hpp | 72 +- .../armadillo_bits/op_inv_spd_bones.hpp | 11 +- .../armadillo_bits/op_inv_spd_meat.hpp | 70 +- .../armadillo_bits/op_nonzeros_meat.hpp | 36 +- .../armadillo_bits/op_pinv_bones.hpp | 12 + .../armadillo/armadillo_bits/op_pinv_meat.hpp | 39 + .../armadillo_bits/op_rcond_bones.hpp | 32 + .../armadillo_bits/op_rcond_meat.hpp | 113 +++ .../armadillo/armadillo_bits/op_sum_meat.hpp | 123 +++- .../armadillo_bits/sp_auxlib_meat.hpp | 32 +- .../armadillo_bits/spop_norm_bones.hpp | 2 + .../armadillo_bits/spop_norm_meat.hpp | 22 + .../subview_cube_each_bones.hpp | 10 +- .../armadillo_bits/subview_cube_each_meat.hpp | 18 +- .../armadillo_bits/subview_each_bones.hpp | 10 +- .../armadillo_bits/subview_each_meat.hpp | 12 +- .../armadillo_bits/subview_elem1_meat.hpp | 2 +- .../armadillo_bits/subview_elem2_meat.hpp | 2 +- .../armadillo_bits/subview_field_meat.hpp | 2 +- .../armadillo_exts/BandMat_bones.hpp | 79 -- .../armadillo/armadillo_exts/BandMat_meat.hpp | 345 --------- .../armadillo/armadillo_exts/BdOp_bones.hpp | 18 - .../armadillo/armadillo_exts/BdOp_meat.hpp | 13 - .../armadillo/armadillo_exts/SmOp_bones.hpp | 18 - .../armadillo/armadillo_exts/SmOp_meat.hpp | 13 - .../armadillo_exts/SymmMat_bones.hpp | 76 -- .../armadillo/armadillo_exts/SymmMat_meat.hpp | 429 ----------- Include/armadillo/armadillo_exts/debug.hpp | 9 - .../armadillo/armadillo_exts/def_lapack.hpp | 8 - Include/armadillo/armadillo_exts/fn_inv.hpp | 7 - Include/armadillo/armadillo_exts/fn_solve.hpp | 10 - .../armadillo_exts/glue_solve_bones.hpp | 32 - .../armadillo_exts/glue_solve_meat.hpp | 0 .../armadillo_exts/glue_times_bones.hpp | 72 -- .../armadillo_exts/glue_times_meat.hpp | 0 .../armadillo_exts/operator_times.hpp | 61 -- .../armadillo_exts/smop_inv_bones.hpp | 47 -- .../armadillo_exts/smop_inv_meat.hpp | 0 Include/armadillo/armadillo_exts/traits.hpp | 17 - .../armadillo/armadillo_exts/typedef_mat.hpp | 0 Include/armadillo/armadillo_shadow | 31 - Include/catch/catch.hpp | 28 +- Libs/win/libfext.dll | Bin 4948041 -> 4922918 bytes Libs/win/libfext.lib | Bin 520672 -> 569110 bytes Libs/win/libmetis.dll | Bin 679069 -> 679069 bytes Libs/win/libmetis.lib | Bin 185356 -> 234828 bytes .../ElementExample/ElementExample.vcxproj | 2 +- .../MaterialExample/MaterialExample.vcxproj | 2 +- .../ModifierExample/ModifierExample.vcxproj | 2 +- .../suanPan/ModuleBundle/ModuleBundle.vcxproj | 2 +- .../SectionExample/SectionExample.vcxproj | 2 +- MSVC/suanPan/arpack/arpack.vfproj | 14 +- MSVC/suanPan/metis/metis.vcxproj | 4 +- MSVC/suanPan/mumps_c/mumps_c.vcxproj | 2 +- MSVC/suanPan/suanPan.sln | 11 +- MSVC/suanPan/suanPan/suanPan.vcxproj | 23 +- MSVC/suanPan/suanPan/suanPan.vcxproj.filters | 51 ++ MSVC/suanPan/superlu/superlu.vcxproj | 4 +- MSVC/suanPan/superlumt/superlumt.vcxproj | 4 +- Material/Material1D/CMakeLists.txt | 2 + Material/Material1D/Elastic/Sinh1D.cpp | 62 ++ Material/Material1D/Elastic/Sinh1D.h | 58 ++ Material/Material1D/Elastic/Tanh1D.cpp | 62 ++ Material/Material1D/Elastic/Tanh1D.h | 58 ++ Material/Material1D/Material1D | 12 +- Material/Material1D/Viscosity/Maxwell.cpp | 4 +- .../vonMises/ArmstrongFrederick1D.cpp | 7 +- .../Material1D/vonMises/NonlinearGurson1D.cpp | 18 +- Material/Material1D/vonMises/VAFCRP1D.cpp | 11 +- Material/Material2D/Bilinear2D.cpp | 19 +- Material/Material2D/Elastic/Elastic2D.cpp | 17 +- Material/Material3D/Concrete/CDPM2.cpp | 11 +- Material/Material3D/Concrete/NonlinearCDP.cpp | 13 +- .../vonMises/ArmstrongFrederick.cpp | 7 +- Material/Material3D/vonMises/BilinearJ2.cpp | 11 +- .../Material3D/vonMises/NonlinearGurson.cpp | 18 +- Material/Material3D/vonMises/NonlinearJ2.cpp | 6 +- .../Material3D/vonMises/NonlinearPeric.cpp | 4 +- Material/Material3D/vonMises/VAFCRP.cpp | 11 +- Material/MaterialParser.cpp | 48 ++ Option.cmake | 17 +- README.md | 32 +- Recorder/AmplitudeRecorder.cpp | 6 +- Recorder/EigenRecorder.cpp | 4 +- Recorder/ElementRecorder.cpp | 4 +- Recorder/FrameRecorder.cpp | 34 +- Recorder/FrameRecorder.h | 1 + Recorder/GlobalMassRecorder.cpp | 4 +- Recorder/GlobalRecorder.cpp | 4 +- Recorder/GlobalStiffnessRecorder.cpp | 4 +- Recorder/NodeRecorder.cpp | 4 +- Recorder/Recorder.cpp | 24 +- Recorder/Recorder.h | 4 +- Recorder/SumRecorder.cpp | 4 +- Recorder/VisualisationRecorder.h | 1 + Resource/suanPan.rc | 8 +- Script/AlmaLinux.Dockerfile | 4 +- Script/CompileAll.sh | 2 +- Script/Coverage.sh | 2 +- Script/Fedora.Dockerfile | 9 +- Script/Ubuntu.Dockerfile | 8 +- Section/SectionShell/SectionShell.cpp | 5 +- Section/SectionShell/SectionShell.h | 4 +- Solver/Arnoldi.cpp | 13 +- Solver/Arnoldi.h | 4 +- Solver/BFGS.cpp | 52 +- Solver/FEAST.cpp | 13 +- Solver/FEAST.h | 4 +- Solver/Integrator/BatheExplicit.cpp | 120 ++++ Solver/Integrator/BatheExplicit.h | 68 ++ Solver/Integrator/BatheTwoStep.cpp | 109 +-- Solver/Integrator/BatheTwoStep.h | 15 +- Solver/Integrator/BatheTwoStep.tex | 46 -- Solver/Integrator/CMakeLists.txt | 4 + Solver/Integrator/GSSSS.cpp | 130 ++-- Solver/Integrator/GSSSS.h | 13 +- Solver/Integrator/GSSSS.tex | 47 ++ Solver/Integrator/GeneralizedAlpha.cpp | 61 +- Solver/Integrator/GeneralizedAlpha.h | 7 +- Solver/Integrator/GeneralizedAlpha.tex | 78 +- .../Integrator/GeneralizedAlphaExplicit.cpp | 138 ++++ Solver/Integrator/GeneralizedAlphaExplicit.h | 65 ++ Solver/Integrator/Integrator | 6 +- Solver/Integrator/Integrator.cpp | 152 ++-- Solver/Integrator/Integrator.h | 70 +- Solver/Integrator/LeeNewmark.cpp | 43 +- Solver/Integrator/LeeNewmark.h | 1 + Solver/Integrator/LeeNewmarkBase.cpp | 36 +- Solver/Integrator/LeeNewmarkBase.h | 2 + Solver/Integrator/LeeNewmarkFull.cpp | 44 +- Solver/Integrator/LeeNewmarkFull.h | 1 + Solver/Integrator/Newmark.cpp | 30 +- Solver/Integrator/Newmark.h | 3 +- Solver/Integrator/OALTS.cpp | 139 ++++ Solver/Integrator/OALTS.h | 66 ++ Solver/Integrator/RayleighNewmark.cpp | 2 +- Solver/Integrator/Tchamwa.cpp | 55 ++ Solver/Integrator/Tchamwa.h | 53 ++ Solver/Integrator/WilsonPenzienNewmark.cpp | 8 +- Solver/MPDC.cpp | 62 +- Solver/Newton.cpp | 54 +- Solver/Ramm.cpp | 58 +- Solver/Solver.cpp | 19 +- Solver/Solver.h | 2 + Solver/SolverParser.cpp | 80 ++- Step/ArcLength.cpp | 2 +- Step/Bead.cpp | 22 +- Step/Buckle.cpp | 5 +- Step/Dynamic.cpp | 46 +- Step/Dynamic.h | 6 +- Step/Frequency.cpp | 7 +- Step/Frequency.h | 3 +- Step/Static.cpp | 3 - Step/StepParser.cpp | 23 +- Toolbox/argumentParser.cpp | 4 +- Toolbox/arpack-src/ccdotc.f | 36 + Toolbox/arpack-src/cgetv0.f | 135 ++-- Toolbox/arpack-src/cmout.f | 24 +- Toolbox/arpack-src/cnaitr.f | 238 +++---- Toolbox/arpack-src/cnapps.f | 88 +-- Toolbox/arpack-src/cnaup2.f | 204 +++--- Toolbox/arpack-src/cnaupd.f | 194 ++--- Toolbox/arpack-src/cneigh.f | 62 +- Toolbox/arpack-src/cneupd.f | 188 ++--- Toolbox/arpack-src/cngets.f | 52 +- Toolbox/arpack-src/csortc.f | 38 +- Toolbox/arpack-src/cstatn.f | 10 +- Toolbox/arpack-src/cvout.f | 54 +- Toolbox/arpack-src/{debug.fi => debug.h} | 11 +- Toolbox/arpack-src/dgetv0.f | 123 ++-- Toolbox/arpack-src/dlaqrb.f | 521 -------------- Toolbox/arpack-src/dnaitr.f | 214 +++--- Toolbox/arpack-src/dnapps.f | 108 +-- Toolbox/arpack-src/dnaup2.f | 351 ++++----- Toolbox/arpack-src/dnaupd.f | 266 +++---- Toolbox/arpack-src/dnconv.f | 28 +- Toolbox/arpack-src/dneigh.f | 70 +- Toolbox/arpack-src/dneupd.f | 370 +++++----- Toolbox/arpack-src/dngets.f | 58 +- Toolbox/arpack-src/dsaitr.f | 204 +++--- Toolbox/arpack-src/dsapps.f | 110 +-- Toolbox/arpack-src/dsaup2.f | 191 ++--- Toolbox/arpack-src/dsaupd.f | 212 +++--- Toolbox/arpack-src/dsconv.f | 32 +- Toolbox/arpack-src/dseigt.f | 38 +- Toolbox/arpack-src/dsesrt.f | 22 +- Toolbox/arpack-src/dseupd.f | 158 ++-- Toolbox/arpack-src/dsgets.f | 56 +- Toolbox/arpack-src/dsortc.f | 36 +- Toolbox/arpack-src/dsortr.f | 18 +- Toolbox/arpack-src/dstatn.f | 16 +- Toolbox/arpack-src/dstats.f | 14 +- Toolbox/arpack-src/dstqrb.f | 36 +- Toolbox/arpack-src/icnteq.f | 18 - Toolbox/arpack-src/icopy.f | 77 -- Toolbox/arpack-src/iset.f | 16 - Toolbox/arpack-src/iswap.f | 55 -- Toolbox/arpack-src/second.f | 5 - Toolbox/arpack-src/second_NONE.f | 36 + Toolbox/arpack-src/sgetv0.f | 123 ++-- Toolbox/arpack-src/slaqrb.f | 521 -------------- Toolbox/arpack-src/snaitr.f | 214 +++--- Toolbox/arpack-src/snapps.f | 104 +-- Toolbox/arpack-src/snaup2.f | 232 +++--- Toolbox/arpack-src/snaupd.f | 228 +++--- Toolbox/arpack-src/snconv.f | 28 +- Toolbox/arpack-src/sneigh.f | 70 +- Toolbox/arpack-src/sneupd.f | 361 +++++----- Toolbox/arpack-src/sngets.f | 58 +- Toolbox/arpack-src/ssaitr.f | 204 +++--- Toolbox/arpack-src/ssapps.f | 106 +-- Toolbox/arpack-src/ssaup2.f | 188 ++--- Toolbox/arpack-src/ssaupd.f | 202 +++--- Toolbox/arpack-src/ssconv.f | 32 +- Toolbox/arpack-src/sseigt.f | 38 +- Toolbox/arpack-src/ssesrt.f | 22 +- Toolbox/arpack-src/sseupd.f | 148 ++-- Toolbox/arpack-src/ssgets.f | 56 +- Toolbox/arpack-src/ssortc.f | 36 +- Toolbox/arpack-src/ssortr.f | 18 +- Toolbox/arpack-src/sstatn.f | 16 +- Toolbox/arpack-src/sstats.f | 14 +- Toolbox/arpack-src/sstqrb.f | 36 +- Toolbox/arpack-src/{stat.fi => stat.h} | 12 +- Toolbox/arpack-src/version.h | 30 + Toolbox/arpack-src/zgetv0.f | 139 ++-- Toolbox/arpack-src/zmout.f | 24 +- Toolbox/arpack-src/znaitr.f | 250 +++---- Toolbox/arpack-src/znapps.f | 98 +-- Toolbox/arpack-src/znaup2.f | 222 +++--- Toolbox/arpack-src/znaupd.f | 228 +++--- Toolbox/arpack-src/zneigh.f | 62 +- Toolbox/arpack-src/zneupd.f | 188 ++--- Toolbox/arpack-src/zngets.f | 52 +- Toolbox/arpack-src/zsortc.f | 52 +- Toolbox/arpack-src/zstatn.f | 10 +- Toolbox/arpack-src/zvout.f | 54 +- Toolbox/arpack-src/zzdotc.f | 36 + Toolbox/arpack_wrapper.cpp | 229 +----- Toolbox/arpack_wrapper.h | 13 +- Toolbox/commandParser.cpp | 10 +- Toolbox/fext/CMakeLists.txt | 1 - Toolbox/lapack-ext/CMakeLists.txt | 15 - Toolbox/lapack-ext/dspmm.f | 458 ------------ Toolbox/lapack-ext/sspmm.f | 458 ------------ Toolbox/sync_ostream.h | 1 + Toolbox/tensorToolbox.h | 4 +- Toolbox/utility.h | 20 +- UnitTest/CMakeLists.txt | 3 +- UnitTest/CatchTest.cpp | 1 - UnitTest/TestEigen.cpp | 48 ++ UnitTest/TestMatrix.cpp | 28 +- UnitTest/TestUtility.cpp | 20 +- snapcraft.yaml | 6 +- suanPan.cpp | 3 + 597 files changed, 12013 insertions(+), 11598 deletions(-) create mode 100644 Converger/AbsIncreAcc.cpp create mode 100644 Converger/AbsIncreAcc.h create mode 100644 Converger/RelIncreAcc.cpp create mode 100644 Converger/RelIncreAcc.h create mode 100644 Example/Material/Sinh.supan create mode 100644 Example/Solver/BatheExplicit.supan create mode 100644 Example/Solver/LeeFullElastic.supan create mode 100644 Example/Solver/SupportMotionGAE.supan create mode 100644 Example/Solver/SupportMotionOALTSA.supan create mode 100644 Example/Solver/SupportMotionOALTSV.supan create mode 100644 Example/Solver/SupportMotionTchamwaA.supan create mode 100644 Example/Solver/Tchamwa.supan delete mode 100644 Include/armadillo/armadillo_bits/GenSpecialiser.hpp rename Include/armadillo/armadillo_bits/{fn_cond.hpp => fn_cond_rcond.hpp} (95%) create mode 100644 Include/armadillo/armadillo_bits/fn_powext.hpp create mode 100644 Include/armadillo/armadillo_bits/glue_powext_bones.hpp create mode 100644 Include/armadillo/armadillo_bits/glue_powext_meat.hpp create mode 100644 Include/armadillo/armadillo_bits/op_rcond_bones.hpp create mode 100644 Include/armadillo/armadillo_bits/op_rcond_meat.hpp delete mode 100644 Include/armadillo/armadillo_exts/BandMat_bones.hpp delete mode 100644 Include/armadillo/armadillo_exts/BandMat_meat.hpp delete mode 100644 Include/armadillo/armadillo_exts/BdOp_bones.hpp delete mode 100644 Include/armadillo/armadillo_exts/BdOp_meat.hpp delete mode 100644 Include/armadillo/armadillo_exts/SmOp_bones.hpp delete mode 100644 Include/armadillo/armadillo_exts/SmOp_meat.hpp delete mode 100644 Include/armadillo/armadillo_exts/SymmMat_bones.hpp delete mode 100644 Include/armadillo/armadillo_exts/SymmMat_meat.hpp delete mode 100644 Include/armadillo/armadillo_exts/debug.hpp delete mode 100644 Include/armadillo/armadillo_exts/fn_inv.hpp delete mode 100644 Include/armadillo/armadillo_exts/fn_solve.hpp delete mode 100644 Include/armadillo/armadillo_exts/glue_solve_bones.hpp delete mode 100644 Include/armadillo/armadillo_exts/glue_solve_meat.hpp delete mode 100644 Include/armadillo/armadillo_exts/glue_times_bones.hpp delete mode 100644 Include/armadillo/armadillo_exts/glue_times_meat.hpp delete mode 100644 Include/armadillo/armadillo_exts/operator_times.hpp delete mode 100644 Include/armadillo/armadillo_exts/smop_inv_bones.hpp delete mode 100644 Include/armadillo/armadillo_exts/smop_inv_meat.hpp delete mode 100644 Include/armadillo/armadillo_exts/traits.hpp delete mode 100644 Include/armadillo/armadillo_exts/typedef_mat.hpp create mode 100644 Material/Material1D/Elastic/Sinh1D.cpp create mode 100644 Material/Material1D/Elastic/Sinh1D.h create mode 100644 Material/Material1D/Elastic/Tanh1D.cpp create mode 100644 Material/Material1D/Elastic/Tanh1D.h create mode 100644 Solver/Integrator/BatheExplicit.cpp create mode 100644 Solver/Integrator/BatheExplicit.h delete mode 100644 Solver/Integrator/BatheTwoStep.tex create mode 100644 Solver/Integrator/GSSSS.tex create mode 100644 Solver/Integrator/GeneralizedAlphaExplicit.cpp create mode 100644 Solver/Integrator/GeneralizedAlphaExplicit.h create mode 100644 Solver/Integrator/OALTS.cpp create mode 100644 Solver/Integrator/OALTS.h create mode 100644 Solver/Integrator/Tchamwa.cpp create mode 100644 Solver/Integrator/Tchamwa.h create mode 100644 Toolbox/arpack-src/ccdotc.f rename Toolbox/arpack-src/{debug.fi => debug.h} (66%) delete mode 100644 Toolbox/arpack-src/dlaqrb.f delete mode 100644 Toolbox/arpack-src/icnteq.f delete mode 100644 Toolbox/arpack-src/icopy.f delete mode 100644 Toolbox/arpack-src/iset.f delete mode 100644 Toolbox/arpack-src/iswap.f delete mode 100644 Toolbox/arpack-src/second.f create mode 100644 Toolbox/arpack-src/second_NONE.f delete mode 100644 Toolbox/arpack-src/slaqrb.f rename Toolbox/arpack-src/{stat.fi => stat.h} (69%) create mode 100644 Toolbox/arpack-src/version.h create mode 100644 Toolbox/arpack-src/zzdotc.f delete mode 100644 Toolbox/lapack-ext/CMakeLists.txt delete mode 100644 Toolbox/lapack-ext/dspmm.f delete mode 100644 Toolbox/lapack-ext/sspmm.f create mode 100644 UnitTest/TestEigen.cpp diff --git a/.github/workflows/dev-mkl-vtk.yml b/.github/workflows/dev-mkl-vtk.yml index e9ca7907e..246299c39 100644 --- a/.github/workflows/dev-mkl-vtk.yml +++ b/.github/workflows/dev-mkl-vtk.yml @@ -32,8 +32,8 @@ jobs: ./suanPan-linux-mkl-vtk/bin/suanPan -v - uses: actions/upload-artifact@v3 with: - name: suanPan-2.6.1-1.x86_64.deb - path: suanPan-2.6.1-1.x86_64.deb + name: suanPan-2.7.0-1.x86_64.deb + path: suanPan-2.7.0-1.x86_64.deb fedora-mkl-vtk-dev: runs-on: ubuntu-22.04 container: fedora:35 @@ -66,10 +66,10 @@ jobs: make package -j"$(nproc)" - name: Test run: | - dnf install ./suanPan-2.6.1-1.x86_64.rpm -y + dnf install ./suanPan-2.7.0-1.x86_64.rpm -y suanPan -v - name: Upload uses: actions/upload-artifact@v3 with: - name: suanPan-2.6.1-1.x86_64.rpm - path: suanPan-2.6.1-1.x86_64.rpm + name: suanPan-2.7.0-1.x86_64.rpm + path: suanPan-2.7.0-1.x86_64.rpm diff --git a/.github/workflows/dev-vtk.yml b/.github/workflows/dev-vtk.yml index 515e078b5..3d4489c86 100644 --- a/.github/workflows/dev-vtk.yml +++ b/.github/workflows/dev-vtk.yml @@ -29,8 +29,8 @@ jobs: ./suanPan-linux-openblas-vtk/bin/suanPan -v - uses: actions/upload-artifact@v3 with: - name: suanPan-2.6.1-1.x86_64.deb - path: suanPan-2.6.1-1.x86_64.deb + name: suanPan-2.7.0-1.x86_64.deb + path: suanPan-2.7.0-1.x86_64.deb macos-openblas-vtk-dev: runs-on: macos-11 steps: @@ -53,3 +53,29 @@ jobs: run: | export DYLD_LIBRARY_PATH=/Users/runner/work/suanPan/suanPan/suanPan-macos-openblas-vtk/lib/ ./suanPan-macos-openblas-vtk/bin/suanPan -v + windows-openblas-vtk-dev: + runs-on: windows-2022 + steps: + - name: Clone + uses: actions/checkout@v3 + - name: Install VTK + run: | + C:/msys64/usr/bin/wget.exe https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-win.7z + 7z x VTK-9.2.2-win.7z + - name: Golang + uses: actions/setup-go@v3 + - name: Compile + run: | + go build Checker/updater.go + cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_MULTITHREAD=ON -DUSE_HDF5=ON -DUSE_EXTERNAL_VTK=ON -DVTK_DIR=D:/a/suanPan/suanPan/lib/cmake/vtk-9.2/ -DCMAKE_INSTALL_PREFIX=suanPan-win-openblas-vtk . + cmake --build . --target INSTALL --config Release + - name: Pack + run: | + cp updater.exe suanPan-win-openblas-vtk/bin + cd suanPan-win-openblas-vtk/bin + 7z a ../../suanPan-win-openblas-vtk.7z ./* + ./suanPan.exe -v + - uses: actions/upload-artifact@v3 + with: + name: suanPan-win-openblas-vtk.7z + path: suanPan-win-openblas-vtk.7z diff --git a/.github/workflows/master-mkl-vtk.yml b/.github/workflows/master-mkl-vtk.yml index 8c320f9d9..5549ebb6b 100644 --- a/.github/workflows/master-mkl-vtk.yml +++ b/.github/workflows/master-mkl-vtk.yml @@ -32,7 +32,7 @@ jobs: tar czf suanPan-linux-mkl-vtk.tar.gz suanPan-linux-mkl-vtk - name: Test run: | - sudo apt-get install ./suanPan-2.6.1-1.x86_64.deb -y + sudo apt-get install ./suanPan-2.7.0-1.x86_64.deb -y suanPan -v export LD_LIBRARY_PATH=/home/runner/work/suanPan/suanPan/suanPan-linux-mkl-vtk/lib cd suanPan-linux-mkl-vtk/bin @@ -50,8 +50,8 @@ jobs: uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: suanPan-2.6.1-1.x86_64.deb - asset_name: suanPan-2.6.1-1.x86_64.deb + file: suanPan-2.7.0-1.x86_64.deb + asset_name: suanPan-2.7.0-1.x86_64.deb tag: ${{ env.SP_TIME }} prerelease: true overwrite: true @@ -87,14 +87,14 @@ jobs: make package -j"$(nproc)" - name: Test run: | - dnf install ./suanPan-2.6.1-1.x86_64.rpm -y + dnf install ./suanPan-2.7.0-1.x86_64.rpm -y suanPan -v - name: RPM uses: svenstaro/upload-release-action@v2 with: repo_token: ${{ secrets.GITHUB_TOKEN }} - file: suanPan-2.6.1-1.x86_64.rpm - asset_name: suanPan-2.6.1-1.x86_64.rpm + file: suanPan-2.7.0-1.x86_64.rpm + asset_name: suanPan-2.7.0-1.x86_64.rpm tag: ${{ env.SP_TIME }} prerelease: true overwrite: true diff --git a/CHANGELOG.md b/CHANGELOG.md index b5b37ebd8..c331c24e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,18 @@ 1. `MKL` includes outdated `FEAST`, the external names in `FEAST` library are modified to avoid linking error. 2. `OpenBLAS` causes SEGFAULT with version 0.3.15+ when compiled with `DYNAMIC_ARCH` enabled. +## version 2.7 + +1. optimise assembling of symmetric global matrices [#79](https://github.com/TLCFEM/suanPan/pull/79) +2. extend `BatheTwoStep` to allow customisation of spectral radius [#81](https://github.com/TLCFEM/suanPan/pull/81) and sub-step size [#82](https://github.com/TLCFEM/suanPan/pull/82) +3. update `Catch2` to version `2.13.10` +4. update `Armadillo` to version `11.4` +5. update modern `Arpack` [#94](https://github.com/TLCFEM/suanPan/pull/94) +6. add `Tchamwa` [#88](https://github.com/TLCFEM/suanPan/pull/88), `BatheExplicit` [#90](https://github.com/TLCFEM/suanPan/pull/90) and `GeneralisedAlphaExplicit` [#93](https://github.com/TLCFEM/suanPan/pull/93) explicit time integration methods +7. add `OALTS` two-step implicit time integration method [#92](https://github.com/TLCFEM/suanPan/pull/92) +8. add `Sinh1D` and `Tanh1D` nonlinear elastic 1D material +9. add `linear_system` flag to speed up linear system analysis + ## version 2.6.1 1. add `-nu` (`--noupdate`) flag to skip check of new version on startup diff --git a/CITATION.cff b/CITATION.cff index b3b15ee68..cd65e6600 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -28,5 +28,5 @@ keywords: - IGA - Solid Mechanics license: GPL-3.0 -version: '2.5' -date-released: '2022-08-13' +version: '2.6.1' +date-released: '2022-11-09' diff --git a/CMakeLists.txt b/CMakeLists.txt index 77f8cc8d2..97d3088a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,14 +79,13 @@ if (FORTRAN_STATUS) add_subdirectory(Toolbox/amd-src) add_subdirectory(Toolbox/arpack-src) add_subdirectory(Toolbox/feast-src) - add_subdirectory(Toolbox/lapack-ext) add_subdirectory(Toolbox/mumps-src) add_subdirectory(Toolbox/fext) - target_link_libraries(${PROJECT_NAME} amd arpack spmm mumps feast) - message("Linking additional amd arpack spmm mumps feast") + target_link_libraries(${PROJECT_NAME} amd arpack mumps feast) + message("Linking additional amd arpack mumps feast") elseif (COMPILER_IDENTIFIER MATCHES "vs") target_link_libraries(${PROJECT_NAME} libfext) - message("Linking precompiled fext (packed with amd arpack spmm mumps feast)") + message("Linking precompiled fext (packed with amd arpack mumps feast)") else () message(FATAL_ERROR "Please install a valid FORTRAN compiler.") endif () @@ -346,7 +345,7 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux") set(CPACK_PACKAGE_ICON ${ROOT}/Resource/suanPan-ua.svg) set(CPACK_PACKAGE_RELEASE 1) set(CPACK_PACKAGE_VENDOR "tlcfem") - set(CPACK_PACKAGE_VERSION "2.6.1") + set(CPACK_PACKAGE_VERSION "2.7.0") set(CPACK_PACKAGE_DESCRIPTION "An Open Source, Parallel and Heterogeneous Finite Element Analysis Framework") set(CPACK_PACKAGE_HOMEPAGE_URL "https://github.com/TLCFEM/suanPan") diff --git a/Constraint/BC/MultiplierBC.cpp b/Constraint/BC/MultiplierBC.cpp index 25dfd9313..8178f8784 100644 --- a/Constraint/BC/MultiplierBC.cpp +++ b/Constraint/BC/MultiplierBC.cpp @@ -18,6 +18,8 @@ #include "MultiplierBC.h" #include #include +#include +#include /** * \brief method to apply the BC to the system. @@ -31,21 +33,29 @@ int MultiplierBC::process(const shared_ptr& D) { // the container used is concurrently safe D->insert_restrained_dof(dof_encoding = get_nodal_active_dof(D)); - if(auto& t_stiff = W->get_stiffness(); nullptr != t_stiff) { - std::scoped_lock lock(W->get_stiffness_mutex()); - for(const auto I : dof_encoding) t_stiff->unify(I); + if(IntegratorType::Explicit == D->get_current_step()->get_integrator()->type()) { + if(auto& t_mass = W->get_mass(); nullptr != t_mass) { + std::scoped_lock lock(W->get_mass_mutex()); + for(const auto I : dof_encoding) t_mass->unify(I); + } } - if(auto& t_mass = W->get_mass(); nullptr != t_mass) { - std::scoped_lock lock(W->get_mass_mutex()); - for(const auto I : dof_encoding) t_mass->nullify(I); - } - if(auto& t_damping = W->get_damping(); nullptr != t_damping) { - std::scoped_lock lock(W->get_damping_mutex()); - for(const auto I : dof_encoding) t_damping->nullify(I); - } - if(auto& t_geometry = W->get_geometry(); nullptr != t_geometry) { - std::scoped_lock lock(W->get_geometry_mutex()); - for(const auto I : dof_encoding) t_geometry->nullify(I); + else { + if(auto& t_stiff = W->get_stiffness(); nullptr != t_stiff) { + std::scoped_lock lock(W->get_stiffness_mutex()); + for(const auto I : dof_encoding) t_stiff->unify(I); + } + if(auto& t_mass = W->get_mass(); nullptr != t_mass) { + std::scoped_lock lock(W->get_mass_mutex()); + for(const auto I : dof_encoding) t_mass->nullify(I); + } + if(auto& t_damping = W->get_damping(); nullptr != t_damping) { + std::scoped_lock lock(W->get_damping_mutex()); + for(const auto I : dof_encoding) t_damping->nullify(I); + } + if(auto& t_geometry = W->get_geometry(); nullptr != t_geometry) { + std::scoped_lock lock(W->get_geometry_mutex()); + for(const auto I : dof_encoding) t_geometry->nullify(I); + } } return SUANPAN_SUCCESS; diff --git a/Constraint/LJPotential2D.h b/Constraint/LJPotential2D.h index af317b42a..ea3775b8b 100644 --- a/Constraint/LJPotential2D.h +++ b/Constraint/LJPotential2D.h @@ -34,6 +34,7 @@ class LJPotential2D final : public ParticleCollision2D { [[nodiscard]] double compute_f(double) const override; [[nodiscard]] double compute_df(double) const override; + public: using ParticleCollision2D::ParticleCollision2D; }; diff --git a/Constraint/LinearSpring2D.h b/Constraint/LinearSpring2D.h index a4a4de289..e861e64b5 100644 --- a/Constraint/LinearSpring2D.h +++ b/Constraint/LinearSpring2D.h @@ -34,6 +34,7 @@ class LinearSpring2D final : public ParticleCollision2D { [[nodiscard]] double compute_f(double) const override; [[nodiscard]] double compute_df(double) const override; + public: using ParticleCollision2D::ParticleCollision2D; }; diff --git a/Constraint/RestitutionWallPenalty.cpp b/Constraint/RestitutionWallPenalty.cpp index d6171e6be..11bb3816c 100644 --- a/Constraint/RestitutionWallPenalty.cpp +++ b/Constraint/RestitutionWallPenalty.cpp @@ -64,7 +64,6 @@ int RestitutionWallPenalty::process(const shared_ptr& D) { resistance.zeros(W->get_size()); auto counter = 0llu; for(const auto& I : node_pool) { - if(dot(current_velocity_handler(I), outer_norm) > 0.) continue; const auto c_vel = current_velocity_handler(I); if(dot(c_vel, outer_norm) > 0.) continue; auto& t_dof = I->get_reordered_dof(); @@ -85,7 +84,7 @@ int RestitutionWallPenalty::process(const shared_ptr& D) { return SUANPAN_SUCCESS; } -int RestitutionWallPenalty::stage(const shared_ptr& D) { +void RestitutionWallPenalty::stage(const shared_ptr& D) { auto& W = D->get_factory(); auto trial_acceleration = get_trial_acceleration(W); @@ -97,8 +96,6 @@ int RestitutionWallPenalty::stage(const shared_ptr& D) { } W->update_trial_acceleration(trial_acceleration); - - return SUANPAN_SUCCESS; } void RestitutionWallPenalty::commit_status() { node_pool.clear(); } diff --git a/Constraint/RestitutionWallPenalty.h b/Constraint/RestitutionWallPenalty.h index b4b55731f..272acab89 100644 --- a/Constraint/RestitutionWallPenalty.h +++ b/Constraint/RestitutionWallPenalty.h @@ -38,6 +38,7 @@ class RestitutionWallPenalty : public RigidWallPenalty { suanpan::set> node_pool; const double restitution_coefficient; + public: RestitutionWallPenalty(unsigned, unsigned, unsigned, vec&&, vec&&, double, double, unsigned); RestitutionWallPenalty(unsigned, unsigned, unsigned, vec&&, vec&&, vec&&, double, double, unsigned); @@ -46,7 +47,7 @@ class RestitutionWallPenalty : public RigidWallPenalty { int process(const shared_ptr&) override; - int stage(const shared_ptr&) override; + void stage(const shared_ptr&) override; void commit_status() override; void clear_status() override; diff --git a/Constraint/RigidWallPenalty.h b/Constraint/RigidWallPenalty.h index b0a14b2c1..53aa042a7 100644 --- a/Constraint/RigidWallPenalty.h +++ b/Constraint/RigidWallPenalty.h @@ -51,6 +51,7 @@ class RigidWallPenalty : public Constraint { Col (*trial_displacement_handler)(const shared_ptr&) = nullptr; Col (*trial_velocity_handler)(const shared_ptr&) = nullptr; Col (*trial_acceleration_handler)(const shared_ptr&) = nullptr; + public: RigidWallPenalty(unsigned, unsigned, unsigned, vec&&, vec&&, double, unsigned); RigidWallPenalty(unsigned, unsigned, unsigned, vec&&, vec&&, vec&&, double, unsigned); diff --git a/Converger/AbsDisp.cpp b/Converger/AbsDisp.cpp index fd0b3a2c4..9a38e0f17 100644 --- a/Converger/AbsDisp.cpp +++ b/Converger/AbsDisp.cpp @@ -20,7 +20,7 @@ #include /** - * \brief the complete constructor. + * \brief The complete constructor. * \param T `unique_tag` * \param E `tolerance` * \param M `max_iteration` @@ -31,8 +31,10 @@ AbsDisp::AbsDisp(const unsigned T, const double E, const unsigned M, const bool unique_ptr AbsDisp::get_copy() { return make_unique(*this); } -bool AbsDisp::is_converged() { - set_error(norm(get_domain().lock()->get_factory()->get_incre_displacement())); +bool AbsDisp::is_converged(unsigned) { + auto& W = get_domain().lock()->get_factory(); + + set_error(norm(W->get_incre_displacement() + W->get_ninja()) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); if(is_print()) suanpan_info("absolute displacement error: %.5E.\n", get_error()); diff --git a/Converger/AbsDisp.h b/Converger/AbsDisp.h index e7ca49c38..aba9156e2 100644 --- a/Converger/AbsDisp.h +++ b/Converger/AbsDisp.h @@ -44,7 +44,7 @@ class AbsDisp final : public Converger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/AbsError.cpp b/Converger/AbsError.cpp index d0d7e5686..e2755d38e 100644 --- a/Converger/AbsError.cpp +++ b/Converger/AbsError.cpp @@ -35,8 +35,10 @@ unique_ptr AbsError::get_copy() { return make_unique(*this) * \brief Method to return `conv_flag`. * \return `conv_flag` */ -bool AbsError::is_converged() { - set_error(get_domain().lock()->get_factory()->get_error()); +bool AbsError::is_converged(unsigned) { + auto& W = get_domain().lock()->get_factory(); + + set_error(fabs(W->get_error()) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); if(is_print()) suanpan_info("absolute error: %.5E.\n", get_error()); diff --git a/Converger/AbsError.h b/Converger/AbsError.h index 5f0e24502..beeb2b987 100644 --- a/Converger/AbsError.h +++ b/Converger/AbsError.h @@ -45,7 +45,7 @@ class AbsError final : public Converger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/AbsIncreAcc.cpp b/Converger/AbsIncreAcc.cpp new file mode 100644 index 000000000..f9d9c1ab6 --- /dev/null +++ b/Converger/AbsIncreAcc.cpp @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ + +#include "AbsIncreAcc.h" +#include +#include + +/** + * \brief The default constructor. + * \param T `unique_tag` + * \param E `tolerance` + * \param M `max_iteration` + * \param P `print_flag` + */ +AbsIncreAcc::AbsIncreAcc(const unsigned T, const double E, const unsigned M, const bool P) + : Converger(T, E, M, P) {} + +unique_ptr AbsIncreAcc::get_copy() { return make_unique(*this); } + +/** + * \brief Method to return `conv_flag`. + * \return `conv_flag` + */ +bool AbsIncreAcc::is_converged(unsigned) { + auto& W = get_domain().lock()->get_factory(); + + set_error(norm(W->get_ninja()) / static_cast(W->get_size())); + set_conv_flag(get_tolerance() > get_error()); + + if(is_print()) suanpan_info("absolute incremental acceleration error: %.5E.\n", get_error()); + + return get_conv_flag(); +} diff --git a/Converger/AbsIncreAcc.h b/Converger/AbsIncreAcc.h new file mode 100644 index 000000000..b77c73e53 --- /dev/null +++ b/Converger/AbsIncreAcc.h @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ +/** + * @class AbsIncreAcc + * @brief The AbsIncreAcc class that handles converger test to indicate if the + * iteration converges. + * @author tlc + * @date 03/12/2022 + * @version 0.1.0 + * @file AbsIncreAcc.h + * @addtogroup Converger + * @{ + */ + +#ifndef ABSINCREACC_H +#define ABSINCREACC_H + +#include "Converger.h" + +class AbsIncreAcc final : public Converger { +public: + explicit AbsIncreAcc(unsigned = 0, double = 1E-8, unsigned = 7, bool = false); + + unique_ptr get_copy() override; + + bool is_converged(unsigned) override; +}; + +#endif + +//! @} diff --git a/Converger/AbsIncreDisp.cpp b/Converger/AbsIncreDisp.cpp index d8e12881a..748031fe3 100644 --- a/Converger/AbsIncreDisp.cpp +++ b/Converger/AbsIncreDisp.cpp @@ -35,9 +35,10 @@ unique_ptr AbsIncreDisp::get_copy() { return make_uniqueget_factory(); - set_error(norm(W->get_ninja()) / static_cast(W->get_ninja().n_elem)); + + set_error(norm(W->get_ninja()) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); if(is_print()) suanpan_info("absolute incremental displacement error: %.5E.\n", get_error()); diff --git a/Converger/AbsIncreDisp.h b/Converger/AbsIncreDisp.h index 28504462d..16f35657c 100644 --- a/Converger/AbsIncreDisp.h +++ b/Converger/AbsIncreDisp.h @@ -37,7 +37,7 @@ class AbsIncreDisp final : public Converger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/AbsIncreEnergy.cpp b/Converger/AbsIncreEnergy.cpp index 302399fbf..7ae326a85 100644 --- a/Converger/AbsIncreEnergy.cpp +++ b/Converger/AbsIncreEnergy.cpp @@ -31,12 +31,10 @@ AbsIncreEnergy::AbsIncreEnergy(const unsigned T, const double E, const unsigned unique_ptr AbsIncreEnergy::get_copy() { return make_unique(*this); } -bool AbsIncreEnergy::is_converged() { - const auto& D = get_domain().lock(); - - if(auto& W = D->get_factory(); W->get_reference_load().is_empty() || W->get_trial_load_factor().is_empty()) set_error(fabs(dot(W->get_ninja(), W->get_trial_load() - W->get_sushi())) / static_cast(W->get_ninja().n_elem)); - else set_error(fabs(dot(W->get_ninja(), W->get_reference_load() * W->get_trial_load_factor() + W->get_trial_load() - W->get_sushi())) / static_cast(W->get_ninja().n_elem)); +bool AbsIncreEnergy::is_converged(unsigned) { + auto& W = get_domain().lock()->get_factory(); + set_error(fabs(dot(W->get_ninja(), get_residual())) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); if(is_print()) suanpan_info("absolute energy increment error: %.5E.\n", get_error()); diff --git a/Converger/AbsIncreEnergy.h b/Converger/AbsIncreEnergy.h index ef00347c0..b59a975ec 100644 --- a/Converger/AbsIncreEnergy.h +++ b/Converger/AbsIncreEnergy.h @@ -44,7 +44,7 @@ class AbsIncreEnergy final : public Converger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/AbsResidual.cpp b/Converger/AbsResidual.cpp index 5d6eaad0a..980271225 100644 --- a/Converger/AbsResidual.cpp +++ b/Converger/AbsResidual.cpp @@ -24,17 +24,10 @@ AbsResidual::AbsResidual(const unsigned T, const double E, const unsigned M, con unique_ptr AbsResidual::get_copy() { return make_unique(*this); } -bool AbsResidual::is_converged() { - const auto& D = get_domain().lock(); - auto& W = D->get_factory(); - - vec residual = W->get_trial_load() - W->get_trial_resistance(); - if(!W->get_reference_load().is_empty() && !W->get_trial_load_factor().is_empty()) residual += W->get_reference_load() * W->get_trial_load_factor(); - - for(const auto& t_dof : D->get_restrained_dof()) residual(t_dof) = 0.; - - set_error(norm(residual)); +bool AbsResidual::is_converged(unsigned) { + auto& W = get_domain().lock()->get_factory(); + set_error(norm(get_residual()) / static_cast(W->get_size())); set_conv_flag(get_tolerance() > get_error()); if(is_print()) suanpan_info("absolute residual: %.5E.\n", get_error()); diff --git a/Converger/AbsResidual.h b/Converger/AbsResidual.h index bceb5d92b..3154c6eb7 100644 --- a/Converger/AbsResidual.h +++ b/Converger/AbsResidual.h @@ -47,7 +47,7 @@ class AbsResidual final : public Converger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/CMakeLists.txt b/Converger/CMakeLists.txt index ebfe2f190..1bb497ad2 100644 --- a/Converger/CMakeLists.txt +++ b/Converger/CMakeLists.txt @@ -8,6 +8,7 @@ add_library(${PROJECT_NAME} STATIC AbsDisp.cpp AbsError.cpp AbsIncreDisp.cpp + AbsIncreAcc.cpp AbsIncreEnergy.cpp AbsResidual.cpp Converger.cpp @@ -17,6 +18,7 @@ add_library(${PROJECT_NAME} STATIC RelDisp.cpp RelError.cpp RelIncreDisp.cpp + RelIncreAcc.cpp RelIncreEnergy.cpp RelResidual.cpp ) diff --git a/Converger/Converger b/Converger/Converger index d9b356006..c19a286dd 100644 --- a/Converger/Converger +++ b/Converger/Converger @@ -3,6 +3,7 @@ #include "AbsDisp.h" #include "AbsError.h" #include "AbsIncreDisp.h" +#include "AbsIncreAcc.h" #include "AbsIncreEnergy.h" #include "AbsResidual.h" #include "FixedNumber.h" @@ -10,5 +11,6 @@ #include "RelDisp.h" #include "RelError.h" #include "RelIncreDisp.h" +#include "RelIncreAcc.h" #include "RelIncreEnergy.h" #include "RelResidual.h" \ No newline at end of file diff --git a/Converger/Converger.cpp b/Converger/Converger.cpp index e8c275ed7..6ddb9797a 100644 --- a/Converger/Converger.cpp +++ b/Converger/Converger.cpp @@ -17,6 +17,7 @@ #include "Converger.h" #include +#include /** * \brief the complete constructor. @@ -92,6 +93,18 @@ void Converger::set_conv_flag(const bool C) { conv_flag = C; } */ bool Converger::get_conv_flag() const { return conv_flag; } +vec Converger::get_residual() const { + const auto& D = get_domain().lock(); + auto& W = D->get_factory(); + + vec residual = W->get_trial_load() - W->get_sushi(); + if(!W->get_reference_load().is_empty() && !W->get_trial_load_factor().is_empty()) residual += W->get_reference_load() * W->get_trial_load_factor(); + + for(const auto& t_dof : D->get_restrained_dof()) residual(t_dof) = 0.; + + return residual; +} + /** * \brief method to return `print_flag`. * \return `print_flag` diff --git a/Converger/Converger.h b/Converger/Converger.h index 19683a6d5..ade6a918e 100644 --- a/Converger/Converger.h +++ b/Converger/Converger.h @@ -54,6 +54,8 @@ class Converger : public Tag { bool conv_flag = false; /**< converger flag */ protected: + [[nodiscard]] vec get_residual() const; + [[nodiscard]] bool is_print() const; public: @@ -83,7 +85,7 @@ class Converger : public Tag { virtual void set_conv_flag(bool); [[nodiscard]] bool get_conv_flag() const; - virtual bool is_converged() = 0; + virtual bool is_converged(unsigned) = 0; }; #endif diff --git a/Converger/ConvergerParser.cpp b/Converger/ConvergerParser.cpp index 543980d1a..858da67a7 100644 --- a/Converger/ConvergerParser.cpp +++ b/Converger/ConvergerParser.cpp @@ -70,6 +70,8 @@ int create_new_converger(const shared_ptr& domain, istringstream& co else if(is_equal(converger_id, "RelResidual") && domain->insert(make_shared(tag, tolerance, max_iteration, is_true(print_flag)))) code = 1; else if(is_equal(converger_id, "AbsIncreDisp") && domain->insert(make_shared(tag, tolerance, max_iteration, is_true(print_flag)))) code = 1; else if(is_equal(converger_id, "RelIncreDisp") && domain->insert(make_shared(tag, tolerance, max_iteration, is_true(print_flag)))) code = 1; + else if(is_equal(converger_id, "AbsIncreAcc") && domain->insert(make_shared(tag, tolerance, max_iteration, is_true(print_flag)))) code = 1; + else if(is_equal(converger_id, "RelIncreAcc") && domain->insert(make_shared(tag, tolerance, max_iteration, is_true(print_flag)))) code = 1; else if(is_equal(converger_id, "AbsDisp") && domain->insert(make_shared(tag, tolerance, max_iteration, is_true(print_flag)))) code = 1; else if(is_equal(converger_id, "RelDisp") && domain->insert(make_shared(tag, tolerance, max_iteration, is_true(print_flag)))) code = 1; else if(is_equal(converger_id, "AbsError") && domain->insert(make_shared(tag, tolerance, max_iteration, is_true(print_flag)))) code = 1; diff --git a/Converger/FixedNumber.cpp b/Converger/FixedNumber.cpp index 84b75ce7d..5efaa2ed3 100644 --- a/Converger/FixedNumber.cpp +++ b/Converger/FixedNumber.cpp @@ -17,11 +17,6 @@ #include "FixedNumber.h" -void FixedNumber::set_conv_flag(const bool F) { - if(F) counter = 0; - Converger::set_conv_flag(F); -} - /** * \brief the complete constructor. * \param T `unique_tag` @@ -33,9 +28,7 @@ FixedNumber::FixedNumber(const unsigned T, const unsigned M, const bool P) unique_ptr FixedNumber::get_copy() { return make_unique(*this); } -bool FixedNumber::is_converged() { - ++counter; - +bool FixedNumber::is_converged(const unsigned counter) { if(is_print()) suanpan_info("iteration counter: %u.\n", counter); set_conv_flag(get_max_iteration() <= counter); diff --git a/Converger/FixedNumber.h b/Converger/FixedNumber.h index b7d6502ef..c04a44abc 100644 --- a/Converger/FixedNumber.h +++ b/Converger/FixedNumber.h @@ -33,17 +33,12 @@ #include "Converger.h" class FixedNumber final : public Converger { - unsigned counter = 0; - -protected: - void set_conv_flag(bool) override; - public: explicit FixedNumber(unsigned = 0, unsigned = 7, bool = false); unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/LogicConverger.cpp b/Converger/LogicConverger.cpp index f87dded76..ea9c2aec1 100644 --- a/Converger/LogicConverger.cpp +++ b/Converger/LogicConverger.cpp @@ -51,9 +51,9 @@ int LogicConverger::initialize() { unique_ptr LogicAND::get_copy() { return make_unique(*this); } -bool LogicAND::is_converged() { - auto result_a = std::async([&] { return converger_a->is_converged(); }); - auto result_b = std::async([&] { return converger_b->is_converged(); }); +bool LogicAND::is_converged(const unsigned counter) { + auto result_a = std::async([&] { return converger_a->is_converged(counter); }); + auto result_b = std::async([&] { return converger_b->is_converged(counter); }); const auto logic_result = result_a.get() && result_b.get(); set_conv_flag(logic_result); @@ -65,9 +65,9 @@ bool LogicAND::is_converged() { unique_ptr LogicOR::get_copy() { return make_unique(*this); } -bool LogicOR::is_converged() { - auto result_a = std::async([&] { return converger_a->is_converged(); }); - auto result_b = std::async([&] { return converger_b->is_converged(); }); +bool LogicOR::is_converged(const unsigned counter) { + auto result_a = std::async([&] { return converger_a->is_converged(counter); }); + auto result_b = std::async([&] { return converger_b->is_converged(counter); }); const auto logic_result = result_a.get() || result_b.get(); set_conv_flag(logic_result); @@ -79,9 +79,9 @@ bool LogicOR::is_converged() { unique_ptr LogicXOR::get_copy() { return make_unique(*this); } -bool LogicXOR::is_converged() { - auto result_a = std::async([&] { return converger_a->is_converged(); }); - auto result_b = std::async([&] { return converger_b->is_converged(); }); +bool LogicXOR::is_converged(const unsigned counter) { + auto result_a = std::async([&] { return converger_a->is_converged(counter); }); + auto result_b = std::async([&] { return converger_b->is_converged(counter); }); const auto logic_result = result_a.get() != result_b.get(); set_conv_flag(logic_result); diff --git a/Converger/LogicConverger.h b/Converger/LogicConverger.h index 05ad5770c..499849421 100644 --- a/Converger/LogicConverger.h +++ b/Converger/LogicConverger.h @@ -49,7 +49,7 @@ class LogicAND final : public LogicConverger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; class LogicOR final : public LogicConverger { @@ -58,7 +58,7 @@ class LogicOR final : public LogicConverger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; class LogicXOR final : public LogicConverger { @@ -67,7 +67,7 @@ class LogicXOR final : public LogicConverger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/RelDisp.cpp b/Converger/RelDisp.cpp index ec4741dab..44e029578 100644 --- a/Converger/RelDisp.cpp +++ b/Converger/RelDisp.cpp @@ -24,10 +24,11 @@ RelDisp::RelDisp(const unsigned T, const double E, const unsigned M, const bool unique_ptr RelDisp::get_copy() { return make_unique(*this); } -bool RelDisp::is_converged() { - const auto& t_factory = get_domain().lock()->get_factory(); +bool RelDisp::is_converged(unsigned) { + auto& W = get_domain().lock()->get_factory(); - set_error(norm(t_factory->get_incre_displacement() / t_factory->get_trial_displacement())); + const auto rel_disp = norm(W->get_incre_displacement() + W->get_ninja()) / norm(W->get_trial_displacement()); + set_error(std::isfinite(rel_disp) ? rel_disp : 1.); set_conv_flag(get_tolerance() > get_error()); if(is_print()) suanpan_info("relative displacement error: %.5E.\n", get_error()); diff --git a/Converger/RelDisp.h b/Converger/RelDisp.h index 17f33ef06..2c04b947c 100644 --- a/Converger/RelDisp.h +++ b/Converger/RelDisp.h @@ -37,7 +37,7 @@ class RelDisp final : public Converger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/RelError.cpp b/Converger/RelError.cpp index a029ee0a1..af37abb15 100644 --- a/Converger/RelError.cpp +++ b/Converger/RelError.cpp @@ -35,10 +35,11 @@ unique_ptr RelError::get_copy() { return make_unique(*this) * \brief Method to return `conv_flag`. * \return `conv_flag` */ -bool RelError::is_converged() { - const auto& t_factory = get_domain().lock()->get_factory(); +bool RelError::is_converged(unsigned) { + auto& W = get_domain().lock()->get_factory(); - set_error(t_factory->get_error() / norm(t_factory->get_trial_displacement())); + const auto rel_error = fabs(W->get_error()) / norm(W->get_trial_displacement()); + set_error(std::isfinite(rel_error) ? rel_error : 1.); set_conv_flag(get_tolerance() > get_error()); if(is_print()) suanpan_info("relative error: %.5E.\n", get_error()); diff --git a/Converger/RelError.h b/Converger/RelError.h index a6d0c21c5..e25d41d48 100644 --- a/Converger/RelError.h +++ b/Converger/RelError.h @@ -37,7 +37,7 @@ class RelError final : public Converger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/RelIncreAcc.cpp b/Converger/RelIncreAcc.cpp new file mode 100644 index 000000000..a7c59621c --- /dev/null +++ b/Converger/RelIncreAcc.cpp @@ -0,0 +1,37 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ + +#include "RelIncreAcc.h" +#include +#include + +RelIncreAcc::RelIncreAcc(const unsigned T, const double E, const unsigned M, const bool P) + : Converger(T, E, M, P) {} + +unique_ptr RelIncreAcc::get_copy() { return make_unique(*this); } + +bool RelIncreAcc::is_converged(unsigned) { + auto& W = get_domain().lock()->get_factory(); + + const auto rel_incre_disp = norm(W->get_ninja()) / norm(W->get_incre_acceleration() + W->get_ninja()); + set_error(std::isfinite(rel_incre_disp) ? rel_incre_disp : 1.); + set_conv_flag(get_tolerance() > get_error()); + + if(is_print()) suanpan_info("relative incremental acceleration error: %.5E.\n", get_error()); + + return get_conv_flag(); +} diff --git a/Converger/RelIncreAcc.h b/Converger/RelIncreAcc.h new file mode 100644 index 000000000..8661cf59a --- /dev/null +++ b/Converger/RelIncreAcc.h @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ +/** + * @class RelIncreAcc + * @brief The RelIncreAcc class that handles converger test to indicate if the + * iteration converges. + * @author tlc + * @date 03/12/2022 + * @version 0.1.0 + * @file RelIncreAcc.h + * @addtogroup Converger + * @{ + */ + +#ifndef RELINCREACC_H +#define RELINCREACC_H + +#include "Converger.h" + +class RelIncreAcc final : public Converger { +public: + explicit RelIncreAcc(unsigned = 0, double = 1E-8, unsigned = 7, bool = false); + + unique_ptr get_copy() override; + + bool is_converged(unsigned) override; +}; + +#endif + +//! @} diff --git a/Converger/RelIncreDisp.cpp b/Converger/RelIncreDisp.cpp index 9e556acd5..aa119a362 100644 --- a/Converger/RelIncreDisp.cpp +++ b/Converger/RelIncreDisp.cpp @@ -24,13 +24,11 @@ RelIncreDisp::RelIncreDisp(const unsigned T, const double E, const unsigned M, c unique_ptr RelIncreDisp::get_copy() { return make_unique(*this); } -bool RelIncreDisp::is_converged() { - auto& t_factory = get_domain().lock()->get_factory(); +bool RelIncreDisp::is_converged(unsigned) { + auto& W = get_domain().lock()->get_factory(); - const auto n_norm = norm(t_factory->get_ninja()); - const auto d_norm = norm(t_factory->get_incre_displacement()); - const auto rel_error = n_norm / d_norm; - set_error(std::isfinite(rel_error) ? rel_error : n_norm); + const auto rel_incre_disp = norm(W->get_ninja()) / norm(W->get_incre_displacement() + W->get_ninja()); + set_error(std::isfinite(rel_incre_disp) ? rel_incre_disp : 1.); set_conv_flag(get_tolerance() > get_error()); if(is_print()) suanpan_info("relative incremental displacement error: %.5E.\n", get_error()); diff --git a/Converger/RelIncreDisp.h b/Converger/RelIncreDisp.h index 63678fa63..f8daffd66 100644 --- a/Converger/RelIncreDisp.h +++ b/Converger/RelIncreDisp.h @@ -37,7 +37,7 @@ class RelIncreDisp final : public Converger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/RelIncreEnergy.cpp b/Converger/RelIncreEnergy.cpp index b062b3adf..92f802c72 100644 --- a/Converger/RelIncreEnergy.cpp +++ b/Converger/RelIncreEnergy.cpp @@ -31,27 +31,14 @@ RelIncreEnergy::RelIncreEnergy(const unsigned T, const double E, const unsigned unique_ptr RelIncreEnergy::get_copy() { return make_unique(*this); } -bool RelIncreEnergy::is_converged() { +bool RelIncreEnergy::is_converged(const unsigned counter) { const auto& D = get_domain().lock(); auto& W = D->get_factory(); - vec residual = W->get_trial_load() - W->get_sushi(); - - if(!W->get_reference_load().is_empty() && !W->get_trial_load_factor().is_empty()) residual += W->get_reference_load() * W->get_trial_load_factor(); - - for(const auto& t_dof : D->get_restrained_dof()) residual(t_dof) = 0.; - - if(fabs(ref_energy + 1.) < 1E-12) { - ref_energy = fabs(dot(W->get_ninja(), residual)); - set_error(1.); - } - else set_error(fabs(dot(W->get_ninja(), residual)) / ref_energy); - - if(get_tolerance() > get_error()) { - set_conv_flag(true); - ref_energy = -1.; - } - else set_conv_flag(false); + const auto energy = fabs(dot(W->get_ninja(), get_residual())); + if(0u == counter) ref_energy = energy; + set_error(energy / ref_energy); + set_conv_flag(get_tolerance() > get_error()); if(is_print()) suanpan_info("relative energy increment error: %.5E.\n", get_error()); diff --git a/Converger/RelIncreEnergy.h b/Converger/RelIncreEnergy.h index 2b337d38e..b70e286b9 100644 --- a/Converger/RelIncreEnergy.h +++ b/Converger/RelIncreEnergy.h @@ -46,7 +46,7 @@ class RelIncreEnergy final : public Converger { unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Converger/RelResidual.cpp b/Converger/RelResidual.cpp index 8c1ae2e16..d89733ac3 100644 --- a/Converger/RelResidual.cpp +++ b/Converger/RelResidual.cpp @@ -16,30 +16,16 @@ ******************************************************************************/ #include "RelResidual.h" -#include -#include RelResidual::RelResidual(const unsigned T, const double E, const unsigned M, const bool P) : Converger(T, E, M, P) {} unique_ptr RelResidual::get_copy() { return make_unique(*this); } -bool RelResidual::is_converged() { - const auto& D = get_domain().lock(); - auto& W = D->get_factory(); - - auto residual = W->get_trial_load(); - - if(!W->get_reference_load().is_empty() && !W->get_trial_load_factor().is_empty()) residual += W->get_reference_load() * W->get_trial_load_factor(); - - const auto ref_residual = norm(residual); - - residual -= W->get_trial_resistance(); - - for(const auto& t_dof : D->get_restrained_dof()) residual(t_dof) = 0.; - - set_error(norm(residual) / ref_residual); - +bool RelResidual::is_converged(const unsigned counter) { + const auto residual = norm(get_residual()); + if(0u == counter) ref_residual = residual; + set_error(residual / ref_residual); set_conv_flag(get_tolerance() > get_error()); if(is_print()) suanpan_info("relative residual: %.5E.\n", get_error()); diff --git a/Converger/RelResidual.h b/Converger/RelResidual.h index 938640cc3..a99dcc32f 100644 --- a/Converger/RelResidual.h +++ b/Converger/RelResidual.h @@ -46,12 +46,14 @@ class DomainBase; class RelResidual final : public Converger { + double ref_residual = 0.; + public: explicit RelResidual(unsigned = 0, double = 1E-8, unsigned = 7, bool = false); unique_ptr get_copy() override; - bool is_converged() override; + bool is_converged(unsigned) override; }; #endif diff --git a/Database/HDF.cpp b/Database/HDF.cpp index 03b2b2e58..23dda0652 100644 --- a/Database/HDF.cpp +++ b/Database/HDF.cpp @@ -18,7 +18,7 @@ #ifdef SUANPAN_HDF5 #include "HDF.h" -#include +#include //#include diff --git a/Developer/Modifier/ModifierExample.cpp b/Developer/Modifier/ModifierExample.cpp index b562e995d..d7c2f6192 100644 --- a/Developer/Modifier/ModifierExample.cpp +++ b/Developer/Modifier/ModifierExample.cpp @@ -48,7 +48,7 @@ ModifierExample::ModifierExample(const unsigned T, const double A, const double , b(B) {} int ModifierExample::update_status() { - suanpan_for_each(element_pool.cbegin(), element_pool.cend(), [&](const weak_ptr& ele_ptr) { + suanpan::for_all(element_pool, [&](const weak_ptr& ele_ptr) { if(const auto t_ptr = ele_ptr.lock()) { mat t_damping(t_ptr->get_total_number(), t_ptr->get_total_number(), fill::zeros); if(a != 0. && !t_ptr->get_current_mass().empty()) t_damping += a * t_ptr->get_current_mass(); diff --git a/Domain/ConditionalModifier.cpp b/Domain/ConditionalModifier.cpp index 3642b0fa4..2f92b7df4 100644 --- a/Domain/ConditionalModifier.cpp +++ b/Domain/ConditionalModifier.cpp @@ -76,8 +76,6 @@ int ConditionalModifier::initialize(const shared_ptr& D) { int ConditionalModifier::process_resistance(const shared_ptr& D) { return process(D); } -int ConditionalModifier::stage(const shared_ptr&) { return SUANPAN_SUCCESS; } - const uvec& ConditionalModifier::get_node_encoding() const { return node_encoding; } const uvec& ConditionalModifier::get_dof_encoding() const { return dof_encoding; } diff --git a/Domain/ConditionalModifier.h b/Domain/ConditionalModifier.h index ade8d59ef..a4043d45c 100644 --- a/Domain/ConditionalModifier.h +++ b/Domain/ConditionalModifier.h @@ -96,7 +96,7 @@ class ConditionalModifier : public Tag { * predictor--corrector type algorithms. This method is called before committing trial status to perform * necessary operations. */ - virtual int stage(const shared_ptr&); + virtual void stage(const shared_ptr&) {} [[nodiscard]] const uvec& get_node_encoding() const; [[nodiscard]] const uvec& get_dof_encoding() const; diff --git a/Domain/Domain.cpp b/Domain/Domain.cpp index 5427fae95..6852f0602 100644 --- a/Domain/Domain.cpp +++ b/Domain/Domain.cpp @@ -41,7 +41,8 @@ Domain::Domain(const unsigned T) : DomainBase(T) - , factory(make_shared>()) {} + , factory(make_shared>()) + , attribute(10, false) {} Domain::~Domain() { for(const auto& I : thread_pond) I->get(); } @@ -712,6 +713,10 @@ bool Domain::is_updated() const { return updated.load(); } bool Domain::is_sparse() const { return factory->is_sparse(); } +void Domain::set_attribute(const ModalAttribute A) { attribute[static_cast(A)] = true; } + +bool Domain::get_attribute(const ModalAttribute A) { return attribute[static_cast(A)]; } + void Domain::set_color_model(const ColorMethod B) { color_model = B; color_map.clear(); @@ -1177,10 +1182,7 @@ void Domain::summary() const { suanpan_info("\t%llu loads, %llu constraints and %llu recorders.\n", get_load(), get_constraint(), get_recorder()); } -void Domain::erase_machine_error() const { - auto& t_ninja = get_ninja(factory); - suanpan::for_all(restrained_dofs, [&](const uword I) { t_ninja(I) = 0.; }); -} +void Domain::erase_machine_error(vec& ninja) const { suanpan::for_all(restrained_dofs, [&](const uword I) { ninja(I) = 0.; }); } void Domain::update_load() {} diff --git a/Domain/Domain.h b/Domain/Domain.h index f4e824b89..54ebb9f44 100644 --- a/Domain/Domain.h +++ b/Domain/Domain.h @@ -75,6 +75,8 @@ class Domain final : public DomainBase, public std::enable_shared_from_this> color_map; + std::vector attribute; + public: explicit Domain(unsigned = 0); Domain(const Domain&) = delete; // copy forbidden @@ -303,6 +305,9 @@ class Domain final : public DomainBase, public std::enable_shared_from_this>& get_color_map() const override; std::pair, suanpan::graph> get_element_connectivity(bool) override; @@ -358,7 +363,7 @@ class Domain final : public DomainBase, public std::enable_shared_from_this>& get_color_map() const = 0; [[nodiscard]] virtual std::pair, suanpan::graph> get_element_connectivity(bool) = 0; @@ -372,7 +379,7 @@ class DomainBase : public Tag { virtual void assemble_mass_container() const = 0; virtual void assemble_stiffness_container() const = 0; - virtual void erase_machine_error() const = 0; + virtual void erase_machine_error(vec&) const = 0; virtual void update_load() = 0; virtual void update_constraint() = 0; diff --git a/Domain/DomainState.cpp b/Domain/DomainState.cpp index cd24d5b2f..127a36f8e 100644 --- a/Domain/DomainState.cpp +++ b/Domain/DomainState.cpp @@ -15,12 +15,12 @@ * along with this program. If not, see . ******************************************************************************/ +#include "Domain.h" #include #include #include #include -#include "Domain.h" -#include "FactoryHelper.hpp" +#include void Domain::update_current_resistance() const { get_trial_resistance(factory).zeros(); @@ -74,6 +74,9 @@ void Domain::assemble_resistance() const { }); suanpan::for_all(node_pond.get(), [&](const shared_ptr& t_node) { t_node->update_trial_resistance(trial_resistance(t_node->get_reordered_dof())); }); + + // update to sync incre_resistance + factory->update_trial_resistance(trial_resistance); } void Domain::assemble_damping_force() const { @@ -88,6 +91,9 @@ void Domain::assemble_damping_force() const { }); suanpan::for_all(node_pond.get(), [&](const shared_ptr& t_node) { t_node->update_trial_damping_force(trial_damping_force(t_node->get_reordered_dof())); }); + + // update to sync incre_damping_force + factory->update_trial_damping_force(trial_damping_force); } void Domain::assemble_inertial_force() const { @@ -102,6 +108,9 @@ void Domain::assemble_inertial_force() const { }); suanpan::for_all(node_pond.get(), [&](const shared_ptr& t_node) { t_node->update_trial_inertial_force(trial_inertial_force(t_node->get_reordered_dof())); }); + + // update to sync incre_inertial_force + factory->update_trial_inertial_force(trial_inertial_force); } void Domain::assemble_initial_mass() const { @@ -311,9 +320,8 @@ int Domain::update_trial_status() const { if(AnalysisType::DYNAMICS == factory->get_analysis_type()) suanpan::for_all(node_pond.get(), [&](const shared_ptr& t_node) { t_node->update_trial_status(trial_displacement, trial_velocity, trial_acceleration); }); else suanpan::for_all(node_pond.get(), [&](const shared_ptr& t_node) { t_node->update_trial_status(trial_displacement); }); - auto code = 0; + std::atomic_int code = 0; suanpan::for_all(element_pond.get(), [&](const shared_ptr& t_element) { code += t_element->update_status(); }); - return code; } @@ -325,22 +333,19 @@ int Domain::update_incre_status() const { if(AnalysisType::DYNAMICS == factory->get_analysis_type()) suanpan::for_all(node_pond.get(), [&](const shared_ptr& t_node) { t_node->update_incre_status(incre_displacement, incre_velocity, incre_acceleration); }); else suanpan::for_all(node_pond.get(), [&](const shared_ptr& t_node) { t_node->update_incre_status(incre_displacement); }); - auto code = 0; + std::atomic_int code = 0; suanpan::for_all(element_pond.get(), [&](const shared_ptr& t_element) { code += t_element->update_status(); }); - return code; } int Domain::update_current_status() const { - const auto& analysis_type = factory->get_analysis_type(); + const auto analysis_type = factory->get_analysis_type(); - if(vec c_g_dsp(factory->get_size(), fill::zeros); analysis_type == AnalysisType::STATICS || analysis_type == AnalysisType::BUCKLE) { - for(const auto& I : node_pond.get()) c_g_dsp(I->get_reordered_dof()) = I->get_current_displacement(); - factory->update_current_displacement(c_g_dsp); + if(analysis_type != AnalysisType::STATICS && analysis_type != AnalysisType::DYNAMICS && analysis_type != AnalysisType::BUCKLE) return SUANPAN_SUCCESS; - update_current_resistance(); - } - else if(analysis_type == AnalysisType::DYNAMICS) { + // collect initial nodal quantities into global storage + if(analysis_type == AnalysisType::DYNAMICS) { + vec c_g_dsp(factory->get_size(), fill::zeros); vec c_g_vel(factory->get_size(), fill::zeros); vec c_g_acc(factory->get_size(), fill::zeros); @@ -353,8 +358,33 @@ int Domain::update_current_status() const { factory->update_current_displacement(c_g_dsp); factory->update_current_velocity(c_g_vel); factory->update_current_acceleration(c_g_acc); + } + else { + vec c_g_dsp(factory->get_size(), fill::zeros); + + for(const auto& I : node_pond.get()) { + auto& t_dof = I->get_reordered_dof(); + c_g_dsp(t_dof) = I->get_current_displacement(); + } + factory->update_current_displacement(c_g_dsp); + } + + std::atomic_int code = 0; + suanpan::for_all(element_pond.get(), [&](const shared_ptr& t_element) { code += t_element->update_status(); }); + + if(SUANPAN_SUCCESS != code) { + suanpan_error("initial conditions cause significant non-linearity, use an analysis step instead.\n"); + return SUANPAN_FAIL; + } + + // commit element status + suanpan::for_all(element_pond.get(), [](const shared_ptr& t_element) { + t_element->Element::commit_status(); + t_element->commit_status(); + }); - update_current_resistance(); + update_current_resistance(); + if(analysis_type == AnalysisType::DYNAMICS) { update_current_damping_force(); update_current_inertial_force(); } diff --git a/Domain/Factory.hpp b/Domain/Factory.hpp index b8686fee4..22ce096af 100644 --- a/Domain/Factory.hpp +++ b/Domain/Factory.hpp @@ -167,6 +167,8 @@ template class Factory final { template friend unique_ptr> get_basic_container(const Factory*); template friend unique_ptr> get_matrix_container(const Factory*); + void assemble_matrix_helper(shared_ptr>&, const Mat&, const uvec&); + public: const bool initialized = false; @@ -206,8 +208,8 @@ template class Factory final { void set_reference_dof(const suanpan::set&); [[nodiscard]] const suanpan::set& get_reference_dof() const; - void set_error(const T&); - const T& get_error() const; + void set_error(T); + T get_error() const; /*************************INITIALIZER*************************/ @@ -240,7 +242,7 @@ template class Factory final { void set_reference_load(const SpMat&); - void set_trial_time(const T&); + void set_trial_time(T); void set_trial_load_factor(const Col&); void set_trial_load(const Col&); void set_trial_settlement(const Col&); @@ -252,7 +254,7 @@ template class Factory final { void set_trial_acceleration(const Col&); void set_trial_temperature(const Col&); - void set_incre_time(const T&); + void set_incre_time(T); void set_incre_load_factor(const Col&); void set_incre_load(const Col&); void set_incre_settlement(const Col&); @@ -264,7 +266,7 @@ template class Factory final { void set_incre_acceleration(const Col&); void set_incre_temperature(const Col&); - void set_current_time(const T&); + void set_current_time(T); void set_current_load_factor(const Col&); void set_current_load(const Col&); void set_current_settlement(const Col&); @@ -276,7 +278,7 @@ template class Factory final { void set_current_acceleration(const Col&); void set_current_temperature(const Col&); - void set_pre_time(const T&); + void set_pre_time(T); void set_pre_load_factor(const Col&); void set_pre_load(const Col&); void set_pre_settlement(const Col&); @@ -320,7 +322,7 @@ template class Factory final { T get_complementary_energy(); const Col& get_momentum(); - const T& get_trial_time() const; + T get_trial_time() const; const Col& get_trial_load_factor() const; const Col& get_trial_load() const; const Col& get_trial_settlement() const; @@ -332,7 +334,7 @@ template class Factory final { const Col& get_trial_acceleration() const; const Col& get_trial_temperature() const; - const T& get_incre_time() const; + T get_incre_time() const; const Col& get_incre_load_factor() const; const Col& get_incre_load() const; const Col& get_incre_settlement() const; @@ -344,7 +346,7 @@ template class Factory final { const Col& get_incre_acceleration() const; const Col& get_incre_temperature() const; - const T& get_current_time() const; + T get_current_time() const; const Col& get_current_load_factor() const; const Col& get_current_load() const; const Col& get_current_settlement() const; @@ -356,7 +358,7 @@ template class Factory final { const Col& get_current_acceleration() const; const Col& get_current_temperature() const; - const T& get_pre_time() const; + T get_pre_time() const; const Col& get_pre_load_factor() const; const Col& get_pre_load() const; const Col& get_pre_settlement() const; @@ -393,7 +395,7 @@ template class Factory final { /*************************UPDATER*************************/ - void update_trial_time(const T&); + void update_trial_time(T); void update_trial_load_factor(const Col&); void update_trial_load(const Col&); void update_trial_settlement(const Col&); @@ -405,7 +407,7 @@ template class Factory final { void update_trial_acceleration(const Col&); void update_trial_temperature(const Col&); - void update_incre_time(const T&); + void update_incre_time(T); void update_incre_load_factor(const Col&); void update_incre_load(const Col&); void update_incre_settlement(const Col&); @@ -417,7 +419,7 @@ template class Factory final { void update_incre_acceleration(const Col&); void update_incre_temperature(const Col&); - void update_current_time(const T&); + void update_current_time(T); void update_current_load_factor(const Col&); void update_current_load(const Col&); void update_current_settlement(const Col&); @@ -429,7 +431,7 @@ template class Factory final { void update_current_acceleration(const Col&); void update_current_temperature(const Col&); - void update_trial_time_by(const T&); + void update_trial_time_by(T); void update_trial_load_factor_by(const Col&); void update_trial_load_by(const Col&); void update_trial_settlement_by(const Col&); @@ -441,7 +443,7 @@ template class Factory final { void update_trial_acceleration_by(const Col&); void update_trial_temperature_by(const Col&); - void update_incre_time_by(const T&); + void update_incre_time_by(T); void update_incre_load_factor_by(const Col&); void update_incre_load_by(const Col&); void update_incre_settlement_by(const Col&); @@ -453,7 +455,7 @@ template class Factory final { void update_incre_acceleration_by(const Col&); void update_incre_temperature_by(const Col&); - void update_current_time_by(const T&); + void update_current_time_by(T); void update_current_load_factor_by(const Col&); void update_current_load_by(const Col&); void update_current_settlement_by(const Col&); @@ -482,7 +484,7 @@ template class Factory final { template friend SpCol& get_trial_constraint_resistance(const shared_ptr>&); template friend SpCol& get_current_constraint_resistance(const shared_ptr>&); - template friend T& get_trial_time(const shared_ptr>&); + template friend T1& get_trial_time(const shared_ptr>&); template friend Col& get_trial_load_factor(const shared_ptr>&); template friend Col& get_trial_load(const shared_ptr>&); template friend Col& get_trial_settlement(const shared_ptr>&); @@ -494,7 +496,7 @@ template class Factory final { template friend Col& get_trial_acceleration(const shared_ptr>&); template friend Col& get_trial_temperature(const shared_ptr>&); - template friend T& get_incre_time(const shared_ptr>&); + template friend T1& get_incre_time(const shared_ptr>&); template friend Col& get_incre_load_factor(const shared_ptr>&); template friend Col& get_incre_load(const shared_ptr>&); template friend Col& get_incre_settlement(const shared_ptr>&); @@ -506,7 +508,7 @@ template class Factory final { template friend Col& get_incre_acceleration(const shared_ptr>&); template friend Col& get_incre_temperature(const shared_ptr>&); - template friend T& get_current_time(const shared_ptr>&); + template friend T1& get_current_time(const shared_ptr>&); template friend Col& get_current_load_factor(const shared_ptr>&); template friend Col& get_current_load(const shared_ptr>&); template friend Col& get_current_settlement(const shared_ptr>&); @@ -518,7 +520,7 @@ template class Factory final { template friend Col& get_current_acceleration(const shared_ptr>&); template friend Col& get_current_temperature(const shared_ptr>&); - template friend T& get_pre_time(const shared_ptr>&); + template friend T1& get_pre_time(const shared_ptr>&); template friend Col& get_pre_load_factor(const shared_ptr>&); template friend Col& get_pre_load(const shared_ptr>&); template friend Col& get_pre_settlement(const shared_ptr>&); @@ -702,9 +704,9 @@ template void Factory::set_reference_dof(const suanpan::set& D template const suanpan::set& Factory::get_reference_dof() const { return reference_dof; } -template void Factory::set_error(const T& E) { error = E; } +template void Factory::set_error(const T E) { error = E; } -template const T& Factory::get_error() const { return error; } +template T Factory::get_error() const { return error; } template int Factory::initialize() { reference_dof.clear(); // clear reference dof vector in every step @@ -857,7 +859,7 @@ template void Factory::set_mpc(const unsigned S) { template void Factory::set_reference_load(const SpMat& L) { reference_load = L; } -template void Factory::set_trial_time(const T& M) { trial_time = M; } +template void Factory::set_trial_time(const T M) { trial_time = M; } template void Factory::set_trial_load_factor(const Col& L) { trial_load_factor = L; } @@ -879,7 +881,7 @@ template void Factory::set_trial_acceleration(const Col& A) { tria template void Factory::set_trial_temperature(const Col& M) { trial_temperature = M; } -template void Factory::set_incre_time(const T& M) { incre_time = M; } +template void Factory::set_incre_time(const T M) { incre_time = M; } template void Factory::set_incre_load_factor(const Col& L) { incre_load_factor = L; } @@ -901,7 +903,7 @@ template void Factory::set_incre_acceleration(const Col& A) { incr template void Factory::set_incre_temperature(const Col& M) { incre_temperature = M; } -template void Factory::set_current_time(const T& M) { current_time = M; } +template void Factory::set_current_time(const T M) { current_time = M; } template void Factory::set_current_load_factor(const Col& L) { current_load_factor = L; } @@ -923,7 +925,7 @@ template void Factory::set_current_acceleration(const Col& A) { cu template void Factory::set_current_temperature(const Col& M) { current_temperature = M; } -template void Factory::set_pre_time(const T& M) { pre_time = M; } +template void Factory::set_pre_time(const T M) { pre_time = M; } template void Factory::set_pre_load_factor(const Col& L) { pre_load_factor = L; } @@ -989,7 +991,7 @@ template T Factory::get_complementary_energy() { return complementary template const Col& Factory::get_momentum() { return momentum; } -template const T& Factory::get_trial_time() const { return trial_time; } +template T Factory::get_trial_time() const { return trial_time; } template const Col& Factory::get_trial_load_factor() const { return trial_load_factor; } @@ -1011,7 +1013,7 @@ template const Col& Factory::get_trial_acceleration() const { retu template const Col& Factory::get_trial_temperature() const { return trial_temperature; } -template const T& Factory::get_incre_time() const { return incre_time; } +template T Factory::get_incre_time() const { return incre_time; } template const Col& Factory::get_incre_load_factor() const { return incre_load_factor; } @@ -1033,7 +1035,7 @@ template const Col& Factory::get_incre_acceleration() const { retu template const Col& Factory::get_incre_temperature() const { return incre_temperature; } -template const T& Factory::get_current_time() const { return current_time; } +template T Factory::get_current_time() const { return current_time; } template const Col& Factory::get_current_load_factor() const { return current_load_factor; } @@ -1055,7 +1057,7 @@ template const Col& Factory::get_current_acceleration() const { re template const Col& Factory::get_current_temperature() const { return current_temperature; } -template const T& Factory::get_pre_time() const { return pre_time; } +template T Factory::get_pre_time() const { return pre_time; } template const Col& Factory::get_pre_load_factor() const { return pre_load_factor; } @@ -1111,7 +1113,7 @@ template const Col& Factory::get_eigenvalue() const { return eigen template const Mat& Factory::get_eigenvector() const { return eigenvector; } -template void Factory::update_trial_time(const T& M) { +template void Factory::update_trial_time(const T M) { trial_time = M; incre_time = trial_time - current_time; } @@ -1166,7 +1168,7 @@ template void Factory::update_trial_temperature(const Col& M) { incre_temperature = trial_temperature - current_temperature; } -template void Factory::update_incre_time(const T& M) { +template void Factory::update_incre_time(const T M) { incre_time = M; trial_time = current_time + incre_time; } @@ -1221,7 +1223,7 @@ template void Factory::update_incre_temperature(const Col& M) { trial_temperature = current_temperature + incre_temperature; } -template void Factory::update_current_time(const T& M) { +template void Factory::update_current_time(const T M) { trial_time = current_time = M; incre_time = 0.; } @@ -1276,7 +1278,7 @@ template void Factory::update_current_temperature(const Col& M) { incre_temperature.zeros(); } -template void Factory::update_trial_time_by(const T& M) { +template void Factory::update_trial_time_by(const T M) { trial_time += M; incre_time = trial_time - current_time; } @@ -1331,7 +1333,7 @@ template void Factory::update_trial_temperature_by(const Col& M) { incre_temperature = trial_temperature - current_temperature; } -template void Factory::update_incre_time_by(const T& M) { +template void Factory::update_incre_time_by(const T M) { incre_time += M; trial_time = current_time + incre_time; } @@ -1386,7 +1388,7 @@ template void Factory::update_incre_temperature_by(const Col& M) { trial_temperature = current_temperature + incre_temperature; } -template void Factory::update_current_time_by(const T& M) { +template void Factory::update_current_time_by(const T M) { trial_time = current_time += M; incre_time = 0.; } @@ -1464,6 +1466,8 @@ template void Factory::clear_energy() { } template void Factory::commit_status() { + ninja.zeros(); + commit_energy(); commit_time(); @@ -1814,25 +1818,29 @@ template void Factory::assemble_inertial_force(const Mat& ER, cons for(unsigned I = 0; I < EI.n_elem; ++I) trial_inertial_force(EI(I)) += ER(I); } -template void Factory::assemble_mass(const Mat& EM, const uvec& EI) { +/** + * \brief Assemble given elemental matrix into global matrix + * \param GM global matrix + * \param EM elemental matrix + * \param EI elemental matrix indices + */ +template void Factory::assemble_matrix_helper(shared_ptr>& GM, const Mat& EM, const uvec& EI) { if(EM.is_empty()) return; - for(unsigned I = 0; I < EI.n_elem; ++I) for(unsigned J = 0; J < EI.n_elem; ++J) global_mass->at(EI(J), EI(I)) += EM(J, I); -} -template void Factory::assemble_damping(const Mat& EC, const uvec& EI) { - if(EC.is_empty()) return; - for(unsigned I = 0; I < EI.n_elem; ++I) for(unsigned J = 0; J < EI.n_elem; ++J) global_damping->at(EI(J), EI(I)) += EC(J, I); + if(StorageScheme::BANDSYMM == storage_type || StorageScheme::SYMMPACK == storage_type) { + const uvec NEI = sort_index(EI); + for(unsigned I = 0; I < NEI.n_elem; ++I) for(unsigned J = 0; J <= I; ++J) GM->unsafe_at(EI(NEI(I)), EI(NEI(J))) += EM(NEI(I), NEI(J)); + } + else for(unsigned I = 0; I < EI.n_elem; ++I) for(unsigned J = 0; J < EI.n_elem; ++J) GM->unsafe_at(EI(J), EI(I)) += EM(J, I); } -template void Factory::assemble_stiffness(const Mat& EK, const uvec& EI) { - if(EK.is_empty()) return; - for(unsigned I = 0; I < EI.n_elem; ++I) for(unsigned J = 0; J < EI.n_elem; ++J) global_stiffness->at(EI(J), EI(I)) += EK(J, I); -} +template void Factory::assemble_mass(const Mat& EM, const uvec& EI) { this->assemble_matrix_helper(global_mass, EM, EI); } -template void Factory::assemble_geometry(const Mat& EG, const uvec& EI) { - if(EG.is_empty() || !nlgeom) return; - for(unsigned I = 0; I < EI.n_elem; ++I) for(unsigned J = 0; J < EI.n_elem; ++J) global_geometry->at(EI(J), EI(I)) += EG(J, I); -} +template void Factory::assemble_damping(const Mat& EC, const uvec& EI) { this->assemble_matrix_helper(global_damping, EC, EI); } + +template void Factory::assemble_stiffness(const Mat& EK, const uvec& EI) { this->assemble_matrix_helper(global_stiffness, EK, EI); } + +template void Factory::assemble_geometry(const Mat& EG, const uvec& EI) { this->assemble_matrix_helper(global_geometry, EG, EI); } template void Factory::assemble_stiffness(const SpMat& EK, const uvec& EI) { if(EK.is_empty()) return; diff --git a/Domain/MetaMat/BandMat.hpp b/Domain/MetaMat/BandMat.hpp index 7a14fffe8..5a84959df 100644 --- a/Domain/MetaMat/BandMat.hpp +++ b/Domain/MetaMat/BandMat.hpp @@ -54,6 +54,7 @@ template class BandMat final : public DenseMat { void nullify(uword) override; const T& operator()(uword, uword) const override; + T& unsafe_at(uword, uword) override; T& at(uword, uword) override; Mat operator*(const Mat&) const override; @@ -90,6 +91,11 @@ template const T& BandMat::operator()(const uword in_row, const uword return this->memory[in_row + s_band + in_col * (m_rows - 1)]; } +template T& BandMat::unsafe_at(const uword in_row, const uword in_col) { + this->factored = false; + return access::rw(this->memory[in_row + s_band + in_col * (m_rows - 1)]); +} + template T& BandMat::at(const uword in_row, const uword in_col) { if(in_row > in_col + l_band || in_row + u_band < in_col) return bin = 0.; this->factored = false; diff --git a/Domain/MetaMat/BandSymmMat.hpp b/Domain/MetaMat/BandSymmMat.hpp index 4aa2b65d3..159a77c46 100644 --- a/Domain/MetaMat/BandSymmMat.hpp +++ b/Domain/MetaMat/BandSymmMat.hpp @@ -52,6 +52,7 @@ template class BandSymmMat final : public DenseMat { void nullify(uword) override; const T& operator()(uword, uword) const override; + T& unsafe_at(uword, uword) override; T& at(uword, uword) override; Mat operator*(const Mat&) const override; @@ -76,7 +77,8 @@ template void BandSymmMat::unify(const uword K) { template void BandSymmMat::nullify(const uword K) { suanpan_for(std::max(band, K) - band, K, [&](const uword I) { access::rw(this->memory[K - I + I * m_rows]) = 0.; }); - suanpan_for(K, std::min(this->n_rows, K + band + 1), [&](const uword I) { access::rw(this->memory[I - K + K * m_rows]) = 0.; }); + const auto t_factor = K * m_rows - K; + suanpan_for(K, std::min(this->n_rows, K + band + 1), [&](const uword I) { access::rw(this->memory[I + t_factor]) = 0.; }); this->factored = false; } @@ -86,8 +88,13 @@ template const T& BandSymmMat::operator()(const uword in_row, const u return this->memory[in_row > in_col ? in_row - in_col + in_col * m_rows : in_col - in_row + in_row * m_rows]; } +template T& BandSymmMat::unsafe_at(const uword in_row, const uword in_col) { + this->factored = false; + return access::rw(this->memory[in_row - in_col + in_col * m_rows]); +} + template T& BandSymmMat::at(const uword in_row, const uword in_col) { - if(in_row > band + in_col || in_row < in_col) return bin = 0.; + if(in_row > band + in_col || in_row < in_col) [[unlikely]] return bin = 0.; this->factored = false; return access::rw(this->memory[in_row - in_col + in_col * m_rows]); } diff --git a/Domain/MetaMat/DenseMat.hpp b/Domain/MetaMat/DenseMat.hpp index 8c65377b6..1e0f50c79 100644 --- a/Domain/MetaMat/DenseMat.hpp +++ b/Domain/MetaMat/DenseMat.hpp @@ -136,7 +136,12 @@ template void DenseMat::zeros() { this->factored = false; } -template T DenseMat::max() const { return op_max::direct_max(memptr(), this->n_elem); } +template T DenseMat::max() const { + T max_value = T(1); + const auto t_size = std::min(this->n_rows, this->n_cols); + for(uword I = 0; I < t_size; ++I) if(const auto t_val = this->operator()(I, I); t_val > max_value) max_value = t_val; + return max_value; +} template Col DenseMat::diag() const { Col diag_vec(std::min(this->n_rows, this->n_cols), fill::none); diff --git a/Domain/MetaMat/MetaMat.hpp b/Domain/MetaMat/MetaMat.hpp index b4afac243..d1392f301 100644 --- a/Domain/MetaMat/MetaMat.hpp +++ b/Domain/MetaMat/MetaMat.hpp @@ -72,7 +72,20 @@ template class MetaMat { [[nodiscard]] virtual T max() const = 0; [[nodiscard]] virtual Col diag() const = 0; + /** + * \brief Access element (read-only), returns zero if out-of-bound + * \return value + */ virtual const T& operator()(uword, uword) const = 0; + /** + * \brief Access element without bound check + * \return value + */ + virtual T& unsafe_at(uword, uword); + /** + * \brief Access element with bound check + * \return value + */ virtual T& at(uword, uword) = 0; [[nodiscard]] virtual const T* memptr() const = 0; @@ -153,6 +166,8 @@ template SolverSetting& MetaMat::get_solver_setting() { return set template void MetaMat::set_factored(const bool F) { factored = F; } +template T& MetaMat::unsafe_at(const uword I, const uword J) { return this->at(I, J); } + template int MetaMat::direct_solve(Mat& X, const SpMat& B) { return this->direct_solve(X, Mat(B)); } template int MetaMat::direct_solve(Mat& X, Mat&& B) { return this->direct_solve(X, B); } diff --git a/Domain/MetaMat/SymmPackMat.hpp b/Domain/MetaMat/SymmPackMat.hpp index 9dd43905f..2f9cfa1a8 100644 --- a/Domain/MetaMat/SymmPackMat.hpp +++ b/Domain/MetaMat/SymmPackMat.hpp @@ -19,8 +19,8 @@ * @brief A SymmPackMat class that holds matrices. * * @author tlc - * @date 06/09/2017 - * @version 0.1.0 + * @date 13/11/2022 + * @version 0.2.0 * @file SymmPackMat.hpp * @addtogroup MetaMat * @{ @@ -33,10 +33,12 @@ #include "DenseMat.hpp" template class SymmPackMat final : public DenseMat { - static constexpr char UPLO = 'U'; + static constexpr char UPLO = 'L'; static T bin; + const uword length; // 2n-1 + int solve_trs(Mat&, Mat&&); int solve_trs(Mat&, const Mat&); @@ -49,6 +51,7 @@ template class SymmPackMat final : public DenseMat { void nullify(uword) override; const T& operator()(uword, uword) const override; + T& unsafe_at(uword, uword) override; T& at(uword, uword) override; Mat operator*(const Mat&) const override; @@ -60,49 +63,52 @@ template class SymmPackMat final : public DenseMat { template T SymmPackMat::bin = 0.; template SymmPackMat::SymmPackMat(const uword in_size) - : DenseMat(in_size, in_size, (in_size + 1) * in_size / 2) {} + : DenseMat(in_size, in_size, (in_size + 1) * in_size / 2) + , length(2 * in_size - 1) {} template unique_ptr> SymmPackMat::make_copy() { return std::make_unique>(*this); } template void SymmPackMat::unify(const uword K) { nullify(K); - access::rw(this->memory[(K * K + 3 * K) / 2]) = 1.; + access::rw(this->memory[(length - K + 2) * K / 2]) = 1.; } template void SymmPackMat::nullify(const uword K) { - suanpan_for(0llu, K, [&](const uword I) { access::rw(this->memory[(K * K + K) / 2 + I]) = 0.; }); - suanpan_for(K, this->n_rows, [&](const uword I) { access::rw(this->memory[(I * I + I) / 2 + K]) = 0.; }); + suanpan_for(0llu, K, [&](const uword I) { access::rw(this->memory[K + (length - I) * I / 2]) = 0.; }); + const auto t_factor = (length - K) * K / 2; + suanpan_for(K, this->n_rows, [&](const uword I) { access::rw(this->memory[I + t_factor]) = 0.; }); this->factored = false; } -template const T& SymmPackMat::operator()(const uword in_row, const uword in_col) const { return this->memory[in_col > in_row ? (in_col * in_col + in_col) / 2 + in_row : (in_row * in_row + in_row) / 2 + in_col]; } +template const T& SymmPackMat::operator()(const uword in_row, const uword in_col) const { return this->memory[in_row >= in_col ? in_row + (length - in_col) * in_col / 2 : in_col + (length - in_row) * in_row / 2]; } -template T& SymmPackMat::at(const uword in_row, const uword in_col) { - if(in_col < in_row) return bin; +template T& SymmPackMat::unsafe_at(const uword in_row, const uword in_col) { this->factored = false; - return access::rw(this->memory[(in_col * in_col + in_col) / 2 + in_row]); + return access::rw(this->memory[in_row + (length - in_col) * in_col / 2]); } -template Mat spmm(const SymmPackMat& A, const Mat& B); +template T& SymmPackMat::at(const uword in_row, const uword in_col) { + if(in_row < in_col) [[unlikely]] return bin; + this->factored = false; + return access::rw(this->memory[in_row + (length - in_col) * in_col / 2]); +} template Mat SymmPackMat::operator*(const Mat& X) const { - if(!X.is_colvec()) return spmm<'R', 'N'>(*this, X); - - auto Y = X; + auto Y = Mat(arma::size(X), fill::none); const auto N = static_cast(this->n_rows); - constexpr auto INC = 1; + const auto INC = 1; T ALPHA = 1.; T BETA = 0.; if(std::is_same_v) { using E = float; - arma_fortran(arma_sspmv)(&UPLO, &N, (E*)&ALPHA, (E*)this->memptr(), (E*)X.memptr(), &INC, (E*)&BETA, (E*)Y.memptr(), &INC); + suanpan_for(0llu, X.n_cols, [&](const uword I) { arma_fortran(arma_sspmv)(&UPLO, &N, (E*)&ALPHA, (E*)this->memptr(), (E*)X.colptr(I), &INC, (E*)&BETA, (E*)Y.colptr(I), &INC); }); } else if(std::is_same_v) { using E = double; - arma_fortran(arma_dspmv)(&UPLO, &N, (E*)&ALPHA, (E*)this->memptr(), (E*)X.memptr(), &INC, (E*)&BETA, (E*)Y.memptr(), &INC); + suanpan_for(0llu, X.n_cols, [&](const uword I) { arma_fortran(arma_dspmv)(&UPLO, &N, (E*)&ALPHA, (E*)this->memptr(), (E*)X.colptr(I), &INC, (E*)&BETA, (E*)Y.colptr(I), &INC); }); } return Y; @@ -175,7 +181,7 @@ template int SymmPackMat::solve_trs(Mat& X, const Mat& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = norm(full_residual -= this->operator*(incre))); + suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(full_residual -= this->operator*(incre))); } } @@ -249,7 +255,7 @@ template int SymmPackMat::solve_trs(Mat& X, Mat&& B) { X += incre; - suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = norm(B -= this->operator*(incre))); + suanpan_debug("mixed precision algorithm multiplier: %.5E.\n", multiplier = arma::norm(B -= this->operator*(incre))); } } diff --git a/Domain/MetaMat/csc_form.hpp b/Domain/MetaMat/csc_form.hpp index 3d1ef8fc1..24bc750a7 100644 --- a/Domain/MetaMat/csc_form.hpp +++ b/Domain/MetaMat/csc_form.hpp @@ -78,7 +78,7 @@ template class csc_form final { [[nodiscard]] data_t max() const { if(0 == n_elem) return data_t(0); - return *std::max_element(val_idx.get(), val_idx.get() + n_elem); + return *suanpan_max_element(val_idx.get(), val_idx.get() + n_elem); } void print() const; diff --git a/Domain/MetaMat/csr_form.hpp b/Domain/MetaMat/csr_form.hpp index cf0e96d29..5e2a7c8c7 100644 --- a/Domain/MetaMat/csr_form.hpp +++ b/Domain/MetaMat/csr_form.hpp @@ -72,7 +72,7 @@ template class csr_form final { [[nodiscard]] data_t max() const { if(0 == n_elem) return data_t(0); - return *std::max_element(val_idx.get(), val_idx.get() + n_elem); + return *suanpan_max_element(val_idx.get(), val_idx.get() + n_elem); } void print() const; diff --git a/Domain/MetaMat/operator_times.hpp b/Domain/MetaMat/operator_times.hpp index e3d56cba9..90fe03ef2 100644 --- a/Domain/MetaMat/operator_times.hpp +++ b/Domain/MetaMat/operator_times.hpp @@ -42,6 +42,11 @@ template const shared_ptr>& operator*=(const shared_ptr const unique_ptr>& operator*=(const unique_ptr>& M, const T value) { + M->operator*=(value); + return M; +} + template const shared_ptr>& operator+=(const shared_ptr>& M, const shared_ptr>& A) { M->operator+=(A); return M; @@ -152,66 +157,6 @@ template Mat operator*(const Mat& A, const FullMat& B) { return C; } -template Mat spmm(const SymmPackMat& A, const Mat& B) { - Mat C; - - const auto SIDE = S; - const auto TRAN = T; - constexpr auto UPLO = 'U'; - - auto M = static_cast(A.n_rows); - - auto PT = 0; - if constexpr(SIDE == 'L') PT += 1; - if constexpr(TRAN == 'T') PT += 10; - - int N, LDC; - - switch(PT) { - case 0: // A*B - N = static_cast(B.n_cols); - C.set_size(M, N); - LDC = M; - break; - case 1: // B*A - N = static_cast(B.n_rows); - C.set_size(N, M); - LDC = N; - break; - case 10: // A*B**T - N = static_cast(B.n_rows); - C.set_size(M, N); - LDC = M; - break; - case 11: // B**T*A - N = static_cast(B.n_cols); - C.set_size(N, M); - LDC = N; - break; - default: - break; - } - - T1 ALPHA = 1.; - const auto LDB = static_cast(B.n_rows); - T1 BETA = 0.; - - if(std::is_same_v) { - using E = float; - arma_fortran(arma_sspmm)(&SIDE, &UPLO, &TRAN, &M, &N, (E*)A.memptr(), (E*)&ALPHA, (E*)B.memptr(), &LDB, (E*)&BETA, (E*)C.memptr(), &LDC); - } - else if(std::is_same_v) { - using E = double; - arma_fortran(arma_dspmm)(&SIDE, &UPLO, &TRAN, &M, &N, (E*)A.memptr(), (E*)&ALPHA, (E*)B.memptr(), &LDB, (E*)&BETA, (E*)C.memptr(), &LDC); - } - - return C; -} - -template Mat operator*(const Mat& A, const SymmPackMat& B) { return spmm<'L', 'N'>(B, A); } - -template Mat operator*(const Op, op_htrans>& A, const SymmPackMat& B) { return spmm<'L', 'T'>(B, A.m); } - template triplet_form operator*(const T value, const triplet_form& M) { auto N = M; N *= value; diff --git a/Domain/MetaMat/triplet_form.hpp b/Domain/MetaMat/triplet_form.hpp index 6f411d6a3..318fe489c 100644 --- a/Domain/MetaMat/triplet_form.hpp +++ b/Domain/MetaMat/triplet_form.hpp @@ -170,7 +170,7 @@ template class triplet_form final { [[nodiscard]] data_t max() const { if(is_empty()) return data_t(0); - return *std::max_element(val_idx.get(), val_idx.get() + n_elem); + return *suanpan_max_element(val_idx.get(), val_idx.get() + n_elem); } void zeros() { diff --git a/Element/Beam/EB21.cpp b/Element/Beam/EB21.cpp index c4213f704..d6cbaf3be 100644 --- a/Element/Beam/EB21.cpp +++ b/Element/Beam/EB21.cpp @@ -77,12 +77,10 @@ int EB21::reset_status() { } vector EB21::record(const OutputType P) { - vector output; + if(P == OutputType::BEAME) return {b_trans->to_local_vec(get_current_displacement())}; + if(P == OutputType::BEAMS) return {vec{local_stiff * b_trans->to_local_vec(get_current_displacement())}}; - if(P == OutputType::E) output.emplace_back(b_trans->to_local_vec(get_current_displacement())); - else if(P == OutputType::S) output.emplace_back(local_stiff * b_trans->to_local_vec(get_current_displacement())); - - return output; + return {}; } void EB21::print() { suanpan_info("An elastic B21 element%s", nlgeom ? " with corotational formulation.\n" : ".\n"); } diff --git a/Element/Cube/C3D20.cpp b/Element/Cube/C3D20.cpp index cc9b1676d..98f18a9a9 100644 --- a/Element/Cube/C3D20.cpp +++ b/Element/Cube/C3D20.cpp @@ -179,9 +179,7 @@ mat C3D20::compute_shape_function(const mat& coordinate, const unsigned order) c vector C3D20::record(const OutputType T) { vector data; - for(const auto& I : int_pt) for(const auto& J : I.c_material->record(T)) data.emplace_back(J); - return data; } diff --git a/Element/Cube/C3D8.cpp b/Element/Cube/C3D8.cpp index 330ec1ee2..d943014f9 100644 --- a/Element/Cube/C3D8.cpp +++ b/Element/Cube/C3D8.cpp @@ -199,9 +199,7 @@ mat C3D8::compute_shape_function(const mat& coordinate, const unsigned order) co vector C3D8::record(const OutputType T) { vector data; - for(const auto& I : int_pt) for(const auto& J : I.c_material->record(T)) data.emplace_back(J); - return data; } diff --git a/Element/Cube/C3D8I.cpp b/Element/Cube/C3D8I.cpp index 204dc20db..57e42681b 100644 --- a/Element/Cube/C3D8I.cpp +++ b/Element/Cube/C3D8I.cpp @@ -142,9 +142,7 @@ mat C3D8I::compute_shape_function(const mat& coordinate, const unsigned order) c vector C3D8I::record(const OutputType T) { vector data; - if(OutputType::E == T) for(const auto& I : int_pt) data.emplace_back(I.c_material->get_trial_strain()); - else if(OutputType::S == T) for(const auto& I : int_pt) data.emplace_back(I.c_material->get_trial_stress()); - else for(const auto& I : int_pt) for(const auto& J : I.c_material->record(T)) data.emplace_back(J); + for(const auto& I : int_pt) for(const auto& J : I.c_material->record(T)) data.emplace_back(J); return data; } diff --git a/Element/Cube/CIN3D8.cpp b/Element/Cube/CIN3D8.cpp index 1e018449e..7a9d120e2 100644 --- a/Element/Cube/CIN3D8.cpp +++ b/Element/Cube/CIN3D8.cpp @@ -228,17 +228,7 @@ int CIN3D8::reset_status() { vector CIN3D8::record(const OutputType T) { vector data; - switch(T) { - case OutputType::E: - for(const auto& I : int_pt) data.emplace_back(I.c_material->get_trial_strain()); - break; - case OutputType::S: - for(const auto& I : int_pt) data.emplace_back(I.c_material->get_trial_stress()); - break; - default: - for(const auto& I : int_pt) for(const auto& J : I.c_material->record(T)) data.emplace_back(J); - break; - } + for(const auto& I : int_pt) for(const auto& J : I.c_material->record(T)) data.emplace_back(J); return data; } diff --git a/Element/Cube/DC3D8.cpp b/Element/Cube/DC3D8.cpp index a726a6f95..24df8d054 100644 --- a/Element/Cube/DC3D8.cpp +++ b/Element/Cube/DC3D8.cpp @@ -131,9 +131,7 @@ vector DC3D8::record(const OutputType T) { if(T == OutputType::DAMAGE) return {get_current_displacement()(d_dof)}; vector data; - for(const auto& I : int_pt) for(const auto& J : I.c_material->record(T)) data.emplace_back(J); - return data; } diff --git a/Element/Membrane/Axisymmetric/CAX8.cpp b/Element/Membrane/Axisymmetric/CAX8.cpp index b74e81303..885c7eaa6 100644 --- a/Element/Membrane/Axisymmetric/CAX8.cpp +++ b/Element/Membrane/Axisymmetric/CAX8.cpp @@ -138,9 +138,7 @@ int CAX8::reset_status() { vector CAX8::record(const OutputType T) { vector data; - for(const auto& I : int_pt) for(const auto& J : I.m_material->record(T)) data.emplace_back(J); - return data; } diff --git a/Element/Membrane/CSM/CSMQ.cpp b/Element/Membrane/CSM/CSMQ.cpp index ff491b75a..4c69d7e64 100644 --- a/Element/Membrane/CSM/CSMQ.cpp +++ b/Element/Membrane/CSM/CSMQ.cpp @@ -193,10 +193,7 @@ mat CSMQ::compute_shape_function(const mat& coordinate, const unsigned order) co vector CSMQ::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); - for(const auto& I : int_pt) for(const auto& J : I.m_material->record(P)) output.emplace_back(J); - return output; } diff --git a/Element/Membrane/CSM/CSMQ4.cpp b/Element/Membrane/CSM/CSMQ4.cpp index 43ff3573f..ee213e64a 100644 --- a/Element/Membrane/CSM/CSMQ4.cpp +++ b/Element/Membrane/CSM/CSMQ4.cpp @@ -185,7 +185,6 @@ mat CSMQ4::compute_shape_function(const mat& coordinate, const unsigned order) c vector CSMQ4::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); if(P == OutputType::NMISES) { mat A(int_pt.size(), 4); diff --git a/Element/Membrane/CSM/CSMQ8.cpp b/Element/Membrane/CSM/CSMQ8.cpp index 07e3f38c3..614da8d95 100644 --- a/Element/Membrane/CSM/CSMQ8.cpp +++ b/Element/Membrane/CSM/CSMQ8.cpp @@ -185,10 +185,7 @@ mat CSMQ8::compute_shape_function(const mat& coordinate, const unsigned order) c vector CSMQ8::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); - for(const auto& I : int_pt) for(const auto& J : I.m_material->record(P)) output.emplace_back(J); - return output; } diff --git a/Element/Membrane/Drilling/GQ12.cpp b/Element/Membrane/Drilling/GQ12.cpp index b6c199b3f..26debc57b 100644 --- a/Element/Membrane/Drilling/GQ12.cpp +++ b/Element/Membrane/Drilling/GQ12.cpp @@ -167,10 +167,7 @@ mat GQ12::compute_shape_function(const mat& coordinate, const unsigned order) co vector GQ12::record(const OutputType T) { vector data; - data.reserve(int_pt.size()); - for(const auto& I : int_pt) for(const auto& J : I.m_material->record(T)) data.emplace_back(J); - return data; } diff --git a/Element/Membrane/Infinite/CINP4.cpp b/Element/Membrane/Infinite/CINP4.cpp index d4d43429a..944095bd4 100644 --- a/Element/Membrane/Infinite/CINP4.cpp +++ b/Element/Membrane/Infinite/CINP4.cpp @@ -341,10 +341,7 @@ int CINP4::reset_status() { vector CINP4::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); - for(const auto& I : int_pt) for(const auto& J : I.m_material->record(P)) output.emplace_back(J); - return output; } diff --git a/Element/Membrane/Mixed/PS.cpp b/Element/Membrane/Mixed/PS.cpp index 49830baa3..00fc3d01d 100644 --- a/Element/Membrane/Mixed/PS.cpp +++ b/Element/Membrane/Mixed/PS.cpp @@ -158,10 +158,7 @@ mat PS::compute_shape_function(const mat& coordinate, const unsigned order) cons vector PS::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); - for(const auto& I : int_pt) for(const auto& J : I.m_material->record(P)) output.emplace_back(J); - return output; } diff --git a/Element/Membrane/Mixed/QE2.cpp b/Element/Membrane/Mixed/QE2.cpp index 7b75678b9..729c541cd 100644 --- a/Element/Membrane/Mixed/QE2.cpp +++ b/Element/Membrane/Mixed/QE2.cpp @@ -206,7 +206,6 @@ mat QE2::compute_shape_function(const mat& coordinate, const unsigned order) con vector QE2::record(const OutputType T) { vector data; - data.reserve(int_pt.size()); if(T == OutputType::E) for(const auto& I : int_pt) data.emplace_back(I.A * current_alpha); else if(T == OutputType::S) for(const auto& I : int_pt) data.emplace_back(I.P * current_beta); diff --git a/Element/Membrane/PFM/DCP4.cpp b/Element/Membrane/PFM/DCP4.cpp index 4499f1943..2c1ab700c 100644 --- a/Element/Membrane/PFM/DCP4.cpp +++ b/Element/Membrane/PFM/DCP4.cpp @@ -154,7 +154,6 @@ int DCP4::reset_status() { vector DCP4::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); if(P == OutputType::NMISES) { mat A(int_pt.size(), 4); diff --git a/Element/Membrane/Plane/CP4.cpp b/Element/Membrane/Plane/CP4.cpp index 0d567d3ae..9ad36b2f0 100644 --- a/Element/Membrane/Plane/CP4.cpp +++ b/Element/Membrane/Plane/CP4.cpp @@ -376,7 +376,6 @@ mat CP4::compute_shape_function(const mat& coordinate, const unsigned order) con vector CP4::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); if(P == OutputType::NMISES) { mat A(int_pt.size(), 4); diff --git a/Element/Membrane/Plane/CP4I.cpp b/Element/Membrane/Plane/CP4I.cpp index 259947f59..62e872bc1 100644 --- a/Element/Membrane/Plane/CP4I.cpp +++ b/Element/Membrane/Plane/CP4I.cpp @@ -347,10 +347,7 @@ mat CP4I::compute_shape_function(const mat& coordinate, const unsigned order) co vector CP4I::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); - for(const auto& I : int_pt) for(const auto& J : I.m_material->record(P)) output.emplace_back(J); - return output; } diff --git a/Element/Membrane/Plane/CP5.cpp b/Element/Membrane/Plane/CP5.cpp index 9ed46b19c..0565fad67 100644 --- a/Element/Membrane/Plane/CP5.cpp +++ b/Element/Membrane/Plane/CP5.cpp @@ -178,10 +178,7 @@ mat CP5::compute_shape_function(const mat& coordinate, const unsigned order) con vector CP5::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); - for(const auto& I : int_pt) for(const auto& J : I.m_material->record(P)) output.emplace_back(J); - return output; } diff --git a/Element/Membrane/Plane/CP7.cpp b/Element/Membrane/Plane/CP7.cpp index bc6cf69d9..24d0de549 100644 --- a/Element/Membrane/Plane/CP7.cpp +++ b/Element/Membrane/Plane/CP7.cpp @@ -178,10 +178,7 @@ mat CP7::compute_shape_function(const mat& coordinate, const unsigned order) con vector CP7::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); - for(const auto& I : int_pt) for(const auto& J : I.m_material->record(P)) output.emplace_back(J); - return output; } diff --git a/Element/Membrane/Plane/CP8.cpp b/Element/Membrane/Plane/CP8.cpp index a8f01c3a1..6a4ae67f8 100644 --- a/Element/Membrane/Plane/CP8.cpp +++ b/Element/Membrane/Plane/CP8.cpp @@ -179,10 +179,7 @@ mat CP8::compute_shape_function(const mat& coordinate, const unsigned order) con vector CP8::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); - for(const auto& I : int_pt) for(const auto& J : I.m_material->record(P)) output.emplace_back(J); - return output; } diff --git a/Element/Membrane/Porous/PCPE4DC.cpp b/Element/Membrane/Porous/PCPE4DC.cpp index aa7f405df..6c7662918 100644 --- a/Element/Membrane/Porous/PCPE4DC.cpp +++ b/Element/Membrane/Porous/PCPE4DC.cpp @@ -187,7 +187,6 @@ mat PCPE4DC::compute_shape_function(const mat& coordinate, const unsigned order) vector PCPE4DC::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); if(P == OutputType::NMISES) { mat A(int_pt.size(), 4); diff --git a/Element/Membrane/Porous/PCPE4UC.cpp b/Element/Membrane/Porous/PCPE4UC.cpp index 2b46ac52c..019c69bad 100644 --- a/Element/Membrane/Porous/PCPE4UC.cpp +++ b/Element/Membrane/Porous/PCPE4UC.cpp @@ -152,7 +152,6 @@ mat PCPE4UC::compute_shape_function(const mat& coordinate, const unsigned order) vector PCPE4UC::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); if(P == OutputType::NMISES) { mat A(int_pt.size(), 4); diff --git a/Element/Membrane/Porous/PCPE8DC.cpp b/Element/Membrane/Porous/PCPE8DC.cpp index 73958ec3d..f2bb93972 100644 --- a/Element/Membrane/Porous/PCPE8DC.cpp +++ b/Element/Membrane/Porous/PCPE8DC.cpp @@ -187,7 +187,6 @@ mat PCPE8DC::compute_shape_function(const mat& coordinate, const unsigned order) vector PCPE8DC::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); if(P == OutputType::PP) { const auto t_disp = get_current_displacement(); diff --git a/Element/Membrane/Porous/PCPE8UC.cpp b/Element/Membrane/Porous/PCPE8UC.cpp index ab8c8cb61..c8f9e9782 100644 --- a/Element/Membrane/Porous/PCPE8UC.cpp +++ b/Element/Membrane/Porous/PCPE8UC.cpp @@ -152,7 +152,6 @@ mat PCPE8UC::compute_shape_function(const mat& coordinate, const unsigned order) vector PCPE8UC::record(const OutputType P) { vector output; - output.reserve(int_pt.size()); if(P == OutputType::PP) { const auto t_disp = get_current_displacement(); diff --git a/Element/Special/Joint.cpp b/Element/Special/Joint.cpp index 38f4d69fe..dd392d5a6 100644 --- a/Element/Special/Joint.cpp +++ b/Element/Special/Joint.cpp @@ -72,9 +72,7 @@ int Joint::reset_status() { vector Joint::record(const OutputType P) { vector data; - for(const auto& I : j_material) for(auto& J : I->record(P)) data.emplace_back(J); - return data; } diff --git a/Element/Visualisation/vtkBase.h b/Element/Visualisation/vtkBase.h index 433590dd7..96c39a07f 100644 --- a/Element/Visualisation/vtkBase.h +++ b/Element/Visualisation/vtkBase.h @@ -43,6 +43,7 @@ using arma::mat; class vtkBase { #ifdef SUANPAN_VTK + protected: vtkSmartPointer vtk_cell; diff --git a/Enhancement/suanPan.iss b/Enhancement/suanPan.iss index 42ac283a2..75d6eaedc 100644 --- a/Enhancement/suanPan.iss +++ b/Enhancement/suanPan.iss @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "suanPan" -#define MyAppVersion "2.6.1" +#define MyAppVersion "2.7" #define MyAppPublisher "Theodore Chang" #define MyAppURL "https://github.com/TLCFEM/suanPan" #define MyAppExeName "suanPan.exe" @@ -32,7 +32,7 @@ InfoAfterFile=.\POST.txt PrivilegesRequiredOverridesAllowed=dialog OutputDir={#StoragePath}\installer OutputBaseFilename=suanPan-win-mkl-vtk -SetupIconFile=..\Resource\suanPan-Papirus.ico +SetupIconFile=..\Resource\suanPan-3.ico Compression=lzma SolidCompression=yes WizardStyle=modern @@ -58,7 +58,6 @@ Source: "{#StoragePath}tbbmalloc.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#StoragePath}tbbmalloc_proxy.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "{#StoragePath}updater.exe"; DestDir: "{app}"; Flags: ignoreversion; Tasks: updater Source: "{#StoragePath}msvcp140.dll"; DestDir: "{app}"; Flags: ignoreversion; Tasks: vcredist -Source: "{#StoragePath}msvcp140_atomic_wait.dll"; DestDir: "{app}"; Flags: ignoreversion; Tasks: vcredist Source: "{#StoragePath}vcruntime140.dll"; DestDir: "{app}"; Flags: ignoreversion; Tasks: vcredist Source: "{#StoragePath}vcruntime140_1.dll"; DestDir: "{app}"; Flags: ignoreversion; Tasks: vcredist Source: ".\AddAssociation.bat"; DestDir: "{app}"; Flags: ignoreversion diff --git a/Enhancement/suanPan.sublime-completions b/Enhancement/suanPan.sublime-completions index 01d01accf..6ac7c0348 100644 --- a/Enhancement/suanPan.sublime-completions +++ b/Enhancement/suanPan.sublime-completions @@ -244,6 +244,7 @@ "AbsDisp", "AbsError", "AbsIncreDisp", + "AbsIncreAcc", "AbsIncreEnergy", "AbsResidual", "ArcLength", @@ -296,6 +297,8 @@ "Decay", "Dhakal", "Dynamic", + "ImplicitDynamic", + "ExplicitDynamic", "EU2D", "EU3D", "Eigen", @@ -556,6 +559,7 @@ "RelDisp", "RelError", "RelIncreDisp", + "RelIncreAcc", "RelIncreEnergy", "RelResidual", "Rotation2D", @@ -1798,17 +1802,35 @@ "trigger":"import" }, { - "contents":"integrator BatheTwoStep ${1:(1)}\n# (1) int, unique integrator tag", + "contents":"integrator Tchamwa ${1:(1)} ${2:(2)}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", + "details":"", + "kind":"type", + "trigger":"Tchamwa" + }, + { + "contents":"integrator BatheTwoStep ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0\n# [3] double, sub-step size, default: 0.5", "details":"", "kind":"type", "trigger":"BatheTwoStep" }, { - "contents":"integrator GSSSSOptimal ${1:(1)} ${2:(2)}\n# (1) int, unique integrator tag\n# (2) double, spectral radius", + "contents":"integrator BatheExplicit ${1:(1)} ${2:(2)}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", + "details":"", + "kind":"type", + "trigger":"BatheExplicit" + }, + { + "contents":"integrator GSSSSOptimal ${1:(1)} ${2:[2]}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", "details":"Optimal scheme for GSSSS", "kind":"type", "trigger":"GSSSSOptimal" }, + { + "contents":"integrator OALTS ${1:(1)} ${2:[2]}\n# (1) int, unique integrator tag\n# [2] double, spectral radius, default: 0.5", + "details":"OALTS doi:10.1002/nme.6188", + "kind":"type", + "trigger":"OALTS" + }, { "contents":"integrator GSSSSU0 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)}\n# (1) int, unique integrator tag\n# (2-4) double, three spectral radii", "details":"U0 family scheme for GSSSS", @@ -1827,6 +1849,12 @@ "kind":"type", "trigger":"GeneralisedAlpha" }, + { + "contents":"integrator GeneralisedAlphaExplicit ${1:(1)} ${2:[2]}\n# (1) int, unique tag\n# [2] double, spectral radius at infinite frequency, default: 0.5", + "details":"", + "kind":"type", + "trigger":"GeneralisedAlphaExplicit" + }, { "contents":"integrator GeneralisedAlpha ${1:(1)} ${2:[2]}\n# (1) int, unique tag\n# [2] double, spectral radius at infinite frequency, default: 0.5\n\nintegrator GeneralisedAlpha ${1:(1)} ${2:(2)} ${3:(3)}\n# (1) int, unique tag\n# (2) double, \\alpha_f\n# (3) double, \\alpha_m", "details":"", @@ -1941,6 +1969,18 @@ "kind":"type", "trigger":"Elastic1D" }, + { + "contents":"material Sinh1D ${1:(1)} ${2:(2)} ${3:[3]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# [3] double, density, default: 0.0", + "details":"Uniaxial Nonlinear Elastic Material Using Sinh", + "kind":"type", + "trigger":"Sinh1D" + }, + { + "contents":"material Tanh1D ${1:(1)} ${2:(2)} ${3:[3]}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# [3] double, density, default: 0.0", + "details":"Uniaxial Nonlinear Elastic Material Using Tanh", + "kind":"type", + "trigger":"Tanh1D" + }, { "contents":"material Flag01 ${1:(1)} ${2:(2)} ${3:(3)} ${4:(4)} ${5:(5)}\n# (1) int, unique material tag\n# (2) double, elastic modulus\n# (3) double, yield stress, positive\n# (4) double, residual stress, can be either positive or negative\n# (5) double, hardening ratio", "details":"", diff --git a/Enhancement/suanPan.sublime-syntax b/Enhancement/suanPan.sublime-syntax index 08121e43c..07e16f8df 100644 --- a/Enhancement/suanPan.sublime-syntax +++ b/Enhancement/suanPan.sublime-syntax @@ -18,7 +18,7 @@ contexts: - match: '\b(?i)(Allman|B21|B21EL|B21EH|B21H|B31|NMB21(EL|EH)|NMB31|C3D20|C3D4|C3D8|C3D8I|C3D8R|CAX3|CAX4|CAX8|CIN3D8|CINP4|Contact2D|Contact3D|CP3|CSMT3|CSMT6|CSMQ[4-8]|CP4I|CP[4-8]|Damper0[1-4]|DC3D4|DC3D8|DCP3|DCP4|DKT3|DKT4|DKTS3|DKTS4|EB21|F21|F21H|F31|GCMQ|SGCMQ|GQ12|Joint|Mass(Point)([2-3]D)|Membrane|Mindlin|MVLEM|NodeLine|NodeFacet|PatchCube|PatchQuad|PCPE4DC|PCPE4DI|PCPE8DC|PCPE4UC|PCPE8UC|PS|QE2|S4|SGCMS|SingleSection2D|SingleSection3D|Spring01|Spring02|T[2|3]D2S?|R[2|3]D2|Tie|Embed[2|3]D|S?GCMQ(I|L|G)?|(T|B)[2|3]D(L|C)|Embedded[2|3]D|Sleeve[2|3]D)\b' scope: storage # material - - match: '\b(?i)(AFC0[1-3]|AFCN|ArmstrongFrederick(1D)?|Axisymmetric(Elastic)?|Bilinear([1-2]D|CC|DP|J2|OO|PO|Peric|Hoffman)|BilinearElastic1D|NLE1D01|BilinearMises1D|BlatzKo|BoucWen|BWBN|CDP(M2(NO|ISO|ANISO)?)?|Concrete2[1-2]|Concrete(CM|Tsai|Exp)|CoulombFriction|DafaliasManzari|Degradation|Elastic(1|2)D|Exp(CC|DP|Gurson|Gurson1D|Hoffman|J2|Mises1D)|Flag0(1|2)|Fluid|IsotropicDamage|Isotropic(Nonlinear)?Elastic3D|Kelvin|Laminated|LinearDamage|Maxwell|Metal|Mises1D|MooneyRivlin|MPF|Multilinear((Elastic)?1D|J2|OO|PO)|NLE3D01|OrthotropicElastic3D|ParabolicCC|Parallel|PlaneStrain|PlaneSymmetric(1|2)3|PlaneStress|PolyJ2|RambergOsgood|Rebar[2|3]D|Sequential|SimpleSand|SlipLock|Stacked|SteelBRB|TableCDP|Trivial|Uniaxial|VAFCRP(1D)?|Viscosity0(1|2)|Yeoh|Elastic3D|TrilinearDegradation|TableGurson|Substepping|PolyElastic1D|Rotation[2|3]D|MultilinearMises1D|Gap01|Dhakal|ConcreteTable|BilinearViscosity)\b' + - match: '\b(?i)(AFC0[1-3]|AFCN|ArmstrongFrederick(1D)?|Axisymmetric(Elastic)?|Bilinear([1-2]D|CC|DP|J2|OO|PO|Peric|Hoffman)|BilinearElastic1D|NLE1D01|BilinearMises1D|BlatzKo|BoucWen|BWBN|CDP(M2(NO|ISO|ANISO)?)?|Concrete2[1-2]|Concrete(CM|Tsai|Exp)|CoulombFriction|DafaliasManzari|Degradation|Elastic(1|2)D|Exp(CC|DP|Gurson|Gurson1D|Hoffman|J2|Mises1D)|Flag0(1|2)|Fluid|IsotropicDamage|Isotropic(Nonlinear)?Elastic3D|Kelvin|Laminated|LinearDamage|Maxwell|Metal|Mises1D|MooneyRivlin|MPF|Multilinear((Elastic)?1D|J2|OO|PO)|NLE3D01|OrthotropicElastic3D|ParabolicCC|Parallel|PlaneStrain|PlaneSymmetric(1|2)3|PlaneStress|PolyJ2|RambergOsgood|Rebar[2|3]D|Sequential|SimpleSand|SlipLock|Stacked|SteelBRB|TableCDP|Trivial|Uniaxial|VAFCRP(1D)?|Viscosity0(1|2)|Yeoh|Elastic3D|TrilinearDegradation|TableGurson|Substepping|PolyElastic1D|Rotation[2|3]D|MultilinearMises1D|Gap01|Dhakal|ConcreteTable|BilinearViscosity|Sinh1D|Tanh1D)\b' scope: storage # section - match: '\b(?i)(Bar[2|3]D|Box[2|3]D|Circle[1-3]D|CircularHollow[2|3]D|EU[2|3]D|Fibre[1-3]D|HSection2D|ISection[2|3]D|NM[2|3]D[1-3]|NM[2|3]D3K|NZ[2|3]D|Rectangle[1-3]D|TrussSection|TSection[2-3]D|US[2|3]D)\b' @@ -32,7 +32,7 @@ contexts: - match: '\b(?i)(Hann|Hamming|Blackman|BlackmanNuttall|BlackmanHarris|FlatTop)\b' scope: string # other - - match: '\b(?i)(Abs(Error|IncreEnergy|Residual)|ArcLength|Logic(AND|OR|XOR)|BatheTwoStep|BFGS|Buckle|Combine|Constant|Converger|Decay|Dynamic|FEAST|FixedNumber|FixedLength[2|3]D|Min(imum)?Gap[2|3]D|Max(imum)?Gap[2|3]D|Frequency|Generali(s|z)edAlpha|GSSSS(U|V)0|GSSSSOptimal|LeeNewmark(Full)?|Linear|(Max|Min)Displacement|MaxHistory|(Max|Min)Resistance|Modulated|MPC|MPDC|m?Newton|NZStrongMotion|Optimization|OutputType|ParticleCollision[2|3]D|LJPotential2D|Ramm|(Rayleigh)?Newmark|(Rel|Abs)(Incre)?Disp|Rel(Error|IncreEnergy|Residual)|(Finite)RigidWall(Penalty|Multiplier)|(Finite)RestitutionWall(Penalty)|Static|StrainEnergyEvolution|Tabular(Spline)|Sine|Cosine|WilsonPenzienNewmark|LeeElementalNewmark)\b' + - match: '\b(?i)((Abs|Rel)(Error|IncreEnergy|Residual)|ArcLength|Logic(AND|OR|XOR)|OALTS|Bathe(TwoStep|Explicit)|BFGS|Buckle|Combine|Constant|Converger|Decay|(Implicit|Explicit)Dynamic|FEAST|FixedNumber|FixedLength[2|3]D|Min(imum)?Gap[2|3]D|Max(imum)?Gap[2|3]D|Frequency|Generali(s|z)edAlpha(Explicit)|GSSSS(U|V)0|GSSSSOptimal|LeeNewmark(Full)?|Linear|(Max|Min)Displacement|MaxHistory|(Max|Min)Resistance|Modulated|MPC|MPDC|m?Newton|NZStrongMotion|Optimization|OutputType|ParticleCollision[2|3]D|LJPotential2D|Ramm|(Rayleigh)?Newmark|Tchamwa|(Rel|Abs)(Incre)?(Disp|Acc)|(Finite)RigidWall(Penalty|Multiplier)|(Finite)RestitutionWall(Penalty)|Static|StrainEnergyEvolution|Tabular(Spline)|Sine|Cosine|WilsonPenzienNewmark|LeeElementalNewmark)\b' scope: string # output type - match: '\b(?i)(A[1-6]?|AR[1-3]?|AT|AXIAL|CSE|DAMAGE|DC|DF[1-6]?|DM[1-3]?|DT|E|E11|E12|E13|E22|E23|E33|ED|EE|EE11|EE12|EE13|EE22|EE23|EE33|EEEQ|EEP|EEP1|EEP2|EEP3|EEQ|EINT|EP[1-3]?|ES|HIST|HYDRO|IF[1-6]?|IM[1-3]{1}|K|KAPPAC|KAPPAP|KAPPAT|KE|LITR|M|MISES|MOMENT|MOMENTUM((R?)[XYZ])?|NL|NMISES|PE|PE11|PE12|PE13|PE22|PE23|PE33|PEEQ|PEP[1-3]?|PP|REBARE|REBARS|RESULTANT|RF[1-6]?|RM[1-3]?|RT|S|S11|S12|S13|S22|S23|S33|SD|SE|SHEAR|SINT|SINV|SP[1-3]?|SS|TORSION|TRESC|TSE|U[1-6]?|UR[1-3]?|UT|V[1-6]?|VD|VF|VR[1-3]?|VS|VT|GDF|YF|VE|BEAM[SE])\b' diff --git a/Enhancement/suanpan.nuspec b/Enhancement/suanpan.nuspec index 03442a32c..82143bf3d 100644 --- a/Enhancement/suanpan.nuspec +++ b/Enhancement/suanpan.nuspec @@ -2,7 +2,7 @@ suanpan - 2.6.1 + 2.7 https://github.com/TLCFEM/suanPan Theodore Chang suanPan diff --git a/Example/Element/Allman.supan b/Example/Element/Allman.supan index 0c102fa95..416793921 100644 --- a/Example/Element/Allman.supan +++ b/Example/Element/Allman.supan @@ -23,18 +23,18 @@ step static 1 analyze # Node 2: -# 0.5000 0 +# 0.5000 0 # Displacement: -# 0.3256 0.9286 1.8109 +# 0.3256 0.9286 1.8109 # Resistance: -# 7.5862e-09 1.0000e+00 -1.0345e-09 +# 7.5862e-09 1.0000e+00 -1.0345e-09 # # Node 3: -# 0.5000 0.5000 +# 0.5000 0.5000 # Displacement: -# -0.4379 0.8795 1.3261 +# -0.4379 0.8795 1.3261 # Resistance: -# -6.2069e-09 1.0000e+00 -2.1839e-09 +# -6.2069e-09 1.0000e+00 -2.1839e-09 peek node 2 3 peek element 1 diff --git a/Example/Element/C3D20.supan b/Example/Element/C3D20.supan index 9626b7848..701dbe184 100644 --- a/Example/Element/C3D20.supan +++ b/Example/Element/C3D20.supan @@ -241,7 +241,7 @@ converger RelIncreDisp 1 1E-10 7 1 analyze -# -6.7782 7.3797 -0.1144 +# -6.7782 7.3797 -0.1144 peek node 12 peek element 1 diff --git a/Example/Element/C3D20NL.supan b/Example/Element/C3D20NL.supan index 0af327258..ed0380fea 100644 --- a/Example/Element/C3D20NL.supan +++ b/Example/Element/C3D20NL.supan @@ -45,11 +45,11 @@ converger RelIncreDisp 1 1E-12 50 1 analyze # Node 7: -# 2.0000 2.0000 2.0000 +# 2.0000 2.0000 2.0000 # Displacement: -# -0.2317 -0.2317 1.0000 +# -0.2317 -0.2317 1.0000 # Resistance: -# 9.4141e-15 5.1640e-15 -4.6875e+01 +# 9.4141e-15 5.1640e-15 -4.6875e+01 peek node 7 peek element 1 diff --git a/Example/Element/C3D4.supan b/Example/Element/C3D4.supan index c67f772c7..2974efac4 100644 --- a/Example/Element/C3D4.supan +++ b/Example/Element/C3D4.supan @@ -2198,8 +2198,8 @@ fix2 1 P 1 2 5 8 9 10 11 12 35 36 37 38 60 61 62 63 73 74 75 76 201 202 203 204 displacement 1 0 .5 1 3 4 6 7 22 23 24 25 48 49 50 51 52 53 54 55 56 57 58 59 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 step static 1 -set fixed_step_size 1 -set ini_step_size 1 +set fixed_step_size 0 +set ini_step_size 1E-1 set system_solver Spike converger RelIncreDisp 1 1E-8 4 1 @@ -2207,32 +2207,36 @@ converger RelIncreDisp 1 1E-8 4 1 analyze # Node 4: +# Coordinate: # 1.0000 1.0000 0 # Displacement: # 0.5000 0.0039 0.1690 # Resistance: -# 1.9400E-02 -1.1362E-15 -3.3307E-16 +# 1.9400e-02 2.5761e-16 -1.3852e-15 # # Node 7: +# Coordinate: # 0 1.0000 0 # Displacement: -# 5.0000E-01 3.0289E-05 -1.5806E-01 +# 5.0000e-01 3.0289e-05 -1.5806e-01 # Resistance: -# 1.3049E-01 2.7730E-15 -7.4246E-16 +# 1.3049e-01 1.7152e-16 5.1348e-16 # # Node 3: +# Coordinate: # 1.0000 0 0 # Displacement: -# 5.0000E-01 4.5624E-05 1.5947E-01 +# 5.0000e-01 4.5624e-05 1.5947e-01 # Resistance: -# 1.2906E-01 -2.0687E-15 1.3878E-15 +# 1.2906e-01 1.2782e-15 8.5348e-16 # # Node 6: +# Coordinate: # 0 0 0 # Displacement: # 0.5000 0.0037 -0.1672 # Resistance: -# 4.0423E-02 -2.0210E-16 -2.0001E-15 +# 4.0423e-02 5.0068e-16 -4.9613e-16 peek node 4 7 3 6 peek element 1 diff --git a/Example/Element/C3D4NL.supan b/Example/Element/C3D4NL.supan index 61996d6c4..9cd96de19 100644 --- a/Example/Element/C3D4NL.supan +++ b/Example/Element/C3D4NL.supan @@ -57,11 +57,11 @@ converger RelIncreDisp 1 1E-12 7 1 analyze # Node 14: -# 0.5000 0.5000 1.0000 +# 0.5000 0.5000 1.0000 # Displacement: -# -0.0225 0.0225 0.2000 +# -0.0225 0.0225 0.2000 # Resistance: -# 1.6725e-15 -7.0979e-16 8.8000e+01 +# 1.6725e-15 -7.0979e-16 8.8000e+01 peek node 14 reset diff --git a/Example/Element/C3D8R.supan b/Example/Element/C3D8R.supan index db7da4169..fa3205694 100644 --- a/Example/Element/C3D8R.supan +++ b/Example/Element/C3D8R.supan @@ -41,18 +41,18 @@ analyze peek element 1 # Node 13: -# 0.5000 -0.5000 2.5000 +# 0.5000 -0.5000 2.5000 # Displacement: -# -0.0068 0 0.1000 +# -0.0068 0 0.1000 # Resistance: -# -1.0270e-15 -8.0838e-16 8.7546e+00 +# -1.0270e-15 -8.0838e-16 8.7546e+00 # # Node 14: -# 0.5000 0.5000 2.5000 +# 0.5000 0.5000 2.5000 # Displacement: -# -0.0068 -0.0068 0.1000 +# -0.0068 -0.0068 0.1000 # Resistance: -# -1.0304e-15 -8.3961e-16 8.7546e+00 +# -1.0304e-15 -8.3961e-16 8.7546e+00 peek node 13 14 reset diff --git a/Example/Element/CAX3.supan b/Example/Element/CAX3.supan index d9d3e9097..e533416ca 100644 --- a/Example/Element/CAX3.supan +++ b/Example/Element/CAX3.supan @@ -20,18 +20,18 @@ step static 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 2.3873e-02 -1.3401e-18 +# 2.3873e-02 -1.3401e-18 # Resistance: -# 1.0000e+00 -2.9066e-17 +# 1.0000e+00 -2.9066e-17 # # Node 3: -# 1.0000 1.0000 +# 1.0000 1.0000 # Displacement: -# 0.0239 -0.0053 +# 0.0239 -0.0053 # Resistance: -# 1.0000e+00 2.4111e-17 +# 1.0000e+00 2.4111e-17 peek node 2 3 peek element 1 diff --git a/Example/Element/CAX4.supan b/Example/Element/CAX4.supan index 7886e73fb..60cd9221d 100644 --- a/Example/Element/CAX4.supan +++ b/Example/Element/CAX4.supan @@ -34,25 +34,25 @@ converger RelIncreDisp 1 1E-10 20 1 analyze # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# 0.0024 0 +# 0.0024 0 # Resistance: -# -6.0779e-08 4.5099e+00 +# -6.0779e-08 4.5099e+00 # # Node 6: -# 2.0000 1.0000 +# 2.0000 1.0000 # Displacement: -# 0.0024 -0.0025 +# 0.0024 -0.0025 # Resistance: -# -4.6574e-08 -6.0838e-08 +# -4.6574e-08 -6.0838e-08 # # Node 9: -# 2.0000 2.0000 +# 2.0000 2.0000 # Displacement: -# 0.0024 -0.0050 +# 0.0024 -0.0050 # Resistance: -# 1.7420e-15 -4.5099e+00 +# 1.7420e-15 -4.5099e+00 peek node 3 6 9 peek element 1 diff --git a/Example/Element/CAX8.supan b/Example/Element/CAX8.supan index b8419bff3..33a52e67a 100644 --- a/Example/Element/CAX8.supan +++ b/Example/Element/CAX8.supan @@ -29,25 +29,25 @@ analyze peek element 1 # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# 0.0200 0 +# 0.0200 0 # Resistance: -# -5.7953e-17 5.0265e+00 +# -5.7953e-17 5.0265e+00 # # Node 6: -# 2.0000 1.0000 +# 2.0000 1.0000 # Displacement: -# 0.0200 -0.1000 +# 0.0200 -0.1000 # Resistance: -# -5.7096e-18 -8.8818e-16 +# -5.7096e-18 -8.8818e-16 # # Node 9: -# 2.0000 2.0000 +# 2.0000 2.0000 # Displacement: -# 0.0200 -0.2000 +# 0.0200 -0.2000 # Resistance: -# -3.9183e-16 -5.0265e+00 +# -3.9183e-16 -5.0265e+00 peek node 3 6 9 reset diff --git a/Example/Element/CIN3D8.supan b/Example/Element/CIN3D8.supan index 4341fe4dd..79ba0214b 100644 --- a/Example/Element/CIN3D8.supan +++ b/Example/Element/CIN3D8.supan @@ -43,11 +43,11 @@ analyze peek element 3 # Node 1: -# 0.5000 -0.5000 -0.5000 +# 0.5000 -0.5000 -0.5000 # Displacement: -# 0.0188 -0.0188 0.5000 +# 0.0188 -0.0188 0.5000 # Resistance: -# 2.8950e-15 -1.9344e-15 4.7108e+01 +# 2.8950e-15 -1.9344e-15 4.7108e+01 peek node 1 reset diff --git a/Example/Element/CINP4.supan b/Example/Element/CINP4.supan index 600fa26c6..d2bb86924 100644 --- a/Example/Element/CINP4.supan +++ b/Example/Element/CINP4.supan @@ -33,18 +33,18 @@ analyze save recorder 1 2 # Node 1: -# 0 0 0 +# 0 0 0 # Displacement: -# 0.0071 0 +# 0.0071 0 # Resistance: -# 1.0000 0.2000 +# 1.0000 0.2000 # # Node 4: -# 0 1.0000 0 +# 0 1.0000 0 # Displacement: -# 0.0071 0 +# 0.0071 0 # Resistance: -# 1.0000 -0.2000 +# 1.0000 -0.2000 peek node 1 4 peek element 4 diff --git a/Example/Element/CP4NL.supan b/Example/Element/CP4NL.supan index 10a0c3cc3..1055e5872 100644 --- a/Example/Element/CP4NL.supan +++ b/Example/Element/CP4NL.supan @@ -169,11 +169,11 @@ converger RelIncreDisp 1 1E-12 10 1 analyze # Node 83: -# 4.0000 0.5000 +# 4.0000 0.5000 # Displacement: -# -0.1456 0.9790 +# -0.1456 0.9790 # Resistance: -# 1.6098e-14 1.0000e+00 +# 1.6098e-14 1.0000e+00 peek node 83 peek element 1 diff --git a/Example/Element/CP4R.supan b/Example/Element/CP4R.supan index 4136fff5c..38b976659 100644 --- a/Example/Element/CP4R.supan +++ b/Example/Element/CP4R.supan @@ -167,11 +167,11 @@ converger RelIncreDisp 1 1E-10 7 1 analyze # Node 83: -# 4.0000 0.5000 +# 4.0000 0.5000 # Displacement: -# -1.5148e-16 5.6591e+00 +# -1.5148e-16 5.6591e+00 # Resistance: -# 8.8818e-16 2.5000e-01 +# 8.8818e-16 2.5000e-01 peek node 83 exit \ No newline at end of file diff --git a/Example/Element/CP5.supan b/Example/Element/CP5.supan index b11bca687..3e8a77220 100644 --- a/Example/Element/CP5.supan +++ b/Example/Element/CP5.supan @@ -25,18 +25,18 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 3: -# 1.0000 1.0000 +# 1.0000 1.0000 # Displacement: -# -0.0002 0.0007 +# -0.0002 0.0007 # Resistance: -# 2.7602e-09 1.0000e+00 +# 2.7602e-09 1.0000e+00 # # Node 4: -# 0 1.0000 +# 0 1.0000 # Displacement: -# -3.8935e-13 6.6633e-04 +# -3.8935e-13 6.6633e-04 # Resistance: -# -2.7602e-09 1.0000e+00 +# -2.7602e-09 1.0000e+00 peek node 3 4 peek element 1 diff --git a/Example/Element/CP7.supan b/Example/Element/CP7.supan index 077f75714..9ebee930f 100644 --- a/Example/Element/CP7.supan +++ b/Example/Element/CP7.supan @@ -27,18 +27,18 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 1: -# 0 0 +# 0 0 # Displacement: -# 6.6700e-04 5.5689e-13 +# 6.6700e-04 5.5689e-13 # Resistance: -# 1.0000e+00 1.2778e-09 +# 1.0000e+00 1.2778e-09 # # Node 4: -# 0 1.0000 +# 0 1.0000 # Displacement: -# 0.0007 0.0002 +# 0.0007 0.0002 # Resistance: -# 1.0000e+00 -1.2778e-09 +# 1.0000e+00 -1.2778e-09 peek node 1 4 peek element 1 diff --git a/Example/Element/CSMQ4.supan b/Example/Element/CSMQ4.supan index 4e13f6e14..2cfe8c5ae 100644 --- a/Example/Element/CSMQ4.supan +++ b/Example/Element/CSMQ4.supan @@ -36,18 +36,18 @@ step static 1 analyze # Node 6: -# 10.0000 0 +# 10.0000 0 # Displacement: -# 9.8675 67.7433 9.9382 +# 9.8675 67.7433 9.9382 # Resistance: -# 2.0535e-12 1.5000e+02 -1.4866e-13 +# 2.0535e-12 1.5000e+02 -1.4866e-13 # # Node 12: -# 10.0000 2.0000 +# 10.0000 2.0000 # Displacement: -# -9.8675 67.7433 9.9382 +# -9.8675 67.7433 9.9382 # Resistance: -# -6.3949e-13 1.5000e+02 3.2729e-13 +# -6.3949e-13 1.5000e+02 3.2729e-13 peek node 6 12 peek element 1 diff --git a/Example/Element/CSMQ7.supan b/Example/Element/CSMQ7.supan index eb335f8bf..105329196 100644 --- a/Example/Element/CSMQ7.supan +++ b/Example/Element/CSMQ7.supan @@ -27,18 +27,18 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 1: -# 0 0 +# 0 0 # Displacement: -# 6.6667e-04 9.2946e-19 9.7766e-20 +# 6.6667e-04 9.2946e-19 9.7766e-20 # Resistance: -# 1.0000e+00 -4.5103e-17 -1.4831e-16 +# 1.0000e+00 -4.5103e-17 -1.4831e-16 # # Node 4: -# 0 1.0000 +# 0 1.0000 # Displacement: -# 6.6667e-04 1.6667e-04 -2.0224e-18 +# 6.6667e-04 1.6667e-04 -2.0224e-18 # Resistance: -# 1.0000e+00 1.3878e-17 -1.3896e-16 +# 1.0000e+00 1.3878e-17 -1.3896e-16 peek node 1 4 peek element 1 diff --git a/Example/Element/CSMQ8.supan b/Example/Element/CSMQ8.supan index ba98653d5..5eafd8339 100644 --- a/Example/Element/CSMQ8.supan +++ b/Example/Element/CSMQ8.supan @@ -168,11 +168,11 @@ step static 1 analyze # Node 117: -# 20.0000 5.0000 +# 20.0000 5.0000 # Displacement: -# -1.0030e-12 3.7835e+00 3.0374e-01 +# -1.0030e-12 3.7835e+00 3.0374e-01 # Resistance: -# -1.8957e-14 2.0000e+00 4.3889e-15 +# -1.8957e-14 2.0000e+00 4.3889e-15 peek node 117 peek element 1 diff --git a/Example/Element/CSMT3.supan b/Example/Element/CSMT3.supan index 01b8a0c27..340c17c64 100644 --- a/Example/Element/CSMT3.supan +++ b/Example/Element/CSMT3.supan @@ -21,18 +21,18 @@ step static 1 analyze # Node 2: -# 0.5000 0 +# 0.5000 0 # Displacement: -# 0.0828 0.4881 0.9366 +# 0.0828 0.4881 0.9366 # Resistance: -# 1.0784e-08 1.0000e+00 -2.5547e-09 +# 1.0784e-08 1.0000e+00 -2.5547e-09 # # Node 3: -# 0.5000 0.5000 +# 0.5000 0.5000 # Displacement: -# -0.0995 0.5055 0.8907 +# -0.0995 0.5055 0.8907 # Resistance: -# -9.9193e-09 1.0000e+00 1.3605e-09 +# -9.9193e-09 1.0000e+00 1.3605e-09 peek node 2 3 peek element 1 diff --git a/Example/Element/CSMT6.supan b/Example/Element/CSMT6.supan index 43ad1c417..2b791ad96 100644 --- a/Example/Element/CSMT6.supan +++ b/Example/Element/CSMT6.supan @@ -24,18 +24,18 @@ step static 1 analyze # Node 2: -# 0.5000 0 +# 0.5000 0 # Displacement: -# 0 0 0 +# 0 0 0 # Resistance: -# -0.3687 0.8794 0.1169 +# -0.3687 0.8794 0.1169 # # Node 3: -# 0.5000 0.5000 +# 0.5000 0.5000 # Displacement: -# 0.7454 -0.2755 -1.4696 +# 0.7454 -0.2755 -1.4696 # Resistance: -# 2.0000e+00 5.4801e-13 -1.9798e-10 +# 2.0000e+00 5.4801e-13 -1.9798e-10 peek node 2 3 peek element 1 diff --git a/Example/Element/Contact2D.supan b/Example/Element/Contact2D.supan index cd8bddad1..da513b2e2 100644 --- a/Example/Element/Contact2D.supan +++ b/Example/Element/Contact2D.supan @@ -32,11 +32,11 @@ converger RelIncreDisp 2 1E-11 20 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 5.6389e-19 -2.0000e-01 -3.0000e-01 +# 5.6389e-19 -2.0000e-01 -3.0000e-01 # Resistance: -# 6.7667e-17 -8.0000e+00 6.0000e-08 +# 6.7667e-17 -8.0000e+00 6.0000e-08 peek node 2 5 6 peek group 1 2 diff --git a/Example/Element/DC3D4.supan b/Example/Element/DC3D4.supan index 6e9f79fda..2c2167d1e 100644 --- a/Example/Element/DC3D4.supan +++ b/Example/Element/DC3D4.supan @@ -2200,7 +2200,7 @@ displacement 1 0 .5 1 3 4 6 7 22 23 24 25 48 49 50 51 52 53 54 55 56 57 58 59 14 step static 1 set fixed_step_size 1 -set ini_step_size 1E-2 +set ini_step_size 1E-1 set sparse_mat 0 converger RelIncreDisp 1 1E-8 4 1 diff --git a/Example/Element/DCP4.supan b/Example/Element/DCP4.supan index 066ac1421..4b0c838d2 100644 --- a/Example/Element/DCP4.supan +++ b/Example/Element/DCP4.supan @@ -2150,7 +2150,7 @@ groupdisplacement 2 0 1 2 3 step static 1 1 set fixed_step_size 1 -set ini_step_size 1E-2 +set ini_step_size 1E-1 converger RelIncreDisp 1 1E-10 20 1 diff --git a/Example/Element/DKT3.supan b/Example/Element/DKT3.supan index 353b14f27..669390c09 100644 --- a/Example/Element/DKT3.supan +++ b/Example/Element/DKT3.supan @@ -334,11 +334,11 @@ step static 1 analyze # Node 2: -# 0.5000 0.5000 0 +# 0.5000 0.5000 0 # Displacement: -# 5.7269e-03 -4.6327e-17 -1.1161e-17 +# 5.7269e-03 -4.6327e-17 -1.1161e-17 # Resistance: -# 1.0000e+00 2.2547e-15 3.5388e-16 +# 1.0000e+00 2.2547e-15 3.5388e-16 peek node 2 peek element 1 diff --git a/Example/Element/DKT4.supan b/Example/Element/DKT4.supan index aaf6f7e3e..02ff1ca94 100644 --- a/Example/Element/DKT4.supan +++ b/Example/Element/DKT4.supan @@ -63,11 +63,11 @@ converger RelIncreDisp 1 1E-8 2 1 analyze # Node 21: -# 0.5000 0.5000 +# 0.5000 0.5000 # Displacement: -# -6.3745e-03 1.1526e-17 -9.7535e-18 +# -6.3745e-03 1.1526e-17 -9.7535e-18 # Resistance: -# -1.0000e+00 6.9389e-17 -6.9389e-18 +# -1.0000e+00 6.9389e-17 -6.9389e-18 peek node 21 peek element 1 diff --git a/Example/Element/DKT48.supan b/Example/Element/DKT48.supan index 95a106b07..8c887f635 100644 --- a/Example/Element/DKT48.supan +++ b/Example/Element/DKT48.supan @@ -164,11 +164,11 @@ converger RelIncreDisp 1 1E-8 2 1 analyze # Node 57: -# 0.5000 0.5000 +# 0.5000 0.5000 # Displacement: -# -5.8829e-03 1.0960e-17 -5.6851e-18 +# -5.8829e-03 1.0960e-17 -5.6851e-18 # Resistance: -# -1.0000e+00 -2.7756e-17 3.3480e-16 +# -1.0000e+00 -2.7756e-17 3.3480e-16 peek node 57 exit \ No newline at end of file diff --git a/Example/Element/DKTS3.supan b/Example/Element/DKTS3.supan index 5fadada17..243310b37 100644 --- a/Example/Element/DKTS3.supan +++ b/Example/Element/DKTS3.supan @@ -334,11 +334,11 @@ step static 1 analyze # Node 2: -# 0.5000 0.5000 0 +# 0.5000 0.5000 0 # Displacement: -# 5.7269e-03 -4.6327e-17 -1.1161e-17 +# 5.7269e-03 -4.6327e-17 -1.1161e-17 # Resistance: -# 1.0000e+00 2.2547e-15 3.5388e-16 +# 1.0000e+00 2.2547e-15 3.5388e-16 peek node 2 peek element 1 diff --git a/Example/Element/Damper01.supan b/Example/Element/Damper01.supan index 5825dacfc..ece405164 100644 --- a/Example/Element/Damper01.supan +++ b/Example/Element/Damper01.supan @@ -26,7 +26,7 @@ plainrecorder 1 Element S 2 plainrecorder 2 Element E 2 plainrecorder 3 Element V 2 -step dynamic 1 20 +step dynamic 1 2 set ini_step_size .01 set fixed_step_size 1 @@ -38,6 +38,19 @@ analyze peek element 2 3 +# Node 2: +# Coordinate: +# 1.0000 0 +# Displacement: +# -0.1894 0 +# Resistance: +# -6.9652 0 +# Velocity: +# -0.4712 0 +# Acceleration: +# 6.9652 0 +peek node 2 + reset clear exit \ No newline at end of file diff --git a/Example/Element/Damper02.supan b/Example/Element/Damper02.supan index 404ad9d2d..ce9a6ef5c 100644 --- a/Example/Element/Damper02.supan +++ b/Example/Element/Damper02.supan @@ -22,7 +22,7 @@ amplitude Combine 1 2 3 # acceleration 2 1 1 1 2 displacement 2 1 1 1 2 -step dynamic 1 20 +step dynamic 1 2 set ini_step_size .01 set fixed_step_size 1 @@ -34,6 +34,19 @@ analyze peek element 2 3 +# Node 2: +# Coordinate: +# 1.0000 0 +# Displacement: +# -9.7700e-15 0 +# Resistance: +# 86.7135 0 +# Velocity: +# 1.2571e+02 0 +# Acceleration: +# -1.6882e-07 0 +peek node 2 + reset clear exit \ No newline at end of file diff --git a/Example/Element/Damper03.supan b/Example/Element/Damper03.supan index 9e30fd0c4..2e30b7c44 100644 --- a/Example/Element/Damper03.supan +++ b/Example/Element/Damper03.supan @@ -27,7 +27,7 @@ plainrecorder 1 Element S 2 plainrecorder 2 Element E 2 plainrecorder 3 Element V 2 -step dynamic 1 20 +step dynamic 1 2 set ini_step_size .01 set fixed_step_size 1 @@ -39,6 +39,19 @@ analyze peek element 2 3 +# Node 2: +# Coordinate: +# 1.0000 0 0 +# Displacement: +# -0.1894 0 0 +# Resistance: +# -6.9652 0 0 +# Velocity: +# -0.4712 0 0 +# Acceleration: +# 6.9652 0 0 +peek node 2 + reset clear exit \ No newline at end of file diff --git a/Example/Element/Damper04.supan b/Example/Element/Damper04.supan index 47c1f37f9..4d207776c 100644 --- a/Example/Element/Damper04.supan +++ b/Example/Element/Damper04.supan @@ -22,7 +22,7 @@ amplitude Combine 1 2 3 # acceleration 2 1 1 1 2 displacement 2 1 1 1 2 -step dynamic 1 20 +step dynamic 1 2 set ini_step_size .01 set fixed_step_size 1 @@ -34,6 +34,19 @@ analyze peek element 2 3 +# Node 2: +# Coordinate: +# 1.0000 0 0 +# Displacement: +# -9.7700e-15 0 0 +# Resistance: +# 86.7135 0 0 +# Velocity: +# 1.2571e+02 0 0 +# Acceleration: +# -1.6882e-07 0 0 +peek node 2 + reset clear exit \ No newline at end of file diff --git a/Example/Element/EB21.supan b/Example/Element/EB21.supan index dd15c3c7d..4a4f4b52c 100644 --- a/Example/Element/EB21.supan +++ b/Example/Element/EB21.supan @@ -29,18 +29,18 @@ converger RelIncreDisp 1 1E-10 5 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 0 0.2167 0.3250 +# 0 0.2167 0.3250 # Resistance: -# 0 1.0000e+01 -6.5001e-08 +# 0 1.0000e+01 -6.5001e-08 # # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# 0 0.1167 -0.1750 +# 0 0.1167 -0.1750 # Resistance: -# 0 8.7490e-08 3.4999e-08 +# 0 8.7490e-08 3.4999e-08 peek node 2 3 peek element 1 diff --git a/Example/Element/GCMQ.supan b/Example/Element/GCMQ.supan index 0830daff2..cc3860a22 100644 --- a/Example/Element/GCMQ.supan +++ b/Example/Element/GCMQ.supan @@ -70,7 +70,7 @@ step static 1 analyze -# 20.0424 99.2251 18.1661 +# 20.0424 99.2251 18.1661 peek node 6 peek element 1 diff --git a/Example/Element/IP.supan b/Example/Element/IP.supan index 316992b8b..f5b346625 100644 --- a/Example/Element/IP.supan +++ b/Example/Element/IP.supan @@ -58,7 +58,7 @@ converger RelIncreDisp 1 1E-8 5 1 analyze -# -0.0095 0.1948 0.2913 +# -0.0095 0.1948 0.2913 peek node 2 peek element 1 diff --git a/Example/Element/Joint.supan b/Example/Element/Joint.supan index e2aefb9bc..038d17680 100644 --- a/Example/Element/Joint.supan +++ b/Example/Element/Joint.supan @@ -25,18 +25,18 @@ converger AbsIncreDisp 1 1E-8 3 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 0 0.2667 0.4000 +# 0 0.2667 0.4000 # Resistance: -# 0 1.0000e+01 8.8818e-16 +# 0 1.0000e+01 8.8818e-16 # # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# 0 0.0667 -0.1000 +# 0 0.0667 -0.1000 # Resistance: -# 0 -4.4409e-16 -2.2204e-16 +# 0 -4.4409e-16 -2.2204e-16 peek node 2 3 peek element 1 diff --git a/Example/Element/MassPoint.supan b/Example/Element/MassPoint.supan index b939e8f8d..a6cde3ab1 100644 --- a/Example/Element/MassPoint.supan +++ b/Example/Element/MassPoint.supan @@ -26,7 +26,7 @@ plainrecorder 1 Element S 2 plainrecorder 2 Element E 2 plainrecorder 3 Element V 2 -step dynamic 1 20 +step dynamic 1 2 set ini_step_size .01 set fixed_step_size 1 @@ -38,6 +38,19 @@ analyze peek element 2 3 +# Node 2: +# Coordinate: +# 1.0000 0 +# Displacement: +# -0.1894 0 +# Resistance: +# -6.9652 0 +# Velocity: +# -0.4712 0 +# Acceleration: +# 6.9652 0 +peek node 2 + reset clear exit \ No newline at end of file diff --git a/Example/Element/PCPE4DC.supan b/Example/Element/PCPE4DC.supan index 6c20e4511..a08731b4a 100644 --- a/Example/Element/PCPE4DC.supan +++ b/Example/Element/PCPE4DC.supan @@ -30,18 +30,18 @@ set fixed_step_size true analyze # Node 3: -# 2.0000 2.0000 +# 2.0000 2.0000 # Displacement: -# 0 -0.2000 0 -0.2000 +# 0 -0.2000 0 -0.2000 # Resistance: -# -8.0000e+01 -2.0000e+02 -8.0000e+01 -8.0000e+01 +# -8.0000e+01 -2.0000e+02 -8.0000e+01 -8.0000e+01 # # Node 4: -# 0 2.0000 +# 0 2.0000 # Displacement: -# 0 -0.2000 0 -0.2000 +# 0 -0.2000 0 -0.2000 # Resistance: -# 8.0000e+01 -2.0000e+02 8.0000e+01 -8.0000e+01 +# 8.0000e+01 -2.0000e+02 8.0000e+01 -8.0000e+01 peek node 3 4 peek element 1 diff --git a/Example/Element/PCPE4UC.supan b/Example/Element/PCPE4UC.supan index 43bede0d2..58644adcb 100644 --- a/Example/Element/PCPE4UC.supan +++ b/Example/Element/PCPE4UC.supan @@ -26,18 +26,18 @@ set fixed_step_size true analyze # Node 3: -# 2.0000 2.0000 +# 2.0000 2.0000 # Displacement: -# 0 -0.2000 +# 0 -0.2000 # Resistance: -# -1.6000e+02 -2.8000e+02 +# -1.6000e+02 -2.8000e+02 # # Node 4: -# 0 2.0000 +# 0 2.0000 # Displacement: -# 0 -0.2000 +# 0 -0.2000 # Resistance: -# 1.6000e+02 -2.8000e+02 +# 1.6000e+02 -2.8000e+02 peek node 3 4 peek element 1 diff --git a/Example/Element/PCPE8DC.supan b/Example/Element/PCPE8DC.supan index 7a094334b..80e9c249b 100644 --- a/Example/Element/PCPE8DC.supan +++ b/Example/Element/PCPE8DC.supan @@ -31,25 +31,25 @@ set fixed_step_size true analyze # Node 3: -# 2.0000 2.0000 +# 2.0000 2.0000 # Displacement: -# 0 -0.2000 0 0 +# 0 -0.2000 0 0 # Resistance: -# -21.3333 -61.3333 -5.3333 -5.3333 +# -21.3333 -61.3333 -5.3333 -5.3333 # # Node 7: -# 1.0000 2.0000 +# 1.0000 2.0000 # Displacement: -# 9.7653e-19 -2.0000e-01 0 0 +# 9.7653e-19 -2.0000e-01 0 0 # Resistance: -# -1.4211e-14 -2.4533e+02 2.5264e-15 -2.1333e+01 +# -1.4211e-14 -2.4533e+02 2.5264e-15 -2.1333e+01 # # Node 4: -# 0 2.0000 +# 0 2.0000 # Displacement: -# 0 -0.2000 0 0 +# 0 -0.2000 0 0 # Resistance: -# 21.3333 -61.3333 5.3333 -5.3333 +# 21.3333 -61.3333 5.3333 -5.3333 peek node 3 7 4 peek element 1 diff --git a/Example/Element/PCPE8UC.supan b/Example/Element/PCPE8UC.supan index 3a2bf8c7a..bcbacdc1c 100644 --- a/Example/Element/PCPE8UC.supan +++ b/Example/Element/PCPE8UC.supan @@ -29,25 +29,25 @@ set fixed_step_size true analyze # Node 3: -# 2.0000 2.0000 +# 2.0000 2.0000 # Displacement: -# 0 -0.2000 +# 0 -0.2000 # Resistance: -# -53.3333 -93.3333 +# -53.3333 -93.3333 # # Node 7: -# 1.0000 2.0000 +# 1.0000 2.0000 # Displacement: -# 4.0135e-18 -2.0000e-01 +# 4.0135e-18 -2.0000e-01 # Resistance: -# 2.9729e-14 -3.7333e+02 +# 2.9729e-14 -3.7333e+02 # # Node 4: -# 0 2.0000 +# 0 2.0000 # Displacement: -# 0 -0.2000 +# 0 -0.2000 # Resistance: -# 53.3333 -93.3333 +# 53.3333 -93.3333 peek node 3 7 4 peek element 1 diff --git a/Example/Element/PatchCube.supan b/Example/Element/PatchCube.supan index 2dc3b1d7a..893b3ab81 100644 --- a/Example/Element/PatchCube.supan +++ b/Example/Element/PatchCube.supan @@ -29,32 +29,32 @@ analyze peek element 1 # Node 5: -# 0.5000 -0.5000 0.5000 1.0000 +# 0.5000 -0.5000 0.5000 1.0000 # Displacement: -# -0.0231 -0.0260 -0.0167 +# -0.0231 -0.0260 -0.0167 # Resistance: -# 8.6222e-10 -4.4714e-08 4.3957e-08 +# 8.6222e-10 -4.4714e-08 4.3957e-08 # # Node 6: -# 0.5000 0.5000 0.5000 1.0000 +# 0.5000 0.5000 0.5000 1.0000 # Displacement: -# -0.0370 -0.0370 0.1000 +# -0.0370 -0.0370 0.1000 # Resistance: -# -1.7522e-09 -1.7522e-09 1.3990e+01 +# -1.7522e-09 -1.7522e-09 1.3990e+01 # # Node 7: -# -0.5000 0.5000 0.5000 1.0000 +# -0.5000 0.5000 0.5000 1.0000 # Displacement: -# -0.0260 -0.0231 -0.0167 +# -0.0260 -0.0231 -0.0167 # Resistance: -# -4.4714e-08 8.6222e-10 4.3957e-08 +# -4.4714e-08 8.6222e-10 4.3957e-08 # # Node 8: -# -0.5000 -0.5000 0.5000 1.0000 +# -0.5000 -0.5000 0.5000 1.0000 # Displacement: -# -0.0265 -0.0265 -0.0125 +# -0.0265 -0.0265 -0.0125 # Resistance: -# -2.1847e-08 -2.1847e-08 4.4958e-08 +# -2.1847e-08 -2.1847e-08 4.4958e-08 peek node 5 6 7 8 reset diff --git a/Example/Element/PatchQuad.supan b/Example/Element/PatchQuad.supan index 95326ed40..078353ced 100644 --- a/Example/Element/PatchQuad.supan +++ b/Example/Element/PatchQuad.supan @@ -21,18 +21,18 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 3: -# 0.7500 1.0000 1.0000 +# 0.7500 1.0000 1.0000 # Displacement: -# -0.0019 0.0033 +# -0.0019 0.0033 # Resistance: -# 1.3922e-09 1.0000e+00 +# 1.3922e-09 1.0000e+00 # # Node 4: -# 0 1.0000 1.0000 +# 0 1.0000 1.0000 # Displacement: -# -0.0015 0.0014 +# -0.0015 0.0014 # Resistance: -# -4.3968e-09 1.0000e+00 +# -4.3968e-09 1.0000e+00 peek node 3 4 peek element 1 diff --git a/Example/Element/SingleSection.supan b/Example/Element/SingleSection.supan index f3e939c8c..a493722d1 100644 --- a/Example/Element/SingleSection.supan +++ b/Example/Element/SingleSection.supan @@ -23,11 +23,11 @@ analyze peek element 1 # Node 1: -# 0 0 +# 0 0 # Displacement: -# 4.9538e-16 3.0060e+00 +# 4.9538e-16 3.0060e+00 # Resistance: -# 4.4409e-16 3.0000e+00 +# 4.4409e-16 3.0000e+00 peek node 1 reset diff --git a/Example/Element/Spring01.supan b/Example/Element/Spring01.supan index da843e328..1f56c1e0b 100644 --- a/Example/Element/Spring01.supan +++ b/Example/Element/Spring01.supan @@ -24,11 +24,11 @@ converger RelIncreDisp 1 1E-8 10 1 analyze # Node 3: -# 6.0000 0 +# 6.0000 0 # Displacement: -# 2.0000 0 +# 2.0000 0 # Resistance: -# 1.0000e+02 0 +# 1.0000e+02 0 peek node 3 peek element 1 diff --git a/Example/Element/Spring02.supan b/Example/Element/Spring02.supan index 9d1ac93ad..b2fa870f3 100644 --- a/Example/Element/Spring02.supan +++ b/Example/Element/Spring02.supan @@ -25,11 +25,11 @@ converger RelIncreDisp 1 1E-8 10 1 analyze # Node 3: -# 3.0000 0 +# 3.0000 0 # Displacement: -# 0.5000 0 +# 0.5000 0 # Resistance: -# 10.0000 0 +# 10.0000 0 peek node 3 peek element 1 diff --git a/Example/Element/T3D2S.supan b/Example/Element/T3D2S.supan index 3ec7724d4..e1630549e 100644 --- a/Example/Element/T3D2S.supan +++ b/Example/Element/T3D2S.supan @@ -32,7 +32,7 @@ converger RelIncreDisp 1 1E-10 10 1 analyze -# 0.0020 0.0075 0.0020 +# 0.0020 0.0075 0.0020 peek node 4 peek element 1 diff --git a/Example/Material/ArmstrongFrederick.supan b/Example/Material/ArmstrongFrederick.supan index d61a65665..b1b4c10b7 100644 --- a/Example/Material/ArmstrongFrederick.supan +++ b/Example/Material/ArmstrongFrederick.supan @@ -37,32 +37,32 @@ converger RelIncreDisp 1 1E-12 10 1 analyze # Node 9: -# 5.0000 -5.0000 20.0000 +# 5.0000 -5.0000 20.0000 # Displacement: -# 0 0 0.5000 +# 0 0 0.5000 # Resistance: -# -3.6819e-13 4.4548e-12 1.2885e+04 +# -3.6819e-13 4.4548e-12 1.2885e+04 # # Node 10: -# 5.0000 5.0000 20.0000 +# 5.0000 5.0000 20.0000 # Displacement: -# 0 -0.1173 0.5000 +# 0 -0.1173 0.5000 # Resistance: -# 1.4952e-12 5.6687e-13 1.2885e+04 +# 1.4952e-12 5.6687e-13 1.2885e+04 # # Node 11: -# -5.0000 5.0000 20.0000 +# -5.0000 5.0000 20.0000 # Displacement: -# 0.1173 -0.1173 0.5000 +# 0.1173 -0.1173 0.5000 # Resistance: -# 7.3579e-13 1.9320e-12 1.2885e+04 +# 7.3579e-13 1.9320e-12 1.2885e+04 # # Node 12: -# -5.0000 -5.0000 20.0000 +# -5.0000 -5.0000 20.0000 # Displacement: -# 0.1173 0 0.5000 +# 0.1173 0 0.5000 # Resistance: -# -1.4472e-12 -2.8195e-13 1.2885e+04 +# -1.4472e-12 -2.8195e-13 1.2885e+04 peek node 9 10 11 12 reset diff --git a/Example/Material/ArmstrongFrederick1D.supan b/Example/Material/ArmstrongFrederick1D.supan index b80676eb5..cb1472d07 100644 --- a/Example/Material/ArmstrongFrederick1D.supan +++ b/Example/Material/ArmstrongFrederick1D.supan @@ -26,11 +26,11 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 4.0000 0 +# 4.0000 0 # Displacement: -# -0.0109 1.0000 +# -0.0109 1.0000 # Resistance: -# 4.2649e-05 3.1987e+03 +# 4.2649e-05 3.1987e+03 peek node 2 reset diff --git a/Example/Material/Bilinear1D.supan b/Example/Material/Bilinear1D.supan index b0c8956f2..79f3a2fb4 100644 --- a/Example/Material/Bilinear1D.supan +++ b/Example/Material/Bilinear1D.supan @@ -21,11 +21,11 @@ converger RelIncreDisp 1 1E-4 10 1 analyze # Node 2: -# 4.0000 0 +# 4.0000 0 # Displacement: -# -1.8667 7.7667 +# -1.8667 7.7667 # Resistance: -# 1.3333e-06 1.0000e+02 +# 1.3333e-06 1.0000e+02 peek node 2 peek element 1 diff --git a/Example/Material/Bilinear2D.supan b/Example/Material/Bilinear2D.supan index ce1f83ba0..cddb61062 100644 --- a/Example/Material/Bilinear2D.supan +++ b/Example/Material/Bilinear2D.supan @@ -175,11 +175,11 @@ converger RelIncreDisp 1 1E-10 50 1 analyze # Node 83: -# 4.0000 0.5000 +# 4.0000 0.5000 # Displacement: -# 4.4542e-19 2.0000e-02 1.0484e-02 +# 4.4542e-19 2.0000e-02 1.0484e-02 # Resistance: -# -3.8858e-16 1.0780e-01 2.8459e-17 +# -3.8858e-16 1.0780e-01 2.8459e-17 peek node 83 peek element 1 diff --git a/Example/Material/BilinearCC.supan b/Example/Material/BilinearCC.supan index 29ec96bc5..42ce6df79 100644 --- a/Example/Material/BilinearCC.supan +++ b/Example/Material/BilinearCC.supan @@ -31,11 +31,11 @@ converger RelIncreDisp 1 1E-13 50 1 analyze # Node 6: -# 5.0000 5.0000 5.0000 +# 5.0000 5.0000 5.0000 # Displacement: -# 0 0.0014 -0.0020 +# 0 0.0014 -0.0020 # Resistance: -# 1.6604e-13 2.0946e-13 -1.8623e+03 +# 1.6604e-13 2.0946e-13 -1.8623e+03 peek node 6 peek element 1 diff --git a/Example/Material/BilinearElastic1D.supan b/Example/Material/BilinearElastic1D.supan index 6c3c1806b..585647524 100644 --- a/Example/Material/BilinearElastic1D.supan +++ b/Example/Material/BilinearElastic1D.supan @@ -23,11 +23,11 @@ converger RelIncreDisp 1 1E-4 10 1 analyze # Node 2: -# 4.0000 0 +# 4.0000 0 # Displacement: -# -0.5333 5.9889 +# -0.5333 5.9889 # Resistance: -# 1.3333e-06 1.0000e+02 +# 1.3333e-06 1.0000e+02 peek node 2 peek element 1 2 diff --git a/Example/Material/BilinearHoffman.supan b/Example/Material/BilinearHoffman.supan index 5324109c4..021596422 100644 --- a/Example/Material/BilinearHoffman.supan +++ b/Example/Material/BilinearHoffman.supan @@ -33,11 +33,11 @@ analyze peek element 1 # Node 5: -# 5.0000 -5.0000 5.0000 +# 5.0000 -5.0000 5.0000 # Displacement: -# 0 0 -0.0974 +# 0 0 -0.0974 # Resistance: -# 2.6051e+03 -1.2345e+04 3.8586e-12 +# 2.6051e+03 -1.2345e+04 3.8586e-12 peek node 5 # save recorder 1 diff --git a/Example/Material/BilinearMises1D.supan b/Example/Material/BilinearMises1D.supan index d0606c7fb..3d8d95ec3 100644 --- a/Example/Material/BilinearMises1D.supan +++ b/Example/Material/BilinearMises1D.supan @@ -23,11 +23,11 @@ converger AbsIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 4.0000 0 +# 4.0000 0 # Displacement: -# 1.0000 0 +# 1.0000 0 # Resistance: -# 30.0000 0 +# 30.0000 0 peek node 2 reset diff --git a/Example/Material/BilinearPeric.supan b/Example/Material/BilinearPeric.supan index 64c7c460a..4a42e385e 100644 --- a/Example/Material/BilinearPeric.supan +++ b/Example/Material/BilinearPeric.supan @@ -46,32 +46,32 @@ analyze peek element 1 # Node 5: -# 5.0000 -5.0000 5.0000 +# 5.0000 -5.0000 5.0000 # Displacement: -# 0 0 -0.5000 +# 0 0 -0.5000 # Resistance: -# -5.0820e-04 5.0820e-04 -1.4742e+04 +# -5.0820e-04 5.0820e-04 -1.4742e+04 # # Node 6: -# 5.0000 5.0000 5.0000 +# 5.0000 5.0000 5.0000 # Displacement: -# 0 0.2441 -0.5000 +# 0 0.2441 -0.5000 # Resistance: -# -5.0820e-04 -5.0820e-04 -1.4742e+04 +# -5.0820e-04 -5.0820e-04 -1.4742e+04 # # Node 7: -# -5.0000 5.0000 5.0000 +# -5.0000 5.0000 5.0000 # Displacement: -# -0.2441 0.2441 -0.5000 +# -0.2441 0.2441 -0.5000 # Resistance: -# 5.0820e-04 -5.0820e-04 -1.4742e+04 +# 5.0820e-04 -5.0820e-04 -1.4742e+04 # # Node 8: -# -5.0000 -5.0000 5.0000 +# -5.0000 -5.0000 5.0000 # Displacement: -# -0.2441 0 -0.5000 +# -0.2441 0 -0.5000 # Resistance: -# 5.0820e-04 5.0820e-04 -1.4742e+04 +# 5.0820e-04 5.0820e-04 -1.4742e+04 peek node 5 6 7 8 reset diff --git a/Example/Material/BilinearViscosity.supan b/Example/Material/BilinearViscosity.supan index 41b342caa..e01bdbbf8 100644 --- a/Example/Material/BilinearViscosity.supan +++ b/Example/Material/BilinearViscosity.supan @@ -36,15 +36,15 @@ converger RelIncreDisp 1 1E-10 4 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 18.2589 0 +# 18.2589 0 # Resistance: -# 2.3505e+03 0 +# 2.3505e+03 0 # Velocity: -# 9.0747 0 +# 9.0747 0 # Acceleration: -# -19.4431 0 +# -19.4431 0 peek node 2 exit \ No newline at end of file diff --git a/Example/Material/BlatzKo.supan b/Example/Material/BlatzKo.supan index e1e905de6..b81e1c872 100644 --- a/Example/Material/BlatzKo.supan +++ b/Example/Material/BlatzKo.supan @@ -36,11 +36,11 @@ peek element 1 # save recorder 1 2 # Node 5: -# 0.5000 -0.5000 0.5000 +# 0.5000 -0.5000 0.5000 # Displacement: -# 0 0 4.0000 +# 0 0 4.0000 # Resistance: -# 5.1327e-02 -5.1327e-02 5.0989e+06 +# 5.1327e-02 -5.1327e-02 5.0989e+06 peek node 5 6 7 8 reset diff --git a/Example/Material/CDP.supan b/Example/Material/CDP.supan index 528e7e0ba..0f4450413 100644 --- a/Example/Material/CDP.supan +++ b/Example/Material/CDP.supan @@ -55,32 +55,36 @@ converger RelIncreDisp 1 1E-12 10 1 analyze # Node 9: -# 5.0000 -5.0000 20.0000 +# Coordinate: +# 5.0000 -5.0000 20.0000 # Displacement: -# 0 0 -0.0500 +# 0 0 -0.0500 # Resistance: -# -8.9425e-14 7.8143e-14 -9.1689e+02 +# 1.8961e-14 -2.3377e-14 -9.1460e+02 # # Node 10: -# 5.0000 5.0000 20.0000 +# Coordinate: +# 5.0000 5.0000 20.0000 # Displacement: -# 0 0.0135 -0.0500 +# 0 0.0135 -0.0500 # Resistance: -# 8.9725e-14 2.1507e-13 -9.1689e+02 +# 1.7761e-14 3.5470e-15 -9.1460e+02 # # Node 11: -# -5.0000 5.0000 20.0000 +# Coordinate: +# -5.0000 5.0000 20.0000 # Displacement: -# -0.0135 0.0135 -0.0500 +# -0.0135 0.0135 -0.0500 # Resistance: -# 1.5641e-14 -9.8162e-15 -9.1689e+02 +# -1.3575e-13 4.6065e-14 -9.1460e+02 # # Node 12: -# -5.0000 -5.0000 20.0000 +# Coordinate: +# -5.0000 -5.0000 20.0000 # Displacement: -# -0.0135 0 -0.0500 +# -0.0135 0 -0.0500 # Resistance: -# -4.4123e-14 4.3377e-14 -9.1689e+02 +# -8.0123e-14 -2.1897e-15 -9.1460e+02 peek node 9 10 11 12 peek element 1 diff --git a/Example/Material/CDPM2.supan b/Example/Material/CDPM2.supan index 5740e3338..15b93ded7 100644 --- a/Example/Material/CDPM2.supan +++ b/Example/Material/CDPM2.supan @@ -42,7 +42,38 @@ analyze peek element 1 -# peek node 9 10 11 12 +# Node 9: +# Coordinate: +# 5.0000 -5.0000 20.0000 +# Displacement: +# 0 0 -0.1000 +# Resistance: +# -1.1333e-13 1.5915e-13 -4.0729e+00 +# +# Node 10: +# Coordinate: +# 5.0000 5.0000 20.0000 +# Displacement: +# 0 0.0370 -0.1000 +# Resistance: +# -1.0423e-13 8.8103e-16 -4.0729e+00 +# +# Node 11: +# Coordinate: +# -5.0000 5.0000 20.0000 +# Displacement: +# -0.0370 0.0370 -0.1000 +# Resistance: +# 4.5427e-16 7.5096e-16 -4.0729e+00 +# +# Node 12: +# Coordinate: +# -5.0000 -5.0000 20.0000 +# Displacement: +# -0.0370 0 -0.1000 +# Resistance: +# -5.9986e-16 1.4301e-13 -4.0729e+00 +peek node 9 10 11 12 # save recorder 1 diff --git a/Example/Material/CDPM2PS.supan b/Example/Material/CDPM2PS.supan index 5ac89c922..6ac6dbb75 100644 --- a/Example/Material/CDPM2PS.supan +++ b/Example/Material/CDPM2PS.supan @@ -29,18 +29,18 @@ analyze # save recorder 1 # Node 3: -# 1.0000 1.0000 +# 1.0000 1.0000 # Displacement: -# -0.0008 0.0009 +# -0.0008 0.0009 # Resistance: -# -2.4842e-01 -1.3184e-16 +# -2.4842e-01 -1.3184e-16 # # Node 4: -# 0 1.0000 +# 0 1.0000 # Displacement: -# -0.0008 -0.0002 +# -0.0008 -0.0002 # Resistance: -# -5.2314e-01 -6.9389e-18 +# -5.2314e-01 -6.9389e-18 peek node 3 4 reset diff --git a/Example/Material/CDPPS.supan b/Example/Material/CDPPS.supan index c1eaf16b6..0ef77e706 100644 --- a/Example/Material/CDPPS.supan +++ b/Example/Material/CDPPS.supan @@ -45,18 +45,18 @@ analyze peek element 1 # Node 3: -# 1.0000 1.0000 +# 1.0000 1.0000 # Displacement: -# -0.0030 -0.0300 +# -0.0030 -0.0300 # Resistance: -# -0.1119 -0.1542 +# -0.1119 -0.1542 # # Node 4: -# 0 1.0000 +# 0 1.0000 # Displacement: -# -0.0030 -0.0300 +# -0.0030 -0.0300 # Resistance: -# 0.0693 -0.2005 +# 0.0693 -0.2005 peek node 3 4 reset diff --git a/Example/Material/Concrete01.supan b/Example/Material/Concrete01.supan index de059afdc..0dd1404e5 100644 --- a/Example/Material/Concrete01.supan +++ b/Example/Material/Concrete01.supan @@ -29,11 +29,11 @@ converger RelIncreDisp 1 1E-8 10 1 analyze # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# -0.0100 0 +# -0.0100 0 # Resistance: -# -1.7449e+03 0 +# -1.7449e+03 0 peek node 3 # save recorder 1 2 diff --git a/Example/Material/ConcreteCM2.supan b/Example/Material/ConcreteCM2.supan index 91a1ae31b..b25206a87 100644 --- a/Example/Material/ConcreteCM2.supan +++ b/Example/Material/ConcreteCM2.supan @@ -31,11 +31,11 @@ analyze # save recorder 1 2 # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# -0.0100 0 +# -0.0100 0 # Resistance: -# -1.6528e+03 0 +# -1.6528e+03 0 peek node 3 reset diff --git a/Example/Material/DP.supan b/Example/Material/DP.supan index 81cd09016..f710b0b34 100644 --- a/Example/Material/DP.supan +++ b/Example/Material/DP.supan @@ -35,11 +35,11 @@ analyze # Node 5: # Coordinate: -# 5.0000 -5.0000 5.0000 +# 5.0000 -5.0000 5.0000 # Displacement: -# 0 0 -0.2000 +# 0 0 -0.2000 # Resistance: -# -3.9787e-13 6.2223e-13 -4.8162e+02 +# -3.9787e-13 6.2223e-13 -4.8162e+02 peek node 5 # save recorder 1 diff --git a/Example/Material/ExpCC.supan b/Example/Material/ExpCC.supan index d996a0fa7..5dea1cae1 100644 --- a/Example/Material/ExpCC.supan +++ b/Example/Material/ExpCC.supan @@ -31,11 +31,11 @@ converger RelIncreDisp 1 1E-12 50 1 analyze # Node 6: -# 5.0000 5.0000 5.0000 +# 5.0000 5.0000 5.0000 # Displacement: -# 0 0.0262 -0.0200 +# 0 0.0262 -0.0200 # Resistance: -# -6.8585e-12 -6.4791e-12 -1.5084e+04 +# -6.8585e-12 -6.4791e-12 -1.5084e+04 peek node 6 peek element 1 diff --git a/Example/Material/ExpDP.supan b/Example/Material/ExpDP.supan index 8ac2d11b2..8c169e0c5 100644 --- a/Example/Material/ExpDP.supan +++ b/Example/Material/ExpDP.supan @@ -45,11 +45,11 @@ converger RelIncreDisp 1 1E-10 50 1 analyze # Node 5: -# 5.0000 -5.0000 5.0000 +# 5.0000 -5.0000 5.0000 # Displacement: -# 0 0 -0.1000 +# 0 0 -0.1000 # Resistance: -# -1.2580e-08 1.2580e-08 -1.0071e+00 +# -1.2580e-08 1.2580e-08 -1.0071e+00 peek node 5 6 7 8 peek element 1 diff --git a/Example/Material/ExpGurson.supan b/Example/Material/ExpGurson.supan index 9a47fc137..2c7f170a9 100644 --- a/Example/Material/ExpGurson.supan +++ b/Example/Material/ExpGurson.supan @@ -37,11 +37,11 @@ converger RelIncreDisp 1 1E-12 10 1 analyze # Node 9: -# 5.0000 -5.0000 20.0000 +# 5.0000 -5.0000 20.0000 # Displacement: -# 0 0 0.5000 +# 0 0 0.5000 # Resistance: -# -8.0815e-15 1.1129e-14 1.6991e+01 +# -8.0815e-15 1.1129e-14 1.6991e+01 peek node 9 reset diff --git a/Example/Material/ExpGurson1D.supan b/Example/Material/ExpGurson1D.supan index 39f05e85c..6b8df380d 100644 --- a/Example/Material/ExpGurson1D.supan +++ b/Example/Material/ExpGurson1D.supan @@ -34,11 +34,11 @@ save recorder 1 2 peek element 1 # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# 0.0500 0 +# 0.0500 0 # Resistance: -# 63.4232 0 +# 63.4232 0 peek node 3 save recorder 1 diff --git a/Example/Material/ExpHoffman.supan b/Example/Material/ExpHoffman.supan index 3ac233a4f..ffd073234 100644 --- a/Example/Material/ExpHoffman.supan +++ b/Example/Material/ExpHoffman.supan @@ -31,11 +31,11 @@ analyze peek element 1 # Node 5: -# 5.0000 -5.0000 5.0000 +# 5.0000 -5.0000 5.0000 # Displacement: -# -0.0264 0.2000 0.0621 +# -0.0264 0.2000 0.0621 # Resistance: -# 2.7689e-12 5.6473e+03 -4.9205e-13 +# 2.7689e-12 5.6473e+03 -4.9205e-13 peek node 5 # save recorder 1 diff --git a/Example/Material/ExpJ2.supan b/Example/Material/ExpJ2.supan index c3c9db22f..079d7a48d 100644 --- a/Example/Material/ExpJ2.supan +++ b/Example/Material/ExpJ2.supan @@ -32,11 +32,11 @@ converger RelIncreDisp 1 1E-8 50 1 analyze # Node 5: -# 5.0000 -5.0000 5.0000 +# 5.0000 -5.0000 5.0000 # Displacement: -# 0 0 0.5000 +# 0 0 0.5000 # Resistance: -# -5.9329e-15 4.9515e-15 1.0131e+00 +# -5.9329e-15 4.9515e-15 1.0131e+00 peek node 5 6 7 8 peek element 1 diff --git a/Example/Material/ExpMises1D.supan b/Example/Material/ExpMises1D.supan index c26562b98..fb49f17c5 100644 --- a/Example/Material/ExpMises1D.supan +++ b/Example/Material/ExpMises1D.supan @@ -25,11 +25,11 @@ analyze peek element 1 # Node 2: -# 4.0000 0 +# 4.0000 0 # Displacement: -# 1.0000 0 +# 1.0000 0 # Resistance: -# 1.2255e+02 0 +# 1.2255e+02 0 peek node 2 reset diff --git a/Example/Material/Kelvin.supan b/Example/Material/Kelvin.supan index 471dee278..c6edb5e31 100644 --- a/Example/Material/Kelvin.supan +++ b/Example/Material/Kelvin.supan @@ -40,15 +40,15 @@ converger RelIncreDisp 1 1E-11 10 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# -0.0002 0 +# -0.0002 0 # Resistance: -# -0.0690 0 +# -0.0690 0 # Velocity: -# 6.5088e-05 0 +# 6.5088e-05 0 # Acceleration: -# 0.0066 0 +# 0.0066 0 peek node 2 reset diff --git a/Example/Material/Laminated.supan b/Example/Material/Laminated.supan index 37d45abb9..5db5d1da1 100644 --- a/Example/Material/Laminated.supan +++ b/Example/Material/Laminated.supan @@ -30,18 +30,18 @@ analyze peek element 1 # Node 3: -# 1.0000 1.0000 +# 1.0000 1.0000 # Displacement: -# 0 -0.0262 +# 0 -0.0262 # Resistance: -# -50.0553 -31.1029 +# -50.0553 -31.1029 # # Node 4: -# 0 1.0000 +# 0 1.0000 # Displacement: -# 0.0500 0.0200 +# 0.0500 0.0200 # Resistance: -# 40.8311 10.0720 +# 40.8311 10.0720 peek node 3 4 reset diff --git a/Example/Material/LinearDamage.supan b/Example/Material/LinearDamage.supan index 0b765338b..621cef85a 100644 --- a/Example/Material/LinearDamage.supan +++ b/Example/Material/LinearDamage.supan @@ -105,7 +105,7 @@ converger RelIncreDisp 1 1E-8 40 1 analyze -# -0.0705 -0.0497 1.0000 +# -0.0705 -0.0497 1.0000 peek node 12 peek element 1 diff --git a/Example/Material/LinearHoffman.supan b/Example/Material/LinearHoffman.supan index 7b4a78110..d1713b6e4 100644 --- a/Example/Material/LinearHoffman.supan +++ b/Example/Material/LinearHoffman.supan @@ -32,11 +32,11 @@ converger RelIncreDisp 1 1E-14 50 1 analyze # Node 5: -# 5.0000 -5.0000 5.0000 +# 5.0000 -5.0000 5.0000 # Displacement: -# 0 0 0.0500 +# 0 0 0.0500 # Resistance: -# 1.4398e-04 -1.4398e-04 6.9317e+03 +# 1.4398e-04 -1.4398e-04 6.9317e+03 peek node 5 reset diff --git a/Example/Material/MPF.supan b/Example/Material/MPF.supan index 9eea228d3..ee08e08bc 100644 --- a/Example/Material/MPF.supan +++ b/Example/Material/MPF.supan @@ -22,11 +22,11 @@ converger RelIncreDisp 1 1E-8 10 1 analyze # Node 2: -# 4.0000 0 +# 4.0000 0 # Displacement: -# -2.4667 10.6500 +# -2.4667 10.6500 # Resistance: -# 1.0667e-06 8.0000e+01 +# 1.0667e-06 8.0000e+01 peek node 2 peek element 1 2 diff --git a/Example/Material/Maxwell.supan b/Example/Material/Maxwell.supan index 3b79da60d..1e1100577 100644 --- a/Example/Material/Maxwell.supan +++ b/Example/Material/Maxwell.supan @@ -38,15 +38,15 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# -0.0001 0 +# -0.0001 0 # Resistance: -# -0.0093 0 +# -0.0093 0 # Velocity: -# 0.0124 0 +# 0.0124 0 # Acceleration: -# 0.0009 0 +# 0.0009 0 peek node 2 # save recorder 1 2 3 4 5 6 7 diff --git a/Example/Material/MooneyRivlin.supan b/Example/Material/MooneyRivlin.supan index e823cf008..6d68c143a 100644 --- a/Example/Material/MooneyRivlin.supan +++ b/Example/Material/MooneyRivlin.supan @@ -32,11 +32,11 @@ analyze peek element 1 # Node 3: -# 1.0000 1.0000 0 +# 1.0000 1.0000 0 # Displacement: -# -1.0000 0.7514 0 +# -1.0000 0.7514 0 # Resistance: -# -3.6345e+02 -3.9355e-10 2.3739e+02 +# -3.6345e+02 -3.9355e-10 2.3739e+02 peek node 3 reset diff --git a/Example/Material/MultilinearJ2.supan b/Example/Material/MultilinearJ2.supan index f9f405caa..6aded4483 100644 --- a/Example/Material/MultilinearJ2.supan +++ b/Example/Material/MultilinearJ2.supan @@ -31,7 +31,7 @@ converger RelIncreDisp 1 1E-8 50 1 analyze # Resistance: -# 4.1942e-05 -4.1942e-05 5.2083e+03 +# 4.1942e-05 -4.1942e-05 5.2083e+03 peek node 5 6 7 8 peek element 1 diff --git a/Example/Material/MultilinearMises1D.supan b/Example/Material/MultilinearMises1D.supan index 9fcaf0403..8a8c1287d 100644 --- a/Example/Material/MultilinearMises1D.supan +++ b/Example/Material/MultilinearMises1D.supan @@ -24,11 +24,11 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 4.0000 0 +# 4.0000 0 # Displacement: -# 0.1000 0 +# 0.1000 0 # Resistance: -# 2.5980e+03 0 +# 2.5980e+03 0 peek node 2 peek element 1 diff --git a/Example/Material/NLE1D01.supan b/Example/Material/NLE1D01.supan index 1763b4584..32cda87fd 100644 --- a/Example/Material/NLE1D01.supan +++ b/Example/Material/NLE1D01.supan @@ -21,11 +21,11 @@ converger RelIncreDisp 1 1E-4 10 1 analyze # Node 2: -# 4.0000 0 +# 4.0000 0 # Displacement: -# -0.2133 1.3956 +# -0.2133 1.3956 # Resistance: -# -2.1579e-11 4.0000e+01 +# -2.1579e-11 4.0000e+01 peek node 2 peek element 1 2 diff --git a/Example/Material/OrthotropicElastic3D.supan b/Example/Material/OrthotropicElastic3D.supan index 7d3442633..d1a6978b5 100644 --- a/Example/Material/OrthotropicElastic3D.supan +++ b/Example/Material/OrthotropicElastic3D.supan @@ -35,7 +35,7 @@ analyze peek element 1 # Resistance: -# -2.0264e+01 -5.1203e-01 -1.0316e+02 +# -2.0264e+01 -5.1203e-01 -1.0316e+02 peek node 5 # save recorder 1 diff --git a/Example/Material/ParabolicCC.supan b/Example/Material/ParabolicCC.supan index b6d1c1064..48ff050dd 100644 --- a/Example/Material/ParabolicCC.supan +++ b/Example/Material/ParabolicCC.supan @@ -31,7 +31,7 @@ converger AbsIncreDisp 1 1E-13 10 1 analyze # Resistance: -# -5.8435e+03 5.8435e+03 -7.7404e+03 +# -5.8435e+03 5.8435e+03 -7.7404e+03 peek node 5 6 7 8 peek element 1 diff --git a/Example/Material/Parallel.supan b/Example/Material/Parallel.supan index 878044e89..407e0cc56 100644 --- a/Example/Material/Parallel.supan +++ b/Example/Material/Parallel.supan @@ -34,11 +34,11 @@ analyze peek element 1 # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# 0.5000 0 +# 0.5000 0 # Resistance: -# 4.3018e+03 0 +# 4.3018e+03 0 peek node 3 reset diff --git a/Example/Material/PolyJ2.supan b/Example/Material/PolyJ2.supan index 12f742c49..5e28c8946 100644 --- a/Example/Material/PolyJ2.supan +++ b/Example/Material/PolyJ2.supan @@ -31,32 +31,32 @@ converger RelIncreDisp 1 1E-12 50 1 analyze # Node 5: -# 5.0000 -5.0000 5.0000 +# 5.0000 -5.0000 5.0000 # Displacement: -# 0 0 0.5000 +# 0 0 0.5000 # Resistance: -# 2.9714e-06 -2.9714e-06 6.3773e+02 +# 2.9714e-06 -2.9714e-06 6.3773e+02 # # Node 6: -# 5.0000 5.0000 5.0000 +# 5.0000 5.0000 5.0000 # Displacement: -# 0 -0.1543 0.5000 +# 0 -0.1543 0.5000 # Resistance: -# 2.9714e-06 2.9714e-06 6.3773e+02 +# 2.9714e-06 2.9714e-06 6.3773e+02 # # Node 7: -# -5.0000 5.0000 5.0000 +# -5.0000 5.0000 5.0000 # Displacement: -# 0.1543 -0.1543 0.5000 +# 0.1543 -0.1543 0.5000 # Resistance: -# -2.9714e-06 2.9714e-06 6.3773e+02 +# -2.9714e-06 2.9714e-06 6.3773e+02 # # Node 8: -# -5.0000 -5.0000 5.0000 +# -5.0000 -5.0000 5.0000 # Displacement: -# 0.1543 0 0.5000 +# 0.1543 0 0.5000 # Resistance: -# -2.9714e-06 -2.9714e-06 6.3773e+02 +# -2.9714e-06 -2.9714e-06 6.3773e+02 peek node 5 6 7 8 peek element 1 diff --git a/Example/Material/RO.supan b/Example/Material/RO.supan index 218000436..4835369d8 100644 --- a/Example/Material/RO.supan +++ b/Example/Material/RO.supan @@ -25,11 +25,11 @@ converger RelIncreDisp 1 1E-12 10 1 analyze # Node 3: -# 6.0000 0 +# 6.0000 0 # Displacement: -# 5.0703 0 +# 5.0703 0 # Resistance: -# 1.0000e+02 0 +# 1.0000e+02 0 peek node 3 peek element 1 diff --git a/Example/Material/Sequential.supan b/Example/Material/Sequential.supan index c8efcc18a..81d6f171d 100644 --- a/Example/Material/Sequential.supan +++ b/Example/Material/Sequential.supan @@ -29,11 +29,11 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# 0.0050 0 +# 0.0050 0 # Resistance: -# 16.6666 0 +# 16.6666 0 peek node 3 peek element 1 diff --git a/Example/Material/SimpleSand.supan b/Example/Material/SimpleSand.supan index bb6ee81c9..cef007678 100644 --- a/Example/Material/SimpleSand.supan +++ b/Example/Material/SimpleSand.supan @@ -37,11 +37,11 @@ converger RelIncreDisp 1 1E-12 10 1 analyze # Node 10: -# 5.0000 5.0000 20.0000 +# 5.0000 5.0000 20.0000 # Displacement: -# 0 0 -0.1000 +# 0 0 -0.1000 # Resistance: -# -1.2126e+03 -1.2126e+03 -1.2633e+03 +# -1.2126e+03 -1.2126e+03 -1.2633e+03 peek node 10 peek element 1 diff --git a/Example/Material/Sinh.supan b/Example/Material/Sinh.supan new file mode 100644 index 000000000..2b3b22f7c --- /dev/null +++ b/Example/Material/Sinh.supan @@ -0,0 +1,66 @@ +node 1 0 0 +node 2 1 0 +node 3 2 0 +node 4 3 0 + +material Tanh1D 1 1000 +material Elastic1D 2 100 +material Sinh1D 3 1000 +material Viscosity01 4 1 5 + +element Spring01 1 1 2 1 +element Spring01 2 2 3 2 +element Spring01 3 3 4 3 +element Damper01 4 2 3 4 + +mass 5 2 1 1 +mass 6 3 1 1 + +fix2 1 1 1 4 +fix2 2 2 1 2 3 4 + +initial velocity 100 1 2 + +hdf5recorder 1 Node U1 2 3 +hdf5recorder 2 Node V1 2 3 + +step dynamic 1 1 +set ini_step_size 1E-2 +set fixed_step_size 1 + +converger RelIncreDisp 1 1E-11 10 1 + +analyze + +# Node 2: +# Coordinate: +# 1.0000 0 +# Displacement: +# 0.3815 0 +# Resistance: +# 4.2847e+02 0 +# Velocity: +# 26.5382 0 +# Acceleration: +# -4.2847e+02 0 +# +# Node 3: +# Coordinate: +# 2.0000 0 +# Displacement: +# 0.4516 0 +# Resistance: +# 4.0270e+02 0 +# Velocity: +# 12.2488 0 +# Acceleration: +# -4.0270e+02 0 +peek node 2 3 + +peek element 1 3 + +# save recorder 1 2 + +reset +clear +exit diff --git a/Example/Material/SlipLock.supan b/Example/Material/SlipLock.supan index 6fe9bbc97..9545b3341 100644 --- a/Example/Material/SlipLock.supan +++ b/Example/Material/SlipLock.supan @@ -31,11 +31,11 @@ analyze peek element 1 # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# -0.0020 0 +# -0.0020 0 # Resistance: -# -0.2618 0 +# -0.2618 0 peek node 3 reset diff --git a/Example/Material/SteelBRB.supan b/Example/Material/SteelBRB.supan index 8ed1a55cb..67ec1e0ad 100644 --- a/Example/Material/SteelBRB.supan +++ b/Example/Material/SteelBRB.supan @@ -26,11 +26,11 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 4.0000 0 +# 4.0000 0 # Displacement: -# -0.2233 1.0000 +# -0.2233 1.0000 # Resistance: -# -3.5470e-11 3.8243e+03 +# -3.5470e-11 3.8243e+03 peek node 2 reset diff --git a/Example/Material/Substepping.supan b/Example/Material/Substepping.supan index 4adbf33c5..1621e2cee 100644 --- a/Example/Material/Substepping.supan +++ b/Example/Material/Substepping.supan @@ -32,11 +32,11 @@ converger RelIncreDisp 1 1E-12 50 1 analyze # Node 6: -# 5.0000 5.0000 5.0000 +# 5.0000 5.0000 5.0000 # Displacement: -# 0 0.0262 -0.0200 +# 0 0.0262 -0.0200 # Resistance: -# -6.8585e-12 -6.4791e-12 -1.5084e+04 +# -6.8585e-12 -6.4791e-12 -1.5084e+04 peek node 6 # save recorder 1 diff --git a/Example/Material/VAFCRP.supan b/Example/Material/VAFCRP.supan index 42d2c6ccb..4c1abbb3d 100644 --- a/Example/Material/VAFCRP.supan +++ b/Example/Material/VAFCRP.supan @@ -37,32 +37,32 @@ converger RelIncreDisp 1 1E-12 10 1 analyze # Node 9: -# 5.0000 -5.0000 20.0000 +# 5.0000 -5.0000 20.0000 # Displacement: -# 0 0 0.5000 +# 0 0 0.5000 # Resistance: -# 1.0651e-13 -4.8376e-13 1.3199e+04 +# 1.0651e-13 -4.8376e-13 1.3199e+04 # # Node 10: -# 5.0000 5.0000 20.0000 +# 5.0000 5.0000 20.0000 # Displacement: -# 0 -0.1171 0.5000 +# 0 -0.1171 0.5000 # Resistance: -# 4.1362e-12 -1.1330e-13 1.3199e+04 +# 4.1362e-12 -1.1330e-13 1.3199e+04 # # Node 11: -# -5.0000 5.0000 20.0000 +# -5.0000 5.0000 20.0000 # Displacement: -# 0.1171 -0.1171 0.5000 +# 0.1171 -0.1171 0.5000 # Resistance: -# -4.2658e-13 2.0193e-12 1.3199e+04 +# -4.2658e-13 2.0193e-12 1.3199e+04 # # Node 12: -# -5.0000 -5.0000 20.0000 +# -5.0000 -5.0000 20.0000 # Displacement: -# 0.1171 0 0.5000 +# 0.1171 0 0.5000 # Resistance: -# 2.8548e-12 -1.4391e-12 1.3199e+04 +# 2.8548e-12 -1.4391e-12 1.3199e+04 peek node 9 10 11 12 reset diff --git a/Example/Material/VAFCRP1D.supan b/Example/Material/VAFCRP1D.supan index dd4773b07..21d147d23 100644 --- a/Example/Material/VAFCRP1D.supan +++ b/Example/Material/VAFCRP1D.supan @@ -29,11 +29,11 @@ analyze # save recorder 1 2 # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# -0.1000 0 +# -0.1000 0 # Resistance: -# -49.0640 0 +# -49.0640 0 peek node 3 reset diff --git a/Example/Material/Yeoh.supan b/Example/Material/Yeoh.supan index 49f0f6886..590ddc1d6 100644 --- a/Example/Material/Yeoh.supan +++ b/Example/Material/Yeoh.supan @@ -32,11 +32,11 @@ analyze peek element 1 # Node 3: -# 1.0000 1.0000 0 +# 1.0000 1.0000 0 # Displacement: -# -1.0000 0.1701 0 +# -1.0000 0.1701 0 # Resistance: -# -1.0040e+03 1.2968e-12 1.0136e+03 +# -1.0040e+03 1.2968e-12 1.0136e+03 peek node 3 reset diff --git a/Example/Other/BodyForce.supan b/Example/Other/BodyForce.supan index 58231d820..0020fd8ca 100644 --- a/Example/Other/BodyForce.supan +++ b/Example/Other/BodyForce.supan @@ -23,11 +23,12 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 1.0000 0 +# Coordinate: +# 1.0000 0 # Displacement: -# -4.0000e-05 0 +# -4.0000e-05 0 # Resistance: -# 3.5293e-18 -5.0000e-01 +# 1.8361e-17 -5.0000e-01 peek node 2 peek element 1 diff --git a/Example/Other/Collision2D.supan b/Example/Other/Collision2D.supan index 6050283e1..d3616bcaf 100644 --- a/Example/Other/Collision2D.supan +++ b/Example/Other/Collision2D.supan @@ -58,7 +58,7 @@ rigidwall 3 0 5 0 -1 1E0 rigidwall 4 -5 0 1 0 1E0 rigidwall 5 0 -5 0 1 1E0 -step dynamic 1 200 +step dynamic 1 2 set ini_step_size 2E-2 set fixed_step_size 1 set band_mat false @@ -68,6 +68,19 @@ converger RelIncreDisp 1 1E-11 10 1 analyze +# Node 2: +# Coordinate: +# 1.7580 2.2530 +# Displacement: +# 0.5282 -1.4996 +# Resistance: +# 0 0 +# Velocity: +# 0.2642 -0.7496 +# Acceleration: +# 0.0079 0.0086 +peek node 2 + # save recorder 1 exit diff --git a/Example/Other/Collision3D.supan b/Example/Other/Collision3D.supan index 03638459e..9fa32f23d 100644 --- a/Example/Other/Collision3D.supan +++ b/Example/Other/Collision3D.supan @@ -58,7 +58,7 @@ rigidwall 3 0 5 0 0 -1 0 1E0 rigidwall 4 -5 0 0 1 0 0 1E0 rigidwall 5 0 -5 0 0 1 0 1E0 -step dynamic 1 200 +step dynamic 1 2 set ini_step_size 2E-2 set fixed_step_size 1 set band_mat false @@ -68,6 +68,19 @@ converger RelIncreDisp 1 1E-11 10 1 analyze +# Node 2: +# Coordinate: +# 1.7580 2.2530 0 +# Displacement: +# 0.5282 -1.4996 0 +# Resistance: +# 0 0 0 +# Velocity: +# 0.2642 -0.7496 0 +# Acceleration: +# 0.0079 0.0086 0 +peek node 2 + # save recorder 1 exit diff --git a/Example/Other/Embed2D.supan b/Example/Other/Embed2D.supan index 83ca77b28..70524716c 100644 --- a/Example/Other/Embed2D.supan +++ b/Example/Other/Embed2D.supan @@ -31,11 +31,11 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 7: -# 0.5000 0.5000 +# 0.5000 0.5000 # Displacement: -# -1.4786e-05 1.9836e-04 +# -1.4786e-05 1.9836e-04 # Resistance: -# -0.0666 0.0195 +# -0.0666 0.0195 peek node 7 reset diff --git a/Example/Other/FixedLength.supan b/Example/Other/FixedLength.supan index 3f2ad960d..10d9a82dd 100644 --- a/Example/Other/FixedLength.supan +++ b/Example/Other/FixedLength.supan @@ -26,18 +26,18 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 0 0.1667 0.2500 +# 0 0.1667 0.2500 # Resistance: -# 0 5.0000e+00 4.4409e-16 +# 0 5.0000e+00 4.4409e-16 # # Node 3: -# 1.0000 -1.0000 +# 1.0000 -1.0000 # Displacement: -# 0 0.1667 -0.2500 +# 0 0.1667 -0.2500 # Resistance: -# 0 5.0000e+00 -4.4409e-16 +# 0 5.0000e+00 -4.4409e-16 peek node 2 3 peek element 1 diff --git a/Example/Other/Group.supan b/Example/Other/Group.supan index 5964fd3a9..22037b7d7 100644 --- a/Example/Other/Group.supan +++ b/Example/Other/Group.supan @@ -174,11 +174,12 @@ step static 1 analyze # Node 117: -# 20.0000 5.0000 +# Coordinate: +# 20.0000 5.0000 # Displacement: -# -2.7281e-16 6.7310e+00 +# -9.6083e-15 6.7310e+00 # Resistance: -# 5.3291e-15 2.0000e+00 +# 6.8945e-14 2.0000e+00 peek node 117 peek element 1 diff --git a/Example/Other/GroupBodyForce.supan b/Example/Other/GroupBodyForce.supan index 79a2df3ff..e7aa00f11 100644 --- a/Example/Other/GroupBodyForce.supan +++ b/Example/Other/GroupBodyForce.supan @@ -25,11 +25,12 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 1.0000 0 +# Coordinate: +# 1.0000 0 # Displacement: -# -4.0000e-05 0 +# -4.0000e-05 0 # Resistance: -# 3.5293e-18 -5.0000e-01 +# 1.8361e-17 -5.0000e-01 peek node 2 peek element 1 diff --git a/Example/Other/GroupDisplacement.supan b/Example/Other/GroupDisplacement.supan index 5bbba742d..020e912b2 100644 --- a/Example/Other/GroupDisplacement.supan +++ b/Example/Other/GroupDisplacement.supan @@ -169,11 +169,12 @@ step static 1 analyze # Node 117: -# 20.0000 5.0000 +# Coordinate: +# 20.0000 5.0000 # Displacement: -# -9.0824e-18 2.0000e+00 +# -2.1376e-15 2.0000e+00 # Resistance: -# -1.7375e-14 6.9464e-01 +# -7.8271e-15 6.9464e-01 peek node 117 peek element 1 diff --git a/Example/Other/GroupLoad.supan b/Example/Other/GroupLoad.supan index 983c7bfcb..50eca68a2 100644 --- a/Example/Other/GroupLoad.supan +++ b/Example/Other/GroupLoad.supan @@ -169,11 +169,12 @@ step static 1 analyze # Node 117: -# 20.0000 5.0000 +# Coordinate: +# 20.0000 5.0000 # Displacement: -# 4.7784e-16 6.7310e+00 +# -7.1150e-15 6.7310e+00 # Resistance: -# -3.0420e-14 2.0000e+00 +# 9.5257e-14 2.0000e+00 peek node 117 peek element 1 diff --git a/Example/Other/LJP2D.supan b/Example/Other/LJP2D.supan index 3fa4b8773..cd42695b3 100644 --- a/Example/Other/LJP2D.supan +++ b/Example/Other/LJP2D.supan @@ -58,7 +58,7 @@ rigidwall 3 0 5 0 -1 1E0 rigidwall 4 -5 0 1 0 1E0 rigidwall 5 0 -5 0 1 1E0 -step dynamic 1 200 +step dynamic 1 2 set ini_step_size 1E-2 set fixed_step_size 1 set band_mat false @@ -68,6 +68,19 @@ converger RelIncreDisp 1 1E-11 10 1 analyze +# Node 3: +# Coordinate: +# -2.4000 -0.8920 +# Displacement: +# 1.4826 1.3684 +# Resistance: +# 0 0 +# Velocity: +# 1.6300 1.7174 +# Acceleration: +# -0.8358 -1.9236 +peek node 3 + # save recorder 1 exit diff --git a/Example/Other/LinearParticle.supan b/Example/Other/LinearParticle.supan index 459cc34fc..fecd16f54 100644 --- a/Example/Other/LinearParticle.supan +++ b/Example/Other/LinearParticle.supan @@ -11,7 +11,7 @@ constraint linearspring2d 1 3. 10. modifier LinearViscosity 1 1E1 -step dynamic 1 200 +step dynamic 1 2 set ini_step_size 1E-2 set fixed_step_size 1 set band_mat false @@ -21,7 +21,20 @@ converger AbsIncreDisp 1 1E-11 10 1 analyze -save recorder 1 +# Node 2: +# Coordinate: +# 1.0000 0 +# Displacement: +# 0.1745 0 +# Resistance: +# 0 0 +# Velocity: +# 0.1578 0 +# Acceleration: +# 0.0493 0 +peek node 2 + +# save recorder 1 exit diff --git a/Example/Other/MPC.supan b/Example/Other/MPC.supan index baeb18954..6ed31961a 100644 --- a/Example/Other/MPC.supan +++ b/Example/Other/MPC.supan @@ -26,18 +26,18 @@ converger RelIncreDisp 1 1E-10 3 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 0 0.1167 0.1750 +# 0 0.1167 0.1750 # Resistance: -# 0 3.5000e+00 -2.6645e-15 +# 0 3.5000e+00 -2.6645e-15 # # Node 3: -# 2.0000 0 +# 2.0000 0 # Displacement: -# 0 0.2167 -0.3250 +# 0 0.2167 -0.3250 # Resistance: -# 0 6.5000e+00 2.6645e-15 +# 0 6.5000e+00 2.6645e-15 peek node 2 3 peek element 1 diff --git a/Example/Other/MaxGap2D.supan b/Example/Other/MaxGap2D.supan index 558096aef..d2ca12eb0 100644 --- a/Example/Other/MaxGap2D.supan +++ b/Example/Other/MaxGap2D.supan @@ -26,18 +26,18 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 0 0.2667 0.4000 +# 0 0.2667 0.4000 # Resistance: -# 0 8.0000e+00 1.7764e-15 +# 0 8.0000e+00 1.7764e-15 # # Node 3: -# 1.0000 -1.0000 +# 1.0000 -1.0000 # Displacement: -# 0 0.0667 -0.1000 +# 0 0.0667 -0.1000 # Resistance: -# 0 2.0000e+00 4.4409e-16 +# 0 2.0000e+00 4.4409e-16 peek node 2 3 peek element 1 diff --git a/Example/Other/MinGap2D.supan b/Example/Other/MinGap2D.supan index e855a9a79..9be344c03 100644 --- a/Example/Other/MinGap2D.supan +++ b/Example/Other/MinGap2D.supan @@ -26,18 +26,18 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 0 -0.2667 -0.4000 +# 0 -0.2667 -0.4000 # Resistance: -# 0 -8.0000 0 +# 0 -8.0000 0 # # Node 3: -# 1.0000 -1.0000 +# 1.0000 -1.0000 # Displacement: -# 0 -0.0667 0.1000 +# 0 -0.0667 0.1000 # Resistance: -# 0 -2.0000 0 +# 0 -2.0000 0 peek node 2 3 peek element 1 diff --git a/Example/Other/NodeFacet.supan b/Example/Other/NodeFacet.supan index ebace430f..f8f54ed35 100644 --- a/Example/Other/NodeFacet.supan +++ b/Example/Other/NodeFacet.supan @@ -58,6 +58,37 @@ cload 1 0 -5. 3 11 analyze +# Node 10: +# Coordinate: +# 8.5000 2.0000 0.1000 +# Displacement: +# 0.0013 -0.1543 -0.2447 0 -0.0196 0.0201 +# Resistance: +# 1.3107e-02 -3.0430e-03 5.1732e-01 0 -3.1086e-15 -5.2042e-18 +# +# Node 2: +# Coordinate: +# 5.2000 0.5000 0 +# Displacement: +# -1.4838e-05 -7.4515e-07 -6.8944e-02 1.6011e-03 2.2136e-02 -3.1679e-06 +# Resistance: +# -4.0924e-03 9.5013e-04 -1.6152e-01 -8.3267e-17 -1.1102e-16 -6.5486e-17 +# +# Node 3: +# Coordinate: +# 10.0000 0 0 +# Displacement: +# -3.0265e-05 -1.3435e-05 -1.9350e-01 5.7062e-03 2.6700e-02 -1.0275e-05 +# Resistance: +# -4.5853e-03 1.0646e-03 -1.8098e-01 4.2071e-16 2.2128e-16 3.7080e-17 +# +# Node 6: +# Coordinate: +# 10.0000 5.0000 0 +# Displacement: +# -1.0927e-05 -7.0631e-06 -1.6409e-01 6.3367e-03 2.4003e-02 -3.8249e-06 +# Resistance: +# -4.4292e-03 1.0283e-03 -1.7481e-01 1.0478e-15 -3.0531e-16 -6.2992e-17 peek node 10 2 3 6 exit diff --git a/Example/Other/NodeLine.supan b/Example/Other/NodeLine.supan index e0cb72d44..e6bd345dc 100644 --- a/Example/Other/NodeLine.supan +++ b/Example/Other/NodeLine.supan @@ -29,11 +29,11 @@ converger RelIncreDisp 2 1E-11 10 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# -0.0008 -0.2000 -0.3000 +# -0.0008 -0.2000 -0.3000 # Resistance: -# -9.5380e-02 -6.0000e+00 -4.4409e-16 +# -9.5380e-02 -6.0000e+00 -4.4409e-16 peek node 2 5 6 peek group 1 2 diff --git a/Example/Other/RestitutionWall1D.supan b/Example/Other/RestitutionWall1D.supan index 439e1ddb5..5dbb4a827 100644 --- a/Example/Other/RestitutionWall1D.supan +++ b/Example/Other/RestitutionWall1D.supan @@ -14,7 +14,7 @@ initial acceleration -2 1 1 restitutionwall 1 0 1 1. 1E4 -step dynamic 1 8 +step dynamic 1 1.5 set ini_step_size 1E-2 set fixed_step_size 1 set symm_mat 0 @@ -24,8 +24,19 @@ converger RelIncreDisp 1 1E-10 5 1 analyze -save recorder 1 2 3 - +# save recorder 1 2 3 + +# Node 1: +# Coordinate: +# 1.0000 +# Displacement: +# -0.2409 +# Resistance: +# 0 +# Velocity: +# 0.9784 +# Acceleration: +# -2.0000 peek node 1 exit \ No newline at end of file diff --git a/Example/Other/RestitutionWall2D.supan b/Example/Other/RestitutionWall2D.supan index 37a488134..cbc6be37b 100644 --- a/Example/Other/RestitutionWall2D.supan +++ b/Example/Other/RestitutionWall2D.supan @@ -14,7 +14,7 @@ initial acceleration -2 2 1 restitutionwall 1 0 0 0 1 1. 1E4 -step dynamic 1 8 +step dynamic 1 1.5 set ini_step_size 1E-2 set fixed_step_size 1 set symm_mat 0 @@ -24,8 +24,19 @@ converger RelIncreDisp 1 1E-10 5 1 analyze -save recorder 1 2 3 - +# save recorder 1 2 3 + +# Node 1: +# Coordinate: +# 0 1.0000 +# Displacement: +# 0 -0.2409 +# Resistance: +# 0 0 +# Velocity: +# 0 0.9784 +# Acceleration: +# 0 -2.0000 peek node 1 exit \ No newline at end of file diff --git a/Example/Other/RestitutionWall3D.supan b/Example/Other/RestitutionWall3D.supan index bc7e500c2..cb4caea6c 100644 --- a/Example/Other/RestitutionWall3D.supan +++ b/Example/Other/RestitutionWall3D.supan @@ -14,7 +14,7 @@ initial acceleration -2 2 1 restitutionwall 1 0 0 0 0 1 0 1. 1E4 -step dynamic 1 8 +step dynamic 1 1.5 set ini_step_size 1E-2 set fixed_step_size 1 set symm_mat 0 @@ -24,8 +24,19 @@ converger RelIncreDisp 1 1E-10 5 1 analyze -save recorder 1 2 3 - +# save recorder 1 2 3 + +# Node 1: +# Coordinate: +# 0 1.0000 0 +# Displacement: +# 0 -0.2409 0 +# Resistance: +# 0 0 0 +# Velocity: +# 0 0.9784 0 +# Acceleration: +# 0 -2.0000 0 peek node 1 exit \ No newline at end of file diff --git a/Example/Other/RigidWall1D.supan b/Example/Other/RigidWall1D.supan index aa2571c28..f0f801d72 100644 --- a/Example/Other/RigidWall1D.supan +++ b/Example/Other/RigidWall1D.supan @@ -14,7 +14,7 @@ initial acceleration -1 1 1 constraint rigidwall 1 0 1 .1 -step dynamic 1 8 +step dynamic 1 1.5 set ini_step_size 1E-3 set fixed_step_size 1 set symm_mat 0 @@ -27,15 +27,16 @@ analyze # save recorder 1 2 3 # Node 1: -# 0 1.0000 +# Coordinate: +# 1.0000 # Displacement: -# 0 -0.1357 +# -0.8956 # Resistance: -# 0 0 +# 0 # Velocity: -# 0 0.5259 +# 1.3396 # Acceleration: -# 0 -1.0000 +# -1.0000 peek node 1 exit \ No newline at end of file diff --git a/Example/Other/RigidWall2D.supan b/Example/Other/RigidWall2D.supan index 65d3da1e1..060a046c6 100644 --- a/Example/Other/RigidWall2D.supan +++ b/Example/Other/RigidWall2D.supan @@ -14,7 +14,7 @@ initial acceleration -1 2 1 constraint rigidwall 1 0 0 0 1 .1 -step dynamic 1 8 +step dynamic 1 1.5 set ini_step_size 1E-3 set fixed_step_size 1 set symm_mat 0 @@ -27,15 +27,16 @@ analyze # save recorder 1 2 3 # Node 1: -# 0 1.0000 +# Coordinate: +# 0 1.0000 # Displacement: -# 0 -0.1357 +# 0 -0.8956 # Resistance: -# 0 0 +# 0 0 # Velocity: -# 0 0.5259 +# 0 1.3396 # Acceleration: -# 0 -1.0000 +# 0 -1.0000 peek node 1 exit \ No newline at end of file diff --git a/Example/Other/RigidWall3D.supan b/Example/Other/RigidWall3D.supan index c117eaca4..c876d175a 100644 --- a/Example/Other/RigidWall3D.supan +++ b/Example/Other/RigidWall3D.supan @@ -14,7 +14,7 @@ initial acceleration -1 2 1 constraint rigidwall 1 0 0 0 0 1 0 .1 -step dynamic 1 8 +step dynamic 1 1.5 set ini_step_size 1E-3 set fixed_step_size 1 set symm_mat 0 @@ -27,15 +27,16 @@ analyze # save recorder 1 2 3 # Node 1: -# 0 1.0000 +# Coordinate: +# 0 1.0000 0 # Displacement: -# 0 -0.1357 +# 0 -0.8956 0 # Resistance: -# 0 0 +# 0 0 0 # Velocity: -# 0 0.5259 +# 0 1.3396 0 # Acceleration: -# 0 -1.0000 +# 0 -1.0000 0 peek node 1 exit \ No newline at end of file diff --git a/Example/Other/RigidWallMultiplier.supan b/Example/Other/RigidWallMultiplier.supan index db9bd9539..22d7b6bda 100644 --- a/Example/Other/RigidWallMultiplier.supan +++ b/Example/Other/RigidWallMultiplier.supan @@ -29,7 +29,7 @@ analyze # Displacement: # 0 -0.6000 -0.6857 # Resistance: -# 0 -3.9429e+01 -1.4211e-14 +# 0 -3.9429e+01 -3.5527e-15 # # Node 3: # Coordinate: @@ -37,7 +37,7 @@ analyze # Displacement: # 0 -1.0000 -0.2571 # Resistance: -# 0 8.5714e+00 -1.7764e-14 +# 0 8.5714e+00 -4.4409e-15 peek node 2 3 exit \ No newline at end of file diff --git a/Example/Section/Fibre1D.supan b/Example/Section/Fibre1D.supan index c47e66d2c..c934eeaf9 100644 --- a/Example/Section/Fibre1D.supan +++ b/Example/Section/Fibre1D.supan @@ -29,7 +29,7 @@ converger RelIncreDisp 1 1E-10 10 1 analyze -# 0.6388 -0.6049 +# 0.6388 -0.6049 peek node 2 peek element 2 diff --git a/Example/Section/Fibre2D.supan b/Example/Section/Fibre2D.supan index 7e832aa01..7e6721f8d 100644 --- a/Example/Section/Fibre2D.supan +++ b/Example/Section/Fibre2D.supan @@ -36,11 +36,11 @@ converger RelIncreDisp 1 1E-10 20 1 analyze # Node 1: -# 0 0 +# 0 0 # Displacement: -# 1.4815e-02 1.0000e-04 +# 1.4815e-02 1.0000e-04 # Resistance: -# 1.7817e-06 3.6439e+08 +# 1.7817e-06 3.6439e+08 peek node 1 peek element 1 diff --git a/Example/Section/HSection2D.supan b/Example/Section/HSection2D.supan index 29ec4e999..2c1b469d3 100644 --- a/Example/Section/HSection2D.supan +++ b/Example/Section/HSection2D.supan @@ -24,11 +24,11 @@ converger RelIncreDisp 1 1E-10 20 1 analyze # Node 1: -# 0 0 +# 0 0 # Displacement: -# 6.9176e-20 1.0000e-04 +# 6.9176e-20 1.0000e-04 # Resistance: -# -1.8190e-12 1.6055e+06 +# -1.8190e-12 1.6055e+06 peek node 1 peek element 1 diff --git a/Example/Section/ISection2D.supan b/Example/Section/ISection2D.supan index b62e8aa01..8e96dc185 100644 --- a/Example/Section/ISection2D.supan +++ b/Example/Section/ISection2D.supan @@ -24,11 +24,11 @@ converger RelIncreDisp 1 1E-10 20 1 analyze # Node 1: -# 0 0 +# 0 0 # Displacement: -# -0.0140 0.0003 +# -0.0140 0.0003 # Resistance: -# -1.0914e-11 7.6590e+06 +# -1.0914e-11 7.6590e+06 peek node 1 peek element 1 diff --git a/Example/Section/ISection3D.supan b/Example/Section/ISection3D.supan index 4b4afa53a..ef07c6252 100644 --- a/Example/Section/ISection3D.supan +++ b/Example/Section/ISection3D.supan @@ -30,11 +30,11 @@ converger RelIncreDisp 1 1E-10 20 1 analyze # Node 1: -# 0 0 0 +# 0 0 0 # Displacement: -# -3.2546e-03 3.0000e-04 -2.8666e-20 +# -3.2546e-03 3.0000e-04 -2.8666e-20 # Resistance: -# -7.1054e-14 8.2438e+06 -2.9363e-12 +# -7.1054e-14 8.2438e+06 -2.9363e-12 peek node 1 peek element 1 2 3 4 diff --git a/Example/Section/TSection3D.supan b/Example/Section/TSection3D.supan index a61ca0f9e..6fe490147 100644 --- a/Example/Section/TSection3D.supan +++ b/Example/Section/TSection3D.supan @@ -24,11 +24,11 @@ converger RelIncreDisp 1 1E-10 20 1 analyze # Node 1: -# 0 0 0 +# 0 0 0 # Displacement: -# -1.6307e-02 3.0000e-04 1.4665e-21 +# -1.6307e-02 3.0000e-04 1.4665e-21 # Resistance: -# 6.8212e-12 1.5923e+06 5.8208e-11 +# 6.8212e-12 1.5923e+06 5.8208e-11 peek node 1 peek element 1 diff --git a/Example/Solver/Amplitude.supan b/Example/Solver/Amplitude.supan index 63cdbd6c0..486aeb2ab 100644 --- a/Example/Solver/Amplitude.supan +++ b/Example/Solver/Amplitude.supan @@ -13,9 +13,9 @@ material BilinearJ2 1 2E5 .2 100 .1 element C3D8 1 1 2 3 4 5 6 7 8 1 -fix 1 1 1 2 5 6 -fix 2 2 1 4 5 8 -fix 3 3 1 2 3 4 +fix2 1 1 1 2 5 6 +fix2 2 2 1 4 5 8 +fix2 3 3 1 2 3 4 amplitude Linear 1 10 amplitude Cosine 2 1 0 1 @@ -29,7 +29,7 @@ hdf5recorder 1 Node RF 7 hdf5recorder 2 Node U3 7 hdf5recorder 3 Amplitude 3 -step static 1 4 +step static 1 1 set fixed_step_size 1 set ini_step_size 1E-2 set symm_mat 0 @@ -41,11 +41,12 @@ analyze # peek element 1 # Node 5: -# 5.0000 -5.0000 5.0000 +# Coordinate: +# 5.0000 -5.0000 5.0000 # Displacement: -# 0 0 -2.5037e-33 +# 0 0 4.3368e-19 # Resistance: -# -4.1180e-03 4.1180e-03 -2.9649e+05 +# -6.1965e-12 5.7078e-12 -8.4303e+04 peek node 5 # save recorder 1 2 diff --git a/Example/Solver/BFGS.supan b/Example/Solver/BFGS.supan index 4a920f2f7..b63b3acf2 100644 --- a/Example/Solver/BFGS.supan +++ b/Example/Solver/BFGS.supan @@ -10,7 +10,7 @@ material MPF 2 100 5 .1 20. 18.5 .15 .01 7. true element T2D2 1 1 2 1 10 element T2D2 2 3 2 2 10 -fix 1 P 1 3 +fix2 1 P 1 3 step static 1 solver BFGS 1 @@ -24,11 +24,12 @@ converger RelIncreDisp 1 1E-8 50 1 analyze # Node 2: -# 4.0000 0 +# Coordinate: +# 4.0000 0 # Displacement: -# -3.5333 14.8500 +# -3.5333 14.8500 # Resistance: -# 1.3333e-06 1.0000e+02 +# -5.6843e-14 1.0000e+02 peek node 2 peek solver 1 diff --git a/Example/Solver/BICGSTAB.supan b/Example/Solver/BICGSTAB.supan index 9923da623..22e93ba04 100644 --- a/Example/Solver/BICGSTAB.supan +++ b/Example/Solver/BICGSTAB.supan @@ -22,18 +22,20 @@ converger RelIncreDisp 1 1E-8 20 1 analyze # Node 2: +# Coordinate: # 0.5000 0 # Displacement: # 0.1498 0.6417 # Resistance: -# 7.5862E-09 1.0000E+00 +# -4.4409e-16 1.0000e+00 # # Node 3: +# Coordinate: # 0.5000 0.5000 # Displacement: # -0.1665 0.6081 # Resistance: -# -6.2069E-09 1.0000E+00 +# 0 1.0000 peek node 2 3 reset diff --git a/Example/Solver/Band.supan b/Example/Solver/Band.supan index 0f2c6909c..a88946b80 100644 --- a/Example/Solver/Band.supan +++ b/Example/Solver/Band.supan @@ -21,18 +21,20 @@ set sparse_mat 0 analyze # Node 2: +# Coordinate: # 0.5000 0 # Displacement: # 0.1498 0.6417 # Resistance: -# 7.5862E-09 1.0000E+00 +# -2.2204e-16 1.0000e+00 # # Node 3: +# Coordinate: # 0.5000 0.5000 # Displacement: # -0.1665 0.6081 # Resistance: -# -6.2069E-09 1.0000E+00 +# 3.3307e-16 1.0000e+00 peek node 2 3 reset diff --git a/Example/Solver/BandSymm.supan b/Example/Solver/BandSymm.supan index 13bbabb96..ed9621aef 100644 --- a/Example/Solver/BandSymm.supan +++ b/Example/Solver/BandSymm.supan @@ -21,18 +21,20 @@ set sparse_mat 0 analyze # Node 2: +# Coordinate: # 0.5000 0 # Displacement: # 0.1498 0.6417 # Resistance: -# 7.5862E-09 1.0000E+00 +# 2.2204e-16 1.0000e+00 # # Node 3: +# Coordinate: # 0.5000 0.5000 # Displacement: # -0.1665 0.6081 # Resistance: -# -6.2069E-09 1.0000E+00 +# -1.1102e-16 1.0000e+00 peek node 2 3 reset diff --git a/Example/Solver/BatheExplicit.supan b/Example/Solver/BatheExplicit.supan new file mode 100644 index 000000000..b9826e76a --- /dev/null +++ b/Example/Solver/BatheExplicit.supan @@ -0,0 +1,59 @@ +node 1 0 0 +node 2 0 -2 +node 3 0 -3 +node 4 0 -5 + +material Elastic1D 1 1E7 + +element T2D2 1 1 2 1 1 true +element T2D2 2 2 3 1 1 true +element T2D2 3 3 4 1 1 true + +element Mass 4 1 20 1 2 +element Mass 5 2 20 1 2 +element Mass 6 3 10 1 2 +element Mass 7 4 20 1 2 + +fix2 1 P 1 + +initial velocity 25 1 3 + +amplitude Constant 1 +cload 1 1 -200 2 2 +cload 2 1 -100 2 3 +cload 3 1 -200 2 4 + +hdf5recorder 1 Node U 2 3 4 + +step explicitdynamic 1 1 +set ini_step_size 1E-3 +set fixed_step_size 1 +set symm_mat 0 +set linear_system + +integrator BatheExplicit 1 .9 + +converger RelIncreAcc 1 1E-10 10 0 + +analyze + +# Node 4: +# Coordinate: +# 0 -5.0000 +# Displacement: +# 2.1257 9.3850 +# Resistance: +# 2.7423e+03 3.8522e+03 +# Velocity: +# 0.1839 0.6416 +# Acceleration: +# -1.3711e+02 -2.0261e+02 +peek node 2 3 4 + +peek integrator 1 + +# save recorder 1 + +reset +clear +exit \ No newline at end of file diff --git a/Example/Solver/BatheTwoStep.supan b/Example/Solver/BatheTwoStep.supan index c539e1548..d906c6246 100644 --- a/Example/Solver/BatheTwoStep.supan +++ b/Example/Solver/BatheTwoStep.supan @@ -24,7 +24,7 @@ cload 3 1 -200 2 4 hdf5recorder 1 Node U 2 3 4 -step dynamic 1 10 +step dynamic 1 1 set ini_step_size 1E-2 set fixed_step_size 1 set symm_mat 0 @@ -35,16 +35,17 @@ converger RelIncreDisp 1 1E-10 10 1 analyze -# Node 2: -# 0 -2.0000 +# Node 4: +# Coordinate: +# 0 -5.0000 # Displacement: -# -1.8160 2.8378 +# 1.3869 7.4423 # Resistance: -# 2.1074e+02 3.3268e+02 +# -13.9469 87.9345 # Velocity: -# -0.8459 -1.8286 +# 1.4165 1.3658 # Acceleration: -# -10.5371 -26.6342 +# 0.6973 -14.3967 peek node 2 3 4 peek integrator 1 diff --git a/Example/Solver/ElementalModal.supan b/Example/Solver/ElementalModal.supan index 8c7d3ea0c..ac98c30ad 100644 --- a/Example/Solver/ElementalModal.supan +++ b/Example/Solver/ElementalModal.supan @@ -7,7 +7,7 @@ material Elastic1D 1 10 .2 element EB21 1 1 2 12 1 1 -fix 1 P 1 +fix2 1 P 1 hdf5recorder 1 Node U2 2 @@ -20,7 +20,7 @@ displacement 1 0 1 2 2 converger AbsIncreDisp 1 1E-8 3 1 -step dynamic 2 4 +step dynamic 2 1 set ini_step_size .01 set fixed_step_size 1 @@ -31,15 +31,16 @@ converger RelIncreDisp 2 1E-10 3 1 analyze # Node 2: -# 1.0000 0 +# Coordinate: +# 1.0000 0 # Displacement: -# 0 -0.5387 -0.7480 +# 0 0.5646 0.7911 # Resistance: -# 0 -19.7634 2.4017 +# 0 20.2813 -2.2296 # Velocity: -# 0 2.1988 2.9521 +# 0 -4.8550 -6.5563 # Acceleration: -# 0 27.5128 38.2263 +# 0 -28.4218 -40.9698 peek node 2 exit \ No newline at end of file diff --git a/Example/Solver/FEAST.BAND.supan b/Example/Solver/FEAST.BAND.supan index 721e9a12c..e9f0290dc 100644 --- a/Example/Solver/FEAST.BAND.supan +++ b/Example/Solver/FEAST.BAND.supan @@ -20,7 +20,7 @@ set system_solver SPIKE analyze # Eigenvalues: -# 24.2601 +# 24.2601 peek eigenvalue exit \ No newline at end of file diff --git a/Example/Solver/FEAST.FULL.supan b/Example/Solver/FEAST.FULL.supan index 1c25072ab..7082372ea 100644 --- a/Example/Solver/FEAST.FULL.supan +++ b/Example/Solver/FEAST.FULL.supan @@ -21,7 +21,7 @@ set band_mat false analyze # Eigenvalues: -# 24.2601 +# 24.2601 peek eigenvalue exit \ No newline at end of file diff --git a/Example/Solver/FEAST.SPARSE.supan b/Example/Solver/FEAST.SPARSE.supan index 896fbb0a5..8dde5ca34 100644 --- a/Example/Solver/FEAST.SPARSE.supan +++ b/Example/Solver/FEAST.SPARSE.supan @@ -20,7 +20,7 @@ set sparse_mat 1 analyze # Eigenvalues: -# 24.2601 +# 24.2601 peek eigenvalue exit \ No newline at end of file diff --git a/Example/Solver/FGMRES.supan b/Example/Solver/FGMRES.supan index b6615c7d2..8be01f1e0 100644 --- a/Example/Solver/FGMRES.supan +++ b/Example/Solver/FGMRES.supan @@ -22,18 +22,20 @@ converger RelIncreDisp 1 1E-8 20 1 analyze # Node 2: +# Coordinate: # 0.5000 0 # Displacement: # 0.1498 0.6417 # Resistance: -# 7.5862E-09 1.0000E+00 +# 1.8874e-15 1.0000e+00 # # Node 3: +# Coordinate: # 0.5000 0.5000 # Displacement: # -0.1665 0.6081 # Resistance: -# -6.2069E-09 1.0000E+00 +# -1.5543e-15 1.0000e+00 peek node 2 3 reset diff --git a/Example/Solver/Frequency.supan b/Example/Solver/Frequency.supan index 0fbf9f75d..390c99756 100644 --- a/Example/Solver/Frequency.supan +++ b/Example/Solver/Frequency.supan @@ -19,7 +19,7 @@ set band_mat 0 analyze # Eigenvalues: -# 30.0000 +# 30.0000 peek eigenvalue exit \ No newline at end of file diff --git a/Example/Solver/FullMat.supan b/Example/Solver/FullMat.supan index 5e02b3f4a..7fbde479a 100644 --- a/Example/Solver/FullMat.supan +++ b/Example/Solver/FullMat.supan @@ -21,18 +21,20 @@ set sparse_mat 0 analyze # Node 2: +# Coordinate: # 0.5000 0 # Displacement: # 0.1498 0.6417 # Resistance: -# 7.5862E-09 1.0000E+00 +# -2.2204e-16 1.0000e+00 # # Node 3: +# Coordinate: # 0.5000 0.5000 # Displacement: # -0.1665 0.6081 # Resistance: -# -6.2069E-09 1.0000E+00 +# 3.3307e-16 1.0000e+00 peek node 2 3 reset diff --git a/Example/Solver/GMRES.supan b/Example/Solver/GMRES.supan index b9fa60173..8daacd904 100644 --- a/Example/Solver/GMRES.supan +++ b/Example/Solver/GMRES.supan @@ -22,18 +22,20 @@ converger RelIncreDisp 1 1E-8 20 1 analyze # Node 2: +# Coordinate: # 0.5000 0 # Displacement: # 0.1498 0.6417 # Resistance: -# 7.5862E-09 1.0000E+00 +# -1.1102e-16 1.0000e+00 # # Node 3: +# Coordinate: # 0.5000 0.5000 # Displacement: # -0.1665 0.6081 # Resistance: -# -6.2069E-09 1.0000E+00 +# 4.4409e-16 1.0000e+00 peek node 2 3 reset diff --git a/Example/Solver/GSSSSOptimal.supan b/Example/Solver/GSSSSOptimal.supan index cf9495307..575cc51c6 100644 --- a/Example/Solver/GSSSSOptimal.supan +++ b/Example/Solver/GSSSSOptimal.supan @@ -9,7 +9,7 @@ element EB21 1 1 2 10 1 1 0 mass 2 2 10 1 -fix 1 P 1 +fix2 1 P 1 modifier Rayleigh 3 .2 .002 .0 .0 @@ -17,27 +17,28 @@ amplitude Tabular 1 EZ acceleration 2 1 .2 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size .05 set fixed_step_size 1 +set linear_system integrator GSSSSOptimal 1 .6 -converger RelIncreDisp 1 1E-4 4 1 +converger RelIncreDisp 1 1E-8 4 1 analyze # Node 2: # Coordinate: -# 0 1.0000 +# 0 1.0000 # Displacement: -# 0.0137 0 -0.0205 +# 0.0322 0 -0.0482 # Resistance: -# 4.5503 0 0.0169 +# 9.7595 0 0.0646 # Velocity: -# -0.0867 0 0.1299 +# 0.3811 0 -0.5858 # Acceleration: -# -0.3936 0 0.5893 +# 0.1950 0 -1.6547 peek node 2 peek integrator 1 diff --git a/Example/Solver/GSSSSU0.supan b/Example/Solver/GSSSSU0.supan index 0dc61d900..2d8022adc 100644 --- a/Example/Solver/GSSSSU0.supan +++ b/Example/Solver/GSSSSU0.supan @@ -9,7 +9,7 @@ element EB21 1 1 2 10 1 1 0 mass 2 2 10 1 -fix 1 P 1 +fix2 1 P 1 modifier Rayleigh 3 .2 .002 .0 .0 @@ -17,7 +17,7 @@ amplitude Tabular 1 EZ acceleration 2 1 .2 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size .05 set fixed_step_size 1 @@ -28,15 +28,16 @@ converger RelIncreDisp 1 1E-4 4 1 analyze # Node 2: -# 0 1.0000 +# Coordinate: +# 0 1.0000 # Displacement: -# 0.0130 0 -0.0195 +# 0.0333 0 -0.0498 # Resistance: -# 4.3305 0 0.0160 +# 10.0999 0 0.0672 # Velocity: -# -0.0917 0 0.1373 +# 0.3746 0 -0.5726 # Acceleration: -# -0.3770 0 0.5645 +# 0.3696 0 -1.6194 peek node 2 peek integrator 1 diff --git a/Example/Solver/GSSSSV0.supan b/Example/Solver/GSSSSV0.supan index 0a4187a0c..f380b902b 100644 --- a/Example/Solver/GSSSSV0.supan +++ b/Example/Solver/GSSSSV0.supan @@ -9,7 +9,7 @@ element EB21 1 1 2 10 1 1 0 mass 2 2 10 1 -fix 1 P 1 +fix2 1 P 1 modifier Rayleigh 3 .2 .002 .0 .0 @@ -17,7 +17,7 @@ amplitude Tabular 1 EZ acceleration 2 1 .2 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size .05 set fixed_step_size 1 @@ -28,15 +28,16 @@ converger RelIncreDisp 1 1E-4 4 1 analyze # Node 2: -# 0 1.0000 +# Coordinate: +# 0 1.0000 # Displacement: -# 0.0139 0 -0.0208 +# 0.0329 0 -0.0491 # Resistance: -# 4.5853 0 0.0170 +# 9.9584 0 0.0672 # Velocity: -# -0.0866 0 0.1297 +# 0.3755 0 -0.5750 # Acceleration: -# -0.4049 0 0.6062 +# 0.4176 0 -1.7028 peek node 2 peek integrator 1 diff --git a/Example/Solver/GeneralizedAlpha.supan b/Example/Solver/GeneralizedAlpha.supan index 892b95092..9a144ac16 100644 --- a/Example/Solver/GeneralizedAlpha.supan +++ b/Example/Solver/GeneralizedAlpha.supan @@ -9,7 +9,7 @@ element EB21 1 1 2 10 1 1 0 mass 2 2 10 1 -fix 1 P 1 +fix2 1 P 1 modifier Rayleigh 3 .2 .002 .0 .0 @@ -17,9 +17,10 @@ amplitude Tabular 1 EZ acceleration 2 1 .2 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size .05 set fixed_step_size 1 +set linear_system integrator GeneralizedAlpha 1 .6 @@ -28,15 +29,16 @@ converger RelIncreDisp 1 1E-4 4 1 analyze # Node 2: -# 0 1.0000 +# Coordinate: +# 0 1.0000 # Displacement: -# 0.0145 0 -0.0217 +# 0.0321 0 -0.0481 # Resistance: -# 4.3722 0 0.0162 +# 9.7372 0 0.0619 # Velocity: -# -0.0912 0 0.1365 +# 0.3776 0 -0.5775 # Acceleration: -# -0.4329 0 0.6482 +# 0.6774 0 -1.9255 peek node 2 peek integrator 1 diff --git a/Example/Solver/Lee.supan b/Example/Solver/Lee.supan index c479ad484..480d9c903 100644 --- a/Example/Solver/Lee.supan +++ b/Example/Solver/Lee.supan @@ -8,8 +8,8 @@ material Bilinear1D 1 100 1 .05 1. 1E-2 element T2D2 1 1 2 1 1 element Mass 2 2 100 1 -fix 1 1 1 -fix 2 2 1 2 +fix2 1 1 1 +fix2 2 2 1 2 hdf5recorder 1 Node U1 2 hdf5recorder 2 Node RF1 2 @@ -34,15 +34,15 @@ converger RelIncreDisp 2 1E-10 3 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 0.0102 0 +# 0.0102 0 # Resistance: -# 0.8333 0 +# 0.8333 0 # Velocity: -# 0.0026 0 +# 0.0026 0 # Acceleration: -# -0.0085 0 +# -0.0085 0 peek node 2 # save recorder 1 2 diff --git a/Example/Solver/LeeElemental.supan b/Example/Solver/LeeElemental.supan index 65cec86f7..eafc16eb7 100644 --- a/Example/Solver/LeeElemental.supan +++ b/Example/Solver/LeeElemental.supan @@ -36,15 +36,15 @@ converger RelIncreDisp 2 1E-10 3 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 0.0102 0 +# 0.0102 0 # Resistance: -# 0.8333 0 +# 0.8333 0 # Velocity: -# 0.0026 0 +# 0.0026 0 # Acceleration: -# -0.0085 0 +# -0.0085 0 peek node 2 # save recorder 1 2 diff --git a/Example/Solver/LeeFull.supan b/Example/Solver/LeeFull.supan index 3fad20c23..1eced6b98 100644 --- a/Example/Solver/LeeFull.supan +++ b/Example/Solver/LeeFull.supan @@ -5,7 +5,7 @@ node 2 1 0 material Elastic1D 1 100 -element T2D2 1 1 2 1 1 +element T2D2 1 1 2 1 1 1 1 1 element Mass 2 1 100 1 2 element Mass 3 2 100 1 2 @@ -51,15 +51,16 @@ converger RelIncreDisp 2 1E-10 10 1 analyze # Node 2: -# 1.0000 0 +# Coordinate: +# 1.0000 0 # Displacement: -# 0.1007 0 +# 0.0978 0 # Resistance: -# 10.0668 0 +# 8.5029 0 # Velocity: -# 0.0351 0 +# 0.0327 0 # Acceleration: -# -0.1077 0 +# -0.0905 0 peek node 2 # save recorder 1 2 3 diff --git a/Example/Solver/LeeFullElastic.supan b/Example/Solver/LeeFullElastic.supan new file mode 100644 index 000000000..adfeb065c --- /dev/null +++ b/Example/Solver/LeeFullElastic.supan @@ -0,0 +1,72 @@ +# A TEST MODEL FOR LEE DAMPING (FULL MODES) MODEL + +node 1 0 0 +node 2 1 0 + +material Elastic1D 1 100 + +element T2D2 1 1 2 1 1 +element Mass 2 1 100 1 2 +element Mass 3 2 100 1 2 + +fix 1 1 1 +fix 2 2 1 2 + +plainrecorder 1 Node U1 2 +plainrecorder 2 Node RF1 2 +plainrecorder 3 Node DF1 2 +plainrecorder 4 Node IF1 2 +plainrecorder 5 Node GDF1 2 +plainrecorder 6 Node GIF1 2 + +step static 1 1 +set ini_step_size .1 +set fixed_step_size 1 + +displacement 1 0 .2 1 2 + +converger RelIncreDisp 1 1E-10 3 1 + +step dynamic 2 6 +set ini_step_size .02 +set fixed_step_size 1 +set sparse_mat 1 +set system_solver SuperLU +set linear_system + +integrator LeeNewmarkFull 1 .25 .5 \ +-type0 .005 1 \ +-type1 .005 1 2 \ +-type1 .01 1 3 \ +-type2 .01 1 2 1 \ +-type2 .01 1 0 1 \ +-type2 .01 1 3 2 \ +-type3 .01 1 .5 \ +-type4 .01 1 0 1 1 0 2. \ +-type4 .01 1 1 1 1 0 2. \ +-type4 .01 1 0 1 1 1 2. \ +-type4 .01 1 1 1 1 1 2. + +converger RelIncreDisp 2 1E-10 10 1 + +analyze + +# Node 2: +# 1.0000 0 +# Displacement: +# 0.1007 0 +# Resistance: +# 10.0668 0 +# Velocity: +# 0.0351 0 +# Acceleration: +# -0.1077 0 +peek node 2 + +# save recorder 1 2 3 + +peek integrator 1 + +reset +clear +exit \ No newline at end of file diff --git a/Example/Solver/LeeFullIterative.supan b/Example/Solver/LeeFullIterative.supan index 8c0b61248..ee88705c1 100644 --- a/Example/Solver/LeeFullIterative.supan +++ b/Example/Solver/LeeFullIterative.supan @@ -53,15 +53,15 @@ converger RelIncreDisp 2 1E-10 10 1 analyze # Node 2: -# 1.0000 0 +# 1.0000 0 # Displacement: -# 0.1007 0 +# 0.1007 0 # Resistance: -# 10.0668 0 +# 10.0668 0 # Velocity: -# 0.0351 0 +# 0.0351 0 # Acceleration: -# -0.1077 0 +# -0.1077 0 peek node 2 # save recorder 1 2 3 diff --git a/Example/Solver/Momentum.supan b/Example/Solver/Momentum.supan index 975de1176..35cd46ac2 100644 --- a/Example/Solver/Momentum.supan +++ b/Example/Solver/Momentum.supan @@ -29,7 +29,7 @@ hdf5recorder 3 Global MOMENTUMY hdf5recorder 4 Node MOMENTUMX 2 3 4 hdf5recorder 5 Node MOMENTUMY 2 3 4 -step dynamic 1 10 +step dynamic 1 1 set ini_step_size 1E-3 set fixed_step_size 1 set symm_mat 0 @@ -40,6 +40,19 @@ converger RelIncreDisp 1 1E-10 10 1 analyze +# Node 4: +# Coordinate: +# 0 -5.0000 +# Displacement: +# 2.5699 8.2627 +# Resistance: +# 0 0 +# Velocity: +# 3.5857 1.0751 +# Acceleration: +# -1.7425 -15.4797 +peek node 4 + # save recorder 1 2 3 4 5 exit \ No newline at end of file diff --git a/Example/Solver/Newmark.supan b/Example/Solver/Newmark.supan index 3f978fb3c..28aed6237 100644 --- a/Example/Solver/Newmark.supan +++ b/Example/Solver/Newmark.supan @@ -27,7 +27,7 @@ modifier LumpedScale 1 1 modifier LumpedSimple 2 2 modifier Rayleigh 3 .2 .002 .0 .0 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size 5E-2 set fixed_step_size true @@ -38,15 +38,16 @@ converger RelIncreDisp 1 1E-10 4 1 analyze # Node 2: -# 0 1.0000 +# Coordinate: +# 0 1.0000 # Displacement: -# -0.0325 0.0372 0.0258 +# 0.0333 -0.0002 -0.0497 # Resistance: -# -2.1849 -0.0045 0.0009 +# 9.5880 0.1065 -0.0060 # Velocity: -# -0.0444 -0.0010 0.0642 +# 0.3181 -0.0050 -0.4666 # Acceleration: -# 0.2173 0.0041 -0.3138 +# -0.0593 -0.0836 -0.1654 peek node 2 peek integrator 1 diff --git a/Example/Solver/Newton.supan b/Example/Solver/Newton.supan index fe85f7814..af62d5504 100644 --- a/Example/Solver/Newton.supan +++ b/Example/Solver/Newton.supan @@ -23,11 +23,12 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 4.0000 0 +# Coordinate: +# 4.0000 0 # Displacement: -# -3.5333 14.8500 +# -3.5333 14.8500 # Resistance: -# 1.3333e-06 1.0000e+02 +# 2.8422e-14 1.0000e+02 peek node 2 peek solver 1 diff --git a/Example/Solver/PARDISO.supan b/Example/Solver/PARDISO.supan index 004a8937f..62183b2df 100644 --- a/Example/Solver/PARDISO.supan +++ b/Example/Solver/PARDISO.supan @@ -24,18 +24,20 @@ converger RelIncreDisp 1 1E-8 20 1 analyze # Node 2: +# Coordinate: # 0.5000 0 # Displacement: # 0.1498 0.6417 # Resistance: -# 7.5862E-09 1.0000E+00 +# -1.1102e-16 1.0000e+00 # # Node 3: +# Coordinate: # 0.5000 0.5000 # Displacement: # -0.1665 0.6081 # Resistance: -# -6.2069E-09 1.0000E+00 +# 0 1.0000 peek node 2 3 reset diff --git a/Example/Solver/Ramm.supan b/Example/Solver/Ramm.supan index e83ea2821..b380c09d2 100644 --- a/Example/Solver/Ramm.supan +++ b/Example/Solver/Ramm.supan @@ -46,16 +46,17 @@ step arclength 1 11 2 -20 criterion MinDisplacement 1 11 2 -5.5 -converger RelIncreDisp 1 1E-8 5 1 +converger RelIncreDisp 1 1E-10 4 1 analyze # Node 11: -# 2.0000 8.0000 +# Coordinate: +# 2.0000 8.0000 # Displacement: -# 5.9350 -5.5107 0.6801 +# 5.9364 -5.5092 0.6794 # Resistance: -# 1.4495e-10 -1.0647e+01 3.9790e-13 +# -1.2223e-09 -1.0142e+01 1.8190e-12 peek node 11 # save recorder 1 diff --git a/Example/Solver/RayleighNewmark.supan b/Example/Solver/RayleighNewmark.supan index 4edff4885..c36411b92 100644 --- a/Example/Solver/RayleighNewmark.supan +++ b/Example/Solver/RayleighNewmark.supan @@ -9,7 +9,7 @@ element EB21 1 1 2 10 1 1 false mass 2 2 10 1 -fix 1 P 1 +fix2 1 P 1 amplitude Tabular 1 EZ @@ -17,7 +17,7 @@ acceleration 2 1 .2 1 2 hdf5recorder 1 Node U 2 -step dynamic 1 30 +step dynamic 1 1 set ini_step_size .02 set fixed_step_size 1 set sparse_mat 1 @@ -29,15 +29,16 @@ converger RelIncreDisp 1 1E-10 10 1 analyze # Node 2: -# 0 1.0000 +# Coordinate: +# 0 1.0000 # Displacement: -# -4.9125e-07 0 7.3550e-07 +# 0.0277 0 -0.0414 # Resistance: -# -1.4820e-04 0 -5.4887e-07 +# 8.3919 0 0.0551 # Velocity: -# -6.1240e-06 0 9.1689e-06 +# 0.2979 0 -0.4467 # Acceleration: -# 2.3678e-05 0 -3.5452e-05 +# -0.3311 0 0.5499 peek node 2 peek integrator 1 diff --git a/Example/Solver/SHALLOW.ARC.supan b/Example/Solver/SHALLOW.ARC.supan index 6de238b23..3c736ad55 100644 --- a/Example/Solver/SHALLOW.ARC.supan +++ b/Example/Solver/SHALLOW.ARC.supan @@ -61,11 +61,11 @@ converger RelIncreDisp 1 1E-4 4 1 analyze # Node 7: -# 4.0223 0.8396 +# 4.0223 0.8396 # Displacement: -# 0.0168 -1.8050 0.1679 +# 0.0168 -1.8050 0.1679 # Resistance: -# -1.4197e-10 -1.8196e+02 -2.2510e-11 +# -1.4197e-10 -1.8196e+02 -2.2510e-11 peek node 7 # save recorder 1 diff --git a/Example/Solver/SuperLU.supan b/Example/Solver/SuperLU.supan index 0c81047f6..4beed7857 100644 --- a/Example/Solver/SuperLU.supan +++ b/Example/Solver/SuperLU.supan @@ -22,18 +22,20 @@ converger RelIncreDisp 1 1E-8 20 1 analyze # Node 2: +# Coordinate: # 0.5000 0 # Displacement: # 0.1498 0.6417 # Resistance: -# 7.5862E-09 1.0000E+00 +# 5.5511e-16 1.0000e+00 # # Node 3: +# Coordinate: # 0.5000 0.5000 # Displacement: # -0.1665 0.6081 # Resistance: -# -6.2069E-09 1.0000E+00 +# -6.6613e-16 1.0000e+00 peek node 2 3 reset diff --git a/Example/Solver/SupportMotion.supan b/Example/Solver/SupportMotion.supan index a6eeb364b..ed07cc8f2 100644 --- a/Example/Solver/SupportMotion.supan +++ b/Example/Solver/SupportMotion.supan @@ -23,7 +23,7 @@ disable load 3 hdf5recorder 1 Node U1 1 2 -step dynamic 1 1E-1 +step dynamic 1 1 set ini_step_size 5E-2 set fixed_step_size true @@ -37,6 +37,17 @@ precheck analyze +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -1.3590e-01 8.7663e-19 4.3882e-02 +# Resistance: +# -9.0734e+00 8.4743e-16 -1.4851e-01 +# Velocity: +# -3.2678e-01 6.4794e-18 6.3610e-01 +# Acceleration: +# 7.0548e-01 -8.4457e-16 5.5854e+00 peek node 1 2 clear diff --git a/Example/Solver/SupportMotionA.supan b/Example/Solver/SupportMotionA.supan index 61d47830e..527524ac2 100644 --- a/Example/Solver/SupportMotionA.supan +++ b/Example/Solver/SupportMotionA.supan @@ -20,7 +20,7 @@ supportacceleration 2 1 .2 1 1 hdf5recorder 1 Node U1 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size 5E-2 set fixed_step_size true @@ -30,6 +30,17 @@ converger RelIncreDisp 1 1E-10 4 1 analyze +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -1.2663e-01 -3.3999e-20 5.4934e-02 +# Resistance: +# -1.1005e+01 -3.0365e-16 -9.0983e-03 +# Velocity: +# -2.4057e-01 -3.0945e-18 5.0382e-01 +# Acceleration: +# 1.0892e+00 4.6432e-17 -8.2083e+00 peek node 1 2 exit \ No newline at end of file diff --git a/Example/Solver/SupportMotionBatheA.supan b/Example/Solver/SupportMotionBatheA.supan index 002f90930..c39950881 100644 --- a/Example/Solver/SupportMotionBatheA.supan +++ b/Example/Solver/SupportMotionBatheA.supan @@ -20,16 +20,27 @@ supportacceleration 2 1 .2 1 1 hdf5recorder 1 Node U1 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size 1E-2 set fixed_step_size true -integrator BatheTwoStep 1 +integrator BatheTwoStep 1 .2 .1 converger RelIncreDisp 1 1E-10 4 1 analyze +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -1.4767e-01 9.6137e-20 5.6186e-02 +# Resistance: +# -1.1508e+01 -2.6611e-16 -1.3546e-01 +# Velocity: +# -3.2038e-01 8.3929e-19 6.0273e-01 +# Acceleration: +# 1.0702e+00 3.5935e-16 2.9524e+00 peek node 1 2 # save recorder 1 diff --git a/Example/Solver/SupportMotionBatheV.supan b/Example/Solver/SupportMotionBatheV.supan index 3f02f863a..81db28674 100644 --- a/Example/Solver/SupportMotionBatheV.supan +++ b/Example/Solver/SupportMotionBatheV.supan @@ -20,16 +20,27 @@ supportvelocity 2 1 .2 1 1 hdf5recorder 1 Node U1 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size 1E-2 set fixed_step_size true -integrator BatheTwoStep 1 +integrator BatheTwoStep 1 .2 converger RelIncreDisp 1 1E-10 4 1 analyze +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -3.0649e-01 2.4660e-18 6.0049e-01 +# Resistance: +# -1.1055e+02 4.0147e-15 4.7749e+00 +# Velocity: +# 1.1059e+00 -1.6142e-16 -7.6754e-03 +# Acceleration: +# 1.3227e+01 -7.0120e-15 -2.8148e+02 peek node 1 2 # save recorder 1 diff --git a/Example/Solver/SupportMotionD.supan b/Example/Solver/SupportMotionD.supan index 25850b43a..9a6736742 100644 --- a/Example/Solver/SupportMotionD.supan +++ b/Example/Solver/SupportMotionD.supan @@ -20,7 +20,7 @@ supportdisplacement 2 1 .2 1 1 hdf5recorder 1 Node U1 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size 5E-2 set fixed_step_size true @@ -30,6 +30,17 @@ converger RelIncreDisp 1 1E-10 4 1 analyze +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# 1.0892e+00 2.1307e-17 -8.2083e+00 +# Resistance: +# -4.7306e+03 1.2609e-13 -3.1861e+03 +# Velocity: +# 8.4889e+00 1.0537e-15 1.2187e+03 +# Acceleration: +# -2.5940e+03 -8.3703e-14 1.1645e+06 peek node 1 2 exit \ No newline at end of file diff --git a/Example/Solver/SupportMotionGAE.supan b/Example/Solver/SupportMotionGAE.supan new file mode 100644 index 000000000..c0a79d151 --- /dev/null +++ b/Example/Solver/SupportMotionGAE.supan @@ -0,0 +1,50 @@ +# A TEST MODEL FOR SUPPORTMOTION INTEGRATOR + +node 1 0 0 +node 2 0 1 + +material Elastic1D 1 100 + +section Rectangle2D 1 12 1 1 + +element B21 1 1 2 1 6 + +element MassPoint2D 2 1 11 11 +element MassPoint2D 3 2 22 22 + +fix2 1 2 1 +fix2 2 3 1 + +amplitude Tabular 1 EZ + +supportacceleration 2 1 .2 1 1 + +hdf5recorder 1 Node U1 1 2 + +step explicitdynamic 1 1 +set ini_step_size 1E-3 +set fixed_step_size true +set linear_system + +integrator GeneralisedAlphaExplicit 1 .6 + +converger AbsIncreAcc 1 1E-10 4 0 + +analyze + +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -1.1062e-01 5.2650e-20 -4.1510e-02 +# Resistance: +# -3.2336e+01 -5.2215e-16 -2.0319e+01 +# Velocity: +# 9.9993e-03 4.1454e-19 7.5238e-02 +# Acceleration: +# 1.4698e+00 1.7756e-17 9.2360e-01 +peek node 1 2 + +peek integrator 1 + +exit \ No newline at end of file diff --git a/Example/Solver/SupportMotionGSSSSA.supan b/Example/Solver/SupportMotionGSSSSA.supan index 156c733c6..86678db83 100644 --- a/Example/Solver/SupportMotionGSSSSA.supan +++ b/Example/Solver/SupportMotionGSSSSA.supan @@ -11,8 +11,8 @@ element B21 1 1 2 1 6 mass 2 2 10 1 -fix 1 2 1 -fix 2 3 1 +fix2 1 2 1 +fix2 2 3 1 amplitude Tabular 1 EZ @@ -20,7 +20,7 @@ supportacceleration 2 1 .2 1 1 hdf5recorder 1 Node U1 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size 1E-2 set fixed_step_size true @@ -30,8 +30,21 @@ converger RelIncreDisp 1 1E-10 4 1 analyze +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -1.4281e-01 6.3982e-19 5.7279e-02 +# Resistance: +# -1.1586e+01 6.2720e-16 -6.4907e-02 +# Velocity: +# -3.0230e-01 -6.6369e-20 6.0667e-01 +# Acceleration: +# 1.0789e+00 -2.6537e-16 -1.8176e+00 peek node 1 2 +peek integrator 1 + # save recorder 1 exit \ No newline at end of file diff --git a/Example/Solver/SupportMotionGSSSSV.supan b/Example/Solver/SupportMotionGSSSSV.supan index c2fa424d0..d683a8f5b 100644 --- a/Example/Solver/SupportMotionGSSSSV.supan +++ b/Example/Solver/SupportMotionGSSSSV.supan @@ -11,8 +11,8 @@ element B21 1 1 2 1 6 mass 2 2 10 1 -fix 1 2 1 -fix 2 3 1 +fix2 1 2 1 +fix2 2 3 1 amplitude Tabular 1 EZ @@ -20,7 +20,7 @@ supportvelocity 2 1 .2 1 1 hdf5recorder 1 Node U1 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size 1E-2 set fixed_step_size true @@ -30,6 +30,17 @@ converger RelIncreDisp 1 1E-10 4 1 analyze +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -3.0497e-01 2.9176e-18 6.1005e-01 +# Resistance: +# -1.0254e+02 3.2517e-15 9.7347e+00 +# Velocity: +# 1.0789e+00 -6.4215e-18 -1.8176e+00 +# Acceleration: +# 1.5064e+01 5.2593e-16 -7.4586e+02 peek node 1 2 # save recorder 1 diff --git a/Example/Solver/SupportMotionOALTSA.supan b/Example/Solver/SupportMotionOALTSA.supan new file mode 100644 index 000000000..c35c9cbf8 --- /dev/null +++ b/Example/Solver/SupportMotionOALTSA.supan @@ -0,0 +1,50 @@ +# A TEST MODEL FOR SUPPORTMOTION INTEGRATOR + +node 1 0 0 +node 2 0 1 + +material Elastic1D 1 100 .1 + +section Rectangle2D 1 12 1 1 + +element B21 1 1 2 1 6 + +mass 2 2 10 1 + +fix 1 2 1 +fix 2 3 1 + +amplitude Tabular 1 EZ + +supportacceleration 2 1 .2 1 1 + +hdf5recorder 1 Node U1 1 2 + +step dynamic 1 1 +set ini_step_size 1E-2 +set fixed_step_size true + +integrator OALTS 1 .8 + +converger RelIncreDisp 1 1E-10 4 1 + +analyze + +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -1.4318e-01 -1.0060e-19 5.7916e-02 +# Resistance: +# -1.1795e+01 -4.2724e-16 -1.0590e-01 +# Velocity: +# -3.0084e-01 -3.6004e-18 5.6560e-01 +# Acceleration: +# 1.1147e+00 4.7558e-16 1.2138e-01 +peek node 1 2 + +peek integrator 1 + +# save recorder 1 + +exit \ No newline at end of file diff --git a/Example/Solver/SupportMotionOALTSV.supan b/Example/Solver/SupportMotionOALTSV.supan new file mode 100644 index 000000000..04e690cb1 --- /dev/null +++ b/Example/Solver/SupportMotionOALTSV.supan @@ -0,0 +1,50 @@ +# A TEST MODEL FOR SUPPORTMOTION INTEGRATOR + +node 1 0 0 +node 2 0 1 + +material Elastic1D 1 100 .1 + +section Rectangle2D 1 12 1 1 + +element B21 1 1 2 1 6 + +mass 2 2 10 1 + +fix 1 2 1 +fix 2 3 1 + +amplitude Tabular 1 EZ + +supportvelocity 2 1 .2 1 1 + +hdf5recorder 1 Node U1 1 2 + +step dynamic 1 1 +set ini_step_size 1E-2 +set fixed_step_size true + +integrator OALTS 1 .5 + +converger RelIncreDisp 1 1E-10 4 1 + +analyze + +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -3.0098e-01 2.5323e-18 6.0977e-01 +# Resistance: +# -1.0322e+02 5.8638e-15 9.3686e+00 +# Velocity: +# 1.1299e+00 1.2093e-16 -3.3723e+00 +# Acceleration: +# 1.4985e+01 5.2548e-15 -6.8136e+02 +peek node 1 2 + +# save recorder 1 + +reset +clear +exit \ No newline at end of file diff --git a/Example/Solver/SupportMotionTchamwaA.supan b/Example/Solver/SupportMotionTchamwaA.supan new file mode 100644 index 000000000..c5713987d --- /dev/null +++ b/Example/Solver/SupportMotionTchamwaA.supan @@ -0,0 +1,48 @@ +# A TEST MODEL FOR SUPPORTMOTION INTEGRATOR + +node 1 0 0 +node 2 0 1 + +material Elastic1D 1 100 + +section Rectangle2D 1 12 1 1 + +element B21 1 1 2 1 6 + +element MassPoint2D 2 1 11 11 +element MassPoint2D 3 2 22 22 + +fix2 1 2 1 +fix2 2 3 1 + +amplitude Tabular 1 EZ + +supportacceleration 2 1 .2 1 1 + +hdf5recorder 1 Node U1 1 2 + +step explicitdynamic 1 1 +set ini_step_size 1E-3 +set fixed_step_size true +set linear_system + +integrator Tchamwa 1 .6 + +converger AbsIncreAcc 1 1E-10 4 0 + +analyze + +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -1.1056e-01 -7.4072e-20 -4.1445e-02 +# Resistance: +# -3.2250e+01 -4.2338e-16 -2.0270e+01 +# Velocity: +# 8.8158e-03 -5.2947e-19 7.4556e-02 +# Acceleration: +# 1.4659e+00 1.9244e-17 9.2135e-01 +peek node 1 2 + +exit \ No newline at end of file diff --git a/Example/Solver/SupportMotionV.supan b/Example/Solver/SupportMotionV.supan index 60556dbc7..16bfd4673 100644 --- a/Example/Solver/SupportMotionV.supan +++ b/Example/Solver/SupportMotionV.supan @@ -20,7 +20,7 @@ supportvelocity 2 1 .2 1 1 hdf5recorder 1 Node U1 1 2 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size 5E-2 set fixed_step_size true @@ -30,6 +30,17 @@ converger RelIncreDisp 1 1E-10 4 1 analyze +# Node 2: +# Coordinate: +# 0 1.0000 +# Displacement: +# -2.4057e-01 1.8586e-19 5.0382e-01 +# Resistance: +# -9.6640e+01 1.9287e-15 2.0618e+00 +# Velocity: +# 1.0892e+00 -8.5672e-17 -8.2083e+00 +# Acceleration: +# 8.4889e+00 -4.2898e-15 1.2187e+03 peek node 1 2 exit \ No newline at end of file diff --git a/Example/Solver/SymmPack.supan b/Example/Solver/SymmPack.supan index 2c82a6cf1..ce2ae3120 100644 --- a/Example/Solver/SymmPack.supan +++ b/Example/Solver/SymmPack.supan @@ -21,18 +21,20 @@ set sparse_mat 0 analyze # Node 2: +# Coordinate: # 0.5000 0 # Displacement: # 0.1498 0.6417 # Resistance: -# 7.5862E-09 1.0000E+00 +# 0 1.0000 # # Node 3: +# Coordinate: # 0.5000 0.5000 # Displacement: # -0.1665 0.6081 # Resistance: -# -6.2069E-09 1.0000E+00 +# -1.1102e-16 1.0000e+00 peek node 2 3 reset diff --git a/Example/Solver/TabularSpline.supan b/Example/Solver/TabularSpline.supan index b511ff705..7ace6e05c 100644 --- a/Example/Solver/TabularSpline.supan +++ b/Example/Solver/TabularSpline.supan @@ -24,7 +24,7 @@ modifier LumpedScale 1 1 modifier LumpedSimple 2 2 modifier Rayleigh 3 .2 .002 .0 .0 -step dynamic 1 25 +step dynamic 1 1 set ini_step_size 1E-2 set fixed_step_size true @@ -36,15 +36,15 @@ analyze # Node 2: # Coordinate: -# 0 1.0000 +# 0 1.0000 # Displacement: -# -0.0280 0.0486 0.0139 +# 0.0323 -0.0002 -0.0487 # Resistance: -# -1.1386 -0.0005 0.0004 +# 9.8137 0.0958 -0.0076 # Velocity: -# -0.0558 -0.0011 0.0798 +# 0.3721 -0.0057 -0.5421 # Acceleration: -# 0.1214 0.0007 -0.1740 +# -0.3431 -0.0771 1.3227 peek node 2 peek integrator 1 diff --git a/Example/Solver/Tchamwa.supan b/Example/Solver/Tchamwa.supan new file mode 100644 index 000000000..533bbfcbe --- /dev/null +++ b/Example/Solver/Tchamwa.supan @@ -0,0 +1,59 @@ +node 1 0 0 +node 2 0 -2 +node 3 0 -3 +node 4 0 -5 + +material Elastic1D 1 1E7 + +element T2D2 1 1 2 1 1 true +element T2D2 2 2 3 1 1 true +element T2D2 3 3 4 1 1 true + +element Mass 4 1 10 1 2 +element Mass 5 2 20 1 2 +element Mass 6 3 30 1 2 +element Mass 7 4 40 1 2 + +fix2 1 P 1 + +initial velocity 25 1 3 + +amplitude Constant 1 +cload 1 1 -200 2 2 +cload 2 1 -100 2 3 +cload 3 1 -200 2 4 + +hdf5recorder 1 Node U 2 3 4 + +step explicitdynamic 1 1 +set ini_step_size 1E-3 +set fixed_step_size 1 +set symm_mat 0 +set linear_system + +integrator Tchamwa 1 + +converger RelIncreAcc 1 1E-10 10 0 + +analyze + +# Node 2: +# Coordinate: +# 0 -2.0000 +# Displacement: +# -1.8359 2.7823 +# Resistance: +# 7.6666e+03 -1.1685e+04 +# Velocity: +# 0.4647 -1.8641 +# Acceleration: +# -3.8333e+02 5.7425e+02 +peek node 1 2 3 4 + +peek integrator 1 + +# save recorder 1 + +reset +clear +exit \ No newline at end of file diff --git a/Example/Solver/WilsonPenzien.supan b/Example/Solver/WilsonPenzien.supan index 96e890438..99a4d5cd7 100644 --- a/Example/Solver/WilsonPenzien.supan +++ b/Example/Solver/WilsonPenzien.supan @@ -30,15 +30,16 @@ converger RelIncreDisp 2 1E-10 3 1 analyze # Node 2: -# 1.0000 0 +# Coordinate: +# 1.0000 0 # Displacement: -# -2.2334e-19 1.3646e-01 2.0368e-01 +# 2.2366e-19 1.3646e-01 2.0368e-01 # Resistance: -# -2.6801e-17 4.1541e+00 -4.0213e-02 +# 2.6840e-17 4.1541e+00 -4.0213e-02 # Velocity: -# -6.9977e-20 -8.2125e-01 -1.5051e+00 +# 2.1517e-18 -8.2125e-01 -1.5051e+00 # Acceleration: -# 3.9755e-16 -3.4511e+00 1.4432e+01 +# -3.2944e-16 -3.4511e+00 1.4432e+01 peek node 2 peek integrator 1 diff --git a/Example/Solver/mNewton.supan b/Example/Solver/mNewton.supan index 475c39114..922a3a4ae 100644 --- a/Example/Solver/mNewton.supan +++ b/Example/Solver/mNewton.supan @@ -14,7 +14,7 @@ fix 1 P 1 3 step static 1 solver mNewton 1 -set ini_step_size .1 +set ini_step_size 1E-2 cload 1 0 100 2 2 @@ -23,11 +23,12 @@ converger RelIncreDisp 1 1E-8 10 1 analyze # Node 2: -# 4.0000 0 +# Coordinate: +# 4.0000 0 # Displacement: -# -3.5333 14.8500 +# -3.5333 14.8500 # Resistance: -# 1.3333e-06 1.0000e+02 +# -2.1095e-09 1.0000e+02 peek node 2 peek solver 1 diff --git a/Example/Solver/mumps.supan b/Example/Solver/mumps.supan index 5e7c22485..cf94685d0 100644 --- a/Example/Solver/mumps.supan +++ b/Example/Solver/mumps.supan @@ -23,11 +23,11 @@ converger RelIncreDisp 1 1E-10 4 1 analyze # Node 2: -# 4.0000 0 +# 4.0000 0 # Displacement: -# 1.2000 0 +# 1.2000 0 # Resistance: -# 1.0000e+02 0 +# 1.0000e+02 0 peek node 2 peek element 1 diff --git a/Include/armadillo/armadillo b/Include/armadillo/armadillo index 0c2e51d6c..a17ddb7b1 100644 --- a/Include/armadillo/armadillo +++ b/Include/armadillo/armadillo @@ -53,11 +53,29 @@ #endif #if defined(ARMA_USE_TBB_ALLOC) - #include + #if defined(__has_include) + #if __has_include() + #include + #else + #undef ARMA_USE_TBB_ALLOC + #pragma message ("WARNING: use of TBB alloc disabled; tbb/scalable_allocator.h header not found") + #endif + #else + #include + #endif #endif #if defined(ARMA_USE_MKL_ALLOC) - #include + #if defined(__has_include) + #if __has_include() + #include + #else + #undef ARMA_USE_MKL_ALLOC + #pragma message ("WARNING: use of MKL alloc disabled; mkl_service.h header not found") + #endif + #else + #include + #endif #endif #if ( defined(__unix__) || defined(__unix) || defined(_POSIX_C_SOURCE) || (defined(__APPLE__) && defined(__MACH__)) ) && !defined(_WIN32) @@ -69,7 +87,16 @@ #if defined(ARMA_USE_OPENMP) - #include + #if defined(__has_include) + #if __has_include() + #include + #else + #undef ARMA_USE_OPENMP + #pragma message ("WARNING: use of OpenMP disabled; omp.h header not found") + #endif + #else + #include + #endif #endif @@ -205,7 +232,6 @@ namespace arma #include "armadillo_bits/eop_core_bones.hpp" #include "armadillo_bits/eglue_core_bones.hpp" - #include "armadillo_bits/GenSpecialiser.hpp" #include "armadillo_bits/Gen_bones.hpp" #include "armadillo_bits/GenCube_bones.hpp" @@ -274,6 +300,7 @@ namespace arma #include "armadillo_bits/op_wishrnd_bones.hpp" #include "armadillo_bits/op_roots_bones.hpp" #include "armadillo_bits/op_cond_bones.hpp" + #include "armadillo_bits/op_rcond_bones.hpp" #include "armadillo_bits/op_sp_plus_bones.hpp" #include "armadillo_bits/op_sp_minus_bones.hpp" #include "armadillo_bits/op_powmat_bones.hpp" @@ -303,6 +330,7 @@ namespace arma #include "armadillo_bits/glue_affmul_bones.hpp" #include "armadillo_bits/glue_mvnrnd_bones.hpp" #include "armadillo_bits/glue_quantile_bones.hpp" + #include "armadillo_bits/glue_powext_bones.hpp" #include "armadillo_bits/gmm_misc_bones.hpp" #include "armadillo_bits/gmm_diag_bones.hpp" @@ -503,7 +531,7 @@ namespace arma #include "armadillo_bits/fn_inplace_trans.hpp" #include "armadillo_bits/fn_randi.hpp" #include "armadillo_bits/fn_randg.hpp" - #include "armadillo_bits/fn_cond.hpp" + #include "armadillo_bits/fn_cond_rcond.hpp" #include "armadillo_bits/fn_normalise.hpp" #include "armadillo_bits/fn_clamp.hpp" #include "armadillo_bits/fn_expmat.hpp" @@ -532,6 +560,7 @@ namespace arma #include "armadillo_bits/fn_randperm.hpp" #include "armadillo_bits/fn_quantile.hpp" #include "armadillo_bits/fn_powmat.hpp" + #include "armadillo_bits/fn_powext.hpp" #include "armadillo_bits/fn_speye.hpp" #include "armadillo_bits/fn_spones.hpp" @@ -706,6 +735,7 @@ namespace arma #include "armadillo_bits/op_wishrnd_meat.hpp" #include "armadillo_bits/op_roots_meat.hpp" #include "armadillo_bits/op_cond_meat.hpp" + #include "armadillo_bits/op_rcond_meat.hpp" #include "armadillo_bits/op_sp_plus_meat.hpp" #include "armadillo_bits/op_sp_minus_meat.hpp" #include "armadillo_bits/op_powmat_meat.hpp" @@ -735,6 +765,7 @@ namespace arma #include "armadillo_bits/glue_affmul_meat.hpp" #include "armadillo_bits/glue_mvnrnd_meat.hpp" #include "armadillo_bits/glue_quantile_meat.hpp" + #include "armadillo_bits/glue_powext_meat.hpp" #include "armadillo_bits/gmm_misc_meat.hpp" #include "armadillo_bits/gmm_diag_meat.hpp" diff --git a/Include/armadillo/armadillo_bits/Col_bones.hpp b/Include/armadillo/armadillo_bits/Col_bones.hpp index 8e5606593..d91c89124 100644 --- a/Include/armadillo/armadillo_bits/Col_bones.hpp +++ b/Include/armadillo/armadillo_bits/Col_bones.hpp @@ -88,7 +88,7 @@ class Col : public Mat inline Col(const subview_cube& X); inline Col& operator=(const subview_cube& X); - arma_cold inline mat_injector operator<<(const eT val); + arma_deprecated inline mat_injector operator<<(const eT val); arma_inline arma_warn_unused const Op,op_htrans> t() const; arma_inline arma_warn_unused const Op,op_htrans> ht() const; @@ -138,7 +138,9 @@ class Col : public Mat template inline void shed_rows(const Base& indices); - inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero = true); + arma_deprecated inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero); + inline void insert_rows(const uword row_num, const uword N); + template inline void insert_rows(const uword row_num, const Base& X); diff --git a/Include/armadillo/armadillo_bits/Col_meat.hpp b/Include/armadillo/armadillo_bits/Col_meat.hpp index 9383bdbf9..c59ab0298 100644 --- a/Include/armadillo/armadillo_bits/Col_meat.hpp +++ b/Include/armadillo/armadillo_bits/Col_meat.hpp @@ -51,12 +51,11 @@ Col::Col(const uword in_n_elem) { arma_extra_debug_sigprint(); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Col::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } - #endif } @@ -70,12 +69,11 @@ Col::Col(const uword in_n_rows, const uword in_n_cols) Mat::init_warm(in_n_rows, in_n_cols); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Col::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } - #endif } @@ -89,12 +87,11 @@ Col::Col(const SizeMat& s) Mat::init_warm(s.n_rows, s.n_cols); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Col::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } - #endif } @@ -314,10 +311,9 @@ Col::Col(const std::vector& x) { arma_extra_debug_sigprint_this(this); - if(x.size() > 0) - { - arrayops::copy( Mat::memptr(), &(x[0]), uword(x.size()) ); - } + const uword N = uword(x.size()); + + if(N > 0) { arrayops::copy( Mat::memptr(), &(x[0]), N ); } } @@ -330,12 +326,11 @@ Col::operator=(const std::vector& x) { arma_extra_debug_sigprint(); - Mat::init_warm(uword(x.size()), 1); + const uword N = uword(x.size()); - if(x.size() > 0) - { - arrayops::copy( Mat::memptr(), &(x[0]), uword(x.size()) ); - } + Mat::init_warm(N, 1); + + if(N > 0) { arrayops::copy( Mat::memptr(), &(x[0]), N ); } return *this; } @@ -345,11 +340,13 @@ Col::operator=(const std::vector& x) template inline Col::Col(const std::initializer_list& list) - : Mat(arma_vec_indicator(), 1) + : Mat(arma_vec_indicator(), uword(list.size()), 1, 1) { - arma_extra_debug_sigprint(); + arma_extra_debug_sigprint_this(this); - (*this).operator=(list); + const uword N = uword(list.size()); + + if(N > 0) { arrayops::copy( Mat::memptr(), list.begin(), N ); } } @@ -361,14 +358,11 @@ Col::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); - Mat tmp(list); + const uword N = uword(list.size()); - arma_debug_check( ((tmp.n_elem > 0) && (tmp.is_vec() == false)), "Mat::init(): requested size is not compatible with column vector layout" ); + Mat::init_warm(N, 1); - access::rw(tmp.n_rows) = tmp.n_elem; - access::rw(tmp.n_cols) = 1; - - (*this).steal_mem(tmp); + if(N > 0) { arrayops::copy( Mat::memptr(), list.begin(), N ); } return *this; } @@ -424,15 +418,7 @@ Col::operator=(Col&& X) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); - (*this).steal_mem(X); - - if( (X.mem_state == 0) && (X.n_alloc <= arma_config::mat_prealloc) && (this != &X) ) - { - access::rw(X.n_rows) = 0; - access::rw(X.n_cols) = 1; - access::rw(X.n_elem) = 0; - access::rw(X.mem) = nullptr; - } + (*this).steal_mem(X, true); return *this; } @@ -625,7 +611,7 @@ Col::operator=(const subview_cube& X) template inline -arma_cold +arma_deprecated mat_injector< Col > Col::operator<<(const eT val) { @@ -1068,15 +1054,28 @@ Col::shed_rows(const Base& indices) -//! insert N rows at the specified row position, -//! optionally setting the elements of the inserted rows to zero template +arma_deprecated inline void Col::insert_rows(const uword row_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); + arma_ignore(set_to_zero); + + (*this).insert_rows(row_num, N); + } + + + +template +inline +void +Col::insert_rows(const uword row_num, const uword N) + { + arma_extra_debug_sigprint(); + const uword t_n_rows = Mat::n_rows; const uword A_n_rows = row_num; @@ -1085,30 +1084,26 @@ Col::insert_rows(const uword row_num, const uword N, const bool set_to_zero) // insertion at row_num == n_rows is in effect an append operation arma_debug_check_bounds( (row_num > t_n_rows), "Col::insert_rows(): index out of bounds" ); - if(N > 0) + if(N == 0) { return; } + + Col out(t_n_rows + N, arma_nozeros_indicator()); + + eT* out_mem = out.memptr(); + const eT* t_mem = (*this).memptr(); + + if(A_n_rows > 0) { - Col out(t_n_rows + N, arma_nozeros_indicator()); - - eT* out_mem = out.memptr(); - const eT* t_mem = (*this).memptr(); - - if(A_n_rows > 0) - { - arrayops::copy( out_mem, t_mem, A_n_rows ); - } - - if(B_n_rows > 0) - { - arrayops::copy( &(out_mem[row_num + N]), &(t_mem[row_num]), B_n_rows ); - } - - if(set_to_zero) - { - arrayops::inplace_set( &(out_mem[row_num]), eT(0), N ); - } - - Mat::steal_mem(out); + arrayops::copy( out_mem, t_mem, A_n_rows ); } + + if(B_n_rows > 0) + { + arrayops::copy( &(out_mem[row_num + N]), &(t_mem[row_num]), B_n_rows ); + } + + arrayops::fill_zeros( &(out_mem[row_num]), N ); + + Mat::steal_mem(out); } @@ -1236,7 +1231,7 @@ Col::fixed::fixed() { arma_extra_debug_sigprint_this(this); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Col::fixed::constructor: zeroing memory"); @@ -1244,7 +1239,6 @@ Col::fixed::fixed() arrayops::inplace_set_fixed( mem_use, eT(0) ); } - #endif } diff --git a/Include/armadillo/armadillo_bits/Cube_bones.hpp b/Include/armadillo/armadillo_bits/Cube_bones.hpp index d42fbb0c2..c15e1ec26 100644 --- a/Include/armadillo/armadillo_bits/Cube_bones.hpp +++ b/Include/armadillo/armadillo_bits/Cube_bones.hpp @@ -39,13 +39,13 @@ class Cube : public BaseCube< eT, Cube > typedef eT elem_type; //!< the type of elements stored in the cube typedef typename get_pod_type::result pod_type; //!< if eT is std::complex, pod_type is T; otherwise pod_type is eT - const uword n_rows; //!< number of rows in each slice (read-only) - const uword n_cols; //!< number of columns in each slice (read-only) - const uword n_elem_slice; //!< number of elements in each slice (read-only) - const uword n_slices; //!< number of slices in the cube (read-only) - const uword n_elem; //!< number of elements in the cube (read-only) - const uword n_alloc; //!< number of allocated elements (read-only); NOTE: n_alloc can be 0, even if n_elem > 0 - const uword mem_state; + const uword n_rows; //!< number of rows in each slice (read-only) + const uword n_cols; //!< number of columns in each slice (read-only) + const uword n_elem_slice; //!< number of elements in each slice (read-only) + const uword n_slices; //!< number of slices in the cube (read-only) + const uword n_elem; //!< number of elements in the cube (read-only) + const uword n_alloc; //!< number of allocated elements (read-only); NOTE: n_alloc can be 0, even if n_elem > 0 + const uword mem_state; // mem_state = 0: normal cube which manages its own memory // mem_state = 1: use auxiliary memory until a size change @@ -57,10 +57,27 @@ class Cube : public BaseCube< eT, Cube > protected: - arma_aligned const Mat** const mat_ptrs; + using mat_type = Mat; + + #if defined(ARMA_USE_OPENMP) + using raw_mat_ptr_type = mat_type*; + using atomic_mat_ptr_type = mat_type*; + #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) + using raw_mat_ptr_type = mat_type*; + using atomic_mat_ptr_type = std::atomic; + #else + using raw_mat_ptr_type = mat_type*; + using atomic_mat_ptr_type = mat_type*; + #endif + + atomic_mat_ptr_type* mat_ptrs = nullptr; + + #if (!defined(ARMA_DONT_USE_STD_MUTEX)) + mutable std::mutex mat_mutex; // required for slice() + #endif - arma_align_mem Mat* mat_ptrs_local[ Cube_prealloc::mat_ptrs_size ]; - arma_align_mem eT mem_local[ Cube_prealloc::mem_n_elem ]; // local storage, for small cubes + arma_aligned atomic_mat_ptr_type mat_ptrs_local[ Cube_prealloc::mat_ptrs_size ]; + arma_align_mem eT mem_local[ Cube_prealloc::mem_n_elem ]; // local storage, for small cubes public: @@ -124,7 +141,7 @@ class Cube : public BaseCube< eT, Cube > inline Mat& slice(const uword in_slice); inline const Mat& slice(const uword in_slice) const; - + arma_inline subview_cube rows(const uword in_row1, const uword in_row2); arma_inline const subview_cube rows(const uword in_row1, const uword in_row2) const; @@ -201,13 +218,18 @@ class Cube : public BaseCube< eT, Cube > template inline void shed_slices(const Base& indices); - inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero = true); - inline void insert_cols(const uword row_num, const uword N, const bool set_to_zero = true); - inline void insert_slices(const uword slice_num, const uword N, const bool set_to_zero = true); + arma_deprecated inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero); + arma_deprecated inline void insert_cols(const uword row_num, const uword N, const bool set_to_zero); + arma_deprecated inline void insert_slices(const uword slice_num, const uword N, const bool set_to_zero); + + inline void insert_rows(const uword row_num, const uword N); + inline void insert_cols(const uword row_num, const uword N); + inline void insert_slices(const uword slice_num, const uword N); template inline void insert_rows(const uword row_num, const BaseCube& X); template inline void insert_cols(const uword col_num, const BaseCube& X); template inline void insert_slices(const uword slice_num, const BaseCube& X); + template inline void insert_slices(const uword slice_num, const Base& X); template inline Cube(const GenCube& X); @@ -423,7 +445,8 @@ class Cube : public BaseCube< eT, Cube > inline void swap(Cube& B); - inline void steal_mem(Cube& X); //!< don't use this unless you're writing code internal to Armadillo + inline void steal_mem(Cube& X); //!< don't use this unless you're writing code internal to Armadillo + inline void steal_mem(Cube& X, const bool is_move); //!< don't use this unless you're writing code internal to Armadillo template class fixed; @@ -439,6 +462,9 @@ class Cube : public BaseCube< eT, Cube > inline void delete_mat(); inline void create_mat(); + inline Mat* create_mat_ptr(const uword in_slice) const; + inline Mat* get_mat_ptr(const uword in_slice) const; + friend class glue_join; friend class op_reshape; friend class op_resize; @@ -465,8 +491,8 @@ class Cube::fixed : public Cube static constexpr bool use_extra = (fixed_n_elem > Cube_prealloc::mem_n_elem); - arma_aligned Mat* mat_ptrs_local_extra[ (fixed_n_slices > Cube_prealloc::mat_ptrs_size) ? fixed_n_slices : 1 ]; - arma_align_mem eT mem_local_extra [ use_extra ? fixed_n_elem : 1 ]; + arma_aligned atomic_mat_ptr_type mat_ptrs_local_extra[ (fixed_n_slices > Cube_prealloc::mat_ptrs_size) ? fixed_n_slices : 1 ]; + arma_align_mem eT mem_local_extra[ use_extra ? fixed_n_elem : 1 ]; arma_inline void mem_setup(); diff --git a/Include/armadillo/armadillo_bits/Cube_meat.hpp b/Include/armadillo/armadillo_bits/Cube_meat.hpp index 5b1838b65..b8b24b001 100644 --- a/Include/armadillo/armadillo_bits/Cube_meat.hpp +++ b/Include/armadillo/armadillo_bits/Cube_meat.hpp @@ -35,11 +35,7 @@ Cube::~Cube() } // try to expose buggy user code that accesses deleted objects - if(arma_config::debug) - { - access::rw(mem) = nullptr; - access::rw(mat_ptrs) = nullptr; - } + if(arma_config::debug) { access::rw(mem) = nullptr; } arma_type_check(( is_supported_elem_type::value == false )); } @@ -57,7 +53,6 @@ Cube::Cube() , n_alloc(0) , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); } @@ -76,18 +71,16 @@ Cube::Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_sl , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Cube::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } - #endif } @@ -103,18 +96,16 @@ Cube::Cube(const SizeCube& s) , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); init_cold(); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Cube::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } - #endif } @@ -132,7 +123,6 @@ Cube::Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_sl , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -160,7 +150,6 @@ Cube::Cube(const SizeCube& s, const arma_initmode_indicator&) , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -188,7 +177,6 @@ Cube::Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_sl , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -216,7 +204,6 @@ Cube::Cube(const SizeCube& s, const fill::fill_class&) , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -244,7 +231,6 @@ Cube::Cube(const uword in_n_rows, const uword in_n_cols, const uword in_n_sl , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -266,7 +252,6 @@ Cube::Cube(const SizeCube& s, const fill::scalar_holder f) , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -288,12 +273,10 @@ Cube::Cube(Cube&& in_cube) , n_alloc(0) , mem_state(0) , mem() - , mat_ptrs(nullptr) { - arma_extra_debug_sigprint_this(this); arma_extra_debug_sigprint(arma_str::format("this = %x in_cube = %x") % this % &in_cube); - (*this).steal_mem(in_cube); + (*this).steal_mem(in_cube, true); } @@ -305,7 +288,7 @@ Cube::operator=(Cube&& in_cube) { arma_extra_debug_sigprint(arma_str::format("this = %x in_cube = %x") % this % &in_cube); - (*this).steal_mem(in_cube); + (*this).steal_mem(in_cube, true); return *this; } @@ -370,12 +353,14 @@ Cube::init_warm(const uword in_n_rows, const uword in_n_cols, const uword in bool err_state = false; char* err_msg = nullptr; - arma_debug_set_error( err_state, err_msg, (t_mem_state == 3), "Cube::init(): size is fixed and hence cannot be changed" ); + const char* error_message_1 = "Cube::init(): size is fixed and hence cannot be changed"; + + arma_debug_set_error( err_state, err_msg, (t_mem_state == 3), error_message_1 ); #if defined(ARMA_64BIT_WORD) - const char* error_message = "Cube::init(): requested size is too large"; + const char* error_message_2 = "Cube::init(): requested size is too large"; #else - const char* error_message = "Cube::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; + const char* error_message_2 = "Cube::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; #endif arma_debug_set_error @@ -387,7 +372,7 @@ Cube::init_warm(const uword in_n_rows, const uword in_n_cols, const uword in ? ( (double(in_n_rows) * double(in_n_cols) * double(in_n_slices)) > double(ARMA_MAX_UWORD) ) : false ), - error_message + error_message_2 ); arma_debug_check(err_state, err_msg); @@ -542,14 +527,23 @@ Cube::delete_mat() if((n_slices > 0) && (mat_ptrs != nullptr)) { - for(uword uslice = 0; uslice < n_slices; ++uslice) + for(uword s=0; s < n_slices; ++s) { - if(mat_ptrs[uslice] != nullptr) { delete access::rw(mat_ptrs[uslice]); } + raw_mat_ptr_type mat_ptr = raw_mat_ptr_type(mat_ptrs[s]); // explicit cast to indicate load from std::atomic*> + + if(mat_ptr != nullptr) + { + arma_extra_debug_print( arma_str::format("Cube::delete_mat(): destroying matrix %d") % s ); + delete mat_ptr; + mat_ptrs[s] = nullptr; + } } if( (mem_state <= 2) && (n_slices > Cube_prealloc::mat_ptrs_size) ) { + arma_extra_debug_print("Cube::delete_mat(): freeing mat_ptrs array"); delete [] mat_ptrs; + mat_ptrs = nullptr; } } } @@ -563,31 +557,110 @@ Cube::create_mat() { arma_extra_debug_sigprint(); - if(n_slices == 0) + if(n_slices == 0) { mat_ptrs = nullptr; return; } + + if(mem_state <= 2) { - access::rw(mat_ptrs) = nullptr; + if(n_slices <= Cube_prealloc::mat_ptrs_size) + { + arma_extra_debug_print("Cube::create_mat(): using local memory for mat_ptrs array"); + + mat_ptrs = mat_ptrs_local; + } + else + { + arma_extra_debug_print("Cube::create_mat(): allocating mat_ptrs array"); + + mat_ptrs = new(std::nothrow) atomic_mat_ptr_type[n_slices]; + + arma_check_bad_alloc( (mat_ptrs == nullptr), "Cube::create_mat(): out of memory" ); + } } - else + + for(uword s=0; s < n_slices; ++s) { mat_ptrs[s] = nullptr; } + } + + + +template +inline +Mat* +Cube::create_mat_ptr(const uword in_slice) const + { + arma_extra_debug_sigprint(); + + arma_extra_debug_print( arma_str::format("Cube::create_mat_ptr(): creating matrix %d") % in_slice ); + + const eT* mat_mem = (n_elem_slice > 0) ? slice_memptr(in_slice) : nullptr; + + Mat* mat_ptr = new(std::nothrow) Mat('j', mat_mem, n_rows, n_cols); + + return mat_ptr; + } + + + +template +inline +Mat* +Cube::get_mat_ptr(const uword in_slice) const + { + arma_extra_debug_sigprint(); + + raw_mat_ptr_type mat_ptr = nullptr; + + #if defined(ARMA_USE_OPENMP) { - if(mem_state <= 2) + #pragma omp atomic read + mat_ptr = mat_ptrs[in_slice]; + } + #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) + { + mat_ptr = mat_ptrs[in_slice].load(); + } + #else + { + mat_ptr = mat_ptrs[in_slice]; + } + #endif + + if(mat_ptr == nullptr) + { + #if defined(ARMA_USE_OPENMP) { - if(n_slices <= Cube_prealloc::mat_ptrs_size) + #pragma omp critical (arma_Cube_mat_ptrs) { - access::rw(mat_ptrs) = const_cast< const Mat** >(mat_ptrs_local); - } - else - { - access::rw(mat_ptrs) = new(std::nothrow) const Mat*[n_slices]; + #pragma omp atomic read + mat_ptr = mat_ptrs[in_slice]; + + if(mat_ptr == nullptr) { mat_ptr = create_mat_ptr(in_slice); } - arma_check_bad_alloc( (mat_ptrs == nullptr), "Cube::create_mat(): out of memory" ); + #pragma omp atomic write + mat_ptrs[in_slice] = mat_ptr; } } - - for(uword uslice = 0; uslice < n_slices; ++uslice) + #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { - mat_ptrs[uslice] = nullptr; + const std::lock_guard lock(mat_mutex); + + mat_ptr = mat_ptrs[in_slice].load(); + + if(mat_ptr == nullptr) { mat_ptr = create_mat_ptr(in_slice); } + + mat_ptrs[in_slice].store(mat_ptr); + } + #else + { + mat_ptr = create_mat_ptr(in_slice); + + mat_ptrs[in_slice] = mat_ptr; } + #endif + + arma_check_bad_alloc( (mat_ptr == nullptr), "Cube::get_mat_ptr(): out of memory" ); } + + return mat_ptr; } @@ -682,7 +755,6 @@ Cube::Cube(const Cube& x) , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); arma_extra_debug_sigprint(arma_str::format("this = %x in_cube = %x") % this % &x); @@ -728,11 +800,10 @@ Cube::Cube(eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols, cons , n_alloc ( 0 ) , mem_state ( copy_aux_mem ? 0 : (strict ? 2 : 1) ) , mem ( copy_aux_mem ? nullptr : aux_mem ) - , mat_ptrs ( nullptr ) { arma_extra_debug_sigprint_this(this); - if(prealloc_mat) { arma_debug_warn_level(3, "Cube::Cube(): parameter 'prealloc_mat' ignored as it's no longer used"); } + arma_ignore(prealloc_mat); // kept only for compatibility with old user code if(copy_aux_mem) { @@ -761,7 +832,6 @@ Cube::Cube(const eT* aux_mem, const uword aux_n_rows, const uword aux_n_cols , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -857,7 +927,6 @@ Cube::Cube , n_alloc(0) , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -878,7 +947,6 @@ Cube::Cube(const subview_cube& X) , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -989,7 +1057,6 @@ Cube::Cube(const subview_cube_slices& X) , n_alloc(0) , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -1154,14 +1221,7 @@ Cube::slice(const uword in_slice) arma_debug_check_bounds( (in_slice >= n_slices), "Cube::slice(): index out of bounds" ); - if(mat_ptrs[in_slice] == nullptr) - { - const eT* ptr = (n_elem_slice > 0) ? slice_memptr(in_slice) : nullptr; - - mat_ptrs[in_slice] = new Mat('j', ptr, n_rows, n_cols); - } - - return const_cast< Mat& >( *(mat_ptrs[in_slice]) ); + return *(get_mat_ptr(in_slice)); } @@ -1176,14 +1236,7 @@ Cube::slice(const uword in_slice) const arma_debug_check_bounds( (in_slice >= n_slices), "Cube::slice(): index out of bounds" ); - if(mat_ptrs[in_slice] == nullptr) - { - const eT* ptr = (n_elem_slice > 0) ? slice_memptr(in_slice) : nullptr; - - mat_ptrs[in_slice] = new Mat('j', ptr, n_rows, n_cols); - } - - return *(mat_ptrs[in_slice]); + return *(get_mat_ptr(in_slice)); } @@ -2261,12 +2314,27 @@ Cube::shed_slices(const Base& indices) template +arma_deprecated inline void Cube::insert_rows(const uword row_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); + arma_ignore(set_to_zero); + + (*this).insert_rows(row_num, N); + } + + + +template +inline +void +Cube::insert_rows(const uword row_num, const uword N) + { + arma_extra_debug_sigprint(); + const uword t_n_rows = n_rows; const uword A_n_rows = row_num; @@ -2275,38 +2343,49 @@ Cube::insert_rows(const uword row_num, const uword N, const bool set_to_zero // insertion at row_num == n_rows is in effect an append operation arma_debug_check_bounds( (row_num > t_n_rows), "Cube::insert_rows(): index out of bounds" ); - if(N > 0) + if(N == 0) { return; } + + Cube out(t_n_rows + N, n_cols, n_slices, arma_nozeros_indicator()); + + if(A_n_rows > 0) { - Cube out(t_n_rows + N, n_cols, n_slices, arma_nozeros_indicator()); - - if(A_n_rows > 0) - { - out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1); - } - - if(B_n_rows > 0) - { - out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows-1); - } - - if(set_to_zero) - { - out.rows(row_num, row_num + N - 1).zeros(); - } - - steal_mem(out); + out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1); + } + + if(B_n_rows > 0) + { + out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows-1); } + + out.rows(row_num, row_num + N - 1).zeros(); + + steal_mem(out); } template +arma_deprecated inline void Cube::insert_cols(const uword col_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); + arma_ignore(set_to_zero); + + (*this).insert_cols(col_num, N); + } + + + +template +inline +void +Cube::insert_cols(const uword col_num, const uword N) + { + arma_extra_debug_sigprint(); + const uword t_n_cols = n_cols; const uword A_n_cols = col_num; @@ -2315,40 +2394,49 @@ Cube::insert_cols(const uword col_num, const uword N, const bool set_to_zero // insertion at col_num == n_cols is in effect an append operation arma_debug_check_bounds( (col_num > t_n_cols), "Cube::insert_cols(): index out of bounds" ); - if(N > 0) + if(N == 0) { return; } + + Cube out(n_rows, t_n_cols + N, n_slices, arma_nozeros_indicator()); + + if(A_n_cols > 0) { - Cube out(n_rows, t_n_cols + N, n_slices, arma_nozeros_indicator()); - - if(A_n_cols > 0) - { - out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1); - } - - if(B_n_cols > 0) - { - out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols-1); - } - - if(set_to_zero) - { - out.cols(col_num, col_num + N - 1).zeros(); - } - - steal_mem(out); + out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1); + } + + if(B_n_cols > 0) + { + out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols-1); } + + out.cols(col_num, col_num + N - 1).zeros(); + + steal_mem(out); } -//! insert N slices at the specified slice position, -//! optionally setting the elements of the inserted slices to zero template +arma_deprecated inline void Cube::insert_slices(const uword slice_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); + arma_ignore(set_to_zero); + + (*this).insert_slices(slice_num, N); + } + + + +template +inline +void +Cube::insert_slices(const uword slice_num, const uword N) + { + arma_extra_debug_sigprint(); + const uword t_n_slices = n_slices; const uword A_n_slices = slice_num; @@ -2357,32 +2445,28 @@ Cube::insert_slices(const uword slice_num, const uword N, const bool set_to_ // insertion at slice_num == n_slices is in effect an append operation arma_debug_check_bounds( (slice_num > t_n_slices), "Cube::insert_slices(): index out of bounds" ); - if(N > 0) + if(N == 0) { return; } + + Cube out(n_rows, n_cols, t_n_slices + N, arma_nozeros_indicator()); + + if(A_n_slices > 0) { - Cube out(n_rows, n_cols, t_n_slices + N, arma_nozeros_indicator()); - - if(A_n_slices > 0) - { - out.slices(0, A_n_slices-1) = slices(0, A_n_slices-1); - } - - if(B_n_slices > 0) - { - out.slices(slice_num + N, t_n_slices + N - 1) = slices(slice_num, t_n_slices-1); - } - - if(set_to_zero) - { - //out.slices(slice_num, slice_num + N - 1).zeros(); - - for(uword i=slice_num; i < (slice_num + N); ++i) - { - arrayops::fill_zeros(out.slice_memptr(i), out.n_elem_slice); - } - } - - steal_mem(out); + out.slices(0, A_n_slices-1) = slices(0, A_n_slices-1); + } + + if(B_n_slices > 0) + { + out.slices(slice_num + N, t_n_slices + N - 1) = slices(slice_num, t_n_slices-1); + } + + //out.slices(slice_num, slice_num + N - 1).zeros(); + + for(uword i=slice_num; i < (slice_num + N); ++i) + { + arrayops::fill_zeros(out.slice_memptr(i), out.n_elem_slice); } + + steal_mem(out); } @@ -2414,24 +2498,23 @@ Cube::insert_rows(const uword row_num, const BaseCube& X) "Cube::insert_rows(): given object has incompatible dimensions" ); - if(N > 0) + if(N == 0) { return; } + + Cube out(t_n_rows + N, n_cols, n_slices, arma_nozeros_indicator()); + + if(A_n_rows > 0) { - Cube out(t_n_rows + N, n_cols, n_slices, arma_nozeros_indicator()); - - if(A_n_rows > 0) - { - out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1); - } - - if(B_n_rows > 0) - { - out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows - 1); - } - - out.rows(row_num, row_num + N - 1) = C; - - steal_mem(out); + out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1); + } + + if(B_n_rows > 0) + { + out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows - 1); } + + out.rows(row_num, row_num + N - 1) = C; + + steal_mem(out); } @@ -2463,24 +2546,23 @@ Cube::insert_cols(const uword col_num, const BaseCube& X) "Cube::insert_cols(): given object has incompatible dimensions" ); - if(N > 0) + if(N == 0) { return; } + + Cube out(n_rows, t_n_cols + N, n_slices, arma_nozeros_indicator()); + + if(A_n_cols > 0) { - Cube out(n_rows, t_n_cols + N, n_slices, arma_nozeros_indicator()); - - if(A_n_cols > 0) - { - out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1); - } - - if(B_n_cols > 0) - { - out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols - 1); - } - - out.cols(col_num, col_num + N - 1) = C; - - steal_mem(out); + out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1); + } + + if(B_n_cols > 0) + { + out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols - 1); } + + out.cols(col_num, col_num + N - 1) = C; + + steal_mem(out); } @@ -2514,24 +2596,40 @@ Cube::insert_slices(const uword slice_num, const BaseCube& X) "Cube::insert_slices(): given object has incompatible dimensions" ); - if(N > 0) + if(N == 0) { return; } + + Cube out(n_rows, n_cols, t_n_slices + N, arma_nozeros_indicator()); + + if(A_n_slices > 0) { - Cube out(n_rows, n_cols, t_n_slices + N, arma_nozeros_indicator()); - - if(A_n_slices > 0) - { - out.slices(0, A_n_slices-1) = slices(0, A_n_slices-1); - } - - if(B_n_slices > 0) - { - out.slices(slice_num + N, t_n_slices + N - 1) = slices(slice_num, t_n_slices - 1); - } - - out.slices(slice_num, slice_num + N - 1) = C; - - steal_mem(out); + out.slices(0, A_n_slices-1) = slices(0, A_n_slices-1); } + + if(B_n_slices > 0) + { + out.slices(slice_num + N, t_n_slices + N - 1) = slices(slice_num, t_n_slices - 1); + } + + out.slices(slice_num, slice_num + N - 1) = C; + + steal_mem(out); + } + + + +template +template +inline +void +Cube::insert_slices(const uword slice_num, const Base& X) + { + arma_extra_debug_sigprint(); + + const quasi_unwrap U(X.get_ref()); + + const Cube C(const_cast(U.M.memptr()), U.M.n_rows, U.M.n_cols, uword(1), false, true); + + (*this).insert_slices(slice_num, C); } @@ -2549,7 +2647,6 @@ Cube::Cube(const GenCube& X) , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -2650,7 +2747,6 @@ Cube::Cube(const OpCube& X) , n_alloc(0) , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -2764,7 +2860,6 @@ Cube::Cube(const eOpCube& X) , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -2892,7 +2987,6 @@ Cube::Cube(const mtOpCube& X) , n_alloc(0) , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -2989,7 +3083,6 @@ Cube::Cube(const GlueCube& X) , n_alloc(0) , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -3105,7 +3198,6 @@ Cube::Cube(const eGlueCube& X) , n_alloc() , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -3239,7 +3331,6 @@ Cube::Cube(const mtGlueCube& X) , n_alloc(0) , mem_state(0) , mem() - , mat_ptrs(nullptr) { arma_extra_debug_sigprint_this(this); @@ -5159,10 +5250,24 @@ Cube::steal_mem(Cube& x) { arma_extra_debug_sigprint(); + (*this).steal_mem(x, false); + } + + + +template +inline +void +Cube::steal_mem(Cube& x, const bool is_move) + { + arma_extra_debug_sigprint(); + if(this == &x) { return; } - if( (mem_state <= 1) && ( (x.n_alloc > Cube_prealloc::mem_n_elem) || (x.mem_state == 1) ) ) + if( (mem_state <= 1) && ( (x.n_alloc > Cube_prealloc::mem_n_elem) || (x.mem_state == 1) || (is_move && (x.mem_state == 2)) ) ) { + arma_extra_debug_print("Cube::steal_mem(): stealing memory"); + reset(); const uword x_n_slices = x.n_slices; @@ -5178,16 +5283,20 @@ Cube::steal_mem(Cube& x) if(x_n_slices > Cube_prealloc::mat_ptrs_size) { - access::rw( mat_ptrs) = x.mat_ptrs; - access::rw(x.mat_ptrs) = nullptr; + arma_extra_debug_print("Cube::steal_mem(): stealing mat_ptrs array"); + + mat_ptrs = x.mat_ptrs; + x.mat_ptrs = nullptr; } else { - access::rw(mat_ptrs) = const_cast< const Mat** >(mat_ptrs_local); + arma_extra_debug_print("Cube::steal_mem(): copying mat_ptrs array"); + + mat_ptrs = mat_ptrs_local; for(uword i=0; i < x_n_slices; ++i) { - mat_ptrs[i] = x.mat_ptrs[i]; + mat_ptrs[i] = raw_mat_ptr_type(x.mat_ptrs[i]); // cast required by std::atomic x.mat_ptrs[i] = nullptr; } } @@ -5203,7 +5312,14 @@ Cube::steal_mem(Cube& x) } else { + arma_extra_debug_print("Cube::steal_mem(): copying memory"); + (*this).operator=(x); + + if( (is_move) && (x.mem_state == 0) && (x.n_alloc <= Cube_prealloc::mem_n_elem) ) + { + x.reset(); + } } } @@ -5232,8 +5348,7 @@ Cube::fixed::mem_setup() access::rw(Cube::n_alloc) = 0; access::rw(Cube::mem_state) = 3; access::rw(Cube::mem) = (fixed_n_elem > Cube_prealloc::mem_n_elem) ? mem_local_extra : mem_local; - access::rw(Cube::mat_ptrs) = const_cast< const Mat** >( \ - (fixed_n_slices > Cube_prealloc::mat_ptrs_size) ? mat_ptrs_local_extra : mat_ptrs_local ); + Cube::mat_ptrs = (fixed_n_slices > Cube_prealloc::mat_ptrs_size) ? mat_ptrs_local_extra : mat_ptrs_local; create_mat(); } @@ -5247,7 +5362,7 @@ Cube::fixed::mem_setup() access::rw(Cube::n_alloc) = 0; access::rw(Cube::mem_state) = 3; access::rw(Cube::mem) = nullptr; - access::rw(Cube::mat_ptrs) = nullptr; + Cube::mat_ptrs = nullptr; } } @@ -5262,7 +5377,7 @@ Cube::fixed::fixed() mem_setup(); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Cube::fixed::constructor: zeroing memory"); @@ -5270,7 +5385,6 @@ Cube::fixed::fixed() arrayops::fill_zeros(mem_use, fixed_n_elem); } - #endif } @@ -5764,11 +5878,7 @@ Cube_aux::set_real(Cube< std::complex >& out, const BaseCube& X) const uword N = out.n_elem; - for(uword i=0; i( A[i], out_mem[i].imag() ); - } + for(uword i=0; i >& out, const BaseCube& X) for(uword col = 0; col < local_n_cols; ++col ) for(uword row = 0; row < local_n_rows; ++row ) { - (*out_mem) = std::complex( P.at(row,col,slice), (*out_mem).imag() ); + (*out_mem).real(P.at(row,col,slice)); out_mem++; } } @@ -5816,11 +5926,7 @@ Cube_aux::set_imag(Cube< std::complex >& out, const BaseCube& X) const uword N = out.n_elem; - for(uword i=0; i( out_mem[i].real(), A[i] ); - } + for(uword i=0; i >& out, const BaseCube& X) for(uword col = 0; col < local_n_cols; ++col ) for(uword row = 0; row < local_n_rows; ++row ) { - (*out_mem) = std::complex( (*out_mem).real(), P.at(row,col,slice) ); + (*out_mem).imag(P.at(row,col,slice)); out_mem++; } } diff --git a/Include/armadillo/armadillo_bits/GenCube_bones.hpp b/Include/armadillo/armadillo_bits/GenCube_bones.hpp index 965a168f6..3c6099f3d 100644 --- a/Include/armadillo/armadillo_bits/GenCube_bones.hpp +++ b/Include/armadillo/armadillo_bits/GenCube_bones.hpp @@ -20,11 +20,10 @@ //! @{ -//! support class for generator functions (eg. zeros, randu, randn, ...) +//! support class for generator functions (zeros, ones) template class GenCube : public BaseCube< eT, GenCube > - , public GenSpecialiser::yes, is_same_type::yes, is_same_type::yes, is_same_type::yes> { public: @@ -32,7 +31,7 @@ class GenCube typedef typename get_pod_type::result pod_type; static constexpr bool use_at = false; - static constexpr bool is_simple = (is_same_type::value) || (is_same_type::value); + static constexpr bool is_simple = (is_same_type::value) || (is_same_type::value); arma_aligned const uword n_rows; arma_aligned const uword n_cols; @@ -41,9 +40,9 @@ class GenCube arma_inline GenCube(const uword in_n_rows, const uword in_n_cols, const uword in_n_slices); arma_inline ~GenCube(); - arma_inline eT operator[] (const uword i) const; - arma_inline eT at (const uword row, const uword col, const uword slice) const; - arma_inline eT at_alt (const uword i) const; + arma_inline eT operator[] (const uword i) const; + arma_inline eT at (const uword r, const uword c, const uword s) const; + arma_inline eT at_alt (const uword i) const; inline void apply (Cube& out) const; inline void apply_inplace_plus (Cube& out) const; diff --git a/Include/armadillo/armadillo_bits/GenCube_meat.hpp b/Include/armadillo/armadillo_bits/GenCube_meat.hpp index 76257d18d..61735f3b9 100644 --- a/Include/armadillo/armadillo_bits/GenCube_meat.hpp +++ b/Include/armadillo/armadillo_bits/GenCube_meat.hpp @@ -47,7 +47,10 @@ arma_inline eT GenCube::operator[](const uword) const { - return (*this).generate(); + if(is_same_type::yes) { return eT(0); } + else if(is_same_type::yes) { return eT(1); } + + return eT(0); // prevent pedantic compiler warnings } @@ -57,7 +60,10 @@ arma_inline eT GenCube::at(const uword, const uword, const uword) const { - return (*this).generate(); + if(is_same_type::yes) { return eT(0); } + else if(is_same_type::yes) { return eT(1); } + + return eT(0); // prevent pedantic compiler warnings } @@ -67,7 +73,10 @@ arma_inline eT GenCube::at_alt(const uword) const { - return (*this).generate(); + if(is_same_type::yes) { return eT(0); } + else if(is_same_type::yes) { return eT(1); } + + return eT(0); // prevent pedantic compiler warnings } @@ -82,10 +91,8 @@ GenCube::apply(Cube& out) const // NOTE: we're assuming that the cube has already been set to the correct size; // this is done by either the Cube contructor or operator=() - if(is_same_type::yes) { out.ones(); } - else if(is_same_type::yes) { out.zeros(); } - else if(is_same_type::yes) { out.randu(); } - else if(is_same_type::yes) { out.randn(); } + if(is_same_type::yes) { out.zeros(); } + else if(is_same_type::yes) { out.ones(); } } @@ -99,24 +106,9 @@ GenCube::apply_inplace_plus(Cube& out) const arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "addition"); - - eT* out_mem = out.memptr(); - const uword n_elem = out.n_elem; - - uword i,j; - - for(i=0, j=1; j::yes) { - out_mem[i] += (*this).generate(); + arrayops::inplace_plus(out.memptr(), eT(1), out.n_elem); } } @@ -132,24 +124,9 @@ GenCube::apply_inplace_minus(Cube& out) const arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "subtraction"); - - eT* out_mem = out.memptr(); - const uword n_elem = out.n_elem; - - uword i,j; - - for(i=0, j=1; j::yes) { - const eT tmp_i = (*this).generate(); - const eT tmp_j = (*this).generate(); - - out_mem[i] -= tmp_i; - out_mem[j] -= tmp_j; - } - - if(i < n_elem) - { - out_mem[i] -= (*this).generate(); + arrayops::inplace_minus(out.memptr(), eT(1), out.n_elem); } } @@ -165,24 +142,10 @@ GenCube::apply_inplace_schur(Cube& out) const arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise multiplication"); - - eT* out_mem = out.memptr(); - const uword n_elem = out.n_elem; - - uword i,j; - - for(i=0, j=1; j::yes) { - out_mem[i] *= (*this).generate(); + arrayops::inplace_mul(out.memptr(), eT(0), out.n_elem); + // NOTE: not using arrayops::fill_zeros(), as 'out' may have NaN elements } } @@ -198,24 +161,9 @@ GenCube::apply_inplace_div(Cube& out) const arma_debug_assert_same_size(out.n_rows, out.n_cols, out.n_slices, n_rows, n_cols, n_slices, "element-wise division"); - - eT* out_mem = out.memptr(); - const uword n_elem = out.n_elem; - - uword i,j; - - for(i=0, j=1; j::yes) { - out_mem[i] /= (*this).generate(); + arrayops::inplace_div(out.memptr(), eT(0), out.n_elem); } } @@ -231,10 +179,8 @@ GenCube::apply(subview_cube& out) const // NOTE: we're assuming that the subcube has the same dimensions as the GenCube object // this is checked by subview_cube::operator=() - if(is_same_type::yes) { out.ones(); } - else if(is_same_type::yes) { out.zeros(); } - else if(is_same_type::yes) { out.randu(); } - else if(is_same_type::yes) { out.randn(); } + if(is_same_type::yes) { out.zeros(); } + else if(is_same_type::yes) { out.ones(); } } diff --git a/Include/armadillo/armadillo_bits/GenSpecialiser.hpp b/Include/armadillo/armadillo_bits/GenSpecialiser.hpp deleted file mode 100644 index 23481a2b6..000000000 --- a/Include/armadillo/armadillo_bits/GenSpecialiser.hpp +++ /dev/null @@ -1,58 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// -// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) -// Copyright 2008-2016 National ICT Australia (NICTA) -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// ------------------------------------------------------------------------ - - -//! \addtogroup GenSpecialiser -//! @{ - - -template -struct GenSpecialiser - { - arma_inline elem_type generate() const { return elem_type(); } - }; - - -template -struct GenSpecialiser - { - arma_inline elem_type generate() const { return elem_type(0); } - }; - - -template -struct GenSpecialiser - { - arma_inline elem_type generate() const { return elem_type(1); } - }; - - -template -struct GenSpecialiser - { - arma_inline elem_type generate() const { return elem_type(arma_rng::randu()); } - }; - - -template -struct GenSpecialiser - { - arma_inline elem_type generate() const { return elem_type(arma_rng::randn()); } - }; - - -//! @} diff --git a/Include/armadillo/armadillo_bits/Gen_bones.hpp b/Include/armadillo/armadillo_bits/Gen_bones.hpp index 9112acd6a..172e5b9c2 100644 --- a/Include/armadillo/armadillo_bits/Gen_bones.hpp +++ b/Include/armadillo/armadillo_bits/Gen_bones.hpp @@ -20,11 +20,10 @@ //! @{ -//! support class for generator functions (eg. zeros, randu, randn, ...) +//! support class for generator functions (zeros, ones, eye) template class Gen : public Base< typename T1::elem_type, Gen > - , public GenSpecialiser::yes, is_same_type::yes, is_same_type::yes, is_same_type::yes> { public: @@ -32,7 +31,7 @@ class Gen typedef typename get_pod_type::result pod_type; static constexpr bool use_at = (is_same_type::value); - static constexpr bool is_simple = (is_same_type::value) || (is_same_type::value); + static constexpr bool is_simple = (is_same_type::value) || (is_same_type::value); static constexpr bool is_row = T1::is_row; static constexpr bool is_col = T1::is_col; @@ -44,9 +43,9 @@ class Gen arma_inline Gen(const uword in_n_rows, const uword in_n_cols); arma_inline ~Gen(); - arma_inline elem_type operator[] (const uword ii) const; - arma_inline elem_type at (const uword row, const uword col) const; - arma_inline elem_type at_alt (const uword ii) const; + arma_inline elem_type operator[] (const uword ii) const; + arma_inline elem_type at (const uword r, const uword c) const; + arma_inline elem_type at_alt (const uword ii) const; inline void apply (Mat& out) const; inline void apply_inplace_plus (Mat& out) const; diff --git a/Include/armadillo/armadillo_bits/Gen_meat.hpp b/Include/armadillo/armadillo_bits/Gen_meat.hpp index e1a859008..96b8940c3 100644 --- a/Include/armadillo/armadillo_bits/Gen_meat.hpp +++ b/Include/armadillo/armadillo_bits/Gen_meat.hpp @@ -48,14 +48,11 @@ Gen::operator[](const uword ii) const { typedef typename T1::elem_type eT; - if(is_same_type::yes) - { - return ((ii % n_rows) == (ii / n_rows)) ? eT(1) : eT(0); - } - else - { - return (*this).generate(); - } + if(is_same_type::yes) { return eT(0); } + else if(is_same_type::yes) { return eT(1); } + else if(is_same_type::yes) { return ((ii % n_rows) == (ii / n_rows)) ? eT(1) : eT(0); } + + return eT(0); // prevent pedantic compiler warnings } @@ -63,18 +60,15 @@ Gen::operator[](const uword ii) const template arma_inline typename T1::elem_type -Gen::at(const uword row, const uword col) const +Gen::at(const uword r, const uword c) const { typedef typename T1::elem_type eT; - if(is_same_type::yes) - { - return (row == col) ? eT(1) : eT(0); - } - else - { - return (*this).generate(); - } + if(is_same_type::yes) { return eT(0); } + else if(is_same_type::yes) { return eT(1); } + else if(is_same_type::yes) { return (r == c) ? eT(1) : eT(0); } + + return eT(0); // prevent pedantic compiler warnings } @@ -99,11 +93,9 @@ Gen::apply(Mat& out) const // NOTE: we're assuming that the matrix has already been set to the correct size; // this is done by either the Mat contructor or operator=() - if(is_same_type::yes) { out.eye(); } + if(is_same_type::yes) { out.zeros(); } else if(is_same_type::yes) { out.ones(); } - else if(is_same_type::yes) { out.zeros(); } - else if(is_same_type::yes) { out.randu(); } - else if(is_same_type::yes) { out.randn(); } + else if(is_same_type::yes) { out.eye(); } } @@ -119,35 +111,16 @@ Gen::apply_inplace_plus(Mat& out) const typedef typename T1::elem_type eT; - - if(is_same_type::yes) + if(is_same_type::yes) { - const uword N = (std::min)(n_rows, n_cols); - - for(uword iq=0; iq < N; ++iq) - { - out.at(iq,iq) += eT(1); - } + arrayops::inplace_plus(out.memptr(), eT(1), out.n_elem); } else + if(is_same_type::yes) { - eT* out_mem = out.memptr(); - const uword n_elem = out.n_elem; - - uword iq,jq; - for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2) - { - const eT tmp_i = (*this).generate(); - const eT tmp_j = (*this).generate(); - - out_mem[iq] += tmp_i; - out_mem[jq] += tmp_j; - } + const uword N = (std::min)(n_rows, n_cols); - if(iq < n_elem) - { - out_mem[iq] += (*this).generate(); - } + for(uword ii=0; ii < N; ++ii) { out.at(ii,ii) += eT(1); } } } @@ -165,35 +138,16 @@ Gen::apply_inplace_minus(Mat& out) const typedef typename T1::elem_type eT; - - if(is_same_type::yes) + if(is_same_type::yes) { - const uword N = (std::min)(n_rows, n_cols); - - for(uword iq=0; iq < N; ++iq) - { - out.at(iq,iq) -= eT(1); - } + arrayops::inplace_minus(out.memptr(), eT(1), out.n_elem); } else + if(is_same_type::yes) { - eT* out_mem = out.memptr(); - const uword n_elem = out.n_elem; - - uword iq,jq; - for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2) - { - const eT tmp_i = (*this).generate(); - const eT tmp_j = (*this).generate(); - - out_mem[iq] -= tmp_i; - out_mem[jq] -= tmp_j; - } + const uword N = (std::min)(n_rows, n_cols); - if(iq < n_elem) - { - out_mem[iq] -= (*this).generate(); - } + for(uword ii=0; ii < N; ++ii) { out.at(ii,ii) -= eT(1); } } } @@ -211,35 +165,18 @@ Gen::apply_inplace_schur(Mat& out) const typedef typename T1::elem_type eT; - - if(is_same_type::yes) + if(is_same_type::yes) { - const uword N = (std::min)(n_rows, n_cols); - - for(uword iq=0; iq < N; ++iq) - { - for(uword row=0; row < iq; ++row) { out.at(row,iq) = eT(0); } - for(uword row=iq+1; row < n_rows; ++row) { out.at(row,iq) = eT(0); } - } + arrayops::inplace_mul(out.memptr(), eT(0), out.n_elem); + // NOTE: not using arrayops::fill_zeros(), as 'out' may have NaN elements } else + if(is_same_type::yes) { - eT* out_mem = out.memptr(); - const uword n_elem = out.n_elem; - - uword iq,jq; - for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2) - { - const eT tmp_i = (*this).generate(); - const eT tmp_j = (*this).generate(); - - out_mem[iq] *= tmp_i; - out_mem[jq] *= tmp_j; - } - - if(iq < n_elem) + for(uword c=0; c < n_cols; ++c) + for(uword r=0; r < n_rows; ++r) { - out_mem[iq] *= (*this).generate(); + if(r != c) { out.at(r,c) *= eT(0); } } } } @@ -258,37 +195,17 @@ Gen::apply_inplace_div(Mat& out) const typedef typename T1::elem_type eT; - - if(is_same_type::yes) + if(is_same_type::yes) { - const uword N = (std::min)(n_rows, n_cols); - - for(uword iq=0; iq < N; ++iq) - { - const eT zero = eT(0); - - for(uword row=0; row < iq; ++row) { out.at(row,iq) /= zero; } - for(uword row=iq+1; row < n_rows; ++row) { out.at(row,iq) /= zero; } - } + arrayops::inplace_div(out.memptr(), eT(0), out.n_elem); } else + if(is_same_type::yes) { - eT* out_mem = out.memptr(); - const uword n_elem = out.n_elem; - - uword iq,jq; - for(iq=0, jq=1; jq < n_elem; iq+=2, jq+=2) - { - const eT tmp_i = (*this).generate(); - const eT tmp_j = (*this).generate(); - - out_mem[iq] /= tmp_i; - out_mem[jq] /= tmp_j; - } - - if(iq < n_elem) + for(uword c=0; c < n_cols; ++c) + for(uword r=0; r < n_rows; ++r) { - out_mem[iq] /= (*this).generate(); + if(r != c) { out.at(r,c) /= eT(0); } } } } @@ -305,11 +222,9 @@ Gen::apply(subview& out) const // NOTE: we're assuming that the submatrix has the same dimensions as the Gen object // this is checked by subview::operator=() - if(is_same_type::yes) { out.eye(); } + if(is_same_type::yes) { out.zeros(); } else if(is_same_type::yes) { out.ones(); } - else if(is_same_type::yes) { out.zeros(); } - else if(is_same_type::yes) { out.randu(); } - else if(is_same_type::yes) { out.randn(); } + else if(is_same_type::yes) { out.eye(); } } diff --git a/Include/armadillo/armadillo_bits/MapMat_meat.hpp b/Include/armadillo/armadillo_bits/MapMat_meat.hpp index 6dea74ad2..748bf5dd3 100644 --- a/Include/armadillo/armadillo_bits/MapMat_meat.hpp +++ b/Include/armadillo/armadillo_bits/MapMat_meat.hpp @@ -198,6 +198,8 @@ MapMat::operator=(MapMat&& x) { arma_extra_debug_sigprint(); + if(this == &x) { return; } + reset(); if(map_ptr) { delete map_ptr; } @@ -1184,11 +1186,9 @@ SpMat_MapMat_val::operator=(const eT in_val) } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { - s_parent.cache_mutex.lock(); + const std::lock_guard lock(s_parent.cache_mutex); (*this).set(in_val); - - s_parent.cache_mutex.unlock(); } #else { @@ -1219,11 +1219,9 @@ SpMat_MapMat_val::operator+=(const eT in_val) } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { - s_parent.cache_mutex.lock(); + const std::lock_guard lock(s_parent.cache_mutex); (*this).add(in_val); - - s_parent.cache_mutex.unlock(); } #else { @@ -1254,11 +1252,9 @@ SpMat_MapMat_val::operator-=(const eT in_val) } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { - s_parent.cache_mutex.lock(); + const std::lock_guard lock(s_parent.cache_mutex); (*this).sub(in_val); - - s_parent.cache_mutex.unlock(); } #else { @@ -1287,11 +1283,9 @@ SpMat_MapMat_val::operator*=(const eT in_val) } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { - s_parent.cache_mutex.lock(); + const std::lock_guard lock(s_parent.cache_mutex); (*this).mul(in_val); - - s_parent.cache_mutex.unlock(); } #else { @@ -1320,11 +1314,9 @@ SpMat_MapMat_val::operator/=(const eT in_val) } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { - s_parent.cache_mutex.lock(); + const std::lock_guard lock(s_parent.cache_mutex); (*this).div(in_val); - - s_parent.cache_mutex.unlock(); } #else { diff --git a/Include/armadillo/armadillo_bits/Mat_bones.hpp b/Include/armadillo/armadillo_bits/Mat_bones.hpp index 824000b79..f7cc6f32b 100644 --- a/Include/armadillo/armadillo_bits/Mat_bones.hpp +++ b/Include/armadillo/armadillo_bits/Mat_bones.hpp @@ -188,8 +188,8 @@ class Mat : public Base< eT, Mat > inline Mat& operator/=(const spdiagview& X); - arma_cold inline mat_injector operator<<(const eT val); - arma_cold inline mat_injector operator<<(const injector_end_of_row<>& x); + arma_deprecated inline mat_injector operator<<(const eT val); + arma_deprecated inline mat_injector operator<<(const injector_end_of_row<>& x); arma_inline subview_row row(const uword row_num); @@ -308,8 +308,11 @@ class Mat : public Base< eT, Mat > template inline void shed_rows(const Base& indices); template inline void shed_cols(const Base& indices); - inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero = true); - inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero = true); + arma_deprecated inline void insert_rows(const uword row_num, const uword N, const bool set_to_zero); + arma_deprecated inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero); + + inline void insert_rows(const uword row_num, const uword N); + inline void insert_cols(const uword col_num, const uword N); template inline void insert_rows(const uword row_num, const Base& X); template inline void insert_cols(const uword col_num, const Base& X); @@ -745,7 +748,8 @@ class Mat : public Base< eT, Mat > inline void swap(Mat& B); - inline void steal_mem(Mat& X); //!< don't use this unless you're writing code internal to Armadillo + inline void steal_mem(Mat& X); //!< don't use this unless you're writing code internal to Armadillo + inline void steal_mem(Mat& X, const bool is_move); //!< don't use this unless you're writing code internal to Armadillo inline void steal_mem_col(Mat& X, const uword max_n_rows); diff --git a/Include/armadillo/armadillo_bits/Mat_meat.hpp b/Include/armadillo/armadillo_bits/Mat_meat.hpp index b1873fbe5..f3f1cba29 100644 --- a/Include/armadillo/armadillo_bits/Mat_meat.hpp +++ b/Include/armadillo/armadillo_bits/Mat_meat.hpp @@ -72,12 +72,11 @@ Mat::Mat(const uword in_n_rows, const uword in_n_cols) init_cold(); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Mat::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } - #endif } @@ -97,12 +96,11 @@ Mat::Mat(const SizeMat& s) init_cold(); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Mat::constructor: zeroing memory"); arrayops::fill_zeros(memptr(), n_elem); } - #endif } @@ -353,7 +351,11 @@ Mat::init_warm(uword in_n_rows, uword in_n_cols) const uhword t_vec_state = vec_state; const uhword t_mem_state = mem_state; - arma_debug_set_error( err_state, err_msg, (t_mem_state == 3), "Mat::init(): size is fixed and hence cannot be changed" ); + const char* error_message_1 = "Mat::init(): size is fixed and hence cannot be changed"; + const char* error_message_2 = "Mat::init(): requested size is not compatible with column vector layout"; + const char* error_message_3 = "Mat::init(): requested size is not compatible with row vector layout"; + + arma_debug_set_error( err_state, err_msg, (t_mem_state == 3), error_message_1 ); if(t_vec_state > 0) { @@ -364,17 +366,17 @@ Mat::init_warm(uword in_n_rows, uword in_n_cols) } else { - if(t_vec_state == 1) { arma_debug_set_error( err_state, err_msg, (in_n_cols != 1), "Mat::init(): requested size is not compatible with column vector layout" ); } - if(t_vec_state == 2) { arma_debug_set_error( err_state, err_msg, (in_n_rows != 1), "Mat::init(): requested size is not compatible with row vector layout" ); } + if(t_vec_state == 1) { arma_debug_set_error( err_state, err_msg, (in_n_cols != 1), error_message_2 ); } + if(t_vec_state == 2) { arma_debug_set_error( err_state, err_msg, (in_n_rows != 1), error_message_3 ); } } } // ensure that n_elem can hold the result of (n_rows * n_cols) #if defined(ARMA_64BIT_WORD) - const char* error_message = "Mat::init(): requested size is too large"; + const char* error_message_4 = "Mat::init(): requested size is too large"; #else - const char* error_message = "Mat::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; + const char* error_message_4 = "Mat::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD"; #endif arma_debug_set_error @@ -386,7 +388,7 @@ Mat::init_warm(uword in_n_rows, uword in_n_cols) ? ( (double(in_n_rows) * double(in_n_cols)) > double(ARMA_MAX_UWORD) ) : false ), - error_message + error_message_4 ); arma_debug_check(err_state, err_msg); @@ -794,15 +796,7 @@ Mat::operator=(Mat&& X) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); - (*this).steal_mem(X); - - if( (X.mem_state == 0) && (X.n_alloc <= arma_config::mat_prealloc) && (this != &X) ) - { - access::rw(X.n_rows) = 0; - access::rw(X.n_cols) = 0; - access::rw(X.n_elem) = 0; - access::rw(X.mem) = nullptr; - } + (*this).steal_mem(X, true); return *this; } @@ -939,7 +933,7 @@ Mat::init(const std::initializer_list& list) set_size(1, N); - arrayops::copy( memptr(), list.begin(), N ); + if(N > 0) { arrayops::copy( memptr(), list.begin(), N ); } } @@ -1199,6 +1193,18 @@ Mat::steal_mem(Mat& x) { arma_extra_debug_sigprint(); + (*this).steal_mem(x, false); + } + + + +template +inline +void +Mat::steal_mem(Mat& x, const bool is_move) + { + arma_extra_debug_sigprint(); + if(this == &x) { return; } const uword x_n_rows = x.n_rows; @@ -1213,8 +1219,10 @@ Mat::steal_mem(Mat& x) const bool layout_ok = (t_vec_state == x_vec_state) || ((t_vec_state == 1) && (x_n_cols == 1)) || ((t_vec_state == 2) && (x_n_rows == 1)); - if( layout_ok && (t_mem_state <= 1) && ((x_n_alloc > arma_config::mat_prealloc) || (x_mem_state == 1)) ) + if( layout_ok && (t_mem_state <= 1) && ( (x_n_alloc > arma_config::mat_prealloc) || (x_mem_state == 1) || (is_move && (x_mem_state == 2)) ) ) { + arma_extra_debug_print("Mat::steal_mem(): stealing memory"); + reset(); access::rw(n_rows) = x_n_rows; @@ -1224,8 +1232,8 @@ Mat::steal_mem(Mat& x) access::rw(mem_state) = x_mem_state; access::rw(mem) = x.mem; - access::rw(x.n_rows) = 0; - access::rw(x.n_cols) = 0; + access::rw(x.n_rows) = (x_vec_state == 2) ? 1 : 0; + access::rw(x.n_cols) = (x_vec_state == 1) ? 1 : 0; access::rw(x.n_elem) = 0; access::rw(x.n_alloc) = 0; access::rw(x.mem_state) = 0; @@ -1233,7 +1241,17 @@ Mat::steal_mem(Mat& x) } else { + arma_extra_debug_print("Mat::steal_mem(): copying memory"); + (*this).operator=(x); + + if( (is_move) && (x_mem_state == 0) && (x_n_alloc <= arma_config::mat_prealloc) ) + { + access::rw(x.n_rows) = (x_vec_state == 2) ? 1 : 0; + access::rw(x.n_cols) = (x_vec_state == 1) ? 1 : 0; + access::rw(x.n_elem) = 0; + access::rw(x.mem) = nullptr; + } } } @@ -2744,7 +2762,7 @@ Mat::operator%=(const SpBase& m) typename SpProxy::const_iterator_type it_end = p.end(); // We have to zero everything that isn't being used. - arrayops::inplace_set(memptr(), eT(0), (it.col() * n_rows) + it.row()); + arrayops::fill_zeros(memptr(), (it.col() * n_rows) + it.row()); while(it != it_end) { @@ -2758,7 +2776,7 @@ Mat::operator%=(const SpBase& m) ? (p.get_n_cols() * n_rows) : (it.col() * n_rows) + it.row(); - arrayops::inplace_set(memptr() + cur_loc + 1, eT(0), (next_loc - cur_loc - 1)); + arrayops::fill_zeros(memptr() + cur_loc + 1, (next_loc - cur_loc - 1)); } return *this; @@ -2818,8 +2836,12 @@ Mat::operator=(const SpSubview& X) (*this).zeros(X.n_rows, X.n_cols); + if(X.n_nonzero == 0) { return *this; } + if(X.n_rows == X.m.n_rows) { + X.m.sync(); + const uword sv_col_start = X.aux_col1; const uword sv_col_end = X.aux_col1 + X.n_cols - 1; @@ -2973,7 +2995,7 @@ Mat::operator/=(const spdiagview& X) template -arma_cold +arma_deprecated inline mat_injector< Mat > Mat::operator<<(const eT val) @@ -2984,7 +3006,7 @@ Mat::operator<<(const eT val) template -arma_cold +arma_deprecated inline mat_injector< Mat > Mat::operator<<(const injector_end_of_row<>& x) @@ -4521,15 +4543,28 @@ Mat::shed_cols(const Base& indices) -//! insert N rows at the specified row position, -//! optionally setting the elements of the inserted rows to zero template +arma_deprecated inline void Mat::insert_rows(const uword row_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); + arma_ignore(set_to_zero); + + (*this).insert_rows(row_num, N); + } + + + +template +inline +void +Mat::insert_rows(const uword row_num, const uword N) + { + arma_extra_debug_sigprint(); + const uword t_n_rows = n_rows; const uword t_n_cols = n_cols; @@ -4539,40 +4574,49 @@ Mat::insert_rows(const uword row_num, const uword N, const bool set_to_zero) // insertion at row_num == n_rows is in effect an append operation arma_debug_check_bounds( (row_num > t_n_rows), "Mat::insert_rows(): index out of bounds" ); - if(N > 0) + if(N == 0) { return; } + + Mat out(t_n_rows + N, t_n_cols, arma_nozeros_indicator()); + + if(A_n_rows > 0) { - Mat out(t_n_rows + N, t_n_cols, arma_nozeros_indicator()); - - if(A_n_rows > 0) - { - out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1); - } - - if(B_n_rows > 0) - { - out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows-1); - } - - if(set_to_zero) - { - out.rows(row_num, row_num + N - 1).zeros(); - } - - steal_mem(out); + out.rows(0, A_n_rows-1) = rows(0, A_n_rows-1); } + + if(B_n_rows > 0) + { + out.rows(row_num + N, t_n_rows + N - 1) = rows(row_num, t_n_rows-1); + } + + out.rows(row_num, row_num + N - 1).zeros(); + + steal_mem(out); } -//! insert N columns at the specified column position, -//! optionally setting the elements of the inserted columns to zero template +arma_deprecated inline void Mat::insert_cols(const uword col_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); + arma_ignore(set_to_zero); + + (*this).insert_cols(col_num, N); + } + + + +template +inline +void +Mat::insert_cols(const uword col_num, const uword N) + { + arma_extra_debug_sigprint(); + const uword t_n_rows = n_rows; const uword t_n_cols = n_cols; @@ -4582,27 +4626,23 @@ Mat::insert_cols(const uword col_num, const uword N, const bool set_to_zero) // insertion at col_num == n_cols is in effect an append operation arma_debug_check_bounds( (col_num > t_n_cols), "Mat::insert_cols(): index out of bounds" ); - if(N > 0) + if(N == 0) { return; } + + Mat out(t_n_rows, t_n_cols + N, arma_nozeros_indicator()); + + if(A_n_cols > 0) { - Mat out(t_n_rows, t_n_cols + N, arma_nozeros_indicator()); - - if(A_n_cols > 0) - { - out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1); - } - - if(B_n_cols > 0) - { - out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols-1); - } - - if(set_to_zero) - { - out.cols(col_num, col_num + N - 1).zeros(); - } - - steal_mem(out); + out.cols(0, A_n_cols-1) = cols(0, A_n_cols-1); + } + + if(B_n_cols > 0) + { + out.cols(col_num + N, t_n_cols + N - 1) = cols(col_num, t_n_cols-1); } + + out.cols(col_num, col_num + N - 1).zeros(); + + steal_mem(out); } @@ -4632,6 +4672,9 @@ Mat::insert_rows(const uword row_num, const Base& X) bool err_state = false; char* err_msg = nullptr; + const char* error_message_1 = "Mat::insert_rows(): index out of bounds"; + const char* error_message_2 = "Mat::insert_rows(): given object has an incompatible number of columns"; + // insertion at row_num == n_rows is in effect an append operation arma_debug_set_error @@ -4639,7 +4682,7 @@ Mat::insert_rows(const uword row_num, const Base& X) err_state, err_msg, (row_num > t_n_rows), - "Mat::insert_rows(): index out of bounds" + error_message_1 ); arma_debug_set_error @@ -4647,7 +4690,7 @@ Mat::insert_rows(const uword row_num, const Base& X) err_state, err_msg, ( (C_n_cols != t_n_cols) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ), - "Mat::insert_rows(): given object has an incompatible number of columns" + error_message_2 ); arma_debug_check_bounds(err_state, err_msg); @@ -4705,6 +4748,9 @@ Mat::insert_cols(const uword col_num, const Base& X) bool err_state = false; char* err_msg = nullptr; + const char* error_message_1 = "Mat::insert_cols(): index out of bounds"; + const char* error_message_2 = "Mat::insert_cols(): given object has an incompatible number of rows"; + // insertion at col_num == n_cols is in effect an append operation arma_debug_set_error @@ -4712,7 +4758,7 @@ Mat::insert_cols(const uword col_num, const Base& X) err_state, err_msg, (col_num > t_n_cols), - "Mat::insert_cols(): index out of bounds" + error_message_1 ); arma_debug_set_error @@ -4720,7 +4766,7 @@ Mat::insert_cols(const uword col_num, const Base& X) err_state, err_msg, ( (C_n_rows != t_n_rows) && ( (t_n_rows > 0) || (t_n_cols > 0) ) && ( (C_n_rows > 0) || (C_n_cols > 0) ) ), - "Mat::insert_cols(): given object has an incompatible number of rows" + error_message_2 ); arma_debug_check_bounds(err_state, err_msg); @@ -9183,7 +9229,7 @@ Mat::fixed::fixed() { arma_extra_debug_sigprint_this(this); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Mat::fixed::constructor: zeroing memory"); @@ -9191,7 +9237,6 @@ Mat::fixed::fixed() arrayops::inplace_set_fixed( mem_use, eT(0) ); } - #endif } @@ -10011,17 +10056,14 @@ Mat_aux::set_real(Mat< std::complex >& out, const Base& X) const uword N = out.n_elem; - for(uword i=0; i( A[i], out_mem[i].imag() ); - } + for(uword i=0; i( P.at(row,col), (*out_mem).imag() ); + (*out_mem).real(P.at(row,col)); out_mem++; } } @@ -10055,17 +10097,14 @@ Mat_aux::set_imag(Mat< std::complex >& out, const Base& X) const uword N = out.n_elem; - for(uword i=0; i( out_mem[i].real(), A[i] ); - } + for(uword i=0; i( (*out_mem).real(), P.at(row,col) ); + (*out_mem).imag(P.at(row,col)); out_mem++; } } diff --git a/Include/armadillo/armadillo_bits/Proxy.hpp b/Include/armadillo/armadillo_bits/Proxy.hpp index 335489c41..cc1b75127 100644 --- a/Include/armadillo/armadillo_bits/Proxy.hpp +++ b/Include/armadillo/armadillo_bits/Proxy.hpp @@ -334,101 +334,7 @@ struct Proxy< Gen > template constexpr bool has_overlap(const subview&) const { return false; } - arma_inline bool is_aligned() const { return Gen::is_simple; } - }; - - - -template -struct Proxy< Gen > - { - typedef typename T1::elem_type elem_type; - typedef typename get_pod_type::result pod_type; - typedef Mat stored_type; - typedef const elem_type* ea_type; - typedef const Mat& aligned_ea_type; - - static constexpr bool use_at = false; - static constexpr bool use_mp = false; - static constexpr bool has_subview = false; - - static constexpr bool is_row = Gen::is_row; - static constexpr bool is_col = Gen::is_col; - static constexpr bool is_xvec = Gen::is_xvec; - - arma_aligned const Mat Q; - - inline explicit Proxy(const Gen& A) - : Q(A) - { - arma_extra_debug_sigprint(); - } - - arma_inline uword get_n_rows() const { return (is_row ? 1 : Q.n_rows); } - arma_inline uword get_n_cols() const { return (is_col ? 1 : Q.n_cols); } - arma_inline uword get_n_elem() const { return (is_row ? 1 : Q.n_rows) * (is_col ? 1 : Q.n_cols); } - - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } - - arma_inline ea_type get_ea() const { return Q.memptr(); } - arma_inline aligned_ea_type get_aligned_ea() const { return Q; } - - template - constexpr bool is_alias(const Mat&) const { return false; } - - template - constexpr bool has_overlap(const subview&) const { return false; } - - arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } - }; - - - -template -struct Proxy< Gen > - { - typedef typename T1::elem_type elem_type; - typedef typename get_pod_type::result pod_type; - typedef Mat stored_type; - typedef const elem_type* ea_type; - typedef const Mat& aligned_ea_type; - - static constexpr bool use_at = false; - static constexpr bool use_mp = false; - static constexpr bool has_subview = false; - - static constexpr bool is_row = Gen::is_row; - static constexpr bool is_col = Gen::is_col; - static constexpr bool is_xvec = Gen::is_xvec; - - arma_aligned const Mat Q; - - inline explicit Proxy(const Gen& A) - : Q(A) - { - arma_extra_debug_sigprint(); - } - - arma_inline uword get_n_rows() const { return (is_row ? 1 : Q.n_rows); } - arma_inline uword get_n_cols() const { return (is_col ? 1 : Q.n_cols); } - arma_inline uword get_n_elem() const { return (is_row ? 1 : Q.n_rows) * (is_col ? 1 : Q.n_cols); } - - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword r, const uword c) const { return Q.at(r, c); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } - - arma_inline ea_type get_ea() const { return Q.memptr(); } - arma_inline aligned_ea_type get_aligned_ea() const { return Q; } - - template - constexpr bool is_alias(const Mat&) const { return false; } - - template - constexpr bool has_overlap(const subview&) const { return false; } - - arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } + constexpr bool is_aligned() const { return Gen::is_simple; } }; diff --git a/Include/armadillo/armadillo_bits/ProxyCube.hpp b/Include/armadillo/armadillo_bits/ProxyCube.hpp index d56ece8ce..ef6392843 100644 --- a/Include/armadillo/armadillo_bits/ProxyCube.hpp +++ b/Include/armadillo/armadillo_bits/ProxyCube.hpp @@ -120,97 +120,7 @@ struct ProxyCube< GenCube > template constexpr bool has_overlap(const subview_cube&) const { return false; } - arma_inline bool is_aligned() const { return GenCube::is_simple; } - }; - - - -template -struct ProxyCube< GenCube > - { - typedef eT elem_type; - typedef typename get_pod_type::result pod_type; - typedef Cube stored_type; - typedef const eT* ea_type; - typedef const Cube& aligned_ea_type; - - static constexpr bool use_at = false; - static constexpr bool use_mp = false; - static constexpr bool has_subview = false; - - arma_aligned const Cube Q; - - inline explicit ProxyCube(const GenCube& A) - : Q(A) - { - arma_extra_debug_sigprint(); - } - - arma_inline uword get_n_rows() const { return Q.n_rows; } - arma_inline uword get_n_cols() const { return Q.n_cols; } - arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } - arma_inline uword get_n_slices() const { return Q.n_slices; } - arma_inline uword get_n_elem() const { return Q.n_elem; } - - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } - - arma_inline ea_type get_ea() const { return Q.memptr(); } - arma_inline aligned_ea_type get_aligned_ea() const { return Q; } - - template - constexpr bool is_alias(const Cube&) const { return false; } - - template - constexpr bool has_overlap(const subview_cube&) const { return false; } - - arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } - }; - - - -template -struct ProxyCube< GenCube > - { - typedef eT elem_type; - typedef typename get_pod_type::result pod_type; - typedef Cube stored_type; - typedef const eT* ea_type; - typedef const Cube& aligned_ea_type; - - static constexpr bool use_at = false; - static constexpr bool use_mp = false; - static constexpr bool has_subview = false; - - arma_aligned const Cube Q; - - inline explicit ProxyCube(const GenCube& A) - : Q(A) - { - arma_extra_debug_sigprint(); - } - - arma_inline uword get_n_rows() const { return Q.n_rows; } - arma_inline uword get_n_cols() const { return Q.n_cols; } - arma_inline uword get_n_elem_slice() const { return Q.n_elem_slice; } - arma_inline uword get_n_slices() const { return Q.n_slices; } - arma_inline uword get_n_elem() const { return Q.n_elem; } - - arma_inline elem_type operator[] (const uword i) const { return Q[i]; } - arma_inline elem_type at (const uword r, const uword c, const uword s) const { return Q.at(r, c, s); } - arma_inline elem_type at_alt (const uword i) const { return Q.at_alt(i); } - - arma_inline ea_type get_ea() const { return Q.memptr(); } - arma_inline aligned_ea_type get_aligned_ea() const { return Q; } - - template - constexpr bool is_alias(const Cube&) const { return false; } - - template - constexpr bool has_overlap(const subview_cube&) const { return false; } - - arma_inline bool is_aligned() const { return memory::is_aligned(Q.memptr()); } + constexpr bool is_aligned() const { return GenCube::is_simple; } }; diff --git a/Include/armadillo/armadillo_bits/Row_bones.hpp b/Include/armadillo/armadillo_bits/Row_bones.hpp index 8bccc98ca..1ce03347a 100644 --- a/Include/armadillo/armadillo_bits/Row_bones.hpp +++ b/Include/armadillo/armadillo_bits/Row_bones.hpp @@ -88,7 +88,7 @@ class Row : public Mat inline Row(const subview_cube& X); inline Row& operator=(const subview_cube& X); - arma_cold inline mat_injector operator<<(const eT val); + arma_deprecated inline mat_injector operator<<(const eT val); arma_inline arma_warn_unused const Op,op_htrans> t() const; arma_inline arma_warn_unused const Op,op_htrans> ht() const; @@ -138,7 +138,9 @@ class Row : public Mat template inline void shed_cols(const Base& indices); - inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero = true); + arma_deprecated inline void insert_cols(const uword col_num, const uword N, const bool set_to_zero); + inline void insert_cols(const uword col_num, const uword N); + template inline void insert_cols(const uword col_num, const Base& X); diff --git a/Include/armadillo/armadillo_bits/Row_meat.hpp b/Include/armadillo/armadillo_bits/Row_meat.hpp index 7acf7d52c..f671a6e4f 100644 --- a/Include/armadillo/armadillo_bits/Row_meat.hpp +++ b/Include/armadillo/armadillo_bits/Row_meat.hpp @@ -51,12 +51,11 @@ Row::Row(const uword in_n_elem) { arma_extra_debug_sigprint(); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Row::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } - #endif } @@ -70,12 +69,11 @@ Row::Row(const uword in_n_rows, const uword in_n_cols) Mat::init_warm(in_n_rows, in_n_cols); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Row::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } - #endif } @@ -89,12 +87,11 @@ Row::Row(const SizeMat& s) Mat::init_warm(s.n_rows, s.n_cols); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Row::constructor: zeroing memory"); arrayops::fill_zeros(Mat::memptr(), Mat::n_elem); } - #endif } @@ -314,10 +311,9 @@ Row::Row(const std::vector& x) { arma_extra_debug_sigprint_this(this); - if(x.size() > 0) - { - arrayops::copy( Mat::memptr(), &(x[0]), uword(x.size()) ); - } + const uword N = uword(x.size()); + + if(N > 0) { arrayops::copy( Mat::memptr(), &(x[0]), N ); } } @@ -330,12 +326,11 @@ Row::operator=(const std::vector& x) { arma_extra_debug_sigprint(); - Mat::init_warm(1, uword(x.size())); + const uword N = uword(x.size()); - if(x.size() > 0) - { - arrayops::copy( Mat::memptr(), &(x[0]), uword(x.size()) ); - } + Mat::init_warm(1, N); + + if(N > 0) { arrayops::copy( Mat::memptr(), &(x[0]), N ); } return *this; } @@ -345,11 +340,13 @@ Row::operator=(const std::vector& x) template inline Row::Row(const std::initializer_list& list) - : Mat(arma_vec_indicator(), 2) + : Mat(arma_vec_indicator(), 1, uword(list.size()), 2) { - arma_extra_debug_sigprint(); + arma_extra_debug_sigprint_this(this); - (*this).operator=(list); + const uword N = uword(list.size()); + + if(N > 0) { arrayops::copy( Mat::memptr(), list.begin(), N ); } } @@ -361,14 +358,11 @@ Row::operator=(const std::initializer_list& list) { arma_extra_debug_sigprint(); - Mat tmp(list); + const uword N = uword(list.size()); - arma_debug_check( ((tmp.n_elem > 0) && (tmp.is_vec() == false)), "Mat::init(): requested size is not compatible with row vector layout" ); + Mat::init_warm(1, N); - access::rw(tmp.n_rows) = 1; - access::rw(tmp.n_cols) = tmp.n_elem; - - (*this).steal_mem(tmp); + if(N > 0) { arrayops::copy( Mat::memptr(), list.begin(), N ); } return *this; } @@ -424,15 +418,7 @@ Row::operator=(Row&& X) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); - (*this).steal_mem(X); - - if( (X.mem_state == 0) && (X.n_alloc <= arma_config::mat_prealloc) && (this != &X) ) - { - access::rw(X.n_rows) = 1; - access::rw(X.n_cols) = 0; - access::rw(X.n_elem) = 0; - access::rw(X.mem) = nullptr; - } + (*this).steal_mem(X, true); return *this; } @@ -625,7 +611,7 @@ Row::operator=(const subview_cube& X) template inline -arma_cold +arma_deprecated mat_injector< Row > Row::operator<<(const eT val) { @@ -1068,15 +1054,28 @@ Row::shed_cols(const Base& indices) -//! insert N cols at the specified col position, -//! optionally setting the elements of the inserted cols to zero template +arma_deprecated inline void Row::insert_cols(const uword col_num, const uword N, const bool set_to_zero) { arma_extra_debug_sigprint(); + arma_ignore(set_to_zero); + + (*this).insert_cols(col_num, N); + } + + + +template +inline +void +Row::insert_cols(const uword col_num, const uword N) + { + arma_extra_debug_sigprint(); + const uword t_n_cols = Mat::n_cols; const uword A_n_cols = col_num; @@ -1085,30 +1084,26 @@ Row::insert_cols(const uword col_num, const uword N, const bool set_to_zero) // insertion at col_num == n_cols is in effect an append operation arma_debug_check_bounds( (col_num > t_n_cols), "Row::insert_cols(): index out of bounds" ); - if(N > 0) + if(N == 0) { return; } + + Row out(t_n_cols + N, arma_nozeros_indicator()); + + eT* out_mem = out.memptr(); + const eT* t_mem = (*this).memptr(); + + if(A_n_cols > 0) { - Row out(t_n_cols + N, arma_nozeros_indicator()); - - eT* out_mem = out.memptr(); - const eT* t_mem = (*this).memptr(); - - if(A_n_cols > 0) - { - arrayops::copy( out_mem, t_mem, A_n_cols ); - } - - if(B_n_cols > 0) - { - arrayops::copy( &(out_mem[col_num + N]), &(t_mem[col_num]), B_n_cols ); - } - - if(set_to_zero) - { - arrayops::inplace_set( &(out_mem[col_num]), eT(0), N ); - } - - Mat::steal_mem(out); + arrayops::copy( out_mem, t_mem, A_n_cols ); } + + if(B_n_cols > 0) + { + arrayops::copy( &(out_mem[col_num + N]), &(t_mem[col_num]), B_n_cols ); + } + + arrayops::fill_zeros( &(out_mem[col_num]), N ); + + Mat::steal_mem(out); } @@ -1236,7 +1231,7 @@ Row::fixed::fixed() { arma_extra_debug_sigprint_this(this); - #if (!defined(ARMA_DONT_ZERO_INIT)) + if(arma_config::zero_init) { arma_extra_debug_print("Row::fixed::constructor: zeroing memory"); @@ -1244,7 +1239,6 @@ Row::fixed::fixed() arrayops::inplace_set_fixed( mem_use, eT(0) ); } - #endif } diff --git a/Include/armadillo/armadillo_bits/SpMat_meat.hpp b/Include/armadillo/armadillo_bits/SpMat_meat.hpp index 644f1e5b9..2bb4d98ed 100644 --- a/Include/armadillo/armadillo_bits/SpMat_meat.hpp +++ b/Include/armadillo/armadillo_bits/SpMat_meat.hpp @@ -1355,8 +1355,8 @@ SpMat::operator=(const SpSubview& X) const uword sv_col_start = X.aux_col1; const uword sv_col_end = X.aux_col1 + X.n_cols - 1; - typename SpMat::const_col_iterator m_it = X.m.begin_col(sv_col_start); - typename SpMat::const_col_iterator m_it_end = X.m.end_col(sv_col_end); + typename SpMat::const_col_iterator m_it = X.m.begin_col_no_sync(sv_col_start); + typename SpMat::const_col_iterator m_it_end = X.m.end_col_no_sync(sv_col_end); uword count = 0; @@ -3842,10 +3842,7 @@ SpMat::resize(const uword in_rows, const uword in_cols) { arma_extra_debug_sigprint(); - if( (n_rows == in_rows) && (n_cols == in_cols) ) - { - return; - } + if( (n_rows == in_rows) && (n_cols == in_cols) ) { return; } if( (n_elem == 0) || (n_nonzero == 0) ) { @@ -4561,13 +4558,11 @@ SpMat::reset_cache() } #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) { - cache_mutex.lock(); + const std::lock_guard lock(cache_mutex); cache.reset(); sync_state = 0; - - cache_mutex.unlock(); } #else { @@ -5196,13 +5191,13 @@ SpMat::init(const SpMat& x) #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) if(x.sync_state == 1) { - x.cache_mutex.lock(); + const std::lock_guard lock(x.cache_mutex); + if(x.sync_state == 1) { (*this).init(x.cache); init_done = true; } - x.cache_mutex.unlock(); } #else if(x.sync_state == 1) @@ -5818,6 +5813,8 @@ SpMat::steal_mem(SpMat& x) if(layout_ok) { + arma_extra_debug_print("SpMat::steal_mem(): stealing memory"); + x.sync_csc(); steal_mem_simple(x); @@ -5828,6 +5825,8 @@ SpMat::steal_mem(SpMat& x) } else { + arma_extra_debug_print("SpMat::steal_mem(): copying memory"); + (*this).operator=(x); } } @@ -6800,11 +6799,9 @@ SpMat::sync_cache() const { if(sync_state == 0) { - cache_mutex.lock(); + const std::lock_guard lock(cache_mutex); sync_cache_simple(); - - cache_mutex.unlock(); } } #else @@ -6852,11 +6849,9 @@ SpMat::sync_csc() const #elif (!defined(ARMA_DONT_USE_STD_MUTEX)) if(sync_state == 1) { - cache_mutex.lock(); + const std::lock_guard lock(cache_mutex); sync_csc_simple(); - - cache_mutex.unlock(); } #else { diff --git a/Include/armadillo/armadillo_bits/SpProxy.hpp b/Include/armadillo/armadillo_bits/SpProxy.hpp index fcdc7d231..50adcc802 100644 --- a/Include/armadillo/armadillo_bits/SpProxy.hpp +++ b/Include/armadillo/armadillo_bits/SpProxy.hpp @@ -144,7 +144,7 @@ struct SpProxy< SpCol > } arma_inline uword get_n_rows() const { return Q.n_rows; } - arma_inline uword get_n_cols() const { return 1; } + constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } @@ -195,7 +195,7 @@ struct SpProxy< SpRow > Q.sync(); } - arma_inline uword get_n_rows() const { return 1; } + constexpr uword get_n_rows() const { return 1; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } @@ -300,7 +300,7 @@ struct SpProxy< SpSubview_col > } arma_inline uword get_n_rows() const { return Q.n_rows; } - arma_inline uword get_n_cols() const { return 1; } + constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } @@ -402,7 +402,7 @@ struct SpProxy< SpSubview_row > Q.m.sync(); } - arma_inline uword get_n_rows() const { return 1; } + constexpr uword get_n_rows() const { return 1; } arma_inline uword get_n_cols() const { return Q.n_cols; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } @@ -454,7 +454,7 @@ struct SpProxy< spdiagview > } arma_inline uword get_n_rows() const { return Q.n_rows; } - arma_inline uword get_n_cols() const { return 1; } + constexpr uword get_n_cols() const { return 1; } arma_inline uword get_n_elem() const { return Q.n_elem; } arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } diff --git a/Include/armadillo/armadillo_bits/arma_config.hpp b/Include/armadillo/armadillo_bits/arma_config.hpp index b03962c2a..3bb7f9f24 100644 --- a/Include/armadillo/armadillo_bits/arma_config.hpp +++ b/Include/armadillo/armadillo_bits/arma_config.hpp @@ -209,6 +209,13 @@ struct arma_config #endif + #if defined(ARMA_DONT_ZERO_INIT) + static constexpr bool zero_init = false; + #else + static constexpr bool zero_init = true; + #endif + + static constexpr uword warn_level = (sword(ARMA_WARN_LEVEL) > 0) ? uword(ARMA_WARN_LEVEL) : 0; }; diff --git a/Include/armadillo/armadillo_bits/arma_forward.hpp b/Include/armadillo/armadillo_bits/arma_forward.hpp index a4dd28033..8b2f15d37 100644 --- a/Include/armadillo/armadillo_bits/arma_forward.hpp +++ b/Include/armadillo/armadillo_bits/arma_forward.hpp @@ -117,8 +117,6 @@ class op_rel_noteq; class gen_eye; class gen_ones; class gen_zeros; -class gen_randu; -class gen_randn; @@ -348,6 +346,7 @@ struct arma_nozeros_indicator : public arma_initmode_indicator {}; template struct injector_end_of_row {}; +// DEPRECATED: DO NOT USE IN NEW CODE static const injector_end_of_row<> endr = injector_end_of_row<>(); //!< endr indicates "end of row" when using the << operator; //!< similar conceptual meaning to std::endl diff --git a/Include/armadillo/armadillo_bits/arma_rng.hpp b/Include/armadillo/armadillo_bits/arma_rng.hpp index 9a6b90c75..08d77d263 100644 --- a/Include/armadillo/armadillo_bits/arma_rng.hpp +++ b/Include/armadillo/armadillo_bits/arma_rng.hpp @@ -345,6 +345,40 @@ struct arma_rng::randu } #endif } + + + inline + static + void + fill(eT* mem, const uword N, const double a, const double b) + { + #if defined(ARMA_RNG_ALT) + { + const double r = b - a; + + for(uword i=0; i < N; ++i) { mem[i] = eT( arma_rng_alt::randu_val() * r + a ); } + } + #elif defined(ARMA_USE_EXTERN_RNG) + { + std::uniform_real_distribution local_u_distr(a,b); + + for(uword i=0; i < N; ++i) { mem[i] = eT( local_u_distr(mt19937_64_instance) ); } + } + #else + { + if(N == uword(1)) { mem[0] = eT( arma_rng_cxx03::randu_val() * (b - a) + a ); return; } + + typedef typename std::mt19937_64::result_type local_seed_type; + + std::mt19937_64 local_engine; + std::uniform_real_distribution local_u_distr(a,b); + + local_engine.seed( local_seed_type(std::rand()) ); + + for(uword i=0; i < N; ++i) { mem[i] = eT( local_u_distr(local_engine) ); } + } + #endif + } }; @@ -438,6 +472,68 @@ struct arma_rng::randu< std::complex > } #endif } + + + inline + static + void + fill(std::complex* mem, const uword N, const double a, const double b) + { + #if defined(ARMA_RNG_ALT) + { + const double r = b - a; + + for(uword i=0; i < N; ++i) + { + const T tmp1 = T( arma_rng_alt::randu_val() * r + a ); + const T tmp2 = T( arma_rng_alt::randu_val() * r + a ); + + mem[i] = std::complex(tmp1, tmp2); + } + } + #elif defined(ARMA_USE_EXTERN_RNG) + { + std::uniform_real_distribution local_u_distr(a,b); + + for(uword i=0; i < N; ++i) + { + const T tmp1 = T( local_u_distr(mt19937_64_instance) ); + const T tmp2 = T( local_u_distr(mt19937_64_instance) ); + + mem[i] = std::complex(tmp1, tmp2); + } + } + #else + { + if(N == uword(1)) + { + const double r = b - a; + + const T tmp1 = T( arma_rng_cxx03::randu_val() * r + a); + const T tmp2 = T( arma_rng_cxx03::randu_val() * r + a); + + mem[0] = std::complex(tmp1, tmp2); + + return; + } + + typedef typename std::mt19937_64::result_type local_seed_type; + + std::mt19937_64 local_engine; + std::uniform_real_distribution local_u_distr(a,b); + + local_engine.seed( local_seed_type(std::rand()) ); + + for(uword i=0; i < N; ++i) + { + const T tmp1 = T( local_u_distr(local_engine) ); + const T tmp2 = T( local_u_distr(local_engine) ); + + mem[i] = std::complex(tmp1, tmp2); + } + } + #endif + } }; @@ -581,6 +677,24 @@ struct arma_rng::randn #endif } + + inline + static + void + fill(eT* mem, const uword N, const double mu, const double sd) + { + arma_rng::randn::fill(mem, N); + + if( (mu == double(0)) && (sd == double(1)) ) { return; } + + for(uword i=0; i > } #endif } + + + inline + static + void + fill(std::complex* mem, const uword N, const double mu, const double sd) + { + arma_rng::randn< std::complex >::fill(mem, N); + + if( (mu == double(0)) && (sd == double(1)) ) { return; } + + for(uword i=0; i& val = mem[i]; + + mem[i] = std::complex( ((val.real() * sd) + mu), ((val.imag() * sd) + mu) ); + } + } }; diff --git a/Include/armadillo/armadillo_bits/arma_version.hpp b/Include/armadillo/armadillo_bits/arma_version.hpp index 6a04e15f4..0f90b0b28 100644 --- a/Include/armadillo/armadillo_bits/arma_version.hpp +++ b/Include/armadillo/armadillo_bits/arma_version.hpp @@ -22,9 +22,9 @@ #define ARMA_VERSION_MAJOR 11 -#define ARMA_VERSION_MINOR 0 -#define ARMA_VERSION_PATCH 0 -#define ARMA_VERSION_NAME "Creme Brulee" +#define ARMA_VERSION_MINOR 4 +#define ARMA_VERSION_PATCH 2 +#define ARMA_VERSION_NAME "Ship of Theseus" diff --git a/Include/armadillo/armadillo_bits/arrayops_bones.hpp b/Include/armadillo/armadillo_bits/arrayops_bones.hpp index 2bdb31e04..0beec3ae1 100644 --- a/Include/armadillo/armadillo_bits/arrayops_bones.hpp +++ b/Include/armadillo/armadillo_bits/arrayops_bones.hpp @@ -28,10 +28,6 @@ class arrayops arma_inline static void copy(eT* dest, const eT* src, const uword n_elem); - template - arma_cold inline static void - copy_small(eT* dest, const eT* src, const uword n_elem); - template inline static void fill_zeros(eT* dest, const uword n_elem); @@ -144,11 +140,6 @@ class arrayops void inplace_set_base(eT* dest, const eT val, const uword n_elem); - template - arma_cold inline static - void - inplace_set_small(eT* dest, const eT val, const uword n_elem); - template arma_hot inline static void diff --git a/Include/armadillo/armadillo_bits/arrayops_meat.hpp b/Include/armadillo/armadillo_bits/arrayops_meat.hpp index 39b4742a5..b0cdc57a7 100644 --- a/Include/armadillo/armadillo_bits/arrayops_meat.hpp +++ b/Include/armadillo/armadillo_bits/arrayops_meat.hpp @@ -28,53 +28,7 @@ arrayops::copy(eT* dest, const eT* src, const uword n_elem) { if( (dest == src) || (n_elem == 0) ) { return; } - if(is_cx::no) - { - if(n_elem <= 9) - { - arrayops::copy_small(dest, src, n_elem); - } - else - { - std::memcpy(dest, src, n_elem*sizeof(eT)); - } - } - else - { - std::memcpy(dest, src, n_elem*sizeof(eT)); - } - } - - - -template -arma_cold -inline -void -arrayops::copy_small(eT* dest, const eT* src, const uword n_elem) - { - switch(n_elem) - { - case 9: dest[ 8] = src[ 8]; - // fallthrough - case 8: dest[ 7] = src[ 7]; - // fallthrough - case 7: dest[ 6] = src[ 6]; - // fallthrough - case 6: dest[ 5] = src[ 5]; - // fallthrough - case 5: dest[ 4] = src[ 4]; - // fallthrough - case 4: dest[ 3] = src[ 3]; - // fallthrough - case 3: dest[ 2] = src[ 2]; - // fallthrough - case 2: dest[ 1] = src[ 1]; - // fallthrough - case 1: dest[ 0] = src[ 0]; - // fallthrough - default: ; - } + std::memcpy(dest, src, n_elem*sizeof(eT)); } @@ -679,14 +633,7 @@ arrayops::inplace_set(eT* dest, const eT val, const uword n_elem) } else { - if( (n_elem <= 9) && (is_cx::no) ) - { - arrayops::inplace_set_small(dest, val, n_elem); - } - else - { - arrayops::inplace_set_simple(dest, val, n_elem); - } + arrayops::inplace_set_simple(dest, val, n_elem); } } @@ -745,38 +692,6 @@ arrayops::inplace_set_base(eT* dest, const eT val, const uword n_elem) -template -arma_cold -inline -void -arrayops::inplace_set_small(eT* dest, const eT val, const uword n_elem) - { - switch(n_elem) - { - case 9: dest[ 8] = val; - // fallthrough - case 8: dest[ 7] = val; - // fallthrough - case 7: dest[ 6] = val; - // fallthrough - case 6: dest[ 5] = val; - // fallthrough - case 5: dest[ 4] = val; - // fallthrough - case 4: dest[ 3] = val; - // fallthrough - case 3: dest[ 2] = val; - // fallthrough - case 2: dest[ 1] = val; - // fallthrough - case 1: dest[ 0] = val; - // fallthrough - default:; - } - } - - - template arma_hot inline diff --git a/Include/armadillo/armadillo_bits/auxlib_bones.hpp b/Include/armadillo/armadillo_bits/auxlib_bones.hpp index 7c5aa1654..3c888f3e4 100644 --- a/Include/armadillo/armadillo_bits/auxlib_bones.hpp +++ b/Include/armadillo/armadillo_bits/auxlib_bones.hpp @@ -259,13 +259,13 @@ class auxlib inline static bool solve_square_fast(Mat& out, Mat& A, const Base& B_expr); template - inline static bool solve_square_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly); + inline static bool solve_square_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr); template - inline static bool solve_square_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate, const bool allow_ugly); + inline static bool solve_square_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate); template - inline static bool solve_square_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly); + inline static bool solve_square_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate); // @@ -276,16 +276,16 @@ class auxlib inline static bool solve_sympd_fast_common(Mat& out, Mat& A, const Base& B_expr); template - inline static bool solve_sympd_rcond(Mat& out, bool& out_sympd_state, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly); + inline static bool solve_sympd_rcond(Mat& out, bool& out_sympd_state, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr); template - inline static bool solve_sympd_rcond(Mat< std::complex >& out, bool& out_sympd_state, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base< std::complex,T1>& B_expr, const bool allow_ugly); + inline static bool solve_sympd_rcond(Mat< std::complex >& out, bool& out_sympd_state, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base< std::complex,T1>& B_expr); template - inline static bool solve_sympd_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate, const bool allow_ugly); + inline static bool solve_sympd_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate); template - inline static bool solve_sympd_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly); + inline static bool solve_sympd_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate); // @@ -293,7 +293,7 @@ class auxlib inline static bool solve_rect_fast(Mat& out, Mat& A, const Base& B_expr); template - inline static bool solve_rect_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly); + inline static bool solve_rect_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr); // @@ -309,7 +309,7 @@ class auxlib inline static bool solve_trimat_fast(Mat& out, const Mat& A, const Base& B_expr, const uword layout); template - inline static bool solve_trimat_rcond(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const Base& B_expr, const uword layout, const bool allow_ugly); + inline static bool solve_trimat_rcond(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const Base& B_expr, const uword layout); // @@ -323,19 +323,19 @@ class auxlib inline static bool solve_band_fast_common(Mat& out, const Mat& A, const uword KL, const uword KU, const Base& B_expr); template - inline static bool solve_band_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool allow_ugly); + inline static bool solve_band_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr); template - inline static bool solve_band_rcond(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base< std::complex,T1>& B_expr, const bool allow_ugly); + inline static bool solve_band_rcond(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base< std::complex,T1>& B_expr); template - inline static bool solve_band_rcond_common(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool allow_ugly); + inline static bool solve_band_rcond_common(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const uword KL, const uword KU, const Base& B_expr); template - inline static bool solve_band_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool equilibrate, const bool allow_ugly); + inline static bool solve_band_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool equilibrate); template - inline static bool solve_band_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly); + inline static bool solve_band_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base,T1>& B_expr, const bool equilibrate); // @@ -428,9 +428,6 @@ class auxlib template inline static bool crippled_lapack(const Base&); - template - inline static typename T1::pod_type epsilon_lapack(const Base&); - template inline static bool rudimentary_sym_check(const Mat& X); diff --git a/Include/armadillo/armadillo_bits/auxlib_meat.hpp b/Include/armadillo/armadillo_bits/auxlib_meat.hpp index 0a9399ca7..b662a9f00 100644 --- a/Include/armadillo/armadillo_bits/auxlib_meat.hpp +++ b/Include/armadillo/armadillo_bits/auxlib_meat.hpp @@ -344,7 +344,7 @@ auxlib::inv_sympd_rcond(Mat& A, bool& out_sympd_state, eT& out_rcond, const out_rcond = auxlib::lu_rcond_sympd(A, norm_val); - if( (rcond_threshold > eT(0)) && (out_rcond < rcond_threshold) ) { return false; } + if( arma_isnan(out_rcond) || ((rcond_threshold > eT(0)) && (out_rcond < rcond_threshold)) ) { return false; } arma_extra_debug_print("lapack::potri()"); lapack::potri(&uplo, &n, A.memptr(), &n, &info); @@ -412,7 +412,7 @@ auxlib::inv_sympd_rcond(Mat< std::complex >& A, bool& out_sympd_state, T& out out_rcond = auxlib::lu_rcond_sympd(A, norm_val); - if( (rcond_threshold > T(0)) && (out_rcond < rcond_threshold) ) { return false; } + if( arma_isnan(out_rcond) || ((rcond_threshold > T(0)) && (out_rcond < rcond_threshold)) ) { return false; } arma_extra_debug_print("lapack::potri()"); lapack::potri(&uplo, &n, A.memptr(), &n, &info); @@ -3967,28 +3967,26 @@ auxlib::solve_square_fast(Mat& out, Mat ipiv(A_n_rows + 2); // +2 for paranoia: some versions of Lapack might be trashing memory + podarray ipiv(A.n_rows + 2); // +2 for paranoia: some versions of Lapack might be trashing memory arma_extra_debug_print("lapack::gesv()"); lapack::gesv(&n, &nrhs, A.memptr(), &lda, ipiv.memptr(), out.memptr(), &ldb, &info); @@ -4009,7 +4007,7 @@ auxlib::solve_square_fast(Mat& out, Mat inline bool -auxlib::solve_square_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly) +auxlib::solve_square_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); @@ -4024,9 +4022,9 @@ auxlib::solve_square_rcond(Mat& out, typename T1::pod_ty const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; - - arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); - + + arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in given matrices must be the same", [&](){ out.soft_reset(); } ); + if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } arma_debug_assert_blas_size(A); @@ -4058,8 +4056,6 @@ auxlib::solve_square_rcond(Mat& out, typename T1::pod_ty out_rcond = auxlib::lu_rcond(A, norm_val); - if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } - return true; } #else @@ -4068,7 +4064,6 @@ auxlib::solve_square_rcond(Mat& out, typename T1::pod_ty arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -4081,7 +4076,7 @@ auxlib::solve_square_rcond(Mat& out, typename T1::pod_ty template inline bool -auxlib::solve_square_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate, const bool allow_ugly) +auxlib::solve_square_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate) { arma_extra_debug_sigprint(); @@ -4101,7 +4096,7 @@ auxlib::solve_square_refine(Mat& out, typename T1::pod_ty const Mat& B = (use_copy) ? B_tmp : UB_M_as_Mat; - arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } @@ -4156,7 +4151,7 @@ auxlib::solve_square_refine(Mat& out, typename T1::pod_ty out_rcond = rcond; - return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); + return ((info == 0) || (info == (n+1))); } #else { @@ -4165,7 +4160,6 @@ auxlib::solve_square_refine(Mat& out, typename T1::pod_ty arma_ignore(A); arma_ignore(B_expr); arma_ignore(equilibrate); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -4178,7 +4172,7 @@ auxlib::solve_square_refine(Mat& out, typename T1::pod_ty template inline bool -auxlib::solve_square_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly) +auxlib::solve_square_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate) { arma_extra_debug_sigprint(); @@ -4199,7 +4193,7 @@ auxlib::solve_square_refine(Mat< std::complex >& out, typ const Mat& B = (use_copy) ? B_tmp : UB_M_as_Mat; - arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } @@ -4254,7 +4248,7 @@ auxlib::solve_square_refine(Mat< std::complex >& out, typ out_rcond = rcond; - return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); + return ((info == 0) || (info == (n+1))); } #else { @@ -4263,7 +4257,6 @@ auxlib::solve_square_refine(Mat< std::complex >& out, typ arma_ignore(A); arma_ignore(B_expr); arma_ignore(equilibrate); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -4303,14 +4296,12 @@ auxlib::solve_sympd_fast_common(Mat& out, Mat& out, Mat& out, Mat inline bool -auxlib::solve_sympd_rcond(Mat& out, bool& out_sympd_state, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly) +auxlib::solve_sympd_rcond(Mat& out, bool& out_sympd_state, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); @@ -4364,7 +4355,7 @@ auxlib::solve_sympd_rcond(Mat& out, bool& out_sympd_state const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; - arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in given matrices must be the same", [&](){ out.soft_reset(); } ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } @@ -4396,8 +4387,6 @@ auxlib::solve_sympd_rcond(Mat& out, bool& out_sympd_state out_rcond = auxlib::lu_rcond_sympd(A, norm_val); - if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } - return true; } #else @@ -4407,7 +4396,6 @@ auxlib::solve_sympd_rcond(Mat& out, bool& out_sympd_state arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -4420,7 +4408,7 @@ auxlib::solve_sympd_rcond(Mat& out, bool& out_sympd_state template inline bool -auxlib::solve_sympd_rcond(Mat< std::complex >& out, bool& out_sympd_state, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base< std::complex,T1>& B_expr, const bool allow_ugly) +auxlib::solve_sympd_rcond(Mat< std::complex >& out, bool& out_sympd_state, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base< std::complex,T1>& B_expr) { arma_extra_debug_sigprint(); @@ -4430,7 +4418,7 @@ auxlib::solve_sympd_rcond(Mat< std::complex >& out, bool& out_sympd_state = false; - return auxlib::solve_square_rcond(out, out_rcond, A, B_expr, allow_ugly); + return auxlib::solve_square_rcond(out, out_rcond, A, B_expr); } #elif defined(ARMA_USE_LAPACK) { @@ -4445,7 +4433,7 @@ auxlib::solve_sympd_rcond(Mat< std::complex >& out, bool& const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; - arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in given matrices must be the same", [&](){ out.soft_reset(); } ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } @@ -4477,8 +4465,6 @@ auxlib::solve_sympd_rcond(Mat< std::complex >& out, bool& out_rcond = auxlib::lu_rcond_sympd(A, norm_val); - if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } - return true; } #else @@ -4488,7 +4474,6 @@ auxlib::solve_sympd_rcond(Mat< std::complex >& out, bool& arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -4501,7 +4486,7 @@ auxlib::solve_sympd_rcond(Mat< std::complex >& out, bool& template inline bool -auxlib::solve_sympd_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate, const bool allow_ugly) +auxlib::solve_sympd_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool equilibrate) { arma_extra_debug_sigprint(); @@ -4521,7 +4506,7 @@ auxlib::solve_sympd_refine(Mat& out, typename T1::pod_typ const Mat& B = (use_copy) ? B_tmp : UB_M_as_Mat; - arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } @@ -4558,7 +4543,7 @@ auxlib::solve_sympd_refine(Mat& out, typename T1::pod_typ // NOTE: lapack::posvx() sets rcond to zero if A is not sympd out_rcond = rcond; - return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); + return ((info == 0) || (info == (n+1))); } #else { @@ -4567,7 +4552,6 @@ auxlib::solve_sympd_refine(Mat& out, typename T1::pod_typ arma_ignore(A); arma_ignore(B_expr); arma_ignore(equilibrate); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -4580,7 +4564,7 @@ auxlib::solve_sympd_refine(Mat& out, typename T1::pod_typ template inline bool -auxlib::solve_sympd_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly) +auxlib::solve_sympd_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const Base,T1>& B_expr, const bool equilibrate) { arma_extra_debug_sigprint(); @@ -4588,7 +4572,7 @@ auxlib::solve_sympd_refine(Mat< std::complex >& out, type { arma_extra_debug_print("auxlib::solve_sympd_refine(): redirecting to auxlib::solve_square_refine() due to crippled LAPACK"); - return auxlib::solve_square_refine(out, out_rcond, A, B_expr, equilibrate, allow_ugly); + return auxlib::solve_square_refine(out, out_rcond, A, B_expr, equilibrate); } #elif defined(ARMA_USE_LAPACK) { @@ -4607,7 +4591,7 @@ auxlib::solve_sympd_refine(Mat< std::complex >& out, type const Mat& B = (use_copy) ? B_tmp : UB_M_as_Mat; - arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } @@ -4644,7 +4628,7 @@ auxlib::solve_sympd_refine(Mat< std::complex >& out, type // NOTE: lapack::cx_posvx() sets rcond to zero if A is not sympd out_rcond = rcond; - return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); + return ((info == 0) || (info == (n+1))); } #else { @@ -4653,7 +4637,6 @@ auxlib::solve_sympd_refine(Mat< std::complex >& out, type arma_ignore(A); arma_ignore(B_expr); arma_ignore(equilibrate); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -4677,7 +4660,7 @@ auxlib::solve_rect_fast(Mat& out, Mat U(B_expr.get_ref()); const Mat& B = U.M; - arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_cols, B.n_cols); return true; } @@ -4757,7 +4740,7 @@ auxlib::solve_rect_fast(Mat& out, Mat inline bool -auxlib::solve_rect_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr, const bool allow_ugly) +auxlib::solve_rect_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const Base& B_expr) { arma_extra_debug_sigprint(); @@ -4771,7 +4754,7 @@ auxlib::solve_rect_rcond(Mat& out, typename T1::pod_type const unwrap U(B_expr.get_ref()); const Mat& B = U.M; - arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_cols, B.n_cols); return true; } @@ -4842,8 +4825,6 @@ auxlib::solve_rect_rcond(Mat& out, typename T1::pod_type // determine quality of solution out_rcond = auxlib::rcond_trimat(R, 0); // 0: upper triangular; 1: lower triangular - - if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } } else if(A.n_rows < A.n_cols) @@ -4865,8 +4846,6 @@ auxlib::solve_rect_rcond(Mat& out, typename T1::pod_type // determine quality of solution out_rcond = auxlib::rcond_trimat(L, 1); // 0: upper triangular; 1: lower triangular - - if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } } if(tmp.n_rows == A.n_cols) @@ -4886,7 +4865,6 @@ auxlib::solve_rect_rcond(Mat& out, typename T1::pod_type arma_ignore(out_rcond); arma_ignore(A); arma_ignore(B_expr); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -4909,7 +4887,7 @@ auxlib::solve_approx_svd(Mat& out, Mat U(B_expr.get_ref()); const Mat& B = U.M; - arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_cols, B.n_cols); return true; } @@ -5030,7 +5008,7 @@ auxlib::solve_approx_svd(Mat< std::complex >& out, Mat< s const unwrap U(B_expr.get_ref()); const Mat& B = U.M; - arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_cols, B.n_cols); return true; } @@ -5151,7 +5129,7 @@ auxlib::solve_trimat_fast(Mat& out, const Mat& out, const Mat inline bool -auxlib::solve_trimat_rcond(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const Base& B_expr, const uword layout, const bool allow_ugly) +auxlib::solve_trimat_rcond(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const Base& B_expr, const uword layout) { arma_extra_debug_sigprint(); @@ -5201,7 +5179,7 @@ auxlib::solve_trimat_rcond(Mat& out, typename T1::pod_ty const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; - arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in given matrices must be the same", [&](){ out.soft_reset(); } ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_cols, B_n_cols); return true; } @@ -5222,8 +5200,6 @@ auxlib::solve_trimat_rcond(Mat& out, typename T1::pod_ty // determine quality of solution out_rcond = auxlib::rcond_trimat(A, layout); - if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(A)) ) { return false; } - return true; } #else @@ -5233,7 +5209,6 @@ auxlib::solve_trimat_rcond(Mat& out, typename T1::pod_ty arma_ignore(A); arma_ignore(B_expr); arma_ignore(layout); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -5298,7 +5273,7 @@ auxlib::solve_band_fast_common(Mat& out, const Mat& out, const Mat inline bool -auxlib::solve_band_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool allow_ugly) +auxlib::solve_band_rcond(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr) { arma_extra_debug_sigprint(); - return auxlib::solve_band_rcond_common(out, out_rcond, A, KL, KU, B_expr, allow_ugly); + return auxlib::solve_band_rcond_common(out, out_rcond, A, KL, KU, B_expr); } @@ -5360,7 +5335,7 @@ auxlib::solve_band_rcond(Mat& out, typename T1::pod_type& template inline bool -auxlib::solve_band_rcond(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base< std::complex,T1>& B_expr, const bool allow_ugly) +auxlib::solve_band_rcond(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base< std::complex,T1>& B_expr) { arma_extra_debug_sigprint(); @@ -5371,11 +5346,11 @@ auxlib::solve_band_rcond(Mat< std::complex >& out, typena arma_ignore(KL); arma_ignore(KU); - return auxlib::solve_square_rcond(out, out_rcond, A, B_expr, allow_ugly); + return auxlib::solve_square_rcond(out, out_rcond, A, B_expr); } #else { - return auxlib::solve_band_rcond_common(out, out_rcond, A, KL, KU, B_expr, allow_ugly); + return auxlib::solve_band_rcond_common(out, out_rcond, A, KL, KU, B_expr); } #endif } @@ -5386,7 +5361,7 @@ auxlib::solve_band_rcond(Mat< std::complex >& out, typena template inline bool -auxlib::solve_band_rcond_common(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool allow_ugly) +auxlib::solve_band_rcond_common(Mat& out, typename T1::pod_type& out_rcond, const Mat& A, const uword KL, const uword KU, const Base& B_expr) { arma_extra_debug_sigprint(); @@ -5402,7 +5377,7 @@ auxlib::solve_band_rcond_common(Mat& out, typename T1::p const uword B_n_rows = out.n_rows; const uword B_n_cols = out.n_cols; - arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B_n_rows), "solve(): number of rows in given matrices must be the same", [&](){ out.soft_reset(); } ); if(A.is_empty() || out.is_empty()) { out.zeros(A.n_rows, B_n_cols); return true; } @@ -5444,8 +5419,6 @@ auxlib::solve_band_rcond_common(Mat& out, typename T1::p out_rcond = auxlib::lu_rcond_band(AB, KL, KU, ipiv, norm_val); - if( (allow_ugly == false) && (out_rcond < auxlib::epsilon_lapack(AB)) ) { return false; } - return true; } #else @@ -5456,7 +5429,6 @@ auxlib::solve_band_rcond_common(Mat& out, typename T1::p arma_ignore(KL); arma_ignore(KU); arma_ignore(B_expr); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -5469,7 +5441,7 @@ auxlib::solve_band_rcond_common(Mat& out, typename T1::p template inline bool -auxlib::solve_band_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool equilibrate, const bool allow_ugly) +auxlib::solve_band_refine(Mat& out, typename T1::pod_type& out_rcond, Mat& A, const uword KL, const uword KU, const Base& B_expr, const bool equilibrate) { arma_extra_debug_sigprint(); @@ -5479,7 +5451,7 @@ auxlib::solve_band_refine(Mat& out, typename T1::pod_type Mat B = B_expr.get_ref(); // B is overwritten - arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } @@ -5540,7 +5512,7 @@ auxlib::solve_band_refine(Mat& out, typename T1::pod_type out_rcond = rcond; - return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); + return ((info == 0) || (info == (n+1))); } #else { @@ -5551,7 +5523,6 @@ auxlib::solve_band_refine(Mat& out, typename T1::pod_type arma_ignore(KU); arma_ignore(B_expr); arma_ignore(equilibrate); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -5564,7 +5535,7 @@ auxlib::solve_band_refine(Mat& out, typename T1::pod_type template inline bool -auxlib::solve_band_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base,T1>& B_expr, const bool equilibrate, const bool allow_ugly) +auxlib::solve_band_refine(Mat< std::complex >& out, typename T1::pod_type& out_rcond, Mat< std::complex >& A, const uword KL, const uword KU, const Base,T1>& B_expr, const bool equilibrate) { arma_extra_debug_sigprint(); @@ -5575,7 +5546,7 @@ auxlib::solve_band_refine(Mat< std::complex >& out, typen arma_ignore(KL); arma_ignore(KU); - return auxlib::solve_square_refine(out, out_rcond, A, B_expr, equilibrate, allow_ugly); + return auxlib::solve_square_refine(out, out_rcond, A, B_expr, equilibrate); } #elif defined(ARMA_USE_LAPACK) { @@ -5584,7 +5555,7 @@ auxlib::solve_band_refine(Mat< std::complex >& out, typen Mat B = B_expr.get_ref(); // B is overwritten - arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in the given matrices must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "solve(): number of rows in given matrices must be the same" ); if(A.is_empty() || B.is_empty()) { out.zeros(A.n_rows, B.n_cols); return true; } @@ -5645,7 +5616,7 @@ auxlib::solve_band_refine(Mat< std::complex >& out, typen out_rcond = rcond; - return (allow_ugly) ? ((info == 0) || (info == (n+1))) : (info == 0); + return ((info == 0) || (info == (n+1))); } #else { @@ -5656,7 +5627,6 @@ auxlib::solve_band_refine(Mat< std::complex >& out, typen arma_ignore(KU); arma_ignore(B_expr); arma_ignore(equilibrate); - arma_ignore(allow_ugly); arma_stop_logic_error("solve(): use of LAPACK must be enabled"); return false; } @@ -5718,7 +5688,7 @@ auxlib::solve_tridiag_fast_common(Mat& out, const Mat& A, Mat& B, Mat& vsl, Mat& vsr, const Base& X_e A = X_expr.get_ref(); B = Y_expr.get_ref(); - arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), "qz(): given matrices must be square sized" ); + arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), "qz(): given matrices must be square sized", [&](){ A.soft_reset(); B.soft_reset(); } ); arma_debug_check( (A.n_rows != B.n_rows), "qz(): given matrices must have the same size" ); @@ -6039,7 +6009,7 @@ auxlib::qz(Mat< std::complex >& A, Mat< std::complex >& B, Mat< std::compl A = X_expr.get_ref(); B = Y_expr.get_ref(); - arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), "qz(): given matrices must be square sized" ); + arma_debug_check( ((A.is_square() == false) || (B.is_square() == false)), "qz(): given matrices must be square sized", [&](){ A.soft_reset(); B.soft_reset(); } ); arma_debug_check( (A.n_rows != B.n_rows), "qz(): given matrices must have the same size" ); @@ -6653,58 +6623,6 @@ auxlib::crippled_lapack(const Base&) -template -inline -typename T1::pod_type -auxlib::epsilon_lapack(const Base&) - { - typedef typename T1::pod_type T; - - return T(0.5)*std::numeric_limits::epsilon(); - - // value reverse engineered from dgesvx.f and dlamch.f - // http://www.netlib.org/lapack/explore-html/da/d21/dgesvx_8f.html - // http://www.netlib.org/lapack/explore-html/d5/dd4/dlamch_8f.html - // - // Fortran epsilon(X) function: - // https://gcc.gnu.org/onlinedocs/gfortran/EPSILON.html - // "EPSILON(X) returns the smallest number E of the same kind as X such that 1 + E > 1" - // - // C++ std::numeric_limits::epsilon() function: - // https://en.cppreference.com/w/cpp/types/numeric_limits/epsilon - // "the difference between 1.0 and the next value representable by the floating-point type T" - // - // extract from dgesvx.f: - // - // IF( rcond.LT.dlamch( 'Epsilon' ) ) - // info = n + 1 - // RETURN - // - // extract from dlamch.f: - // - // * rnd = 1.0 when rounding occurs in addition, 0.0 otherwise - // ... - // * 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 - // ... - // END IF - // ... - // dlamch = rmach - // RETURN - } - - - template inline bool diff --git a/Include/armadillo/armadillo_bits/compiler_setup.hpp b/Include/armadillo/armadillo_bits/compiler_setup.hpp index dbe77a914..1927b9769 100644 --- a/Include/armadillo/armadillo_bits/compiler_setup.hpp +++ b/Include/armadillo/armadillo_bits/compiler_setup.hpp @@ -267,12 +267,12 @@ #define arma_hot __attribute__((__hot__)) #endif - #if __has_attribute(__minsize__) - #undef arma_cold - #define arma_cold __attribute__((__minsize__)) - #elif __has_attribute(__cold__) + #if __has_attribute(__cold__) #undef arma_cold #define arma_cold __attribute__((__cold__)) + #elif __has_attribute(__minsize__) + #undef arma_cold + #define arma_cold __attribute__((__minsize__)) #endif #if defined(__has_builtin) && __has_builtin(__builtin_assume_aligned) @@ -465,3 +465,11 @@ #undef minor #undef major + + +// optionally allow disabling of compile-time deprecation messages (not recommended) + +#if defined(ARMA_IGNORE_DEPRECATED_MARKER) && (!defined(ARMA_DONT_IGNORE_DEPRECATED_MARKER)) && (!defined(ARMA_EXTRA_DEBUG)) + #undef arma_deprecated + #define arma_deprecated +#endif diff --git a/Include/armadillo/armadillo_bits/config.hpp b/Include/armadillo/armadillo_bits/config.hpp index 575b5e29d..9de142d2c 100644 --- a/Include/armadillo/armadillo_bits/config.hpp +++ b/Include/armadillo/armadillo_bits/config.hpp @@ -22,7 +22,7 @@ #endif //// The level of warning messages printed to ARMA_CERR_STREAM. //// Must be an integer >= 0. The default value is 2. -//// 0 = no warnings +//// 0 = no warnings; generally not recommended //// 1 = only critical warnings about arguments and/or data which are likely to lead to incorrect results //// 2 = as per level 1, and warnings about poorly conditioned systems (low rcond) detected by solve(), spsolve(), etc //// 3 = as per level 2, and warnings about failed decompositions, failed saving/loading, etc @@ -105,13 +105,13 @@ //// These "hidden" arguments are typically tacked onto the end of function definitions. // #define ARMA_USE_TBB_ALLOC -//// Uncomment the above line if you want to use Intel TBB scalable_malloc() and scalable_free() instead of standard malloc() and free() +//// Uncomment the above line to use Intel TBB scalable_malloc() and scalable_free() instead of standard malloc() and free() // #define ARMA_USE_MKL_ALLOC -//// Uncomment the above line if you want to use Intel MKL mkl_malloc() and mkl_free() instead of standard malloc() and free() +//// Uncomment the above line to use Intel MKL mkl_malloc() and mkl_free() instead of standard malloc() and free() // #define ARMA_USE_MKL_TYPES -//// Uncomment the above line if you want to use Intel MKL types for complex numbers. +//// Uncomment the above line to use Intel MKL types for complex numbers. //// You will need to include appropriate MKL headers before the Armadillo header. //// You may also need to enable or disable the following options: //// ARMA_BLAS_LONG, ARMA_BLAS_LONG_LONG, ARMA_USE_FORTRAN_HIDDEN_ARGS @@ -136,31 +136,31 @@ #endif #if !defined(ARMA_OPTIMISE_BAND) - // #define ARMA_OPTIMISE_BAND - //// Comment out the above line if you don't want automatically optimised handling + #define ARMA_OPTIMISE_BAND + //// Comment out the above line to disable optimised handling //// of band matrices by solve() and chol() #endif #if !defined(ARMA_OPTIMISE_SYMPD) #define ARMA_OPTIMISE_SYMPD - //// Comment out the above line if you don't want automatically optimised handling + //// Comment out the above line to disable optimised handling //// of symmetric/hermitian positive definite matrices by various functions: //// solve(), inv(), pinv(), expmat(), logmat(), sqrtmat(), rcond(), rank() #endif #if !defined(ARMA_OPTIMISE_INVEXPR) #define ARMA_OPTIMISE_INVEXPR - //// Comment out the above line if you don't want automatically optimised handling + //// Comment out the above line to disable optimised handling //// of inv() and inv_sympd() within compound expressions #endif #if !defined(ARMA_CHECK_NONFINITE) #define ARMA_CHECK_NONFINITE - //// Comment out the above line if you don't want automatic checking for nonfinite matrices + //// Comment out the above line to disable checking for nonfinite matrices #endif -// #define ARMA_USE_HDF5_ALT -#if defined(ARMA_USE_HDF5_ALT) && defined(ARMA_USE_WRAPPER) +// #define ARMA_USE_HDF5_CMAKE +#if defined(ARMA_USE_HDF5_CMAKE) && defined(ARMA_USE_WRAPPER) #undef ARMA_USE_HDF5 #define ARMA_USE_HDF5 @@ -168,7 +168,7 @@ #endif #if !defined(ARMA_MAT_PREALLOC) -#define ARMA_MAT_PREALLOC 4 +#define ARMA_MAT_PREALLOC 6 #endif //// This is the number of preallocated elements used by matrices and vectors; //// it must be an integer that is at least 1. @@ -176,7 +176,7 @@ //// change the number to the size of your vectors. #if !defined(ARMA_OPENMP_THRESHOLD) -#define ARMA_OPENMP_THRESHOLD 320 +#define ARMA_OPENMP_THRESHOLD 400 #endif //// The minimum number of elements in a matrix to allow OpenMP based parallelisation; //// it must be an integer that is at least 1. @@ -188,17 +188,22 @@ //// it must be an integer that is at least 1. // #define ARMA_NO_DEBUG -//// Uncomment the above line if you want to disable all run-time checks. -//// This will result in faster code, but you first need to make sure that your code runs correctly! -//// We strongly recommend to have the run-time checks enabled during development, -//// as this greatly aids in finding mistakes in your code, and hence speeds up development. -//// We recommend that run-time checks be disabled _only_ for the shipped version of your program. +//// Uncomment the above line to disable all run-time checks. NOT RECOMMENDED. +//// It is strongly recommended that run-time checks are enabled during development, +//// as this greatly aids in finding mistakes in your code. // #define ARMA_EXTRA_DEBUG -//// Uncomment the above line if you want to see the function traces of how Armadillo evaluates expressions. +//// Uncomment the above line to see the function traces of how Armadillo evaluates expressions. //// This is mainly useful for debugging of the library. +#if defined(ARMA_EXTRA_DEBUG) + #undef ARMA_NO_DEBUG + #undef ARMA_WARN_LEVEL + #define ARMA_WARN_LEVEL 3 +#endif + + #if defined(ARMA_DEFAULT_OSTREAM) #pragma message ("WARNING: support for ARMA_DEFAULT_OSTREAM is deprecated and will be removed;") #pragma message ("WARNING: use ARMA_COUT_STREAM and ARMA_CERR_STREAM instead") @@ -263,7 +268,7 @@ #if defined(ARMA_DONT_USE_WRAPPER) #undef ARMA_USE_WRAPPER - #undef ARMA_USE_HDF5_ALT + #undef ARMA_USE_HDF5_CMAKE #endif #if defined(ARMA_DONT_USE_FORTRAN_HIDDEN_ARGS) @@ -310,7 +315,7 @@ #if defined(ARMA_DONT_USE_HDF5) #undef ARMA_USE_HDF5 - #undef ARMA_USE_HDF5_ALT + #undef ARMA_USE_HDF5_CMAKE #endif #if defined(ARMA_DONT_OPTIMISE_BAND) || defined(ARMA_DONT_OPTIMISE_SOLVE_BAND) @@ -329,10 +334,17 @@ #undef ARMA_CHECK_NONFINITE #endif -// #if defined(ARMA_DONT_PRINT_ERRORS) -// #pragma message ("WARNING: support for ARMA_DONT_PRINT_ERRORS option has been removed;") -// #pragma message ("WARNING: use ARMA_WARN_LEVEL and ARMA_DONT_PRINT_EXCEPTIONS options instead.") -// #endif +#if defined(ARMA_DONT_PRINT_ERRORS) + #pragma message ("INFO: support for ARMA_DONT_PRINT_ERRORS option has been removed") + + #if defined(ARMA_PRINT_EXCEPTIONS) + #pragma message ("INFO: suggest to use ARMA_WARN_LEVEL and ARMA_DONT_PRINT_EXCEPTIONS options instead") + #else + #pragma message ("INFO: suggest to use ARMA_WARN_LEVEL option instead") + #endif + + #pragma message ("INFO: see the documentation for details") +#endif #if defined(ARMA_DONT_PRINT_EXCEPTIONS) #undef ARMA_PRINT_EXCEPTIONS diff --git a/Include/armadillo/armadillo_bits/config.hpp.cmake b/Include/armadillo/armadillo_bits/config.hpp.cmake index 680ab1aa8..07c85b837 100644 --- a/Include/armadillo/armadillo_bits/config.hpp.cmake +++ b/Include/armadillo/armadillo_bits/config.hpp.cmake @@ -22,7 +22,7 @@ #endif //// The level of warning messages printed to ARMA_CERR_STREAM. //// Must be an integer >= 0. The default value is 2. -//// 0 = no warnings +//// 0 = no warnings; generally not recommended //// 1 = only critical warnings about arguments and/or data which are likely to lead to incorrect results //// 2 = as per level 1, and warnings about poorly conditioned systems (low rcond) detected by solve(), spsolve(), etc //// 3 = as per level 2, and warnings about failed decompositions, failed saving/loading, etc @@ -105,13 +105,13 @@ //// These "hidden" arguments are typically tacked onto the end of function definitions. // #define ARMA_USE_TBB_ALLOC -//// Uncomment the above line if you want to use Intel TBB scalable_malloc() and scalable_free() instead of standard malloc() and free() +//// Uncomment the above line to use Intel TBB scalable_malloc() and scalable_free() instead of standard malloc() and free() // #define ARMA_USE_MKL_ALLOC -//// Uncomment the above line if you want to use Intel MKL mkl_malloc() and mkl_free() instead of standard malloc() and free() +//// Uncomment the above line to use Intel MKL mkl_malloc() and mkl_free() instead of standard malloc() and free() // #define ARMA_USE_MKL_TYPES -//// Uncomment the above line if you want to use Intel MKL types for complex numbers. +//// Uncomment the above line to use Intel MKL types for complex numbers. //// You will need to include appropriate MKL headers before the Armadillo header. //// You may also need to enable or disable the following options: //// ARMA_BLAS_LONG, ARMA_BLAS_LONG_LONG, ARMA_USE_FORTRAN_HIDDEN_ARGS @@ -137,30 +137,30 @@ #if !defined(ARMA_OPTIMISE_BAND) #define ARMA_OPTIMISE_BAND - //// Comment out the above line if you don't want automatically optimised handling + //// Comment out the above line to disable optimised handling //// of band matrices by solve() and chol() #endif #if !defined(ARMA_OPTIMISE_SYMPD) #define ARMA_OPTIMISE_SYMPD - //// Comment out the above line if you don't want automatically optimised handling + //// Comment out the above line to disable optimised handling //// of symmetric/hermitian positive definite matrices by various functions: //// solve(), inv(), pinv(), expmat(), logmat(), sqrtmat(), rcond(), rank() #endif #if !defined(ARMA_OPTIMISE_INVEXPR) #define ARMA_OPTIMISE_INVEXPR - //// Comment out the above line if you don't want automatically optimised handling + //// Comment out the above line to disable optimised handling //// of inv() and inv_sympd() within compound expressions #endif #if !defined(ARMA_CHECK_NONFINITE) #define ARMA_CHECK_NONFINITE - //// Comment out the above line if you don't want automatic checking for nonfinite matrices + //// Comment out the above line to disable checking for nonfinite matrices #endif -// #define ARMA_USE_HDF5_ALT -#if defined(ARMA_USE_HDF5_ALT) && defined(ARMA_USE_WRAPPER) +#cmakedefine ARMA_USE_HDF5_CMAKE +#if defined(ARMA_USE_HDF5_CMAKE) && defined(ARMA_USE_WRAPPER) #undef ARMA_USE_HDF5 #define ARMA_USE_HDF5 @@ -188,17 +188,22 @@ //// it must be an integer that is at least 1. // #define ARMA_NO_DEBUG -//// Uncomment the above line if you want to disable all run-time checks. -//// This will result in faster code, but you first need to make sure that your code runs correctly! -//// We strongly recommend to have the run-time checks enabled during development, -//// as this greatly aids in finding mistakes in your code, and hence speeds up development. -//// We recommend that run-time checks be disabled _only_ for the shipped version of your program. +//// Uncomment the above line to disable all run-time checks. NOT RECOMMENDED. +//// It is strongly recommended that run-time checks are enabled during development, +//// as this greatly aids in finding mistakes in your code. // #define ARMA_EXTRA_DEBUG -//// Uncomment the above line if you want to see the function traces of how Armadillo evaluates expressions. +//// Uncomment the above line to see the function traces of how Armadillo evaluates expressions. //// This is mainly useful for debugging of the library. +#if defined(ARMA_EXTRA_DEBUG) + #undef ARMA_NO_DEBUG + #undef ARMA_WARN_LEVEL + #define ARMA_WARN_LEVEL 3 +#endif + + #if defined(ARMA_DEFAULT_OSTREAM) #pragma message ("WARNING: support for ARMA_DEFAULT_OSTREAM is deprecated and will be removed;") #pragma message ("WARNING: use ARMA_COUT_STREAM and ARMA_CERR_STREAM instead") @@ -263,7 +268,7 @@ #if defined(ARMA_DONT_USE_WRAPPER) #undef ARMA_USE_WRAPPER - #undef ARMA_USE_HDF5_ALT + #undef ARMA_USE_HDF5_CMAKE #endif #if defined(ARMA_DONT_USE_FORTRAN_HIDDEN_ARGS) @@ -310,7 +315,7 @@ #if defined(ARMA_DONT_USE_HDF5) #undef ARMA_USE_HDF5 - #undef ARMA_USE_HDF5_ALT + #undef ARMA_USE_HDF5_CMAKE #endif #if defined(ARMA_DONT_OPTIMISE_BAND) || defined(ARMA_DONT_OPTIMISE_SOLVE_BAND) @@ -329,10 +334,17 @@ #undef ARMA_CHECK_NONFINITE #endif -// #if defined(ARMA_DONT_PRINT_ERRORS) -// #pragma message ("WARNING: support for ARMA_DONT_PRINT_ERRORS option has been removed;") -// #pragma message ("WARNING: use ARMA_WARN_LEVEL and ARMA_DONT_PRINT_EXCEPTIONS options instead.") -// #endif +#if defined(ARMA_DONT_PRINT_ERRORS) + #pragma message ("INFO: support for ARMA_DONT_PRINT_ERRORS option has been removed") + + #if defined(ARMA_PRINT_EXCEPTIONS) + #pragma message ("INFO: suggest to use ARMA_WARN_LEVEL and ARMA_DONT_PRINT_EXCEPTIONS options instead") + #else + #pragma message ("INFO: suggest to use ARMA_WARN_LEVEL option instead") + #endif + + #pragma message ("INFO: see the documentation for details") +#endif #if defined(ARMA_DONT_PRINT_EXCEPTIONS) #undef ARMA_PRINT_EXCEPTIONS diff --git a/Include/armadillo/armadillo_bits/debug.hpp b/Include/armadillo/armadillo_bits/debug.hpp index 162496858..6b6fe005a 100644 --- a/Include/armadillo/armadillo_bits/debug.hpp +++ b/Include/armadillo/armadillo_bits/debug.hpp @@ -448,6 +448,16 @@ arma_check(const bool state, const T1& x) } +template +arma_hot +inline +void +arma_check(const bool state, const char* x, const Functor& fn) + { + if(state) { fn(); arma_stop_logic_error(x); } + } + + arma_hot inline void @@ -457,6 +467,16 @@ arma_check(const bool state, const char* x, const char* y) } +template +arma_hot +inline +void +arma_check(const bool state, const char* x, const char* y, const Functor& fn) + { + if(state) { fn(); arma_stop_logic_error(x,y); } + } + + template arma_hot inline @@ -1368,19 +1388,16 @@ arma_assert_atlas_size(const T1& A, const T2& B) #if defined(ARMA_EXTRA_DEBUG) - #undef ARMA_WARN_LEVEL - #define ARMA_WARN_LEVEL 3 - #define arma_extra_debug_sigprint arma_sigprint(ARMA_FNSIG); arma_bktprint #define arma_extra_debug_sigprint_this arma_sigprint(ARMA_FNSIG); arma_thisprint #define arma_extra_debug_print arma_print - + #else #define arma_extra_debug_sigprint true ? (void)0 : arma_bktprint #define arma_extra_debug_sigprint_this true ? (void)0 : arma_thisprint #define arma_extra_debug_print true ? (void)0 : arma_print - + #endif @@ -1438,6 +1455,7 @@ arma_assert_atlas_size(const T1& A, const T2& B) out << "@ arma_config::optimise_sympd = " << arma_config::optimise_sympd << '\n'; out << "@ arma_config::optimise_invexpr = " << arma_config::optimise_invexpr << '\n'; out << "@ arma_config::check_nonfinite = " << arma_config::check_nonfinite << '\n'; + out << "@ arma_config::zero_init = " << arma_config::zero_init << '\n'; out << "@ sizeof(void*) = " << sizeof(void*) << '\n'; out << "@ sizeof(int) = " << sizeof(int) << '\n'; out << "@ sizeof(long) = " << sizeof(long) << '\n'; diff --git a/Include/armadillo/armadillo_bits/def_hdf5.hpp b/Include/armadillo/armadillo_bits/def_hdf5.hpp index f59c76a2b..cb4c3f427 100644 --- a/Include/armadillo/armadillo_bits/def_hdf5.hpp +++ b/Include/armadillo/armadillo_bits/def_hdf5.hpp @@ -18,7 +18,7 @@ #if defined(ARMA_USE_HDF5) -#if !defined(ARMA_USE_HDF5_ALT) +#if !defined(ARMA_USE_HDF5_CMAKE) // macros needed if the wrapper run-time library is not being used diff --git a/Include/armadillo/armadillo_bits/distr_param.hpp b/Include/armadillo/armadillo_bits/distr_param.hpp index 3f4941789..61f3c2346 100644 --- a/Include/armadillo/armadillo_bits/distr_param.hpp +++ b/Include/armadillo/armadillo_bits/distr_param.hpp @@ -26,41 +26,64 @@ class distr_param { public: - uword state; + const uword state; - union - { - int a_int; - double a_double; - }; + private: - union - { - int b_int; - double b_double; - }; + int a_int; + int b_int; + + double a_double; + double b_double; + public: inline distr_param() - : state(0) + : state (0) + , a_int (0) + , b_int (0) + , a_double(0) + , b_double(0) { } inline explicit distr_param(const int a, const int b) - : state(1) - , a_int(a) - , b_int(b) + : state (1) + , a_int (a) + , b_int (b) + , a_double(double(a)) + , b_double(double(b)) { } inline explicit distr_param(const double a, const double b) - : state(2) + : state (2) + , a_int (int(a)) + , b_int (int(b)) , a_double(a) , b_double(b) { } + + + inline void get_int_vals(int& out_a, int& out_b) const + { + if(state == 0) { return; } + + out_a = a_int; + out_b = b_int; + } + + + inline void get_double_vals(double& out_a, double& out_b) const + { + if(state == 0) { return; } + + out_a = a_double; + out_b = b_double; + } }; diff --git a/Include/armadillo/armadillo_bits/eglue_core_meat.hpp b/Include/armadillo/armadillo_bits/eglue_core_meat.hpp index 8e21bf03c..1978ecba8 100644 --- a/Include/armadillo/armadillo_bits/eglue_core_meat.hpp +++ b/Include/armadillo/armadillo_bits/eglue_core_meat.hpp @@ -264,8 +264,8 @@ eglue_core::apply(outT& out, const eGlue& x) typedef typename T1::elem_type eT; - const bool use_at = (Proxy::use_at || Proxy::use_at); - const bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); + constexpr bool use_at = (Proxy::use_at || Proxy::use_at); + constexpr bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); // NOTE: we're assuming that the matrix has already been set to the correct size and there is no aliasing; // size setting and alias checking is done by either the Mat contructor or operator=() @@ -371,8 +371,8 @@ eglue_core::apply_inplace_plus(Mat& out, con eT* out_mem = out.memptr(); - const bool use_at = (Proxy::use_at || Proxy::use_at); - const bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); + constexpr bool use_at = (Proxy::use_at || Proxy::use_at); + constexpr bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); if(use_at == false) { @@ -469,8 +469,8 @@ eglue_core::apply_inplace_minus(Mat& out, co eT* out_mem = out.memptr(); - const bool use_at = (Proxy::use_at || Proxy::use_at); - const bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); + constexpr bool use_at = (Proxy::use_at || Proxy::use_at); + constexpr bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); if(use_at == false) { @@ -567,8 +567,8 @@ eglue_core::apply_inplace_schur(Mat& out, co eT* out_mem = out.memptr(); - const bool use_at = (Proxy::use_at || Proxy::use_at); - const bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); + constexpr bool use_at = (Proxy::use_at || Proxy::use_at); + constexpr bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); if(use_at == false) { @@ -665,8 +665,8 @@ eglue_core::apply_inplace_div(Mat& out, cons eT* out_mem = out.memptr(); - const bool use_at = (Proxy::use_at || Proxy::use_at); - const bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); + constexpr bool use_at = (Proxy::use_at || Proxy::use_at); + constexpr bool use_mp = (Proxy::use_mp || Proxy::use_mp) && (arma_config::openmp); if(use_at == false) { @@ -761,8 +761,8 @@ eglue_core::apply(Cube& out, const eGlueCube typedef typename T1::elem_type eT; - const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); - const bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); + constexpr bool use_at = (ProxyCube::use_at || ProxyCube::use_at); + constexpr bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); // NOTE: we're assuming that the cube has already been set to the correct size and there is no aliasing; // size setting and alias checking is done by either the Cube contructor or operator=() @@ -870,8 +870,8 @@ eglue_core::apply_inplace_plus(Cube& out, co eT* out_mem = out.memptr(); - const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); - const bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); + constexpr bool use_at = (ProxyCube::use_at || ProxyCube::use_at); + constexpr bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); if(use_at == false) { @@ -969,8 +969,8 @@ eglue_core::apply_inplace_minus(Cube& out, c eT* out_mem = out.memptr(); - const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); - const bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); + constexpr bool use_at = (ProxyCube::use_at || ProxyCube::use_at); + constexpr bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); if(use_at == false) { @@ -1068,8 +1068,8 @@ eglue_core::apply_inplace_schur(Cube& out, c eT* out_mem = out.memptr(); - const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); - const bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); + constexpr bool use_at = (ProxyCube::use_at || ProxyCube::use_at); + constexpr bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); if(use_at == false) { @@ -1167,8 +1167,8 @@ eglue_core::apply_inplace_div(Cube& out, con eT* out_mem = out.memptr(); - const bool use_at = (ProxyCube::use_at || ProxyCube::use_at); - const bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); + constexpr bool use_at = (ProxyCube::use_at || ProxyCube::use_at); + constexpr bool use_mp = (ProxyCube::use_mp || ProxyCube::use_mp) && (arma_config::openmp); if(use_at == false) { diff --git a/Include/armadillo/armadillo_bits/eop_aux.hpp b/Include/armadillo/armadillo_bits/eop_aux.hpp index fb96024fa..2b66ef2a6 100644 --- a/Include/armadillo/armadillo_bits/eop_aux.hpp +++ b/Include/armadillo/armadillo_bits/eop_aux.hpp @@ -92,7 +92,7 @@ class eop_aux template arma_inline static typename arma_real_only::result trunc (const eT x) { return std::trunc(x); } template arma_inline static typename arma_cx_only::result trunc (const eT& x) { return eT( std::trunc(x.real()), std::trunc(x.imag()) ); } - template arma_inline static typename arma_integral_only::result log2 (const eT x) { return eT( std::log(double(x))/ double(0.69314718055994530942) ); } + template arma_inline static typename arma_integral_only::result log2 (const eT x) { return eT( std::log2(double(x)) ); } template arma_inline static typename arma_real_only::result log2 (const eT x) { return std::log2(x); } template arma_inline static typename arma_cx_only::result log2 (const eT& x) { typedef typename get_pod_type::result T; return std::log(x) / T(0.69314718055994530942); } @@ -100,7 +100,7 @@ class eop_aux template arma_inline static typename arma_real_only::result log1p (const eT x) { return std::log1p(x); } template arma_inline static typename arma_cx_only::result log1p (const eT& x) { arma_ignore(x); return eT(0); } - template arma_inline static typename arma_integral_only::result exp2 (const eT x) { return eT( std::pow(double(2), double(x)) ); } + template arma_inline static typename arma_integral_only::result exp2 (const eT x) { return eT( std::exp2(double(x)) ); } template arma_inline static typename arma_real_only::result exp2 (const eT x) { return std::exp2(x); } template arma_inline static typename arma_cx_only::result exp2 (const eT& x) { typedef typename get_pod_type::result T; return std::pow( T(2), x); } diff --git a/Include/armadillo/armadillo_bits/field_bones.hpp b/Include/armadillo/armadillo_bits/field_bones.hpp index c7dfc6f2b..303cac4a6 100644 --- a/Include/armadillo/armadillo_bits/field_bones.hpp +++ b/Include/armadillo/armadillo_bits/field_bones.hpp @@ -127,8 +127,8 @@ class field arma_inline arma_warn_unused const oT& back() const; - arma_cold inline field_injector operator<<(const oT& val); - arma_cold inline field_injector operator<<(const injector_end_of_row<>& x); + arma_deprecated inline field_injector operator<<(const oT& val); + arma_deprecated inline field_injector operator<<(const injector_end_of_row<>& x); inline subview_field row(const uword row_num); diff --git a/Include/armadillo/armadillo_bits/field_meat.hpp b/Include/armadillo/armadillo_bits/field_meat.hpp index 22bb45031..6ab67999c 100644 --- a/Include/armadillo/armadillo_bits/field_meat.hpp +++ b/Include/armadillo/armadillo_bits/field_meat.hpp @@ -427,6 +427,8 @@ field::operator=(field&& X) { arma_extra_debug_sigprint(arma_str::format("this = %x X = %x") % this % &X); + if(this == &X) { return *this; } + reset(); access::rw(n_rows ) = X.n_rows; @@ -758,7 +760,7 @@ field::back() const template -arma_cold +arma_deprecated inline field_injector< field > field::operator<<(const oT& val) @@ -769,7 +771,7 @@ field::operator<<(const oT& val) template -arma_cold +arma_deprecated inline field_injector< field > field::operator<<(const injector_end_of_row<>& x) diff --git a/Include/armadillo/armadillo_bits/fn_accu.hpp b/Include/armadillo/armadillo_bits/fn_accu.hpp index b69fc3223..fabf6c676 100644 --- a/Include/armadillo/armadillo_bits/fn_accu.hpp +++ b/Include/armadillo/armadillo_bits/fn_accu.hpp @@ -845,23 +845,36 @@ accu(const SpBase& expr) const SpProxy P(expr.get_ref()); + const uword N = P.get_n_nonzero(); + + if(N == 0) { return eT(0); } + if(SpProxy::use_iterator == false) { // direct counting - return arrayops::accumulate(P.get_values(), P.get_n_nonzero()); + return arrayops::accumulate(P.get_values(), N); } - else + + if(is_SpSubview::stored_type>::value) { - typename SpProxy::const_iterator_type it = P.begin(); + const SpSubview& sv = reinterpret_cast< const SpSubview& >(P.Q); - const uword P_n_nz = P.get_n_nonzero(); - - eT val = eT(0); - - for(uword i=0; i < P_n_nz; ++i) { val += (*it); ++it; } - - return val; + if(sv.n_rows == sv.m.n_rows) + { + const SpMat& m = sv.m; + const uword col = sv.aux_col1; + + return arrayops::accumulate(&(m.values[ m.col_ptrs[col] ]), N); + } } + + typename SpProxy::const_iterator_type it = P.begin(); + + eT val = eT(0); + + for(uword i=0; i < N; ++i) { val += (*it); ++it; } + + return val; } diff --git a/Include/armadillo/armadillo_bits/fn_as_scalar.hpp b/Include/armadillo/armadillo_bits/fn_as_scalar.hpp index 4c02004e5..35ef58cb4 100644 --- a/Include/armadillo/armadillo_bits/fn_as_scalar.hpp +++ b/Include/armadillo/armadillo_bits/fn_as_scalar.hpp @@ -328,40 +328,6 @@ as_scalar(const Base& X) } -template -arma_warn_unused -inline -typename T1::elem_type -as_scalar(const Gen& X) - { - arma_extra_debug_sigprint(); - - typedef typename T1::elem_type eT; - - arma_debug_check( ((X.n_rows != 1) || (X.n_cols != 1)), "as_scalar(): expression must evaluate to exactly one element" ); - - return eT(arma_rng::randu()); - } - - - -template -arma_warn_unused -inline -typename T1::elem_type -as_scalar(const Gen& X) - { - arma_extra_debug_sigprint(); - - typedef typename T1::elem_type eT; - - arma_debug_check( ((X.n_rows != 1) || (X.n_cols != 1)), "as_scalar(): expression must evaluate to exactly one element" ); - - return eT(arma_rng::randn()); - } - - - template arma_warn_unused inline diff --git a/Include/armadillo/armadillo_bits/fn_chol.hpp b/Include/armadillo/armadillo_bits/fn_chol.hpp index c65ef6221..dfd9e6e49 100644 --- a/Include/armadillo/armadillo_bits/fn_chol.hpp +++ b/Include/armadillo/armadillo_bits/fn_chol.hpp @@ -95,7 +95,7 @@ chol out = X.get_ref(); - arma_debug_check( (out.is_square() == false), "chol(): given matrix must be square sized" ); + arma_debug_check( (out.is_square() == false), "chol(): given matrix must be square sized", [&](){ out.soft_reset(); } ); if(out.is_empty()) { diff --git a/Include/armadillo/armadillo_bits/fn_cond.hpp b/Include/armadillo/armadillo_bits/fn_cond_rcond.hpp similarity index 95% rename from Include/armadillo/armadillo_bits/fn_cond.hpp rename to Include/armadillo/armadillo_bits/fn_cond_rcond.hpp index d5f96e1a2..fae0a06ad 100644 --- a/Include/armadillo/armadillo_bits/fn_cond.hpp +++ b/Include/armadillo/armadillo_bits/fn_cond_rcond.hpp @@ -29,7 +29,7 @@ cond(const Base& X) { arma_extra_debug_sigprint(); - return op_cond::cond(X.get_ref()); + return op_cond::apply(X.get_ref()); } @@ -42,7 +42,7 @@ rcond(const Base& X) { arma_extra_debug_sigprint(); - return op_cond::rcond(X.get_ref()); + return op_rcond::apply(X.get_ref()); } diff --git a/Include/armadillo/armadillo_bits/fn_eye.hpp b/Include/armadillo/armadillo_bits/fn_eye.hpp index 703a0a572..4252ffaa7 100644 --- a/Include/armadillo/armadillo_bits/fn_eye.hpp +++ b/Include/armadillo/armadillo_bits/fn_eye.hpp @@ -54,15 +54,8 @@ eye(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only arma_extra_debug_sigprint(); arma_ignore(junk); - if(is_Col::value) - { - arma_debug_check( (n_cols != 1), "eye(): incompatible size" ); - } - else - if(is_Row::value) - { - arma_debug_check( (n_rows != 1), "eye(): incompatible size" ); - } + if(is_Col::value) { arma_debug_check( (n_cols != 1), "eye(): incompatible size" ); } + if(is_Row::value) { arma_debug_check( (n_rows != 1), "eye(): incompatible size" ); } return Gen(n_rows, n_cols); } @@ -92,15 +85,8 @@ eye(const uword n_rows, const uword n_cols, const typename arma_SpMat_SpCol_SpRo arma_extra_debug_sigprint(); arma_ignore(junk); - if(is_SpCol::value) - { - arma_debug_check( (n_cols != 1), "eye(): incompatible size" ); - } - else - if(is_SpRow::value) - { - arma_debug_check( (n_rows != 1), "eye(): incompatible size" ); - } + if(is_SpCol::value) { arma_debug_check( (n_cols != 1), "eye(): incompatible size" ); } + if(is_SpRow::value) { arma_debug_check( (n_rows != 1), "eye(): incompatible size" ); } obj_type out; diff --git a/Include/armadillo/armadillo_bits/fn_find.hpp b/Include/armadillo/armadillo_bits/fn_find.hpp index f86cc7555..5efb254b9 100644 --- a/Include/armadillo/armadillo_bits/fn_find.hpp +++ b/Include/armadillo/armadillo_bits/fn_find.hpp @@ -251,6 +251,24 @@ find_nonfinite(const T1& X) +template +arma_warn_unused +inline +typename +enable_if2 + < + is_arma_type::value, + const mtOp + >::result +find_nan(const T1& X) + { + arma_extra_debug_sigprint(); + + return mtOp(X); + } + + + // @@ -293,6 +311,25 @@ find_nonfinite(const BaseCube& X) +template +arma_warn_unused +inline +uvec +find_nan(const BaseCube& X) + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + + const unwrap_cube tmp(X.get_ref()); + + const Mat R( const_cast< eT* >(tmp.M.memptr()), tmp.M.n_elem, 1, false ); + + return find_nan(R); + } + + + // @@ -385,4 +422,48 @@ find_nonfinite(const SpBase& X) +template +arma_warn_unused +inline +Col +find_nan(const SpBase& X) + { + arma_extra_debug_sigprint(); + + const SpProxy P(X.get_ref()); + + const uword n_rows = P.get_n_rows(); + const uword n_nz = P.get_n_nonzero(); + + Mat tmp(n_nz, 1, arma_nozeros_indicator()); + + uword* tmp_mem = tmp.memptr(); + + typename SpProxy::const_iterator_type it = P.begin(); + + uword count = 0; + + for(uword i=0; i out; + + if(count > 0) { out.steal_mem_col(tmp, count); } + + return out; + } + + + //! @} diff --git a/Include/armadillo/armadillo_bits/fn_inv.hpp b/Include/armadillo/armadillo_bits/fn_inv.hpp index cb603a44b..65589f742 100644 --- a/Include/armadillo/armadillo_bits/fn_inv.hpp +++ b/Include/armadillo/armadillo_bits/fn_inv.hpp @@ -115,10 +115,17 @@ inv { arma_extra_debug_sigprint(); - const bool status = op_inv_gen_rcond::apply_direct(out_inv, out_rcond, X.get_ref()); + typedef typename T1::pod_type T; + + op_inv_gen_state inv_state; + + const bool status = op_inv_gen_rcond::apply_direct(out_inv, inv_state, X.get_ref()); + + out_rcond = inv_state.rcond; if(status == false) { + out_rcond = T(0); out_inv.soft_reset(); arma_debug_warn_level(3, "inv(): matrix is singular"); } diff --git a/Include/armadillo/armadillo_bits/fn_inv_sympd.hpp b/Include/armadillo/armadillo_bits/fn_inv_sympd.hpp index ecec03009..ffd1d0d8a 100644 --- a/Include/armadillo/armadillo_bits/fn_inv_sympd.hpp +++ b/Include/armadillo/armadillo_bits/fn_inv_sympd.hpp @@ -115,10 +115,17 @@ inv_sympd { arma_extra_debug_sigprint(); - const bool status = op_inv_spd_rcond::apply_direct(out_inv, out_rcond, X.get_ref()); + typedef typename T1::pod_type T; + + op_inv_spd_state inv_state; + + const bool status = op_inv_spd_rcond::apply_direct(out_inv, inv_state, X.get_ref()); + + out_rcond = inv_state.rcond; if(status == false) { + out_rcond = T(0); out_inv.soft_reset(); arma_debug_warn_level(3, "inv_sympd(): matrix is singular or not positive definite"); } diff --git a/Include/armadillo/armadillo_bits/fn_norm.hpp b/Include/armadillo/armadillo_bits/fn_norm.hpp index 37ccac0ca..3dbcdb0fc 100644 --- a/Include/armadillo/armadillo_bits/fn_norm.hpp +++ b/Include/armadillo/armadillo_bits/fn_norm.hpp @@ -185,6 +185,20 @@ norm typedef typename T1::elem_type eT; typedef typename T1::pod_type T; + if(is_SpSubview_col::value) + { + const SpSubview_col& sv = reinterpret_cast< const SpSubview_col& >(expr); + + if(sv.n_rows == sv.m.n_rows) + { + const SpMat& m = sv.m; + const uword col = sv.aux_col1; + const eT* mem = &(m.values[ m.col_ptrs[col] ]); + + return spop_norm::vec_norm_k(mem, sv.n_nonzero, k); + } + } + const unwrap_spmat U(expr); const SpMat& X = U.M; @@ -194,17 +208,7 @@ norm if(is_vec) { - // create a fake dense vector to allow reuse of code for dense vectors - Col fake_vector( access::rwp(X.values), X.n_nonzero, false ); - - const Proxy< Col > P_fake_vector(fake_vector); - - if(k == uword(1)) { return op_norm::vec_norm_1(P_fake_vector); } - if(k == uword(2)) { return op_norm::vec_norm_2(P_fake_vector); } - - arma_debug_check( (k == 0), "norm(): k must be greater than zero" ); - - return op_norm::vec_norm_k(P_fake_vector, int(k)); + return spop_norm::vec_norm_k(X.values, X.n_nonzero, k); } else { diff --git a/Include/armadillo/armadillo_bits/fn_ones.hpp b/Include/armadillo/armadillo_bits/fn_ones.hpp index cacadd9f8..ae8b62200 100644 --- a/Include/armadillo/armadillo_bits/fn_ones.hpp +++ b/Include/armadillo/armadillo_bits/fn_ones.hpp @@ -43,14 +43,10 @@ ones(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), cons arma_ignore(junk1); arma_ignore(junk2); - if(is_Row::value) - { - return Gen(1, n_elem); - } - else - { - return Gen(n_elem, 1); - } + const uword n_rows = (is_Row::value) ? uword(1) : n_elem; + const uword n_cols = (is_Row::value) ? n_elem : uword(1); + + return Gen(n_rows, n_cols); } @@ -88,15 +84,8 @@ ones(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_onl arma_extra_debug_sigprint(); arma_ignore(junk); - if(is_Col::value) - { - arma_debug_check( (n_cols != 1), "ones(): incompatible size" ); - } - else - if(is_Row::value) - { - arma_debug_check( (n_rows != 1), "ones(): incompatible size" ); - } + if(is_Col::value) { arma_debug_check( (n_cols != 1), "ones(): incompatible size" ); } + if(is_Row::value) { arma_debug_check( (n_rows != 1), "ones(): incompatible size" ); } return Gen(n_rows, n_cols); } diff --git a/Include/armadillo/armadillo_bits/fn_pinv.hpp b/Include/armadillo/armadillo_bits/fn_pinv.hpp index 4bd4ac4fc..6a8732273 100644 --- a/Include/armadillo/armadillo_bits/fn_pinv.hpp +++ b/Include/armadillo/armadillo_bits/fn_pinv.hpp @@ -21,6 +21,22 @@ +template +arma_warn_unused +inline +typename enable_if2< is_real::value, const Op >::result +pinv + ( + const Base& X + ) + { + arma_extra_debug_sigprint(); + + return Op(X.get_ref()); + } + + + template arma_warn_unused inline @@ -28,7 +44,7 @@ typename enable_if2< is_real::value, const Op& X, - const typename T1::pod_type tol = 0.0, + const typename T1::pod_type tol, const char* method = nullptr ) { diff --git a/Include/armadillo/armadillo_bits/fn_powext.hpp b/Include/armadillo/armadillo_bits/fn_powext.hpp new file mode 100644 index 000000000..a971219d6 --- /dev/null +++ b/Include/armadillo/armadillo_bits/fn_powext.hpp @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) +// Copyright 2008-2016 National ICT Australia (NICTA) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + + +//! \addtogroup fn_powext +//! @{ + + + +template +arma_warn_unused +arma_inline +typename +enable_if2 + < + is_arma_type::value, + const Glue + >::result +pow + ( + const T1& X, + const Base& Y + ) + { + arma_extra_debug_sigprint(); + + return Glue(X, Y.get_ref()); + } + + + +template +arma_warn_unused +inline +Mat +pow + ( + const subview_each1& X, + const Base& Y + ) + { + arma_extra_debug_sigprint(); + + return glue_powext::apply(X,Y); + } + + + +template +arma_warn_unused +arma_inline +const GlueCube +pow + ( + const BaseCube& X, + const BaseCube& Y + ) + { + arma_extra_debug_sigprint(); + + return GlueCube(X.get_ref(), Y.get_ref()); + } + + + +template +arma_warn_unused +inline +Cube +pow + ( + const subview_cube_each1& X, + const Base& Y + ) + { + arma_extra_debug_sigprint(); + + return glue_powext::apply(X,Y); + } + + + +// + + + +template +arma_warn_unused +arma_inline +typename +enable_if2 + < + ( is_arma_type::value && is_cx::yes ), + const mtGlue + >::result +pow + ( + const T1& X, + const Base& Y + ) + { + arma_extra_debug_sigprint(); + + return mtGlue(X, Y.get_ref()); + } + + + +template +arma_warn_unused +inline +typename +enable_if2 + < + is_cx::yes, + Mat + >::result +pow + ( + const subview_each1& X, + const Base& Y + ) + { + arma_extra_debug_sigprint(); + + return glue_powext_cx::apply(X,Y); + } + + + +template +arma_warn_unused +arma_inline +const mtGlueCube +pow + ( + const BaseCube< std::complex, T1>& X, + const BaseCube< typename T1::pod_type , T2>& Y + ) + { + arma_extra_debug_sigprint(); + + return mtGlueCube(X.get_ref(), Y.get_ref()); + } + + + +template +arma_warn_unused +inline +Cube< std::complex > +pow + ( + const subview_cube_each1< std::complex >& X, + const Base& Y + ) + { + arma_extra_debug_sigprint(); + + return glue_powext_cx::apply(X,Y); + } + + + +//! @} diff --git a/Include/armadillo/armadillo_bits/fn_randg.hpp b/Include/armadillo/armadillo_bits/fn_randg.hpp index 400bda348..637994cd6 100644 --- a/Include/armadillo/armadillo_bits/fn_randg.hpp +++ b/Include/armadillo/armadillo_bits/fn_randg.hpp @@ -42,29 +42,14 @@ randg(const uword n_rows, const uword n_cols, const distr_param& param = distr_p arma_debug_check( (n_rows != 1), "randg(): incompatible size" ); } - obj_type out(n_rows, n_cols, arma_nozeros_indicator()); + double a = double(1); + double b = double(1); - double a; - double b; + param.get_double_vals(a,b); - if(param.state == 0) - { - a = double(1); - b = double(1); - } - else - if(param.state == 1) - { - a = double(param.a_int); - b = double(param.b_int); - } - else - { - a = param.a_double; - b = param.b_double; - } + arma_debug_check( ((a <= double(0)) || (b <= double(0))), "randg(): incorrect distribution parameters; a and b must be greater than zero" ); - arma_debug_check( ((a <= double(0)) || (b <= double(0))), "randg(): a and b must be greater than zero" ); + obj_type out(n_rows, n_cols, arma_nozeros_indicator()); arma_rng::randg::fill(out.memptr(), out.n_elem, a, b); @@ -175,29 +160,14 @@ randg(const uword n_rows, const uword n_cols, const uword n_slices, const distr_ typedef typename cube_type::elem_type eT; - cube_type out(n_rows, n_cols, n_slices, arma_nozeros_indicator()); + double a = double(1); + double b = double(1); - double a; - double b; + param.get_double_vals(a,b); - if(param.state == 0) - { - a = double(1); - b = double(1); - } - else - if(param.state == 1) - { - a = double(param.a_int); - b = double(param.b_int); - } - else - { - a = param.a_double; - b = param.b_double; - } + arma_debug_check( ((a <= double(0)) || (b <= double(0))), "randg(): incorrect distribution parameters; a and b must be greater than zero" ); - arma_debug_check( ((a <= double(0)) || (b <= double(0))), "randg(): a and b must be greater than zero" ); + cube_type out(n_rows, n_cols, n_slices, arma_nozeros_indicator()); arma_rng::randg::fill(out.memptr(), out.n_elem, a, b); diff --git a/Include/armadillo/armadillo_bits/fn_randi.hpp b/Include/armadillo/armadillo_bits/fn_randi.hpp index 91b24c263..5bfb9bf30 100644 --- a/Include/armadillo/armadillo_bits/fn_randi.hpp +++ b/Include/armadillo/armadillo_bits/fn_randi.hpp @@ -42,29 +42,14 @@ randi(const uword n_rows, const uword n_cols, const distr_param& param = distr_p arma_debug_check( (n_rows != 1), "randi(): incompatible size" ); } - obj_type out(n_rows, n_cols, arma_nozeros_indicator()); + int a = 0; + int b = arma_rng::randi::max_val(); - int a; - int b; + param.get_int_vals(a,b); - if(param.state == 0) - { - a = 0; - b = arma_rng::randi::max_val(); - } - else - if(param.state == 1) - { - a = param.a_int; - b = param.b_int; - } - else - { - a = int(param.a_double); - b = int(param.b_double); - } + arma_debug_check( (a > b), "randi(): incorrect distribution parameters; a must be less than b" ); - arma_debug_check( (a > b), "randi(): incorrect distribution parameters: a must be less than b" ); + obj_type out(n_rows, n_cols, arma_nozeros_indicator()); arma_rng::randi::fill(out.memptr(), out.n_elem, a, b); @@ -198,29 +183,14 @@ randi(const uword n_rows, const uword n_cols, const uword n_slices, const distr_ typedef typename cube_type::elem_type eT; - cube_type out(n_rows, n_cols, n_slices, arma_nozeros_indicator()); + int a = 0; + int b = arma_rng::randi::max_val(); - int a; - int b; + param.get_int_vals(a,b); - if(param.state == 0) - { - a = 0; - b = arma_rng::randi::max_val(); - } - else - if(param.state == 1) - { - a = param.a_int; - b = param.b_int; - } - else - { - a = int(param.a_double); - b = int(param.b_double); - } + arma_debug_check( (a > b), "randi(): incorrect distribution parameters; a must be less than b" ); - arma_debug_check( (a > b), "randi(): incorrect distribution parameters: a must be less than b" ); + cube_type out(n_rows, n_cols, n_slices, arma_nozeros_indicator()); arma_rng::randi::fill(out.memptr(), out.n_elem, a, b); diff --git a/Include/armadillo/armadillo_bits/fn_randn.hpp b/Include/armadillo/armadillo_bits/fn_randn.hpp index 63ca69d5a..ca868f4a1 100644 --- a/Include/armadillo/armadillo_bits/fn_randn.hpp +++ b/Include/armadillo/armadillo_bits/fn_randn.hpp @@ -21,6 +21,8 @@ +// scalars + arma_warn_unused inline double @@ -42,148 +44,308 @@ randn() -//! Generate a vector with all elements set to random values with a gaussian distribution (zero mean, unit variance) arma_warn_unused -arma_inline -const Gen -randn(const uword n_elem) +inline +double +randn(const distr_param& param) { arma_extra_debug_sigprint(); - return Gen(n_elem, 1); + if(param.state == 0) { return double(arma_rng::randn()); } + + double mu = double(0); + double sd = double(1); + + param.get_double_vals(mu,sd); + + arma_debug_check( (sd <= double(0)), "randn(): incorrect distribution parameters; standard deviation must be > 0" ); + + const double val = double(arma_rng::randn()); + + return ((val * sd) + mu); + } + + + +template +arma_warn_unused +inline +typename arma_real_or_cx_only::result +randn(const distr_param& param) + { + arma_extra_debug_sigprint(); + + if(param.state == 0) { return eT(arma_rng::randn()); } + + double mu = double(0); + double sd = double(1); + + param.get_double_vals(mu,sd); + + arma_debug_check( (sd <= double(0)), "randn(): incorrect distribution parameters; standard deviation must be > 0" ); + + eT val = eT(0); + + arma_rng::randn::fill(&val, 1, mu, sd); // using fill() as eT can be complex + + return val; + } + + + +// vectors + +arma_warn_unused +inline +vec +randn(const uword n_elem, const distr_param& param = distr_param()) + { + arma_extra_debug_sigprint(); + + vec out(n_elem, arma_nozeros_indicator()); + + if(param.state == 0) + { + arma_rng::randn::fill(out.memptr(), n_elem); + } + else + { + double mu = double(0); + double sd = double(1); + + param.get_double_vals(mu,sd); + + arma_debug_check( (sd <= double(0)), "randn(): incorrect distribution parameters; standard deviation must be > 0" ); + + arma_rng::randn::fill(out.memptr(), n_elem, mu, sd); + } + + return out; } template arma_warn_unused -arma_inline -const Gen -randn(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only::result* junk2 = nullptr) +inline +obj_type +randn(const uword n_elem, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); - arma_ignore(junk1); - arma_ignore(junk2); + arma_ignore(junk); + + typedef typename obj_type::elem_type eT; const uword n_rows = (is_Row::value) ? uword(1) : n_elem; const uword n_cols = (is_Row::value) ? n_elem : uword(1); - return Gen(n_rows, n_cols); + obj_type out(n_rows, n_cols, arma_nozeros_indicator()); + + if(param.state == 0) + { + arma_rng::randn::fill(out.memptr(), out.n_elem); + } + else + { + double mu = double(0); + double sd = double(1); + + param.get_double_vals(mu,sd); + + arma_debug_check( (sd <= double(0)), "randn(): incorrect distribution parameters; standard deviation must be > 0" ); + + arma_rng::randn::fill(out.memptr(), out.n_elem, mu, sd); + } + + return out; } -//! Generate a dense matrix with all elements set to random values with a gaussian distribution (zero mean, unit variance) +// matrices + arma_warn_unused -arma_inline -const Gen -randn(const uword n_rows, const uword n_cols) +inline +mat +randn(const uword n_rows, const uword n_cols, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); - return Gen(n_rows, n_cols); + mat out(n_rows, n_cols, arma_nozeros_indicator()); + + if(param.state == 0) + { + arma_rng::randn::fill(out.memptr(), out.n_elem); + } + else + { + double mu = double(0); + double sd = double(1); + + param.get_double_vals(mu,sd); + + arma_debug_check( (sd <= double(0)), "randn(): incorrect distribution parameters; standard deviation must be > 0" ); + + arma_rng::randn::fill(out.memptr(), out.n_elem, mu, sd); + } + + return out; } arma_warn_unused -arma_inline -const Gen -randn(const SizeMat& s) +inline +mat +randn(const SizeMat& s, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); - return Gen(s.n_rows, s.n_cols); + return randn(s.n_rows, s.n_cols, param); } template arma_warn_unused -arma_inline -const Gen -randn(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only::result* junk = nullptr) +inline +obj_type +randn(const uword n_rows, const uword n_cols, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); - if(is_Col::value) + typedef typename obj_type::elem_type eT; + + if(is_Col::value) { arma_debug_check( (n_cols != 1), "randn(): incompatible size" ); } + if(is_Row::value) { arma_debug_check( (n_rows != 1), "randn(): incompatible size" ); } + + obj_type out(n_rows, n_cols, arma_nozeros_indicator()); + + if(param.state == 0) { - arma_debug_check( (n_cols != 1), "randn(): incompatible size" ); + arma_rng::randn::fill(out.memptr(), out.n_elem); } else - if(is_Row::value) { - arma_debug_check( (n_rows != 1), "randn(): incompatible size" ); + double mu = double(0); + double sd = double(1); + + param.get_double_vals(mu,sd); + + arma_debug_check( (sd <= double(0)), "randn(): incorrect distribution parameters; standard deviation must be > 0" ); + + arma_rng::randn::fill(out.memptr(), out.n_elem, mu, sd); } - return Gen(n_rows, n_cols); + return out; } template arma_warn_unused -arma_inline -const Gen -randn(const SizeMat& s, const typename arma_Mat_Col_Row_only::result* junk = nullptr) +inline +obj_type +randn(const SizeMat& s, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); - return randn(s.n_rows, s.n_cols); + return randn(s.n_rows, s.n_cols, param); } +// cubes + + arma_warn_unused -arma_inline -const GenCube -randn(const uword n_rows, const uword n_cols, const uword n_slices) +inline +cube +randn(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); - return GenCube(n_rows, n_cols, n_slices); + cube out(n_rows, n_cols, n_slices, arma_nozeros_indicator()); + + if(param.state == 0) + { + arma_rng::randn::fill(out.memptr(), out.n_elem); + } + else + { + double mu = double(0); + double sd = double(1); + + param.get_double_vals(mu,sd); + + arma_debug_check( (sd <= double(0)), "randn(): incorrect distribution parameters; standard deviation must be > 0" ); + + arma_rng::randn::fill(out.memptr(), out.n_elem, mu, sd); + } + + return out; } arma_warn_unused -arma_inline -const GenCube -randn(const SizeCube& s) +inline +cube +randn(const SizeCube& s, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); - return GenCube(s.n_rows, s.n_cols, s.n_slices); + return randn(s.n_rows, s.n_cols, s.n_slices, param); } template arma_warn_unused -arma_inline -const GenCube -randn(const uword n_rows, const uword n_cols, const uword n_slices, const typename arma_Cube_only::result* junk = nullptr) +inline +cube_type +randn(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param(), const typename arma_Cube_only::result* junk = nullptr) { - arma_extra_debug_sigprint(); + arma_extra_debug_sigprint(); arma_ignore(junk); - return GenCube(n_rows, n_cols, n_slices); + typedef typename cube_type::elem_type eT; + + cube_type out(n_rows, n_cols, n_slices, arma_nozeros_indicator()); + + if(param.state == 0) + { + arma_rng::randn::fill(out.memptr(), out.n_elem); + } + else + { + double mu = double(0); + double sd = double(1); + + param.get_double_vals(mu,sd); + + arma_debug_check( (sd <= double(0)), "randn(): incorrect distribution parameters; standard deviation must be > 0" ); + + arma_rng::randn::fill(out.memptr(), out.n_elem, mu, sd); + } + + return out; } template arma_warn_unused -arma_inline -const GenCube -randn(const SizeCube& s, const typename arma_Cube_only::result* junk = nullptr) +inline +cube_type +randn(const SizeCube& s, const distr_param& param = distr_param(), const typename arma_Cube_only::result* junk = nullptr) { - arma_extra_debug_sigprint(); + arma_extra_debug_sigprint(); arma_ignore(junk); - return GenCube(s.n_rows, s.n_cols, s.n_slices); + return randn(s.n_rows, s.n_cols, s.n_slices, param); } diff --git a/Include/armadillo/armadillo_bits/fn_randu.hpp b/Include/armadillo/armadillo_bits/fn_randu.hpp index 75d024c75..d5a0d383d 100644 --- a/Include/armadillo/armadillo_bits/fn_randu.hpp +++ b/Include/armadillo/armadillo_bits/fn_randu.hpp @@ -21,6 +21,8 @@ +// scalars + arma_warn_unused inline double @@ -42,148 +44,308 @@ randu() -//! Generate a vector with all elements set to random values in the [0,1] interval (uniform distribution) arma_warn_unused -arma_inline -const Gen -randu(const uword n_elem) +inline +double +randu(const distr_param& param) + { + arma_extra_debug_sigprint(); + + if(param.state == 0) { return double(arma_rng::randu()); } + + double a = double(0); + double b = double(1); + + param.get_double_vals(a,b); + + arma_debug_check( (a >= b), "randu(): incorrect distribution parameters; a must be less than b" ); + + const double val = double(arma_rng::randu()); + + return ((val * (b - a)) + a); + } + + + +template +arma_warn_unused +inline +typename arma_real_or_cx_only::result +randu(const distr_param& param) + { + arma_extra_debug_sigprint(); + + if(param.state == 0) { return eT(arma_rng::randu()); } + + double a = double(0); + double b = double(1); + + param.get_double_vals(a,b); + + arma_debug_check( (a >= b), "randu(): incorrect distribution parameters; a must be less than b" ); + + eT val = eT(0); + + arma_rng::randu::fill(&val, 1, a, b); // using fill() as eT can be complex + + return val; + } + + + +// vectors + +arma_warn_unused +inline +vec +randu(const uword n_elem, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); - return Gen(n_elem, 1); + vec out(n_elem, arma_nozeros_indicator()); + + if(param.state == 0) + { + arma_rng::randu::fill(out.memptr(), n_elem); + } + else + { + double a = double(0); + double b = double(1); + + param.get_double_vals(a,b); + + arma_debug_check( (a >= b), "randu(): incorrect distribution parameters; a must be less than b" ); + + arma_rng::randu::fill(out.memptr(), n_elem, a, b); + } + + return out; } template arma_warn_unused -arma_inline -const Gen -randu(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), const typename arma_Mat_Col_Row_only::result* junk2 = nullptr) +inline +obj_type +randu(const uword n_elem, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); - arma_ignore(junk1); - arma_ignore(junk2); + arma_ignore(junk); + + typedef typename obj_type::elem_type eT; const uword n_rows = (is_Row::value) ? uword(1) : n_elem; const uword n_cols = (is_Row::value) ? n_elem : uword(1); - return Gen(n_rows, n_cols); + obj_type out(n_rows, n_cols, arma_nozeros_indicator()); + + if(param.state == 0) + { + arma_rng::randu::fill(out.memptr(), out.n_elem); + } + else + { + double a = double(0); + double b = double(1); + + param.get_double_vals(a,b); + + arma_debug_check( (a >= b), "randu(): incorrect distribution parameters; a must be less than b" ); + + arma_rng::randu::fill(out.memptr(), out.n_elem, a, b); + } + + return out; } -//! Generate a dense matrix with all elements set to random values in the [0,1] interval (uniform distribution) +// matrices + arma_warn_unused -arma_inline -const Gen -randu(const uword n_rows, const uword n_cols) +inline +mat +randu(const uword n_rows, const uword n_cols, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); - return Gen(n_rows, n_cols); + mat out(n_rows, n_cols, arma_nozeros_indicator()); + + if(param.state == 0) + { + arma_rng::randu::fill(out.memptr(), out.n_elem); + } + else + { + double a = double(0); + double b = double(1); + + param.get_double_vals(a,b); + + arma_debug_check( (a >= b), "randu(): incorrect distribution parameters; a must be less than b" ); + + arma_rng::randu::fill(out.memptr(), out.n_elem, a, b); + } + + return out; } arma_warn_unused -arma_inline -const Gen -randu(const SizeMat& s) +inline +mat +randu(const SizeMat& s, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); - return Gen(s.n_rows, s.n_cols); + return randu(s.n_rows, s.n_cols, param); } template arma_warn_unused -arma_inline -const Gen -randu(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_only::result* junk = nullptr) +inline +obj_type +randu(const uword n_rows, const uword n_cols, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); - if(is_Col::value) + typedef typename obj_type::elem_type eT; + + if(is_Col::value) { arma_debug_check( (n_cols != 1), "randu(): incompatible size" ); } + if(is_Row::value) { arma_debug_check( (n_rows != 1), "randu(): incompatible size" ); } + + obj_type out(n_rows, n_cols, arma_nozeros_indicator()); + + if(param.state == 0) { - arma_debug_check( (n_cols != 1), "randu(): incompatible size" ); + arma_rng::randu::fill(out.memptr(), out.n_elem); } else - if(is_Row::value) { - arma_debug_check( (n_rows != 1), "randu(): incompatible size" ); + double a = double(0); + double b = double(1); + + param.get_double_vals(a,b); + + arma_debug_check( (a >= b), "randu(): incorrect distribution parameters; a must be less than b" ); + + arma_rng::randu::fill(out.memptr(), out.n_elem, a, b); } - return Gen(n_rows, n_cols); + return out; } template arma_warn_unused -arma_inline -const Gen -randu(const SizeMat& s, const typename arma_Mat_Col_Row_only::result* junk = nullptr) +inline +obj_type +randu(const SizeMat& s, const distr_param& param = distr_param(), const typename arma_Mat_Col_Row_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); - return randu(s.n_rows, s.n_cols); + return randu(s.n_rows, s.n_cols, param); } +// cubes + + arma_warn_unused -arma_inline -const GenCube -randu(const uword n_rows, const uword n_cols, const uword n_slices) +inline +cube +randu(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); - return GenCube(n_rows, n_cols, n_slices); + cube out(n_rows, n_cols, n_slices, arma_nozeros_indicator()); + + if(param.state == 0) + { + arma_rng::randu::fill(out.memptr(), out.n_elem); + } + else + { + double a = double(0); + double b = double(1); + + param.get_double_vals(a,b); + + arma_debug_check( (a >= b), "randu(): incorrect distribution parameters; a must be less than b" ); + + arma_rng::randu::fill(out.memptr(), out.n_elem, a, b); + } + + return out; } arma_warn_unused -arma_inline -const GenCube -randu(const SizeCube& s) +inline +cube +randu(const SizeCube& s, const distr_param& param = distr_param()) { arma_extra_debug_sigprint(); - return GenCube(s.n_rows, s.n_cols, s.n_slices); + return randu(s.n_rows, s.n_cols, s.n_slices, param); } template arma_warn_unused -arma_inline -const GenCube -randu(const uword n_rows, const uword n_cols, const uword n_slices, const typename arma_Cube_only::result* junk = nullptr) +inline +cube_type +randu(const uword n_rows, const uword n_cols, const uword n_slices, const distr_param& param = distr_param(), const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); - return GenCube(n_rows, n_cols, n_slices); + typedef typename cube_type::elem_type eT; + + cube_type out(n_rows, n_cols, n_slices, arma_nozeros_indicator()); + + if(param.state == 0) + { + arma_rng::randu::fill(out.memptr(), out.n_elem); + } + else + { + double a = double(0); + double b = double(1); + + param.get_double_vals(a,b); + + arma_debug_check( (a >= b), "randu(): incorrect distribution parameters; a must be less than b" ); + + arma_rng::randu::fill(out.memptr(), out.n_elem, a, b); + } + + return out; } template arma_warn_unused -arma_inline -const GenCube -randu(const SizeCube& s, const typename arma_Cube_only::result* junk = nullptr) +inline +cube_type +randu(const SizeCube& s, const distr_param& param = distr_param(), const typename arma_Cube_only::result* junk = nullptr) { arma_extra_debug_sigprint(); arma_ignore(junk); - return GenCube(s.n_rows, s.n_cols, s.n_slices); + return randu(s.n_rows, s.n_cols, s.n_slices, param); } diff --git a/Include/armadillo/armadillo_bits/fn_speye.hpp b/Include/armadillo/armadillo_bits/fn_speye.hpp index a282ec137..48570be23 100644 --- a/Include/armadillo/armadillo_bits/fn_speye.hpp +++ b/Include/armadillo/armadillo_bits/fn_speye.hpp @@ -31,15 +31,8 @@ speye(const uword n_rows, const uword n_cols, const typename arma_SpMat_SpCol_Sp arma_extra_debug_sigprint(); arma_ignore(junk); - if(is_SpCol::value) - { - arma_debug_check( (n_cols != 1), "speye(): incompatible size" ); - } - else - if(is_SpRow::value) - { - arma_debug_check( (n_rows != 1), "speye(): incompatible size" ); - } + if(is_SpCol::value) { arma_debug_check( (n_cols != 1), "speye(): incompatible size" ); } + if(is_SpRow::value) { arma_debug_check( (n_rows != 1), "speye(): incompatible size" ); } obj_type out; diff --git a/Include/armadillo/armadillo_bits/fn_spsolve.hpp b/Include/armadillo/armadillo_bits/fn_spsolve.hpp index ee04a870b..7b71347da 100644 --- a/Include/armadillo/armadillo_bits/fn_spsolve.hpp +++ b/Include/armadillo/armadillo_bits/fn_spsolve.hpp @@ -114,7 +114,7 @@ spsolve_helper arma_debug_warn_level(2, "spsolve(): system is singular (rcond: ", rcond, ")"); } - if( (status == true) && (rcond > T(0)) && (rcond < auxlib::epsilon_lapack(out)) ) + if( (status == true) && (rcond > T(0)) && (rcond < std::numeric_limits::epsilon()) ) { arma_debug_warn_level(2, "solve(): solution computed, but system is singular to working precision (rcond: ", rcond, ")"); } diff --git a/Include/armadillo/armadillo_bits/fn_trace.hpp b/Include/armadillo/armadillo_bits/fn_trace.hpp index 5d6dc5a69..8a15bac21 100644 --- a/Include/armadillo/armadillo_bits/fn_trace.hpp +++ b/Include/armadillo/armadillo_bits/fn_trace.hpp @@ -102,10 +102,7 @@ trace(const Glue& X) arma_debug_assert_trans_mul_size< partial_unwrap::do_trans, partial_unwrap::do_trans >(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); - if( (A.n_elem == 0) || (B.n_elem == 0) ) - { - return eT(0); - } + if( (A.n_elem == 0) || (B.n_elem == 0) ) { return eT(0); } const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; @@ -224,10 +221,7 @@ trace(const Glue& X) arma_debug_assert_trans_mul_size< partial_unwrap::do_trans, partial_unwrap::do_trans >(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); - if( (A.n_elem == 0) || (B.n_elem == 0) ) - { - return eT(0); - } + if( (A.n_elem == 0) || (B.n_elem == 0) ) { return eT(0); } const uword A_n_rows = A.n_rows; const uword A_n_cols = A.n_cols; @@ -516,10 +510,7 @@ trace(const SpGlue& expr) arma_debug_assert_mul_size(A.n_rows, A.n_cols, B.n_rows, B.n_cols, "matrix multiplication"); - if( (A.n_nonzero == 0) || (B.n_nonzero == 0) ) - { - return eT(0); - } + if( (A.n_nonzero == 0) || (B.n_nonzero == 0) ) { return eT(0); } const uword N = (std::min)(A.n_rows, B.n_cols); @@ -576,10 +567,7 @@ trace(const SpGlue, T2, spglue_times>& expr) // NOTE: deliberately swapped A.n_rows and A.n_cols to take into account the requested transpose operation arma_debug_assert_mul_size(A.n_cols, A.n_rows, B.n_rows, B.n_cols, "matrix multiplication"); - if( (A.n_nonzero == 0) || (B.n_nonzero == 0) ) - { - return eT(0); - } + if( (A.n_nonzero == 0) || (B.n_nonzero == 0) ) { return eT(0); } const uword N = (std::min)(A.n_cols, B.n_cols); @@ -635,10 +623,7 @@ trace(const SpGlue, T2, spglue_times>& expr) // NOTE: deliberately swapped A.n_rows and A.n_cols to take into account the requested transpose operation arma_debug_assert_mul_size(A.n_cols, A.n_rows, B.n_rows, B.n_cols, "matrix multiplication"); - if( (A.n_nonzero == 0) || (B.n_nonzero == 0) ) - { - return eT(0); - } + if( (A.n_nonzero == 0) || (B.n_nonzero == 0) ) { return eT(0); } const uword N = (std::min)(A.n_cols, B.n_cols); diff --git a/Include/armadillo/armadillo_bits/fn_zeros.hpp b/Include/armadillo/armadillo_bits/fn_zeros.hpp index cdb47d718..5f0692236 100644 --- a/Include/armadillo/armadillo_bits/fn_zeros.hpp +++ b/Include/armadillo/armadillo_bits/fn_zeros.hpp @@ -43,14 +43,10 @@ zeros(const uword n_elem, const arma_empty_class junk1 = arma_empty_class(), con arma_ignore(junk1); arma_ignore(junk2); - if(is_Row::value) - { - return Gen(1, n_elem); - } - else - { - return Gen(n_elem, 1); - } + const uword n_rows = (is_Row::value) ? uword(1) : n_elem; + const uword n_cols = (is_Row::value) ? n_elem : uword(1); + + return Gen(n_rows, n_cols); } @@ -88,15 +84,8 @@ zeros(const uword n_rows, const uword n_cols, const typename arma_Mat_Col_Row_on arma_extra_debug_sigprint(); arma_ignore(junk); - if(is_Col::value) - { - arma_debug_check( (n_cols != 1), "zeros(): incompatible size" ); - } - else - if(is_Row::value) - { - arma_debug_check( (n_rows != 1), "zeros(): incompatible size" ); - } + if(is_Col::value) { arma_debug_check( (n_cols != 1), "zeros(): incompatible size" ); } + if(is_Row::value) { arma_debug_check( (n_rows != 1), "zeros(): incompatible size" ); } return Gen(n_rows, n_cols); } @@ -178,15 +167,8 @@ zeros(const uword n_rows, const uword n_cols, const typename arma_SpMat_SpCol_Sp arma_extra_debug_sigprint(); arma_ignore(junk); - if(is_SpCol::value) - { - arma_debug_check( (n_cols != 1), "zeros(): incompatible size" ); - } - else - if(is_SpRow::value) - { - arma_debug_check( (n_rows != 1), "zeros(): incompatible size" ); - } + if(is_SpCol::value) { arma_debug_check( (n_cols != 1), "zeros(): incompatible size" ); } + if(is_SpRow::value) { arma_debug_check( (n_rows != 1), "zeros(): incompatible size" ); } return sp_obj_type(n_rows, n_cols); } diff --git a/Include/armadillo/armadillo_bits/glue_kron_meat.hpp b/Include/armadillo/armadillo_bits/glue_kron_meat.hpp index f12aa53da..c7c4ff639 100644 --- a/Include/armadillo/armadillo_bits/glue_kron_meat.hpp +++ b/Include/armadillo/armadillo_bits/glue_kron_meat.hpp @@ -125,24 +125,21 @@ glue_kron::apply(Mat& out, const Glue& typedef typename T1::elem_type eT; - const unwrap A_tmp(X.A); - const unwrap B_tmp(X.B); + const quasi_unwrap UA(X.A); + const quasi_unwrap UB(X.B); - const Mat& A = A_tmp.M; - const Mat& B = B_tmp.M; - - if( (&out != &A) && (&out != &B) ) - { - glue_kron::direct_kron(out, A, B); - } - else + if(UA.is_alias(out) || UB.is_alias(out)) { Mat tmp; - glue_kron::direct_kron(tmp, A, B); + glue_kron::direct_kron(tmp, UA.M, UB.M); out.steal_mem(tmp); } + else + { + glue_kron::direct_kron(out, UA.M, UB.M); + } } diff --git a/Include/armadillo/armadillo_bits/glue_powext_bones.hpp b/Include/armadillo/armadillo_bits/glue_powext_bones.hpp new file mode 100644 index 000000000..d5698c5ca --- /dev/null +++ b/Include/armadillo/armadillo_bits/glue_powext_bones.hpp @@ -0,0 +1,70 @@ + +// SPDX-License-Identifier: Apache-2.0 +// +// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) +// Copyright 2008-2016 National ICT Australia (NICTA) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + + + +//! \addtogroup glue_powext +//! @{ + + + +class glue_powext + : public traits_glue_or + { + public: + + template inline static void apply(Mat& out, const Glue& X); + + template inline static void apply(Mat& out, const Mat& A, const Mat& B); + + template inline static Mat apply(const subview_each1& X, const Base& Y); + + // + + template inline static void apply(Cube& out, const GlueCube& X); + + template inline static void apply(Cube& out, const Cube& A, const Cube& B); + + template inline static Cube apply(const subview_cube_each1& X, const Base& Y); + }; + + + +class glue_powext_cx + : public traits_glue_or + { + public: + + template inline static void apply(Mat& out, const mtGlue& X); + + template inline static void apply(Mat< std::complex >& out, const Mat< std::complex >& A, const Mat& B); + + template inline static Mat apply(const subview_each1& X, const Base& Y); + + // + + template inline static void apply(Cube& out, const mtGlueCube& X); + + template inline static void apply(Cube< std::complex >& out, const Cube< std::complex >& A, const Cube& B); + + template inline static Cube< std::complex > apply(const subview_cube_each1< std::complex >& X, const Base& Y); + }; + + + +//! @} diff --git a/Include/armadillo/armadillo_bits/glue_powext_meat.hpp b/Include/armadillo/armadillo_bits/glue_powext_meat.hpp new file mode 100644 index 000000000..700a2cfd7 --- /dev/null +++ b/Include/armadillo/armadillo_bits/glue_powext_meat.hpp @@ -0,0 +1,674 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) +// Copyright 2008-2016 National ICT Australia (NICTA) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + + + +//! \addtogroup glue_powext +//! @{ + + +template +inline +void +glue_powext::apply(Mat& out, const Glue& X) + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + + const quasi_unwrap UA(X.A); + const quasi_unwrap UB(X.B); + + const Mat& A = UA.M; + const Mat& B = UB.M; + + arma_debug_assert_same_size(A, B, "element-wise pow()"); + + const bool UA_bad_alias = UA.is_alias(out) && (UA.has_subview); // allow inplace operation + const bool UB_bad_alias = UB.is_alias(out); + + if(UA_bad_alias || UB_bad_alias) + { + Mat tmp; + + glue_powext::apply(tmp, A, B); + + out.steal_mem(tmp); + } + else + { + glue_powext::apply(out, A, B); + } + } + + + +template +inline +void +glue_powext::apply(Mat& out, const Mat& A, const Mat& B) + { + arma_extra_debug_sigprint(); + + out.set_size(A.n_rows, A.n_cols); + + const uword N = out.n_elem; + + eT* out_mem = out.memptr(); + const eT* A_mem = A.memptr(); + const eT* B_mem = B.memptr(); + + if( arma_config::openmp && mp_gate::eval(N) ) + { + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = mp_thread_limit::get(); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i +inline +Mat +glue_powext::apply + ( + const subview_each1& X, + const Base& Y + ) + { + arma_extra_debug_sigprint(); + + typedef typename parent::elem_type eT; + + const parent& A = X.P; + + const uword A_n_rows = A.n_rows; + const uword A_n_cols = A.n_cols; + + Mat out(A_n_rows, A_n_cols, arma_nozeros_indicator()); + + const quasi_unwrap tmp(Y.get_ref()); + const Mat& B = tmp.M; + + X.check_size(B); + + const eT* B_mem = B.memptr(); + + if(mode == 0) // each column + { + if( arma_config::openmp && mp_gate::eval(A.n_elem) ) + { + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = int( (std::min)(uword(mp_thread_limit::get()), A_n_cols) ); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = eop_aux::pow(A_mem[row], B_mem[row]); + } + } + } + #endif + } + else + { + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = eop_aux::pow(A_mem[row], B_mem[row]); + } + } + } + } + + if(mode == 1) // each row + { + if( arma_config::openmp && mp_gate::eval(A.n_elem) ) + { + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = int( (std::min)(uword(mp_thread_limit::get()), A_n_cols) ); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + const eT B_val = B_mem[i]; + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = eop_aux::pow(A_mem[row], B_val); + } + } + } + #endif + } + else + { + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + const eT B_val = B_mem[i]; + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = eop_aux::pow(A_mem[row], B_val); + } + } + } + } + + return out; + } + + + +template +inline +void +glue_powext::apply(Cube& out, const GlueCube& X) + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + + const unwrap_cube UA(X.A); + const unwrap_cube UB(X.B); + + const Cube& A = UA.M; + const Cube& B = UB.M; + + arma_debug_assert_same_size(A, B, "element-wise pow()"); + + if(UB.is_alias(out)) + { + Cube tmp; + + glue_powext::apply(tmp, A, B); + + out.steal_mem(tmp); + } + else + { + glue_powext::apply(out, A, B); + } + } + + + +template +inline +void +glue_powext::apply(Cube& out, const Cube& A, const Cube& B) + { + arma_extra_debug_sigprint(); + + out.set_size(A.n_rows, A.n_cols, A.n_slices); + + const uword N = out.n_elem; + + eT* out_mem = out.memptr(); + const eT* A_mem = A.memptr(); + const eT* B_mem = B.memptr(); + + if( arma_config::openmp && mp_gate::eval(N) ) + { + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = mp_thread_limit::get(); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i +inline +Cube +glue_powext::apply + ( + const subview_cube_each1& X, + const Base& Y + ) + { + arma_extra_debug_sigprint(); + + const Cube& A = X.P; + + const uword A_n_rows = A.n_rows; + const uword A_n_cols = A.n_cols; + const uword A_n_slices = A.n_slices; + + Cube out(A_n_rows, A_n_cols, A_n_slices, arma_nozeros_indicator()); + + const quasi_unwrap tmp(Y.get_ref()); + const Mat& B = tmp.M; + + X.check_size(B); + + const eT* B_mem = B.memptr(); + const uword B_n_elem = B.n_elem; + + if( arma_config::openmp && mp_gate::eval(A.n_elem) ) + { + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = int( (std::min)(uword(mp_thread_limit::get()), A_n_slices) ); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword s=0; s < A_n_slices; ++s) + { + const eT* A_slice_mem = A.slice_memptr(s); + eT* out_slice_mem = out.slice_memptr(s); + + for(uword i=0; i < B_n_elem; ++i) + { + out_slice_mem[i] = eop_aux::pow(A_slice_mem[i], B_mem[i]); + } + } + } + #endif + } + else + { + for(uword s=0; s < A_n_slices; ++s) + { + const eT* A_slice_mem = A.slice_memptr(s); + eT* out_slice_mem = out.slice_memptr(s); + + for(uword i=0; i < B_n_elem; ++i) + { + out_slice_mem[i] = eop_aux::pow(A_slice_mem[i], B_mem[i]); + } + } + } + + return out; + } + + + +// + + + +template +inline +void +glue_powext_cx::apply(Mat& out, const mtGlue& X) + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + typedef typename T1::pod_type T; + + const quasi_unwrap UA(X.A); + const quasi_unwrap UB(X.B); + + const Mat& A = UA.M; + const Mat< T>& B = UB.M; + + arma_debug_assert_same_size(A, B, "element-wise pow()"); + + if(UA.is_alias(out) && (UA.has_subview)) + { + Mat tmp; + + glue_powext_cx::apply(tmp, A, B); + + out.steal_mem(tmp); + } + else + { + glue_powext_cx::apply(out, A, B); + } + } + + + +template +inline +void +glue_powext_cx::apply(Mat< std::complex >& out, const Mat< std::complex >& A, const Mat& B) + { + arma_extra_debug_sigprint(); + + typedef typename std::complex eT; + + out.set_size(A.n_rows, A.n_cols); + + const uword N = out.n_elem; + + eT* out_mem = out.memptr(); + const eT* A_mem = A.memptr(); + const T* B_mem = B.memptr(); + + if( arma_config::openmp && mp_gate::eval(N) ) + { + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = mp_thread_limit::get(); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i +inline +Mat +glue_powext_cx::apply + ( + const subview_each1& X, + const Base& Y + ) + { + arma_extra_debug_sigprint(); + + typedef typename parent::elem_type eT; + typedef typename parent::pod_type T; + + const parent& A = X.P; + + const uword A_n_rows = A.n_rows; + const uword A_n_cols = A.n_cols; + + Mat out(A_n_rows, A_n_cols, arma_nozeros_indicator()); + + const quasi_unwrap tmp(Y.get_ref()); + const Mat& B = tmp.M; + + X.check_size(B); + + const T* B_mem = B.memptr(); + + if(mode == 0) // each column + { + if( arma_config::openmp && mp_gate::eval(A.n_elem) ) + { + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = int( (std::min)(uword(mp_thread_limit::get()), A_n_cols) ); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = std::pow(A_mem[row], B_mem[row]); + } + } + } + #endif + } + else + { + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = std::pow(A_mem[row], B_mem[row]); + } + } + } + } + + if(mode == 1) // each row + { + if( arma_config::openmp && mp_gate::eval(A.n_elem) ) + { + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = int( (std::min)(uword(mp_thread_limit::get()), A_n_cols) ); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + const eT B_val = B_mem[i]; + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = std::pow(A_mem[row], B_val); + } + } + } + #endif + } + else + { + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + const eT B_val = B_mem[i]; + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = std::pow(A_mem[row], B_val); + } + } + } + } + + return out; + } + + + +template +inline +void +glue_powext_cx::apply(Cube& out, const mtGlueCube& X) + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + + typedef typename get_pod_type::result T; + + const unwrap_cube UA(X.A); + const unwrap_cube UB(X.B); + + const Cube& A = UA.M; + const Cube< T>& B = UB.M; + + arma_debug_assert_same_size(A, B, "element-wise pow()"); + + glue_powext_cx::apply(out, A, B); + } + + + +template +inline +void +glue_powext_cx::apply(Cube< std::complex >& out, const Cube< std::complex >& A, const Cube& B) + { + arma_extra_debug_sigprint(); + + typedef typename std::complex eT; + + out.set_size(A.n_rows, A.n_cols, A.n_slices); + + const uword N = out.n_elem; + + eT* out_mem = out.memptr(); + const eT* A_mem = A.memptr(); + const T* B_mem = B.memptr(); + + if( arma_config::openmp && mp_gate::eval(N) ) + { + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = mp_thread_limit::get(); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i +inline +Cube< std::complex > +glue_powext_cx::apply + ( + const subview_cube_each1< std::complex >& X, + const Base& Y + ) + { + arma_extra_debug_sigprint(); + + typedef typename std::complex eT; + + const Cube& A = X.P; + + const uword A_n_rows = A.n_rows; + const uword A_n_cols = A.n_cols; + const uword A_n_slices = A.n_slices; + + Cube out(A_n_rows, A_n_cols, A_n_slices, arma_nozeros_indicator()); + + const quasi_unwrap tmp(Y.get_ref()); + const Mat& B = tmp.M; + + X.check_size(B); + + const T* B_mem = B.memptr(); + const uword B_n_elem = B.n_elem; + + if( arma_config::openmp && mp_gate::eval(A.n_elem) ) + { + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = int( (std::min)(uword(mp_thread_limit::get()), A_n_slices) ); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword s=0; s < A_n_slices; ++s) + { + const eT* A_slice_mem = A.slice_memptr(s); + eT* out_slice_mem = out.slice_memptr(s); + + for(uword i=0; i < B_n_elem; ++i) + { + out_slice_mem[i] = std::pow(A_slice_mem[i], B_mem[i]); + } + } + } + #endif + } + else + { + for(uword s=0; s < A_n_slices; ++s) + { + const eT* A_slice_mem = A.slice_memptr(s); + eT* out_slice_mem = out.slice_memptr(s); + + for(uword i=0; i < B_n_elem; ++i) + { + out_slice_mem[i] = std::pow(A_slice_mem[i], B_mem[i]); + } + } + } + + return out; + } + + + +//! @} diff --git a/Include/armadillo/armadillo_bits/glue_solve_meat.hpp b/Include/armadillo/armadillo_bits/glue_solve_meat.hpp index 95f2f01ab..974112c79 100644 --- a/Include/armadillo/armadillo_bits/glue_solve_meat.hpp +++ b/Include/armadillo/armadillo_bits/glue_solve_meat.hpp @@ -80,7 +80,7 @@ glue_solve_gen_full::apply(Mat& out, const Glue inline bool -glue_solve_gen_full::apply(Mat& out, const Base& A_expr, const Base& B_expr, const uword flags) +glue_solve_gen_full::apply(Mat& actual_out, const Base& A_expr, const Base& B_expr, const uword flags) { arma_extra_debug_sigprint(); @@ -100,22 +100,25 @@ glue_solve_gen_full::apply(Mat& out, const Base& A_expr, const Base A = A_expr.get_ref(); @@ -130,9 +133,25 @@ glue_solve_gen_full::apply(Mat& out, const Base& A_expr, const Base::value && is_Mat::value) + { + const quasi_unwrap UA( A_expr.get_ref() ); + const quasi_unwrap UB( B_expr.get_ref() ); + + is_alias = UA.is_alias(actual_out) || UB.is_alias(actual_out); + } + + Mat tmp; + Mat& out = (is_alias) ? tmp : actual_out; + T rcond = T(0); bool status = false; @@ -195,6 +214,7 @@ glue_solve_gen_full::apply(Mat& out, const Base& A_expr, const Base& out, const Base& A_expr, const Base& out, const Base& A_expr, const Base& out, const Base& A_expr, const Base& out, const Base& A_expr, const Base T(0)) && (rcond < auxlib::epsilon_lapack(A)) ) - { - arma_debug_warn_level(2, "solve(): solution computed, but system is singular to working precision (rcond: ", rcond, ")"); - } - - - if( (status == false) && (no_approx == false) ) - { - arma_extra_debug_print("glue_solve_gen_full::apply(): solving rank deficient system"); - - if(rcond > T(0)) - { - arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); - } - else - { - arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); - } - - // TODO: conditionally recreate A: have a separate state flag which indicates whether A was previously overwritten - - A = A_expr.get_ref(); // as A may have been overwritten - - status = auxlib::solve_approx_svd(out, A, B_expr.get_ref()); // A is overwritten - } } else { @@ -328,33 +322,38 @@ glue_solve_gen_full::apply(Mat& out, const Base& A_expr, const Base T(0)) && (rcond < auxlib::epsilon_lapack(A)) ) + } + + + if( (status == true) && (fast == false) && (allow_ugly == false) && ((rcond < std::numeric_limits::epsilon()) || arma_isnan(rcond)) ) + { + status = false; + } + + + if( (status == false) && (no_approx == false) ) + { + arma_extra_debug_print("glue_solve_gen_full::apply(): solving rank deficient system"); + + if(rcond == T(0)) { - arma_debug_warn_level(2, "solve(): solution computed, but system is singular to working precision (rcond: ", rcond, ")"); + arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); } - - if( (status == false) && (no_approx == false) ) + else { - arma_extra_debug_print("glue_solve_gen_full::apply(): solving rank deficient system"); - - if(rcond > T(0)) - { - arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); - } - else - { - arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); - } - - A = A_expr.get_ref(); // as A was overwritten - - status = auxlib::solve_approx_svd(out, A, B_expr.get_ref()); // A is overwritten + arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); } + + // TODO: conditionally recreate A: have a separate state flag which indicates whether A was previously overwritten + + A = A_expr.get_ref(); // as A may have been overwritten + + status = auxlib::solve_approx_svd(out, A, B_expr.get_ref()); // A is overwritten } + if(is_alias) { actual_out.steal_mem(out); } return status; } @@ -392,22 +391,29 @@ glue_solve_tri_default::apply(Mat& actual_out, const Base& A_expr, co typedef typename get_pod_type::result T; - const bool triu = bool(flags & solve_opts::flag_triu); - const bool tril = bool(flags & solve_opts::flag_tril); - const bool allow_ugly = false; + const bool triu = bool(flags & solve_opts::flag_triu); + const bool tril = bool(flags & solve_opts::flag_tril); arma_extra_debug_print("glue_solve_tri_default::apply(): enabled flags:"); if(triu) { arma_extra_debug_print("triu"); } if(tril) { arma_extra_debug_print("tril"); } - const quasi_unwrap U(A_expr.get_ref()); - const Mat& A = U.M; + const quasi_unwrap UA(A_expr.get_ref()); + const Mat& A = UA.M; arma_debug_check( (A.is_square() == false), "solve(): matrix marked as triangular must be square sized" ); - const uword layout = (triu) ? uword(0) : uword(1); - const bool is_alias = U.is_alias(actual_out); + const uword layout = (triu) ? uword(0) : uword(1); + + bool is_alias = true; + + if(is_Mat::value) + { + const quasi_unwrap UB(B_expr.get_ref()); + + is_alias = UA.is_alias(actual_out) || UB.is_alias(actual_out); + } T rcond = T(0); bool status = false; @@ -415,11 +421,12 @@ glue_solve_tri_default::apply(Mat& actual_out, const Base& A_expr, co Mat tmp; Mat& out = (is_alias) ? tmp : actual_out; - status = auxlib::solve_trimat_rcond(out, rcond, A, B_expr.get_ref(), layout, allow_ugly); // A is not modified + status = auxlib::solve_trimat_rcond(out, rcond, A, B_expr.get_ref(), layout); // A is not modified + - if( (status == true) && (rcond > T(0)) && (rcond < auxlib::epsilon_lapack(A)) ) + if( (status == true) && ( (rcond < std::numeric_limits::epsilon()) || arma_isnan(rcond) ) ) { - arma_debug_warn_level(2, "solve(): solution computed, but system is singular to working precision (rcond: ", rcond, ")"); + status = false; } @@ -427,13 +434,13 @@ glue_solve_tri_default::apply(Mat& actual_out, const Base& A_expr, co { arma_extra_debug_print("glue_solve_tri_default::apply(): solving rank deficient system"); - if(rcond > T(0)) + if(rcond == T(0)) { - arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); + arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); } else { - arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); + arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); } Mat triA = (triu) ? trimatu(A) : trimatl(A); // trimatu() and trimatl() return the same type @@ -513,13 +520,21 @@ glue_solve_tri_full::apply(Mat& actual_out, const Base& A_expr, const if(likely_sympd) { arma_debug_warn_level(2, "solve(): option 'likely_sympd' ignored for triangular matrix"); } - const quasi_unwrap U(A_expr.get_ref()); - const Mat& A = U.M; + const quasi_unwrap UA(A_expr.get_ref()); + const Mat& A = UA.M; arma_debug_check( (A.is_square() == false), "solve(): matrix marked as triangular must be square sized" ); - const uword layout = (triu) ? uword(0) : uword(1); - const bool is_alias = U.is_alias(actual_out); + const uword layout = (triu) ? uword(0) : uword(1); + + bool is_alias = true; + + if(is_Mat::value) + { + const quasi_unwrap UB(B_expr.get_ref()); + + is_alias = UA.is_alias(actual_out) || UB.is_alias(actual_out); + } T rcond = T(0); bool status = false; @@ -533,12 +548,13 @@ glue_solve_tri_full::apply(Mat& actual_out, const Base& A_expr, const } else { - status = auxlib::solve_trimat_rcond(out, rcond, A, B_expr.get_ref(), layout, allow_ugly); // A is not modified + status = auxlib::solve_trimat_rcond(out, rcond, A, B_expr.get_ref(), layout); // A is not modified } - if( (status == true) && (rcond > T(0)) && (rcond < auxlib::epsilon_lapack(A)) ) + + if( (status == true) && (fast == false) && (allow_ugly == false) && ((rcond < std::numeric_limits::epsilon()) || arma_isnan(rcond)) ) { - arma_debug_warn_level(2, "solve(): solution computed, but system is singular to working precision (rcond: ", rcond, ")"); + status = false; } @@ -546,13 +562,13 @@ glue_solve_tri_full::apply(Mat& actual_out, const Base& A_expr, const { arma_extra_debug_print("glue_solve_tri_full::apply(): solving rank deficient system"); - if(rcond > T(0)) + if(rcond == T(0)) { - arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); + arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); } else { - arma_debug_warn_level(2, "solve(): system is singular; attempting approx solution"); + arma_debug_warn_level(2, "solve(): system is singular (rcond: ", rcond, "); attempting approx solution"); } Mat triA = (triu) ? trimatu(A) : trimatl(A); // trimatu() and trimatl() return the same type diff --git a/Include/armadillo/armadillo_bits/gmm_diag_meat.hpp b/Include/armadillo/armadillo_bits/gmm_diag_meat.hpp index 3ceee50e8..41c94cbcd 100644 --- a/Include/armadillo/armadillo_bits/gmm_diag_meat.hpp +++ b/Include/armadillo/armadillo_bits/gmm_diag_meat.hpp @@ -2159,6 +2159,10 @@ gmm_diag::km_iterate(const Mat& X, const uword max_iter, const bool verb } #else { + acc_hefts.zeros(); + acc_means.zeros(); + last_indx.zeros(); + uword* acc_hefts_mem = acc_hefts.memptr(); uword* last_indx_mem = last_indx.memptr(); diff --git a/Include/armadillo/armadillo_bits/gmm_full_meat.hpp b/Include/armadillo/armadillo_bits/gmm_full_meat.hpp index 4106801e0..3e3abc5c3 100644 --- a/Include/armadillo/armadillo_bits/gmm_full_meat.hpp +++ b/Include/armadillo/armadillo_bits/gmm_full_meat.hpp @@ -2188,6 +2188,10 @@ gmm_full::km_iterate(const Mat& X, const uword max_iter, const bool verb } #else { + acc_hefts.zeros(); + acc_means.zeros(); + last_indx.zeros(); + uword* acc_hefts_mem = acc_hefts.memptr(); uword* last_indx_mem = last_indx.memptr(); diff --git a/Include/armadillo/armadillo_bits/include_hdf5.hpp b/Include/armadillo/armadillo_bits/include_hdf5.hpp index a367c7f83..8b5b5884d 100644 --- a/Include/armadillo/armadillo_bits/include_hdf5.hpp +++ b/Include/armadillo/armadillo_bits/include_hdf5.hpp @@ -22,23 +22,48 @@ #define H5_USE_110_API #if !defined(ARMA_HDF5_INCLUDE_DIR) - #include + #if defined(__has_include) + #if __has_include() + #include + #else + #undef ARMA_USE_HDF5 + #undef ARMA_USE_HDF5_CMAKE + #pragma message ("WARNING: use of HDF5 disabled; hdf5.h header not found") + #endif + #else + #include + #endif #else + #undef ARMA_STR1 + #undef ARMA_STR2 + #undef ARMA_HDF5_HEADER + #define ARMA_STR1(x) x #define ARMA_STR2(x) ARMA_STR1(x) #define ARMA_HDF5_HEADER ARMA_STR2(ARMA_HDF5_INCLUDE_DIR)ARMA_STR2(hdf5.h) - #include ARMA_INCFILE_WRAP(ARMA_HDF5_HEADER) + #if defined(__has_include) + #if __has_include(ARMA_INCFILE_WRAP(ARMA_HDF5_HEADER)) + #include ARMA_INCFILE_WRAP(ARMA_HDF5_HEADER) + #else + #undef ARMA_USE_HDF5 + #undef ARMA_USE_HDF5_CMAKE + #pragma message ("WARNING: use of HDF5 disabled; hdf5.h header not found") + #endif + #else + #include ARMA_INCFILE_WRAP(ARMA_HDF5_HEADER) + #endif #undef ARMA_STR1 #undef ARMA_STR2 #undef ARMA_HDF5_HEADER #endif - - #if defined(H5_USE_16_API_DEFAULT) || defined(H5_USE_16_API) - #pragma message ("WARNING: disabling use of HDF5 due to its incompatible configuration") + + #if defined(H5_USE_16_API) || defined(H5_USE_16_API_DEFAULT) + #pragma message ("WARNING: use of HDF5 disabled; incompatible configuration: H5_USE_16_API or H5_USE_16_API_DEFAULT") #undef ARMA_USE_HDF5 - #undef ARMA_USE_HDF5_ALT + #undef ARMA_USE_HDF5_CMAKE #endif + #endif diff --git a/Include/armadillo/armadillo_bits/include_superlu.hpp b/Include/armadillo/armadillo_bits/include_superlu.hpp index 1ec40617e..43fa0a732 100644 --- a/Include/armadillo/armadillo_bits/include_superlu.hpp +++ b/Include/armadillo/armadillo_bits/include_superlu.hpp @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause // // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) // Copyright 2008-2016 National ICT Australia (NICTA) @@ -54,8 +54,7 @@ #if defined(ARMA_USE_SUPERLU) - -#if defined(ARMA_USE_SUPERLU_HEADERS) || defined(ARMA_SUPERLU_INCLUDE_DIR) +#undef ARMA_SLU_HEADERS_FOUND // Since we need to suport float, double, cx_float and cx_double, // as well as preserve the sanity of the user, @@ -70,142 +69,173 @@ namespace arma { - namespace superlu { // slu_*defs.h has int typedefed to int_t. // I'll just write it as int for simplicity, where I can, but supermatrix.h needs int_t. typedef int int_t; - + } +} + +#if defined(ARMA_USE_SUPERLU_HEADERS) || defined(ARMA_SUPERLU_INCLUDE_DIR) + +namespace arma +{ +namespace superlu + { // Include supermatrix.h. This gives us SuperMatrix. // Put it in the slu namespace. // For versions of SuperLU I am familiar with, supermatrix.h does not include any other files. // Therefore, putting it in the superlu namespace is reasonably safe. // This same reasoning is true for superlu_enum_consts.h. + #undef ARMA_SLU_HEADER_A + #undef ARMA_SLU_HEADER_B + #if defined(ARMA_SUPERLU_INCLUDE_DIR) - #define ARMA_SLU_STR(x) x - #define ARMA_SLU_STR2(x) ARMA_SLU_STR(x) + #undef ARMA_SLU_STR1 + #undef ARMA_SLU_STR2 - #define ARMA_SLU_SUPERMATRIX_H ARMA_SLU_STR2(ARMA_SUPERLU_INCLUDE_DIR)ARMA_SLU_STR2(supermatrix.h) - #define ARMA_SLU_SUPERLU_ENUM_CONSTS_H ARMA_SLU_STR2(ARMA_SUPERLU_INCLUDE_DIR)ARMA_SLU_STR2(superlu_enum_consts.h) + #define ARMA_SLU_STR1(x) x + #define ARMA_SLU_STR2(x) ARMA_SLU_STR1(x) + + #define ARMA_SLU_HEADER_A ARMA_SLU_STR2(ARMA_SUPERLU_INCLUDE_DIR)ARMA_SLU_STR2(supermatrix.h) + #define ARMA_SLU_HEADER_B ARMA_SLU_STR2(ARMA_SUPERLU_INCLUDE_DIR)ARMA_SLU_STR2(superlu_enum_consts.h) #else - #define ARMA_SLU_SUPERMATRIX_H supermatrix.h - #define ARMA_SLU_SUPERLU_ENUM_CONSTS_H superlu_enum_consts.h + #define ARMA_SLU_HEADER_A supermatrix.h + #define ARMA_SLU_HEADER_B superlu_enum_consts.h #endif - #include ARMA_INCFILE_WRAP(ARMA_SLU_SUPERMATRIX_H) - #include ARMA_INCFILE_WRAP(ARMA_SLU_SUPERLU_ENUM_CONSTS_H) - - #undef ARMA_SLU_SUPERMATRIX_H - #undef ARMA_SLU_SUPERLU_ENUM_CONSTS_H - - - typedef struct - { - int* panel_histo; - double* utime; - float* ops; - int TinyPivots; - int RefineSteps; - int expansions; - } SuperLUStat_t; - - - typedef struct - { - fact_t Fact; - yes_no_t Equil; - colperm_t ColPerm; - trans_t Trans; - IterRefine_t IterRefine; - double DiagPivotThresh; - yes_no_t SymmetricMode; - yes_no_t PivotGrowth; - yes_no_t ConditionNumber; - rowperm_t RowPerm; - int ILU_DropRule; - double ILU_DropTol; - double ILU_FillFactor; - norm_t ILU_Norm; - double ILU_FillTol; - milu_t ILU_MILU; - double ILU_MILU_Dim; - yes_no_t ParSymbFact; - yes_no_t ReplaceTinyPivot; - yes_no_t SolveInitialized; - yes_no_t RefineInitialized; - yes_no_t PrintStat; - int nnzL, nnzU; - int num_lookaheads; - yes_no_t lookahead_etree; - yes_no_t SymPattern; - } superlu_options_t; - - - typedef struct - { - float for_lu; - float total_needed; - } mem_usage_t; - - - typedef struct e_node - { - int size; - void* mem; - } ExpHeader; - - - typedef struct - { - int size; - int used; - int top1; - int top2; - void* array; - } LU_stack_t; + #if defined(__has_include) + #if __has_include(ARMA_INCFILE_WRAP(ARMA_SLU_HEADER_A)) && __has_include(ARMA_INCFILE_WRAP(ARMA_SLU_HEADER_B)) + #include ARMA_INCFILE_WRAP(ARMA_SLU_HEADER_A) + #include ARMA_INCFILE_WRAP(ARMA_SLU_HEADER_B) + #define ARMA_SLU_HEADERS_FOUND + #endif + #else + #include ARMA_INCFILE_WRAP(ARMA_SLU_HEADER_A) + #include ARMA_INCFILE_WRAP(ARMA_SLU_HEADER_B) + #define ARMA_SLU_HEADERS_FOUND + #endif + #undef ARMA_SLU_STR1 + #undef ARMA_SLU_STR2 + + #undef ARMA_SLU_HEADER_A + #undef ARMA_SLU_HEADER_B - typedef struct - { - int* xsup; - int* supno; - int* lsub; - int* xlsub; - void* lusup; - int* xlusup; - void* ucol; - int* usub; - int* xusub; - int nzlmax; - int nzumax; - int nzlumax; - int n; - LU_space_t MemModel; - int num_expansions; - ExpHeader* expanders; - LU_stack_t stack; - } GlobalLU_t; + #if defined(ARMA_SLU_HEADERS_FOUND) + + typedef struct + { + int* panel_histo; + double* utime; + float* ops; + int TinyPivots; + int RefineSteps; + int expansions; + } SuperLUStat_t; + + typedef struct + { + fact_t Fact; + yes_no_t Equil; + colperm_t ColPerm; + trans_t Trans; + IterRefine_t IterRefine; + double DiagPivotThresh; + yes_no_t SymmetricMode; + yes_no_t PivotGrowth; + yes_no_t ConditionNumber; + rowperm_t RowPerm; + int ILU_DropRule; + double ILU_DropTol; + double ILU_FillFactor; + norm_t ILU_Norm; + double ILU_FillTol; + milu_t ILU_MILU; + double ILU_MILU_Dim; + yes_no_t ParSymbFact; + yes_no_t ReplaceTinyPivot; + yes_no_t SolveInitialized; + yes_no_t RefineInitialized; + yes_no_t PrintStat; + int nnzL, nnzU; + int num_lookaheads; + yes_no_t lookahead_etree; + yes_no_t SymPattern; + } superlu_options_t; + + typedef struct + { + float for_lu; + float total_needed; + } mem_usage_t; + + typedef struct e_node + { + int size; + void* mem; + } ExpHeader; + + typedef struct + { + int size; + int used; + int top1; + int top2; + void* array; + } LU_stack_t; + + typedef struct + { + int* xsup; + int* supno; + int* lsub; + int* xlsub; + void* lusup; + int* xlusup; + void* ucol; + int* usub; + int* xusub; + int nzlmax; + int nzumax; + int nzlumax; + int n; + LU_space_t MemModel; + int num_expansions; + ExpHeader* expanders; + LU_stack_t stack; + } GlobalLU_t; + + #endif } } -#else +#endif + +#if defined(ARMA_USE_SUPERLU_HEADERS) && !defined(ARMA_SLU_HEADERS_FOUND) + #undef ARMA_USE_SUPERLU + #pragma message ("WARNING: use of SuperLU disabled; required headers not found") +#endif + +#endif + + + +#if defined(ARMA_USE_SUPERLU) && !defined(ARMA_SLU_HEADERS_FOUND) // Not using any SuperLU headers, so define all required enums and structs. -// -// CAVEAT: -// This code requires SuperLU version 5.2, -// and assumes that newer 5.x versions will have no API changes. + +#if defined(ARMA_SUPERLU_INCLUDE_DIR) + #pragma message ("WARNING: SuperLU headers not found; using built-in definitions") +#endif namespace arma { - namespace superlu { - typedef int int_t; - typedef enum { SLU_NC, @@ -218,7 +248,6 @@ namespace superlu SLU_NR_loc } Stype_t; - typedef enum { SLU_S, @@ -227,7 +256,6 @@ namespace superlu SLU_Z } Dtype_t; - typedef enum { SLU_GE, @@ -241,7 +269,6 @@ namespace superlu SLU_HEU } Mtype_t; - typedef struct { Stype_t Stype; @@ -252,7 +279,6 @@ namespace superlu void* Store; } SuperMatrix; - typedef struct { int* panel_histo; @@ -263,7 +289,6 @@ namespace superlu int expansions; } SuperLUStat_t; - typedef enum {NO, YES} yes_no_t; typedef enum {DOFACT, SamePattern, SamePattern_SameRowPerm, FACTORED} fact_t; typedef enum {NOROWPERM, LargeDiag, MY_PERMR} rowperm_t; @@ -275,7 +300,6 @@ namespace superlu typedef enum {ONE_NORM, TWO_NORM, INF_NORM} norm_t; typedef enum {SILU, SMILU_1, SMILU_2, SMILU_3} milu_t; - typedef struct { fact_t Fact; @@ -306,14 +330,12 @@ namespace superlu yes_no_t SymPattern; } superlu_options_t; - typedef struct { float for_lu; float total_needed; } mem_usage_t; - typedef struct { int_t nnz; @@ -322,21 +344,18 @@ namespace superlu int_t* colptr; } NCformat; - typedef struct { int_t lda; void* nzval; } DNformat; - typedef struct e_node { int size; void* mem; } ExpHeader; - typedef struct { int size; @@ -346,7 +365,6 @@ namespace superlu void* array; } LU_stack_t; - typedef struct { int* xsup; @@ -370,7 +388,6 @@ namespace superlu } } -#endif - +#undef ARMA_SLU_HEADERS_FOUND #endif diff --git a/Include/armadillo/armadillo_bits/injector_meat.hpp b/Include/armadillo/armadillo_bits/injector_meat.hpp index 76048533d..d509896da 100644 --- a/Include/armadillo/armadillo_bits/injector_meat.hpp +++ b/Include/armadillo/armadillo_bits/injector_meat.hpp @@ -274,6 +274,7 @@ mat_injector::end_of_row() const template arma_cold +inline const mat_injector& operator<<(const mat_injector& ref, const typename mat_injector::elem_type val) { @@ -288,6 +289,7 @@ operator<<(const mat_injector& ref, const typename mat_injector::elem_ty template arma_cold +inline const mat_injector& operator<<(const mat_injector& ref, const injector_end_of_row<>& x) { @@ -579,6 +581,7 @@ field_injector::end_of_row() const template arma_cold +inline const field_injector& operator<<(const field_injector& ref, const typename field_injector::object_type& val) { @@ -593,6 +596,7 @@ operator<<(const field_injector& ref, const typename field_injector::obj template arma_cold +inline const field_injector& operator<<(const field_injector& ref, const injector_end_of_row<>& x) { diff --git a/Include/armadillo/armadillo_bits/memory.hpp b/Include/armadillo/armadillo_bits/memory.hpp index 8e992235f..a85c503aa 100644 --- a/Include/armadillo/armadillo_bits/memory.hpp +++ b/Include/armadillo/armadillo_bits/memory.hpp @@ -77,6 +77,8 @@ memory::acquire(const uword n_elem) } #elif defined(_MSC_VER) { + // Windoze is too primitive to handle C++17 std::aligned_alloc() + //out_memptr = (eT *) malloc(sizeof(eT)*n_elem); //out_memptr = (eT *) _aligned_malloc( sizeof(eT)*n_elem, 16 ); // lives in malloc.h diff --git a/Include/armadillo/armadillo_bits/newarp_SparseGenRealShiftSolve_meat.hpp b/Include/armadillo/armadillo_bits/newarp_SparseGenRealShiftSolve_meat.hpp index 5d85517b0..ea2061867 100644 --- a/Include/armadillo/armadillo_bits/newarp_SparseGenRealShiftSolve_meat.hpp +++ b/Include/armadillo/armadillo_bits/newarp_SparseGenRealShiftSolve_meat.hpp @@ -28,6 +28,9 @@ SparseGenRealShiftSolve::SparseGenRealShiftSolve(const SpMat& mat_obj, c , perm_r(mat_obj.n_rows + 1) , n_rows(mat_obj.n_rows) , n_cols(mat_obj.n_cols) + #else + : n_rows(0) + , n_cols(0) #endif { arma_extra_debug_sigprint(); @@ -74,8 +77,8 @@ SparseGenRealShiftSolve::SparseGenRealShiftSolve(const SpMat& mat_obj, c if( (x_rcond < std::numeric_limits::epsilon()) || arma_isnan(x_rcond) ) { - if(x_rcond > eT(0)) { arma_debug_warn_level(2, "matrix is singular to working precision (rcond: ", x_rcond, ")"); } - else { arma_debug_warn_level(2, "matrix is singular to working precision"); } + if(x_rcond == eT(0)) { arma_debug_warn_level(2, "matrix is singular to working precision"); } + else { arma_debug_warn_level(2, "matrix is singular to working precision (rcond: ", x_rcond, ")"); } return; } diff --git a/Include/armadillo/armadillo_bits/op_chol_meat.hpp b/Include/armadillo/armadillo_bits/op_chol_meat.hpp index 9bda648ab..ebc6448b0 100644 --- a/Include/armadillo/armadillo_bits/op_chol_meat.hpp +++ b/Include/armadillo/armadillo_bits/op_chol_meat.hpp @@ -50,7 +50,7 @@ op_chol::apply_direct(Mat& out, const Base static inline typename T1::pod_type cond(const Base& X); - template static inline typename T1::pod_type rcond(const Base& X); + template static inline typename T1::pod_type apply(const Base& X); + + template static inline typename get_pod_type::result apply_diag(const Mat& A); + template static inline typename get_pod_type::result apply_sym ( Mat& A); + template static inline typename get_pod_type::result apply_gen ( Mat& A); }; diff --git a/Include/armadillo/armadillo_bits/op_cond_meat.hpp b/Include/armadillo/armadillo_bits/op_cond_meat.hpp index 242a9b34c..1d59f0333 100644 --- a/Include/armadillo/armadillo_bits/op_cond_meat.hpp +++ b/Include/armadillo/armadillo_bits/op_cond_meat.hpp @@ -24,122 +24,149 @@ template inline typename T1::pod_type -op_cond::cond(const Base& X) +op_cond::apply(const Base& X) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; - // TODO: implement speed up for symmetric matrices, similar to op_pinv::apply_sym() - Mat A(X.get_ref()); - Col S; + if(A.n_elem == 0) { return T(0); } - const bool status = auxlib::svd_dc(S, A); + if(is_op_diagmat::value || A.is_diagmat()) + { + arma_extra_debug_print("op_cond::apply(): detected diagonal matrix"); + + return op_cond::apply_diag(A); + } - if(status == false) + bool is_approx_sym = false; + bool is_approx_sympd = false; + + sympd_helper::analyse_matrix(is_approx_sym, is_approx_sympd, A); + + const bool do_sym = (is_cx::no) ? (is_approx_sym) : (is_approx_sym && is_approx_sympd); + + if(do_sym) { - arma_debug_warn_level(3, "cond(): svd failed"); + arma_extra_debug_print("op_cond: symmetric/hermitian optimisation"); - return Datum::nan; + return op_cond::apply_sym(A); } - return (S.n_elem > 0) ? T( max(S) / min(S) ) : T(0); + return op_cond::apply_gen(A); } -template +template inline -typename T1::pod_type -op_cond::rcond(const Base& X) +typename get_pod_type::result +op_cond::apply_diag(const Mat& A) { arma_extra_debug_sigprint(); - typedef typename T1::elem_type eT; - typedef typename T1::pod_type T; + typedef typename get_pod_type::result T; + + const uword N = (std::min)(A.n_rows, A.n_cols); - if(strip_trimat::do_trimat) + T abs_min = Datum::inf; + T abs_max = T(0); + + for(uword i=0; i < N; ++i) { - const strip_trimat S(X.get_ref()); - - const quasi_unwrap::stored_type> U(S.M); - - arma_debug_check( (U.M.is_square() == false), "rcond(): matrix must be square sized" ); + const T abs_val = std::abs(A.at(i,i)); - const uword layout = (S.do_triu) ? uword(0) : uword(1); + if(arma_isnan(abs_val)) + { + arma_debug_warn_level(3, "cond(): failed"); + + return Datum::nan; + } - return auxlib::rcond_trimat(U.M, layout); + abs_min = (abs_val < abs_min) ? abs_val : abs_min; + abs_max = (abs_val > abs_max) ? abs_val : abs_max; } - Mat A = X.get_ref(); + if((abs_min == T(0)) || (abs_max == T(0))) { return Datum::inf; } - arma_debug_check( (A.is_square() == false), "rcond(): matrix must be square sized" ); + return T(abs_max / abs_min); + } + + + +template +inline +typename get_pod_type::result +op_cond::apply_sym(Mat& A) + { + arma_extra_debug_sigprint(); - if(A.is_empty()) { return Datum::inf; } + typedef typename get_pod_type::result T; - if(is_op_diagmat::value || A.is_diagmat()) + Col eigval; + + const bool status = auxlib::eig_sym(eigval, A); + + if(status == false) { - arma_extra_debug_print("op_cond::rcond(): detected diagonal matrix"); + arma_debug_warn_level(3, "cond(): failed"); - const eT* colmem = A.memptr(); - const uword N = A.n_rows; - - T max_abs_src_val = T(0); - T max_abs_inv_val = T(0); - - for(uword i=0; i max_abs_src_val) ? abs_src_val : max_abs_src_val; - max_abs_inv_val = (abs_inv_val > max_abs_inv_val) ? abs_inv_val : max_abs_inv_val; - - colmem += N; - } - - return T(1) / (max_abs_src_val * max_abs_inv_val); + return Datum::nan; } - const bool is_triu = trimat_helper::is_triu(A); - const bool is_tril = (is_triu) ? false : trimat_helper::is_tril(A); + if(eigval.n_elem == 0) { return T(0); } + + const T* eigval_mem = eigval.memptr(); - if(is_triu || is_tril) + T abs_min = std::abs(eigval_mem[0]); + T abs_max = abs_min; + + for(uword i=1; i < eigval.n_elem; ++i) { - const uword layout = (is_triu) ? uword(0) : uword(1); + const T abs_val = std::abs(eigval_mem[i]); - return auxlib::rcond_trimat(A, layout); + abs_min = (abs_val < abs_min) ? abs_val : abs_min; + abs_max = (abs_val > abs_max) ? abs_val : abs_max; } - const bool try_sympd = arma_config::optimise_sympd && (auxlib::crippled_lapack(A) ? false : sympd_helper::guess_sympd(A)); + if((abs_min == T(0)) || (abs_max == T(0))) { return Datum::inf; } + + return T(abs_max / abs_min); + } + + + +template +inline +typename get_pod_type::result +op_cond::apply_gen(Mat& A) + { + arma_extra_debug_sigprint(); + + typedef typename get_pod_type::result T; - if(try_sympd) + Col S; + + const bool status = auxlib::svd_dc(S, A); + + if(status == false) { - arma_extra_debug_print("op_cond::rcond(): attempting sympd optimisation"); + arma_debug_warn_level(3, "cond(): failed"); - bool calc_ok = false; - - const T out_val = auxlib::rcond_sympd(A, calc_ok); - - if(calc_ok) { return out_val; } - - arma_extra_debug_print("op_cond::rcond(): sympd optimisation failed"); - - // auxlib::rcond_sympd() may have failed because A isn't really sympd - // restore A, as auxlib::rcond_sympd() may have destroyed it - A = X.get_ref(); - // fallthrough to the next return statement + return Datum::nan; } - return auxlib::rcond(A); + if(S.n_elem == 0) { return T(0); } + + const T S_max = S[0]; + const T S_min = S[S.n_elem-1]; + + if((S_max == T(0)) || (S_min == T(0))) { return Datum::inf; } + + return T(S_max / S_min); } diff --git a/Include/armadillo/armadillo_bits/op_expmat_meat.hpp b/Include/armadillo/armadillo_bits/op_expmat_meat.hpp index 57d8874d9..b6e4b65be 100644 --- a/Include/armadillo/armadillo_bits/op_expmat_meat.hpp +++ b/Include/armadillo/armadillo_bits/op_expmat_meat.hpp @@ -60,7 +60,7 @@ op_expmat::apply_direct(Mat& out, const Base + inline static void apply(Mat& out, const mtOp& X); + }; + + + //! @} diff --git a/Include/armadillo/armadillo_bits/op_find_meat.hpp b/Include/armadillo/armadillo_bits/op_find_meat.hpp index facbf1ce9..42ac67c5e 100644 --- a/Include/armadillo/armadillo_bits/op_find_meat.hpp +++ b/Include/armadillo/armadillo_bits/op_find_meat.hpp @@ -605,4 +605,50 @@ op_find_nonfinite::apply(Mat& out, const mtOp +inline +void +op_find_nan::apply(Mat& out, const mtOp& X) + { + arma_extra_debug_sigprint(); + + const Proxy P(X.m); + + const uword n_elem = P.get_n_elem(); + + Mat indices(n_elem, 1, arma_nozeros_indicator()); + + uword* indices_mem = indices.memptr(); + uword count = 0; + + if(Proxy::use_at == false) + { + const typename Proxy::ea_type Pea = P.get_ea(); + + for(uword i=0; i +struct op_inv_gen_state + { + T rcond = T(0); + bool is_diag = false; + bool is_sym = false; + }; + + + class op_inv_gen_rcond : public traits_op_default { public: template - inline static bool apply_direct(Mat& out_inv, typename T1::pod_type& out_rcond, const Base& expr); + inline static bool apply_direct(Mat& out_inv, op_inv_gen_state& out_state, const Base& expr); }; @@ -110,18 +120,21 @@ namespace inv_opts static constexpr uword flag_allow_approx = uword(1u << 1); static constexpr uword flag_likely_sympd = uword(1u << 2); static constexpr uword flag_no_sympd = uword(1u << 3); + static constexpr uword flag_no_ugly = uword(1u << 4); struct opts_none : public opts { inline opts_none() : opts(flag_none ) {} }; struct opts_tiny : public opts { inline opts_tiny() : opts(flag_tiny ) {} }; struct opts_allow_approx : public opts { inline opts_allow_approx() : opts(flag_allow_approx) {} }; struct opts_likely_sympd : public opts { inline opts_likely_sympd() : opts(flag_likely_sympd) {} }; struct opts_no_sympd : public opts { inline opts_no_sympd() : opts(flag_no_sympd ) {} }; + struct opts_no_ugly : public opts { inline opts_no_ugly() : opts(flag_no_ugly ) {} }; static const opts_none none; static const opts_tiny tiny; static const opts_allow_approx allow_approx; static const opts_likely_sympd likely_sympd; static const opts_no_sympd no_sympd; + static const opts_no_ugly no_ugly; } diff --git a/Include/armadillo/armadillo_bits/op_inv_gen_meat.hpp b/Include/armadillo/armadillo_bits/op_inv_gen_meat.hpp index 914a7e7c8..dfb903987 100644 --- a/Include/armadillo/armadillo_bits/op_inv_gen_meat.hpp +++ b/Include/armadillo/armadillo_bits/op_inv_gen_meat.hpp @@ -62,7 +62,7 @@ op_inv_gen_full::apply(Mat& out, const Op& out, const Base inv_state; + + const bool status = op_inv_gen_rcond::apply_direct(out, inv_state, expr); + + const T local_rcond = inv_state.rcond; // workaround for bug in gcc 4.8 + + if((status == false) || (local_rcond < std::numeric_limits::epsilon()) || arma_isnan(local_rcond)) { return false; } + + return true; + } if(allow_approx) { - T rcond = T(0); + op_inv_gen_state inv_state; Mat tmp; - const bool status = op_inv_gen_rcond::apply_direct(tmp, rcond, expr); + const bool status = op_inv_gen_rcond::apply_direct(tmp, inv_state, expr); - if((status == false) || (rcond < auxlib::epsilon_lapack(tmp))) + const T local_rcond = inv_state.rcond; // workaround for bug in gcc 4.8 + + if((status == false) || (local_rcond < std::numeric_limits::epsilon()) || arma_isnan(local_rcond)) { Mat A = expr.get_ref(); + if(inv_state.is_diag) { return op_pinv::apply_diag(out, A, T(0) ); } + if(inv_state.is_sym ) { return op_pinv::apply_sym (out, A, T(0), uword(0)); } + return op_pinv::apply_gen(out, A, T(0), uword(0)); } @@ -124,7 +148,7 @@ op_inv_gen_full::apply_direct(Mat& out, const Base& X) template inline bool -op_inv_gen_rcond::apply_direct(Mat& out, typename T1::pod_type& out_rcond, const Base& expr) +op_inv_gen_rcond::apply_direct(Mat& out, op_inv_gen_state& out_state, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; - out = expr.get_ref(); - out_rcond = T(0); + out = expr.get_ref(); + out_state.rcond = T(0); - arma_debug_check( (out.is_square() == false), "inv(): given matrix must be square sized" ); - - const uword N = out.n_rows; + arma_debug_check( (out.is_square() == false), "inv(): given matrix must be square sized", [&](){ out.soft_reset(); } ); if(is_op_diagmat::value || out.is_diagmat()) { arma_extra_debug_print("op_inv_gen_rcond: detected diagonal matrix"); + out_state.is_diag = true; + eT* colmem = out.memptr(); T max_abs_src_val = T(0); T max_abs_inv_val = T(0); + const uword N = out.n_rows; + for(uword i=0; i& out, typename T1::po colmem += N; } - out_rcond = T(1) / (max_abs_src_val * max_abs_inv_val); + out_state.rcond = T(1) / (max_abs_src_val * max_abs_inv_val); return true; } @@ -433,7 +459,7 @@ op_inv_gen_rcond::apply_direct(Mat& out, typename T1::po if(is_triu_expr || is_tril_expr || is_triu_mat || is_tril_mat) { - return auxlib::inv_tr_rcond(out, out_rcond, ((is_triu_expr || is_triu_mat) ? uword(0) : uword(1))); + return auxlib::inv_tr_rcond(out, out_state.rcond, ((is_triu_expr || is_triu_mat) ? uword(0) : uword(1))); } const bool try_sympd = arma_config::optimise_sympd && ((auxlib::crippled_lapack(out)) ? false : sympd_helper::guess_sympd(out)); @@ -442,11 +468,13 @@ op_inv_gen_rcond::apply_direct(Mat& out, typename T1::po { arma_extra_debug_print("op_inv_gen_rcond: attempting sympd optimisation"); + out_state.is_sym = true; + Mat tmp = out; bool sympd_state = false; - const bool status = auxlib::inv_sympd_rcond(tmp, sympd_state, out_rcond, T(-1)); + const bool status = auxlib::inv_sympd_rcond(tmp, sympd_state, out_state.rcond, T(-1)); if(status) { out.steal_mem(tmp); return true; } @@ -457,7 +485,7 @@ op_inv_gen_rcond::apply_direct(Mat& out, typename T1::po // fallthrough if optimisation failed } - return auxlib::inv_rcond(out, out_rcond); + return auxlib::inv_rcond(out, out_state.rcond); } diff --git a/Include/armadillo/armadillo_bits/op_inv_spd_bones.hpp b/Include/armadillo/armadillo_bits/op_inv_spd_bones.hpp index 3e17a9c34..21ea44e32 100644 --- a/Include/armadillo/armadillo_bits/op_inv_spd_bones.hpp +++ b/Include/armadillo/armadillo_bits/op_inv_spd_bones.hpp @@ -58,13 +58,22 @@ class op_inv_spd_full +template +struct op_inv_spd_state + { + T rcond = T(0); + bool is_diag = false; + }; + + + class op_inv_spd_rcond : public traits_op_default { public: template - inline static bool apply_direct(Mat& out_inv, typename T1::pod_type& out_rcond, const Base& expr); + inline static bool apply_direct(Mat& out_inv, op_inv_spd_state& out_state, const Base& expr); }; diff --git a/Include/armadillo/armadillo_bits/op_inv_spd_meat.hpp b/Include/armadillo/armadillo_bits/op_inv_spd_meat.hpp index e4170dc33..279f042ec 100644 --- a/Include/armadillo/armadillo_bits/op_inv_spd_meat.hpp +++ b/Include/armadillo/armadillo_bits/op_inv_spd_meat.hpp @@ -62,7 +62,7 @@ op_inv_spd_full::apply(Mat& out, const Op& out, const Base inv_state; + + const bool status = op_inv_spd_rcond::apply_direct(out, inv_state, expr); + + const T local_rcond = inv_state.rcond; // workaround for bug in gcc 4.8 + + if((status == false) || (local_rcond < std::numeric_limits::epsilon()) || arma_isnan(local_rcond)) { return false; } + + return true; + } if(allow_approx) { - T rcond = T(0); + op_inv_spd_state inv_state; Mat tmp; - const bool status = op_inv_spd_rcond::apply_direct(tmp, rcond, expr); + const bool status = op_inv_spd_rcond::apply_direct(tmp, inv_state, expr); + + const T local_rcond = inv_state.rcond; // workaround for bug in gcc 4.8 - if((status == false) || (rcond < auxlib::epsilon_lapack(tmp))) + if((status == false) || (local_rcond < std::numeric_limits::epsilon()) || arma_isnan(local_rcond)) { const Mat A = expr.get_ref(); + if(inv_state.is_diag) { return op_pinv::apply_diag(out, A, T(0)); } + return op_pinv::apply_sym(out, A, T(0), uword(0)); } @@ -125,7 +149,7 @@ op_inv_spd_full::apply_direct(Mat& out, const Base 0)) { @@ -325,17 +349,17 @@ op_inv_spd_full::apply_tiny_4x4(Mat& X) template inline bool -op_inv_spd_rcond::apply_direct(Mat& out, typename T1::pod_type& out_rcond, const Base& expr) +op_inv_spd_rcond::apply_direct(Mat& out, op_inv_spd_state& out_state, const Base& expr) { arma_extra_debug_sigprint(); typedef typename T1::elem_type eT; typedef typename T1::pod_type T; - out = expr.get_ref(); - out_rcond = T(0); + out = expr.get_ref(); + out_state.rcond = T(0); - arma_debug_check( (out.is_square() == false), "inv_sympd(): given matrix must be square sized" ); + arma_debug_check( (out.is_square() == false), "inv_sympd(): given matrix must be square sized", [&](){ out.soft_reset(); } ); if((arma_config::debug) && (arma_config::warn_level > 0)) { @@ -355,6 +379,8 @@ op_inv_spd_rcond::apply_direct(Mat& out, typename T1::po { arma_extra_debug_print("op_inv_spd_rcond: detected diagonal matrix"); + out_state.is_diag = true; + eT* colmem = out.memptr(); T max_abs_src_val = T(0); @@ -382,7 +408,7 @@ op_inv_spd_rcond::apply_direct(Mat& out, typename T1::po colmem += N; } - out_rcond = T(1) / (max_abs_src_val * max_abs_inv_val); + out_state.rcond = T(1) / (max_abs_src_val * max_abs_inv_val); return true; } @@ -397,18 +423,18 @@ op_inv_spd_rcond::apply_direct(Mat& out, typename T1::po auxlib::inv_sympd(out, sympd_state); - if(sympd_state == false) { out.soft_reset(); out_rcond = T(0); return false; } + if(sympd_state == false) { out.soft_reset(); out_state.rcond = T(0); return false; } - out_rcond = auxlib::rcond(tmp); + out_state.rcond = auxlib::rcond(tmp); - if(out_rcond == T(0)) { out.soft_reset(); return false; } + if(out_state.rcond == T(0)) { out.soft_reset(); return false; } return true; } bool is_sympd_junk = false; - return auxlib::inv_sympd_rcond(out, is_sympd_junk, out_rcond, T(-1)); + return auxlib::inv_sympd_rcond(out, is_sympd_junk, out_state.rcond, T(-1)); } diff --git a/Include/armadillo/armadillo_bits/op_nonzeros_meat.hpp b/Include/armadillo/armadillo_bits/op_nonzeros_meat.hpp index 7d197a1e4..8cf32fa19 100644 --- a/Include/armadillo/armadillo_bits/op_nonzeros_meat.hpp +++ b/Include/armadillo/armadillo_bits/op_nonzeros_meat.hpp @@ -113,23 +113,37 @@ op_nonzeros_spmat::apply(Mat& out, const SpToDOp 0) + if(N == 0) { return; } + + if(is_SpMat::stored_type>::value) { - if(is_SpMat::stored_type>::value) - { - const unwrap_spmat::stored_type> U(P.Q); - - arrayops::copy(out.memptr(), U.M.values, N); - } - else + const unwrap_spmat::stored_type> U(P.Q); + + arrayops::copy(out.memptr(), U.M.values, N); + + return; + } + + if(is_SpSubview::stored_type>::value) + { + const SpSubview& sv = reinterpret_cast< const SpSubview& >(P.Q); + + if(sv.n_rows == sv.m.n_rows) { - eT* out_mem = out.memptr(); + const SpMat& m = sv.m; + const uword col = sv.aux_col1; - typename SpProxy::const_iterator_type it = P.begin(); + arrayops::copy(out.memptr(), &(m.values[ m.col_ptrs[col] ]), N); - for(uword i=0; i::const_iterator_type it = P.begin(); + + for(uword i=0; i inline static void apply(Mat& out, const Op& in); + + template inline static bool apply_direct(Mat& out, const Base& expr); + }; + + + class op_pinv : public traits_op_default { diff --git a/Include/armadillo/armadillo_bits/op_pinv_meat.hpp b/Include/armadillo/armadillo_bits/op_pinv_meat.hpp index 7ea8e3d66..283c369ff 100644 --- a/Include/armadillo/armadillo_bits/op_pinv_meat.hpp +++ b/Include/armadillo/armadillo_bits/op_pinv_meat.hpp @@ -22,6 +22,45 @@ +template +inline +void +op_pinv_default::apply(Mat& out, const Op& in) + { + arma_extra_debug_sigprint(); + + const bool status = op_pinv_default::apply_direct(out, in.m); + + if(status == false) + { + out.soft_reset(); + arma_stop_runtime_error("pinv(): svd failed"); + } + } + + + +template +inline +bool +op_pinv_default::apply_direct(Mat& out, const Base& expr) + { + arma_extra_debug_sigprint(); + + typedef typename T1::pod_type T; + + constexpr T tol = T(0); + constexpr uword method_id = uword(0); + + return op_pinv::apply_direct(out, expr, tol, method_id); + } + + + +// + + + template inline void diff --git a/Include/armadillo/armadillo_bits/op_rcond_bones.hpp b/Include/armadillo/armadillo_bits/op_rcond_bones.hpp new file mode 100644 index 000000000..88697e8dc --- /dev/null +++ b/Include/armadillo/armadillo_bits/op_rcond_bones.hpp @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) +// Copyright 2008-2016 National ICT Australia (NICTA) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + + +//! \addtogroup op_rcond +//! @{ + + +class op_rcond + : public traits_op_default + { + public: + + template static inline typename T1::pod_type apply(const Base& X); + }; + + +//! @} diff --git a/Include/armadillo/armadillo_bits/op_rcond_meat.hpp b/Include/armadillo/armadillo_bits/op_rcond_meat.hpp new file mode 100644 index 000000000..d0947c544 --- /dev/null +++ b/Include/armadillo/armadillo_bits/op_rcond_meat.hpp @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: Apache-2.0 +// +// Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au) +// Copyright 2008-2016 National ICT Australia (NICTA) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ------------------------------------------------------------------------ + + +//! \addtogroup op_rcond +//! @{ + + + +template +inline +typename T1::pod_type +op_rcond::apply(const Base& X) + { + arma_extra_debug_sigprint(); + + typedef typename T1::elem_type eT; + typedef typename T1::pod_type T; + + if(strip_trimat::do_trimat) + { + const strip_trimat S(X.get_ref()); + + const quasi_unwrap::stored_type> U(S.M); + + arma_debug_check( (U.M.is_square() == false), "rcond(): matrix must be square sized" ); + + const uword layout = (S.do_triu) ? uword(0) : uword(1); + + return auxlib::rcond_trimat(U.M, layout); + } + + Mat A = X.get_ref(); + + arma_debug_check( (A.is_square() == false), "rcond(): matrix must be square sized" ); + + if(A.is_empty()) { return Datum::inf; } + + if(is_op_diagmat::value || A.is_diagmat()) + { + arma_extra_debug_print("op_rcond::apply(): detected diagonal matrix"); + + const eT* colmem = A.memptr(); + const uword N = A.n_rows; + + T abs_min = Datum::inf; + T abs_max = T(0); + + for(uword i=0; i abs_max) ? abs_val : abs_max; + + colmem += N; + } + + if((abs_min == T(0)) || (abs_max == T(0))) { return T(0); } + + return T(abs_min / abs_max); + } + + const bool is_triu = trimat_helper::is_triu(A); + const bool is_tril = (is_triu) ? false : trimat_helper::is_tril(A); + + if(is_triu || is_tril) + { + const uword layout = (is_triu) ? uword(0) : uword(1); + + return auxlib::rcond_trimat(A, layout); + } + + const bool try_sympd = arma_config::optimise_sympd && (auxlib::crippled_lapack(A) ? false : sympd_helper::guess_sympd(A)); + + if(try_sympd) + { + arma_extra_debug_print("op_rcond::apply(): attempting sympd optimisation"); + + bool calc_ok = false; + + const T out_val = auxlib::rcond_sympd(A, calc_ok); + + if(calc_ok) { return out_val; } + + arma_extra_debug_print("op_rcond::apply(): sympd optimisation failed"); + + // auxlib::rcond_sympd() may have failed because A isn't really sympd + // restore A, as auxlib::rcond_sympd() may have destroyed it + A = X.get_ref(); + // fallthrough to the next return statement + } + + return auxlib::rcond(A); + } + + + +//! @} diff --git a/Include/armadillo/armadillo_bits/op_sum_meat.hpp b/Include/armadillo/armadillo_bits/op_sum_meat.hpp index f3ca32aff..b6b57b534 100644 --- a/Include/armadillo/armadillo_bits/op_sum_meat.hpp +++ b/Include/armadillo/armadillo_bits/op_sum_meat.hpp @@ -91,26 +91,36 @@ op_sum::apply_noalias_unwrap(Mat& out, const Proxy& const uword X_n_rows = X.n_rows; const uword X_n_cols = X.n_cols; + const uword out_n_rows = (dim == 0) ? uword(1) : X_n_rows; + const uword out_n_cols = (dim == 0) ? X_n_cols : uword(1); + + out.set_size(out_n_rows, out_n_cols); + + if(X.n_elem == 0) { out.zeros(); return; } + + const eT* X_colptr = X.memptr(); + eT* out_mem = out.memptr(); + if(dim == 0) { - out.set_size(1, X_n_cols); - - eT* out_mem = out.memptr(); - for(uword col=0; col < X_n_cols; ++col) { - out_mem[col] = arrayops::accumulate( X.colptr(col), X_n_rows ); + out_mem[col] = arrayops::accumulate( X_colptr, X_n_rows ); + + X_colptr += X_n_rows; } } else { - out.zeros(X_n_rows, 1); + arrayops::copy(out_mem, X_colptr, X_n_rows); - eT* out_mem = out.memptr(); + X_colptr += X_n_rows; - for(uword col=0; col < X_n_cols; ++col) + for(uword col=1; col < X_n_cols; ++col) { - arrayops::inplace_plus( out_mem, X.colptr(col), X_n_rows ); + arrayops::inplace_plus( out_mem, X_colptr, X_n_rows ); + + X_colptr += X_n_rows; } } } @@ -130,42 +140,93 @@ op_sum::apply_noalias_proxy(Mat& out, const Proxy& P const uword P_n_rows = P.get_n_rows(); const uword P_n_cols = P.get_n_cols(); - if(dim == 0) + const uword out_n_rows = (dim == 0) ? uword(1) : P_n_rows; + const uword out_n_cols = (dim == 0) ? P_n_cols : uword(1); + + out.set_size(out_n_rows, out_n_cols); + + if(P.get_n_elem() == 0) { out.zeros(); return; } + + eT* out_mem = out.memptr(); + + if(Proxy::use_at == false) { - out.set_size(1, P_n_cols); - - eT* out_mem = out.memptr(); - - for(uword col=0; col < P_n_cols; ++col) + if(dim == 0) { - eT val1 = eT(0); - eT val2 = eT(0); + uword count = 0; - uword i,j; - for(i=0, j=1; j < P_n_rows; i+=2, j+=2) + for(uword col=0; col < P_n_cols; ++col) { - val1 += P.at(i,col); - val2 += P.at(j,col); + eT val1 = eT(0); + eT val2 = eT(0); + + uword j; + for(j=1; j < P_n_rows; j+=2) + { + val1 += P[count]; ++count; + val2 += P[count]; ++count; + } + + if((j-1) < P_n_rows) + { + val1 += P[count]; ++count; + } + + out_mem[col] = (val1 + val2); } + } + else + { + uword count = 0; - if(i < P_n_rows) + for(uword row=0; row < P_n_rows; ++row) { - val1 += P.at(i,col); + out_mem[row] = P[count]; ++count; } - out_mem[col] = (val1 + val2); + for(uword col=1; col < P_n_cols; ++col) + for(uword row=0; row < P_n_rows; ++row) + { + out_mem[row] += P[count]; ++count; + } } } else { - out.zeros(P_n_rows, 1); - - eT* out_mem = out.memptr(); - - for(uword col=0; col < P_n_cols; ++col) - for(uword row=0; row < P_n_rows; ++row) + if(dim == 0) + { + for(uword col=0; col < P_n_cols; ++col) + { + eT val1 = eT(0); + eT val2 = eT(0); + + uword i,j; + for(i=0, j=1; j < P_n_rows; i+=2, j+=2) + { + val1 += P.at(i,col); + val2 += P.at(j,col); + } + + if(i < P_n_rows) + { + val1 += P.at(i,col); + } + + out_mem[col] = (val1 + val2); + } + } + else { - out_mem[row] += P.at(row,col); + for(uword row=0; row < P_n_rows; ++row) + { + out_mem[row] = P.at(row,0); + } + + for(uword col=1; col < P_n_cols; ++col) + for(uword row=0; row < P_n_rows; ++row) + { + out_mem[row] += P.at(row,col); + } } } } diff --git a/Include/armadillo/armadillo_bits/sp_auxlib_meat.hpp b/Include/armadillo/armadillo_bits/sp_auxlib_meat.hpp index 4ee8efaf9..2de68d594 100644 --- a/Include/armadillo/armadillo_bits/sp_auxlib_meat.hpp +++ b/Include/armadillo/armadillo_bits/sp_auxlib_meat.hpp @@ -1184,21 +1184,14 @@ sp_auxlib::spsolve_simple(Mat& X, const SpBase A.n_cols) + if(A.is_square() == false) { - arma_stop_logic_error("spsolve(): solving over-determined systems currently not supported"); - X.soft_reset(); - return false; - } - else - if(A.n_rows < A.n_cols) - { - arma_stop_logic_error("spsolve(): solving under-determined systems currently not supported"); X.soft_reset(); + arma_stop_logic_error("spsolve(): solving under-determined / over-determined systems is currently not supported"); return false; } - arma_debug_check( (A.n_rows != X.n_rows), "spsolve(): number of rows in the given objects must be the same" ); + arma_debug_check( (A.n_rows != X.n_rows), "spsolve(): number of rows in the given objects must be the same", [&](){ X.soft_reset(); } ); if(A.is_empty() || X.is_empty()) { @@ -1318,21 +1311,14 @@ sp_auxlib::spsolve_refine(Mat& X, typename T1::pod_type& const Mat& B = (B_is_modified) ? B_copy : B_unwrap; - if(A.n_rows > A.n_cols) + if(A.is_square() == false) { - arma_stop_logic_error("spsolve(): solving over-determined systems currently not supported"); - X.soft_reset(); - return false; - } - else - if(A.n_rows < A.n_cols) - { - arma_stop_logic_error("spsolve(): solving under-determined systems currently not supported"); X.soft_reset(); + arma_stop_logic_error("spsolve(): solving under-determined / over-determined systems is currently not supported"); return false; } - arma_debug_check( (A.n_rows != B.n_rows), "spsolve(): number of rows in the given objects must be the same" ); + arma_debug_check( (A.n_rows != B.n_rows), "spsolve(): number of rows in the given objects must be the same", [&](){ X.soft_reset(); } ); X.zeros(A.n_cols, B.n_cols); // set the elements to zero, as we don't trust the SuperLU spaghetti code @@ -1390,10 +1376,10 @@ sp_auxlib::spsolve_refine(Mat& X, typename T1::pod_type& superlu_array_wrangler berr(B.n_cols+1); superlu::GlobalLU_t glu; - arrayops::inplace_set(reinterpret_cast(&glu), char(0), sizeof(superlu::GlobalLU_t)); + arrayops::fill_zeros(reinterpret_cast(&glu), sizeof(superlu::GlobalLU_t)); superlu::mem_usage_t mu; - arrayops::inplace_set(reinterpret_cast(&mu), char(0), sizeof(superlu::mem_usage_t)); + arrayops::fill_zeros(reinterpret_cast(&mu), sizeof(superlu::mem_usage_t)); superlu_stat_wrangler stat; @@ -1430,7 +1416,7 @@ sp_auxlib::spsolve_refine(Mat& X, typename T1::pod_type& else if(info > int(A.n_cols+1)) { - arma_debug_warn_level(1, "spsolve(): memory allocation failure: could not allocate ", (info - int(A.n_cols)), " bytes"); + arma_debug_warn_level(1, "spsolve(): memory allocation failure"); } else if(info < 0) diff --git a/Include/armadillo/armadillo_bits/spop_norm_bones.hpp b/Include/armadillo/armadillo_bits/spop_norm_bones.hpp index d9464e04f..1d9445182 100644 --- a/Include/armadillo/armadillo_bits/spop_norm_bones.hpp +++ b/Include/armadillo/armadillo_bits/spop_norm_bones.hpp @@ -31,6 +31,8 @@ class spop_norm template inline static typename get_pod_type::result mat_norm_2(const SpMat& X, const typename arma_cx_only::result* junk = nullptr); template inline static typename get_pod_type::result mat_norm_inf(const SpMat& X); + + template inline static typename get_pod_type::result vec_norm_k(const eT* mem, const uword N, const uword k); }; diff --git a/Include/armadillo/armadillo_bits/spop_norm_meat.hpp b/Include/armadillo/armadillo_bits/spop_norm_meat.hpp index f4b93942e..6746319f0 100644 --- a/Include/armadillo/armadillo_bits/spop_norm_meat.hpp +++ b/Include/armadillo/armadillo_bits/spop_norm_meat.hpp @@ -104,4 +104,26 @@ spop_norm::mat_norm_inf(const SpMat& X) +template +inline +typename get_pod_type::result +spop_norm::vec_norm_k(const eT* mem, const uword N, const uword k) + { + arma_extra_debug_sigprint(); + + arma_debug_check( (k == 0), "norm(): k must be greater than zero" ); + + // create a fake dense vector to allow reuse of code for dense vectors + Col fake_vector( access::rwp(mem), N, false ); + + const Proxy< Col > P_fake_vector(fake_vector); + + if(k == uword(1)) { return op_norm::vec_norm_1(P_fake_vector); } + if(k == uword(2)) { return op_norm::vec_norm_2(P_fake_vector); } + + return op_norm::vec_norm_k(P_fake_vector, int(k)); + } + + + //! @} diff --git a/Include/armadillo/armadillo_bits/subview_cube_each_bones.hpp b/Include/armadillo/armadillo_bits/subview_cube_each_bones.hpp index 0862aae06..29d81fd24 100644 --- a/Include/armadillo/armadillo_bits/subview_cube_each_bones.hpp +++ b/Include/armadillo/armadillo_bits/subview_cube_each_bones.hpp @@ -28,7 +28,8 @@ class subview_cube_each_common const Cube& P; - inline void check_size(const Mat& A) const; + template + inline void check_size(const Mat& A) const; protected: @@ -36,7 +37,8 @@ class subview_cube_each_common arma_inline subview_cube_each_common(const Cube& in_p); inline subview_cube_each_common() = delete; - arma_cold inline const std::string incompat_size_string(const Mat& A) const; + template + arma_cold inline const std::string incompat_size_string(const Mat& A) const; }; @@ -104,7 +106,7 @@ class subview_cube_each1_aux template static inline Cube operator_plus(const subview_cube_each1& X, const Base& Y); - + template static inline Cube operator_minus(const subview_cube_each1& X, const Base& Y); @@ -135,7 +137,7 @@ class subview_cube_each2_aux template static inline Cube operator_plus(const subview_cube_each2& X, const Base& Y); - + template static inline Cube operator_minus(const subview_cube_each2& X, const Base& Y); diff --git a/Include/armadillo/armadillo_bits/subview_cube_each_meat.hpp b/Include/armadillo/armadillo_bits/subview_cube_each_meat.hpp index 7af493b55..a518444fe 100644 --- a/Include/armadillo/armadillo_bits/subview_cube_each_meat.hpp +++ b/Include/armadillo/armadillo_bits/subview_cube_each_meat.hpp @@ -35,9 +35,10 @@ subview_cube_each_common::subview_cube_each_common(const Cube& in_p) template +template inline void -subview_cube_each_common::check_size(const Mat& A) const +subview_cube_each_common::check_size(const Mat& A) const { if(arma_config::debug) { @@ -51,10 +52,11 @@ subview_cube_each_common::check_size(const Mat& A) const template +template arma_cold inline const std::string -subview_cube_each_common::incompat_size_string(const Mat& A) const +subview_cube_each_common::incompat_size_string(const Mat& A) const { std::ostringstream tmp; @@ -134,7 +136,7 @@ subview_cube_each1::operator+= (const Base& in) const uword p_n_elem_slice = p.n_elem_slice; const eT* A_mem = A.memptr(); - + for(uword i=0; i < p_n_slices; ++i) { arrayops::inplace_plus( p.slice_memptr(i), A_mem, p_n_elem_slice ); } } @@ -287,7 +289,7 @@ subview_cube_each2::operator= (const Base& in) const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; - + const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; @@ -326,7 +328,7 @@ subview_cube_each2::operator+= (const Base& in) const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; - + const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; @@ -365,7 +367,7 @@ subview_cube_each2::operator-= (const Base& in) const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; - + const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; @@ -404,7 +406,7 @@ subview_cube_each2::operator%= (const Base& in) const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; - + const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; @@ -443,7 +445,7 @@ subview_cube_each2::operator/= (const Base& in) const uword p_n_slices = p.n_slices; const uword p_n_elem_slice = p.n_elem_slice; - + const uword* indices_mem = U.M.memptr(); const uword N = U.M.n_elem; diff --git a/Include/armadillo/armadillo_bits/subview_each_bones.hpp b/Include/armadillo/armadillo_bits/subview_each_bones.hpp index 09d14cff5..dcb58cd83 100644 --- a/Include/armadillo/armadillo_bits/subview_each_bones.hpp +++ b/Include/armadillo/armadillo_bits/subview_each_bones.hpp @@ -30,7 +30,8 @@ class subview_each_common const parent& P; - inline void check_size(const Mat& A) const; + template + inline void check_size(const Mat& A) const; protected: @@ -43,7 +44,8 @@ class subview_each_common arma_inline const Mat& get_mat_ref() const; - arma_cold inline const std::string incompat_size_string(const Mat& A) const; + template + arma_cold inline const std::string incompat_size_string(const Mat& A) const; }; @@ -117,7 +119,7 @@ class subview_each1_aux template static inline Mat operator_plus(const subview_each1& X, const Base& Y); - + template static inline Mat operator_minus(const subview_each1& X, const Base& Y); @@ -142,7 +144,7 @@ class subview_each2_aux template static inline Mat operator_plus(const subview_each2& X, const Base& Y); - + template static inline Mat operator_minus(const subview_each2& X, const Base& Y); diff --git a/Include/armadillo/armadillo_bits/subview_each_meat.hpp b/Include/armadillo/armadillo_bits/subview_each_meat.hpp index 2acf52e52..e48064f4d 100644 --- a/Include/armadillo/armadillo_bits/subview_each_meat.hpp +++ b/Include/armadillo/armadillo_bits/subview_each_meat.hpp @@ -65,11 +65,12 @@ subview_each_common::get_mat_ref() const template +template inline void -subview_each_common::check_size(const Mat& A) const +subview_each_common::check_size(const Mat& A) const { - if(arma_config::debug == true) + if(arma_config::debug) { if(mode == 0) { @@ -91,10 +92,11 @@ subview_each_common::check_size(const Mat +template arma_cold inline const std::string -subview_each_common::incompat_size_string(const Mat& A) const +subview_each_common::incompat_size_string(const Mat& A) const { std::ostringstream tmp; @@ -192,7 +194,7 @@ subview_each1::operator+= (const Base& in) const eT* A_mem = A.memptr(); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; - + if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) @@ -229,7 +231,7 @@ subview_each1::operator-= (const Base& in) const eT* A_mem = A.memptr(); const uword p_n_rows = p.n_rows; const uword p_n_cols = p.n_cols; - + if(mode == 0) // each column { for(uword i=0; i < p_n_cols; ++i) diff --git a/Include/armadillo/armadillo_bits/subview_elem1_meat.hpp b/Include/armadillo/armadillo_bits/subview_elem1_meat.hpp index 955956dcf..d1b67128e 100644 --- a/Include/armadillo/armadillo_bits/subview_elem1_meat.hpp +++ b/Include/armadillo/armadillo_bits/subview_elem1_meat.hpp @@ -806,7 +806,7 @@ subview_elem1::extract(Mat& actual_out, const subview_elem1& i if(alias) { arma_extra_debug_print("subview_elem1::extract(): aliasing detected"); } - Mat* tmp_out = alias ? new Mat() : 0; + Mat* tmp_out = alias ? new Mat() : nullptr; Mat& out = alias ? *tmp_out : actual_out; out.set_size(aa_n_elem, 1); diff --git a/Include/armadillo/armadillo_bits/subview_elem2_meat.hpp b/Include/armadillo/armadillo_bits/subview_elem2_meat.hpp index 3245c3587..69d5f5d72 100644 --- a/Include/armadillo/armadillo_bits/subview_elem2_meat.hpp +++ b/Include/armadillo/armadillo_bits/subview_elem2_meat.hpp @@ -699,7 +699,7 @@ subview_elem2::extract(Mat& actual_out, const subview_elem2* tmp_out = alias ? new Mat() : 0; + Mat* tmp_out = alias ? new Mat() : nullptr; Mat& out = alias ? *tmp_out : actual_out; if( (in.all_rows == false) && (in.all_cols == false) ) diff --git a/Include/armadillo/armadillo_bits/subview_field_meat.hpp b/Include/armadillo/armadillo_bits/subview_field_meat.hpp index 1c8833cb6..9b2f0c3a7 100644 --- a/Include/armadillo/armadillo_bits/subview_field_meat.hpp +++ b/Include/armadillo/armadillo_bits/subview_field_meat.hpp @@ -514,7 +514,7 @@ subview_field::extract(field& actual_out, const subview_field& in) // const bool alias = (&actual_out == &in.f); - field* tmp = (alias) ? new field : 0; + field* tmp = (alias) ? new field : nullptr; field& out = (alias) ? (*tmp) : actual_out; // diff --git a/Include/armadillo/armadillo_exts/BandMat_bones.hpp b/Include/armadillo/armadillo_exts/BandMat_bones.hpp deleted file mode 100644 index 3ee1d1ae4..000000000 --- a/Include/armadillo/armadillo_exts/BandMat_bones.hpp +++ /dev/null @@ -1,79 +0,0 @@ -template class BandMat : public Base> { -public: - typedef eT elem_type; - typedef typename get_pod_type::result pod_type; - - static const bool is_row = false; - static const bool is_col = false; - - const uword n_cols; - const uword n_l; - const uword n_u; - const uword n_rows = 2 * n_l + n_u + 1; - -private: - const uword n_s = n_l + n_u; - const uword n_a = n_rows - n_l; - const uword n_b = n_rows - 1; - -public: - const uword n_elem; - const uhword mem_state; - - arma_aligned const eT* - const mem; - - arma_align_mem eT mem_local[arma_config::mat_prealloc]; - - ~BandMat(); - BandMat(); - - explicit BandMat(const uword& in_size, const uword& in_l, const uword& in_u); - - template BandMat(const uword& in_size, const uword& in_l, const uword& in_u, const fill::fill_class& f); - - BandMat& operator=(const eT& val); - BandMat& operator+=(const eT& val); - BandMat& operator-=(const eT& val); - BandMat& operator*=(const eT& val); - BandMat& operator/=(const eT& val); - - BandMat(const BandMat& m); - BandMat& operator=(const BandMat& m); - BandMat& operator+=(const BandMat& m); - BandMat& operator-=(const BandMat& m); - BandMat& operator*=(const BandMat& m) = delete; - BandMat& operator%=(const BandMat& m); - BandMat& operator/=(const BandMat& m); - - template BandMat(const BdOp& X); - - template BandMat& operator=(const BdOp& X); - - eT& at(const uword& in_row, const uword& in_col); - const eT& at(const uword& in_row, const uword& in_col) const; - eT& operator()(const uword& in_row, const uword& in_col); - const eT& operator()(const uword& in_row, const uword& in_col) const; - - eT* memptr(); - const eT* memptr() const; - - void set_size(const uword in_size, const uword& in_l, const uword& in_u); - - arma_hot const BandMat& fill(const eT val); - template arma_hot const BandMat& fill(const fill::fill_class&); - - const BandMat& zeros(); - const BandMat& zeros(const uword in_size, const uword& in_l, const uword& in_u); - - const BandMat& ones(); - const BandMat& ones(const uword in_size, const uword& in_l, const uword& in_u); - - const BandMat& eye(); - const BandMat& eye(const uword in_size, const uword& in_l, const uword& in_u); - - void reset(); - - void init_cold(); - void init_warm(const uword& in_size, const uword& in_l, const uword& in_u); -}; diff --git a/Include/armadillo/armadillo_exts/BandMat_meat.hpp b/Include/armadillo/armadillo_exts/BandMat_meat.hpp deleted file mode 100644 index d366bb4b4..000000000 --- a/Include/armadillo/armadillo_exts/BandMat_meat.hpp +++ /dev/null @@ -1,345 +0,0 @@ -template BandMat::~BandMat() {} - -template BandMat::BandMat() - : n_cols(0) - , n_l(0) - , n_u(0) - , n_elem(0) - , mem_state(0) - , mem() {} - -template BandMat::BandMat(const uword& in_size, const uword& in_l, const uword& in_u) - : n_cols(in_size) - , n_l(in_l) - , n_u(in_u) - , n_elem((in_u + 2 * in_l + 1) * in_size) - , mem_state(0) - , mem() { - arma_extra_debug_sigprint_this(this); - init_cold(); -} - -template template BandMat::BandMat(const uword& in_size, const uword& in_l, const uword& in_u, const fill::fill_class& f) - : n_cols(in_size) - , n_l(in_l) - , n_u(in_u) - , n_elem((in_u + 2 * in_l + 1) * in_size) - , mem_state(0) - , mem() { - arma_extra_debug_sigprint_this(this); - - init_cold(); - - (*this).fill(f); -} - -template BandMat& BandMat::operator=(const eT& val) { - init_warm(1, 0, 0); - access::rw(mem[0]) = val; - return *this; -} - -template BandMat& BandMat::operator+=(const eT& val) { - arma_extra_debug_sigprint(); - - arrayops::inplace_plus(memptr(), val, n_elem); - - return *this; -} - -template BandMat& BandMat::operator-=(const eT& val) { - arma_extra_debug_sigprint(); - - arrayops::inplace_minus(memptr(), val, n_elem); - - return *this; -} - -template BandMat& BandMat::operator*=(const eT& val) { - arma_extra_debug_sigprint(); - - arrayops::inplace_mul(memptr(), val, n_elem); - - return *this; -} - -template BandMat& BandMat::operator/=(const eT& val) { - arma_extra_debug_sigprint(); - - arrayops::inplace_div(memptr(), val, n_elem); - - return *this; -} - -template BandMat::BandMat(const BandMat& m) - : n_cols(m.n_cols) - , n_elem(m.n_elem) - , mem_state(0) - , mem() { - arma_extra_debug_sigprint(arma_str::format("this = %x in_mat = %x") % this % &m); - - init_cold(); - - arrayops::copy(memptr(), m.mem, m.n_elem); -} - -template BandMat& BandMat::operator=(const BandMat& m) { - arma_extra_debug_sigprint(arma_str::format("this = %x in_mat = %x") % this % &m); - - if(this != &m) { - init_warm(m.n_cols, m.n_l, m.n_u); - - arrayops::copy(memptr(), m.mem, m.n_elem); - } - - return *this; -} - -template BandMat& BandMat::operator+=(const BandMat& m) { - arma_extra_debug_sigprint(); - - arma_debug_assert_same_size(*this, m, "addition"); - - arrayops::inplace_plus(memptr(), m.memptr(), n_elem); - - return *this; -} - -template BandMat& BandMat::operator-=(const BandMat& m) { - arma_extra_debug_sigprint(); - - arma_debug_assert_same_size(*this, m, "subtraction"); - - arrayops::inplace_minus(memptr(), m.memptr(), n_elem); - - return *this; -} - -template BandMat& BandMat::operator%=(const BandMat& m) { - arma_extra_debug_sigprint(); - - arma_debug_assert_same_size(*this, m, "element-wise multiplication"); - - arrayops::inplace_mul(memptr(), m.memptr(), n_elem); - - return *this; -} - -template BandMat& BandMat::operator/=(const BandMat& m) { - arma_extra_debug_sigprint(); - - arma_debug_assert_same_size(*this, m, "element-wise division"); - - arrayops::inplace_div(memptr(), m.memptr(), n_elem); - - return *this; -} - -template template BandMat::BandMat(const BdOp& X) - : n_cols(0) - , n_l(0) - , n_u(0) - , n_elem(0) - , mem_state(0) - , mem() { - arma_extra_debug_sigprint_this(this); - - arma_type_check((is_same_type::no)); - - bdop_type::apply(*this, X); -} - -template template BandMat& BandMat::operator=(const BdOp& X) { - arma_extra_debug_sigprint(); - - arma_type_check((is_same_type::no)); - - bdop_type::apply(*this, X); - - return *this; -} - -template eT& BandMat::at(const uword& in_row, const uword& in_col) { return access::rw(mem[n_a + n_b * in_col + in_row]); } - -template const eT& BandMat::at(const uword& in_row, const uword& in_col) const { return mem[n_a + n_b * in_col + in_row]; } - -template eT& BandMat::operator()(const uword& in_row, const uword& in_col) { - arma_debug_check(in_row >= n_cols || in_col >= n_cols, "BandMat::operator(): index out of bounds"); - return at(in_row, in_col); -} - -template const eT& BandMat::operator()(const uword& in_row, const uword& in_col) const { - arma_debug_check(in_row >= n_cols || in_col >= n_cols, "BandMat::operator(): index out of bounds"); - return at(in_row, in_col); -} - -template void BandMat::init_cold() { - arma_extra_debug_sigprint(arma_str::format("n_size = %d") % n_cols); - -#if(defined(ARMA_USE_CXX11) || defined(ARMA_64BIT_WORD)) - auto error_message = "BandMat::init(): requested size is too large"; -#else - const char* error_message = "BandMat::init(): requested size is too large; suggest to " - "compile in C++11 mode or enable ARMA_64BIT_WORD"; -#endif - - arma_debug_check(n_cols > ARMA_MAX_UHWORD ? n_elem > ARMA_MAX_UWORD : false, error_message); - - if(n_elem <= arma_config::mat_prealloc) - if(n_elem == 0) access::rw(mem) = NULL; - else { - arma_extra_debug_print("BandMat::init(): using local memory"); - access::rw(mem) = mem_local; - } - else { - arma_extra_debug_print("BandMat::init(): acquiring memory"); - access::rw(mem) = memory::acquire(n_elem); - } -} - -template void BandMat::init_warm(const uword& in_size, const uword& in_l, const uword& in_u) { - arma_extra_debug_sigprint(arma_str::format("in_n_size = %d") % in_size); - - if(n_cols == in_size && n_l == in_l && n_u == in_u) return; - - auto err_state = false; - char* err_msg = nullptr; - - const uhword t_mem_state = mem_state; - - arma_debug_set_error(err_state, err_msg, t_mem_state == 3, "BandMat::init(): size is fixed and hence cannot be changed"); - -#if(defined(ARMA_USE_CXX11) || defined(ARMA_64BIT_WORD)) - auto error_message = "BandMat::init(): requested size is too large"; -#else - const char* error_message = "BandMat::init(): requested size is too large; suggest " - "to compile in C++11 mode or enable ARMA_64BIT_WORD"; -#endif - - arma_debug_set_error(err_state, err_msg, in_size > ARMA_MAX_UHWORD ? (2 * in_l + in_u + 1) * in_size > ARMA_MAX_UWORD : false, error_message); - - arma_debug_check(err_state, err_msg); - - const auto old_n_elem = n_elem; - const auto new_n_elem = (2 * in_l + in_u + 1) * in_size; - - if(old_n_elem == new_n_elem) { arma_extra_debug_print("BandMat::init(): reusing memory"); } - else { - arma_debug_check(t_mem_state == 2, - "BandMat::init(): mismatch between size of " - "auxiliary memory and requested size"); - - if(new_n_elem < old_n_elem) { - if(t_mem_state == 0 && new_n_elem <= arma_config::mat_prealloc) { - if(old_n_elem > arma_config::mat_prealloc) { - arma_extra_debug_print("BandMat::init(): releasing memory"); - memory::release(access::rw(mem)); - } - - access::rw(mem) = new_n_elem == 0 ? NULL : mem_local; - } - else { arma_extra_debug_print("BandMat::init(): reusing memory"); } - } - else { - if(t_mem_state == 0 && old_n_elem > arma_config::mat_prealloc) { - arma_extra_debug_print("BandMat::init(): releasing memory"); - memory::release(access::rw(mem)); - } - - access::rw(mem) = new_n_elem <= arma_config::mat_prealloc ? mem_local : memory::acquire(new_n_elem); - - access::rw(mem_state) = 0; - } - - access::rw(n_cols) = in_size; - access::rw(n_l) = in_l; - access::rw(n_u) = in_u; - access::rw(n_s) = n_l + n_u; - access::rw(n_rows) = 2 * n_l + n_u + 1; - access::rw(n_a) = n_rows - n_l; - access::rw(n_b) = n_rows - 1; - access::rw(n_elem) = new_n_elem; - } -} - -template eT* BandMat::memptr() { return const_cast(mem); } - -template const eT* BandMat::memptr() const { return mem; } - -template void BandMat::set_size(const uword in_size, const uword& in_l, const uword& in_u) { - arma_extra_debug_sigprint(); - - init_warm(in_size, in_l, in_u); -} - -template const BandMat& BandMat::fill(const eT val) { - arma_extra_debug_sigprint(); - - arrayops::inplace_set(memptr(), val, n_elem); - - return *this; -} - -template template const BandMat& BandMat::fill(const fill::fill_class&) { - arma_extra_debug_sigprint(); - - if(is_same_type::yes) (*this).zeros(); - if(is_same_type::yes) (*this).ones(); - if(is_same_type::yes) (*this).eye(); - - return *this; -} - -template const BandMat& BandMat::zeros() { - arma_extra_debug_sigprint(); - - arrayops::fill_zeros(memptr(), n_elem); - - return *this; -} - -template const BandMat& BandMat::zeros(const uword in_size, const uword& in_l, const uword& in_u) { - arma_extra_debug_sigprint(); - - set_size(in_size, in_l, in_u); - - return (*this).zeros(); -} - -template const BandMat& BandMat::ones() { - arma_extra_debug_sigprint(); - - return fill(eT(1)); -} - -template const BandMat& BandMat::ones(const uword in_size, const uword& in_l, const uword& in_u) { - arma_extra_debug_sigprint(); - - set_size(in_size, in_l, in_u); - - return fill(eT(1)); -} - -template const BandMat& BandMat::eye() { - arma_extra_debug_sigprint(); - - (*this).zeros(); - - for(uword ii = 0; ii < n_cols; ++ii) at(ii, ii) = eT(1); - - return *this; -} - -template const BandMat& BandMat::eye(const uword in_size, const uword& in_l, const uword& in_u) { - arma_extra_debug_sigprint(); - - set_size(in_size, in_l, in_u); - - return (*this).eye(); -} - -template void BandMat::reset() { - arma_extra_debug_sigprint(); - - init_warm(0, 0, 0); -} diff --git a/Include/armadillo/armadillo_exts/BdOp_bones.hpp b/Include/armadillo/armadillo_exts/BdOp_bones.hpp deleted file mode 100644 index 463b04f85..000000000 --- a/Include/armadillo/armadillo_exts/BdOp_bones.hpp +++ /dev/null @@ -1,18 +0,0 @@ -template class BdOp : public Base> { -public: - typedef typename T1::elem_type elem_type; - typedef typename get_pod_type::result pod_type; - - static const bool is_row = false; - static const bool is_col = false; - - explicit BdOp(const T1& in_m); - BdOp(const T1& in_m, const elem_type in_aux); - BdOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b); - ~BdOp(); - - arma_aligned const T1& m; //!< storage of reference to the operand (eg. a matrix) - arma_aligned elem_type aux; //!< storage of auxiliary data, user defined format - arma_aligned uword aux_uword_a = 0; //!< storage of auxiliary data, uword format - arma_aligned uword aux_uword_b = 0; //!< storage of auxiliary data, uword format -}; diff --git a/Include/armadillo/armadillo_exts/BdOp_meat.hpp b/Include/armadillo/armadillo_exts/BdOp_meat.hpp deleted file mode 100644 index b549a8482..000000000 --- a/Include/armadillo/armadillo_exts/BdOp_meat.hpp +++ /dev/null @@ -1,13 +0,0 @@ -template BdOp::BdOp(const T1& in_m) - : m(in_m) { arma_extra_debug_sigprint(); } - -template BdOp::BdOp(const T1& in_m, const typename T1::elem_type in_aux) - : m(in_m) - , aux(in_aux) { arma_extra_debug_sigprint(); } - -template BdOp::BdOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b) - : m(in_m) - , aux_uword_a(in_aux_uword_a) - , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } - -template BdOp::~BdOp() { arma_extra_debug_sigprint(); } diff --git a/Include/armadillo/armadillo_exts/SmOp_bones.hpp b/Include/armadillo/armadillo_exts/SmOp_bones.hpp deleted file mode 100644 index 8a1ecc226..000000000 --- a/Include/armadillo/armadillo_exts/SmOp_bones.hpp +++ /dev/null @@ -1,18 +0,0 @@ -template class SmOp : public Base> { -public: - typedef typename T1::elem_type elem_type; - typedef typename get_pod_type::result pod_type; - - static const bool is_row = false; - static const bool is_col = false; - - explicit SmOp(const T1& in_m); - SmOp(const T1& in_m, const elem_type in_aux); - SmOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b); - ~SmOp(); - - arma_aligned const T1& m; //!< storage of reference to the operand (eg. a matrix) - arma_aligned elem_type aux; //!< storage of auxiliary data, user defined format - arma_aligned uword aux_uword_a = 0; //!< storage of auxiliary data, uword format - arma_aligned uword aux_uword_b = 0; //!< storage of auxiliary data, uword format -}; diff --git a/Include/armadillo/armadillo_exts/SmOp_meat.hpp b/Include/armadillo/armadillo_exts/SmOp_meat.hpp deleted file mode 100644 index 4f22b9fd9..000000000 --- a/Include/armadillo/armadillo_exts/SmOp_meat.hpp +++ /dev/null @@ -1,13 +0,0 @@ -template SmOp::SmOp(const T1& in_m) - : m(in_m) { arma_extra_debug_sigprint(); } - -template SmOp::SmOp(const T1& in_m, const typename T1::elem_type in_aux) - : m(in_m) - , aux(in_aux) { arma_extra_debug_sigprint(); } - -template SmOp::SmOp(const T1& in_m, const uword in_aux_uword_a, const uword in_aux_uword_b) - : m(in_m) - , aux_uword_a(in_aux_uword_a) - , aux_uword_b(in_aux_uword_b) { arma_extra_debug_sigprint(); } - -template SmOp::~SmOp() { arma_extra_debug_sigprint(); } diff --git a/Include/armadillo/armadillo_exts/SymmMat_bones.hpp b/Include/armadillo/armadillo_exts/SymmMat_bones.hpp deleted file mode 100644 index 609cca8b9..000000000 --- a/Include/armadillo/armadillo_exts/SymmMat_bones.hpp +++ /dev/null @@ -1,76 +0,0 @@ -template class SymmMat : public Base> { -public: - typedef eT elem_type; - typedef typename get_pod_type::result pod_type; - - static const bool is_row = false; - static const bool is_col = false; - - const uword n_size; - const uword n_elem; - const uhword mem_state; - - arma_aligned const eT* - const mem; - - arma_align_mem eT mem_local[arma_config::mat_prealloc]; - - ~SymmMat(); - SymmMat(); - - explicit SymmMat(const uword& in_size); - explicit SymmMat(const SizeMat& s); - - template SymmMat(const uword& in_size, const fill::fill_class& f); - template SymmMat(const SizeMat& s, const fill::fill_class& f); - - SymmMat(const Mat& in_mat); - - SymmMat& operator=(const eT& val); - SymmMat& operator+=(const eT& val); - SymmMat& operator-=(const eT& val); - SymmMat& operator*=(const eT& val); - SymmMat& operator/=(const eT& val); - - SymmMat(const SymmMat& m); - SymmMat& operator=(const SymmMat& m); - SymmMat& operator+=(const SymmMat& m); - SymmMat& operator-=(const SymmMat& m); - SymmMat& operator*=(const SymmMat& m) = delete; - SymmMat& operator%=(const SymmMat& m); - SymmMat& operator/=(const SymmMat& m); - - template SymmMat(const SmOp& X); - - template SymmMat& operator=(const Glue& X); - template SymmMat& operator=(const SmOp& X); - - eT& at(const uword& in_row, const uword& in_col); - const eT& at(const uword& in_row, const uword& in_col) const; - eT& operator()(const uword& in_row, const uword& in_col); - const eT& operator()(const uword& in_row, const uword& in_col) const; - - eT* memptr(); - const eT* memptr() const; - - void set_size(const uword in_size); - - arma_hot const SymmMat& fill(const eT val); - template arma_hot const SymmMat& fill(const fill::fill_class&); - - const SymmMat& zeros(); - const SymmMat& zeros(const uword in_size); - - const SymmMat& ones(); - const SymmMat& ones(const uword in_size); - - const SymmMat& eye(); - const SymmMat& eye(const uword in_size); - - void reset(); - - void init_cold(); - void init_warm(const uword& in_size); - - void print() const; -}; diff --git a/Include/armadillo/armadillo_exts/SymmMat_meat.hpp b/Include/armadillo/armadillo_exts/SymmMat_meat.hpp deleted file mode 100644 index 681ff8e99..000000000 --- a/Include/armadillo/armadillo_exts/SymmMat_meat.hpp +++ /dev/null @@ -1,429 +0,0 @@ -template SymmMat::~SymmMat() {} - -template SymmMat::SymmMat() - : n_size(0) - , n_elem(0) - , mem_state(0) - , mem() {} - -template SymmMat::SymmMat(const uword& in_size) - : n_size(in_size) - , n_elem((in_size + 1) * in_size / 2) - , mem_state(0) - , mem() { - arma_extra_debug_sigprint_this(this); - init_cold(); -} - -template SymmMat::SymmMat(const SizeMat& s) - : n_size(s.n_rows) - , n_elem((s.n_rows + 1) * s.n_cols / 2) - , mem_state(0) - , mem() { - arma_debug_check(s.n_rows != s.n_cols, "SymmMat() only accepts sqaure matrix."); - - init_cold(); -} - -template template SymmMat::SymmMat(const uword& in_size, const fill::fill_class& f) - : n_size(in_size) - , n_elem((in_size + 1) * in_size / 2) - , mem_state(0) - , mem() { - arma_extra_debug_sigprint_this(this); - - init_cold(); - - (*this).fill(f); -} - -template template SymmMat::SymmMat(const SizeMat& s, const fill::fill_class& f) - : n_size(s.n_rows) - , n_elem((s.n_rows + 1) * s.n_cols / 2) - , mem_state(0) - , mem() { - arma_extra_debug_sigprint_this(this); - - arma_debug_check(s.n_rows != s.n_cols, "SymmMat() only accepts sqaure matrix."); - - init_cold(); - - (*this).fill(f); -} - -template SymmMat::SymmMat(const Mat& in_mat) - : n_size(in_mat.n_rows) - , n_elem((in_mat.n_rows + 1) * in_mat.n_cols / 2) - , mem_state(0) - , mem() { - arma_debug_check(in_mat.n_rows != in_mat.n_cols, "SymmMat() only accepts sqaure matrix."); - - init_cold(); - - auto tmp_ptr = const_cast(mem); - for(auto j = 0; j < n_size; ++j) for(auto i = 0; i <= j; ++i) *tmp_ptr++ = in_mat(i, j); -} - -template SymmMat& SymmMat::operator=(const eT& val) { - init_warm(1); - access::rw(mem[0]) = val; - return *this; -} - -template SymmMat& SymmMat::operator+=(const eT& val) { - arma_extra_debug_sigprint(); - - arrayops::inplace_plus(memptr(), val, n_elem); - - return *this; -} - -template SymmMat& SymmMat::operator-=(const eT& val) { - arma_extra_debug_sigprint(); - - arrayops::inplace_minus(memptr(), val, n_elem); - - return *this; -} - -template SymmMat& SymmMat::operator*=(const eT& val) { - arma_extra_debug_sigprint(); - - arrayops::inplace_mul(memptr(), val, n_elem); - - return *this; -} - -template SymmMat& SymmMat::operator/=(const eT& val) { - arma_extra_debug_sigprint(); - - arrayops::inplace_div(memptr(), val, n_elem); - - return *this; -} - -template SymmMat::SymmMat(const SymmMat& m) - : n_size(m.n_size) - , n_elem(m.n_elem) - , mem_state(0) - , mem() { - arma_extra_debug_sigprint(arma_str::format("this = %x in_mat = %x") % this % &m); - - init_cold(); - - arrayops::copy(memptr(), m.mem, m.n_elem); -} - -template SymmMat& SymmMat::operator=(const SymmMat& m) { - arma_extra_debug_sigprint(arma_str::format("this = %x in_mat = %x") % this % &m); - - if(this != &m) { - init_warm(m.n_size); - - arrayops::copy(memptr(), m.mem, m.n_elem); - } - - return *this; -} - -template SymmMat& SymmMat::operator+=(const SymmMat& m) { - arma_extra_debug_sigprint(); - - arma_debug_assert_same_size(*this, m, "addition"); - - arrayops::inplace_plus(memptr(), m.memptr(), n_elem); - - return *this; -} - -template SymmMat& SymmMat::operator-=(const SymmMat& m) { - arma_extra_debug_sigprint(); - - arma_debug_assert_same_size(*this, m, "subtraction"); - - arrayops::inplace_minus(memptr(), m.memptr(), n_elem); - - return *this; -} - -template SymmMat& SymmMat::operator%=(const SymmMat& m) { - arma_extra_debug_sigprint(); - - arma_debug_assert_same_size(*this, m, "element-wise multiplication"); - - arrayops::inplace_mul(memptr(), m.memptr(), n_elem); - - return *this; -} - -template SymmMat& SymmMat::operator/=(const SymmMat& m) { - arma_extra_debug_sigprint(); - - arma_debug_assert_same_size(*this, m, "element-wise division"); - - arrayops::inplace_div(memptr(), m.memptr(), n_elem); - - return *this; -} - -template template SymmMat::SymmMat(const SmOp& X) - : n_size(0) - , n_elem(0) - , mem_state(0) - , mem() { - arma_extra_debug_sigprint_this(this); - - arma_type_check((is_same_type::no)); - - smop_type::apply(*this, X); -} - -template template SymmMat& SymmMat::operator=(const Glue& X) { - arma_extra_debug_sigprint(); - - arma_type_check((is_same_type::no)); - arma_type_check((is_same_type::no)); - - glue_type::apply(*this, X); - - return *this; -} - -template template SymmMat& SymmMat::operator=(const SmOp& X) { - arma_extra_debug_sigprint(); - - arma_type_check((is_same_type::no)); - - smop_type::apply(*this, X); - - return *this; -} - -template eT& SymmMat::at(const uword& in_row, const uword& in_col) { - const auto tmp_loc = in_col > in_row ? (in_col * in_col + in_col) / 2 + in_row : (in_row * in_row + in_row) / 2 + in_col; - - return access::rw(mem[tmp_loc]); -} - -template const eT& SymmMat::at(const uword& in_row, const uword& in_col) const { - const auto tmp_loc = in_col > in_row ? (in_col * in_col + in_col) / 2 + in_row : (in_row * in_row + in_row) / 2 + in_col; - - return mem[tmp_loc]; -} - -template eT& SymmMat::operator()(const uword& in_row, const uword& in_col) { - arma_debug_check(in_row >= n_size || in_col >= n_size, "SymmMat::operator(): index out of bounds"); - return at(in_row, in_col); -} - -template const eT& SymmMat::operator()(const uword& in_row, const uword& in_col) const { - arma_debug_check(in_row >= n_size || in_col >= n_size, "SymmMat::operator(): index out of bounds"); - return at(in_row, in_col); -} - -template void SymmMat::init_cold() { - arma_extra_debug_sigprint(arma_str::format("n_size = %d") % n_size); - -#if(defined(ARMA_USE_CXX11) || defined(ARMA_64BIT_WORD)) - auto error_message = "SymmMat::init(): requested size is too large"; -#else - const char* error_message = "SymmMat::init(): requested size is too large; suggest to compile in C++11 mode or enable ARMA_64BIT_WORD"; -#endif - - arma_debug_check(n_size > ARMA_MAX_UHWORD ? n_elem > ARMA_MAX_UWORD : false, error_message); - - if(n_elem <= arma_config::mat_prealloc) - if(n_elem == 0) access::rw(mem) = NULL; - else { - arma_extra_debug_print("SymmMat::init(): using local memory"); - access::rw(mem) = mem_local; - } - else { - arma_extra_debug_print("SymmMat::init(): acquiring memory"); - access::rw(mem) = memory::acquire(n_elem); - } -} - -template void SymmMat::init_warm(const uword& in_size) { - arma_extra_debug_sigprint(arma_str::format("in_n_size = %d") % in_size); - - if(n_size == in_size) return; - - auto err_state = false; - char* err_msg = nullptr; - - const uhword t_mem_state = mem_state; - - arma_debug_set_error(err_state, err_msg, t_mem_state == 3, "SymmMat::init(): size is fixed and hence cannot be changed"); - -#if(defined(ARMA_USE_CXX11) || defined(ARMA_64BIT_WORD)) - auto error_message = "SymmMat::init(): requested size is too large"; -#else - const char* error_message = "SymmMat::init(): requested size is too large; suggest to compile in C++11 mode or enable ARMA_64BIT_WORD"; -#endif - - arma_debug_set_error(err_state, err_msg, in_size > ARMA_MAX_UHWORD ? (in_size + 1) * in_size / 2 > ARMA_MAX_UWORD : false, error_message); - - arma_debug_check(err_state, err_msg); - - const auto old_n_elem = n_elem; - const auto new_n_elem = (in_size + 1) * in_size / 2; - - if(old_n_elem == new_n_elem) { arma_extra_debug_print("SymmMat::init(): reusing memory"); } - else { - arma_debug_check(t_mem_state == 2, "SymmMat::init(): mismatch between size of auxiliary memory and requested size"); - - if(new_n_elem < old_n_elem) { - if(t_mem_state == 0 && new_n_elem <= arma_config::mat_prealloc) { - if(old_n_elem > arma_config::mat_prealloc) { - arma_extra_debug_print("SymmMat::init(): releasing memory"); - memory::release(access::rw(mem)); - } - - access::rw(mem) = new_n_elem == 0 ? NULL : mem_local; - } - else { arma_extra_debug_print("SymmMat::init(): reusing memory"); } - } - else { - if(t_mem_state == 0 && old_n_elem > arma_config::mat_prealloc) { - arma_extra_debug_print("SymmMat::init(): releasing memory"); - memory::release(access::rw(mem)); - } - - access::rw(mem) = new_n_elem <= arma_config::mat_prealloc ? mem_local : memory::acquire(new_n_elem); - - access::rw(mem_state) = 0; - } - - access::rw(n_size) = in_size; - access::rw(n_elem) = new_n_elem; - } -} - -template void SymmMat::print() const { - auto& o = std::cout; - - const auto save_flags = o.flags(); - const auto save_precision = o.precision(); - - o.unsetf(ios::scientific); - o.setf(ios::fixed); - o.precision(4); - - for(auto i = 0; i < n_size; i++) { - for(auto j = 0; j < n_size; j++) { - o.width(8); - o << at(i, j) << " "; - } - o << endl; - } - - o.flags(save_flags); - o.precision(save_precision); -} - -template eT* SymmMat::memptr() { return const_cast(mem); } - -template const eT* SymmMat::memptr() const { return mem; } - -template void SymmMat::set_size(const uword in_size) { - arma_extra_debug_sigprint(); - - init_warm(in_size); -} - -template const SymmMat& SymmMat::fill(const eT val) { - arma_extra_debug_sigprint(); - - arrayops::inplace_set(memptr(), val, n_elem); - - return *this; -} - -template template const SymmMat& SymmMat::fill(const fill::fill_class&) { - arma_extra_debug_sigprint(); - - if(is_same_type::yes) (*this).zeros(); - else if(is_same_type::yes) (*this).ones(); - else if(is_same_type::yes) (*this).eye(); - - return *this; -} - -template const SymmMat& SymmMat::zeros() { - arma_extra_debug_sigprint(); - - arrayops::fill_zeros(memptr(), n_elem); - - return *this; -} - -template const SymmMat& SymmMat::zeros(const uword in_size) { - arma_extra_debug_sigprint(); - - set_size(in_size); - - return (*this).zeros(); -} - -template const SymmMat& SymmMat::ones() { - arma_extra_debug_sigprint(); - - return fill(eT(1)); -} - -template const SymmMat& SymmMat::ones(const uword in_size) { - arma_extra_debug_sigprint(); - - set_size(in_size); - - return fill(eT(1)); -} - -template const SymmMat& SymmMat::eye() { - arma_extra_debug_sigprint(); - - (*this).zeros(); - - for(uword ii = 0; ii < n_size; ++ii) at(ii, ii) = eT(1); - - return *this; -} - -template const SymmMat& SymmMat::eye(const uword in_size) { - arma_extra_debug_sigprint(); - - set_size(in_size); - - return (*this).eye(); -} - -template void SymmMat::reset() { - arma_extra_debug_sigprint(); - - init_warm(0); -} - -template int sp_solve(Col& X, SymmMat& A, const Col& B) { - X = B; - - auto UPLO = 'U'; - auto N = static_cast(A.n_size); - auto NRHS = 1; - const auto IPIV = new int[N]; - auto LDB = N; - auto INFO = 0; - - if(is_float::value) { - using T = float; - arma_fortran(arma_sspsv)(&UPLO, &N, &NRHS, (T*)A.memptr(), IPIV, (T*)X.memptr(), &LDB, &INFO); - } - else if(is_double::value) { - using T = double; - arma_fortran(arma_dspsv)(&UPLO, &N, &NRHS, (T*)A.memptr(), IPIV, (T*)X.memptr(), &LDB, &INFO); - } - - delete[] IPIV; - - return INFO; -} diff --git a/Include/armadillo/armadillo_exts/debug.hpp b/Include/armadillo/armadillo_exts/debug.hpp deleted file mode 100644 index 7b8324e66..000000000 --- a/Include/armadillo/armadillo_exts/debug.hpp +++ /dev/null @@ -1,9 +0,0 @@ -template -arma_hot - -void arma_assert_same_size(const SymmMat& A, const SymmMat& B, const char* x) { - const uword A_n_size = A.n_size; - const uword B_n_size = B.n_size; - - if(A_n_size != B_n_size) arma_stop_logic_error(arma_incompat_size_string(A_n_size, A_n_size, B_n_size, B_n_size, x)); -} diff --git a/Include/armadillo/armadillo_exts/def_lapack.hpp b/Include/armadillo/armadillo_exts/def_lapack.hpp index d923f58fd..600f6b52f 100644 --- a/Include/armadillo/armadillo_exts/def_lapack.hpp +++ b/Include/armadillo/armadillo_exts/def_lapack.hpp @@ -10,8 +10,6 @@ #define arma_sspmv SSPMV #define arma_dspmv DSPMV -#define arma_sspmm SSPMM -#define arma_dspmm DSPMM #define arma_dsysv DSYSV #define arma_dsygvx DSYGVX @@ -54,8 +52,6 @@ #define arma_sspmv sspmv #define arma_dspmv dspmv -#define arma_sspmm sspmm -#define arma_dspmm dspmm #define arma_dsysv dsysv #define arma_dsygvx dsygvx @@ -103,10 +99,6 @@ void arma_fortran(arma_sspmv)(const char* UPLO, const int* N, const float* ALPHA void arma_fortran(arma_dspmv)(const char* UPLO, const int* N, const double* ALPHA, const double* AP, const double* X, const int* INCX, const double* BETA, double* Y, const int* INCY); -void arma_fortran(arma_sspmm)(const char* SIDE, const char* UPLO, const char* TRAN, const int* M, const int* N, const float* A, const float* ALPHA, const float* B, const int* LDB, const float* BETA, float* C, const int* LDC); - -void arma_fortran(arma_dspmm)(const char* SIDE, const char* UPLO, const char* TRAN, const int* M, const int* N, const double* A, const double* ALPHA, const double* B, const int* LDB, const double* BETA, double* C, const int* LDC); - // symmetric matrix void arma_fortran(arma_dsysv)(char* UPLO, int* N, int* NRHS, double* A, int* LDA, int* IPIV, double* B, int* LDB, double* WORK, int* LWORK, int* INFO); diff --git a/Include/armadillo/armadillo_exts/fn_inv.hpp b/Include/armadillo/armadillo_exts/fn_inv.hpp deleted file mode 100644 index fed8cefc9..000000000 --- a/Include/armadillo/armadillo_exts/fn_inv.hpp +++ /dev/null @@ -1,7 +0,0 @@ -template arma_warn_unused - -typename enable_if2::value && is_SymmMat::value, const SmOp>::result inv(const Base& X) { - arma_extra_debug_sigprint(); - - return SmOp(X.get_ref()); -} diff --git a/Include/armadillo/armadillo_exts/fn_solve.hpp b/Include/armadillo/armadillo_exts/fn_solve.hpp deleted file mode 100644 index 7a8486835..000000000 --- a/Include/armadillo/armadillo_exts/fn_solve.hpp +++ /dev/null @@ -1,10 +0,0 @@ -template typename enable_if2::value &&is_SymmMat::value, - - -const Glue -> -::result solve(const T1& A, const Base& B) { - arma_extra_debug_sigprint(); - - return Glue(A.get_ref(), B.get_ref()); -} diff --git a/Include/armadillo/armadillo_exts/glue_solve_bones.hpp b/Include/armadillo/armadillo_exts/glue_solve_bones.hpp deleted file mode 100644 index cf5a2dec9..000000000 --- a/Include/armadillo/armadillo_exts/glue_solve_bones.hpp +++ /dev/null @@ -1,32 +0,0 @@ -class glue_solve_symm { -public: - template static void apply(Mat& X, const Glue& S) { - arma_extra_debug_sigprint(); - - if(glue_solve_symm::apply(X, S.A, S.B) == false) arma_stop_runtime_error("solve(): solution not found"); - } - - template static bool apply(Mat& X, const T1& A, const T2& B) { - auto UPLO = 'U'; - auto N = static_cast(A.n_size); - auto NRHS = static_cast(B.n_cols); - const auto IPIV = new int[N]; - auto LDB = N; - auto INFO = 0; - - X = Mat(B.memptr(), N, NRHS); - - if(is_float::value) { - using T = float; - arma_fortran(arma_sspsv)(&UPLO, &N, &NRHS, (T*)A.memptr(), IPIV, (T*)X.memptr(), &LDB, &INFO); - } - else if(is_double::value) { - using T = double; - arma_fortran(arma_dspsv)(&UPLO, &N, &NRHS, (T*)A.memptr(), IPIV, (T*)X.memptr(), &LDB, &INFO); - } - - delete[] IPIV; - - return INFO == 0; - } -}; diff --git a/Include/armadillo/armadillo_exts/glue_solve_meat.hpp b/Include/armadillo/armadillo_exts/glue_solve_meat.hpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/Include/armadillo/armadillo_exts/glue_times_bones.hpp b/Include/armadillo/armadillo_exts/glue_times_bones.hpp deleted file mode 100644 index 7c92e41e9..000000000 --- a/Include/armadillo/armadillo_exts/glue_times_bones.hpp +++ /dev/null @@ -1,72 +0,0 @@ -class glue_times_symm { -public: - template - arma_hot - static - - void apply(Mat& out, const Glue& I) { - typedef typename T1::elem_type eT; - auto& A = I.A; - auto& X = I.B; - - out = X; - - auto UPLO = 'U'; - auto N = static_cast(A.n_size); - eT ALPHA = 1.; - auto INC = 1; - eT BETA = 0.; - - if(is_float::value) { - using T = float; - arma_fortran(arma_sspmv)(&UPLO, &N, (T*)&ALPHA, (T*)A.memptr(), (T*)X.memptr(), &INC, (T*)&BETA, (T*)out.memptr(), &INC); - } - else if(is_double::value) { - using T = double; - arma_fortran(arma_dspmv)(&UPLO, &N, (T*)&ALPHA, (T*)A.memptr(), (T*)X.memptr(), &INC, (T*)&BETA, (T*)out.memptr(), &INC); - } - } -}; - -class glue_mixed_times_symm { -public: - template inline static void apply(Mat::eT>& out, const mtGlue::eT, T1, T2, glue_mixed_times_symm>& X) { - arma_extra_debug_sigprint(); - - typedef typename T1::elem_type eT1; - typedef typename T2::elem_type eT2; - - const unwrap_check_mixed tmp1(X.A, out); - const unwrap_check_mixed tmp2(X.B, out); - - const Mat& A = tmp1.M; - const Mat& B = tmp2.M; - - arma_debug_assert_mul_size(A, B, "matrix multiplication"); - - out.set_size(A.n_rows, B.n_cols); - - gemm_mixed<>::apply(out, A, B); - } -}; - -template inline Col sp_mv(const SymmMat& A, const Col& X) { - auto Y = X; - - auto UPLO = 'U'; - auto N = static_cast(A.n_size); - eT ALPHA = 1.; - auto INC = 1; - eT BETA = 0.; - - if(is_float::value) { - using T = float; - arma_fortran(arma_sspmv)(&UPLO, &N, (T*)&ALPHA, (T*)A.memptr(), (T*)X.memptr(), &INC, (T*)&BETA, (T*)Y.memptr(), &INC); - } - else if(is_double::value) { - using T = double; - arma_fortran(arma_dspmv)(&UPLO, &N, (T*)&ALPHA, (T*)A.memptr(), (T*)X.memptr(), &INC, (T*)&BETA, (T*)Y.memptr(), &INC); - } - - return Y; -}; diff --git a/Include/armadillo/armadillo_exts/glue_times_meat.hpp b/Include/armadillo/armadillo_exts/glue_times_meat.hpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/Include/armadillo/armadillo_exts/operator_times.hpp b/Include/armadillo/armadillo_exts/operator_times.hpp deleted file mode 100644 index 9cdc5fe4d..000000000 --- a/Include/armadillo/armadillo_exts/operator_times.hpp +++ /dev/null @@ -1,61 +0,0 @@ -template typename enable_if2::value, const eOp>::result operator*(const T1& X, const typename T1::elem_type k) { - arma_extra_debug_sigprint(); - - return eOp(X, k); -} - -template typename enable_if2::value, const eOp>::result operator*(const typename T1::elem_type k, const T1& X) { - arma_extra_debug_sigprint(); - - return eOp(X, k); -} - -template typename enable_if2::value && is_Mat::value && is_same_type < typename T1::elem_type, typename T2::elem_type>::value -, -const Glue -> -::result operator*(const T1& X, const T2& Y) { - arma_extra_debug_sigprint(); - - return Glue(X, Y); -} - -template typename enable_if2::value && is_SymmMat::value && is_same_type < typename T1::elem_type, typename T2::elem_type>::value -, -const Glue -> -::result operator*(const T1& X, const T2& Y) { - arma_extra_debug_sigprint(); - - return Glue(X, Y); -} - -template inline typename enable_if2<(is_SymmMat::value && is_arma_type::value && (is_same_type < typename T1::elem_type, typename T2::elem_type > ::no)), const mtGlue::result, T1, T2, glue_mixed_times_symm> -> -::result operator*(const T1& X, const T2& Y) { - arma_extra_debug_sigprint(); - - typedef typename T1::elem_type eT1; - typedef typename T2::elem_type eT2; - - typedef typename promote_type::result out_eT; - - promote_type::check(); - - return mtGlue(X, Y); -} - -template inline typename enable_if2<(is_arma_type::value && is_SymmMat::value && (is_same_type < typename T1::elem_type, typename T2::elem_type > ::no)), const mtGlue::result, T1, T2, glue_mixed_times_symm> -> -::result operator*(const T1& X, const T2& Y) { - arma_extra_debug_sigprint(); - - typedef typename T1::elem_type eT1; - typedef typename T2::elem_type eT2; - - typedef typename promote_type::result out_eT; - - promote_type::check(); - - return mtGlue(X, Y); -} diff --git a/Include/armadillo/armadillo_exts/smop_inv_bones.hpp b/Include/armadillo/armadillo_exts/smop_inv_bones.hpp deleted file mode 100644 index bdfab3320..000000000 --- a/Include/armadillo/armadillo_exts/smop_inv_bones.hpp +++ /dev/null @@ -1,47 +0,0 @@ -class smop_inv { -public: - template static void apply(T1& out, const SmOp& in) { - arma_extra_debug_sigprint(); - - out = in.m; - - if(sp_inv(out) != 0) { - out.reset(); - arma_stop_runtime_error("sp_inv(): matrix seems singular"); - } - } -}; - -template int sp_inv(SymmMat& A) { - auto UPLO = 'U'; - auto N = static_cast(A.n_size); - const auto IPIV = new int[N]; - auto INFO = 0; - - if(is_float::value) { - using T = float; - arma_fortran(arma_ssptrf)(&UPLO, &N, (T*)A.memptr(), IPIV, &INFO); - } - else if(is_double::value) { - using T = double; - arma_fortran(arma_dsptrf)(&UPLO, &N, (T*)A.memptr(), IPIV, &INFO); - } - - if(INFO != 0) return INFO; - - const auto WORK = new eT[N]; - - if(is_float::value) { - using T = float; - arma_fortran(arma_ssptri)(&UPLO, &N, (T*)A.memptr(), IPIV, (T*)WORK, &INFO); - } - else if(is_double::value) { - using T = double; - arma_fortran(arma_dsptri)(&UPLO, &N, (T*)A.memptr(), IPIV, (T*)WORK, &INFO); - } - - delete[] WORK; - delete[] IPIV; - - return INFO; -} diff --git a/Include/armadillo/armadillo_exts/smop_inv_meat.hpp b/Include/armadillo/armadillo_exts/smop_inv_meat.hpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/Include/armadillo/armadillo_exts/traits.hpp b/Include/armadillo/armadillo_exts/traits.hpp deleted file mode 100644 index 4c0b602ac..000000000 --- a/Include/armadillo/armadillo_exts/traits.hpp +++ /dev/null @@ -1,17 +0,0 @@ -template struct is_SymmMat { - static const bool value = false; -}; - -template struct is_SymmMat> { - static const bool value = true; -}; - -// template -// struct is_BandMat { -// static const bool value = false; -//}; -// -// template -// struct is_BandMat> { -// static const bool value = true; -//}; diff --git a/Include/armadillo/armadillo_exts/typedef_mat.hpp b/Include/armadillo/armadillo_exts/typedef_mat.hpp deleted file mode 100644 index e69de29bb..000000000 diff --git a/Include/armadillo/armadillo_shadow b/Include/armadillo/armadillo_shadow index 487c45b30..7bd9984ce 100644 --- a/Include/armadillo/armadillo_shadow +++ b/Include/armadillo/armadillo_shadow @@ -1,32 +1 @@ #include "armadillo_exts/def_lapack.hpp" - -//#include "armadillo_exts/BdOp_bones.hpp" -//#include "armadillo_exts/SmOp_bones.hpp" - -//#include "armadillo_exts/BandMat_bones.hpp" -//#include "armadillo_exts/SymmMat_bones.hpp" - -//#include "armadillo_exts/glue_solve_bones.hpp" -//#include "armadillo_exts/glue_times_bones.hpp" - -//#include "armadillo_exts/traits.hpp" - -//#include "armadillo_exts/BdOp_meat.hpp" -//#include "armadillo_exts/SmOp_meat.hpp" - -//#include "armadillo_exts/BandMat_meat.hpp" -//#include "armadillo_exts/SymmMat_meat.hpp" - -//#include "armadillo_exts/glue_solve_meat.hpp" -//#include "armadillo_exts/glue_times_meat.hpp" - -//#include "armadillo_exts/smop_inv_bones.hpp" -//#include "armadillo_exts/smop_inv_meat.hpp" - -//#include "armadillo_exts/debug.hpp" -//#include "armadillo_exts/typedef_mat.hpp" - -//#include "armadillo_exts/operator_times.hpp" - -//#include "armadillo_exts/fn_inv.hpp" -//#include "armadillo_exts/fn_solve.hpp" diff --git a/Include/catch/catch.hpp b/Include/catch/catch.hpp index d2a12427b..9b309bddc 100644 --- a/Include/catch/catch.hpp +++ b/Include/catch/catch.hpp @@ -1,6 +1,6 @@ /* - * Catch v2.13.9 - * Generated: 2022-04-12 22:37:23.260201 + * Catch v2.13.10 + * Generated: 2022-10-16 11:01:23.452308 * ---------------------------------------------------------- * This file has been merged from multiple headers. Please don't edit it directly * Copyright (c) 2022 Two Blue Cubes Ltd. All rights reserved. @@ -15,7 +15,7 @@ #define CATCH_VERSION_MAJOR 2 #define CATCH_VERSION_MINOR 13 -#define CATCH_VERSION_PATCH 9 +#define CATCH_VERSION_PATCH 10 #ifdef __clang__ # pragma clang system_header @@ -7395,8 +7395,6 @@ namespace Catch { template struct ObjectStorage { - using TStorage = typename std::aligned_storage::value>::type; - ObjectStorage() : data() {} ObjectStorage(const ObjectStorage& other) @@ -7439,7 +7437,7 @@ namespace Catch { return *static_cast(static_cast(&data)); } - TStorage data; + struct { alignas(T) unsigned char data[sizeof(T)]; } data; }; } @@ -7949,7 +7947,7 @@ namespace Catch { #if defined(__i386__) || defined(__x86_64__) #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */ #elif defined(__aarch64__) - #define CATCH_TRAP() __asm__(".inst 0xd4200000") + #define CATCH_TRAP() __asm__(".inst 0xd43e0000") #endif #elif defined(CATCH_PLATFORM_IPHONE) @@ -13558,7 +13556,7 @@ namespace Catch { // Handle list request if( Option listed = list( m_config ) ) - return static_cast( *listed ); + return (std::min) (MaxExitCode, static_cast(*listed)); TestGroup tests { m_config }; auto const totals = tests.execute(); @@ -15391,7 +15389,7 @@ namespace Catch { } Version const& libraryVersion() { - static Version version( 2, 13, 9, "", 0 ); + static Version version( 2, 13, 10, "", 0 ); return version; } @@ -17526,12 +17524,20 @@ namespace Catch { #ifndef __OBJC__ +#ifndef CATCH_INTERNAL_CDECL +#ifdef _MSC_VER +#define CATCH_INTERNAL_CDECL __cdecl +#else +#define CATCH_INTERNAL_CDECL +#endif +#endif + #if defined(CATCH_CONFIG_WCHAR) && defined(CATCH_PLATFORM_WINDOWS) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN) // Standard C/C++ Win32 Unicode wmain entry point -extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) { +extern "C" int CATCH_INTERNAL_CDECL wmain (int argc, wchar_t * argv[], wchar_t * []) { #else // Standard C/C++ main entry point -int main (int argc, char * argv[]) { +int CATCH_INTERNAL_CDECL main (int argc, char * argv[]) { #endif return Catch::Session().run( argc, argv ); diff --git a/Libs/win/libfext.dll b/Libs/win/libfext.dll index 05a235bca095cb9ea8698cc729bd1218b26c285c..ce5476ad9fbd938ca28551f89d4d619b871c1247 100644 GIT binary patch delta 1311076 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

Y@S{4KB%jt!>B0kFs`cFAwDXA6 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 o+7yI9#cfHF%ijz=5^D9 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

    !vJ*s7tMh)|C1} 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

    fouX6iyJ0N%D_GX{uDP% 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 %9I!V;)oSK}pXTQkG>5W3C5NE&9eNKf7l}*N6 z4G&;+7E<;-AJ+=q{4A{pDLTkXh>U#BcsHcRJ=Q1&DY_DFU?1Sk2B7C^;57!g48+Ad znEIYqzxKNc3f;l?H%9|8FMS*Y`gt{*o9Dytcq+o?7_R2VOTLS0Xwl27MK;E86%@J~ zA-2c3Pa%i9By^1-kGm0+cu^hX_Y1i6FB7p3vwyzGiCi2i6Zr*KYa&NiibR@ljr!eo zNo1{rRx|YXtq6PaWw<`S0z=YMsg9!X7Mb@DT6INzmAU?4?!sx5b)%BqmKHvkwp>*! z6)nA7B(VtY*cf#~CSk~O_)6$^hPvK}u=`(ARX4wx-~2m?q;II)btJKGkTr=P2FWCr zEEP%odIEOdTy;retc0p_Q(d_lL2GVcGihOBdJ2yANJ+GpxT)rK^PqvUs-_Oao&CL> z;HGY=ISMXVERy*7IPAQG(M2=N6e*n93p0&Q$`r22hJHLlKn3;zDtj`5V$;+Y zeo0;aokGtpRQH+sA#gD>;`oO0s3W|!e+@muzCKNOLAQ#G=`z= z$MB}O=VdNB4LaWr~! zDQ&tN(p5(y?AKnZPw)s}dpht6>%_$NRPD7oBk#R-D1qy=>Vs5qo)U*Hj6?0{?Q1n& z>DG=KyuqYgzn#7N8}*b;DZiJ>{-OTmZI72zH{N=H#ce!QuBX+d@qelnyf*C=OOl4X zBzd=+&itt!vR&FT4rDjpq;O3}-7C|rmQVZtlyd7o0TH&Cp*7MRo(GULs9F+~Q6 zDa1GX8j*t>2pMN3GE0bj-%B4q5g}unMD7TY?_G&xU}QcJIb+7j1oHzlHaMkarF0gT zFovAsyi%Nr#iN{3T}lVT@f$sz(zic|EDqq3G+R%hnY4kv2{Mmqh>zK^73XBdI@+8` z^HW~drjwbpE?)PS39K(-8`aj?D`nQYC`$I4^n<2NQ%2RGNL`zn=QRjiUi9Qef5O@m zd%C!H=gIJD4BgeWua%xLRM$gmrsRmRFZ0j}DoTYlbkb8R<@FBblD6@0l6kk{h?pfatmB%)ll_4vWASuNC^wauC+WA<)>B7Y8S=ECQ-fA zxTE0A7g6grnm;Y`(|na?OYJ-Tv~G&hbe=uGzqVUZa?Yc>d0^u4d^XWc*)^922WUmg z#)MmnRn82Ek`y%q_jo`CngLNPpK!VofB|{83}p_~LX?y;R3cDos}wCmlLNIpUfm~) z&NF8YI?u^jv@K8@u8a<&h#+mI5!!obzUg!zuNE5eOG%yw^I(g>PqCyrzQ`GYY6oBh_ zvJha;d9)Cu8N*6a&wN^?r0x?$I>$Kn$!U%u*;q>7Ve&J!K#DbUX)$;BZj|#P_2p5q>#OHs8-8OSvJ$YzNps7 z&8r&f87@J*JZSeg@+hv2Qd$`^f+=WrNw0_oaE5(982+~v|&n{v2>-BR!jLSnSx7e<&vg=QRS6FX&&&S%z$tb ziDrOvZFDmOVyhOFRfHG0Z)6Up zyQPu8%VVfb81mPDjD1CzwpdY$jIh^?z*MXh7-4^2R(q`|^9I{*SJ0*^%7nqxrxKh( z^I^29l2%k{jx#Nlw2I2(Z^=JeE2NwrN>!tQj~U8%FfEJLf|Wks(&1?Bxq`R9ZmO)U zSJZE*-B;Q^Wv({`RnaOd6TGQi6?m3*-j<4KWCld>W6S`1V56KPz_nD=oAy-E3VXYm zLQ!>Zz38_pTDUURiwalOS{Ew=@{y+#MSu8p2>QeMezc*g)=wc% z3a*9)!_{sA8}u!(^8Ki0HLaXd&XbZD`&MF+gMeM@ODn5sHI;W+=+|mmZsk@M(yQZ& zjjck}wXnuJx(Yir*^Yl-$H-bHr8~ZX)aH~C8RxQ9r$z+fO= z5?Kc0$Yptn%;Tiq_7ZUdg~&HZBHoPL=w<(|hIRz63v!@ASsSU8ey?$n?T97#5J z`|>*I97?^xbUjXM?!8Tst32_-vDFGMz59B7jl7`8G~_%`!#acdk#~JSP1Yj6)YCOdMTYjap8fc##$4)*a*{X$(1YobkeQ%bkBS8k>?a8r`n*{3$wIx0$Xy#2S9yt1ejPa9jqN%*#*H?6h! ztWR2Uv7PIZA6oLdq@*&YHBD**wF<3SEe{!Ov?#^1C55!rYS`-j7D2t*YORufeZ!5B z{t(*O{V&qTcJVmwd7h)Wo2E83`!UyqDEvc?>Zq10WME+ZRJY)37);CE0LHN6u0T+=;;0Bez9LXc*(`Za=5J8FeO+<-V1 zIDeoW<>{`P(&()=FuJNCUG1nOWBz6>k&87QAg$z-9+lD` zIB$iV(v4E;%Tgbwbe@!sM>jVYGarKMfV=A`ciXjzo26=~uCEk4)u zicodX26G*>!ThT9_WUe;W9f3n42Y%6K{LQPFt(ZjG0IlmjG!us zns4Q)LW<|DWhNzmFw_(dwhFsIDAp=7%%w_G*qE89tx}d%vsW6VT~d^UD0{ZS+Ruv8 zuoB%F3NP`b66GDH^-$JTq)EfzJ(^Ua-NUrp<-9LhvaFZ^k+DB6N<<8D!whidjGGrD zD9d+RA)lX2sVLP7NUMFPeQ&#VA%gCHhXvAu@{~MWJ7)X(d<4}Sp;ffC!H>3gO8V3C z5!#~A0q10^m}T=Gds_^7J~{eRQPDE}Fi4H;;nXupt8DW)haHC`Etgka35N1mSYL)N zBxz-Bx6Ve8$4Je;;DNI+ij`moWEAWYPwCtu95j|QhU3+_sAHf$uda!dhb_lCzRPHb`W9ERY@&nIS~JGbK`- zkp@6y*UJFoNMlhFm$0K#{H%x&`>?dGkaBHYlG4#|2u7q+x=%{qay0}CDYNyfrS#Vt zkZO=RyvZ~vZ^!aCr7>i97M_Of%28TP+cog0cSmV!y~Y(5>EEgjt*51kMr$K;ET z>C+NK$y&dh8-D(`^?5%>*n`Hhbvt-dw!RT0X}b0G1*CN@xo2^Q^*K^{i=}@Rqw(Xk z4>`k6q+1V1-kF{cJ`q84$7^?j`W)x}$4{_u7k435n;egzSrfF1p;hvUr2dJ4(WRj- ztZG3CwdNWf7fSCYXzz0#KKk$UHXe;2bt2OH2bAgmNblhhGre;`BE1pZ0AYn)(%UAX zn+*9CrtXupzBz9nPEXI#HYX29*ngeGwfFRpti8L3thIM5K-OM0*oiLasJ&xSdW)rn z3))+xY8`BTpZ2AjcWex#?X#brreR~?uf5XxtG%Xm-WUi;sVuB7!^NnV*I|92lxF-2 z(sFsJ)(owm-={tQVSJDM^bBEqw`qL0i*Yg7JZD6+@gS#hDSgY*azXZ5vozh!uk)^S z>yC|?2D_-+Z0%L%DLX|&2);gJ+Q6L=wDqc5G4xXfk@Y{}>WzbWWZiSmK+k<3p(aSl zSeeIuZH|V=RxaBAoy2}S{Y6OPpY7Hp9&R_2=v_`E(L4%v!u(y5Xe^;E4Egy}_jy`h zzuVi=Q*hM($!+$R^SFwxZk1JZcB@%M-ZM1c0+AwtYRIoqBB!Hw#mgdZ9?>1jM zWAjVely1BQ*6}>fdTz4UU96RJ^X#-y8gGTGxk0vUiS{hyb-1uU1P^~1k9-{VZ%FCy zxEN=AXwy<{c#alOiA%v7Y4ESyYxatlwol;@4 zSl4u!j*lgd_{JS>MdI-FAHf<=3e?7u?<(+=-|LjPN(pR6v80&sXPUsK&r6sNIkwYFas z&CFF=S~lHYM8cdcmp^%t#(Ot zV7=BPC@Yp!&WcTx$|>t*1KrL@VH>m@xw>VPHte|K!}BLbh`yInoZ4>C8kZY{1&!0f zHL2>bP!&P>g-*PAgtN2BCQaqdNKZCsK}xO>l<7yUc~zD>zqdHEn9O?eL4NMxDu3Re6G<4_ZdPf+dl(D;$7w9Rdj_5#K=pQNjq>(+XI2FsfkUVB9f0^oRw*=M--Xk@om#=9 zs)3fYmIF;|iI>hfv*@1BiYGH(A75oj$K9-W0^IAN>iumXVQfbbtZX3+4xV8fqIr?Y!OldhXi9{aSe`KwQt{)Cl;KRM;WWBR?Z zjBM;2E>^M6+@}S)X}A1%9T3^27wz1ykQaP$N?YT5>=OFT%H6 zzg6|lnkg+5tLpUj&x$-dd-#Gk;q>!UyC#WR?~91jGLWSJce;E?0}|QooB^E z7;l1ue(CrSE1r?@zIgo2i6^YGF}

    pj=Mj+DsEPYpnFr^SKR^jG=mX~ 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

    L5kYt+cYx&J@0?QD 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

    {Jzk@rF`K;dX}-{0qWuAXdD`Fo>fmIx8f3 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

  1. !`tkG(GhXY_%$a-` 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
    Ssl0aMcUT54-AXx%g+Lynm?|5hoG6kf zYAY>|93$kpu%!nHF;qFmgKN1&WIn~6mFk}#cE|wrQp>$WpQHyT+~e?i-RH3W<2ckTFO+61!KsW`Md z$$0t$r^8e+RKNyV5`H{cGuNsPIWBb>#F)@TU{Fz|ZF+UsSiBs!sS`?ADiz+O^NO85 z8JPuEYsq0;2ECRnpE$lG5(;d?VKWXkHq^Y-(b3LNfpS^POEd7D#1aKBEmF`T;*@l7(W%}ndTBwM zEEob;X_0~z;K8)0AnP&+lwD5;TX-G7qZJ&upfXl7#f8*IS@YUEmI8Z zWkR_VIjmRG1J)~P71qmCGctuj*>D0ixIvfVzCi)I^s`w&ZU5DtM(3m}D)dRCd# zvr>36s8lBPj8o{NTb}qo|qQ4B}oB5q=kdbsuiNPGL^wYk-m>@Y&o!I0JIdoOj}m? zDpNw_t?*SAsUS{q%z!%cw~@18A0gS6n}9w4$+iSXPH>Knn{1X*#KGbvb3gM1yK6_{ zD(TfrGdMYkW%slZhd4l@=*j0nUnFj1w5#FYrQoPZXuDerGj;V|ZMTtQfC| ze@@}m6k1RIc(j6=gg@Y`$ozl~bA=c|JvsERMl&(XLegrf3-N~(qEjap#wTk%mS`#s&fSauNi_ z8Ug%O2#l|FWf+Y@BQ`I6_COIp4;S{ED)^YfO>QHs%B}nqrJH z_RI$qjubTfYNQHN*Nharh3T?pqzXM! zxI2`o!e2E~k0)yc!9r`-8WV=G<)=XaKNJEC?JQFzKZwA!LEzfJlOK|$;azKZ_^aSu zYtnc`op#J;j?Q?VE^}~Q1K%M~%PYO5x(d?zQqkfE+EkUM^r`Y28dXkzs1$YcRMV1T zr@Q==>6Wi(8&a7N=pIRmy%Vva_&eYhQ-3K?v+zwLw?aEZTkdR>|N(lly@%Q||L(xp=O;oe!ZJH17)0C@xjB_8XT= z@SFxf+MgW$s;+8(a)t6Ihn1yzto_O1uvzeG2!B=2Irc<}1P}Hsf2CRN>5Xy53h7N> zW*0oq{q(=+1kTNc7Tx(Q{9J+R`IB?Y22IhQoSRL5a{Al&lQW;VZsL69{Nq9Zt+;`@_}B|2wUlWl{FmCe|sYI)^PPFME)$rZeP7G%^d zG`=6LaoJHQe{%ANJ1KT!jDhxy#yg%udGAtm1Ve)U9xjP4;9ktVSWy>NPmf<)jIQ?7 z$1}ZG^{@MrQ?#f*9`bRk{{3q2nY~M~65wOieNd3|g%#&~;SR?6!t6U=aO`crdR{AZ z#_!~Lt@ONBdR{BHy;g2}t=#rnx$U)bo2`st0mwfpXlU6r_nQs6-)z$T4(m&^wms>j zQ(n61eh2MISKa)eJ?XBKFCBKjgZ8A;ZoagKrzGeGcm}cO!xH>aHX7`%`UOc$|6-FW z&6ZK>|7*oFuQe~cHf)bPu>1g?;63iA|3${- z=3=!upX7n=r~ickbu)ve$OGMM@<9DqOK zvBYXCjsr~t&`GM6S3FR+?eV~C%>%C$&yzpodDn`?T~j{9!vA)-!8^h6qyN%--u15j zD_{4XmtN@KfBKcD_uim0=w0v~Z^Hlf5AWVOytRMOyUj2Azgzm}!9A1l{x^)j<3sko z|9#&%dgJT%_C9h?{qOBCFxj5I`Jw*Ydm2A}y7|z5pW6HQXWmW=*1?;5ChL>&3d#}zn{4GQT*I{qtmIk?0wS5e+1Hg zKyvo>K6dYO_P%%fi7!q^>t(S#*}UnkFTd?g?|S~F7j(Y&hroyk|LyI4sQmhP{P)A; zmjh+*DcXAj*YDlF?sXpkezpdR?h(1y@0l(?wYMkeo|zQsoPwjv9Iy;3?UiNj*c7I} ziT~06W9xf+_w*P4yngRx{I}nK{>2CHe)*OD{o{wvzWn@ySKj?HOk;!&kSCN-DX>FI z>D@6jLrQtQP|9};azt@&FGeY2l~w-Np_JPuk(BaX=0pD_r92S|Xfm <5;=@3by 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 literal 520672 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≠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 KU_+_MGyQ*GvRQio diff --git a/Libs/win/libmetis.dll b/Libs/win/libmetis.dll index 527d1d52a59331285be6598b9ca1139ca880cb02..28c9f77b6d1eafcafe30dcc3f8ee0cebab702a77 100644 GIT binary patch delta 67 zcmbQcQ*-W4%?TYWWif@x6MKA^ujX+z-fq3k*m|3(^)_?sZI;&CtgW}%T5q#&z0INN U30Bw6;l%;OoZC6PxTXpL0P0;D!vFvP delta 67 zcmbQcQ*-W4%?TYWzx-m8CieI+Zw};cyxn@6vGq1n>uu)N+bpfOSzB+jwccjmdYePj WljSE+T|0*t2M}{^=kVg1Dg*%gh#N)# diff --git a/Libs/win/libmetis.lib b/Libs/win/libmetis.lib index c02568a4c37f4804fcab41b1d9b4a90c6f292061..a9206a4e44685250b38bb56b5048cfe28bde3c9f 100644 GIT binary patch literal 234828 zcmeEv3zQs16?SzsMvNFEB4Wgd7-Pg3vzyH(AV!jXBq7<&va<;okzsbGXLqu*Gs8SK zn-vieBO)RqA|fIpA|fIpA|fIxA|fgxA|fJ2j1dtrM#PBtfA#3@dd(vN|MQ>!xM#mp zQ}^Dwb?bGjy1KgiRY#`E>Ct7=-*|}r*Vfs&bkUMUo$Z}EeW8plKD=Y$BL4ft>4ZG@ zQsUip1M%+OPP}_&6Yu9!5|1JT?%gPH2SVT%9TG_Q3*f%}Bqk9uJS_0b0pfAof)KcW zzQhFxfnV(-Q9{V@puhu16OZFMgut&4kvIz>@L*QrA%wthR!Llg5O@e>;5Zv0!&3sk z%@dE~UWCB5qa?0E2>foA1oHSD@GzAqBV<6i7=FJ&;!cFX_9G>(MhN_2j>LrsfgRI; zlYvKx_s0_eqwvGHe(4#{ls-ZbAq=iMrxA2O-05fqz0j2W6FdT!IkTXS&462pJw1c+N&bIc`S?OzV_DnrXmuk&dH^kl|s0eftUJ_zptgdGjSM zMhHxwCIK6#Gu$um{9Zyiu0;s!H%sDlgba@gykL+}jvEjHGiFO{MaZyI;DxZC;|_$t z%%u{SBLrSFLt+vk1MFwmf2{;`?+?8AP>Hh;GVBsK0Qxy@K?uBLp2YbGfdh%eCWH+4 z3cPd~p&VBr1P+=hF@=x;HZZ&l^~eDmUIxsXD{&q|hNlHyo*|S2`d=Oy)K;6s+UfC{jAwu8~Dlv+X;Vyw!!G4Y_5dw!EC~*oxh8+U09w3zC zdW687*%GHCWOzj2HG_n5z}D9Qb72R^r3iu7qJB7_`?U<)1?E9N$4v-<*UgbQ2O-05 zfx}Qg94O;q!0Vx(;{t>XPYcY?63THWLf{QYNL+>xSb+Y*F@=y}o4^}U-yGK=1Qw#4 z9A_Y8*eTF>RfbK;Mj|+61Kqv=n>HrpZN?e2x=$s}ofso-r zfhFC9a$JoNSbCtuDF_)*j|_*yevTUv0!Pf1I2R$q(*keG6UuQfLg2_{5|)Q9a}=-~V}|2ogbdKbup%pQ7eb(`SK=mwK=(X} zix2`ms7sD2LI$)IL+`M}j}ZbZQAZqTx0S%ELnY9ERx#`rSdIKSkoRifXtW*2B?y5v z$d99pkl|s0wL^q*+=>wBTOe^ELZBb%IFP2F;UR%_XcLYb5CQ|Ri{ng$3_AsmIi64s z^owJFLDg-A2y803fxJ!w-gAfq@_G-$PJz?W?>W%tPY2$MdgeeKzZclLk3382yos~iAxazABFuKsGE;6psg9sUmO`g2!TuH zNt}m};VFSnX9(rE3n6eR%EfUNLf|t8N}Pd^;YoqZh6&|>t(O6x?T~=2p9L;QeQ?08 z%NceEd~T3X4%qZL;0m-S$GHd@U>C#Zvl4eB1g?Z#99JR)zHorVDF_+13tY8

    $~) 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 literal 185356 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 wJAnDdT+g=obS2A)YvwQteZ8kz>FA1GuAxa{vGU diff --git a/MSVC/suanPan/ElementExample/ElementExample.vcxproj b/MSVC/suanPan/ElementExample/ElementExample.vcxproj index 314350ae5..3f77cbeeb 100644 --- a/MSVC/suanPan/ElementExample/ElementExample.vcxproj +++ b/MSVC/suanPan/ElementExample/ElementExample.vcxproj @@ -17,7 +17,7 @@ DynamicLibrary true - v142 + v143 Unicode x64 diff --git a/MSVC/suanPan/MaterialExample/MaterialExample.vcxproj b/MSVC/suanPan/MaterialExample/MaterialExample.vcxproj index b391ccba3..b39b0de61 100644 --- a/MSVC/suanPan/MaterialExample/MaterialExample.vcxproj +++ b/MSVC/suanPan/MaterialExample/MaterialExample.vcxproj @@ -17,7 +17,7 @@ DynamicLibrary true - v142 + v143 Unicode x64 diff --git a/MSVC/suanPan/ModifierExample/ModifierExample.vcxproj b/MSVC/suanPan/ModifierExample/ModifierExample.vcxproj index 32c1ac984..d409d7de1 100644 --- a/MSVC/suanPan/ModifierExample/ModifierExample.vcxproj +++ b/MSVC/suanPan/ModifierExample/ModifierExample.vcxproj @@ -17,7 +17,7 @@ DynamicLibrary true - v142 + v143 Unicode x64 diff --git a/MSVC/suanPan/ModuleBundle/ModuleBundle.vcxproj b/MSVC/suanPan/ModuleBundle/ModuleBundle.vcxproj index a48c9f213..05d2a0b91 100644 --- a/MSVC/suanPan/ModuleBundle/ModuleBundle.vcxproj +++ b/MSVC/suanPan/ModuleBundle/ModuleBundle.vcxproj @@ -17,7 +17,7 @@ DynamicLibrary true - v142 + v143 Unicode x64 diff --git a/MSVC/suanPan/SectionExample/SectionExample.vcxproj b/MSVC/suanPan/SectionExample/SectionExample.vcxproj index 7fbdfba8c..4b8c26a98 100644 --- a/MSVC/suanPan/SectionExample/SectionExample.vcxproj +++ b/MSVC/suanPan/SectionExample/SectionExample.vcxproj @@ -17,7 +17,7 @@ DynamicLibrary true - v142 + v143 Unicode x64 diff --git a/MSVC/suanPan/arpack/arpack.vfproj b/MSVC/suanPan/arpack/arpack.vfproj index 3a37d50e8..11b23e889 100644 --- a/MSVC/suanPan/arpack/arpack.vfproj +++ b/MSVC/suanPan/arpack/arpack.vfproj @@ -14,6 +14,7 @@ + @@ -26,9 +27,7 @@ - - @@ -53,14 +52,9 @@ - - - - - + - @@ -84,7 +78,6 @@ - @@ -97,5 +90,6 @@ - + + diff --git a/MSVC/suanPan/metis/metis.vcxproj b/MSVC/suanPan/metis/metis.vcxproj index 49f10cc51..b943df6ed 100644 --- a/MSVC/suanPan/metis/metis.vcxproj +++ b/MSVC/suanPan/metis/metis.vcxproj @@ -21,7 +21,7 @@ StaticLibrary false - v142 + v143 true Unicode x64 @@ -29,7 +29,7 @@ StaticLibrary true - v142 + v143 Unicode x64 diff --git a/MSVC/suanPan/mumps_c/mumps_c.vcxproj b/MSVC/suanPan/mumps_c/mumps_c.vcxproj index 467c11bdd..162b5469b 100644 --- a/MSVC/suanPan/mumps_c/mumps_c.vcxproj +++ b/MSVC/suanPan/mumps_c/mumps_c.vcxproj @@ -17,7 +17,7 @@ StaticLibrary false - v142 + v143 true Unicode x64 diff --git a/MSVC/suanPan/suanPan.sln b/MSVC/suanPan/suanPan.sln index 791cf894f..2f53a5217 100644 --- a/MSVC/suanPan/suanPan.sln +++ b/MSVC/suanPan/suanPan.sln @@ -1,12 +1,11 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.1.32407.343 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.33027.164 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "suanPan", "suanPan\suanPan.vcxproj", "{1AC2C10B-9DDD-4178-82A4-70C309C305BF}" ProjectSection(ProjectDependencies) = postProject {C8479E1D-A9C4-4FE9-B283-3F6317F9ECF5} = {C8479E1D-A9C4-4FE9-B283-3F6317F9ECF5} - {6540EB29-E749-431D-AB70-3A5AA4053834} = {6540EB29-E749-431D-AB70-3A5AA4053834} {5270594C-8360-4FB3-BF8D-49BF1E51C5FE} = {5270594C-8360-4FB3-BF8D-49BF1E51C5FE} {E75FB1D9-6EB8-4C3B-8130-7B1CBE5EA7C1} = {E75FB1D9-6EB8-4C3B-8130-7B1CBE5EA7C1} {C41240E3-D993-440D-B994-4C721A27BC51} = {C41240E3-D993-440D-B994-4C721A27BC51} @@ -20,8 +19,6 @@ Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "amd", "amd\amd.vfproj", "{C EndProject Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "arpack", "arpack\arpack.vfproj", "{E75FB1D9-6EB8-4C3B-8130-7B1CBE5EA7C1}" EndProject -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "spmm", "spmm\spmm.vfproj", "{6540EB29-E749-431D-AB70-3A5AA4053834}" -EndProject Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "feast", "feast\feast.vfproj", "{245BA1FE-5C90-492F-B308-65A6C0068A69}" EndProject Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "mumps_f", "mumps_f\mumps_f.vfproj", "{C41240E3-D993-440D-B994-4C721A27BC51}" @@ -87,9 +84,6 @@ Global {E75FB1D9-6EB8-4C3B-8130-7B1CBE5EA7C1}.Debug|x64.ActiveCfg = Release|x64 {E75FB1D9-6EB8-4C3B-8130-7B1CBE5EA7C1}.Release|x64.ActiveCfg = Release|x64 {E75FB1D9-6EB8-4C3B-8130-7B1CBE5EA7C1}.Release|x64.Build.0 = Release|x64 - {6540EB29-E749-431D-AB70-3A5AA4053834}.Debug|x64.ActiveCfg = Release|x64 - {6540EB29-E749-431D-AB70-3A5AA4053834}.Release|x64.ActiveCfg = Release|x64 - {6540EB29-E749-431D-AB70-3A5AA4053834}.Release|x64.Build.0 = Release|x64 {245BA1FE-5C90-492F-B308-65A6C0068A69}.Debug|x64.ActiveCfg = Release|x64 {245BA1FE-5C90-492F-B308-65A6C0068A69}.Release|x64.ActiveCfg = Release|x64 {245BA1FE-5C90-492F-B308-65A6C0068A69}.Release|x64.Build.0 = Release|x64 @@ -133,7 +127,6 @@ Global GlobalSection(NestedProjects) = preSolution {C8479E1D-A9C4-4FE9-B283-3F6317F9ECF5} = {10DA8914-6427-42A5-B20C-96CE5DDE8301} {E75FB1D9-6EB8-4C3B-8130-7B1CBE5EA7C1} = {10DA8914-6427-42A5-B20C-96CE5DDE8301} - {6540EB29-E749-431D-AB70-3A5AA4053834} = {10DA8914-6427-42A5-B20C-96CE5DDE8301} {245BA1FE-5C90-492F-B308-65A6C0068A69} = {10DA8914-6427-42A5-B20C-96CE5DDE8301} {C41240E3-D993-440D-B994-4C721A27BC51} = {10DA8914-6427-42A5-B20C-96CE5DDE8301} {86C5CA2F-6514-413E-AC69-0DD78BBB9C33} = {04BD7C4D-B05C-4173-A53F-0DEFCDAF6CE3} diff --git a/MSVC/suanPan/suanPan/suanPan.vcxproj b/MSVC/suanPan/suanPan/suanPan.vcxproj index 687e4fc52..ff88d8193 100644 --- a/MSVC/suanPan/suanPan/suanPan.vcxproj +++ b/MSVC/suanPan/suanPan/suanPan.vcxproj @@ -20,7 +20,7 @@ Application - v142 + v143 Unicode x64 true @@ -28,7 +28,7 @@ Application false - v142 + v143 true Unicode x64 @@ -92,7 +92,7 @@ true true ../../../Libs/vs;../../$(Configuration)/Libs;$(VTK_LIB);$(CUDA_PATH)/lib/x64;%(AdditionalLibraryDirectories) - cusparse.lib;cusolver.lib;cublas.lib;cudart.lib;amd.lib;arpack.lib;metis.lib;mumps_c.lib;mumps_f.lib;feast.lib;spmm.lib;superlu.lib;libhdf5.lib;libhdf5_hl.lib;opengl32.lib;wsock32.lib;psapi.lib;dbghelp.lib;vtkcgns-9.2.lib;vtkChartsCore-9.2.lib;vtkCommonColor-9.2.lib;vtkCommonComputationalGeometry-9.2.lib;vtkCommonCore-9.2.lib;vtkCommonDataModel-9.2.lib;vtkCommonExecutionModel-9.2.lib;vtkCommonMath-9.2.lib;vtkCommonMisc-9.2.lib;vtkCommonSystem-9.2.lib;vtkCommonTransforms-9.2.lib;vtkDICOMParser-9.2.lib;vtkDomainsChemistry-9.2.lib;vtkDomainsChemistryOpenGL2-9.2.lib;vtkdoubleconversion-9.2.lib;vtkexodusII-9.2.lib;vtkexpat-9.2.lib;vtkFiltersAMR-9.2.lib;vtkFiltersCore-9.2.lib;vtkFiltersExtraction-9.2.lib;vtkFiltersFlowPaths-9.2.lib;vtkFiltersGeneral-9.2.lib;vtkFiltersGeneric-9.2.lib;vtkFiltersGeometry-9.2.lib;vtkFiltersHybrid-9.2.lib;vtkFiltersHyperTree-9.2.lib;vtkFiltersImaging-9.2.lib;vtkFiltersModeling-9.2.lib;vtkFiltersParallel-9.2.lib;vtkFiltersParallelImaging-9.2.lib;vtkFiltersPoints-9.2.lib;vtkFiltersProgrammable-9.2.lib;vtkFiltersSelection-9.2.lib;vtkFiltersSMP-9.2.lib;vtkFiltersSources-9.2.lib;vtkFiltersStatistics-9.2.lib;vtkFiltersTexture-9.2.lib;vtkFiltersTopology-9.2.lib;vtkFiltersVerdict-9.2.lib;vtkfmt-9.2.lib;vtkfreetype-9.2.lib;vtkGeovisCore-9.2.lib;vtkgl2ps-9.2.lib;vtkglew-9.2.lib;vtkhdf5_hl-9.2.lib;vtkhdf5-9.2.lib;vtkImagingColor-9.2.lib;vtkImagingCore-9.2.lib;vtkImagingFourier-9.2.lib;vtkImagingGeneral-9.2.lib;vtkImagingHybrid-9.2.lib;vtkImagingMath-9.2.lib;vtkImagingMorphological-9.2.lib;vtkImagingSources-9.2.lib;vtkImagingStatistics-9.2.lib;vtkImagingStencil-9.2.lib;vtkInfovisCore-9.2.lib;vtkInfovisLayout-9.2.lib;vtkInteractionImage-9.2.lib;vtkInteractionStyle-9.2.lib;vtkInteractionWidgets-9.2.lib;vtkIOAMR-9.2.lib;vtkIOAsynchronous-9.2.lib;vtkIOCesium3DTiles-9.2.lib;vtkIOCGNSReader-9.2.lib;vtkIOChemistry-9.2.lib;vtkIOCityGML-9.2.lib;vtkIOCONVERGECFD-9.2.lib;vtkIOCore-9.2.lib;vtkIOEnSight-9.2.lib;vtkIOExodus-9.2.lib;vtkIOExport-9.2.lib;vtkIOExportGL2PS-9.2.lib;vtkIOExportPDF-9.2.lib;vtkIOGeometry-9.2.lib;vtkIOHDF-9.2.lib;vtkIOImage-9.2.lib;vtkIOImport-9.2.lib;vtkIOInfovis-9.2.lib;vtkIOIOSS-9.2.lib;vtkIOLegacy-9.2.lib;vtkIOLSDyna-9.2.lib;vtkIOMINC-9.2.lib;vtkIOMotionFX-9.2.lib;vtkIOMovie-9.2.lib;vtkIONetCDF-9.2.lib;vtkIOOggTheora-9.2.lib;vtkIOParallel-9.2.lib;vtkIOParallelXML-9.2.lib;vtkIOPLY-9.2.lib;vtkIOSegY-9.2.lib;vtkIOSQL-9.2.lib;vtkioss-9.2.lib;vtkIOTecplotTable-9.2.lib;vtkIOVeraOut-9.2.lib;vtkIOVideo-9.2.lib;vtkIOXML-9.2.lib;vtkIOXMLParser-9.2.lib;vtkjpeg-9.2.lib;vtkjsoncpp-9.2.lib;vtkkissfft-9.2.lib;vtklibharu-9.2.lib;vtklibproj-9.2.lib;vtklibxml2-9.2.lib;vtkloguru-9.2.lib;vtklz4-9.2.lib;vtklzma-9.2.lib;vtkmetaio-9.2.lib;vtknetcdf-9.2.lib;vtkogg-9.2.lib;vtkParallelCore-9.2.lib;vtkParallelDIY-9.2.lib;vtkpng-9.2.lib;vtkpugixml-9.2.lib;vtkRenderingAnnotation-9.2.lib;vtkRenderingContext2D-9.2.lib;vtkRenderingContextOpenGL2-9.2.lib;vtkRenderingCore-9.2.lib;vtkRenderingFreeType-9.2.lib;vtkRenderingGL2PSOpenGL2-9.2.lib;vtkRenderingHyperTreeGrid-9.2.lib;vtkRenderingImage-9.2.lib;vtkRenderingLabel-9.2.lib;vtkRenderingLICOpenGL2-9.2.lib;vtkRenderingLOD-9.2.lib;vtkRenderingOpenGL2-9.2.lib;vtkRenderingSceneGraph-9.2.lib;vtkRenderingUI-9.2.lib;vtkRenderingVolume-9.2.lib;vtkRenderingVolumeOpenGL2-9.2.lib;vtkRenderingVtkJS-9.2.lib;vtksqlite-9.2.lib;vtksys-9.2.lib;vtkTestingRendering-9.2.lib;vtktheora-9.2.lib;vtktiff-9.2.lib;vtkverdict-9.2.lib;vtkViewsContext2D-9.2.lib;vtkViewsCore-9.2.lib;vtkViewsInfovis-9.2.lib;vtkWrappingTools-9.2.lib;vtkzlib-9.2.lib;%(AdditionalDependencies) + cusparse.lib;cusolver.lib;cublas.lib;cudart.lib;amd.lib;arpack.lib;metis.lib;mumps_c.lib;mumps_f.lib;feast.lib;superlu.lib;libhdf5.lib;libhdf5_hl.lib;opengl32.lib;wsock32.lib;psapi.lib;dbghelp.lib;vtkcgns-9.2.lib;vtkChartsCore-9.2.lib;vtkCommonColor-9.2.lib;vtkCommonComputationalGeometry-9.2.lib;vtkCommonCore-9.2.lib;vtkCommonDataModel-9.2.lib;vtkCommonExecutionModel-9.2.lib;vtkCommonMath-9.2.lib;vtkCommonMisc-9.2.lib;vtkCommonSystem-9.2.lib;vtkCommonTransforms-9.2.lib;vtkDICOMParser-9.2.lib;vtkDomainsChemistry-9.2.lib;vtkDomainsChemistryOpenGL2-9.2.lib;vtkdoubleconversion-9.2.lib;vtkexodusII-9.2.lib;vtkexpat-9.2.lib;vtkFiltersAMR-9.2.lib;vtkFiltersCore-9.2.lib;vtkFiltersExtraction-9.2.lib;vtkFiltersFlowPaths-9.2.lib;vtkFiltersGeneral-9.2.lib;vtkFiltersGeneric-9.2.lib;vtkFiltersGeometry-9.2.lib;vtkFiltersHybrid-9.2.lib;vtkFiltersHyperTree-9.2.lib;vtkFiltersImaging-9.2.lib;vtkFiltersModeling-9.2.lib;vtkFiltersParallel-9.2.lib;vtkFiltersParallelImaging-9.2.lib;vtkFiltersPoints-9.2.lib;vtkFiltersProgrammable-9.2.lib;vtkFiltersSelection-9.2.lib;vtkFiltersSMP-9.2.lib;vtkFiltersSources-9.2.lib;vtkFiltersStatistics-9.2.lib;vtkFiltersTexture-9.2.lib;vtkFiltersTopology-9.2.lib;vtkFiltersVerdict-9.2.lib;vtkfmt-9.2.lib;vtkfreetype-9.2.lib;vtkGeovisCore-9.2.lib;vtkgl2ps-9.2.lib;vtkglew-9.2.lib;vtkhdf5_hl-9.2.lib;vtkhdf5-9.2.lib;vtkImagingColor-9.2.lib;vtkImagingCore-9.2.lib;vtkImagingFourier-9.2.lib;vtkImagingGeneral-9.2.lib;vtkImagingHybrid-9.2.lib;vtkImagingMath-9.2.lib;vtkImagingMorphological-9.2.lib;vtkImagingSources-9.2.lib;vtkImagingStatistics-9.2.lib;vtkImagingStencil-9.2.lib;vtkInfovisCore-9.2.lib;vtkInfovisLayout-9.2.lib;vtkInteractionImage-9.2.lib;vtkInteractionStyle-9.2.lib;vtkInteractionWidgets-9.2.lib;vtkIOAMR-9.2.lib;vtkIOAsynchronous-9.2.lib;vtkIOCesium3DTiles-9.2.lib;vtkIOCGNSReader-9.2.lib;vtkIOChemistry-9.2.lib;vtkIOCityGML-9.2.lib;vtkIOCONVERGECFD-9.2.lib;vtkIOCore-9.2.lib;vtkIOEnSight-9.2.lib;vtkIOExodus-9.2.lib;vtkIOExport-9.2.lib;vtkIOExportGL2PS-9.2.lib;vtkIOExportPDF-9.2.lib;vtkIOGeometry-9.2.lib;vtkIOHDF-9.2.lib;vtkIOImage-9.2.lib;vtkIOImport-9.2.lib;vtkIOInfovis-9.2.lib;vtkIOIOSS-9.2.lib;vtkIOLegacy-9.2.lib;vtkIOLSDyna-9.2.lib;vtkIOMINC-9.2.lib;vtkIOMotionFX-9.2.lib;vtkIOMovie-9.2.lib;vtkIONetCDF-9.2.lib;vtkIOOggTheora-9.2.lib;vtkIOParallel-9.2.lib;vtkIOParallelXML-9.2.lib;vtkIOPLY-9.2.lib;vtkIOSegY-9.2.lib;vtkIOSQL-9.2.lib;vtkioss-9.2.lib;vtkIOTecplotTable-9.2.lib;vtkIOVeraOut-9.2.lib;vtkIOVideo-9.2.lib;vtkIOXML-9.2.lib;vtkIOXMLParser-9.2.lib;vtkjpeg-9.2.lib;vtkjsoncpp-9.2.lib;vtkkissfft-9.2.lib;vtklibharu-9.2.lib;vtklibproj-9.2.lib;vtklibxml2-9.2.lib;vtkloguru-9.2.lib;vtklz4-9.2.lib;vtklzma-9.2.lib;vtkmetaio-9.2.lib;vtknetcdf-9.2.lib;vtkogg-9.2.lib;vtkParallelCore-9.2.lib;vtkParallelDIY-9.2.lib;vtkpng-9.2.lib;vtkpugixml-9.2.lib;vtkRenderingAnnotation-9.2.lib;vtkRenderingContext2D-9.2.lib;vtkRenderingContextOpenGL2-9.2.lib;vtkRenderingCore-9.2.lib;vtkRenderingFreeType-9.2.lib;vtkRenderingGL2PSOpenGL2-9.2.lib;vtkRenderingHyperTreeGrid-9.2.lib;vtkRenderingImage-9.2.lib;vtkRenderingLabel-9.2.lib;vtkRenderingLICOpenGL2-9.2.lib;vtkRenderingLOD-9.2.lib;vtkRenderingOpenGL2-9.2.lib;vtkRenderingSceneGraph-9.2.lib;vtkRenderingUI-9.2.lib;vtkRenderingVolume-9.2.lib;vtkRenderingVolumeOpenGL2-9.2.lib;vtkRenderingVtkJS-9.2.lib;vtksqlite-9.2.lib;vtksys-9.2.lib;vtkTestingRendering-9.2.lib;vtktheora-9.2.lib;vtktiff-9.2.lib;vtkverdict-9.2.lib;vtkViewsContext2D-9.2.lib;vtkViewsCore-9.2.lib;vtkViewsInfovis-9.2.lib;vtkWrappingTools-9.2.lib;vtkzlib-9.2.lib;%(AdditionalDependencies) @@ -128,6 +128,7 @@ + @@ -137,6 +138,7 @@ + @@ -293,6 +295,8 @@ + + @@ -450,15 +454,19 @@ + + + + @@ -487,6 +495,7 @@ + @@ -535,6 +544,7 @@ + @@ -544,6 +554,7 @@ + @@ -729,6 +740,8 @@ + + @@ -887,15 +900,19 @@ + + + + diff --git a/MSVC/suanPan/suanPan/suanPan.vcxproj.filters b/MSVC/suanPan/suanPan/suanPan.vcxproj.filters index f8ab5399f..94f30a660 100644 --- a/MSVC/suanPan/suanPan/suanPan.vcxproj.filters +++ b/MSVC/suanPan/suanPan/suanPan.vcxproj.filters @@ -1417,6 +1417,33 @@ Element\Modifier + + Solver\Integrator + + + Converger + + + Converger + + + Solver\Integrator + + + Solver\Integrator + + + Solver\Integrator + + + UnitTest + + + Material\Material1D\Elastic + + + Material\Material1D\Elastic + @@ -2704,6 +2731,30 @@ Toolbox + + Solver\Integrator + + + Converger + + + Converger + + + Solver\Integrator + + + Solver\Integrator + + + Solver\Integrator + + + Material\Material1D\Elastic + + + Material\Material1D\Elastic + diff --git a/MSVC/suanPan/superlu/superlu.vcxproj b/MSVC/suanPan/superlu/superlu.vcxproj index 4db1771f3..91a6b6b3c 100644 --- a/MSVC/suanPan/superlu/superlu.vcxproj +++ b/MSVC/suanPan/superlu/superlu.vcxproj @@ -21,7 +21,7 @@ StaticLibrary false - v142 + v143 true Unicode x64 @@ -29,7 +29,7 @@ StaticLibrary true - v142 + v143 Unicode x64 diff --git a/MSVC/suanPan/superlumt/superlumt.vcxproj b/MSVC/suanPan/superlumt/superlumt.vcxproj index 28e3342b3..31c566acd 100644 --- a/MSVC/suanPan/superlumt/superlumt.vcxproj +++ b/MSVC/suanPan/superlumt/superlumt.vcxproj @@ -21,7 +21,7 @@ StaticLibrary false - v142 + v143 true Unicode x64 @@ -29,7 +29,7 @@ StaticLibrary true - v142 + v143 Unicode x64 diff --git a/Material/Material1D/CMakeLists.txt b/Material/Material1D/CMakeLists.txt index 89fc835bd..3166a57cb 100644 --- a/Material/Material1D/CMakeLists.txt +++ b/Material/Material1D/CMakeLists.txt @@ -10,6 +10,8 @@ set(M1D Material1D/Elastic/Elastic1D.cpp Material1D/Elastic/MultilinearElastic1D.cpp Material1D/Elastic/PolyElastic1D.cpp + Material1D/Elastic/Sinh1D.cpp + Material1D/Elastic/Tanh1D.cpp Material1D/Hysteresis/AFC.cpp Material1D/Hysteresis/BilinearOO.cpp Material1D/Hysteresis/BilinearPO.cpp diff --git a/Material/Material1D/Elastic/Sinh1D.cpp b/Material/Material1D/Elastic/Sinh1D.cpp new file mode 100644 index 000000000..56308203e --- /dev/null +++ b/Material/Material1D/Elastic/Sinh1D.cpp @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ + +#include "Sinh1D.h" + +Sinh1D::Sinh1D(const unsigned T, const double E, const double R) + : DataSinh1D{E} + , Material1D(T, R) {} + +int Sinh1D::initialize(const shared_ptr&) { + trial_stiffness = current_stiffness = initial_stiffness = elastic_modulus; + + return SUANPAN_SUCCESS; +} + +unique_ptr Sinh1D::get_copy() { return make_unique(*this); } + +int Sinh1D::update_trial_status(const vec& t_strain) { + trial_stress = elastic_modulus * arma::sinh(trial_strain = t_strain); + trial_stiffness = elastic_modulus * arma::cosh(trial_strain); + return SUANPAN_SUCCESS; +} + +int Sinh1D::clear_status() { + current_strain = trial_strain.zeros(); + current_stress = trial_stress.zeros(); + current_stiffness = trial_stiffness = elastic_modulus; + return 0; +} + +int Sinh1D::commit_status() { + current_strain = trial_strain; + current_stress = trial_stress; + current_stiffness = trial_stiffness; + return 0; +} + +int Sinh1D::reset_status() { + trial_strain = current_strain; + trial_stress = current_stress; + trial_stiffness = current_stiffness; + return 0; +} + +void Sinh1D::print() { + suanpan_info("A 1D nonlinear elastic material using sinh function with an elastic modulus of %.4E.\n", elastic_modulus); + Material1D::print(); +} diff --git a/Material/Material1D/Elastic/Sinh1D.h b/Material/Material1D/Elastic/Sinh1D.h new file mode 100644 index 000000000..7b3478374 --- /dev/null +++ b/Material/Material1D/Elastic/Sinh1D.h @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ +/** + * @class Sinh1D + * @brief A 1D Elastic class. + * @author tlc + * @date 12/12/2022 + * @file Sinh1D.h + * @addtogroup Material-1D + * @{ + */ + +#ifndef SINH1D_H +#define SINH1D_H + +#include + +struct DataSinh1D { + const double elastic_modulus; // elastic modulus +}; + +class Sinh1D final : DataSinh1D, public Material1D { +public: + Sinh1D(unsigned, // tag + double, // elastic modulus + double = 0. // density + ); + + int initialize(const shared_ptr&) override; + + unique_ptr get_copy() override; + + int update_trial_status(const vec&) override; + + int clear_status() override; + int commit_status() override; + int reset_status() override; + + void print() override; +}; + +#endif + +//! @} diff --git a/Material/Material1D/Elastic/Tanh1D.cpp b/Material/Material1D/Elastic/Tanh1D.cpp new file mode 100644 index 000000000..33c8f1175 --- /dev/null +++ b/Material/Material1D/Elastic/Tanh1D.cpp @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ + +#include "Tanh1D.h" + +Tanh1D::Tanh1D(const unsigned T, const double E, const double R) + : DataTanh1D{E} + , Material1D(T, R) {} + +int Tanh1D::initialize(const shared_ptr&) { + trial_stiffness = current_stiffness = initial_stiffness = elastic_modulus; + + return SUANPAN_SUCCESS; +} + +unique_ptr Tanh1D::get_copy() { return make_unique(*this); } + +int Tanh1D::update_trial_status(const vec& t_strain) { + trial_stress = elastic_modulus * arma::tanh(trial_strain = t_strain); + trial_stiffness = elastic_modulus * arma::pow(arma::cosh(trial_strain), -2.); + return SUANPAN_SUCCESS; +} + +int Tanh1D::clear_status() { + current_strain = trial_strain.zeros(); + current_stress = trial_stress.zeros(); + current_stiffness = trial_stiffness = elastic_modulus; + return 0; +} + +int Tanh1D::commit_status() { + current_strain = trial_strain; + current_stress = trial_stress; + current_stiffness = trial_stiffness; + return 0; +} + +int Tanh1D::reset_status() { + trial_strain = current_strain; + trial_stress = current_stress; + trial_stiffness = current_stiffness; + return 0; +} + +void Tanh1D::print() { + suanpan_info("A 1D nonlinear elastic material using tanh function with an elastic modulus of %.4E.\n", elastic_modulus); + Material1D::print(); +} diff --git a/Material/Material1D/Elastic/Tanh1D.h b/Material/Material1D/Elastic/Tanh1D.h new file mode 100644 index 000000000..8d1f7d893 --- /dev/null +++ b/Material/Material1D/Elastic/Tanh1D.h @@ -0,0 +1,58 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ +/** + * @class Tanh1D + * @brief A 1D Elastic class. + * @author tlc + * @date 12/12/2022 + * @file Tanh1D.h + * @addtogroup Material-1D + * @{ + */ + +#ifndef Tanh1D_H +#define Tanh1D_H + +#include + +struct DataTanh1D { + const double elastic_modulus; // elastic modulus +}; + +class Tanh1D final : DataTanh1D, public Material1D { +public: + Tanh1D(unsigned, // tag + double, // elastic modulus + double = 0. // density + ); + + int initialize(const shared_ptr&) override; + + unique_ptr get_copy() override; + + int update_trial_status(const vec&) override; + + int clear_status() override; + int commit_status() override; + int reset_status() override; + + void print() override; +}; + +#endif + +//! @} diff --git a/Material/Material1D/Material1D b/Material/Material1D/Material1D index a0e49f9f5..c84a0be83 100644 --- a/Material/Material1D/Material1D +++ b/Material/Material1D/Material1D @@ -9,11 +9,13 @@ #include "Elastic/Elastic1D.h" #include "Elastic/MultilinearElastic1D.h" #include "Elastic/PolyElastic1D.h" +#include "Elastic/Sinh1D.h" +#include "Elastic/Tanh1D.h" #include "Hysteresis/AFC.h" -#include "Hysteresis/BWBN.h" #include "Hysteresis/BilinearOO.h" #include "Hysteresis/BilinearPO.h" #include "Hysteresis/BoucWen.h" +#include "Hysteresis/BWBN.h" #include "Hysteresis/CoulombFriction.h" #include "Hysteresis/Flag.h" #include "Hysteresis/Gap01.h" @@ -34,9 +36,6 @@ #include "Viscosity/NonlinearViscosity.h" #include "Viscosity/Viscosity01.h" #include "Viscosity/Viscosity02.h" -#include "Wrapper/Parallel.h" -#include "Wrapper/Sequential.h" -#include "Wrapper/Uniaxial.h" #include "vonMises/ArmstrongFrederick1D.h" #include "vonMises/Bilinear1D.h" #include "vonMises/BilinearMises1D.h" @@ -45,4 +44,7 @@ #include "vonMises/MultilinearMises1D.h" #include "vonMises/NonlinearGurson1D.h" #include "vonMises/NonlinearMises1D.h" -#include "vonMises/VAFCRP1D.h" \ No newline at end of file +#include "vonMises/VAFCRP1D.h" +#include "Wrapper/Parallel.h" +#include "Wrapper/Sequential.h" +#include "Wrapper/Uniaxial.h" \ No newline at end of file diff --git a/Material/Material1D/Viscosity/Maxwell.cpp b/Material/Material1D/Viscosity/Maxwell.cpp index d94541b7a..db4d013fb 100644 --- a/Material/Material1D/Viscosity/Maxwell.cpp +++ b/Material/Material1D/Viscosity/Maxwell.cpp @@ -17,7 +17,7 @@ #include "Maxwell.h" #include -#include +#include #include Maxwell::Maxwell(const unsigned T, const unsigned DT, const unsigned ST, const bool UM, const unsigned PC, const double BT) @@ -45,7 +45,7 @@ int Maxwell::initialize(const shared_ptr& D) { if(nullptr == damper || nullptr == spring) return SUANPAN_FAIL; - incre_time = &D->get_factory()->get_incre_time(); + incre_time = &get_incre_time(D->get_factory()); trial_strain_rate = current_strain_rate = incre_strain_rate.zeros(1); diff --git a/Material/Material1D/vonMises/ArmstrongFrederick1D.cpp b/Material/Material1D/vonMises/ArmstrongFrederick1D.cpp index 528d12659..4ce958534 100644 --- a/Material/Material1D/vonMises/ArmstrongFrederick1D.cpp +++ b/Material/Material1D/vonMises/ArmstrongFrederick1D.cpp @@ -131,12 +131,9 @@ int ArmstrongFrederick1D::reset_status() { } vector ArmstrongFrederick1D::record(const OutputType P) { - vector data; + if(P == OutputType::PEEQ) return {vec{current_history(size)}}; - if(P == OutputType::PEEQ) data.emplace_back(vec{current_history(size)}); - else return Material1D::record(P); - - return data; + return Material1D::record(P); } void ArmstrongFrederick1D::print() { diff --git a/Material/Material1D/vonMises/NonlinearGurson1D.cpp b/Material/Material1D/vonMises/NonlinearGurson1D.cpp index 0ebf315b0..7bb0f1710 100644 --- a/Material/Material1D/vonMises/NonlinearGurson1D.cpp +++ b/Material/Material1D/vonMises/NonlinearGurson1D.cpp @@ -157,21 +157,9 @@ int NonlinearGurson1D::reset_status() { } vector NonlinearGurson1D::record(const OutputType P) { - if(P == OutputType::PEEQ) { - vector data; - data.emplace_back(vec{current_history(0)}); - return data; - } - if(P == OutputType::VF) { - vector data; - data.emplace_back(vec{current_history(1)}); - return data; - } - if(P == OutputType::PE) { - vector data; - data.emplace_back(current_strain - current_stress / elastic_modulus); - return data; - } + if(P == OutputType::PEEQ) return {vec{current_history(0)}}; + if(P == OutputType::VF) return {vec{current_history(1)}}; + if(P == OutputType::PE) return {vec{current_strain - current_stress / elastic_modulus}}; return Material1D::record(P); } diff --git a/Material/Material1D/vonMises/VAFCRP1D.cpp b/Material/Material1D/vonMises/VAFCRP1D.cpp index 451970832..baa44c52e 100644 --- a/Material/Material1D/vonMises/VAFCRP1D.cpp +++ b/Material/Material1D/vonMises/VAFCRP1D.cpp @@ -17,7 +17,7 @@ #include "VAFCRP1D.h" #include -#include +#include #include constexpr double VAFCRP1D::unit_time = 1.; @@ -27,7 +27,7 @@ VAFCRP1D::VAFCRP1D(const unsigned T, const double E, const double Y, const doubl , Material1D(T, R) { access::rw(tolerance) = 1E-15; } int VAFCRP1D::initialize(const shared_ptr& D) { - incre_time = D == nullptr ? &unit_time : &D->get_factory()->get_incre_time(); + incre_time = D == nullptr ? &unit_time : &get_incre_time(D->get_factory()); trial_stiffness = current_stiffness = initial_stiffness = elastic_modulus; @@ -133,12 +133,9 @@ int VAFCRP1D::reset_status() { } vector VAFCRP1D::record(const OutputType P) { - vector data; + if(P == OutputType::PEEQ) return {vec{current_history(size)}}; - if(P == OutputType::PEEQ) data.emplace_back(vec{current_history(size)}); - else return Material1D::record(P); - - return data; + return Material1D::record(P); } void VAFCRP1D::print() { diff --git a/Material/Material2D/Bilinear2D.cpp b/Material/Material2D/Bilinear2D.cpp index 0ed053ae5..302c43739 100644 --- a/Material/Material2D/Bilinear2D.cpp +++ b/Material/Material2D/Bilinear2D.cpp @@ -122,12 +122,9 @@ void Bilinear2D::print() { } vector Bilinear2D::record(const OutputType P) { - vector output; - output.reserve(1); - - if(P == OutputType::PE) output.emplace_back(current_strain - solve(initial_stiffness, current_stress)); - else if(P == OutputType::PEP) output.emplace_back(transform::strain::principal(current_strain - solve(initial_stiffness, current_stress))); - else if(P == OutputType::MISES) { + if(P == OutputType::PE) return {vec{current_strain - solve(initial_stiffness, current_stress)}}; + if(P == OutputType::PEP) return {transform::strain::principal(current_strain - solve(initial_stiffness, current_stress))}; + if(P == OutputType::MISES) { vec trial_mises(1); if(plane_type == PlaneType::S) trial_mises(0) = sqrt(current_stress(0) * current_stress(0) - current_stress(0) * current_stress(1) + current_stress(1) * current_stress(1) + 3. * current_stress(2) * current_stress(2)); else if(plane_type == PlaneType::E) { @@ -138,11 +135,11 @@ vector Bilinear2D::record(const OutputType P) { const auto tmp_c = sigma_33 - sigma_mean; trial_mises(0) = sqrt(1.5 * (tmp_a * tmp_a + tmp_b * tmp_b + tmp_c * tmp_c + 2. * current_stress(2) * current_stress(2))); } - output.emplace_back(trial_mises); + + return {trial_mises}; } - else if(P == OutputType::EEEQ) output.emplace_back(vec{sqrt(2. / 3.) * tensor::strain::norm(current_full_strain)}); - else if(P == OutputType::PEEQ) return base.record(P); - else return Material2D::record(P); + if(P == OutputType::EEEQ) return {vec{sqrt(2. / 3.) * tensor::strain::norm(current_full_strain)}}; + if(P == OutputType::PEEQ) return base.record(P); - return output; + return Material2D::record(P); } diff --git a/Material/Material2D/Elastic/Elastic2D.cpp b/Material/Material2D/Elastic/Elastic2D.cpp index 8ec727169..d9cc36ea8 100644 --- a/Material/Material2D/Elastic/Elastic2D.cpp +++ b/Material/Material2D/Elastic/Elastic2D.cpp @@ -95,10 +95,9 @@ void Elastic2D::print() { } vector Elastic2D::record(const OutputType P) { - vector output; - output.reserve(1); + const auto sigma_33 = elastic_modulus * poissons_ratio / (1. + poissons_ratio) / (1. - 2. * poissons_ratio) * (trial_strain(0) + trial_strain(1)); - if(const auto sigma_33 = elastic_modulus * poissons_ratio / (1. + poissons_ratio) / (1. - 2. * poissons_ratio) * (trial_strain(0) + trial_strain(1)); P == OutputType::MISES) { + if(P == OutputType::MISES) { vec trial_mises(1); if(plane_type == PlaneType::S) trial_mises(0) = sqrt(current_stress(0) * current_stress(0) - current_stress(0) * current_stress(1) + current_stress(1) * current_stress(1) + 3. * current_stress(2) * current_stress(2)); else if(plane_type == PlaneType::E) { @@ -108,9 +107,10 @@ vector Elastic2D::record(const OutputType P) { const auto tmp_c = sigma_33 - sigma_mean; trial_mises(0) = sqrt(1.5 * (tmp_a * tmp_a + tmp_b * tmp_b + tmp_c * tmp_c + 2. * current_stress(2) * current_stress(2))); } - output.emplace_back(trial_mises); + + return {trial_mises}; } - else if(P == OutputType::S) { + if(P == OutputType::S) { vec trail_sigma(4); trail_sigma(0) = trial_stress(0); @@ -118,10 +118,9 @@ vector Elastic2D::record(const OutputType P) { trail_sigma(3) = trial_stress(2); trail_sigma(2) = plane_type == PlaneType::S ? 0. : sigma_33; - output.emplace_back(trail_sigma); + return {trail_sigma}; } - else if(P == OutputType::SP) output.emplace_back(transform::stress::principal(trial_stress)); - else return Material2D::record(P); + if(P == OutputType::SP) return {transform::stress::principal(trial_stress)}; - return output; + return Material2D::record(P); } diff --git a/Material/Material3D/Concrete/CDPM2.cpp b/Material/Material3D/Concrete/CDPM2.cpp index 5ca819531..1c3616c9d 100644 --- a/Material/Material3D/Concrete/CDPM2.cpp +++ b/Material/Material3D/Concrete/CDPM2.cpp @@ -557,14 +557,11 @@ int CDPM2::reset_status() { } vector CDPM2::record(const OutputType T) { - vector data; + if(T == OutputType::KAPPAP) return {vec{current_history(0)}}; + if(T == OutputType::DT) return {vec{current_history(16)}}; + if(T == OutputType::DC) return {vec{current_history(17)}}; - if(T == OutputType::KAPPAP) data.emplace_back(vec{current_history(0)}); - else if(T == OutputType::DT) data.emplace_back(vec{current_history(16)}); - else if(T == OutputType::DC) data.emplace_back(vec{current_history(17)}); - else return Material3D::record(T); - - return data; + return Material3D::record(T); } void CDPM2::print() { suanpan_info("A concrete damage plasticity model based on the CDPM2 model. doi: 10.1016/j.ijsolstr.2013.07.008\n"); } diff --git a/Material/Material3D/Concrete/NonlinearCDP.cpp b/Material/Material3D/Concrete/NonlinearCDP.cpp index 42a4a3ba6..161408ded 100644 --- a/Material/Material3D/Concrete/NonlinearCDP.cpp +++ b/Material/Material3D/Concrete/NonlinearCDP.cpp @@ -248,15 +248,12 @@ int NonlinearCDP::reset_status() { } vector NonlinearCDP::record(const OutputType T) { - vector data; + if(T == OutputType::DT) return {vec{current_history(0)}}; + if(T == OutputType::DC) return {vec{current_history(1)}}; + if(T == OutputType::KAPPAT) return {vec{current_history(2)}}; + if(T == OutputType::KAPPAC) return {vec{current_history(3)}}; - if(T == OutputType::DT) data.emplace_back(vec{current_history(0)}); - else if(T == OutputType::DC) data.emplace_back(vec{current_history(1)}); - else if(T == OutputType::KAPPAT) data.emplace_back(vec{current_history(2)}); - else if(T == OutputType::KAPPAC) data.emplace_back(vec{current_history(3)}); - else return Material3D::record(T); - - return data; + return Material3D::record(T); } void NonlinearCDP::print() { suanpan_info("A concrete damage plasticity model.\n"); } diff --git a/Material/Material3D/vonMises/ArmstrongFrederick.cpp b/Material/Material3D/vonMises/ArmstrongFrederick.cpp index 0c674d950..18eb4203a 100644 --- a/Material/Material3D/vonMises/ArmstrongFrederick.cpp +++ b/Material/Material3D/vonMises/ArmstrongFrederick.cpp @@ -147,12 +147,9 @@ int ArmstrongFrederick::reset_status() { } vector ArmstrongFrederick::record(const OutputType P) { - vector data; + if(P == OutputType::PEEQ) return {vec{current_history(0)}}; - if(P == OutputType::PEEQ) data.emplace_back(vec{current_history(0)}); - else return Material3D::record(P); - - return data; + return Material3D::record(P); } void ArmstrongFrederick::print() { suanpan_info("A 3D nonlinear hardening model using Armstrong--Frederick kinematic hardening rule.\n"); } diff --git a/Material/Material3D/vonMises/BilinearJ2.cpp b/Material/Material3D/vonMises/BilinearJ2.cpp index 1b1ab1ab8..f918a4d98 100644 --- a/Material/Material3D/vonMises/BilinearJ2.cpp +++ b/Material/Material3D/vonMises/BilinearJ2.cpp @@ -105,14 +105,11 @@ int BilinearJ2::reset_status() { } vector BilinearJ2::record(const OutputType P) { - vector data; + if(P == OutputType::MISES) return {vec{tensor::stress::norm(tensor::dev(current_stress)) / root_two_third}}; + if(P == OutputType::EEQ) return {vec{root_two_third * tensor::strain::norm(tensor::dev(current_strain))}}; + if(P == OutputType::PEEQ) return {vec{current_history(0)}}; - if(P == OutputType::MISES) data.emplace_back(vec{tensor::stress::norm(tensor::dev(current_stress)) / root_two_third}); - else if(P == OutputType::EEQ) data.emplace_back(vec{root_two_third * tensor::strain::norm(tensor::dev(current_strain))}); - else if(P == OutputType::PEEQ) data.emplace_back(vec{current_history(0)}); - else return Material3D::record(P); - - return data; + return Material3D::record(P); } void BilinearJ2::print() { suanpan_info("A 3D bilinear hardening model.\n"); } diff --git a/Material/Material3D/vonMises/NonlinearGurson.cpp b/Material/Material3D/vonMises/NonlinearGurson.cpp index 9172157fc..1a408150a 100644 --- a/Material/Material3D/vonMises/NonlinearGurson.cpp +++ b/Material/Material3D/vonMises/NonlinearGurson.cpp @@ -166,21 +166,9 @@ int NonlinearGurson::reset_status() { } vector NonlinearGurson::record(const OutputType P) { - if(P == OutputType::PEEQ) { - vector data; - data.emplace_back(vec{current_history(0)}); - return data; - } - if(P == OutputType::VF) { - vector data; - data.emplace_back(vec{current_history(1)}); - return data; - } - if(P == OutputType::PE) { - vector data; - data.emplace_back(current_strain - solve(initial_stiffness, current_stress)); - return data; - } + if(P == OutputType::PEEQ) return {vec{current_history(0)}}; + if(P == OutputType::VF) return {vec{current_history(1)}}; + if(P == OutputType::PE) return {vec{current_strain - solve(initial_stiffness, current_stress)}}; return Material3D::record(P); } diff --git a/Material/Material3D/vonMises/NonlinearJ2.cpp b/Material/Material3D/vonMises/NonlinearJ2.cpp index 5aeb6daa9..9441e391f 100644 --- a/Material/Material3D/vonMises/NonlinearJ2.cpp +++ b/Material/Material3D/vonMises/NonlinearJ2.cpp @@ -126,11 +126,7 @@ int NonlinearJ2::reset_status() { } vector NonlinearJ2::record(const OutputType P) { - if(P == OutputType::PEEQ) { - vector data; - data.emplace_back(vec{current_history(0)}); - return data; - } + if(P == OutputType::PEEQ) return {vec{current_history(0)}}; return Material3D::record(P); } diff --git a/Material/Material3D/vonMises/NonlinearPeric.cpp b/Material/Material3D/vonMises/NonlinearPeric.cpp index 68d842dbd..191fbf242 100644 --- a/Material/Material3D/vonMises/NonlinearPeric.cpp +++ b/Material/Material3D/vonMises/NonlinearPeric.cpp @@ -17,7 +17,7 @@ #include "NonlinearPeric.h" #include -#include +#include #include const double NonlinearPeric::root_three_two = sqrt(1.5); @@ -29,7 +29,7 @@ NonlinearPeric::NonlinearPeric(const unsigned T, const double E, const double V, , Material3D(T, R) {} int NonlinearPeric::initialize(const shared_ptr& D) { - incre_time = D == nullptr ? &unit_time : &D->get_factory()->get_incre_time(); + incre_time = D == nullptr ? &unit_time : &get_incre_time(D->get_factory()); trial_stiffness = current_stiffness = initial_stiffness = tensor::isotropic_stiffness(elastic_modulus, poissons_ratio); diff --git a/Material/Material3D/vonMises/VAFCRP.cpp b/Material/Material3D/vonMises/VAFCRP.cpp index 4720b72fc..fa7e279bf 100644 --- a/Material/Material3D/vonMises/VAFCRP.cpp +++ b/Material/Material3D/vonMises/VAFCRP.cpp @@ -17,7 +17,7 @@ #include "VAFCRP.h" #include -#include +#include #include #include @@ -29,7 +29,7 @@ VAFCRP::VAFCRP(const unsigned T, const double E, const double V, const double Y, , Material3D(T, R) { access::rw(tolerance) = 1E-15; } int VAFCRP::initialize(const shared_ptr& D) { - incre_time = &D->get_factory()->get_incre_time(); + incre_time = &get_incre_time(D->get_factory()); trial_stiffness = current_stiffness = initial_stiffness = tensor::isotropic_stiffness(elastic_modulus, poissons_ratio); @@ -148,12 +148,9 @@ int VAFCRP::reset_status() { } vector VAFCRP::record(const OutputType P) { - vector data; + if(P == OutputType::PEEQ) return {vec{current_history(0)}}; - if(P == OutputType::PEEQ) data.emplace_back(vec{current_history(0)}); - else return Material3D::record(P); - - return data; + return Material3D::record(P); } void VAFCRP::print() { suanpan_info("The VADCRP model.\n"); } diff --git a/Material/MaterialParser.cpp b/Material/MaterialParser.cpp index f724ba349..29da06bb1 100644 --- a/Material/MaterialParser.cpp +++ b/Material/MaterialParser.cpp @@ -1133,6 +1133,52 @@ void new_dhakal(unique_ptr& return_obj, istringstream& command) { return_obj = make_unique(tag, mat_tag, y_strain, parameter); } +void new_sinh1d(unique_ptr& return_obj, istringstream& command) { + unsigned tag; + if(!get_input(command, tag)) { + suanpan_error("new_sinh1d() requires a valid tag.\n"); + return; + } + + double elastic_modulus; + if(!get_input(command, elastic_modulus)) { + suanpan_error("new_sinh1d() requires a valid elastic modulus.\n"); + return; + } + + auto density = 0.; + if(command.eof()) suanpan_debug("new_sinh1d() assumes zero density.\n"); + else if(!get_input(command, density)) { + suanpan_error("new_sinh1d() requires a valid density.\n"); + return; + } + + return_obj = make_unique(tag, elastic_modulus, density); +} + +void new_tanh1d(unique_ptr& return_obj, istringstream& command) { + unsigned tag; + if(!get_input(command, tag)) { + suanpan_error("new_tanh1d() requires a valid tag.\n"); + return; + } + + double elastic_modulus; + if(!get_input(command, elastic_modulus)) { + suanpan_error("new_tanh1d() requires a valid elastic modulus.\n"); + return; + } + + auto density = 0.; + if(command.eof()) suanpan_debug("new_tanh1d() assumes zero density.\n"); + else if(!get_input(command, density)) { + suanpan_error("new_tanh1d() requires a valid density.\n"); + return; + } + + return_obj = make_unique(tag, elastic_modulus, density); +} + void new_elastic1d(unique_ptr& return_obj, istringstream& command) { unsigned tag; if(!get_input(command, tag)) { @@ -3312,6 +3358,8 @@ int create_new_material(const shared_ptr& domain, istringstream& com else if(is_equal(material_id, "CoulombFriction")) new_coulombfriction(new_material, command); else if(is_equal(material_id, "Dhakal")) new_dhakal(new_material, command); else if(is_equal(material_id, "DafaliasManzari")) new_dafaliasmanzari(new_material, command); + else if(is_equal(material_id, "Sinh1D")) new_sinh1d(new_material, command); + else if(is_equal(material_id, "Tanh1D")) new_tanh1d(new_material, command); else if(is_equal(material_id, "Elastic1D")) new_elastic1d(new_material, command); else if(is_equal(material_id, "Elastic2D")) new_elastic2d(new_material, command); else if(is_equal(material_id, "Elastic3D")) new_isotropicelastic3d(new_material, command); diff --git a/Option.cmake b/Option.cmake index 18686deb9..4948d41f3 100644 --- a/Option.cmake +++ b/Option.cmake @@ -138,12 +138,19 @@ endif () if (USE_HDF5) add_compile_definitions(SUANPAN_HDF5) - include_directories(Include/hdf5) - include_directories(Include/hdf5-${SP_EXTERNAL_LIB_PATH}) - if (COMPILER_IDENTIFIER MATCHES "vs") - link_libraries(libhdf5_hl libhdf5) + if (HAVE_VTK) + string(REGEX REPLACE "/lib/cmake/vtk" "/include/vtk" VTK_INCLUDE ${VTK_DIR}) + include_directories(${VTK_INCLUDE}/vtkhdf5) + include_directories(${VTK_INCLUDE}/vtkhdf5/src) + include_directories(${VTK_INCLUDE}/vtkhdf5/hl/src) else () - link_libraries(hdf5_hl hdf5) + include_directories(Include/hdf5) + include_directories(Include/hdf5-${SP_EXTERNAL_LIB_PATH}) + if (COMPILER_IDENTIFIER MATCHES "vs") + link_libraries(libhdf5_hl libhdf5) + else () + link_libraries(hdf5_hl hdf5) + endif () endif () else () add_compile_definitions(ARMA_DONT_USE_HDF5) diff --git a/README.md b/README.md index d3bfc1687..18a96f5f3 100644 --- a/README.md +++ b/README.md @@ -109,13 +109,33 @@ It is also possible to use [Scoop](https://scoop.sh/) to install the package. ### Linux -Linux's users are recommended to obtain the binaries via snap. The snap supports visualization via VTK and uses Intel -MKL for linear algebra. +Linux's users are recommended to obtain the binaries via snap or flatpak. + +#### Snap + +The snap supports visualization via VTK and uses Intel MKL for linear algebra. [![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/suanpan) [![asciicast](https://asciinema.org/a/491330.svg)](https://asciinema.org/a/491330) +#### Flatpak + +Flatpak is also available if preferred. + +Download on Flathub + +```bash +# add repo +flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo +# install +flatpak install flathub io.github.tlcfem.suanPan +# define alias +echo "alias suanpan=\"flatpak run io.github.tlcfem.suanPan\"" >> ~/.bashrc +``` + +#### Installation Packages + Alternatively, download the RPM (Fedora 35) or DEB (Ubuntu 22.04) package from the release page. The packages may not be compatible with older distributions (due to different version of `libstdc++`). It is also possible to compile the package via docker, check the dockerfiles under the `Script` folder, for any questions please open an issue. @@ -173,7 +193,7 @@ to `~/.local/share/applications`. Additional libraries used in **suanPan** are listed as follows. -- [**ARPACK**](https://www.caam.rice.edu/software/ARPACK/) version 0.96 +- [**ARPACK**](https://github.com/opencollab/arpack-ng) - [**SPIKE**](http://www.spike-solver.org/) version 1.0 - [**FEAST**](http://www.feast-solver.org/) version 4.0 - [**SuperLU**](https://portal.nersc.gov/project/sparse/superlu/) version 5.3.0 and [**SuperLU MT**](https://portal.nersc.gov/project/sparse/superlu/) version 3.1 @@ -184,10 +204,10 @@ Additional libraries used in **suanPan** are listed as follows. - [**METIS**](http://glaros.dtc.umn.edu/gkhome/metis/metis/overview) version 5.1.0 - [**VTK**](https://vtk.org/) version 9.2.2 - [**CUDA**](https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/) version 11.7 -- [**Armadillo**](http://arma.sourceforge.net/) version 11.0 +- [**Armadillo**](http://arma.sourceforge.net/) version 11.4 - [**ensmallen**](https://ensmallen.org/) version 2.19.0 -- [**oneMKL**](https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/onemkl.html) version 2022.2.0 -- [**Catch2**](https://github.com/catchorg/Catch2) version 2.13.9 +- [**oneMKL**](https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/onemkl.html) version 2023.0.0 +- [**Catch2**](https://github.com/catchorg/Catch2) version 2.13.10 - **thread_pool** abridged version of [`thread-pool`](https://github.com/bshoshany/thread-pool) Those libraries may depend on other libraries such as [zlib](https://zlib.net/) diff --git a/Recorder/AmplitudeRecorder.cpp b/Recorder/AmplitudeRecorder.cpp index 174b779ee..0ddf7a18a 100644 --- a/Recorder/AmplitudeRecorder.cpp +++ b/Recorder/AmplitudeRecorder.cpp @@ -29,11 +29,9 @@ void AmplitudeRecorder::initialize(const shared_ptr& D) { } void AmplitudeRecorder::record(const shared_ptr& D) { - if(1 != interval && counter++ != interval) return; + if(!if_perform_record()) return; - counter = 1; - - auto& current_time = D->get_factory()->get_current_time(); + const sp_d auto current_time = D->get_factory()->get_current_time(); auto& obj_tag = get_object_tag(); for(unsigned I = 0; I < obj_tag.n_elem; ++I) insert({{D->get(obj_tag(I))->get_amplitude(current_time)}}, I); diff --git a/Recorder/EigenRecorder.cpp b/Recorder/EigenRecorder.cpp index 4de8eaf48..d76c1bbe3 100644 --- a/Recorder/EigenRecorder.cpp +++ b/Recorder/EigenRecorder.cpp @@ -21,8 +21,8 @@ #include #ifdef SUANPAN_HDF5 -#include -#include +#include +#include #endif extern fs::path SUANPAN_OUTPUT; diff --git a/Recorder/ElementRecorder.cpp b/Recorder/ElementRecorder.cpp index 796c980ad..f9271509e 100644 --- a/Recorder/ElementRecorder.cpp +++ b/Recorder/ElementRecorder.cpp @@ -29,9 +29,7 @@ void ElementRecorder::initialize(const shared_ptr& D) { } void ElementRecorder::record(const shared_ptr& D) { - if(1 != interval && counter++ != interval) return; - - counter = 1; + if(!if_perform_record()) return; auto& obj_tag = get_object_tag(); diff --git a/Recorder/FrameRecorder.cpp b/Recorder/FrameRecorder.cpp index ff8d03ccd..52c9ff134 100644 --- a/Recorder/FrameRecorder.cpp +++ b/Recorder/FrameRecorder.cpp @@ -21,8 +21,8 @@ #include #ifdef SUANPAN_HDF5 -#include -#include +#include +#include #endif extern fs::path SUANPAN_OUTPUT; @@ -44,30 +44,28 @@ FrameRecorder::~FrameRecorder() { void FrameRecorder::record([[maybe_unused]] const shared_ptr& D) { #ifdef SUANPAN_HDF5 - if(1 == interval || counter++ == interval) { - counter = 1; + if(!if_perform_record()) return; - ostringstream group_name; - group_name << "/"; - group_name << D->get_factory()->get_current_time(); + ostringstream group_name; + group_name << "/"; + group_name << D->get_factory()->get_current_time(); - const auto group_id = H5Gcreate(file_id, group_name.str().c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + const auto group_id = H5Gcreate(file_id, group_name.str().c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - for(const auto& I : D->get_element_pool()) { - if(const auto data = I->record(get_variable_type()); !data.empty()) { - mat data_to_write(data[0].n_elem, data.size()); + for(const auto& I : D->get_element_pool()) { + if(const auto data = I->record(get_variable_type()); !data.empty()) { + mat data_to_write(data[0].n_elem, data.size()); - uword idx = 0; - for(const auto& J : data) data_to_write.col(idx++) = J; + uword idx = 0; + for(const auto& J : data) data_to_write.col(idx++) = J; - const hsize_t dimension[2] = {data_to_write.n_cols, data_to_write.n_rows}; + const hsize_t dimension[2] = {data_to_write.n_cols, data_to_write.n_rows}; - H5LTmake_dataset(group_id, std::to_string(I->get_tag()).c_str(), 2, dimension, H5T_NATIVE_DOUBLE, data_to_write.mem); - } + H5LTmake_dataset(group_id, std::to_string(I->get_tag()).c_str(), 2, dimension, H5T_NATIVE_DOUBLE, data_to_write.mem); } - - H5Gclose(group_id); } + + H5Gclose(group_id); #endif } diff --git a/Recorder/FrameRecorder.h b/Recorder/FrameRecorder.h index c51095da7..dab33283b 100644 --- a/Recorder/FrameRecorder.h +++ b/Recorder/FrameRecorder.h @@ -35,6 +35,7 @@ class FrameRecorder final : public Recorder { #ifdef SUANPAN_HDF5 hid_t file_id = 0; #endif + public: FrameRecorder(unsigned, // tag OutputType, // recorder type diff --git a/Recorder/GlobalMassRecorder.cpp b/Recorder/GlobalMassRecorder.cpp index e9163a47d..18b690d51 100644 --- a/Recorder/GlobalMassRecorder.cpp +++ b/Recorder/GlobalMassRecorder.cpp @@ -30,9 +30,7 @@ GlobalMassRecorder::GlobalMassRecorder(const unsigned T, const unsigned I, const : GlobalRecorder(T, OutputType::M, I, R, H) {} void GlobalMassRecorder::record(const shared_ptr& D) { - if(1 != interval && counter++ != interval) return; - - counter = 1; + if(!if_perform_record()) return; auto& W = D->get_factory(); auto& C = D->get_color_map(); diff --git a/Recorder/GlobalRecorder.cpp b/Recorder/GlobalRecorder.cpp index d42c7fa90..077252891 100644 --- a/Recorder/GlobalRecorder.cpp +++ b/Recorder/GlobalRecorder.cpp @@ -25,9 +25,7 @@ GlobalRecorder::GlobalRecorder(const unsigned T, const OutputType L, const unsig : Recorder(T, {0}, L, I, R, H) {} void GlobalRecorder::record(const shared_ptr& D) { - if(1 != interval && counter++ != interval) return; - - counter = 1; + if(!if_perform_record()) return; auto get_momentum_component = [&](const DOF C) { auto momentum = 0.; diff --git a/Recorder/GlobalStiffnessRecorder.cpp b/Recorder/GlobalStiffnessRecorder.cpp index 73ed1f12c..a5067d7c8 100644 --- a/Recorder/GlobalStiffnessRecorder.cpp +++ b/Recorder/GlobalStiffnessRecorder.cpp @@ -30,9 +30,7 @@ GlobalStiffnessRecorder::GlobalStiffnessRecorder(const unsigned T, const unsigne : GlobalRecorder(T, OutputType::K, I, R, H) {} void GlobalStiffnessRecorder::record(const shared_ptr& D) { - if(1 != interval && counter++ != interval) return; - - counter = 1; + if(!if_perform_record()) return; auto& W = D->get_factory(); auto& C = D->get_color_map(); diff --git a/Recorder/NodeRecorder.cpp b/Recorder/NodeRecorder.cpp index 8e0c44312..b395b63cb 100644 --- a/Recorder/NodeRecorder.cpp +++ b/Recorder/NodeRecorder.cpp @@ -30,9 +30,7 @@ void NodeRecorder::initialize(const shared_ptr& D) { } void NodeRecorder::record(const shared_ptr& D) { - if(1 != interval && counter++ != interval) return; - - counter = 1; + if(!if_perform_record()) return; auto& obj_tag = get_object_tag(); diff --git a/Recorder/Recorder.cpp b/Recorder/Recorder.cpp index 1a1fb1811..447235fd7 100644 --- a/Recorder/Recorder.cpp +++ b/Recorder/Recorder.cpp @@ -20,8 +20,8 @@ extern fs::path SUANPAN_OUTPUT; #ifdef SUANPAN_HDF5 -#include -#include +#include +#include #endif /** @@ -58,6 +58,8 @@ bool Recorder::if_hdf5() const { return use_hdf5; } bool Recorder::if_record_time() const { return record_time; } +bool Recorder::if_perform_record() { return 1 == interval || 0 == std::remainder(counter++, interval); } + void Recorder::insert(const double T) { time_pool.emplace_back(T); } void Recorder::insert(const std::vector& D, const unsigned I) { data_pool[I].emplace_back(D); } @@ -90,12 +92,12 @@ void Recorder::save() { auto max_size = 0llu; for(const auto& I : s_data_pool[0]) if(I.n_elem > max_size) max_size = I.n_elem; - mat data_to_write(s_data_pool.cbegin()->size() * max_size + 1, time_pool.size() + 1, fill::zeros); + mat data_to_write(s_data_pool.cbegin()->size() * max_size + 1, time_pool.size(), fill::zeros); for(size_t I = 0; I < time_pool.size(); ++I) { - data_to_write(0, I + 1) = time_pool[I]; + data_to_write(0, I) = time_pool[I]; unsigned L = 1; - for(const auto& J : s_data_pool[I]) for(unsigned K = 0; K < J.n_elem; ++K) data_to_write(L++, I + 1) = J[K]; + for(const auto& J : s_data_pool[I]) for(unsigned K = 0; K < J.n_elem; ++K) data_to_write(L++, I) = J[K]; } hsize_t dimension[2] = {data_to_write.n_cols, data_to_write.n_rows}; @@ -115,12 +117,12 @@ void Recorder::save() { auto max_size = 0llu; for(const auto& I : s_data_pool[0]) if(I.n_elem > max_size) max_size = I.n_elem; - mat data_to_write(s_data_pool.cbegin()->size() * max_size + 1, time_pool.size() + 1, fill::zeros); + mat data_to_write(s_data_pool.cbegin()->size() * max_size + 1, time_pool.size(), fill::zeros); for(size_t I = 0; I < time_pool.size(); ++I) { - data_to_write(0, I + 1) = time_pool[I]; + data_to_write(0, I) = time_pool[I]; unsigned L = 1; - for(const auto& J : s_data_pool[I]) for(unsigned K = 0; K < J.n_elem; ++K) data_to_write(L++, I + 1) = J[K]; + for(const auto& J : s_data_pool[I]) for(unsigned K = 0; K < J.n_elem; ++K) data_to_write(L++, I) = J[K]; } ostringstream dataset_name; @@ -135,12 +137,12 @@ void Recorder::save() { auto max_size = 0llu; for(const auto& I : s_data_pool[0]) if(I.n_elem > max_size) max_size = I.n_elem; - mat data_to_write(s_data_pool.cbegin()->size() * max_size + 1, time_pool.size() + 1, fill::zeros); + mat data_to_write(s_data_pool.cbegin()->size() * max_size + 1, time_pool.size(), fill::zeros); for(size_t I = 0; I < time_pool.size(); ++I) { - data_to_write(0, I + 1) = time_pool[I]; + data_to_write(0, I) = time_pool[I]; auto L = 1; - for(const auto& J : s_data_pool[I]) for(unsigned K = 0; K < J.n_elem; ++K) data_to_write(L++, I + 1) = J[K]; + for(const auto& J : s_data_pool[I]) for(unsigned K = 0; K < J.n_elem; ++K) data_to_write(L++, I) = J[K]; } ostringstream dataset_name; diff --git a/Recorder/Recorder.h b/Recorder/Recorder.h index edced548b..43af5cd00 100644 --- a/Recorder/Recorder.h +++ b/Recorder/Recorder.h @@ -43,7 +43,9 @@ class Recorder : public Tag { protected: const unsigned interval; - unsigned counter = 1; + unsigned counter = 0; + + bool if_perform_record(); public: Recorder(unsigned, // tag diff --git a/Recorder/SumRecorder.cpp b/Recorder/SumRecorder.cpp index f54912af2..02ce47449 100644 --- a/Recorder/SumRecorder.cpp +++ b/Recorder/SumRecorder.cpp @@ -32,9 +32,7 @@ void SumRecorder::initialize(const shared_ptr& D) { } void SumRecorder::record(const shared_ptr& D) { - if(1 != interval && counter++ != interval) return; - - counter = 1; + if(!if_perform_record()) return; auto& obj_tag = get_object_tag(); diff --git a/Recorder/VisualisationRecorder.h b/Recorder/VisualisationRecorder.h index 0549d5857..226c4d70e 100644 --- a/Recorder/VisualisationRecorder.h +++ b/Recorder/VisualisationRecorder.h @@ -44,6 +44,7 @@ class VisualisationRecorder final : public Recorder { void (*function_handler)(const shared_ptr&, vtkInfo) = nullptr; #endif + public: VisualisationRecorder(unsigned, // tag OutputType, // recorder type diff --git a/Resource/suanPan.rc b/Resource/suanPan.rc index cf0d4eb01..d9bc71393 100644 --- a/Resource/suanPan.rc +++ b/Resource/suanPan.rc @@ -51,8 +51,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,6,1,0 - PRODUCTVERSION 2,6,1,0 + FILEVERSION 2,7,0,0 + PRODUCTVERSION 2,7,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -69,12 +69,12 @@ BEGIN BEGIN VALUE "CompanyName", "TLCFEM" VALUE "FileDescription", "suanPan --- An Open Source, Parallel and Heterogeneous Finite Element Analysis Framework" - VALUE "FileVersion", "2.6.1.0" + VALUE "FileVersion", "2.7.0.0" VALUE "InternalName", "suanPan" VALUE "LegalCopyright", "Copyright (C) 2017-2022 Theodore Chang https://github.com/TLCFEM/suanPan" VALUE "OriginalFilename", "suanPan" VALUE "ProductName", "suanPan" - VALUE "ProductVersion", "2.6.1.0" + VALUE "ProductVersion", "2.7.0.0" END END BLOCK "VarFileInfo" diff --git a/Script/AlmaLinux.Dockerfile b/Script/AlmaLinux.Dockerfile index 441b51433..f2b67fb7d 100644 --- a/Script/AlmaLinux.Dockerfile +++ b/Script/AlmaLinux.Dockerfile @@ -2,8 +2,8 @@ FROM almalinux:9 as build RUN dnf upgrade --refresh -y && dnf install -y libglvnd-devel gcc g++ gfortran rpm-build rpm-devel rpmdevtools cmake wget git -RUN wget -q https://registrationcenter-download.intel.com/akdlm/irc_nas/18898/l_onemkl_p_2022.2.0.8748_offline.sh -RUN sh ./l_onemkl_p_2022.2.0.8748_offline.sh -a --silent --eula accept && rm ./l_onemkl_p_2022.2.0.8748_offline.sh +RUN wget -q https://registrationcenter-download.intel.com/akdlm/irc_nas/19138/l_onemkl_p_2023.0.0.25398_offline.sh +RUN sh ./l_onemkl_p_2023.0.0.25398_offline.sh -a --silent --eula accept && rm ./l_onemkl_p_2023.0.0.25398_offline.sh RUN mkdir vtk-build && cd vtk-build && \ wget -q https://www.vtk.org/files/release/9.2/VTK-9.2.2.tar.gz && tar xf VTK-9.2.2.tar.gz && \ diff --git a/Script/CompileAll.sh b/Script/CompileAll.sh index 882958f37..a4fb670b9 100755 --- a/Script/CompileAll.sh +++ b/Script/CompileAll.sh @@ -9,6 +9,6 @@ for folder in $(find . -maxdepth 1 -type d -name "cmake-build*"); do ( echo "Compiling $folder" cd "$folder" || exit - make -j"$(nproc)" + cmake --build . --target all -j "$(nproc)" ) done diff --git a/Script/Coverage.sh b/Script/Coverage.sh index b0bd033cc..a251fc889 100755 --- a/Script/Coverage.sh +++ b/Script/Coverage.sh @@ -33,7 +33,7 @@ cp ../Example/Material/CYCLE.txt . for file in $files; do echo "Processing $file ..." - ./suanPan -f "$file" >>$log_file + time ./suanPan -f "$file" >>$log_file done { diff --git a/Script/Fedora.Dockerfile b/Script/Fedora.Dockerfile index 195502ca8..dcdb88393 100644 --- a/Script/Fedora.Dockerfile +++ b/Script/Fedora.Dockerfile @@ -1,9 +1,9 @@ -FROM fedora:35 as build +FROM fedora:37 as build RUN dnf upgrade --refresh -y && dnf install -y libglvnd-devel gcc g++ gfortran rpm-build rpm-devel rpmdevtools cmake wget git -RUN wget -q https://registrationcenter-download.intel.com/akdlm/irc_nas/18898/l_onemkl_p_2022.2.0.8748_offline.sh -RUN sh ./l_onemkl_p_2022.2.0.8748_offline.sh -a --silent --eula accept && rm ./l_onemkl_p_2022.2.0.8748_offline.sh +RUN wget -q https://registrationcenter-download.intel.com/akdlm/irc_nas/19138/l_onemkl_p_2023.0.0.25398_offline.sh +RUN sh ./l_onemkl_p_2023.0.0.25398_offline.sh -a --silent --eula accept && rm ./l_onemkl_p_2023.0.0.25398_offline.sh RUN mkdir vtk-build && cd vtk-build && \ wget -q https://www.vtk.org/files/release/9.2/VTK-9.2.2.tar.gz && tar xf VTK-9.2.2.tar.gz && \ @@ -18,11 +18,10 @@ RUN cd suanPan/build && cp suanPan*.rpm / && \ cd suanPan-linux-mkl-vtk/bin && ./suanPan.sh -v && \ cd / && ls -al && rm -r suanPan -FROM fedora:35 as runtime +FROM fedora:37 as runtime COPY --from=build /suanPan*.rpm /suanPan*.rpm RUN dnf upgrade --refresh -y && dnf install ./suanPan*.rpm -y RUN suanPan -v - diff --git a/Script/Ubuntu.Dockerfile b/Script/Ubuntu.Dockerfile index 011db825f..3313d304b 100644 --- a/Script/Ubuntu.Dockerfile +++ b/Script/Ubuntu.Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:focal as build +FROM ubuntu:jammy as build ARG DEBIAN_FRONTEND=noninteractive @@ -14,9 +14,7 @@ RUN apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB RUN echo "deb https://apt.repos.intel.com/oneapi all main" | tee /etc/apt/sources.list.d/oneAPI.list RUN rm GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB -RUN apt-get update -y && apt-get install -y gcc-10 g++-10 gfortran-10 cmake git intel-oneapi-mkl-devel libxt-dev freeglut3-dev libxcursor-dev file dpkg-dev - -RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ g++ /usr/bin/g++-10 --slave /usr/bin/gfortran gfortran /usr/bin/gfortran-10 --slave /usr/bin/gcov gcov /usr/bin/gcov-10 +RUN apt-get update -y && apt-get install -y gcc g++ gfortran cmake git intel-oneapi-mkl-devel libxt-dev freeglut3-dev libxcursor-dev file dpkg-dev RUN mkdir vtk-build && cd vtk-build && \ wget -q https://www.vtk.org/files/release/9.2/VTK-9.2.2.tar.gz && tar xf VTK-9.2.2.tar.gz && \ @@ -31,7 +29,7 @@ RUN cd suanPan/build && cp suanPan*.deb / && \ cd suanPan-linux-mkl-vtk/bin && ./suanPan.sh -v && \ cd / && ls -al && rm -r suanPan -FROM ubuntu:focal as runtime +FROM ubuntu:jammy as runtime COPY --from=build /suanPan*.deb /suanPan*.deb diff --git a/Section/SectionShell/SectionShell.cpp b/Section/SectionShell/SectionShell.cpp index 42e6ffb9d..18957a9f8 100644 --- a/Section/SectionShell/SectionShell.cpp +++ b/Section/SectionShell/SectionShell.cpp @@ -105,10 +105,7 @@ int SectionShell::update_trial_status(const vec& m_strain, const vec& p_strain, return update_trial_status(m_strain, p_strain); } -vector SectionShell::record(const OutputType&) { - vector data; - return data; -} +vector SectionShell::record(OutputType) { return {}; } unique_ptr suanpan::make_copy(const shared_ptr& S) { return S->get_copy(); } diff --git a/Section/SectionShell/SectionShell.h b/Section/SectionShell/SectionShell.h index a4009c01b..99537edce 100644 --- a/Section/SectionShell/SectionShell.h +++ b/Section/SectionShell/SectionShell.h @@ -115,7 +115,7 @@ class SectionShell : protected SectionShellData, public Tag { virtual unique_ptr get_copy() = 0; - virtual double get_parameter(ParameterType = ParameterType::NONE); + virtual double get_parameter(ParameterType); int update_incre_status(double, double); int update_incre_status(double, double, double, double); @@ -131,7 +131,7 @@ class SectionShell : protected SectionShellData, public Tag { virtual int commit_status() = 0; virtual int reset_status() = 0; - virtual vector record(const OutputType&); + virtual vector record(OutputType); }; namespace suanpan { diff --git a/Solver/Arnoldi.cpp b/Solver/Arnoldi.cpp index 398e952e6..eb5a13674 100644 --- a/Solver/Arnoldi.cpp +++ b/Solver/Arnoldi.cpp @@ -21,9 +21,10 @@ #include #include -Arnoldi::Arnoldi(const unsigned T, const unsigned N) +Arnoldi::Arnoldi(const unsigned T, const unsigned N, const char TP) : Solver(T) - , eigen_num(N) {} + , eigen_num(N) + , eigen_type(TP) {} int Arnoldi::initialize() { if(get_integrator() == nullptr) { @@ -36,7 +37,7 @@ int Arnoldi::initialize() { int Arnoldi::analyze() { auto& G = get_integrator(); - const auto& D = G->get_domain().lock(); + const auto& D = G->get_domain(); auto& W = D->get_factory(); if(SUANPAN_SUCCESS != G->process_modifier()) return SUANPAN_FAIL; @@ -47,7 +48,11 @@ int Arnoldi::analyze() { // if(SUANPAN_SUCCESS != G->process_load()) return SUANPAN_FAIL; if(SUANPAN_SUCCESS != G->process_constraint()) return SUANPAN_FAIL; - return eig_solve(get_eigenvalue(W), get_eigenvector(W), W->get_stiffness(), W->get_mass(), eigen_num, "SM"); + const shared_ptr t_mass = W->get_mass()->make_copy(); + const auto factor = 1E-12 * t_mass->max(); + for(auto I = 0llu; I < t_mass->n_rows; ++I) t_mass->at(I, I) += factor; + + return eig_solve(get_eigenvalue(W), get_eigenvector(W), W->get_stiffness(), t_mass, eigen_num, 'L' == eigen_type ? "LM" : "SM"); } void Arnoldi::print() { suanpan_info("A solver using Arnoldi method.\n"); } diff --git a/Solver/Arnoldi.h b/Solver/Arnoldi.h index b9b7652b3..c988c8a3a 100644 --- a/Solver/Arnoldi.h +++ b/Solver/Arnoldi.h @@ -32,10 +32,12 @@ class Arnoldi final : public Solver { const unsigned eigen_num; + const char eigen_type; public: explicit Arnoldi(unsigned = 0, // unique solver tag - unsigned = 1 // number of eigenvalues + unsigned = 1, // number of eigenvalues + char = 'S' // type ); int initialize() override; diff --git a/Solver/BFGS.cpp b/Solver/BFGS.cpp index 30e616e27..8dd7d2351 100644 --- a/Solver/BFGS.cpp +++ b/Solver/BFGS.cpp @@ -31,18 +31,16 @@ int BFGS::analyze() { const auto& D = C->get_domain().lock(); auto& W = D->get_factory(); - const auto max_iteration = C->get_max_iteration(); - suanpan_info("current analysis time: %.5f.\n", W->get_trial_time()); + const auto max_iteration = C->get_max_iteration(); + // iteration counter unsigned counter = 0; - // ninja alias - auto& ninja = get_ninja(W); // lambda alias auto& aux_lambda = get_auxiliary_lambda(W); - vec residual; + vec samurai, residual; // clear container hist_ninja.clear(); @@ -55,12 +53,14 @@ int BFGS::analyze() { auto& border = W->get_auxiliary_stiffness(); mat right; if(SUANPAN_SUCCESS != G->solve(right, border)) return SUANPAN_FAIL; - if(!solve(aux_lambda, border.t() * right.head_rows(n_size), border.t() * ninja.head_rows(n_size) - G->get_auxiliary_residual())) return SUANPAN_FAIL; - ninja -= right * aux_lambda; + if(!solve(aux_lambda, border.t() * right.head_rows(n_size), border.t() * samurai.head(n_size) - G->get_auxiliary_residual())) return SUANPAN_FAIL; + samurai -= right * aux_lambda; return SUANPAN_SUCCESS; }; while(true) { + // update for nodes and elements + if(SUANPAN_SUCCESS != G->update_trial_status()) return SUANPAN_FAIL; // process modifiers if(SUANPAN_SUCCESS != G->process_modifier()) return SUANPAN_FAIL; // assemble resistance @@ -72,8 +72,10 @@ int BFGS::analyze() { // process loads and constraints if(SUANPAN_SUCCESS != G->process_load()) return SUANPAN_FAIL; if(SUANPAN_SUCCESS != G->process_constraint()) return SUANPAN_FAIL; + // indicate the global matrix has been assembled + G->set_matrix_assembled_switch(true); // solve the system and commit current displacement increment - if(SUANPAN_SUCCESS != G->solve(ninja, residual = G->get_force_residual())) return SUANPAN_FAIL; + if(SUANPAN_SUCCESS != G->solve(samurai, residual = G->get_force_residual())) return SUANPAN_FAIL; // deal with mpc if(SUANPAN_SUCCESS != adjust_for_mpc()) return SUANPAN_FAIL; } @@ -89,44 +91,48 @@ int BFGS::analyze() { // commit current factor after obtaining residual hist_factor.emplace_back(dot(hist_ninja.back(), hist_residual.back())); // copy current residual to ninja - ninja = residual; + samurai = residual; // perform two-step recursive loop // right side loop for(auto J = static_cast(hist_factor.size()) - 1; J >= 0; --J) { // compute and commit alpha - alpha.emplace_back(dot(hist_ninja[J], ninja) / hist_factor[J]); + alpha.emplace_back(dot(hist_ninja[J], samurai) / hist_factor[J]); // update ninja - ninja -= alpha.back() * hist_residual[J]; + samurai -= alpha.back() * hist_residual[J]; } // apply the Hessian from the factorization in the first iteration - ninja = G->solve(ninja); + samurai = G->solve(samurai); // deal with mpc if(SUANPAN_SUCCESS != adjust_for_mpc()) return SUANPAN_FAIL; // left side loop - for(size_t I = 0, J = hist_factor.size() - 1; I < hist_factor.size(); ++I, --J) ninja += (alpha[J] - dot(hist_residual[I], ninja) / hist_factor[I]) * hist_ninja[I]; + for(size_t I = 0, J = hist_factor.size() - 1; I < hist_factor.size(); ++I, --J) samurai += (alpha[J] - dot(hist_residual[I], samurai) / hist_factor[I]) * hist_ninja[I]; } // commit current displacement increment - hist_ninja.emplace_back(ninja); // complete + hist_ninja.emplace_back(samurai); // complete hist_residual.emplace_back(residual); // part of residual increment // avoid machine error accumulation - G->erase_machine_error(); + G->erase_machine_error(samurai); + + // exit if converged + if(C->is_converged(counter)) return G->sync_status(true); + // exit if maximum iteration is hit + if(++counter > max_iteration) return SUANPAN_FAIL; + // update internal variable - G->update_internal(ninja); + G->update_internal(samurai); // update trial status for factory - G->update_trial_displacement(ninja); + G->update_from_ninja(); // for tracking G->update_load(); // for tracking multiplier G->update_constraint(); - // update for nodes and elements - if(SUANPAN_SUCCESS != G->update_trial_status()) return SUANPAN_FAIL; - // exit if converged - if(C->is_converged()) return SUANPAN_SUCCESS; - // exit if maximum iteration is hit - if(++counter > max_iteration) return SUANPAN_FAIL; + // fast handling for linear elastic case + // sync status using newly computed increment across elements and nodes + // this may just call predictor or call corrector + if(D->get_attribute(ModalAttribute::LinearSystem)) return G->sync_status(false); // check if the maximum record number is hit (L-BFGS) if(counter > max_hist) { diff --git a/Solver/FEAST.cpp b/Solver/FEAST.cpp index 0d79e5fef..a11f7b65a 100644 --- a/Solver/FEAST.cpp +++ b/Solver/FEAST.cpp @@ -37,8 +37,8 @@ int FEAST::linear_solve(const shared_ptr& W) const { std::vector output(4, 0); std::vector input(4, 0.); - input[1] = 0.; // centre - input[2] = radius; // radius + input[1] = centre - radius; // centre + input[2] = centre + radius; // radius output[1] = static_cast(eigen_num); @@ -106,7 +106,7 @@ int FEAST::quadratic_solve(const shared_ptr& W) const { std::vector output(4, 0); std::vector input(4, 0.); - input[0] = radius; // centre + input[0] = centre; // centre input[1] = 0.; // centre input[2] = radius; // radius @@ -187,10 +187,11 @@ int FEAST::quadratic_solve(const shared_ptr& W) const { return SUANPAN_SUCCESS; } -FEAST::FEAST(const unsigned T, const unsigned N, const double R, const bool Q) +FEAST::FEAST(const unsigned T, const unsigned N, const double C, const double R, const bool Q) : Solver(T) , quadratic(Q) , eigen_num(N) + , centre(C) , radius(R) {} int FEAST::initialize() { @@ -201,7 +202,7 @@ int FEAST::initialize() { return SUANPAN_FAIL; } - auto& W = G->get_domain().lock()->get_factory(); + auto& W = G->get_domain()->get_factory(); if(const auto scheme = W->get_storage_scheme(); StorageScheme::SYMMPACK == scheme) { suanpan_error("FEAST solver does not support symmetric pack storage.\n"); @@ -219,7 +220,7 @@ int FEAST::initialize() { int FEAST::analyze() { auto& G = get_integrator(); - const auto& D = G->get_domain().lock(); + const auto& D = G->get_domain(); auto& W = D->get_factory(); if(SUANPAN_SUCCESS != G->process_modifier()) return SUANPAN_FAIL; diff --git a/Solver/FEAST.h b/Solver/FEAST.h index 3f237575b..114fb6195 100644 --- a/Solver/FEAST.h +++ b/Solver/FEAST.h @@ -39,13 +39,13 @@ class FEAST final : public Solver { const bool quadratic = false; const unsigned eigen_num; - const double radius; + const double centre, radius; [[nodiscard]] int linear_solve(const shared_ptr&) const; [[nodiscard]] int quadratic_solve(const shared_ptr&) const; public: - FEAST(unsigned, unsigned, double, bool); + FEAST(unsigned, unsigned, double, double, bool); int initialize() override; diff --git a/Solver/Integrator/BatheExplicit.cpp b/Solver/Integrator/BatheExplicit.cpp new file mode 100644 index 000000000..d1df7f840 --- /dev/null +++ b/Solver/Integrator/BatheExplicit.cpp @@ -0,0 +1,120 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ + +#include "BatheExplicit.h" +#include +#include + +BatheExplicit::BatheExplicit(const unsigned T, const double R) + : ExplicitIntegrator(T) + , P((2. - std::sqrt(2. + 2. * R)) / (1. - R)) + , Q1((.5 - P) / P / (1. - P)) + , Q2(.5 - P * Q1) + , Q0(.5 - Q1 - Q2) {} + +bool BatheExplicit::has_corrector() const { return true; } + +void BatheExplicit::assemble_resistance() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + auto fa = std::async([&] { D->assemble_resistance(); }); + auto fb = std::async([&] { D->assemble_damping_force(); }); + auto fc = std::async([&] { D->assemble_inertial_force(); }); + + fa.get(); + fb.get(); + fc.get(); + + W->set_sushi(W->get_trial_resistance() + W->get_trial_damping_force() + W->get_trial_inertial_force()); +} + +void BatheExplicit::assemble_matrix() { get_domain()->assemble_trial_mass(); } + +void BatheExplicit::update_incre_time(double T) { + const auto& W = get_domain()->get_factory(); + update_parameter(T *= 2.); + W->update_incre_time(T * (FLAG::FIRST == step_flag ? P : 1. - P)); +} + +int BatheExplicit::update_trial_status() { + const auto& D = get_domain(); + + if(auto& W = D->get_factory(); FLAG::FIRST == step_flag) { + W->update_incre_velocity(A0 * W->get_current_acceleration()); + W->update_incre_displacement(A0 * W->get_current_velocity() + A1 * W->get_current_acceleration()); + } + else { + W->update_incre_velocity(A3 * W->get_current_acceleration()); + W->update_incre_displacement(A3 * W->get_current_velocity() + A4 * W->get_current_acceleration()); + } + + return D->update_trial_status(); +} + +int BatheExplicit::correct_trial_status() { + const auto& D = get_domain(); + + if(auto& W = D->get_factory(); FLAG::FIRST == step_flag) W->update_incre_velocity(A2 * W->get_incre_acceleration()); + else W->update_incre_velocity(A5 * W->get_pre_acceleration() + A6 * W->get_current_acceleration() + A7 * W->get_trial_acceleration()); + + return D->update_trial_status(); +} + +void BatheExplicit::commit_status() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + if(FLAG::FIRST == step_flag) { + step_flag = FLAG::SECOND; + set_time_step_switch(false); + } + else { + step_flag = FLAG::FIRST; + set_time_step_switch(true); + } + + W->commit_pre_displacement(); + W->commit_pre_velocity(); + W->commit_pre_acceleration(); + + ExplicitIntegrator::commit_status(); +} + +void BatheExplicit::clear_status() { + step_flag = FLAG::FIRST; + set_time_step_switch(true); + + ExplicitIntegrator::clear_status(); +} + +void BatheExplicit::update_parameter(const double NT) { + if(suanpan::approx_equal(DT, NT)) return; + + DT = NT; + + A0 = P * DT; + A2 = .5 * A0; + A1 = A0 * A2; + A3 = DT - A0; + A4 = .5 * A3 * A3; + A5 = Q0 * A3; + A6 = (.5 + Q1) * A3; + A7 = Q2 * A3; +} + +void BatheExplicit::print() { suanpan_info("A BatheExplicit solver.\n"); } diff --git a/Solver/Integrator/BatheExplicit.h b/Solver/Integrator/BatheExplicit.h new file mode 100644 index 000000000..d60419336 --- /dev/null +++ b/Solver/Integrator/BatheExplicit.h @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ +/** + * @class BatheExplicit + * @brief A BatheExplicit class defines a solver using BatheExplicit algorithm. + * + * @author tlc + * @date 03/12/2022 + * @version 0.1.0 + * @file BatheExplicit.h + * @addtogroup Integrator + * @{ + */ + +#ifndef BATHEEXPLICIT_H +#define BATHEEXPLICIT_H + +#include "Integrator.h" + +class BatheExplicit final : public ExplicitIntegrator { + enum class FLAG { + FIRST, + SECOND + }; + + FLAG step_flag = FLAG::FIRST; + + const double P, Q1, Q2, Q0; + double DT{0.}, A0{0.}, A1{0.}, A2{0.}, A3{0.}, A4{0.}, A5{0.}, A6{0.}, A7{0.}; + +public: + BatheExplicit(unsigned, double); + + [[nodiscard]] bool has_corrector() const override; + + void assemble_resistance() override; + void assemble_matrix() override; + + void update_incre_time(double) override; + + int update_trial_status() override; + int correct_trial_status() override; + + void commit_status() override; + void clear_status() override; + + void update_parameter(double) override; + + void print() override; +}; + +#endif + +//! @} diff --git a/Solver/Integrator/BatheTwoStep.cpp b/Solver/Integrator/BatheTwoStep.cpp index c015cf526..7667415f8 100644 --- a/Solver/Integrator/BatheTwoStep.cpp +++ b/Solver/Integrator/BatheTwoStep.cpp @@ -18,10 +18,16 @@ #include "BatheTwoStep.h" #include #include -#include + +BatheTwoStep::BatheTwoStep(const unsigned T, const double R, const double G) + : ImplicitIntegrator(T) + , GM(G) + , Q1((R + 1) / (2. * GM * (R - 1) + 4)) + , Q2(.5 - GM * Q1) + , Q0(1. - Q1 - Q2) {} void BatheTwoStep::assemble_resistance() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); auto fa = std::async([&] { D->assemble_resistance(); }); @@ -36,7 +42,7 @@ void BatheTwoStep::assemble_resistance() { } void BatheTwoStep::assemble_matrix() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); auto fa = std::async([&] { D->assemble_trial_stiffness(); }); @@ -53,26 +59,32 @@ void BatheTwoStep::assemble_matrix() { t_stiff += W->get_geometry(); - t_stiff += FLAG::TRAP == step_flag ? C6 * W->get_mass() + C3 * W->get_damping() : C5 * W->get_mass() + C2 * W->get_damping(); + t_stiff += FLAG::TRAP == step_flag ? P3 * W->get_mass() + P2 * W->get_damping() : P9 * W->get_mass() + P8 * W->get_damping(); +} + +void BatheTwoStep::update_incre_time(double T) { + const auto& W = get_domain()->get_factory(); + update_parameter(T *= 2.); + W->update_incre_time(T * (FLAG::TRAP == step_flag ? GM : 1. - GM)); } int BatheTwoStep::update_trial_status() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); if(auto& W = D->get_factory(); FLAG::TRAP == step_flag) { - W->update_incre_acceleration(C6 * W->get_incre_displacement() - C4 * W->get_current_velocity() - 2. * W->get_current_acceleration()); - W->update_incre_velocity(C3 * W->get_incre_displacement() - 2. * W->get_current_velocity()); + W->update_trial_acceleration(P3 * W->get_incre_displacement() - P4 * W->get_current_velocity() - W->get_current_acceleration()); + W->update_trial_velocity(P2 * W->get_incre_displacement() - W->get_current_velocity()); } else { - W->update_trial_velocity(C2 * W->get_incre_displacement() + C1 * (W->get_pre_displacement() - W->get_current_displacement())); - W->update_trial_acceleration(C1 * W->get_pre_velocity() - C3 * W->get_current_velocity() + C2 * W->get_trial_velocity()); + W->update_trial_velocity(P8 * (W->get_trial_displacement() - W->get_pre_displacement()) - Q02 * W->get_pre_velocity() - Q12 * W->get_current_velocity()); + W->update_trial_acceleration(P8 * (W->get_trial_velocity() - W->get_pre_velocity()) - Q02 * W->get_pre_acceleration() - Q12 * W->get_current_acceleration()); } return D->update_trial_status(); } void BatheTwoStep::commit_status() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); if(FLAG::TRAP == step_flag) { @@ -86,72 +98,63 @@ void BatheTwoStep::commit_status() { W->commit_pre_displacement(); W->commit_pre_velocity(); + W->commit_pre_acceleration(); - Integrator::commit_status(); + ImplicitIntegrator::commit_status(); } void BatheTwoStep::clear_status() { step_flag = FLAG::TRAP; set_time_step_switch(true); - Integrator::clear_status(); + ImplicitIntegrator::clear_status(); } -/** - * \brief update acceleration and velocity for zero displacement increment - */ -void BatheTwoStep::update_compatibility() const { - const auto& D = get_domain().lock(); - auto& W = D->get_factory(); +vec BatheTwoStep::from_incre_velocity(const vec& incre_velocity, const uvec& encoding) { + auto& W = get_domain()->get_factory(); - if(FLAG::TRAP == step_flag) { - W->update_incre_acceleration(-C4 * W->get_current_velocity() - 2. * W->get_current_acceleration()); - W->update_incre_velocity(-2. * W->get_current_velocity()); - } - else { - W->update_trial_velocity(C1 * (W->get_pre_displacement() - W->get_current_displacement())); - W->update_trial_acceleration(C1 * W->get_pre_velocity() - C3 * W->get_current_velocity() + C2 * W->get_trial_velocity()); - } + return from_total_velocity(W->get_current_velocity()(encoding) + incre_velocity, encoding); +} - auto& trial_dsp = W->get_trial_displacement(); - auto& trial_vel = W->get_trial_velocity(); - auto& trial_acc = W->get_trial_acceleration(); +vec BatheTwoStep::from_incre_acceleration(const vec& incre_acceleration, const uvec& encoding) { + auto& W = get_domain()->get_factory(); - suanpan::for_all(D->get_node_pool(), [&](const shared_ptr& t_node) { t_node->update_trial_status(trial_dsp, trial_vel, trial_acc); }); + return from_total_acceleration(W->get_current_acceleration()(encoding) + incre_acceleration, encoding); } -vec BatheTwoStep::from_incre_velocity(const vec& incre_velocity, const uvec& encoding) { - auto& W = get_domain().lock()->get_factory(); +vec BatheTwoStep::from_total_velocity(const vec& total_velocity, const uvec& encoding) { + auto& W = get_domain()->get_factory(); - vec total_displacement = W->get_current_displacement()(encoding); + if(FLAG::TRAP == step_flag) return W->get_current_displacement()(encoding) + P1 * (W->get_current_velocity()(encoding) + total_velocity); - if(FLAG::TRAP == step_flag) total_displacement += incre_velocity / C3 + C0 * W->get_current_velocity()(encoding); - else total_displacement += (incre_velocity + W->get_current_velocity()(encoding)) / C2 + (W->get_current_displacement()(encoding) - W->get_pre_displacement()(encoding)) / 3.; - - return total_displacement; + return W->get_pre_displacement()(encoding) + P5 * W->get_pre_velocity()(encoding) + P6 * W->get_current_velocity()(encoding) + P7 * total_velocity; } -vec BatheTwoStep::from_incre_acceleration(const vec& incre_acceleration, const uvec& encoding) { - auto& W = get_domain().lock()->get_factory(); +vec BatheTwoStep::from_total_acceleration(const vec& total_acceleration, const uvec& encoding) { + auto& W = get_domain()->get_factory(); - vec total_displacement = W->get_current_displacement()(encoding); + vec total_velocity; + if(FLAG::TRAP == step_flag) total_velocity = W->get_current_velocity()(encoding) + P1 * (W->get_current_acceleration()(encoding) + total_acceleration); + else total_velocity = W->get_pre_velocity()(encoding) + P5 * W->get_pre_acceleration()(encoding) + P6 * W->get_current_acceleration()(encoding) + P7 * total_acceleration; - if(FLAG::TRAP == step_flag) total_displacement += incre_acceleration / C6 + C0 * W->get_current_velocity()(encoding) + 2. / C6 * W->get_current_acceleration()(encoding); - else total_displacement += (incre_acceleration + W->get_current_acceleration()(encoding)) / C5 + C3 / C5 * W->get_current_velocity()(encoding) - C1 / C5 * W->get_pre_velocity()(encoding) + (W->get_current_displacement()(encoding) - W->get_pre_displacement()(encoding)) / 3.; - - return total_displacement; + return from_total_velocity(total_velocity, encoding); } void BatheTwoStep::update_parameter(const double NT) { - if(suanpan::approx_equal(C0, NT)) return; - - C0 = NT; - C1 = .5 / C0; - C2 = 3. * C1; - C3 = 4. * C1; - C4 = 2. * C3; - C5 = C2 * C2; - C6 = C4 / C0; + if(suanpan::approx_equal(P0, NT)) return; + + P0 = NT; + + P1 = .5 * P0 * GM; + P2 = 1. / P1; + P3 = P2 * P2; + P4 = 2. * P2; + + P5 = P0 * Q0; + P6 = P0 * Q1; + P7 = P0 * Q2; + P8 = 1. / P7; + P9 = P8 * P8; } void BatheTwoStep::print() { suanpan_info("A BatheTwoStep solver.\n"); } diff --git a/Solver/Integrator/BatheTwoStep.h b/Solver/Integrator/BatheTwoStep.h index ec973d38b..ba38259a4 100644 --- a/Solver/Integrator/BatheTwoStep.h +++ b/Solver/Integrator/BatheTwoStep.h @@ -31,7 +31,7 @@ #include "Integrator.h" -class BatheTwoStep final : public Integrator { +class BatheTwoStep final : public ImplicitIntegrator { enum class FLAG { TRAP, EULER @@ -39,24 +39,31 @@ class BatheTwoStep final : public Integrator { FLAG step_flag = FLAG::TRAP; - double C0 = 0., C1 = 0., C2 = 0., C3 = 0., C4 = 0., C5 = 0., C6 = 0.; + const double GM; + + const double Q1, Q2, Q0, Q02 = Q0 / Q2, Q12 = Q1 / Q2; + + double P0{0.}, P1{0.}, P2{0.}, P3{0.}, P4{0.}, P5{0.}, P6{0.}, P7{0.}, P8{0.}, P9{0.}; public: - using Integrator::Integrator; + BatheTwoStep(unsigned, double, double); void assemble_resistance() override; void assemble_matrix() override; + void update_incre_time(double) override; + int update_trial_status() override; void commit_status() override; void clear_status() override; void update_parameter(double) override; - void update_compatibility() const override; vec from_incre_velocity(const vec&, const uvec&) override; vec from_incre_acceleration(const vec&, const uvec&) override; + vec from_total_velocity(const vec&, const uvec&) override; + vec from_total_acceleration(const vec&, const uvec&) override; void print() override; }; diff --git a/Solver/Integrator/BatheTwoStep.tex b/Solver/Integrator/BatheTwoStep.tex deleted file mode 100644 index 6e5b94a1a..000000000 --- a/Solver/Integrator/BatheTwoStep.tex +++ /dev/null @@ -1,46 +0,0 @@ -\documentclass[a4paper,10pt,fleqn]{article} -\usepackage[margin=20mm]{geometry} -\usepackage{mathpazo,amsmath,amsfonts,amssymb,hyperref} -\hypersetup{colorlinks} -\begin{document} -A leag-frog style algorithm is implemented. Please see the reference \href{https://doi.org/10.1016/j.compstruc.2006.09.004}{doi:10.1016/j.compstruc.2006.09.004} -\section*{The First Step} -The first step is computed by using the Trapezoidal rule. Thus -\begin{gather} -v_{n+1}=v_n+\dfrac{\Delta{}t}{2}\left(a_n+a_{n+1}\right),\\ -u_{n+1}=u_n+\dfrac{\Delta{}t}{2}\left(v_n+v_{n+1}\right). -\end{gather} -Then, -\begin{gather} -u_{n+1}=u_n+\dfrac{\Delta{}t}{2}\left(v_n+v_n+\dfrac{\Delta{}t}{2}\left(a_n+a_{n+1}\right)\right),\qquad -\Delta{}u=\Delta{}tv_n+\dfrac{\Delta{}t^2}{4}a_n+\dfrac{\Delta{}t^2}{4}a_{n+1}. -\end{gather} -One could obtain -\begin{gather} -a_{n+1}=\dfrac{4}{\Delta{}t^2}\Delta{}u-\dfrac{4}{\Delta{}t}v_n-a_n,\qquad -\Delta{}a=\dfrac{4}{\Delta{}t^2}\Delta{}u-\dfrac{4}{\Delta{}t}v_n-2a_n,\\ -v_{n+1}=\dfrac{2}{\Delta{}t}\Delta{}u-v_n,\qquad -\Delta{}v=\dfrac{2}{\Delta{}t}\Delta{}u-2v_n. -\end{gather} - -The effective stiffness is then -\begin{gather} -\bar{K}=K+\dfrac{2}{\Delta{}t}C+\dfrac{4}{\Delta{}t^2}M. -\end{gather} -\section*{The Second Step} -The second step is computed by using the backward Euler method. Thus -\begin{gather} -v_{n+2}=\dfrac{1}{2\Delta{}t}u_n-\dfrac{2}{\Delta{}t}u_{n+1}+\dfrac{3}{2\Delta{}t}u_{n+2},\\ -a_{n+2}=\dfrac{1}{2\Delta{}t}v_n-\dfrac{2}{\Delta{}t}v_{n+1}+\dfrac{3}{2\Delta{}t}v_{n+2}. -\end{gather} -Hence, -\begin{gather} -v_{n+2}=\dfrac{1}{2\Delta{}t}u_n-\dfrac{1}{2\Delta{}t}u_{n+1}+\dfrac{3}{2\Delta{}t}\Delta{}u,\\ -a_{n+2}=\dfrac{1}{2\Delta{}t}v_n-\dfrac{2}{\Delta{}t}v_{n+1}+\dfrac{3}{2\Delta{}t}v_{n+2}. -\end{gather} - -The effective stiffness is then -\begin{gather} -\bar{K}=K+\dfrac{3}{2\Delta{}t}C+\dfrac{9}{4\Delta{}t^2}M. -\end{gather} -\end{document} diff --git a/Solver/Integrator/CMakeLists.txt b/Solver/Integrator/CMakeLists.txt index ccbb45c84..71992eec2 100644 --- a/Solver/Integrator/CMakeLists.txt +++ b/Solver/Integrator/CMakeLists.txt @@ -1,12 +1,16 @@ set(Integrator + Integrator/BatheExplicit.cpp Integrator/BatheTwoStep.cpp Integrator/GeneralizedAlpha.cpp + Integrator/GeneralizedAlphaExplicit.cpp Integrator/GSSSS.cpp Integrator/Integrator.cpp Integrator/LeeNewmark.cpp Integrator/LeeNewmarkBase.cpp Integrator/LeeNewmarkFull.cpp Integrator/Newmark.cpp + Integrator/OALTS.cpp Integrator/RayleighNewmark.cpp + Integrator/Tchamwa.cpp Integrator/WilsonPenzienNewmark.cpp ) diff --git a/Solver/Integrator/GSSSS.cpp b/Solver/Integrator/GSSSS.cpp index bad9562af..754347e04 100644 --- a/Solver/Integrator/GSSSS.cpp +++ b/Solver/Integrator/GSSSS.cpp @@ -18,16 +18,15 @@ #include "GSSSS.h" #include #include -#include GSSSS::GSSSS(const unsigned T) - : Integrator(T) + : ImplicitIntegrator(T) , L1(1.) , L2(.5) , L4(1.) {} void GSSSS::assemble_resistance() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); auto fa = std::async([&] { D->assemble_resistance(); }); @@ -38,11 +37,11 @@ void GSSSS::assemble_resistance() { fb.get(); fc.get(); - W->set_sushi(W->get_trial_resistance() + W->get_trial_damping_force() + W->get_trial_inertial_force()); + W->set_sushi(W->get_current_resistance() + W3G3 / L3 * W->get_incre_resistance() + W->get_current_damping_force() + W2G5 / L5 * W->get_incre_damping_force() + W->get_current_inertial_force() + W1G6 * W->get_incre_inertial_force()); } void GSSSS::assemble_matrix() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); auto fa = std::async([&] { D->assemble_trial_stiffness(); }); @@ -55,11 +54,17 @@ void GSSSS::assemble_matrix() { fc.get(); fd.get(); - W->get_stiffness() += W->get_geometry() + XCVD * W->get_damping() + XCAD * W->get_mass(); + W->get_stiffness() += W->get_geometry() + XV * W->get_damping() + XA * W->get_mass(); } +vec GSSSS::get_force_residual() { return XD * ImplicitIntegrator::get_force_residual(); } + +vec GSSSS::get_displacement_residual() { return XD * ImplicitIntegrator::get_displacement_residual(); } + +sp_mat GSSSS::get_reference_load() { return XD * ImplicitIntegrator::get_reference_load(); } + int GSSSS::process_load() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); const sp_d auto current_time = W->get_current_time(); @@ -67,7 +72,7 @@ int GSSSS::process_load() { W->update_trial_time((1. - W1) * current_time + W1 * trial_time); - const auto code = Integrator::process_load(); + const auto code = ImplicitIntegrator::process_load(); W->update_trial_time(trial_time); @@ -75,7 +80,7 @@ int GSSSS::process_load() { } int GSSSS::process_constraint() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); const sp_d auto current_time = W->get_current_time(); @@ -83,7 +88,7 @@ int GSSSS::process_constraint() { W->update_trial_time((1. - W1) * current_time + W1 * trial_time); - const auto code = Integrator::process_constraint(); + const auto code = ImplicitIntegrator::process_constraint(); W->update_trial_time(trial_time); @@ -91,7 +96,7 @@ int GSSSS::process_constraint() { } int GSSSS::process_load_resistance() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); const sp_d auto current_time = W->get_current_time(); @@ -99,7 +104,7 @@ int GSSSS::process_load_resistance() { W->update_trial_time((1. - W1) * current_time + W1 * trial_time); - const auto code = Integrator::process_load_resistance(); + const auto code = ImplicitIntegrator::process_load_resistance(); W->update_trial_time(trial_time); @@ -107,7 +112,7 @@ int GSSSS::process_load_resistance() { } int GSSSS::process_constraint_resistance() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); const sp_d auto current_time = W->get_current_time(); @@ -115,7 +120,7 @@ int GSSSS::process_constraint_resistance() { W->update_trial_time((1. - W1) * current_time + W1 * trial_time); - const auto code = Integrator::process_constraint_resistance(); + const auto code = ImplicitIntegrator::process_constraint_resistance(); W->update_trial_time(trial_time); @@ -123,68 +128,43 @@ int GSSSS::process_constraint_resistance() { } int GSSSS::update_trial_status() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); - W->update_trial_velocity_by(XCVD * W->get_ninja()); - W->update_trial_acceleration_by(XCAD * W->get_ninja()); + W->update_incre_acceleration(C0 * W->get_incre_displacement() + C1 * W->get_current_velocity() + C2 * W->get_current_acceleration()); + W->update_incre_velocity(C3 * W->get_current_acceleration() + C4 * W->get_incre_acceleration()); return D->update_trial_status(); } -void GSSSS::stage_status() { - const auto& D = get_domain().lock(); - auto& W = D->get_factory(); - - W->update_incre_acceleration(W->get_incre_acceleration() / W1G6); - W->update_incre_velocity(L4 * DT * W->get_current_acceleration() + L5 * DT * W->get_incre_acceleration()); - W->update_incre_displacement(L1 * DT * W->get_current_velocity() + L2 * DT * DT * W->get_current_acceleration() + L3 * DT * DT * W->get_incre_acceleration()); - - // since iterative result does not equal to committed result - // need to sync with elements and nodes - [[maybe_unused]] const auto code = D->update_trial_status(); - - Integrator::stage_status(); -} - void GSSSS::update_parameter(const double NT) { if(suanpan::approx_equal(DT, NT)) return; DT = NT; - XPV3 = (W1G4 - W2G5 * L2 / L3) * DT; - XPA2 = -W1G6 * L1 / L3 / DT; - XCVD = W2G5 / W3G3 / DT; - XCAD = W1G6 / W3G3 / DT / DT; -} - -void GSSSS::update_compatibility() const { - const auto& D = get_domain().lock(); - auto& W = D->get_factory(); + const auto L3T = 1. / L3 / DT; - auto fb = std::async([&] { W->update_trial_velocity(XPV2 * W->get_current_velocity() + XPV3 * W->get_current_acceleration()); }); - auto fc = std::async([&] { W->update_trial_acceleration(XPA2 * W->get_current_velocity() + XPA3 * W->get_current_acceleration()); }); + C0 = L3T / DT; + C1 = -L1 * L3T; + C2 = -L2 / L3; + C3 = L4 * DT; + C4 = L5 * DT; - fb.get(); - fc.get(); - - auto& trial_dsp = W->get_trial_displacement(); - auto& trial_vel = W->get_trial_velocity(); - auto& trial_acc = W->get_trial_acceleration(); - - suanpan::for_all(D->get_node_pool(), [&](const shared_ptr& t_node) { t_node->update_trial_status(trial_dsp, trial_vel, trial_acc); }); + XD = L3 / W3G3; + XV = W2G5 / W3G3 / DT; + XA = W1G6 / W3G3 / DT / DT; } vec GSSSS::from_incre_velocity(const vec& incre_velocity, const uvec& encoding) { - auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); - return W->get_current_displacement()(encoding) + W3G3 * L1 / L3 * DT * W->get_current_velocity()(encoding) + W3G3 * (L2 / L3 - L4 / L5) * DT * DT * W->get_current_acceleration()(encoding) + W3G3 / L5 * DT * incre_velocity; + return from_incre_acceleration(incre_velocity / C4 - C3 / C4 * W->get_current_acceleration()(encoding), encoding); } vec GSSSS::from_incre_acceleration(const vec& incre_acceleration, const uvec& encoding) { - auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); - return W->get_current_displacement()(encoding) + W3G3 * L1 / L3 * DT * W->get_current_velocity()(encoding) + W3G3 * L2 / L3 * DT * DT * W->get_current_acceleration()(encoding) + W3G3 * DT * DT * incre_acceleration; + return incre_acceleration / C0 - C1 / C0 * W->get_current_velocity()(encoding) - C2 / C0 * W->get_current_acceleration()(encoding) + W->get_current_displacement()(encoding); } void GSSSS::print() { suanpan_info("A time integrator using the GSSSS algorithm.\n"); } @@ -193,17 +173,11 @@ template<> void GSSSS::generate_constants(const double R3, const double L3 = 1. / (1. + R1) / (1. + R2); L5 = .5 * (3. + R1 + R2 - R1 * R2) * L3; - W1G1 = 1. / (1. + R3); - W2G2 = .5 * W1G1; - W3G3 = L3 * W1G1; - W1G4 = W1G1; - W2G5 = L5 * W1G1; - W1G6 = (2. + R1 + R2 + R3 - R1 * R2 * R3) * W3G3; - - W1 = W1G1; + W1 = 1. / (1. + R3); - XPV2 = 1. - W2G5 * L1 / L3; - XPA3 = 1. - W1G6 * L2 / L3; + W3G3 = L3 * W1; + W2G5 = L5 * W1; + W1G6 = (2. + R1 + R2 + R3 - R1 * R2 * R3) * W3G3; } GSSSSU0::GSSSSU0(const unsigned T, vec&& R) @@ -216,13 +190,6 @@ template<> void GSSSS::generate_constants(const double R3, const double L3 = .5 / (1. + R3); L5 = 2. * L3; - W2G2 = 1. / (1. + R1) / (1. + R2); - W3G3 = W2G2 / (1. + R3); - W1G1 = .5 * (3. + R1 + R2 - R1 * R2) * W2G2; - W1G4 = W1G1; - W2G5 = 2. * W3G3; - W1G6 = (2. + R1 + R2 + R3 - R1 * R2 * R3) * W3G3; - const auto T0 = 9. - 11. * R1 - 11 * R2 + 19. * R1 * R2; const auto T1 = -30. * (3. - 4. * R1 - 4. * R2 + 6. * R1 * R2); const auto T2 = 7.5 * (25. - 37. * R1 - 37. * R2 + 53. * R1 * R2); @@ -230,8 +197,9 @@ template<> void GSSSS::generate_constants(const double R3, const double W1 = (T0 / 2. + T1 / 3. + T2 / 4. + T3 / 5.) / (T0 + T1 / 2. + T2 / 3. + T3 / 4.); - XPV2 = 1. - W2G5 * L1 / L3; - XPA3 = 1. - W1G6 * L2 / L3; + W3G3 = 1. / (1. + R1) / (1. + R2) / (1. + R3); + W2G5 = 2. * W3G3; + W1G6 = (2. + R1 + R2 + R3 - R1 * R2 * R3) * W3G3; } GSSSSV0::GSSSSV0(const unsigned T, vec&& R) @@ -244,17 +212,11 @@ template<> void GSSSS::generate_constants(const double R, double, L3 = .5 / (1. + R); L5 = 2. * L3; - W1G1 = L5; - W2G2 = L3; - W3G3 = W2G2 * W1G1; - W1G4 = W1G1; - W2G5 = W1G1 * W1G1; - W1G6 = (3. + 2. * R - R * R) * W3G3; - - W1 = W1G1; + W1 = L5; - XPV2 = 1. - W2G5 * L1 / L3; - XPA3 = 1. - W1G6 * L2 / L3; + W3G3 = L3 * L5; + W2G5 = L5 * L5; + W1G6 = (1. + R) * (3. - R) * W3G3; } GSSSSOptimal::GSSSSOptimal(const unsigned T, double R) diff --git a/Solver/Integrator/GSSSS.h b/Solver/Integrator/GSSSS.h index 7a421770d..399a68bf0 100644 --- a/Solver/Integrator/GSSSS.h +++ b/Solver/Integrator/GSSSS.h @@ -35,16 +35,16 @@ #include "Integrator.h" -class GSSSS : public Integrator { +class GSSSS : public ImplicitIntegrator { protected: const double L1, L2, L4; double L3 = 0., L5 = 0.; - double W1 = 0., W1G1 = 0., W2G2 = 0., W3G3 = 0., W1G4 = 0., W2G5 = 0., W1G6 = 0.; + double W1 = 0., W3G3 = 0., W2G5 = 0., W1G6 = 0.; double DT = 0.; - double XPV2 = 0., XPV3 = 0., XPA2 = 0., XPA3 = 0., XCVD = 0., XCAD = 0.; + double C0{0.}, C1{0.}, C2{0.}, C3{0.}, C4{0.}, XD{0.}, XV{0.}, XA{0.}; // ReSharper disable once CppMemberFunctionMayBeStatic template void generate_constants(double, double, double) { throw invalid_argument("need a proper scheme"); } @@ -55,6 +55,10 @@ class GSSSS : public Integrator { void assemble_resistance() override; void assemble_matrix() override; + vec get_force_residual() override; + vec get_displacement_residual() override; + sp_mat get_reference_load() override; + [[nodiscard]] int process_load() override; [[nodiscard]] int process_constraint() override; [[nodiscard]] int process_load_resistance() override; @@ -62,10 +66,7 @@ class GSSSS : public Integrator { int update_trial_status() override; - void stage_status() override; - void update_parameter(double) override; - void update_compatibility() const override; vec from_incre_velocity(const vec&, const uvec&) override; vec from_incre_acceleration(const vec&, const uvec&) override; diff --git a/Solver/Integrator/GSSSS.tex b/Solver/Integrator/GSSSS.tex new file mode 100644 index 000000000..8730c2844 --- /dev/null +++ b/Solver/Integrator/GSSSS.tex @@ -0,0 +1,47 @@ +\documentclass[a4paper,10pt,fleqn]{article} +\usepackage[margin=20mm]{geometry} +\usepackage{mathpazo,amsmath,amsfonts,amssymb} +\newcommand{\ddfrac}[2]{\dfrac{\mathrm{d}~#1}{\mathrm{d}~#2}} +\newcommand{\dt}{\Delta{}t} +\newcommand{\LM}{\varLambda_6W_1} +\newcommand{\LC}{\varLambda_5W_2} +\newcommand{\LK}{\varLambda_3W_3} +\begin{document} +\title{GSSSS}\date{} +\maketitle +\section{Integration} +The GSSSS method assumes that the displacement $d$ and the velocity $v$ are integrated as such, +\begin{gather}\label{EQ1} +d_{n+1}=d_n+\lambda_1\dt{}v_n+\lambda_2\dt^2a_n+\lambda_3\dt^2\left(a_{n+1}-a_n\right),\\ +v_{n+1}=v_n+\lambda_4\dt{}a_n+\lambda_5\dt\left(a_{n+1}-a_n\right), +\end{gather} +where $\lambda_n$ are parameters associated with spectral radii. +\section{Updating} +The incremental form is then +\begin{gather} +\Delta{}a=\dfrac{1}{\lambda_3\dt^2}\Delta{}d-\dfrac{\lambda_1}{\lambda_3\dt}v_n-\dfrac{\lambda_2}{\lambda_3}a_n,\\ +\Delta{}v=\lambda_4\dt{}a_n+\lambda_5\dt\Delta{}a, +\end{gather} +Thus, according to chain rule +\begin{gather} +\ddfrac{a_{n+1}}{d_{n+1}}=\dfrac{1}{\lambda_3\dt^2},\qquad{}\ddfrac{v_{n+1}}{d_{n+1}}=\dfrac{\lambda_5}{\lambda_3\dt}. +\end{gather} +\section{EOM} +The EOM is expressed at somewhere between $t_n$ and $t_{n+1}$. +\begin{multline} +M\left(\left(1-\LM\right)a_n+\LM{}a_{n+1}\right)+ +C\left(\left(1-\dfrac{\LC}{\lambda_5}\right)v_n+\dfrac{\LC}{\lambda_5}v_{n+1}\right)+\\ +K\left(\left(1-\dfrac{\LK}{\lambda_3}\right)d_n+\dfrac{\LK}{\lambda_3}d_{n+1}\right)= +\left(1-W_1\right)F_n+W_1F_{n+1} +\end{multline} +\section{Effective Stiffness} +The effective stiffness can be computed as +\begin{gather} +\bar{K}=\dfrac{\LM}{\lambda_3\dt^2}M+\dfrac{\LC}{\lambda_3\dt}C+\dfrac{\LK}{\lambda_3}K +\end{gather} +with $\Delta{}d=d_{n+1}-d_n$ be the unknown variable. Once converges, +\begin{gather} +\Delta{}a=\dfrac{1}{\lambda_3\dt^2}\Delta{}d-\dfrac{\lambda_1}{\lambda_3\dt}v_n-\dfrac{\lambda_2}{\lambda_3}a_n,\\ +\Delta{}v=\lambda_4\dt{}a_n+\lambda_5\dt\Delta{}a, +\end{gather} +\end{document} \ No newline at end of file diff --git a/Solver/Integrator/GeneralizedAlpha.cpp b/Solver/Integrator/GeneralizedAlpha.cpp index 6aeeae093..1cfc034e4 100644 --- a/Solver/Integrator/GeneralizedAlpha.cpp +++ b/Solver/Integrator/GeneralizedAlpha.cpp @@ -18,10 +18,9 @@ #include "GeneralizedAlpha.h" #include #include -#include GeneralizedAlpha::GeneralizedAlpha(const unsigned T, const double R) - : Integrator(T) + : ImplicitIntegrator(T) , alpha_f(R / (R + 1.)) , alpha_m((2. * R - 1.) / (R + 1.)) , gamma(.5 - (R - 1.) / (R + 1.)) @@ -33,7 +32,7 @@ GeneralizedAlpha::GeneralizedAlpha(const unsigned T, const double R) , F9(-.5 / beta) {} GeneralizedAlpha::GeneralizedAlpha(const unsigned T, const double AF, const double AM) - : Integrator(T) + : ImplicitIntegrator(T) , alpha_f(std::min(.5, std::max(AF, .0))) , alpha_m(std::min(alpha_f, std::max(AM, -1.))) , gamma(.5 - alpha_m + alpha_f) @@ -45,7 +44,7 @@ GeneralizedAlpha::GeneralizedAlpha(const unsigned T, const double AF, const doub , F9(-.5 / beta) { if(!suanpan::approx_equal(alpha_m, AM) || !suanpan::approx_equal(alpha_f, AF)) suanpan_error("GeneralizedAlpha() parameters are not acceptable hence automatically adjusted.\n"); } void GeneralizedAlpha::assemble_resistance() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); auto fa = std::async([&] { D->assemble_resistance(); }); @@ -56,11 +55,11 @@ void GeneralizedAlpha::assemble_resistance() { fb.get(); fc.get(); - W->set_sushi(F1 * (W->get_current_resistance() + W->get_current_damping_force()) + F2 * (W->get_trial_resistance() + W->get_trial_damping_force()) + F3 * W->get_current_inertial_force() + F4 * W->get_trial_inertial_force()); + W->set_sushi(W->get_current_resistance() + F2 * W->get_incre_resistance() + W->get_current_damping_force() + F2 * W->get_incre_damping_force() + W->get_current_inertial_force() + F4 * W->get_incre_inertial_force()); } void GeneralizedAlpha::assemble_matrix() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); auto fa = std::async([&] { D->assemble_trial_stiffness(); }); @@ -73,16 +72,17 @@ void GeneralizedAlpha::assemble_matrix() { fc.get(); fd.get(); - auto& t_stiffness = W->get_stiffness(); + W->get_stiffness() += W->get_geometry() + F5 / F2 * W->get_mass() + F6 / F2 * W->get_damping(); +} - t_stiffness += W->get_geometry(); +vec GeneralizedAlpha::get_force_residual() { return ImplicitIntegrator::get_force_residual() / F2; } - t_stiffness *= F2; - t_stiffness += F5 * W->get_mass() + F6 * W->get_damping(); -} +vec GeneralizedAlpha::get_displacement_residual() { return ImplicitIntegrator::get_displacement_residual() / F2; } + +sp_mat GeneralizedAlpha::get_reference_load() { return ImplicitIntegrator::get_reference_load() / F2; } int GeneralizedAlpha::process_load() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); const sp_d auto current_time = W->get_current_time(); @@ -90,7 +90,7 @@ int GeneralizedAlpha::process_load() { W->update_trial_time(F1 * current_time + F2 * trial_time); - const auto code = Integrator::process_load(); + const auto code = ImplicitIntegrator::process_load(); W->update_trial_time(trial_time); @@ -98,7 +98,7 @@ int GeneralizedAlpha::process_load() { } int GeneralizedAlpha::process_constraint() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); const sp_d auto current_time = W->get_current_time(); @@ -106,7 +106,7 @@ int GeneralizedAlpha::process_constraint() { W->update_trial_time(F1 * current_time + F2 * trial_time); - const auto code = Integrator::process_constraint(); + const auto code = ImplicitIntegrator::process_constraint(); W->update_trial_time(trial_time); @@ -114,7 +114,7 @@ int GeneralizedAlpha::process_constraint() { } int GeneralizedAlpha::process_load_resistance() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); const sp_d auto current_time = W->get_current_time(); @@ -122,7 +122,7 @@ int GeneralizedAlpha::process_load_resistance() { W->update_trial_time(F1 * current_time + F2 * trial_time); - const auto code = Integrator::process_load_resistance(); + const auto code = ImplicitIntegrator::process_load_resistance(); W->update_trial_time(trial_time); @@ -130,7 +130,7 @@ int GeneralizedAlpha::process_load_resistance() { } int GeneralizedAlpha::process_constraint_resistance() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); const sp_d auto current_time = W->get_current_time(); @@ -138,7 +138,7 @@ int GeneralizedAlpha::process_constraint_resistance() { W->update_trial_time(F1 * current_time + F2 * trial_time); - const auto code = Integrator::process_constraint_resistance(); + const auto code = ImplicitIntegrator::process_constraint_resistance(); W->update_trial_time(trial_time); @@ -146,7 +146,7 @@ int GeneralizedAlpha::process_constraint_resistance() { } int GeneralizedAlpha::update_trial_status() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); W->update_incre_acceleration(F7 * W->get_incre_displacement() + F8 * W->get_current_velocity() + F9 * W->get_current_acceleration()); @@ -166,31 +166,14 @@ void GeneralizedAlpha::update_parameter(const double NT) { F5 = F4 * F7; } -/** - * \brief update acceleration and velocity for zero displacement increment - */ -void GeneralizedAlpha::update_compatibility() const { - const auto& D = get_domain().lock(); - auto& W = D->get_factory(); - - W->update_incre_acceleration(F8 * W->get_current_velocity() + F9 * W->get_current_acceleration()); - W->update_incre_velocity(F10 * W->get_current_acceleration() + F11 * W->get_incre_acceleration()); - - auto& trial_dsp = W->get_trial_displacement(); - auto& trial_vel = W->get_trial_velocity(); - auto& trial_acc = W->get_trial_acceleration(); - - suanpan::for_all(D->get_node_pool(), [&](const shared_ptr& t_node) { t_node->update_trial_status(trial_dsp, trial_vel, trial_acc); }); -} - vec GeneralizedAlpha::from_incre_velocity(const vec& incre_velocity, const uvec& encoding) { - auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); return incre_velocity / (F11 * F7) + F10 * W->get_current_velocity()(encoding) - (F10 + F11 * F9) / (F11 * F7) * W->get_current_acceleration()(encoding) + W->get_current_displacement()(encoding); } vec GeneralizedAlpha::from_incre_acceleration(const vec& incre_acceleration, const uvec& encoding) { - auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); return incre_acceleration / F7 + F10 * W->get_current_velocity()(encoding) - F9 / F7 * W->get_current_acceleration()(encoding) + W->get_current_displacement()(encoding); } diff --git a/Solver/Integrator/GeneralizedAlpha.h b/Solver/Integrator/GeneralizedAlpha.h index 3ee8b48ce..08fb1aca9 100644 --- a/Solver/Integrator/GeneralizedAlpha.h +++ b/Solver/Integrator/GeneralizedAlpha.h @@ -39,7 +39,7 @@ #include "Integrator.h" -class GeneralizedAlpha final : public Integrator { +class GeneralizedAlpha final : public ImplicitIntegrator { const double alpha_f; const double alpha_m; const double gamma; @@ -56,6 +56,10 @@ class GeneralizedAlpha final : public Integrator { void assemble_resistance() override; void assemble_matrix() override; + vec get_force_residual() override; + vec get_displacement_residual() override; + sp_mat get_reference_load() override; + [[nodiscard]] int process_load() override; [[nodiscard]] int process_constraint() override; [[nodiscard]] int process_load_resistance() override; @@ -64,7 +68,6 @@ class GeneralizedAlpha final : public Integrator { int update_trial_status() override; void update_parameter(double) override; - void update_compatibility() const override; vec from_incre_velocity(const vec&, const uvec&) override; vec from_incre_acceleration(const vec&, const uvec&) override; diff --git a/Solver/Integrator/GeneralizedAlpha.tex b/Solver/Integrator/GeneralizedAlpha.tex index 8bb4a92b3..04e5ea835 100644 --- a/Solver/Integrator/GeneralizedAlpha.tex +++ b/Solver/Integrator/GeneralizedAlpha.tex @@ -1,77 +1,51 @@ \documentclass[a4paper,10pt,fleqn]{article} \usepackage[margin=20mm]{geometry} \usepackage{mathpazo,amsmath,amsfonts,amssymb} +\newcommand{\ddfrac}[2]{\dfrac{\mathrm{d}~#1}{\mathrm{d}~#2}} \begin{document} +\title{Generalised-$\alpha$}\date{} +\maketitle +\section{Integration} The generalized alpha method assumes that the displacement $d$ and the velocity $v$ are integrated as such, \begin{gather}\label{EQ1} d_{n+1}=d_n+\Delta{}tv_n+\Delta{}t^2\left(\left(\dfrac{1}{2}-\beta\right)a_n+\beta{}a_{n+1}\right),\\ v_{n+1}=v_n+\Delta{}t\left(1-\gamma\right)a_n+\Delta{}t\gamma{}a_{n+1}, \end{gather} -where $\beta$ and $\gamma$ are two parameters. From \eqref{EQ1}, the acceleration $a_{n+1}$ can be expressed as +where $\beta$ and $\gamma$ are two parameters. The integration relationship is identical to that of Newmark emthod. +\section{Updating} +From \eqref{EQ1}, the acceleration $a_{n+1}$ can be expressed as \begin{gather} a_{n+1}=\dfrac{1}{\beta\Delta{}t^2}d_{n+1}-\dfrac{1}{\beta\Delta{}t^2}d_n-\dfrac{1}{\beta\Delta{}t}v_n+\left(1-\dfrac{1}{2\beta}\right)a_n. \end{gather} - +Thus, according to chain rule +\begin{gather} +\ddfrac{a_{n+1}}{d_{n+1}}=\dfrac{1}{\beta\Delta{}t^2},\qquad{}\ddfrac{v_{n+1}}{d_{n+1}}=\dfrac{\gamma}{\beta\Delta{}t}. +\end{gather} +\section{EOM} The EOM is expressed at somewhere between $t_n$ and $t_{n+1}$. \begin{gather} -Ma_{n+1-\alpha_m}+Cv_{n+1-\alpha_f}+Kd_{n+1-\alpha_f}=F, +Ma_{n+1-\alpha_m}+Cv_{n+1-\alpha_f}+Kd_{n+1-\alpha_f}=F_{n+1-\alpha_f}, \end{gather} which can also be explicitly shown as \begin{gather} -M\left(\left(1-\alpha_m\right)a_{n+1}+\alpha_ma_n\right)+C\left(\left(1-\alpha_f\right)v_{n+1}+\alpha_fv_n\right)+K\left(\left(1-\alpha_f\right)d_{n+1}+\alpha_fd_n\right)=F, +\begin{split} +M\left(\left(1-\alpha_m\right)a_{n+1}+\alpha_ma_n\right)+C\left(\left(1-\alpha_f\right)v_{n+1}+\alpha_fv_n\right)+K\left(\left(1-\alpha_f\right)d_{n+1}+\alpha_fd_n\right)\\=\left(1-\alpha_f\right)F_{n+1}+\alpha_fF_n, +\end{split} \end{gather} where $\alpha_m$ and $\alpha_f$ are two additional parameters. - -By substituting $v_{n+1}$ and $a_{n+1}$ into the EOM, one arrives -\begin{multline} -M\left(1-\alpha_m\right)\left(\dfrac{1}{\beta\Delta{}t^2}d_{n+1}-\dfrac{1}{\beta\Delta{}t^2}d_n-\dfrac{1}{\beta\Delta{}t}v_n+\left(1-\dfrac{1}{2\beta}\right)a_n\right)+\\C\left(1-\alpha_f\right)\Delta{}t\gamma{}\left(\dfrac{1}{\beta\Delta{}t^2}d_{n+1}-\dfrac{1}{\beta\Delta{}t^2}d_n-\dfrac{1}{\beta\Delta{}t}v_n+\left(1-\dfrac{1}{2\beta}\right)a_n\right)+\\ -C\left(1-\alpha_f\right)\left(v_n+\Delta{}t\left(1-\gamma\right)a_n\right)+K\left(1-\alpha_f\right)d_{n+1}+M\alpha_ma_n+C\alpha_fv_n+K\alpha_fd_n=F. -\end{multline} - -After some rearrangements, the EOM can be expressed as -\begin{multline} -\left(\left(1-\alpha_f\right)K+\dfrac{1-\alpha_m}{\beta\Delta{}t^2}M+\left(1-\alpha_f\right)\dfrac{\gamma{}}{\beta\Delta{}t}C\right)d_{n+1}\\ -=F+M\left(\dfrac{1-\alpha_m}{\beta\Delta{}t^2}d_n+\dfrac{1-\alpha_m}{\beta\Delta{}t}v_n+\left(\dfrac{1-\alpha_m}{2\beta}-1\right)a_n\right)-K\alpha_fd_n\\ -+C\left(\left(1-\alpha_f\right)\dfrac{\gamma{}}{\beta\Delta{}t}d_n+\left(\gamma\dfrac{1-\alpha_f}{\beta}-1\right)v_n+\left(1-\alpha_f\right)\Delta{}t\left(\dfrac{\gamma}{2\beta}-1\right)a_n\right) -\end{multline} - -By denoting some constants as -\begin{gather*} -C_0=\dfrac{1-\alpha_m}{\beta\Delta{}t^2},\quad -C_1=\left(1-\alpha_f\right)\dfrac{\gamma{}}{\beta\Delta{}t},\quad -C_2=\dfrac{1-\alpha_m}{\beta\Delta{}t},\quad -C_3=\dfrac{1-\alpha_m}{2\beta}-1,\quad -C_4=\gamma\dfrac{1-\alpha_f}{\beta}-1,\\ -C_5=\left(1-\alpha_f\right)\Delta{}t\left(\dfrac{\gamma}{2\beta}-1\right),\quad -C_6=\Delta{}t-\Delta{}t\gamma,\quad -C_7=\Delta{}t\gamma{},\quad -C_8=1-\alpha_f,\quad -C_9=\alpha_f,\\ -C_{10}=\dfrac{1}{\beta\Delta{}t^2},\quad -C_{11}=-\dfrac{1}{\beta\Delta{}t},\quad -C_{12}=1-\dfrac{1}{2\beta}, -\end{gather*} -the EOM can be simplified as -\begin{gather} -\left(C_8K+C_0M+C_1C\right)d_{n+1}=F-KC_9d_n+M\left(C_0d_n+C_2v_n+C_3a_n\right)+C\left(C_1d_n+C_4v_n+C_5a_n\right). -\end{gather} - -Hence the equivalent stiffness and resistance can be written as -\begin{gather} -\bar{K}=C_8K+C_0M+C_1C,\\ -\bar{R}=F+M\left(C_0d_n+C_2v_n+C_3a_n\right)+C\left(C_1d_n+C_4v_n+C_5a_n\right)-KC_9d_n, -\end{gather} -so that +\section{Effective Stiffness} +The effective stiffness can be computed as \begin{gather} -\bar{K}d_{n+1}=\bar{R}. +\bar{K}=\left(1-\alpha_m\right)\dfrac{1}{\beta\Delta{}t^2}M+\left(1-\alpha_f\right)\dfrac{\gamma}{\beta\Delta{}t}C+\left(1-\alpha_f\right)K, \end{gather} - -After solving the displacement $d_{n+1}$, the acceleration $a_{n+1}$ can be recovered as +with $\Delta{}d=d_{n+1}-d_n$ be the unknown variable. Once converges, \begin{gather} -a_{n+1}=C_{10}d_{n+1}-C_{10}d_n+C_{11}v_n+C_{12}a_n, +a_{n+1}=\dfrac{1}{\beta\Delta{}t^2}\Delta{}d-\dfrac{1}{\beta\Delta{}t}v_n+\left(1-\dfrac{1}{2\beta}\right)a_n,\\ +v_{n+1}=v_n+\Delta{}t\left(1-\gamma\right)a_n+\Delta{}t\gamma{}a_{n+1}. \end{gather} -and further the velocity $v_{n+1}$ +Or, \begin{gather} -v_{n+1}=v_n+C_6a_n+C_7a_{n+1}. +\Delta{}a=\dfrac{1}{\beta\Delta{}t^2}\Delta{}d-\dfrac{1}{\beta\Delta{}t}v_n-\dfrac{1}{2\beta}a_n,\\ +\Delta{}v=\Delta{}ta_n+\Delta{}t\gamma{}\Delta{}a. \end{gather} -\end{document} +\end{document} \ No newline at end of file diff --git a/Solver/Integrator/GeneralizedAlphaExplicit.cpp b/Solver/Integrator/GeneralizedAlphaExplicit.cpp new file mode 100644 index 000000000..66fee4a74 --- /dev/null +++ b/Solver/Integrator/GeneralizedAlphaExplicit.cpp @@ -0,0 +1,138 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ + +#include "GeneralizedAlphaExplicit.h" +#include +#include + +GeneralizedAlphaExplicit::GeneralizedAlphaExplicit(const unsigned T, const double R) + : ExplicitIntegrator(T) + , B((R * R - 5. * R + 10) / 6. / (R - 2.) / (R + 1.)) + , AM((2. * R - 1) / (1. + R)) + , AF(AM - .5) {} + +bool GeneralizedAlphaExplicit::has_corrector() const { return true; } + +void GeneralizedAlphaExplicit::assemble_resistance() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + auto fa = std::async([&] { D->assemble_resistance(); }); + auto fb = std::async([&] { D->assemble_damping_force(); }); + auto fc = std::async([&] { D->assemble_inertial_force(); }); + + fa.get(); + fb.get(); + fc.get(); + + W->set_sushi(W->get_trial_resistance() - AF * W->get_incre_resistance() + W->get_trial_damping_force() - AF * W->get_incre_damping_force() + W->get_trial_inertial_force() - AM * W->get_incre_inertial_force()); +} + +void GeneralizedAlphaExplicit::assemble_matrix() { get_domain()->assemble_trial_mass(); } + +vec GeneralizedAlphaExplicit::get_force_residual() { return ExplicitIntegrator::get_force_residual() / (1. - AM); } + +vec GeneralizedAlphaExplicit::get_displacement_residual() { return ExplicitIntegrator::get_displacement_residual() / (1. - AM); } + +sp_mat GeneralizedAlphaExplicit::get_reference_load() { return ExplicitIntegrator::get_reference_load() / (1. - AM); } + +int GeneralizedAlphaExplicit::process_load() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + const sp_d auto current_time = W->get_current_time(); + const sp_d auto trial_time = W->get_trial_time(); + + W->update_trial_time(AF * current_time + (1. - AF) * trial_time); + + const auto code = ExplicitIntegrator::process_load(); + + W->update_trial_time(trial_time); + + return code; +} + +int GeneralizedAlphaExplicit::process_constraint() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + const sp_d auto current_time = W->get_current_time(); + const sp_d auto trial_time = W->get_trial_time(); + + W->update_trial_time(AF * current_time + (1. - AF) * trial_time); + + const auto code = ExplicitIntegrator::process_constraint(); + + W->update_trial_time(trial_time); + + return code; +} + +int GeneralizedAlphaExplicit::process_load_resistance() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + const sp_d auto current_time = W->get_current_time(); + const sp_d auto trial_time = W->get_trial_time(); + + W->update_trial_time(AF * current_time + (1. - AF) * trial_time); + + const auto code = ExplicitIntegrator::process_load_resistance(); + + W->update_trial_time(trial_time); + + return code; +} + +int GeneralizedAlphaExplicit::process_constraint_resistance() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + const sp_d auto current_time = W->get_current_time(); + const sp_d auto trial_time = W->get_trial_time(); + + W->update_trial_time(AF * current_time + (1. - AF) * trial_time); + + const auto code = ExplicitIntegrator::process_constraint_resistance(); + + W->update_trial_time(trial_time); + + return code; +} + +int GeneralizedAlphaExplicit::update_trial_status() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + W->update_incre_displacement(DT * W->get_current_velocity() + (.5 - B) * DT * DT * W->get_current_acceleration()); + W->update_incre_velocity(DT * W->get_current_acceleration()); + + return D->update_trial_status(); +} + +int GeneralizedAlphaExplicit::correct_trial_status() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + W->update_trial_displacement_by(B * DT * DT * W->get_trial_acceleration()); + + return D->update_trial_status(); +} + +void GeneralizedAlphaExplicit::update_parameter(const double NT) { DT = NT; } + +void GeneralizedAlphaExplicit::print() { suanpan_info("An explicit GeneralizedAlpha solver.\n"); } diff --git a/Solver/Integrator/GeneralizedAlphaExplicit.h b/Solver/Integrator/GeneralizedAlphaExplicit.h new file mode 100644 index 000000000..d94751033 --- /dev/null +++ b/Solver/Integrator/GeneralizedAlphaExplicit.h @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ +/** + * @class GeneralizedAlphaExplicit + * @brief A GeneralizedAlphaExplicit class defines a solver using GeneralizedAlphaExplicit algorithm. + * + * @author tlc + * @date 03/12/2022 + * @version 0.1.0 + * @file GeneralizedAlphaExplicit.h + * @addtogroup Integrator + * @{ + */ + +#ifndef GENERALIZEDALPHAEXPLICIT_H +#define GENERALIZEDALPHAEXPLICIT_H + +#include "Integrator.h" + +class GeneralizedAlphaExplicit final : public ExplicitIntegrator { + const double B, AM, AF; + double DT{0.}; + +public: + GeneralizedAlphaExplicit(unsigned, double); + + [[nodiscard]] bool has_corrector() const override; + + void assemble_resistance() override; + void assemble_matrix() override; + + vec get_force_residual() override; + vec get_displacement_residual() override; + sp_mat get_reference_load() override; + + [[nodiscard]] int process_load() override; + [[nodiscard]] int process_constraint() override; + [[nodiscard]] int process_load_resistance() override; + [[nodiscard]] int process_constraint_resistance() override; + + int update_trial_status() override; + int correct_trial_status() override; + + void update_parameter(double) override; + + void print() override; +}; + +#endif + +//! @} diff --git a/Solver/Integrator/Integrator b/Solver/Integrator/Integrator index 7b125cbfe..7908516f5 100644 --- a/Solver/Integrator/Integrator +++ b/Solver/Integrator/Integrator @@ -1,11 +1,15 @@ #include "Integrator.h" +#include "BatheExplicit.h" #include "BatheTwoStep.h" -#include "GSSSS.h" #include "GeneralizedAlpha.h" +#include "GeneralizedAlphaExplicit.h" +#include "GSSSS.h" #include "LeeNewmark.h" #include "LeeNewmarkBase.h" #include "LeeNewmarkFull.h" #include "Newmark.h" +#include "OALTS.h" #include "RayleighNewmark.h" +#include "Tchamwa.h" #include "WilsonPenzienNewmark.h" \ No newline at end of file diff --git a/Solver/Integrator/Integrator.cpp b/Solver/Integrator/Integrator.cpp index c29fd791c..50f47e88e 100644 --- a/Solver/Integrator/Integrator.cpp +++ b/Solver/Integrator/Integrator.cpp @@ -17,7 +17,7 @@ #include "Integrator.h" #include -#include +#include Integrator::Integrator(const unsigned T) : Tag(T) { suanpan_debug("Integrator %u ctor() called.\n", T); } @@ -26,7 +26,7 @@ Integrator::~Integrator() { suanpan_debug("Integrator %u dtor() called.\n", get_ void Integrator::set_domain(const weak_ptr& D) { if(database.lock() != D.lock()) database = D; } -const weak_ptr& Integrator::get_domain() const { return database; } +shared_ptr Integrator::get_domain() const { return database.lock(); } int Integrator::initialize() { if(nullptr != database.lock()) return SUANPAN_SUCCESS; @@ -44,6 +44,14 @@ void Integrator::set_time_step_switch(const bool T) { time_step_switch = T; } */ bool Integrator::allow_to_change_time_step() const { return time_step_switch; } +void Integrator::set_matrix_assembled_switch(const bool T) { matrix_assembled_switch = T; } + +bool Integrator::matrix_is_assembled() const { return matrix_assembled_switch; } + +bool Integrator::has_corrector() const { return false; } + +bool Integrator::time_independent_matrix() const { return true; } + int Integrator::process_load() { return database.lock()->process_load(true); } /** @@ -54,7 +62,7 @@ int Integrator::process_load() { return database.lock()->process_load(true); } */ int Integrator::process_constraint() { const auto& D = database.lock(); - const auto& W = D->get_factory(); + auto& W = D->get_factory(); const auto code = D->process_constraint(true); @@ -70,7 +78,7 @@ int Integrator::process_criterion() { return database.lock()->process_criterion( int Integrator::process_modifier() { return database.lock()->process_modifier(); } -int Integrator::process_load_resistance() { return SUANPAN_SUCCESS; } +int Integrator::process_load_resistance() { return database.lock()->process_load(false); } /** * This method is similar to process_constraint(), but it only updates the global residual vector. @@ -81,7 +89,7 @@ int Integrator::process_load_resistance() { return SUANPAN_SUCCESS; } */ int Integrator::process_constraint_resistance() { const auto& D = database.lock(); - const auto& W = D->get_factory(); + auto& W = D->get_factory(); const auto code = D->process_constraint(false); @@ -94,7 +102,7 @@ void Integrator::record() const { database.lock()->record(); } void Integrator::assemble_resistance() { const auto& D = database.lock(); - const auto& W = D->get_factory(); + auto& W = D->get_factory(); D->assemble_resistance(); W->set_sushi(W->get_trial_resistance()); } @@ -116,7 +124,7 @@ void Integrator::assemble_matrix() { */ vec Integrator::get_force_residual() { const auto& D = database.lock(); - const auto& W = D->get_factory(); + auto& W = D->get_factory(); vec residual = W->get_trial_load() - W->get_sushi(); @@ -131,7 +139,7 @@ vec Integrator::get_force_residual() { */ vec Integrator::get_displacement_residual() { const auto& D = database.lock(); - const auto& W = D->get_factory(); + auto& W = D->get_factory(); vec residual = W->get_reference_load() * W->get_trial_load_factor() + W->get_trial_load() - W->get_sushi(); @@ -144,14 +152,14 @@ vec Integrator::get_displacement_residual() { * Assemble the global residual vector due to nonlinear constraints implemented via the multiplier method. */ vec Integrator::get_auxiliary_residual() { - const auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); return W->get_auxiliary_load() - W->get_auxiliary_resistance(); } sp_mat Integrator::get_reference_load() { return database.lock()->get_factory()->get_reference_load(); } -sp_mat Integrator::get_auxiliary_stiffness() { return database.lock()->get_factory()->get_auxiliary_stiffness(); } +const vec& Integrator::get_trial_displacement() const { return database.lock()->get_factory()->get_trial_displacement(); } void Integrator::update_load() { database.lock()->update_load(); } @@ -160,35 +168,75 @@ void Integrator::update_constraint() { database.lock()->update_constraint(); } void Integrator::update_trial_load_factor(const double lambda) { update_trial_load_factor(vec{lambda}); } void Integrator::update_trial_load_factor(const vec& lambda) { - const auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); W->update_trial_load_factor_by(lambda); } -void Integrator::update_trial_displacement(const vec& ninja) { - const auto& W = get_domain().lock()->get_factory(); - W->update_trial_displacement_by(ninja); +void Integrator::update_from_ninja() { + auto& W = get_domain()->get_factory(); + W->update_trial_displacement_by(W->get_ninja()); } void Integrator::update_trial_time(const double T) { - const auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); W->update_trial_time(T); update_parameter(W->get_incre_time()); } void Integrator::update_incre_time(const double T) { - const auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); W->update_incre_time(T); update_parameter(W->get_incre_time()); } -int Integrator::update_trial_status() { return database.lock()->update_trial_status(); } +int Integrator::update_trial_status() { + const auto& D = get_domain(); + auto& W = D->get_factory(); -int Integrator::update_incre_status() { return database.lock()->update_incre_status(); } + return suanpan::approx_equal(norm(W->get_incre_displacement()), 0.) ? SUANPAN_SUCCESS : D->update_trial_status(); +} + +int Integrator::correct_trial_status() { return SUANPAN_SUCCESS; } + +/** + * When a new displacement increment is computed, it is added to global displacement vector. + * At this moment, nodal and elemental quantities are all computed from the previous displacement + * vector, directly committing the new results causes out-of-sync issue. + * Some algorithms use predictor-corrector type scheme, which means the converged quantities are + * different from the committed quantities. + * This method is in charge of syncing quantities between global and local quantities by updating + * nodal/elemental quantities using the committed quantities. + */ +int Integrator::sync_status(const bool only_correct) { + auto handle_force = [&] { + // process modifiers + if(SUANPAN_SUCCESS != process_modifier()) return SUANPAN_FAIL; + // assemble resistance + assemble_resistance(); + return SUANPAN_SUCCESS; + }; + + // only perform corrector if defined + if(only_correct) { + if(!has_corrector()) return SUANPAN_SUCCESS; + + if(SUANPAN_SUCCESS != correct_trial_status()) return SUANPAN_FAIL; + + return handle_force(); + } + + // perform corrector/predictor depending on the algorithm + if(SUANPAN_SUCCESS != (has_corrector() ? correct_trial_status() : update_trial_status())) return SUANPAN_FAIL; + + return handle_force(); +} /** - * Must change ninja to the real displacement increment. + * Some algorithms solve a system which differs from the original one. + * The size of the problem changes thus the computed increment contains additional internal + * quantities. This methods updates internal quantities stored in those integrators. */ -int Integrator::update_internal(const mat&) { return 0; } +int Integrator::update_internal(const mat&) { return SUANPAN_SUCCESS; } mat Integrator::solve(const mat& B) { mat X; @@ -227,7 +275,13 @@ int Integrator::solve(mat& X, sp_mat&& B) { return database.lock()->get_factory( * The penalty method can apply homogeneous constraints approximately. * The corresponding DoF shall be set to zero after solving the system. */ -void Integrator::erase_machine_error() const { database.lock()->erase_machine_error(); } +void Integrator::erase_machine_error(vec& ninja) const { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + D->erase_machine_error(ninja); + get_ninja(W) = ninja.head(W->get_size()); +} void Integrator::stage_and_commit_status() { stage_status(); @@ -236,44 +290,27 @@ void Integrator::stage_and_commit_status() { void Integrator::stage_status() { database.lock()->stage_status(); } -void Integrator::commit_status() { - database.lock()->commit_status(); - update_compatibility(); -} +void Integrator::commit_status() { database.lock()->commit_status(); } void Integrator::clear_status() { + matrix_assembled_switch = false; database.lock()->clear_status(); - update_compatibility(); } -void Integrator::reset_status() { - database.lock()->reset_status(); - update_compatibility(); -} +void Integrator::reset_status() { database.lock()->reset_status(); } /** - * When tim step changes, some parameters may need to be updated. + * When time step changes, some parameters may need to be updated. */ void Integrator::update_parameter(double) {} -/** - * Make sure that the trial displacement/velocity/acceleration are consistent with each other. - * When starting a new trial state, the trial displacement is identical to the current displacement. - * This essentially means that the displacement increment is zero. - * To have such a trial state with the given time step, the trial velocity and acceleration shall be - * updated to be compatible with the trial displacement. - * - * On exit, trial velocity and acceleration should be computed from current/trial displacement. - */ -void Integrator::update_compatibility() const {} - /** * When external loads are applied, they can be applied in forms of displacement/velocity/acceleration. * The time integration methods, by default, form effective stiffness matrices in displacement domain. * That is, in AX=B, A is the effective stiffness matrix and X is the displacement increment. * Thus, loads in velocity/acceleration must be converted to displacement. * This cannot be done arbitrarily due to compatibility issues. - * This method takes velocity increment and converts it to displacement increment. + * This method takes velocity increment and converts it to TOTAL displacement. */ vec Integrator::from_incre_velocity(const vec&, const uvec& encoding) { return zeros(encoding.n_elem); } @@ -283,12 +320,12 @@ vec Integrator::from_incre_velocity(const vec&, const uvec& encoding) { return z * That is, in AX=B, A is the effective stiffness matrix and X is the displacement increment. * Thus, loads in velocity/acceleration must be converted to displacement. * This cannot be done arbitrarily due to compatibility issues. - * This method takes acceleration increment and converts it to displacement increment. + * This method takes acceleration increment and converts it to TOTAL displacement. */ vec Integrator::from_incre_acceleration(const vec&, const uvec& encoding) { return zeros(encoding.n_elem); } vec Integrator::from_total_velocity(const vec& total_velocity, const uvec& encoding) { - const auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); if(AnalysisType::DYNAMICS != W->get_analysis_type()) return zeros(encoding.n_elem); @@ -296,7 +333,7 @@ vec Integrator::from_total_velocity(const vec& total_velocity, const uvec& encod } vec Integrator::from_total_acceleration(const vec& total_acceleration, const uvec& encoding) { - const auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); if(AnalysisType::DYNAMICS != W->get_analysis_type()) return zeros(encoding.n_elem); @@ -318,3 +355,26 @@ vec Integrator::from_incre_acceleration(const double magnitude, const uvec& enco vec Integrator::from_total_velocity(const double magnitude, const uvec& encoding) { return from_total_velocity(vec(encoding.n_elem, fill::value(magnitude)), encoding); } vec Integrator::from_total_acceleration(const double magnitude, const uvec& encoding) { return from_total_acceleration(vec(encoding.n_elem, fill::value(magnitude)), encoding); } + +bool ImplicitIntegrator::time_independent_matrix() const { return false; } + +const vec& ExplicitIntegrator::get_trial_displacement() const { return get_domain()->get_factory()->get_trial_acceleration(); } + +void ExplicitIntegrator::update_from_ninja() { + const auto& W = get_domain()->get_factory(); + W->update_trial_acceleration_by(W->get_ninja()); +} + +int ExplicitIntegrator::solve(mat& X, const mat& B) { return get_domain()->get_factory()->get_mass()->solve(X, B); } + +int ExplicitIntegrator::solve(mat& X, const sp_mat& B) { return get_domain()->get_factory()->get_mass()->solve(X, B); } + +int ExplicitIntegrator::solve(mat& X, mat&& B) { return get_domain()->get_factory()->get_mass()->solve(X, std::forward(B)); } + +int ExplicitIntegrator::solve(mat& X, sp_mat&& B) { return get_domain()->get_factory()->get_mass()->solve(X, std::forward(B)); } + +vec ExplicitIntegrator::from_incre_velocity(const vec&, const uvec&) { throw invalid_argument("support velocity cannot be used with explicit integrator"); } + +vec ExplicitIntegrator::from_incre_acceleration(const vec& incre_acceleration, const uvec& encoding) { return get_domain()->get_factory()->get_current_acceleration()(encoding) + incre_acceleration; } + +vec ExplicitIntegrator::from_total_acceleration(const vec& total_acceleration, const uvec&) { return total_acceleration; } diff --git a/Solver/Integrator/Integrator.h b/Solver/Integrator/Integrator.h index 871a048fd..7ec9ffb84 100644 --- a/Solver/Integrator/Integrator.h +++ b/Solver/Integrator/Integrator.h @@ -43,8 +43,14 @@ class DomainBase; +enum class IntegratorType { + Implicit, + Explicit +}; + class Integrator : public Tag { bool time_step_switch = true; + bool matrix_assembled_switch = false; weak_ptr database; @@ -57,14 +63,23 @@ class Integrator : public Tag { ~Integrator() override; void set_domain(const weak_ptr&); - [[nodiscard]] const weak_ptr& get_domain() const; + [[nodiscard]] shared_ptr get_domain() const; virtual int initialize(); + [[nodiscard]] virtual constexpr IntegratorType type() const { return IntegratorType::Implicit; } + // ! some multistep integrators may require fixed time step for some consecutive sub-steps void set_time_step_switch(bool); [[nodiscard]] bool allow_to_change_time_step() const; + // ! manually set switch after assembling global matrix + void set_matrix_assembled_switch(bool); + [[nodiscard]] bool matrix_is_assembled() const; + + [[nodiscard]] virtual bool has_corrector() const; + [[nodiscard]] virtual bool time_independent_matrix() const; + [[nodiscard]] virtual int process_load(); [[nodiscard]] virtual int process_constraint(); [[nodiscard]] virtual int process_criterion(); @@ -81,19 +96,23 @@ class Integrator : public Tag { virtual vec get_displacement_residual(); virtual vec get_auxiliary_residual(); virtual sp_mat get_reference_load(); - virtual sp_mat get_auxiliary_stiffness(); + + [[nodiscard]] virtual const vec& get_trial_displacement() const; virtual void update_load(); virtual void update_constraint(); virtual void update_trial_load_factor(double); virtual void update_trial_load_factor(const vec&); - virtual void update_trial_displacement(const vec&); + virtual void update_from_ninja(); + + virtual void update_trial_time(double); + virtual void update_incre_time(double); - void update_trial_time(double); - void update_incre_time(double); virtual int update_trial_status(); - virtual int update_incre_status(); + virtual int correct_trial_status(); + + virtual int sync_status(bool); virtual int update_internal(const mat&); @@ -106,9 +125,9 @@ class Integrator : public Tag { virtual int solve(mat&, mat&&); virtual int solve(mat&, sp_mat&&); - virtual void erase_machine_error() const; + virtual void erase_machine_error(vec&) const; - virtual void stage_and_commit_status(); + void stage_and_commit_status(); virtual void stage_status(); virtual void commit_status(); @@ -116,18 +135,47 @@ class Integrator : public Tag { virtual void reset_status(); virtual void update_parameter(double); - virtual void update_compatibility() const; virtual vec from_incre_velocity(const vec&, const uvec&); // obtain target displacement from increment of velocity virtual vec from_incre_acceleration(const vec&, const uvec&); // obtain target displacement from increment of acceleration - vec from_total_velocity(const vec&, const uvec&); - vec from_total_acceleration(const vec&, const uvec&); + virtual vec from_total_velocity(const vec&, const uvec&); + virtual vec from_total_acceleration(const vec&, const uvec&); vec from_incre_velocity(double, const uvec&); vec from_incre_acceleration(double, const uvec&); vec from_total_velocity(double, const uvec&); vec from_total_acceleration(double, const uvec&); }; +class ImplicitIntegrator : public Integrator { +public: + using Integrator::Integrator; + + [[nodiscard]] constexpr IntegratorType type() const override { return IntegratorType::Implicit; } + + [[nodiscard]] bool time_independent_matrix() const override; +}; + +class ExplicitIntegrator : public Integrator { +public: + using Integrator::Integrator; + + [[nodiscard]] constexpr IntegratorType type() const override { return IntegratorType::Explicit; } + + [[nodiscard]] const vec& get_trial_displacement() const override; + + void update_from_ninja() override; + + int solve(mat&, const mat&) override; + int solve(mat&, const sp_mat&) override; + int solve(mat&, mat&&) override; + int solve(mat&, sp_mat&&) override; + + vec from_incre_velocity(const vec&, const uvec&) override; + + vec from_incre_acceleration(const vec&, const uvec&) override; // obtain target acceleration from increment of acceleration + vec from_total_acceleration(const vec&, const uvec&) override; +}; + #endif //! @} diff --git a/Solver/Integrator/LeeNewmark.cpp b/Solver/Integrator/LeeNewmark.cpp index c2f899a63..bf8e3bd06 100644 --- a/Solver/Integrator/LeeNewmark.cpp +++ b/Solver/Integrator/LeeNewmark.cpp @@ -98,10 +98,10 @@ int LeeNewmark::initialize() { } int LeeNewmark::process_constraint() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); // process constraint for the first time to obtain proper stiffness - if(SUANPAN_SUCCESS != Integrator::process_constraint()) return SUANPAN_FAIL; + if(SUANPAN_SUCCESS != LeeNewmarkBase::process_constraint()) return SUANPAN_FAIL; // this stiffness contains geometry, mass and damping which are handled in Newmark::assemble_matrix() auto& t_stiff = get_stiffness(factory); @@ -114,34 +114,7 @@ int LeeNewmark::process_constraint() { initialize_mass(D); } - else { - // if not first iteration - // erase the tangent stiffness entries - - uword *ptr_a, *ptr_b; - - if(t_triplet.is_csc_sorted()) { - ptr_a = t_triplet.col_mem(); - ptr_b = t_triplet.row_mem(); - } - else if(t_triplet.is_csr_sorted()) { - ptr_a = t_triplet.row_mem(); - ptr_b = t_triplet.col_mem(); - } - else { - suanpan_error("the system is not sorted while entering iteration, please file a bug report.\n"); - return SUANPAN_FAIL; - } - - const auto& val = t_triplet.val_mem(); - - for(uword I = 0; I < t_triplet.n_elem; ++I) { - // quit if current column/row is beyond the original size of matrix - if(ptr_a[I] >= n_block) break; - // erase existing entries if fall in intact stiffness matrix - if(ptr_b[I] < n_block) val[I] = 0.; - } - } + else if(SUANPAN_SUCCESS != erase_top_left_block()) return SUANPAN_FAIL; t_stiff += C1 * CM * current_mass; @@ -156,7 +129,7 @@ int LeeNewmark::process_constraint() { // check in constant terms that does not change in the substep initialize_stiffness(D); - if(SUANPAN_SUCCESS != Integrator::process_constraint()) return SUANPAN_FAIL; + if(SUANPAN_SUCCESS != LeeNewmarkBase::process_constraint()) return SUANPAN_FAIL; t_stiff->csc_condense(); current_stiffness.swap(t_stiff); @@ -170,8 +143,14 @@ int LeeNewmark::process_constraint() { return SUANPAN_SUCCESS; } +int LeeNewmark::process_constraint_resistance() { + update_residual(); + + return LeeNewmarkBase::process_constraint_resistance(); +} + void LeeNewmark::assemble_resistance() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); const auto& W = factory; D->assemble_resistance(); diff --git a/Solver/Integrator/LeeNewmark.h b/Solver/Integrator/LeeNewmark.h index c13edaf7c..48b8d3b45 100644 --- a/Solver/Integrator/LeeNewmark.h +++ b/Solver/Integrator/LeeNewmark.h @@ -61,6 +61,7 @@ class LeeNewmark : public LeeNewmarkBase { int initialize() override; int process_constraint() override; + int process_constraint_resistance() override; void assemble_resistance() override; diff --git a/Solver/Integrator/LeeNewmarkBase.cpp b/Solver/Integrator/LeeNewmarkBase.cpp index db685ffe7..20a58765a 100644 --- a/Solver/Integrator/LeeNewmarkBase.cpp +++ b/Solver/Integrator/LeeNewmarkBase.cpp @@ -19,6 +19,36 @@ #include #include +int LeeNewmarkBase::erase_top_left_block() const { + auto& t_triplet = stiffness->triplet_mat; + + uword *ptr_a, *ptr_b; + + if(t_triplet.is_csc_sorted()) { + ptr_a = t_triplet.col_mem(); + ptr_b = t_triplet.row_mem(); + } + else if(t_triplet.is_csr_sorted()) { + ptr_a = t_triplet.row_mem(); + ptr_b = t_triplet.col_mem(); + } + else { + suanpan_error("the system is not sorted while entering iteration, please file a bug report.\n"); + return SUANPAN_FAIL; + } + + const auto& val = t_triplet.val_mem(); + + for(uword I = 0; I < t_triplet.n_elem; ++I) { + // quit if current column/row is beyond the original size of matrix + if(ptr_a[I] >= n_block) break; + // erase existing entries if fall in intact stiffness matrix + if(ptr_b[I] < n_block) val[I] = 0.; + } + + return SUANPAN_SUCCESS; +} + LeeNewmarkBase::LeeNewmarkBase(const unsigned T, const double A, const double B, const StiffnessType ST) : Newmark(T, A, B) , n_block(0) @@ -27,7 +57,7 @@ LeeNewmarkBase::LeeNewmarkBase(const unsigned T, const double A, const double B, int LeeNewmarkBase::initialize() { if(Newmark::initialize() != SUANPAN_SUCCESS) return SUANPAN_FAIL; - factory = get_domain().lock()->get_factory(); + factory = get_domain()->get_factory(); access::rw(n_block) = factory->get_size(); @@ -53,10 +83,6 @@ int LeeNewmarkBase::initialize() { int LeeNewmarkBase::update_internal(const mat& t_internal) { trial_internal += t_internal; - // order matters - // cannot resize before assignment - get_ninja(factory).resize(n_block); - return SUANPAN_SUCCESS; } diff --git a/Solver/Integrator/LeeNewmarkBase.h b/Solver/Integrator/LeeNewmarkBase.h index 708611632..d36f6126b 100644 --- a/Solver/Integrator/LeeNewmarkBase.h +++ b/Solver/Integrator/LeeNewmarkBase.h @@ -61,6 +61,8 @@ class LeeNewmarkBase : public Newmark { virtual void update_stiffness() const = 0; virtual void update_residual() const = 0; + int erase_top_left_block() const; + public: explicit LeeNewmarkBase(unsigned, double, double, StiffnessType = StiffnessType::CURRENT); diff --git a/Solver/Integrator/LeeNewmarkFull.cpp b/Solver/Integrator/LeeNewmarkFull.cpp index 024de0369..39949b9dc 100644 --- a/Solver/Integrator/LeeNewmarkFull.cpp +++ b/Solver/Integrator/LeeNewmarkFull.cpp @@ -359,10 +359,10 @@ int LeeNewmarkFull::initialize() { } int LeeNewmarkFull::process_constraint() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); // process constraint for the first time to obtain proper stiffness - if(SUANPAN_SUCCESS != Integrator::process_constraint()) return SUANPAN_FAIL; + if(SUANPAN_SUCCESS != LeeNewmarkBase::process_constraint()) return SUANPAN_FAIL; // this stiffness contains geometry, mass and damping from Newmark::assemble_matrix() auto& t_stiff = factory->get_stiffness()->triplet_mat; @@ -461,7 +461,7 @@ int LeeNewmarkFull::process_constraint() { f_mass.get(); // now apply constraints - if(SUANPAN_SUCCESS != Integrator::process_constraint()) return SUANPAN_FAIL; + if(SUANPAN_SUCCESS != LeeNewmarkBase::process_constraint()) return SUANPAN_FAIL; t_stiff.csc_condense(); // move original stiffness matrix back @@ -497,30 +497,7 @@ int LeeNewmarkFull::process_constraint() { else { // if not first iteration // erase the tangent stiffness entries - - uword *ptr_a, *ptr_b; - - if(t_triplet.is_csc_sorted()) { - ptr_a = t_triplet.col_mem(); - ptr_b = t_triplet.row_mem(); - } - else if(t_triplet.is_csr_sorted()) { - ptr_a = t_triplet.row_mem(); - ptr_b = t_triplet.col_mem(); - } - else { - suanpan_error("the system is not sorted while entering iteration, please file a bug report.\n"); - return SUANPAN_FAIL; - } - - const auto& val = t_triplet.val_mem(); - - for(uword I = 0; I < t_triplet.n_elem; ++I) { - // quit if current column/row is beyond the original size of matrix - if(ptr_a[I] >= n_block) break; - // erase existing entries if fall in intact stiffness matrix - if(ptr_b[I] < n_block) val[I] = 0.; - } + if(SUANPAN_SUCCESS != erase_top_left_block()) return SUANPAN_FAIL; // check in original nonzero entries in unrolled damping matrix stiffness += rabbit; @@ -533,4 +510,17 @@ int LeeNewmarkFull::process_constraint() { return SUANPAN_SUCCESS; } +int LeeNewmarkFull::process_constraint_resistance() { + if(SUANPAN_SUCCESS != erase_top_left_block()) return SUANPAN_FAIL; + + // check in original nonzero entries in unrolled damping matrix + stiffness += rabbit; + + update_residual(); + + stiffness += factory->get_stiffness()->triplet_mat; + + return LeeNewmarkBase::process_constraint_resistance(); +} + void LeeNewmarkFull::print() { suanpan_info("A Newmark solver using Lee's damping model with adjustable bandwidth using %s stiffness. doi: 10.1016/j.compstruc.2020.106423 and 10.1016/j.compstruc.2021.106663\n", stiffness_type == StiffnessType::TRIAL ? "tangent" : stiffness_type == StiffnessType::CURRENT ? "converged" : "initial"); } diff --git a/Solver/Integrator/LeeNewmarkFull.h b/Solver/Integrator/LeeNewmarkFull.h index e54b38754..00df1aa52 100644 --- a/Solver/Integrator/LeeNewmarkFull.h +++ b/Solver/Integrator/LeeNewmarkFull.h @@ -91,6 +91,7 @@ class LeeNewmarkFull final : public LeeNewmarkBase { int initialize() override; int process_constraint() override; + int process_constraint_resistance() override; void print() override; }; diff --git a/Solver/Integrator/Newmark.cpp b/Solver/Integrator/Newmark.cpp index b6b9d1eab..7c9c0e13d 100644 --- a/Solver/Integrator/Newmark.cpp +++ b/Solver/Integrator/Newmark.cpp @@ -18,15 +18,14 @@ #include "Newmark.h" #include #include -#include Newmark::Newmark(const unsigned T, const double A, const double B) - : Integrator(T) + : ImplicitIntegrator(T) , beta(A) , gamma(B) {} void Newmark::assemble_resistance() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); auto fa = std::async([&] { D->assemble_resistance(); }); @@ -41,7 +40,7 @@ void Newmark::assemble_resistance() { } void Newmark::assemble_matrix() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); auto fa = std::async([&] { D->assemble_trial_stiffness(); }); @@ -58,7 +57,7 @@ void Newmark::assemble_matrix() { } int Newmark::update_trial_status() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); W->update_incre_acceleration(C0 * W->get_incre_displacement() - C2 * W->get_current_velocity() - C4 * W->get_current_acceleration()); @@ -67,31 +66,14 @@ int Newmark::update_trial_status() { return D->update_trial_status(); } -/** - * \brief update acceleration and velocity for zero displacement increment - */ -void Newmark::update_compatibility() const { - const auto& D = get_domain().lock(); - auto& W = D->get_factory(); - - W->update_incre_acceleration(-C2 * W->get_current_velocity() - C4 * W->get_current_acceleration()); - W->update_incre_velocity(C5 * W->get_current_acceleration() + C3 * W->get_incre_acceleration()); - - auto& trial_dsp = W->get_trial_displacement(); - auto& trial_vel = W->get_trial_velocity(); - auto& trial_acc = W->get_trial_acceleration(); - - suanpan::for_all(D->get_node_pool(), [&](const shared_ptr& t_node) { t_node->update_trial_status(trial_dsp, trial_vel, trial_acc); }); -} - vec Newmark::from_incre_velocity(const vec& incre_velocity, const uvec& encoding) { - auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); return incre_velocity / C1 + C5 * W->get_current_velocity()(encoding) + (C3 * C4 - C5) / C1 * W->get_current_acceleration()(encoding) + W->get_current_displacement()(encoding); } vec Newmark::from_incre_acceleration(const vec& incre_acceleration, const uvec& encoding) { - auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); return incre_acceleration / C0 + C5 * W->get_current_velocity()(encoding) + C4 / C0 * W->get_current_acceleration()(encoding) + W->get_current_displacement()(encoding); } diff --git a/Solver/Integrator/Newmark.h b/Solver/Integrator/Newmark.h index 016dbbc5a..0674d7565 100644 --- a/Solver/Integrator/Newmark.h +++ b/Solver/Integrator/Newmark.h @@ -42,7 +42,7 @@ #include "Integrator.h" -class Newmark : public Integrator { +class Newmark : public ImplicitIntegrator { const double beta; /**< parameter = .25 */ const double gamma; /**< parameter = .5 */ protected: @@ -56,7 +56,6 @@ class Newmark : public Integrator { int update_trial_status() override; void update_parameter(double) override; - void update_compatibility() const override; vec from_incre_velocity(const vec&, const uvec&) override; vec from_incre_acceleration(const vec&, const uvec&) override; diff --git a/Solver/Integrator/OALTS.cpp b/Solver/Integrator/OALTS.cpp new file mode 100644 index 000000000..a3c1a9b07 --- /dev/null +++ b/Solver/Integrator/OALTS.cpp @@ -0,0 +1,139 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ + +#include "OALTS.h" +#include +#include + +OALTS::OALTS(const unsigned T, const double R) + : ImplicitIntegrator(T) + , A1((4. * R - 4.) / (3. - R)) + , A2(-1. - A1) + , B0(2. / (1. + R) / (3. - R)) + , B1(2. - 2. * B0 + .5 * A1) + , B2(.5 * A1 + B0) + , B10(B1 / B0) + , B20(B2 / B0) { set_time_step_switch(false); } + +void OALTS::assemble_resistance() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + auto fa = std::async([&] { D->assemble_resistance(); }); + auto fb = std::async([&] { D->assemble_damping_force(); }); + auto fc = std::async([&] { D->assemble_inertial_force(); }); + + fa.get(); + fb.get(); + fc.get(); + + W->set_sushi(W->get_trial_resistance() + W->get_trial_damping_force() + W->get_trial_inertial_force()); +} + +void OALTS::assemble_matrix() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + auto fa = std::async([&] { D->assemble_trial_stiffness(); }); + auto fb = std::async([&] { D->assemble_trial_geometry(); }); + auto fc = std::async([&] { D->assemble_trial_damping(); }); + auto fd = std::async([&] { D->assemble_trial_mass(); }); + + fa.get(); + fb.get(); + fc.get(); + fd.get(); + + if(if_starting) [[unlikely]] W->get_stiffness() += W->get_geometry() + 4. / DT / DT * W->get_mass() + 2. / DT * W->get_damping(); + else [[likely]] W->get_stiffness() += W->get_geometry() + P1 * P1 * W->get_mass() + P1 * W->get_damping(); +} + +int OALTS::update_trial_status() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + if(if_starting) [[unlikely]] + { + W->update_trial_velocity(2. / DT * (W->get_trial_displacement() - W->get_current_displacement()) - W->get_current_velocity()); + W->update_trial_acceleration(2. / DT * (W->get_trial_velocity() - W->get_current_velocity()) - W->get_current_acceleration()); + } + else [[likely]] + { + W->update_trial_velocity(P1 * W->get_trial_displacement() + P2 * W->get_current_displacement() + P3 * W->get_pre_displacement() - B10 * W->get_current_velocity() - B20 * W->get_pre_velocity()); + W->update_trial_acceleration(P1 * W->get_trial_velocity() + P2 * W->get_current_velocity() + P3 * W->get_pre_velocity() - B10 * W->get_current_acceleration() - B20 * W->get_pre_acceleration()); + } + + return D->update_trial_status(); +} + +void OALTS::update_parameter(const double NT) { + if(suanpan::approx_equal(DT, NT)) return; + + DT = NT; + + P1 = 1. / B0 / DT; + P2 = P1 * A1; + P3 = P1 * A2; +} + +void OALTS::commit_status() { + auto& W = get_domain()->get_factory(); + + if_starting = false; + + W->commit_pre_displacement(); + W->commit_pre_velocity(); + W->commit_pre_acceleration(); + + ImplicitIntegrator::commit_status(); +} + +void OALTS::clear_status() { + if_starting = true; + + ImplicitIntegrator::clear_status(); +} + +vec OALTS::from_incre_velocity(const vec& incre_velocity, const uvec& encoding) { + auto& W = get_domain()->get_factory(); + + return from_total_velocity(W->get_current_velocity()(encoding) + incre_velocity, encoding); +} + +vec OALTS::from_incre_acceleration(const vec& incre_acceleration, const uvec& encoding) { + auto& W = get_domain()->get_factory(); + + return from_total_acceleration(W->get_current_acceleration()(encoding) + incre_acceleration, encoding); +} + +vec OALTS::from_total_velocity(const vec& total_velocity, const uvec& encoding) { + auto& W = get_domain()->get_factory(); + + if(if_starting) return .5 * DT * (total_velocity + W->get_current_velocity()(encoding)) + W->get_current_displacement()(encoding); + + return total_velocity / P1 - A1 * W->get_current_displacement()(encoding) - A2 * W->get_pre_displacement()(encoding) + B10 / P1 * W->get_current_velocity()(encoding) + B20 / P1 * W->get_pre_velocity()(encoding); +} + +vec OALTS::from_total_acceleration(const vec& total_acceleration, const uvec& encoding) { + auto& W = get_domain()->get_factory(); + + if(if_starting) return from_total_velocity(.5 * DT * (total_acceleration + W->get_current_acceleration()(encoding)) + W->get_current_velocity()(encoding), encoding); + + return from_total_velocity(total_acceleration / P1 - A1 * W->get_current_velocity()(encoding) - A2 * W->get_pre_velocity()(encoding) + B10 / P1 * W->get_current_acceleration()(encoding) + B20 / P1 * W->get_pre_acceleration()(encoding), encoding); +} + +void OALTS::print() { suanpan_info("A time integrator using the OALTS algorithm.\ndoi:10.1002/nme.6188\n"); } diff --git a/Solver/Integrator/OALTS.h b/Solver/Integrator/OALTS.h new file mode 100644 index 000000000..34eb38ebb --- /dev/null +++ b/Solver/Integrator/OALTS.h @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ +/** + * @class OALTS + * @brief A OALTS class defines a solver using OALTS algorithm. + * + * doi: 10.1002/nme.6188 + * + * @author tlc + * @date 05/12/2022 + * @version 0.1.0 + * @file OALTS.h + * @addtogroup Integrator + * @{ + */ + +#ifndef OALTS_H +#define OALTS_H + +#include "Integrator.h" + +class OALTS final : public ImplicitIntegrator { + const double A1, A2, B0, B1, B2, B10, B20; + + double DT{0.}, P1{0.}, P2{0.}, P3{0.}; + + bool if_starting = true; + +public: + OALTS(unsigned, double); + + void assemble_resistance() override; + void assemble_matrix() override; + + int update_trial_status() override; + + void update_parameter(double) override; + + void commit_status() override; + void clear_status() override; + + vec from_incre_velocity(const vec&, const uvec&) override; + vec from_incre_acceleration(const vec&, const uvec&) override; + vec from_total_velocity(const vec&, const uvec&) override; + vec from_total_acceleration(const vec&, const uvec&) override; + + void print() override; +}; + +#endif + +//! @} diff --git a/Solver/Integrator/RayleighNewmark.cpp b/Solver/Integrator/RayleighNewmark.cpp index 70d604986..0338fcad3 100644 --- a/Solver/Integrator/RayleighNewmark.cpp +++ b/Solver/Integrator/RayleighNewmark.cpp @@ -28,7 +28,7 @@ RayleighNewmark::RayleighNewmark(const unsigned T, const double A, const double , damping_eta(DD) {} void RayleighNewmark::assemble_resistance() { - suanpan::for_all(get_domain().lock()->get_element_pool(), [&](const shared_ptr& t_element) { suanpan::damping::rayleigh::apply(t_element, damping_alpha, damping_beta, damping_zeta, damping_eta); }); + suanpan::for_all(get_domain()->get_element_pool(), [&](const shared_ptr& t_element) { suanpan::damping::rayleigh::apply(t_element, damping_alpha, damping_beta, damping_zeta, damping_eta); }); Newmark::assemble_resistance(); } diff --git a/Solver/Integrator/Tchamwa.cpp b/Solver/Integrator/Tchamwa.cpp new file mode 100644 index 000000000..c81c33e7c --- /dev/null +++ b/Solver/Integrator/Tchamwa.cpp @@ -0,0 +1,55 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ + +#include "Tchamwa.h" +#include +#include + +Tchamwa::Tchamwa(const unsigned T, const double R) + : ExplicitIntegrator(T) + , PHI(2. / (1. + std::max(0., std::min(1., R)))) {} + +void Tchamwa::assemble_resistance() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + auto fa = std::async([&] { D->assemble_resistance(); }); + auto fb = std::async([&] { D->assemble_damping_force(); }); + auto fc = std::async([&] { D->assemble_inertial_force(); }); + + fa.get(); + fb.get(); + fc.get(); + + W->set_sushi(W->get_trial_resistance() + W->get_trial_damping_force() + W->get_trial_inertial_force()); +} + +void Tchamwa::assemble_matrix() { get_domain()->assemble_trial_mass(); } + +int Tchamwa::update_trial_status() { + const auto& D = get_domain(); + auto& W = D->get_factory(); + + W->update_incre_displacement(DT * W->get_current_velocity() + PHI * DT * DT * W->get_current_acceleration()); + W->update_incre_velocity(DT * W->get_current_acceleration()); + + return D->update_trial_status(); +} + +void Tchamwa::update_parameter(const double NT) { DT = NT; } + +void Tchamwa::print() { suanpan_info("A Tchamwa solver.\n"); } diff --git a/Solver/Integrator/Tchamwa.h b/Solver/Integrator/Tchamwa.h new file mode 100644 index 000000000..c7652e3d8 --- /dev/null +++ b/Solver/Integrator/Tchamwa.h @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (C) 2017-2022 Theodore Chang + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ******************************************************************************/ +/** + * @class Tchamwa + * @brief A Tchamwa class defines a solver using Tchamwa algorithm. + * + * @author tlc + * @date 03/12/2022 + * @version 0.1.0 + * @file Tchamwa.h + * @addtogroup Integrator + * @{ + */ + +#ifndef TCHAMWA_H +#define TCHAMWA_H + +#include "Integrator.h" + +class Tchamwa final : public ExplicitIntegrator { + const double PHI; + double DT{0.}; + +public: + Tchamwa(unsigned, double); + + void assemble_resistance() override; + void assemble_matrix() override; + + int update_trial_status() override; + + void update_parameter(double) override; + + void print() override; +}; + +#endif + +//! @} diff --git a/Solver/Integrator/WilsonPenzienNewmark.cpp b/Solver/Integrator/WilsonPenzienNewmark.cpp index 44104c8af..6fdec452a 100644 --- a/Solver/Integrator/WilsonPenzienNewmark.cpp +++ b/Solver/Integrator/WilsonPenzienNewmark.cpp @@ -27,7 +27,7 @@ WilsonPenzienNewmark::WilsonPenzienNewmark(const unsigned T, vec&& DR, const dou int WilsonPenzienNewmark::initialize() { if(SUANPAN_SUCCESS != Newmark::initialize()) return SUANPAN_FAIL; - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); theta.zeros(W->get_size(), damping_ratio.n_elem); @@ -40,7 +40,7 @@ int WilsonPenzienNewmark::process_constraint() { // process constraint for the first time to obtain proper stiffness if(SUANPAN_SUCCESS != Integrator::process_constraint()) return SUANPAN_FAIL; - auto& W = get_domain().lock()->get_factory(); + auto& W = get_domain()->get_factory(); auto& t_stiff = W->get_stiffness(); auto& t_mass = W->get_mass(); @@ -139,7 +139,7 @@ void WilsonPenzienNewmark::reset_status() { } void WilsonPenzienNewmark::assemble_resistance() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); auto fa = std::async([&] { D->assemble_resistance(); }); @@ -156,7 +156,7 @@ void WilsonPenzienNewmark::assemble_resistance() { } void WilsonPenzienNewmark::assemble_matrix() { - const auto& D = get_domain().lock(); + const auto& D = get_domain(); auto& W = D->get_factory(); auto fa = std::async([&] { D->assemble_trial_stiffness(); }); diff --git a/Solver/MPDC.cpp b/Solver/MPDC.cpp index 8736a7ac5..f80962f6f 100644 --- a/Solver/MPDC.cpp +++ b/Solver/MPDC.cpp @@ -10,14 +10,14 @@ MPDC::MPDC(const unsigned T) int MPDC::analyze() { auto& C = get_converger(); auto& G = get_integrator(); - auto& W = G->get_domain().lock()->get_factory(); + const auto& D = G->get_domain(); + auto& W = D->get_factory(); suanpan_info("current analysis time: %.5f.\n", W->get_trial_time()); const auto max_iteration = C->get_max_iteration(); - // ninja anchor - auto& ninja = get_ninja(W); + vec samurai; // get column index for each nonzero dof // uvec load_ref_idx = find(load_ref); @@ -31,54 +31,68 @@ int MPDC::analyze() { unsigned counter = 0; while(true) { + // update for nodes and elements + if(SUANPAN_SUCCESS != G->update_trial_status()) return SUANPAN_FAIL; // process modifiers if(SUANPAN_SUCCESS != G->process_modifier()) return SUANPAN_FAIL; // assemble resistance G->assemble_resistance(); - // assemble stiffness - G->assemble_matrix(); - // process loads - if(SUANPAN_SUCCESS != G->process_load()) return SUANPAN_FAIL; - // process constraints - if(SUANPAN_SUCCESS != G->process_constraint()) return SUANPAN_FAIL; + + if(constant_matrix()) { + // some loads may have resistance + if(SUANPAN_SUCCESS != G->process_load_resistance()) return SUANPAN_FAIL; + // some constraints may have resistance + if(SUANPAN_SUCCESS != G->process_constraint_resistance()) return SUANPAN_FAIL; + } + else { + // assemble stiffness + G->assemble_matrix(); + // process loads + if(SUANPAN_SUCCESS != G->process_load()) return SUANPAN_FAIL; + // process constraints + if(SUANPAN_SUCCESS != G->process_constraint()) return SUANPAN_FAIL; + // indicate the global matrix has been assembled + G->set_matrix_assembled_switch(true); + } // solve ninja - if(SUANPAN_SUCCESS != G->solve(ninja, G->get_displacement_residual())) return SUANPAN_FAIL; + if(SUANPAN_SUCCESS != G->solve(samurai, G->get_displacement_residual())) return SUANPAN_FAIL; // solve reference displacement - if(SUANPAN_SUCCESS != G->solve(disp_a, W->get_reference_load())) return SUANPAN_FAIL; + if(SUANPAN_SUCCESS != G->solve(disp_a, G->get_reference_load())) return SUANPAN_FAIL; if(const auto n_size = W->get_size(); 0 != W->get_mpc()) { mat right, kernel; auto& border = W->get_auxiliary_stiffness(); if(SUANPAN_SUCCESS != G->solve(right, border)) return SUANPAN_FAIL; auto& aux_lambda = get_auxiliary_lambda(W); - if(!solve(aux_lambda, kernel = border.t() * right.head_rows(n_size), border.t() * ninja.head_rows(n_size) - G->get_auxiliary_residual())) return SUANPAN_FAIL; - ninja -= right * aux_lambda; + if(!solve(aux_lambda, kernel = border.t() * right.head_rows(n_size), border.t() * samurai.head(n_size) - G->get_auxiliary_residual())) return SUANPAN_FAIL; + samurai -= right * aux_lambda; disp_a -= right * solve(kernel, border.t() * disp_a.head_rows(n_size)); } - const vec incre_lambda = solve(mat(disp_a.rows(idx)), W->get_trial_settlement()(idx) - W->get_trial_displacement()(idx) - ninja.rows(idx)); + const vec incre_lambda = solve(mat(disp_a.rows(idx)), W->get_trial_settlement()(idx) - G->get_trial_displacement()(idx) - samurai.rows(idx)); - ninja += disp_a * incre_lambda; + samurai += disp_a * incre_lambda; // avoid machine error accumulation - G->erase_machine_error(); + G->erase_machine_error(samurai); + + // exit if converged + if(C->is_converged(counter)) return G->sync_status(true); + // exit if maximum iteration is hit + if(++counter > max_iteration) return SUANPAN_FAIL; + // update internal variable - G->update_internal(ninja); + G->update_internal(samurai); // update trial load factor G->update_trial_load_factor(incre_lambda); // update trial displacement - G->update_trial_displacement(ninja); + G->update_from_ninja(); // for tracking G->update_load(); // for tracking G->update_constraint(); - // update for nodes and elements - if(SUANPAN_SUCCESS != G->update_trial_status()) return SUANPAN_FAIL; - // exit if converged - if(C->is_converged()) return SUANPAN_SUCCESS; - // exit if maximum iteration is hit - if(++counter > max_iteration) return SUANPAN_FAIL; + if(D->get_attribute(ModalAttribute::LinearSystem)) return G->sync_status(false); } } diff --git a/Solver/Newton.cpp b/Solver/Newton.cpp index faf3d0b8c..77129f084 100644 --- a/Solver/Newton.cpp +++ b/Solver/Newton.cpp @@ -28,7 +28,8 @@ Newton::Newton(const unsigned T, const bool IS) int Newton::analyze() { auto& C = get_converger(); auto& G = get_integrator(); - auto& W = G->get_domain().lock()->get_factory(); + const auto& D = G->get_domain(); + auto& W = D->get_factory(); suanpan_info("current analysis time: %.5f.\n", W->get_trial_time()); @@ -37,20 +38,19 @@ int Newton::analyze() { // iteration counter unsigned counter = 0; - // ninja alias - auto& ninja = get_ninja(W); - - vec pre_ninja; + vec samurai, pre_samurai; auto aitken = false; while(true) { + // update for nodes and elements + if(SUANPAN_SUCCESS != G->update_trial_status()) return SUANPAN_FAIL; // process modifiers if(SUANPAN_SUCCESS != G->process_modifier()) return SUANPAN_FAIL; // assemble resistance G->assemble_resistance(); - if(initial_stiffness && counter != 0) { + if((initial_stiffness && counter != 0) || constant_matrix()) { // some loads may have resistance if(SUANPAN_SUCCESS != G->process_load_resistance()) return SUANPAN_FAIL; // some constraints may have resistance @@ -64,13 +64,15 @@ int Newton::analyze() { if(SUANPAN_SUCCESS != G->process_load()) return SUANPAN_FAIL; // process constraints if(SUANPAN_SUCCESS != G->process_constraint()) return SUANPAN_FAIL; + // indicate the global matrix has been assembled + G->set_matrix_assembled_switch(true); } // call solver - auto flag = G->solve(ninja, G->get_force_residual()); + auto flag = G->solve(samurai, G->get_force_residual()); suanpan_debug([&] { - if(!ninja.is_finite()) { + if(!samurai.is_finite()) { suanpan_fatal("infinite number detected.\n"); flag = SUANPAN_FAIL; } @@ -83,45 +85,49 @@ int Newton::analyze() { } // deal with mpc - if(0 != W->get_mpc()) { - const auto n_size = W->get_size(); + if(const auto n_size = W->get_size(); 0 != W->get_mpc()) { auto& border = W->get_auxiliary_stiffness(); mat right; if(SUANPAN_SUCCESS != G->solve(right, border)) return SUANPAN_FAIL; auto& aux_lambda = get_auxiliary_lambda(W); - if(!solve(aux_lambda, border.t() * right.head_rows(n_size), border.t() * ninja.head_rows(n_size) - G->get_auxiliary_residual())) return SUANPAN_FAIL; - ninja -= right * aux_lambda; + if(!solve(aux_lambda, border.t() * right.head_rows(n_size), border.t() * samurai.head(n_size) - G->get_auxiliary_residual())) return SUANPAN_FAIL; + samurai -= right * aux_lambda; } if(initial_stiffness) { if(!aitken) { aitken = true; - pre_ninja = ninja; + pre_samurai = samurai; } else { aitken = false; - const vec diff_ninja = pre_ninja - ninja; - ninja *= dot(pre_ninja, diff_ninja) / dot(diff_ninja, diff_ninja); + const vec diff_samurai = pre_samurai - samurai; + samurai *= dot(pre_samurai, diff_samurai) / dot(diff_samurai, diff_samurai); } } // avoid machine error accumulation - G->erase_machine_error(); + G->erase_machine_error(samurai); + + // exit if converged + // call corrector if it exists + if(C->is_converged(counter)) return G->sync_status(true); + // exit if maximum iteration is hit + if(++counter > max_iteration) return SUANPAN_FAIL; + // update internal variable - G->update_internal(ninja); + G->update_internal(samurai); // update trial status for factory - G->update_trial_displacement(ninja); + G->update_from_ninja(); // for tracking G->update_load(); // for tracking G->update_constraint(); - // update for nodes and elements - if(SUANPAN_SUCCESS != G->update_trial_status()) return SUANPAN_FAIL; - // exit if converged - if(C->is_converged()) return SUANPAN_SUCCESS; - // exit if maximum iteration is hit - if(++counter > max_iteration) return SUANPAN_FAIL; + // fast handling for linear elastic case + // sync status using newly computed increment across elements and nodes + // this may just call predictor or call corrector + if(D->get_attribute(ModalAttribute::LinearSystem)) return G->sync_status(false); } } diff --git a/Solver/Ramm.cpp b/Solver/Ramm.cpp index 8a03ddc5d..1c0ff6fa8 100644 --- a/Solver/Ramm.cpp +++ b/Solver/Ramm.cpp @@ -29,23 +29,22 @@ Ramm::Ramm(const unsigned T, const double L, const bool F) int Ramm::analyze() { auto& C = get_converger(); auto& G = get_integrator(); - auto& W = G->get_domain().lock()->get_factory(); + auto& W = G->get_domain()->get_factory(); suanpan_info("current load level: %+.5f.\n", W->get_trial_load_factor().at(0)); const auto max_iteration = C->get_max_iteration(); - // ninja anchor - auto& t_ninja = get_ninja(W); - double t_lambda; - vec disp_a, disp_ref; + vec samurai, disp_a, disp_ref; // iteration counter unsigned counter = 0; while(true) { + // update for nodes and elements + if(SUANPAN_SUCCESS != G->update_trial_status()) return SUANPAN_FAIL; // process modifiers if(SUANPAN_SUCCESS != G->process_modifier()) return SUANPAN_FAIL; // assemble resistance @@ -58,21 +57,21 @@ int Ramm::analyze() { if(SUANPAN_SUCCESS != G->process_constraint()) return SUANPAN_FAIL; // solve ninja - if(SUANPAN_SUCCESS != G->solve(t_ninja, G->get_displacement_residual())) return SUANPAN_FAIL; + if(SUANPAN_SUCCESS != G->solve(samurai, G->get_displacement_residual())) return SUANPAN_FAIL; // solve reference displacement - if(SUANPAN_SUCCESS != G->solve(disp_a, W->get_reference_load())) return SUANPAN_FAIL; + if(SUANPAN_SUCCESS != G->solve(disp_a, G->get_reference_load())) return SUANPAN_FAIL; - if(0 != W->get_mpc()) { + if(const auto n_size = W->get_size(); 0 != W->get_mpc()) { mat right, kernel; auto& border = W->get_auxiliary_stiffness(); if(SUANPAN_SUCCESS != G->solve(right, border)) return SUANPAN_FAIL; auto& aux_lambda = get_auxiliary_lambda(W); - if(!solve(aux_lambda, kernel = border.t() * right, border.t() * t_ninja - G->get_auxiliary_residual())) return SUANPAN_FAIL; - t_ninja -= right * aux_lambda; - disp_a -= right * solve(kernel, border.t() * disp_a); + if(!solve(aux_lambda, kernel = border.t() * right.head_rows(n_size), border.t() * samurai.head(n_size) - G->get_auxiliary_residual())) return SUANPAN_FAIL; + samurai -= right * aux_lambda; + disp_a -= right * solve(kernel, border.t() * disp_a.head_rows(n_size)); } - if(0 < counter) t_lambda = -dot(disp_ref, t_ninja) / dot(disp_ref, disp_a); + if(0 < counter) t_lambda = -dot(disp_ref, samurai) / dot(disp_ref, disp_a); else { t_lambda = arc_length / sqrt(dot(disp_a, disp_a) + 1.); @@ -83,33 +82,32 @@ int Ramm::analyze() { // abaqus update disp_ref = disp_a; - t_ninja += disp_a * t_lambda; + samurai += disp_a * t_lambda; // avoid machine error accumulation - G->erase_machine_error(); + G->erase_machine_error(samurai); + + // exit if converged + if(C->is_converged(counter)) { + if(!fixed_arc_length) arc_length *= sqrt(max_iteration / static_cast(counter)); + return SUANPAN_SUCCESS; + } + // exit if maximum iteration is hit + if(++counter > max_iteration) { + if(!fixed_arc_length) arc_length *= .5; + return SUANPAN_FAIL; + } + // update trial displacement - W->update_trial_displacement_by(t_ninja); + G->update_from_ninja(); // update trial load factor - W->update_trial_load_factor_by(vec{t_lambda}); + G->update_trial_load_factor(vec{t_lambda}); // set time to load factor - W->update_trial_time(W->get_trial_load_factor().at(0)); + G->update_trial_time(W->get_trial_load_factor().at(0)); // for tracking G->update_load(); // for tracking G->update_constraint(); - // update for nodes and elements - if(SUANPAN_SUCCESS != G->update_trial_status()) return SUANPAN_FAIL; - - // exit if maximum iteration is hit - if(++counter == max_iteration) { - if(!fixed_arc_length) arc_length *= .5; - return SUANPAN_FAIL; - } - // exit if converged - if(C->is_converged()) { - if(!fixed_arc_length) arc_length *= sqrt(max_iteration / static_cast(counter)); - return SUANPAN_SUCCESS; - } } } diff --git a/Solver/Solver.cpp b/Solver/Solver.cpp index 20fa8e9d6..7bde93c9e 100644 --- a/Solver/Solver.cpp +++ b/Solver/Solver.cpp @@ -18,6 +18,8 @@ #include "Solver.h" #include #include +#include +#include Solver::Solver(const unsigned T) : Tag(T) { suanpan_debug("Solver %u ctor() called.\n", get_tag()); } @@ -25,12 +27,12 @@ Solver::Solver(const unsigned T) Solver::~Solver() { suanpan_debug("Solver %u dtor() called.\n", get_tag()); } int Solver::initialize() { - if(converger == nullptr) { + if(nullptr == converger) { suanpan_error("initialize() needs a valid converger.\n"); return SUANPAN_FAIL; } - if(modifier == nullptr) { + if(nullptr == modifier) { suanpan_error("initialize() needs a valid integrator.\n"); return SUANPAN_FAIL; } @@ -45,3 +47,16 @@ const shared_ptr& Solver::get_converger() const { return converger; } void Solver::set_integrator(const shared_ptr& G) { modifier = G; } const shared_ptr& Solver::get_integrator() const { return modifier; } + +bool Solver::constant_matrix() const { + auto& G = get_integrator(); + const auto& D = G->get_domain(); + auto& S = D->get_current_step(); + + // need to satisfy a number of conditions: + // 1. fixed step size + // 2. if not fixed step size, the effective stiffness needs to be independent from time + // 3. the system needs to be linear + // 4. the effective stiffness has been assembled + return (S->is_fixed_step_size() || G->time_independent_matrix()) && D->get_attribute(ModalAttribute::LinearSystem) && G->matrix_is_assembled(); +} diff --git a/Solver/Solver.h b/Solver/Solver.h index 379154816..0220642d4 100644 --- a/Solver/Solver.h +++ b/Solver/Solver.h @@ -56,6 +56,8 @@ class Solver : public Tag { void set_integrator(const shared_ptr&); [[nodiscard]] const shared_ptr& get_integrator() const; + + [[nodiscard]] bool constant_matrix() const; }; #endif diff --git a/Solver/SolverParser.cpp b/Solver/SolverParser.cpp index 9a86ca48d..35925d56a 100644 --- a/Solver/SolverParser.cpp +++ b/Solver/SolverParser.cpp @@ -221,16 +221,67 @@ int create_new_integrator(const shared_ptr& domain, istringstream& c if(domain->insert(make_shared(tag, std::move(pool)))) code = 1; } else if(is_equal(integrator_type, "GSSSSOptimal")) { - double radius = .5; + auto radius = .5; + if(!get_optional_input(command, radius)) { + suanpan_error("create_new_integrator() needs a valid damping radius.\n"); + return SUANPAN_SUCCESS; + } + + if(domain->insert(make_shared(tag, std::max(0., std::min(radius, 1.))))) code = 1; + } + else if(is_equal(integrator_type, "OALTS")) { + auto radius = .5; + if(!get_optional_input(command, radius)) { + suanpan_error("create_new_integrator() needs a valid damping radius.\n"); + return SUANPAN_SUCCESS; + } + + if(domain->insert(make_shared(tag, std::max(0., std::min(radius, 1.))))) code = 1; + } + else if(is_equal(integrator_type, "BatheTwoStep")) { + auto radius = 0.; + if(!get_optional_input(command, radius)) { + suanpan_error("create_new_integrator() needs a valid damping radius.\n"); + return SUANPAN_SUCCESS; + } + radius = std::max(0., std::min(radius, 1.)); + + auto gamma = .5; + if(!get_optional_input(command, gamma)) { + suanpan_error("create_new_integrator() needs a valid gamma.\n"); + return SUANPAN_SUCCESS; + } + if(gamma <= 0. || gamma >= 1.) gamma = .5; + + if(domain->insert(make_shared(tag, radius, gamma))) code = 1; + } + else if(is_equal(integrator_type, "Tchamwa")) { + auto radius = .5; + if(!get_optional_input(command, radius)) { + suanpan_error("create_new_integrator() needs a valid damping radius.\n"); + return SUANPAN_SUCCESS; + } - if(!get_input(command, radius)) { + if(domain->insert(make_shared(tag, std::max(0., std::min(radius, 1.))))) code = 1; + } + else if(is_equal(integrator_type, "BatheExplicit")) { + auto radius = .5; + if(!get_optional_input(command, radius)) { suanpan_error("create_new_integrator() needs a valid damping radius.\n"); return SUANPAN_SUCCESS; } - if(domain->insert(make_shared(tag, radius))) code = 1; + if(domain->insert(make_shared(tag, std::max(0., std::min(radius, 1.))))) code = 1; + } + else if(is_equal(integrator_type, "GeneralizedAlphaExplicit") || is_equal(integrator_type, "GeneralisedAlphaExplicit")) { + auto radius = .5; + if(!get_optional_input(command, radius)) { + suanpan_error("create_new_integrator() needs a valid damping radius.\n"); + return SUANPAN_SUCCESS; + } + + if(domain->insert(make_shared(tag, std::max(0., std::min(radius, 1.))))) code = 1; } - else if(is_equal(integrator_type, "BatheTwoStep") && domain->insert(make_shared(tag))) code = 1; if(1 == code) { if(0 != domain->get_current_step_tag()) domain->get_current_step()->set_integrator_tag(tag); @@ -282,35 +333,26 @@ int create_new_solver(const shared_ptr& domain, istringstream& comma if(domain->insert(make_shared(tag, arc_length, is_true(fixed_arc_length)))) code = 1; } - else if(is_equal(solver_type, "FEAST")) { + else if(is_equal(solver_type, "FEAST") || is_equal(solver_type, "QuadraticFEAST")) { unsigned eigen_number; if(!get_input(command, eigen_number)) { suanpan_error("create_new_solver() requires a valid number of frequencies.\n"); return SUANPAN_SUCCESS; } - double radius; - if(!get_input(command, radius)) { + double centre; + if(!get_input(command, centre)) { suanpan_error("create_new_solver() requires a valid radius.\n"); return SUANPAN_SUCCESS; } - if(domain->insert(make_shared(tag, eigen_number, radius, false))) code = 1; - } - else if(is_equal(solver_type, "QuadraticFEAST")) { - unsigned eigen_number; - if(!get_input(command, eigen_number)) { - suanpan_error("create_new_solver() requires a valid number of frequencies.\n"); - return SUANPAN_SUCCESS; - } - - double radius; - if(!get_input(command, radius)) { + auto radius = centre; + if(!get_optional_input(command, radius)) { suanpan_error("create_new_solver() requires a valid radius.\n"); return SUANPAN_SUCCESS; } - if(domain->insert(make_shared(tag, eigen_number, radius, true))) code = 1; + if(domain->insert(make_shared(tag, eigen_number, centre, radius, is_equal(solver_type, "QuadraticFEAST")))) code = 1; } else if(is_equal(solver_type, "DisplacementControl") || is_equal(solver_type, "MPDC")) { if(domain->insert(make_shared(tag))) code = 1; } else suanpan_error("create_new_solver() cannot identify solver type.\n"); diff --git a/Step/ArcLength.cpp b/Step/ArcLength.cpp index acacab092..70cf0af6b 100644 --- a/Step/ArcLength.cpp +++ b/Step/ArcLength.cpp @@ -41,7 +41,7 @@ int ArcLength::initialize() { modifier->set_domain(t_domain); // solver - if(nullptr != solver) if(const auto& t_solver = *solver; typeid(t_solver) != typeid(Ramm)) solver = nullptr; + if(nullptr != solver) if(!dynamic_cast(solver.get())) solver = nullptr; if(nullptr == solver) solver = make_shared(); solver->set_converger(tester); solver->set_integrator(modifier); diff --git a/Step/Bead.cpp b/Step/Bead.cpp index ff70332ad..8384bf1f7 100644 --- a/Step/Bead.cpp +++ b/Step/Bead.cpp @@ -67,15 +67,21 @@ int Bead::precheck() { } int Bead::analyze() { - for(const auto& [d_tag, t_domain] : domain_pool) - if(t_domain->is_active()) - for(const auto& [s_tag, t_step] : t_domain->get_step_pool()) { - t_domain->set_current_step_tag(t_step->get_tag()); - t_step->set_domain(t_domain); - if(SUANPAN_FAIL == t_step->Step::initialize()) return SUANPAN_FAIL; - if(SUANPAN_FAIL == t_step->initialize()) return SUANPAN_FAIL; - if(SUANPAN_FAIL == t_step->analyze()) return SUANPAN_FAIL; + for(const auto& [d_tag, t_domain] : domain_pool) { + if(!t_domain->is_active()) continue; + bool initial_record = true; + for(const auto& [s_tag, t_step] : t_domain->get_step_pool()) { + t_domain->set_current_step_tag(t_step->get_tag()); + t_step->set_domain(t_domain); + if(SUANPAN_FAIL == t_step->Step::initialize()) return SUANPAN_FAIL; + if(SUANPAN_FAIL == t_step->initialize()) return SUANPAN_FAIL; + if(initial_record) { + initial_record = false; + t_domain->record(); } + if(SUANPAN_FAIL == t_step->analyze()) return SUANPAN_FAIL; + } + } return SUANPAN_SUCCESS; } diff --git a/Step/Buckle.cpp b/Step/Buckle.cpp index eb9502d04..93669044a 100644 --- a/Step/Buckle.cpp +++ b/Step/Buckle.cpp @@ -66,7 +66,10 @@ int Buckle::analyze() { if(SUANPAN_SUCCESS != G->process_constraint()) return SUANPAN_FAIL; - if(eig_solve(get_eigenvalue(W), get_eigenvector(W), W->get_stiffness(), W->get_geometry()) != SUANPAN_SUCCESS) return SUANPAN_FAIL; + const shared_ptr t_geometry = W->get_geometry()->make_copy(); + t_geometry *= -1.; + + if(eig_solve(get_eigenvalue(W), get_eigenvector(W), W->get_stiffness(), t_geometry, 1, "SM") != SUANPAN_SUCCESS) return SUANPAN_FAIL; suanpan_info("\nbuckling load multiplier: %.8E.\n", W->get_eigenvalue().at(0)); diff --git a/Step/Dynamic.cpp b/Step/Dynamic.cpp index 2efb7b6ca..33ec92eac 100644 --- a/Step/Dynamic.cpp +++ b/Step/Dynamic.cpp @@ -21,14 +21,14 @@ #include #include #include -#include -#include +#include #include #include #include -Dynamic::Dynamic(const unsigned T, const double P) - : Step(T, P) {} +Dynamic::Dynamic(const unsigned T, const double P, const IntegratorType AT) + : Step(T, P) + , analysis_type(AT) {} int Dynamic::initialize() { configure_storage_scheme(); @@ -45,11 +45,21 @@ int Dynamic::initialize() { // integrator if(nullptr == modifier) modifier = make_shared(); + else if(IntegratorType::Implicit == analysis_type) { + if(IntegratorType::Implicit != modifier->type()) { + suanpan_error("an implicit integrator is required.\n"); + return SUANPAN_FAIL; + } + } + else if(IntegratorType::Implicit == modifier->type()) { + suanpan_error("an explicit integrator is required.\n"); + return SUANPAN_FAIL; + } modifier->set_domain(t_domain); // solver // avoid arc length solver - if(nullptr != solver) if(const auto& t_solver = *solver; typeid(t_solver) == typeid(Ramm)) solver = nullptr; + if(nullptr != solver) if(dynamic_cast(solver.get())) solver = nullptr; // automatically enable displacement controlled solver if(nullptr == solver) { auto flag = false; @@ -61,8 +71,7 @@ int Dynamic::initialize() { flag ? solver = make_shared() : solver = make_shared(); } - const auto& t_solver = *solver; - if(const auto& t_modifier = *modifier; typeid(t_solver) == typeid(BFGS) && typeid(t_modifier) == typeid(LeeNewmark) && typeid(t_modifier) == typeid(LeeNewmarkFull)) { + if(dynamic_cast(solver.get()) && dynamic_cast(modifier.get())) { suanpan_error("currently BFGS solver is not supported by Lee damping model.\n"); return SUANPAN_FAIL; } @@ -74,22 +83,17 @@ int Dynamic::initialize() { if(SUANPAN_SUCCESS != modifier->initialize()) return SUANPAN_FAIL; if(SUANPAN_SUCCESS != solver->initialize()) return SUANPAN_FAIL; - modifier->update_parameter(get_ini_step_size()); - modifier->update_compatibility(); - return SUANPAN_SUCCESS; } int Dynamic::analyze() { auto& S = get_solver(); auto& G = get_integrator(); + auto& W = get_factory(); auto remain_time = get_time_period(); auto step_time = get_ini_step_size(); - // record initial state - // if(W->get_current_time() == 0.) G->record(); - unsigned num_increment = 0, num_converged_step = 0; while(true) { @@ -104,18 +108,20 @@ int Dynamic::analyze() { G->update_incre_time(step_time); if(const auto code = S->analyze(); SUANPAN_SUCCESS == code) { // success step + // eat current increment + set_time_left(remain_time -= W->get_incre_time()); // commit converged iteration G->stage_and_commit_status(); // record response G->record(); - // eat current increment - set_time_left(remain_time -= step_time); - if(!is_fixed_step_size() && ++num_converged_step > 5 && G->allow_to_change_time_step()) { - step_time = std::min(get_max_step_size(), step_time * time_step_amplification); - num_converged_step = 0; + if(G->allow_to_change_time_step()) { + if(!is_fixed_step_size() && ++num_converged_step > 5) { + step_time = std::min(get_max_step_size(), step_time * time_step_amplification); + num_converged_step = 0; + } + // check if time overflows + if(step_time > remain_time) step_time = remain_time; } - // check if time overflows - if(step_time > remain_time) step_time = remain_time; } else if(SUANPAN_FAIL == code) { // failed step diff --git a/Step/Dynamic.h b/Step/Dynamic.h index 59212d2c4..6a0f746c6 100644 --- a/Step/Dynamic.h +++ b/Step/Dynamic.h @@ -30,11 +30,15 @@ #include +enum class IntegratorType; + class Dynamic final : public Step { const double time_step_amplification = 1.2; + const IntegratorType analysis_type; + public: - explicit Dynamic(unsigned = 0, double = 1.); + Dynamic(unsigned, double, IntegratorType); int initialize() override; diff --git a/Step/Frequency.cpp b/Step/Frequency.cpp index ad51ad950..38c5c71f7 100644 --- a/Step/Frequency.cpp +++ b/Step/Frequency.cpp @@ -21,9 +21,10 @@ #include #include -Frequency::Frequency(const unsigned T, const unsigned N) +Frequency::Frequency(const unsigned T, const unsigned N, const char TP) : Step(T, 0.) - , eigen_number(N) {} + , eigen_number(N) + , eigen_type(TP) {} int Frequency::initialize() { configure_storage_scheme(); @@ -37,7 +38,7 @@ int Frequency::initialize() { modifier->set_domain(t_domain); // solver - if(nullptr == solver) solver = make_shared(0, eigen_number); + if(nullptr == solver) solver = make_shared(0, eigen_number, eigen_type); solver->set_integrator(modifier); if(SUANPAN_SUCCESS != modifier->initialize()) return SUANPAN_FAIL; diff --git a/Step/Frequency.h b/Step/Frequency.h index 2008763f5..6e30018cf 100644 --- a/Step/Frequency.h +++ b/Step/Frequency.h @@ -32,9 +32,10 @@ class Frequency final : public Step { const unsigned eigen_number; + const char eigen_type; public: - explicit Frequency(unsigned = 0, unsigned = 4); + explicit Frequency(unsigned = 0, unsigned = 4, char = 'S'); int initialize() override; diff --git a/Step/Static.cpp b/Step/Static.cpp index 7f988ef10..38177eec5 100644 --- a/Step/Static.cpp +++ b/Step/Static.cpp @@ -73,9 +73,6 @@ int Static::analyze() { auto remain_time = get_time_period(); auto step_time = get_ini_step_size(); - // record initial state - // if(W->get_current_time() == 0.) G->record(); - unsigned num_increment = 0, num_converged_step = 0; while(true) { diff --git a/Step/StepParser.cpp b/Step/StepParser.cpp index 1a96bb8a7..347ae3dbb 100644 --- a/Step/StepParser.cpp +++ b/Step/StepParser.cpp @@ -19,6 +19,7 @@ #include #include #include +#include int create_new_step(const shared_ptr& domain, istringstream& command) { string step_type; @@ -39,7 +40,14 @@ int create_new_step(const shared_ptr& domain, istringstream& command suanpan_error("create_new_step() reads a wrong number of eigenvalues.\n"); return SUANPAN_SUCCESS; } - if(domain->insert(make_shared(tag, eigen_number))) domain->set_current_step_tag(tag); + + char type = 's'; + if(!get_optional_input(command, type)) { + suanpan_error("create_new_step() needs a correct eigenvalue type.\n"); + return SUANPAN_SUCCESS; + } + + if(domain->insert(make_shared(tag, eigen_number, suanpan::to_upper(type)))) domain->set_current_step_tag(tag); else suanpan_error("create_new_step() cannot create the new step.\n"); } else if(is_equal(step_type, "Buckling") || is_equal(step_type, "Buckle")) { @@ -64,13 +72,22 @@ int create_new_step(const shared_ptr& domain, istringstream& command if(domain->insert(make_shared(tag, time))) domain->set_current_step_tag(tag); else suanpan_error("create_new_step() cannot create the new step.\n"); } - else if(is_equal(step_type, "Dynamic")) { + else if(is_equal(step_type, "Dynamic") || is_equal(step_type, "ImplicitDynamic")) { + auto time = 1.; + if(!command.eof() && !get_input(command, time)) { + suanpan_error("create_new_step() reads a wrong time period.\n"); + return SUANPAN_SUCCESS; + } + if(domain->insert(make_shared(tag, time, IntegratorType::Implicit))) domain->set_current_step_tag(tag); + else suanpan_error("create_new_step() cannot create the new step.\n"); + } + else if(is_equal(step_type, "ExplicitDynamic")) { auto time = 1.; if(!command.eof() && !get_input(command, time)) { suanpan_error("create_new_step() reads a wrong time period.\n"); return SUANPAN_SUCCESS; } - if(domain->insert(make_shared(tag, time))) domain->set_current_step_tag(tag); + if(domain->insert(make_shared(tag, time, IntegratorType::Explicit))) domain->set_current_step_tag(tag); else suanpan_error("create_new_step() cannot create the new step.\n"); } else if(is_equal(step_type, "ArcLength")) { diff --git a/Toolbox/argumentParser.cpp b/Toolbox/argumentParser.cpp index 24cd80525..8512fc35a 100644 --- a/Toolbox/argumentParser.cpp +++ b/Toolbox/argumentParser.cpp @@ -35,8 +35,8 @@ using std::ifstream; using std::ofstream; constexpr auto SUANPAN_MAJOR = 2; -constexpr auto SUANPAN_MINOR = 6; -constexpr auto SUANPAN_PATCH = 1; +constexpr auto SUANPAN_MINOR = 7; +constexpr auto SUANPAN_PATCH = 0; constexpr auto SUANPAN_CODE = "Betelgeuse"; constexpr auto SUANPAN_ARCH = 64; diff --git a/Toolbox/arpack-src/ccdotc.f b/Toolbox/arpack-src/ccdotc.f new file mode 100644 index 000000000..f0f94f422 --- /dev/null +++ b/Toolbox/arpack-src/ccdotc.f @@ -0,0 +1,36 @@ + complex function ccdotc(n,zx,incx,zy,incy) +c +c forms the dot product of a vector. +c jack dongarra, 3/11/78. +c modified 12/3/93, array(1) declarations changed to array(*) +c + complex zx(*),zy(*),ztemp + integer i,incx,incy,ix,iy,n + ztemp = (0.0d0,0.0d0) + ccdotc = (0.0d0,0.0d0) + if(n.le.0)return + if(incx.eq.1.and.incy.eq.1)go to 20 +c +c code for unequal increments or equal increments +c not equal to 1 +c + ix = 1 + iy = 1 + if(incx.lt.0)ix = (-n+1)*incx + 1 + if(incy.lt.0)iy = (-n+1)*incy + 1 + do 10 i = 1,n + ztemp = ztemp + conjg(zx(ix))*zy(iy) + ix = ix + incx + iy = iy + incy + 10 continue + ccdotc = ztemp + return +c +c code for both increments equal to 1 +c + 20 do 30 i = 1,n + ztemp = ztemp + conjg(zx(i))*zy(i) + 30 continue + ccdotc = ztemp + return + end diff --git a/Toolbox/arpack-src/cgetv0.f b/Toolbox/arpack-src/cgetv0.f index cde4e655a..b49e66708 100644 --- a/Toolbox/arpack-src/cgetv0.f +++ b/Toolbox/arpack-src/cgetv0.f @@ -2,13 +2,13 @@ c c\Name: cgetv0 c -c\Description: +c\Description: c Generate a random initial residual vector for the Arnoldi process. -c Force the residual vector to be in the range of the operator OP. +c Force the residual vector to be in the range of the operator OP. c c\Usage: c call cgetv0 -c ( IDO, BMAT, ITRY, INITV, N, J, V, LDV, RESID, RNORM, +c ( IDO, BMAT, ITRY, INITV, N, J, V, LDV, RESID, RNORM, c IPNTR, WORKD, IERR ) c c\Arguments @@ -35,7 +35,7 @@ c B = 'G' -> generalized eigenvalue problem A*x = lambda*B*x c c ITRY Integer. (INPUT) -c ITRY counts the number of times that cgetv0 is called. +c ITRY counts the number of times that cgetv0 is called. c It should be set to 1 on the initial call to cgetv0. c c INITV Logical variable. (INPUT) @@ -54,11 +54,11 @@ c if this is a "restart". c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c RESID Complex array of length N. (INPUT/OUTPUT) -c Initial residual vector to be generated. If RESID is +c Initial residual vector to be generated. If RESID is c provided, force RESID into the range of the operator OP. c c RNORM Real scalar. (OUTPUT) @@ -89,21 +89,21 @@ c pp 357-385. c c\Routines called: -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c cvout ARPACK utility routine that prints vectors. -c clarnv LAPACK routine for generating a random vector. +c clarnv LAPACK routine for generating a random vector. c cgemv Level 2 BLAS routine for matrix vector multiplication. c ccopy Level 1 BLAS that copies one vector to another. c cdotc Level 1 BLAS that computes the scalar product of two vectors. -c scnrm2 Level 1 BLAS that computes the norm of a vector. +c scnrm2 Level 1 BLAS that computes the norm of a vector. c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c\SCCS Information: @(#) c FILE: getv0.F SID: 2.3 DATE OF SID: 08/27/96 RELEASE: 2 @@ -112,16 +112,16 @@ c c----------------------------------------------------------------------- c - subroutine cgetv0 - & ( ido, bmat, itry, initv, n, j, v, ldv, resid, rnorm, + subroutine cgetv0 + & ( ido, bmat, itry, initv, n, j, v, ldv, resid, rnorm, & ipntr, workd, ierr ) -c +c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -156,35 +156,29 @@ subroutine cgetv0 c | Local Scalars & Arrays | c %------------------------% c - logical first, inits, orth + logical first, orth integer idist, iseed(4), iter, msglvl, jj Real & rnorm0 Complex & cnorm - save first, iseed, inits, iter, msglvl, orth, rnorm0 + save first, iseed, iter, msglvl, orth, rnorm0 c c %----------------------% c | External Subroutines | c %----------------------% c - external ccopy, cgemv, clarnv, cvout, second + external ccopy, cgemv, clarnv, cvout, arscnd c c %--------------------% c | External Functions | c %--------------------% c - Real + Real & scnrm2, slapy2 Complex - & cdotc - external cdotc, scnrm2, slapy2 -c -c %-----------------% -c | Data Statements | -c %-----------------% -c - data inits /.true./ + & ccdotc + external ccdotc, scnrm2, slapy2 c c %-----------------------% c | Executable Statements | @@ -196,24 +190,21 @@ subroutine cgetv0 c | random number generator | c %-----------------------------------% c - if (inits) then - iseed(1) = 1 - iseed(2) = 3 - iseed(3) = 5 - iseed(4) = 7 - inits = .false. - end if + iseed(1) = 1 + iseed(2) = 3 + iseed(3) = 5 + iseed(4) = 7 c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mgetv0 -c +c ierr = 0 iter = 0 first = .FALSE. @@ -232,48 +223,50 @@ subroutine cgetv0 idist = 2 call clarnv (idist, iseed, n, resid) end if -c +c c %----------------------------------------------------------% c | Force the starting vector into the range of OP to handle | c | the generalized problem when B is possibly (singular). | c %----------------------------------------------------------% c - call second (t2) - if (bmat .eq. 'G') then + call arscnd (t2) + if (itry .eq. 1) then nopx = nopx + 1 ipntr(1) = 1 ipntr(2) = n + 1 call ccopy (n, resid, 1, workd, 1) ido = -1 go to 9000 + else if (itry .gt. 1 .and. bmat .eq. 'G') then + call ccopy (n, resid, 1, workd(n + 1), 1) end if end if -c +c c %----------------------------------------% -c | Back from computing B*(initial-vector) | +c | Back from computing OP*(initial-vector) | c %----------------------------------------% c if (first) go to 20 c c %-----------------------------------------------% -c | Back from computing B*(orthogonalized-vector) | +c | Back from computing OP*(orthogonalized-vector) | c %-----------------------------------------------% c if (orth) go to 40 -c - call second (t3) +c + call arscnd (t3) tmvopx = tmvopx + (t3 - t2) -c +c c %------------------------------------------------------% c | Starting vector is now in the range of OP; r = OP*r; | c | Compute B-norm of starting vector. | c %------------------------------------------------------% c - call second (t2) + call arscnd (t2) first = .TRUE. + if (itry .eq. 1) call ccopy (n, workd(n + 1), 1, resid, 1) if (bmat .eq. 'G') then nbx = nbx + 1 - call ccopy (n, workd(n+1), 1, resid, 1) ipntr(1) = n + 1 ipntr(2) = 1 ido = 2 @@ -281,17 +274,17 @@ subroutine cgetv0 else if (bmat .eq. 'I') then call ccopy (n, resid, 1, workd, 1) end if -c +c 20 continue c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c first = .FALSE. if (bmat .eq. 'G') then - cnorm = cdotc (n, resid, 1, workd, 1) + cnorm = ccdotc (n, resid, 1, workd, 1) rnorm0 = sqrt(slapy2(real(cnorm),aimag(cnorm))) else if (bmat .eq. 'I') then rnorm0 = scnrm2(n, resid, 1) @@ -303,7 +296,7 @@ subroutine cgetv0 c %---------------------------------------------% c if (j .eq. 1) go to 50 -c +c c %---------------------------------------------------------------- c | Otherwise need to B-orthogonalize the starting vector against | c | the current Arnoldi basis using Gram-Schmidt with iter. ref. | @@ -319,16 +312,16 @@ subroutine cgetv0 orth = .TRUE. 30 continue c - call cgemv ('C', n, j-1, one, v, ldv, workd, 1, + call cgemv ('C', n, j-1, one, v, ldv, workd, 1, & zero, workd(n+1), 1) - call cgemv ('N', n, j-1, -one, v, ldv, workd(n+1), 1, + call cgemv ('N', n, j-1, -one, v, ldv, workd(n+1), 1, & one, resid, 1) -c +c c %----------------------------------------------------------% c | Compute the B-norm of the orthogonalized starting vector | c %----------------------------------------------------------% c - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call ccopy (n, resid, 1, workd(n+1), 1) @@ -339,16 +332,16 @@ subroutine cgetv0 else if (bmat .eq. 'I') then call ccopy (n, resid, 1, workd, 1) end if -c +c 40 continue c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c if (bmat .eq. 'G') then - cnorm = cdotc (n, resid, 1, workd, 1) + cnorm = ccdotc (n, resid, 1, workd, 1) rnorm = sqrt(slapy2(real(cnorm),aimag(cnorm))) else if (bmat .eq. 'I') then rnorm = scnrm2(n, resid, 1) @@ -359,14 +352,14 @@ subroutine cgetv0 c %--------------------------------------% c if (msglvl .gt. 2) then - call svout (logfil, 1, rnorm0, ndigit, + call svout (logfil, 1, [rnorm0], ndigit, & '_getv0: re-orthonalization ; rnorm0 is') - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_getv0: re-orthonalization ; rnorm is') end if c if (rnorm .gt. 0.717*rnorm0) go to 50 -c +c iter = iter + 1 if (iter .le. 1) then c @@ -388,11 +381,11 @@ subroutine cgetv0 rnorm = rzero ierr = -1 end if -c +c 50 continue c if (msglvl .gt. 0) then - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_getv0: B-norm of initial / restarted starting vector') end if if (msglvl .gt. 2) then @@ -400,10 +393,10 @@ subroutine cgetv0 & '_getv0: initial / restarted starting vector') end if ido = 99 -c - call second (t1) +c + call arscnd (t1) tgetv0 = tgetv0 + (t1 - t0) -c +c 9000 continue return c diff --git a/Toolbox/arpack-src/cmout.f b/Toolbox/arpack-src/cmout.f index 1cdaf33e9..ff0478309 100644 --- a/Toolbox/arpack-src/cmout.f +++ b/Toolbox/arpack-src/cmout.f @@ -74,34 +74,34 @@ SUBROUTINE CMOUT( LOUT, M, N, A, LDA, IDIGIT, IFMT ) IF (K1.NE.N) THEN WRITE( LOUT, 9994 )I, ( A( I, J ), J = K1, K2 ) ELSE - WRITE( LOUT, 9984 )I, ( A( I, J ), J = K1, K2 ) + WRITE( LOUT, 9984 )I, ( A( I, J ), J = K1, K2 ) END IF 30 CONTINUE 40 CONTINUE * ELSE IF( NDIGIT.LE.6 ) THEN - DO 60 K1 = 1, N, 2 + DO 60 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) WRITE( LOUT, 9997 )( ICOL, I, I = K1, K2 ) DO 50 I = 1, M IF (K1.NE.N) THEN WRITE( LOUT, 9993 )I, ( A( I, J ), J = K1, K2 ) - ELSE - WRITE( LOUT, 9983 )I, ( A( I, J ), J = K1, K2 ) + ELSE + WRITE( LOUT, 9983 )I, ( A( I, J ), J = K1, K2 ) END IF 50 CONTINUE 60 CONTINUE * ELSE IF( NDIGIT.LE.8 ) THEN - DO 80 K1 = 1, N, 2 + DO 80 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) WRITE( LOUT, 9996 )( ICOL, I, I = K1, K2 ) DO 70 I = 1, M IF (K1.NE.N) THEN WRITE( LOUT, 9992 )I, ( A( I, J ), J = K1, K2 ) ELSE - WRITE( LOUT, 9982 )I, ( A( I, J ), J = K1, K2 ) - END IF + WRITE( LOUT, 9982 )I, ( A( I, J ), J = K1, K2 ) + END IF 70 CONTINUE 80 CONTINUE * @@ -124,20 +124,20 @@ SUBROUTINE CMOUT( LOUT, M, N, A, LDA, IDIGIT, IFMT ) K2 = MIN0( N, K1+3 ) WRITE( LOUT, 9998 )( ICOL, I, I = K1, K2 ) DO 110 I = 1, M - IF ((K1+3).LE.N) THEN + IF ((K1+3).LE.N) THEN WRITE( LOUT, 9974 )I, ( A( I, J ), J = K1, K2 ) ELSE IF ((K1+3-N).EQ.1) THEN WRITE( LOUT, 9964 )I, ( A( I, J ), J = k1, K2 ) ELSE IF ((K1+3-N).EQ.2) THEN WRITE( LOUT, 9954 )I, ( A( I, J ), J = K1, K2 ) ELSE IF ((K1+3-N).EQ.3) THEN - WRITE( LOUT, 9944 )I, ( A( I, J ), J = K1, K2 ) + WRITE( LOUT, 9944 )I, ( A( I, J ), J = K1, K2 ) END IF 110 CONTINUE 120 CONTINUE * ELSE IF( NDIGIT.LE.6 ) THEN - DO 140 K1 = 1, N, 3 + DO 140 K1 = 1, N, 3 K2 = MIN0( N, K1+ 2) WRITE( LOUT, 9997 )( ICOL, I, I = K1, K2 ) DO 130 I = 1, M @@ -185,14 +185,14 @@ SUBROUTINE CMOUT( LOUT, M, N, A, LDA, IDIGIT, IFMT ) 9998 FORMAT( 11X, 4( 9X, 3A1, I4, 9X ) ) 9997 FORMAT( 10X, 4( 11X, 3A1, I4, 11X ) ) 9996 FORMAT( 10X, 3( 13X, 3A1, I4, 13X ) ) - 9995 FORMAT( 12X, 2( 18x, 3A1, I4, 18X ) ) + 9995 FORMAT( 12X, 2( 18x, 3A1, I4, 18X ) ) * *======================================================== * FORMAT FOR 72 COLUMN *======================================================== * * DISPLAY 4 SIGNIFICANT DIGITS -* +* 9994 FORMAT( 1X, ' Row', I4, ':', 1X, 1P,2('(',E10.3,',',E10.3,') ') ) 9984 FORMAT( 1X, ' Row', I4, ':', 1X, 1P,1('(',E10.3,',',E10.3,') ') ) * diff --git a/Toolbox/arpack-src/cnaitr.f b/Toolbox/arpack-src/cnaitr.f index 46aaa03c4..3759760df 100644 --- a/Toolbox/arpack-src/cnaitr.f +++ b/Toolbox/arpack-src/cnaitr.f @@ -2,8 +2,8 @@ c c\Name: cnaitr c -c\Description: -c Reverse communication interface for applying NP additional steps to +c\Description: +c Reverse communication interface for applying NP additional steps to c a K step nonsymmetric Arnoldi factorization. c c Input: OP*V_{k} - V_{k}*H = r_{k}*e_{k}^T @@ -19,7 +19,7 @@ c c\Usage: c call cnaitr -c ( IDO, BMAT, N, K, NP, NB, RESID, RNORM, V, LDV, H, LDH, +c ( IDO, BMAT, N, K, NP, NB, RESID, RNORM, V, LDV, H, LDH, c IPNTR, WORKD, INFO ) c c\Arguments @@ -61,8 +61,8 @@ c Number of additional Arnoldi steps to take. c c NB Integer. (INPUT) -c Blocksize to be used in the recurrence. -c Only work for NB = 1 right now. The goal is to have a +c Blocksize to be used in the recurrence. +c Only work for NB = 1 right now. The goal is to have a c program that implement both the block and non-block method. c c RESID Complex array of length N. (INPUT/OUTPUT) @@ -74,37 +74,37 @@ c B-norm of the updated residual r_{k+p} on output. c c V Complex N by K+NP array. (INPUT/OUTPUT) -c On INPUT: V contains the Arnoldi vectors in the first K +c On INPUT: V contains the Arnoldi vectors in the first K c columns. c On OUTPUT: V contains the new NP Arnoldi vectors in the next c NP columns. The first K columns are unchanged. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c H Complex (K+NP) by (K+NP) array. (INPUT/OUTPUT) c H is used to store the generated upper Hessenberg matrix. c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORK for +c Pointer to mark the starting locations in the WORK for c vectors used by the Arnoldi iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in the +c IPNTR(3): pointer to the vector B * X when used in the c shift-and-invert mode. X is the current operand. c ------------------------------------------------------------- -c +c c WORKD Complex work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The calling program should not +c for reverse communication. The calling program should not c use WORKD as temporary workspace during the iteration !!!!!! -c On input, WORKD(1:N) = B*RESID and is used to save some +c On input, WORKD(1:N) = B*RESID and is used to save some c computation at the first step. c c INFO Integer. (OUTPUT) @@ -124,14 +124,14 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: c cgetv0 ARPACK routine to generate the initial vector. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c cmout ARPACK utility routine that prints matrices c cvout ARPACK utility routine that prints vectors. c clanhs LAPACK routine that computes various norms of a matrix. @@ -143,29 +143,29 @@ c cgemv Level 2 BLAS routine for matrix vector multiplication. c caxpy Level 1 BLAS that computes a vector triad. c ccopy Level 1 BLAS that copies one vector to another . -c cdotc Level 1 BLAS that computes the scalar product of two vectors. +c cdotc Level 1 BLAS that computes the scalar product of two vectors. c cscal Level 1 BLAS that scales a vector. -c csscal Level 1 BLAS that scales a complex vector by a real number. +c csscal Level 1 BLAS that scales a complex vector by a real number. c scnrm2 Level 1 BLAS that computes the norm of a vector. c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas -c +c Dept. of Computational & Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas +c c\SCCS Information: @(#) c FILE: naitr.F SID: 2.3 DATE OF SID: 8/27/96 RELEASE: 2 c c\Remarks c The algorithm implemented is: -c +c c restart = .false. -c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; +c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; c r_{k} contains the initial residual vector even for k = 0; -c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already +c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already c computed by the calling program. c c betaj = rnorm ; p_{k+1} = B*r_{k} ; @@ -173,7 +173,7 @@ c 1) if ( betaj < tol ) stop or restart depending on j. c ( At present tol is zero ) c if ( restart ) generate a new starting vector. -c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; +c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; c p_{j} = p_{j}/betaj c 3) r_{j} = OP*v_{j} where OP is defined as in cnaupd c For shift-invert mode p_{j} = B*v_{j} is already available. @@ -188,7 +188,7 @@ c 5) Re-orthogonalization step: c s = V_{j}'*B*r_{j} c r_{j} = r_{j} - V_{j}*s; rnorm1 = || r_{j} || -c alphaj = alphaj + s_{j}; +c alphaj = alphaj + s_{j}; c 6) Iterative refinement step: c If (rnorm1 > 0.717*rnorm) then c rnorm = rnorm1 @@ -198,7 +198,7 @@ c If this is the first time in step 6), go to 5) c Else r_{j} lies in the span of V_{j} numerically. c Set r_{j} = 0 and rnorm = 0; go to 1) -c EndIf +c EndIf c End Do c c\EndLib @@ -206,15 +206,15 @@ c----------------------------------------------------------------------- c subroutine cnaitr - & (ido, bmat, n, k, np, nb, resid, rnorm, v, ldv, h, ldh, + & (ido, bmat, n, k, np, nb, resid, rnorm, v, ldv, h, ldh, & ipntr, workd, info) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -241,7 +241,7 @@ subroutine cnaitr & one, zero Real & rone, rzero - parameter (one = (1.0E+0, 0.0E+0), zero = (0.0E+0, 0.0E+0), + parameter (one = (1.0E+0, 0.0E+0), zero = (0.0E+0, 0.0E+0), & rone = 1.0E+0, rzero = 0.0E+0) c c %--------------% @@ -258,7 +258,7 @@ subroutine cnaitr logical first, orth1, orth2, rstart, step3, step4 integer ierr, i, infol, ipj, irj, ivj, iter, itry, j, msglvl, & jj - Real + Real & ovfl, smlnum, tst1, ulp, unfl, betaj, & temp1, rnorm1, wnorm Complex @@ -272,24 +272,24 @@ subroutine cnaitr c | External Subroutines | c %----------------------% c - external caxpy, ccopy, cscal, csscal, cgemv, cgetv0, - & slabad, cvout, cmout, ivout, second + external caxpy, ccopy, cscal, csscal, cgemv, cgetv0, + & slabad, cvout, cmout, ivout, arscnd c c %--------------------% c | External Functions | c %--------------------% c Complex - & cdotc - Real + & ccdotc + Real & slamch, scnrm2, clanhs, slapy2 - external cdotc, scnrm2, clanhs, slamch, slapy2 + external ccdotc, scnrm2, clanhs, slamch, slapy2 c c %---------------------% c | Intrinsic Functions | c %---------------------% c - intrinsic aimag, real, max, sqrt + intrinsic aimag, real, max, sqrt c c %-----------------% c | Data statements | @@ -320,15 +320,15 @@ subroutine cnaitr end if c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mcaitr -c +c c %------------------------------% c | Initial call to this routine | c %------------------------------% @@ -344,7 +344,7 @@ subroutine cnaitr irj = ipj + n ivj = irj + n end if -c +c c %-------------------------------------------------% c | When in reverse communication mode one of: | c | STEP3, STEP4, ORTH1, ORTH2, RSTART | @@ -374,16 +374,16 @@ subroutine cnaitr c | | c | Note: B*r_{j-1} is already in WORKD(1:N)=WORKD(IPJ:IPJ+N-1) | c %--------------------------------------------------------------% - + 1000 continue c if (msglvl .gt. 1) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: generating Arnoldi vector number') - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_naitr: B-norm of the current residual is') end if -c +c c %---------------------------------------------------% c | STEP 1: Check if the B norm of j-th residual | c | vector is zero. Equivalent to determine whether | @@ -400,16 +400,16 @@ subroutine cnaitr c %---------------------------------------------------% c if (msglvl .gt. 0) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: ****** RESTART AT STEP ******') end if -c +c c %---------------------------------------------% c | ITRY is the loop variable that controls the | c | maximum amount of times that a restart is | c | attempted. NRSTRT is used by stat.h | c %---------------------------------------------% -c +c betaj = rzero nrstrt = nrstrt + 1 itry = 1 @@ -423,7 +423,7 @@ subroutine cnaitr c | RSTART = .true. flow returns here. | c %--------------------------------------% c - call cgetv0 (ido, bmat, itry, .false., n, j, v, ldv, + call cgetv0 (ido, bmat, itry, .false., n, j, v, ldv, & resid, rnorm, ipntr, workd, ierr) if (ido .ne. 99) go to 9000 if (ierr .lt. 0) then @@ -437,12 +437,12 @@ subroutine cnaitr c %------------------------------------------------% c info = j - 1 - call second (t1) + call arscnd (t1) tcaitr = tcaitr + (t1 - t0) ido = 99 go to 9000 end if -c +c 40 continue c c %---------------------------------------------------------% @@ -466,7 +466,7 @@ subroutine cnaitr c call clascl ('General', i, i, rnorm, rone, & n, 1, v(1,j), n, infol) - call clascl ('General', i, i, rnorm, rone, + call clascl ('General', i, i, rnorm, rone, & n, 1, workd(ipj), n, infol) end if c @@ -477,29 +477,29 @@ subroutine cnaitr c step3 = .true. nopx = nopx + 1 - call second (t2) + call arscnd (t2) call ccopy (n, v(1,j), 1, workd(ivj), 1) ipntr(1) = ivj ipntr(2) = irj ipntr(3) = ipj ido = 1 -c +c c %-----------------------------------% c | Exit in order to compute OP*v_{j} | c %-----------------------------------% -c - go to 9000 +c + go to 9000 50 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(IRJ:IRJ+N-1) := OP*v_{j} | c | if step3 = .true. | c %----------------------------------% c - call second (t3) + call arscnd (t3) tmvopx = tmvopx + (t3 - t2) - + step3 = .false. c c %------------------------------------------% @@ -507,30 +507,30 @@ subroutine cnaitr c %------------------------------------------% c call ccopy (n, workd(irj), 1, resid, 1) -c +c c %---------------------------------------% c | STEP 4: Finish extending the Arnoldi | c | factorization to length j. | c %---------------------------------------% c - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 step4 = .true. ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-------------------------------------% c | Exit in order to compute B*OP*v_{j} | c %-------------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call ccopy (n, resid, 1, workd(ipj), 1) end if 60 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(IPJ:IPJ+N-1) := B*OP*v_{j} | @@ -538,10 +538,10 @@ subroutine cnaitr c %----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c step4 = .false. c c %-------------------------------------% @@ -549,8 +549,8 @@ subroutine cnaitr c | Compute the B-norm of OP*v_{j}. | c %-------------------------------------% c - if (bmat .eq. 'G') then - cnorm = cdotc (n, resid, 1, workd(ipj), 1) + if (bmat .eq. 'G') then + cnorm = ccdotc (n, resid, 1, workd(ipj), 1) wnorm = sqrt( slapy2(real(cnorm),aimag(cnorm)) ) else if (bmat .eq. 'I') then wnorm = scnrm2(n, resid, 1) @@ -569,13 +569,13 @@ subroutine cnaitr c | Compute the j Fourier coefficients w_{j} | c | WORKD(IPJ:IPJ+N-1) contains B*OP*v_{j}. | c %------------------------------------------% -c +c call cgemv ('C', n, j, one, v, ldv, workd(ipj), 1, & zero, h(1,j), 1) c c %--------------------------------------% c | Orthogonalize r_{j} against V_{j}. | -c | RESID contains OP*v_{j}. See STEP 3. | +c | RESID contains OP*v_{j}. See STEP 3. | c %--------------------------------------% c call cgemv ('N', n, j, -one, v, ldv, h(1,j), 1, @@ -583,51 +583,51 @@ subroutine cnaitr c if (j .gt. 1) h(j,j-1) = cmplx(betaj, rzero) c - call second (t4) -c + call arscnd (t4) +c orth1 = .true. -c - call second (t2) +c + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call ccopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*r_{j} | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call ccopy (n, resid, 1, workd(ipj), 1) - end if + end if 70 continue -c +c c %---------------------------------------------------% c | Back from reverse communication if ORTH1 = .true. | c | WORKD(IPJ:IPJ+N-1) := B*r_{j}. | c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c orth1 = .false. c c %------------------------------% c | Compute the B-norm of r_{j}. | c %------------------------------% c - if (bmat .eq. 'G') then - cnorm = cdotc (n, resid, 1, workd(ipj), 1) + if (bmat .eq. 'G') then + cnorm = ccdotc (n, resid, 1, workd(ipj), 1) rnorm = sqrt( slapy2(real(cnorm),aimag(cnorm)) ) else if (bmat .eq. 'I') then rnorm = scnrm2(n, resid, 1) end if -c +c c %-----------------------------------------------------------% c | STEP 5: Re-orthogonalization / Iterative refinement phase | c | Maximum NITER_ITREF tries. | @@ -650,20 +650,20 @@ subroutine cnaitr c iter = 0 nrorth = nrorth + 1 -c +c c %---------------------------------------------------% c | Enter the Iterative refinement phase. If further | c | refinement is necessary, loop back here. The loop | c | variable is ITER. Perform a step of Classical | c | Gram-Schmidt using all the Arnoldi vectors V_{j} | c %---------------------------------------------------% -c +c 80 continue c if (msglvl .gt. 2) then rtemp(1) = wnorm rtemp(2) = rnorm - call svout (logfil, 2, rtemp, ndigit, + call svout (logfil, 2, rtemp, ndigit, & '_naitr: re-orthogonalization; wnorm and rnorm are') call cvout (logfil, j, h(1,j), ndigit, & '_naitr: j-th column of H') @@ -674,7 +674,7 @@ subroutine cnaitr c | WORKD(IRJ:IRJ+J-1) = v(:,1:J)'*WORKD(IPJ:IPJ+N-1). | c %----------------------------------------------------% c - call cgemv ('C', n, j, one, v, ldv, workd(ipj), 1, + call cgemv ('C', n, j, one, v, ldv, workd(ipj), 1, & zero, workd(irj), 1) c c %---------------------------------------------% @@ -684,28 +684,28 @@ subroutine cnaitr c | + v(:,1:J)*WORKD(IRJ:IRJ+J-1)*e'_j. | c %---------------------------------------------% c - call cgemv ('N', n, j, -one, v, ldv, workd(irj), 1, + call cgemv ('N', n, j, -one, v, ldv, workd(irj), 1, & one, resid, 1) call caxpy (j, one, workd(irj), 1, h(1,j), 1) -c +c orth2 = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call ccopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-----------------------------------% c | Exit in order to compute B*r_{j}. | c | r_{j} is the corrected residual. | c %-----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call ccopy (n, resid, 1, workd(ipj), 1) - end if + end if 90 continue c c %---------------------------------------------------% @@ -713,23 +713,23 @@ subroutine cnaitr c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) - end if + end if c c %-----------------------------------------------------% c | Compute the B-norm of the corrected residual r_{j}. | c %-----------------------------------------------------% -c - if (bmat .eq. 'G') then - cnorm = cdotc (n, resid, 1, workd(ipj), 1) +c + if (bmat .eq. 'G') then + cnorm = ccdotc (n, resid, 1, workd(ipj), 1) rnorm1 = sqrt( slapy2(real(cnorm),aimag(cnorm)) ) else if (bmat .eq. 'I') then rnorm1 = scnrm2(n, resid, 1) end if -c +c if (msglvl .gt. 0 .and. iter .gt. 0 ) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: Iterative refinement for Arnoldi residual') if (msglvl .gt. 2) then rtemp(1) = rnorm @@ -757,7 +757,7 @@ subroutine cnaitr c %---------------------------------------% c rnorm = rnorm1 -c +c else c c %-------------------------------------------% @@ -776,55 +776,55 @@ subroutine cnaitr c do 95 jj = 1, n resid(jj) = zero - 95 continue + 95 continue rnorm = rzero end if -c +c c %----------------------------------------------% c | Branch here directly if iterative refinement | c | wasn't necessary or after at most NITER_REF | c | steps of iterative refinement. | c %----------------------------------------------% -c +c 100 continue -c +c rstart = .false. orth2 = .false. -c - call second (t5) +c + call arscnd (t5) titref = titref + (t5 - t4) -c +c c %------------------------------------% c | STEP 6: Update j = j+1; Continue | c %------------------------------------% c j = j + 1 if (j .gt. k+np) then - call second (t1) + call arscnd (t1) tcaitr = tcaitr + (t1 - t0) ido = 99 do 110 i = max(1,k), k+np-1 -c +c c %--------------------------------------------% c | Check for splitting and deflation. | c | Use a standard test as in the QR algorithm | c | REFERENCE: LAPACK subroutine clahqr | c %--------------------------------------------% -c +c tst1 = slapy2(real(h(i,i)),aimag(h(i,i))) & + slapy2(real(h(i+1,i+1)), aimag(h(i+1,i+1))) if( tst1.eq.real(zero) ) & tst1 = clanhs( '1', k+np, h, ldh, workd(n+1) ) - if( slapy2(real(h(i+1,i)),aimag(h(i+1,i))) .le. - & max( ulp*tst1, smlnum ) ) + if( slapy2(real(h(i+1,i)),aimag(h(i+1,i))) .le. + & max( ulp*tst1, smlnum ) ) & h(i+1,i) = zero 110 continue -c +c if (msglvl .gt. 2) then - call cmout (logfil, k+np, k+np, h, ldh, ndigit, + call cmout (logfil, k+np, k+np, h, ldh, ndigit, & '_naitr: Final upper Hessenberg matrix H of order K+NP') end if -c +c go to 9000 end if c @@ -833,7 +833,7 @@ subroutine cnaitr c %--------------------------------------------------------% c go to 1000 -c +c c %---------------------------------------------------------------% c | | c | E N D O F M A I N I T E R A T I O N L O O P | diff --git a/Toolbox/arpack-src/cnapps.f b/Toolbox/arpack-src/cnapps.f index 547926f16..c3a55623f 100644 --- a/Toolbox/arpack-src/cnapps.f +++ b/Toolbox/arpack-src/cnapps.f @@ -19,7 +19,7 @@ c c\Usage: c call cnapps -c ( N, KEV, NP, SHIFT, V, LDV, H, LDH, RESID, Q, LDQ, +c ( N, KEV, NP, SHIFT, V, LDV, H, LDH, RESID, Q, LDQ, c WORKL, WORKD ) c c\Arguments @@ -28,7 +28,7 @@ c c KEV Integer. (INPUT/OUTPUT) c KEV+NP is the size of the input matrix H. -c KEV is the size of the updated matrix HNEW. +c KEV is the size of the updated matrix HNEW. c c NP Integer. (INPUT) c Number of implicit shifts to be applied. @@ -46,7 +46,7 @@ c program. c c H Complex (KEV+NP) by (KEV+NP) array. (INPUT/OUTPUT) -c On INPUT, H contains the current KEV+NP by KEV+NP upper +c On INPUT, H contains the current KEV+NP by KEV+NP upper c Hessenberg matrix of the Arnoldi factorization. c On OUTPUT, H contains the updated KEV by KEV upper Hessenberg c matrix in the KEV leading submatrix. @@ -57,7 +57,7 @@ c c RESID Complex array of length N. (INPUT/OUTPUT) c On INPUT, RESID contains the the residual vector r_{k+p}. -c On OUTPUT, RESID is the update residual vector rnew_{k} +c On OUTPUT, RESID is the update residual vector rnew_{k} c in the first KEV locations. c c Q Complex KEV+NP by KEV+NP work array. (WORKSPACE) @@ -92,7 +92,7 @@ c c\Routines called: c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c cmout ARPACK utility routine that prints matrices c cvout ARPACK utility routine that prints vectors. c clacpy LAPACK matrix copy routine. @@ -112,9 +112,9 @@ c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c\SCCS Information: @(#) c FILE: napps.F SID: 2.3 DATE OF SID: 3/28/97 RELEASE: 2 @@ -132,15 +132,15 @@ c----------------------------------------------------------------------- c subroutine cnapps - & ( n, kev, np, shift, v, ldv, h, ldh, resid, q, ldq, + & ( n, kev, np, shift, v, ldv, h, ldh, resid, q, ldq, & workl, workd ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -153,7 +153,7 @@ subroutine cnapps c %-----------------% c Complex - & h(ldh,kev+np), resid(n), shift(np), + & h(ldh,kev+np), resid(n), shift(np), & v(ldv,kev+np), q(ldq,kev+np), workd(2*n), workl(kev+np) c c %------------% @@ -175,22 +175,22 @@ subroutine cnapps logical first Complex & cdum, f, g, h11, h21, r, s, sigma, t - Real + Real & c, ovfl, smlnum, ulp, unfl, tst1 - save first, ovfl, smlnum, ulp, unfl + save first, ovfl, smlnum, ulp, unfl c c %----------------------% c | External Subroutines | c %----------------------% c - external caxpy, ccopy, cgemv, cscal, clacpy, clartg, - & cvout, claset, slabad, cmout, second, ivout + external caxpy, ccopy, cgemv, cscal, clacpy, clartg, + & cvout, claset, slabad, cmout, arscnd, ivout c c %--------------------% c | External Functions | c %--------------------% c - Real + Real & clanhs, slamch, slapy2 external clanhs, slamch, slapy2 c @@ -204,12 +204,12 @@ subroutine cnapps c | Statement Functions | c %---------------------% c - Real + Real & cabs1 cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( cdum ) ) c c %----------------% -c | Data statments | +c | Data statements | c %----------------% c data first / .true. / @@ -240,11 +240,11 @@ subroutine cnapps c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mcapps -c - kplusp = kev + np -c +c + kplusp = kev + np +c c %--------------------------------------------% c | Initialize Q to the identity to accumulate | c | the rotations and reflections | @@ -268,9 +268,9 @@ subroutine cnapps sigma = shift(jj) c if (msglvl .gt. 2 ) then - call ivout (logfil, 1, jj, ndigit, + call ivout (logfil, 1, [jj], ndigit, & '_napps: shift number.') - call cvout (logfil, 1, sigma, ndigit, + call cvout (logfil, 1, [sigma], ndigit, & '_napps: Value of the shift ') end if c @@ -288,14 +288,14 @@ subroutine cnapps tst1 = cabs1( h( i, i ) ) + cabs1( h( i+1, i+1 ) ) if( tst1.eq.rzero ) & tst1 = clanhs( '1', kplusp-jj+1, h, ldh, workl ) - if ( abs(real(h(i+1,i))) + if ( abs(real(h(i+1,i))) & .le. max(ulp*tst1, smlnum) ) then if (msglvl .gt. 0) then - call ivout (logfil, 1, i, ndigit, + call ivout (logfil, 1, [i], ndigit, & '_napps: matrix splitting at row/column no.') - call ivout (logfil, 1, jj, ndigit, + call ivout (logfil, 1, [jj], ndigit, & '_napps: matrix splitting with shift number.') - call cvout (logfil, 1, h(i+1,i), ndigit, + call cvout (logfil, 1, h(i+1,i), ndigit, & '_napps: off diagonal element.') end if iend = i @@ -307,9 +307,9 @@ subroutine cnapps 40 continue c if (msglvl .gt. 2) then - call ivout (logfil, 1, istart, ndigit, + call ivout (logfil, 1, [istart], ndigit, & '_napps: Start of current block ') - call ivout (logfil, 1, iend, ndigit, + call ivout (logfil, 1, [iend], ndigit, & '_napps: End of current block ') end if c @@ -325,7 +325,7 @@ subroutine cnapps h21 = h(istart+1,istart) f = h11 - sigma g = h21 -c +c do 80 i = istart, iend-1 c c %------------------------------------------------------% @@ -345,7 +345,7 @@ subroutine cnapps do 50 j = i, kplusp t = c*h(i,j) + s*h(i+1,j) h(i+1,j) = -conjg(s)*h(i,j) + c*h(i+1,j) - h(i,j) = t + h(i,j) = t 50 continue c c %---------------------------------------------% @@ -355,7 +355,7 @@ subroutine cnapps do 60 j = 1, min(i+2,iend) t = c*h(j,i) + conjg(s)*h(j,i+1) h(j,i+1) = -s*h(j,i) + c*h(j,i+1) - h(j,i) = t + h(j,i) = t 60 continue c c %-----------------------------------------------------% @@ -365,7 +365,7 @@ subroutine cnapps do 70 j = 1, min(i+jj, kplusp) t = c*q(j,i) + conjg(s)*q(j,i+1) q(j,i+1) = - s*q(j,i) + c*q(j,i+1) - q(j,i) = t + q(j,i) = t 70 continue c c %---------------------------% @@ -381,7 +381,7 @@ subroutine cnapps c %-------------------------------% c | Finished applying the shift. | c %-------------------------------% -c +c 100 continue c c %---------------------------------------------------------% @@ -428,7 +428,7 @@ subroutine cnapps tst1 = cabs1( h( i, i ) ) + cabs1( h( i+1, i+1 ) ) if( tst1 .eq. rzero ) & tst1 = clanhs( '1', kev, h, ldh, workl ) - if( real( h( i+1,i ) ) .le. max( ulp*tst1, smlnum ) ) + if( real( h( i+1,i ) ) .le. max( ulp*tst1, smlnum ) ) & h(i+1,i) = zero 130 continue c @@ -441,9 +441,9 @@ subroutine cnapps c %-------------------------------------------------% c if ( real( h(kev+1,kev) ) .gt. rzero ) - & call cgemv ('N', n, kplusp, one, v, ldv, q(1,kev+1), 1, zero, + & call cgemv ('N', n, kplusp, one, v, ldv, q(1,kev+1), 1, zero, & workd(n+1), 1) -c +c c %----------------------------------------------------------% c | Compute column 1 to kev of (V*Q) in backward order | c | taking advantage of the upper Hessenberg structure of Q. | @@ -460,14 +460,14 @@ subroutine cnapps c %-------------------------------------------------% c call clacpy ('A', n, kev, v(1,kplusp-kev+1), ldv, v, ldv) -c +c c %--------------------------------------------------------------% c | Copy the (kev+1)-st column of (V*Q) in the appropriate place | c %--------------------------------------------------------------% c if ( real( h(kev+1,kev) ) .gt. rzero ) & call ccopy (n, workd(n+1), 1, v(1,kev+1), 1) -c +c c %-------------------------------------% c | Update the residual vector: | c | r <- sigmak*r + betak*v(:,kev+1) | @@ -485,7 +485,7 @@ subroutine cnapps & '_napps: sigmak = (e_{kev+p}^T*Q)*e_{kev}') call cvout (logfil, 1, h(kev+1,kev), ndigit, & '_napps: betak = e_{kev+1}^T*H*e_{kev}') - call ivout (logfil, 1, kev, ndigit, + call ivout (logfil, 1, [kev], ndigit, & '_napps: Order of the final Hessenberg matrix ') if (msglvl .gt. 2) then call cmout (logfil, kev, kev, h, ldh, ndigit, @@ -495,9 +495,9 @@ subroutine cnapps end if c 9000 continue - call second (t1) + call arscnd (t1) tcapps = tcapps + (t1 - t0) -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/cnaup2.f b/Toolbox/arpack-src/cnaup2.f index 44b133576..e36154247 100644 --- a/Toolbox/arpack-src/cnaup2.f +++ b/Toolbox/arpack-src/cnaup2.f @@ -2,13 +2,13 @@ c c\Name: cnaup2 c -c\Description: +c\Description: c Intermediate level interface called by cnaupd. c c\Usage: c call cnaup2 c ( IDO, BMAT, N, WHICH, NEV, NP, TOL, RESID, MODE, IUPD, -c ISHIFT, MXITER, V, LDV, H, LDH, RITZ, BOUNDS, +c ISHIFT, MXITER, V, LDV, H, LDH, RITZ, BOUNDS, c Q, LDQ, WORKL, IPNTR, WORKD, RWORK, INFO ) c c\Arguments @@ -26,7 +26,7 @@ c The logic for adjusting is contained within the current c subroutine. c If ISHIFT=0, NP is the number of shifts the user needs -c to provide via reverse comunication. 0 < NP < NCV-NEV. +c to provide via reverse communication. 0 < NP < NCV-NEV. c NP may be less than NCV-NEV since a leading block of the current c upper Hessenberg matrix has split off and contains "unwanted" c Ritz values. @@ -38,27 +38,27 @@ c IUPD .NE. 0: use implicit update. c c V Complex N by (NEV+NP) array. (INPUT/OUTPUT) -c The Arnoldi basis vectors are returned in the first NEV +c The Arnoldi basis vectors are returned in the first NEV c columns of V. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c H Complex (NEV+NP) by (NEV+NP) array. (OUTPUT) c H is used to store the generated upper Hessenberg matrix c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c RITZ Complex array of length NEV+NP. (OUTPUT) c RITZ(1:NEV) contains the computed Ritz values of OP. c c BOUNDS Complex array of length NEV+NP. (OUTPUT) -c BOUNDS(1:NEV) contain the error bounds corresponding to +c BOUNDS(1:NEV) contain the error bounds corresponding to c the computed Ritz values. -c +c c Q Complex (NEV+NP) by (NEV+NP) array. (WORKSPACE) c Private (replicated) work array used to accumulate the c rotation in the shift application step. @@ -67,7 +67,7 @@ c Leading dimension of Q exactly as declared in the calling c program. c -c WORKL Complex work array of length at least +c WORKL Complex work array of length at least c (NEV+NP)**2 + 3*(NEV+NP). (WORKSPACE) c Private (replicated) array on each PE or array allocated on c the front end. It is used in shifts calculation, shifts @@ -75,15 +75,15 @@ c c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORKD for +c Pointer to mark the starting locations in the WORKD for c vectors used by the Arnoldi iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in the +c IPNTR(3): pointer to the vector B * X when used in the c shift-and-invert mode. X is the current operand. c ------------------------------------------------------------- -c +c c WORKD Complex work array of length 3*N. (WORKSPACE) c Distributed array to be used in the basic Arnoldi iteration c for reverse communication. The user should not use WORKD @@ -101,7 +101,7 @@ c Error flag on output. c = 0: Normal return. c = 1: Maximum number of iterations taken. -c All possible eigenvalues of OP has been found. +c All possible eigenvalues of OP has been found. c NP returns the number of converged Ritz values. c = 2: No shifts could be applied. c = -8: Error return from LAPACK eigenvalue calculation; @@ -117,32 +117,32 @@ c\BeginLib c c\Local variables: -c xxxxxx Complex +c xxxxxx Complex c c\References: c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: -c cgetv0 ARPACK initial vector generation routine. +c cgetv0 ARPACK initial vector generation routine. c cnaitr ARPACK Arnoldi factorization routine. c cnapps ARPACK application of implicit shifts routine. -c cneigh ARPACK compute Ritz values and error bounds routine. +c cneigh ARPACK compute Ritz values and error bounds routine. c cngets ARPACK reorder Ritz values and error bounds routine. c csortc ARPACK sorting routine. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c cmout ARPACK utility routine that prints matrices c cvout ARPACK utility routine that prints vectors. c svout ARPACK utility routine that prints vectors. c slamch LAPACK routine that determines machine constants. c slapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. c ccopy Level 1 BLAS that copies one vector to another . -c cdotc Level 1 BLAS that computes the scalar product of two vectors. +c cdotc Level 1 BLAS that computes the scalar product of two vectors. c cswap Level 1 BLAS that swaps two vectors. c scnrm2 Level 1 BLAS that computes the norm of a vector. c @@ -151,10 +151,10 @@ c Richard Lehoucq CRPC / Rice Universitya c Chao Yang Houston, Texas c Dept. of Computational & -c Applied Mathematics -c Rice University -c Houston, Texas -c +c Applied Mathematics +c Rice University +c Houston, Texas +c c\SCCS Information: @(#) c FILE: naup2.F SID: 2.6 DATE OF SID: 06/01/00 RELEASE: 2 c @@ -166,16 +166,16 @@ c----------------------------------------------------------------------- c subroutine cnaup2 - & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, - & ishift, mxiter, v, ldv, h, ldh, ritz, bounds, + & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, + & ishift, mxiter, v, ldv, h, ldh, ritz, bounds, & q, ldq, workl, ipntr, workd, rwork, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -184,7 +184,7 @@ subroutine cnaup2 character bmat*1, which*2 integer ido, info, ishift, iupd, mode, ldh, ldq, ldv, mxiter, & n, nev, np - Real + Real & tol c c %-----------------% @@ -192,20 +192,20 @@ subroutine cnaup2 c %-----------------% c integer ipntr(13) - Complex - & bounds(nev+np), h(ldh,nev+np), q(ldq,nev+np), - & resid(n), ritz(nev+np), v(ldv,nev+np), + Complex + & bounds(nev+np), h(ldh,nev+np), q(ldq,nev+np), + & resid(n), ritz(nev+np), v(ldv,nev+np), & workd(3*n), workl( (nev+np)*(nev+np+3) ) - Real + Real & rwork(nev+np) c c %------------% c | Parameters | c %------------% c - Complex + Complex & one, zero - Real + Real & rzero parameter (one = (1.0E+0, 0.0E+0) , zero = (0.0E+0, 0.0E+0) , & rzero = 0.0E+0 ) @@ -215,16 +215,16 @@ subroutine cnaup2 c %---------------% c logical cnorm , getv0, initv , update, ushift - integer ierr , iter , kplusp, msglvl, nconv, + integer ierr , iter , kplusp, msglvl, nconv, & nevbef, nev0 , np0 , nptemp, i , - & j - Complex + & j + Complex & cmpnorm - Real + Real & rnorm , eps23, rtemp character wprime*2 c - save cnorm, getv0, initv , update, ushift, + save cnorm, getv0, initv , update, ushift, & rnorm, iter , kplusp, msglvl, nconv , & nevbef, nev0 , np0 , eps23 c @@ -240,17 +240,17 @@ subroutine cnaup2 c %----------------------% c external ccopy, cgetv0, cnaitr, cneigh, cngets, cnapps, - & csortc, cswap, cmout, cvout, ivout, second + & csortc, cswap, cmout, cvout, ivout, arscnd c c %--------------------% c | External functions | c %--------------------% c - Complex - & cdotc - Real + Complex + & ccdotc + Real & scnrm2, slamch, slapy2 - external cdotc, scnrm2, slamch, slapy2 + external ccdotc, scnrm2, slamch, slapy2 c c %---------------------% c | Intrinsic Functions | @@ -263,11 +263,11 @@ subroutine cnaup2 c %-----------------------% c if (ido .eq. 0) then -c - call second (t0) -c +c + call arscnd (t0) +c msglvl = mcaup2 -c +c nev0 = nev np0 = np c @@ -283,7 +283,7 @@ subroutine cnaup2 kplusp = nev + np nconv = 0 iter = 0 -c +c c %---------------------------------% c | Get machine dependent constant. | c %---------------------------------% @@ -313,7 +313,7 @@ subroutine cnaup2 initv = .false. end if end if -c +c c %---------------------------------------------% c | Get a possibly random starting vector and | c | force it into the range of the operator OP. | @@ -330,7 +330,7 @@ subroutine cnaup2 if (rnorm .eq. rzero) then c c %-----------------------------------------% -c | The initial vector is zero. Error exit. | +c | The initial vector is zero. Error exit. | c %-----------------------------------------% c info = -9 @@ -339,7 +339,7 @@ subroutine cnaup2 getv0 = .false. ido = 0 end if -c +c c %-----------------------------------% c | Back from reverse communication : | c | continue with update step | @@ -359,12 +359,12 @@ subroutine cnaup2 c %-------------------------------------% c if (cnorm) go to 100 -c +c c %----------------------------------------------------------% c | Compute the first NEV steps of the Arnoldi factorization | c %----------------------------------------------------------% c - call cnaitr (ido, bmat, n, 0, nev, mode, resid, rnorm, v, ldv, + call cnaitr (ido, bmat, n, 0, nev, mode, resid, rnorm, v, ldv, & h, ldh, ipntr, workd, info) c if (ido .ne. 99) go to 9000 @@ -375,7 +375,7 @@ subroutine cnaup2 info = -9999 go to 1200 end if -c +c c %--------------------------------------------------------------% c | | c | M A I N ARNOLDI I T E R A T I O N L O O P | @@ -383,16 +383,16 @@ subroutine cnaup2 c | factorization in place. | c | | c %--------------------------------------------------------------% -c +c 1000 continue c iter = iter + 1 c if (msglvl .gt. 0) then - call ivout (logfil, 1, iter, ndigit, + call ivout (logfil, 1, [iter], ndigit, & '_naup2: **** Start of major iteration number ****') end if -c +c c %-----------------------------------------------------------% c | Compute NP additional steps of the Arnoldi factorization. | c | Adjust NP since NEV might have been updated by last call | @@ -402,9 +402,9 @@ subroutine cnaup2 np = kplusp - nev c if (msglvl .gt. 1) then - call ivout (logfil, 1, nev, ndigit, + call ivout (logfil, 1, [nev], ndigit, & '_naup2: The length of the current Arnoldi factorization') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_naup2: Extend the Arnoldi factorization by') end if c @@ -430,10 +430,10 @@ subroutine cnaup2 update = .false. c if (msglvl .gt. 1) then - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_naup2: Corresponding B-norm of the residual') end if -c +c c %--------------------------------------------------------% c | Compute the eigenvalues and corresponding error bounds | c | of the current upper Hessenberg matrix. | @@ -452,7 +452,7 @@ subroutine cnaup2 c | to be used in the convergence test. | c | The wanted part of the spectrum and corresponding | c | error bounds are in the last NEV loc. of RITZ, | -c | and BOUNDS respectively. | +c | and BOUNDS respectively. | c %---------------------------------------------------% c nev = nev0 @@ -475,7 +475,7 @@ subroutine cnaup2 c %---------------------------------------------------% c call cngets (ishift, which, nev, np, ritz, bounds) -c +c c %------------------------------------------------------------% c | Convergence test: currently we use the following criteria. | c | The relative accuracy of a Ritz value is considered | @@ -489,22 +489,22 @@ subroutine cnaup2 c do 25 i = 1, nev rtemp = max( eps23, slapy2( real (ritz(np+i)), - & aimag(ritz(np+i)) ) ) - if ( slapy2(real (bounds(np+i)),aimag(bounds(np+i))) + & aimag(ritz(np+i)) ) ) + if ( slapy2(real (bounds(np+i)),aimag(bounds(np+i))) & .le. tol*rtemp ) then nconv = nconv + 1 end if 25 continue -c +c if (msglvl .gt. 2) then kp(1) = nev kp(2) = np kp(3) = nconv - call ivout (logfil, 3, kp, ndigit, + call ivout (logfil, 3, kp, ndigit, & '_naup2: NEV, NP, NCONV are') call cvout (logfil, kplusp, ritz, ndigit, & '_naup2: The eigenvalues of H') - call cvout (logfil, kplusp, bounds, ndigit, + call cvout (logfil, kplusp, bounds, ndigit, & '_naup2: Ritz estimates of the current NCV Ritz values') end if c @@ -525,8 +525,8 @@ subroutine cnaup2 nev = nev + 1 end if 30 continue -c - if ( (nconv .ge. nev0) .or. +c + if ( (nconv .ge. nev0) .or. & (iter .gt. mxiter) .or. & (np .eq. 0) ) then c @@ -537,7 +537,7 @@ subroutine cnaup2 & ndigit, & '_naup2: Ritz estimates computed by _neigh:') end if -c +c c %------------------------------------------------% c | Prepare to exit. Put the converged Ritz values | c | and corresponding bounds in RITZ(1:NCONV) and | @@ -573,7 +573,7 @@ subroutine cnaup2 c | by 1 / max(eps23, magnitude of the Ritz value). | c %--------------------------------------------------% c - do 35 j = 1, nev0 + do 35 j = 1, nev0 rtemp = max( eps23, slapy2( real (ritz(j)), & aimag(ritz(j)) ) ) bounds(j) = bounds(j)/rtemp @@ -616,13 +616,13 @@ subroutine cnaup2 end if c c %------------------------------------% -c | Max iterations have been exceeded. | +c | Max iterations have been exceeded. | c %------------------------------------% c if (iter .gt. mxiter .and. nconv .lt. nev0) info = 1 c c %---------------------% -c | No shifts to apply. | +c | No shifts to apply. | c %---------------------% c if (np .eq. 0 .and. nconv .lt. nev0) info = 2 @@ -631,7 +631,7 @@ subroutine cnaup2 go to 1100 c else if ( (nconv .lt. nev0) .and. (ishift .eq. 1) ) then -c +c c %-------------------------------------------------% c | Do not have all the requested eigenvalues yet. | c | To prevent possible stagnation, adjust the size | @@ -646,24 +646,24 @@ subroutine cnaup2 nev = 2 end if np = kplusp - nev -c +c c %---------------------------------------% c | If the size of NEV was just increased | c | resort the eigenvalues. | c %---------------------------------------% -c - if (nevbef .lt. nev) +c + if (nevbef .lt. nev) & call cngets (ishift, which, nev, np, ritz, bounds) c - end if -c + end if +c if (msglvl .gt. 0) then - call ivout (logfil, 1, nconv, ndigit, + call ivout (logfil, 1, [nconv], ndigit, & '_naup2: no. of "converged" Ritz values at this iter.') if (msglvl .gt. 1) then kp(1) = nev kp(2) = np - call ivout (logfil, 2, kp, ndigit, + call ivout (logfil, 2, kp, ndigit, & '_naup2: NEV and NP are') call cvout (logfil, nev, ritz(np+1), ndigit, & '_naup2: "wanted" Ritz values ') @@ -687,7 +687,7 @@ subroutine cnaup2 ushift = .false. c if ( ishift .ne. 1 ) then -c +c c %----------------------------------% c | Move the NP shifts from WORKL to | c | RITZ, to free up WORKL | @@ -697,12 +697,12 @@ subroutine cnaup2 call ccopy (np, workl, 1, ritz, 1) end if c - if (msglvl .gt. 2) then - call ivout (logfil, 1, np, ndigit, + if (msglvl .gt. 2) then + call ivout (logfil, 1, [np], ndigit, & '_naup2: The number of shifts to apply ') call cvout (logfil, np, ritz, ndigit, & '_naup2: values of the shifts') - if ( ishift .eq. 1 ) + if ( ishift .eq. 1 ) & call cvout (logfil, np, bounds, ndigit, & '_naup2: Ritz estimates of the shifts') end if @@ -714,7 +714,7 @@ subroutine cnaup2 c | The first 2*N locations of WORKD are used as workspace. | c %---------------------------------------------------------% c - call cnapps (n, nev, np, ritz, v, ldv, + call cnapps (n, nev, np, ritz, v, ldv, & h, ldh, resid, q, ldq, workl, workd) c c %---------------------------------------------% @@ -724,37 +724,37 @@ subroutine cnaup2 c %---------------------------------------------% c cnorm = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call ccopy (n, resid, 1, workd(n+1), 1) ipntr(1) = n + 1 ipntr(2) = 1 ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*RESID | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call ccopy (n, resid, 1, workd, 1) end if -c +c 100 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(1:N) := B*RESID | c %----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c - if (bmat .eq. 'G') then - cmpnorm = cdotc (n, resid, 1, workd, 1) +c + if (bmat .eq. 'G') then + cmpnorm = ccdotc (n, resid, 1, workd, 1) rnorm = sqrt(slapy2(real (cmpnorm),aimag(cmpnorm))) else if (bmat .eq. 'I') then rnorm = scnrm2(n, resid, 1) @@ -762,12 +762,12 @@ subroutine cnaup2 cnorm = .false. c if (msglvl .gt. 2) then - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_naup2: B-norm of residual for compressed factorization') call cmout (logfil, nev, nev, h, ldh, ndigit, & '_naup2: Compressed upper Hessenberg matrix H') end if -c +c go to 1000 c c %---------------------------------------------------------------% @@ -780,7 +780,7 @@ subroutine cnaup2 c mxiter = iter nev = nconv -c +c 1200 continue ido = 99 c @@ -788,9 +788,9 @@ subroutine cnaup2 c | Error Exit | c %------------% c - call second (t1) + call arscnd (t1) tcaup2 = t1 - t0 -c +c 9000 continue c c %---------------% diff --git a/Toolbox/arpack-src/cnaupd.f b/Toolbox/arpack-src/cnaupd.f index de1a761cc..57be328bf 100644 --- a/Toolbox/arpack-src/cnaupd.f +++ b/Toolbox/arpack-src/cnaupd.f @@ -2,11 +2,11 @@ c c\Name: cnaupd c -c\Description: +c\Description: c Reverse communication interface for the Implicitly Restarted Arnoldi -c iteration. This is intended to be used to find a few eigenpairs of a -c complex linear operator OP with respect to a semi-inner product defined -c by a hermitian positive semi-definite real matrix B. B may be the identity +c iteration. This is intended to be used to find a few eigenpairs of a +c complex linear operator OP with respect to a semi-inner product defined +c by a hermitian positive semi-definite real matrix B. B may be the identity c matrix. NOTE: if both OP and B are real, then ssaupd or snaupd should c be used. c @@ -14,7 +14,7 @@ c The computed approximate eigenvalues are called Ritz values and c the corresponding approximate eigenvectors are called Ritz vectors. c -c cnaupd is usually called iteratively to solve one of the +c cnaupd is usually called iteratively to solve one of the c following problems: c c Mode 1: A*x = lambda*x. @@ -25,10 +25,10 @@ c ===> (If M can be factored see remark 3 below) c c Mode 3: A*x = lambda*M*x, M hermitian semi-definite -c ===> OP = inv[A - sigma*M]*M and B = M. -c ===> shift-and-invert mode +c ===> OP = inv[A - sigma*M]*M and B = M. +c ===> shift-and-invert mode c If OP*x = amu*x, then lambda = sigma + 1/amu. -c +c c c NOTE: The action of w <- inv[A - sigma*M]*v or w <- inv[M]*v c should be accomplished either by a direct method @@ -49,7 +49,7 @@ c c\Arguments c IDO Integer. (INPUT/OUTPUT) -c Reverse communication flag. IDO must be zero on the first +c Reverse communication flag. IDO must be zero on the first c call to cnaupd. IDO will be set internally to c indicate the type of operation to be performed. Control is c then given back to the calling routine which has the @@ -72,14 +72,14 @@ c IDO = 2: compute Y = M * X where c IPNTR(1) is the pointer into WORKD for X, c IPNTR(2) is the pointer into WORKD for Y. -c IDO = 3: compute and return the shifts in the first +c IDO = 3: compute and return the shifts in the first c NP locations of WORKL. c IDO = 99: done c ------------------------------------------------------------- -c After the initialization phase, when the routine is used in -c the "shift-and-invert" mode, the vector M * X is already +c After the initialization phase, when the routine is used in +c the "shift-and-invert" mode, the vector M * X is already c available and does not need to be recomputed in forming OP*X. -c +c c BMAT Character*1. (INPUT) c BMAT specifies the type of the matrix B that defines the c semi-inner product for the operator OP. @@ -100,15 +100,15 @@ c NEV Integer. (INPUT) c Number of eigenvalues of OP to be computed. 0 < NEV < N-1. c -c TOL Real scalar. (INPUT) -c Stopping criteria: the relative accuracy of the Ritz value +c TOL Real scalar. (INPUT) +c Stopping criteria: the relative accuracy of the Ritz value c is considered acceptable if BOUNDS(I) .LE. TOL*ABS(RITZ(I)) c where ABS(RITZ(I)) is the magnitude when RITZ(I) is complex. c DEFAULT = slamch('EPS') (machine precision as computed c by the LAPACK auxiliary subroutine slamch). c -c RESID Complex array of length N. (INPUT/OUTPUT) -c On INPUT: +c RESID Complex array of length N. (INPUT/OUTPUT) +c On INPUT: c If INFO .EQ. 0, a random initial residual vector is used. c If INFO .NE. 0, RESID contains the initial residual vector, c possibly from a previous run. @@ -118,15 +118,15 @@ c NCV Integer. (INPUT) c Number of columns of the matrix V. NCV must satisfy the two c inequalities 1 <= NCV-NEV and NCV <= N. -c This will indicate how many Arnoldi vectors are generated -c at each iteration. After the startup phase in which NEV -c Arnoldi vectors are generated, the algorithm generates -c approximately NCV-NEV Arnoldi vectors at each subsequent update -c iteration. Most of the cost in generating each Arnoldi vector is +c This will indicate how many Arnoldi vectors are generated +c at each iteration. After the startup phase in which NEV +c Arnoldi vectors are generated, the algorithm generates +c approximately NCV-NEV Arnoldi vectors at each subsequent update +c iteration. Most of the cost in generating each Arnoldi vector is c in the matrix-vector operation OP*x. (See remark 4 below.) c -c V Complex array N by NCV. (OUTPUT) -c Contains the final set of Arnoldi basis vectors. +c V Complex array N by NCV. (OUTPUT) +c Contains the final set of Arnoldi basis vectors. c c LDV Integer. (INPUT) c Leading dimension of V exactly as declared in the calling program. @@ -137,23 +137,23 @@ c the components of the unwanted eigenvector. c ------------------------------------------------------------- c ISHIFT = 0: the shifts are to be provided by the user via -c reverse communication. The NCV eigenvalues of +c reverse communication. The NCV eigenvalues of c the Hessenberg matrix H are returned in the part c of WORKL array corresponding to RITZ. c ISHIFT = 1: exact shifts with respect to the current -c Hessenberg matrix H. This is equivalent to -c restarting the iteration from the beginning +c Hessenberg matrix H. This is equivalent to +c restarting the iteration from the beginning c after updating the starting vector with a linear -c combination of Ritz vectors associated with the +c combination of Ritz vectors associated with the c "wanted" eigenvalues. c ISHIFT = 2: other choice of internal shift to be defined. c ------------------------------------------------------------- c -c IPARAM(2) = No longer referenced +c IPARAM(2) = No longer referenced c c IPARAM(3) = MXITER -c On INPUT: maximum number of Arnoldi update iterations allowed. -c On OUTPUT: actual number of Arnoldi update iterations taken. +c On INPUT: maximum number of Arnoldi update iterations allowed. +c On OUTPUT: actual number of Arnoldi update iterations taken. c c IPARAM(4) = NB: blocksize to be used in the recurrence. c The code currently works only for NB = 1. @@ -163,11 +163,11 @@ c the convergence criterion. c c IPARAM(6) = IUPD -c No longer referenced. Implicit restarting is ALWAYS used. +c No longer referenced. Implicit restarting is ALWAYS used. c c IPARAM(7) = MODE c On INPUT determines what type of eigenproblem is being solved. -c Must be 1,2,3; See under \Description of cnaupd for the +c Must be 1,2,3; See under \Description of cnaupd for the c four modes available. c c IPARAM(8) = NP @@ -186,7 +186,7 @@ c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X in WORKD. c IPNTR(2): pointer to the current result vector Y in WORKD. -c IPNTR(3): pointer to the vector B * X in WORKD when used in +c IPNTR(3): pointer to the vector B * X in WORKD when used in c the shift-and-invert mode. c IPNTR(4): pointer to the next available location in WORKL c that is untouched by the program. @@ -199,7 +199,7 @@ c c Note: IPNTR(9:13) is only referenced by cneupd. See Remark 2 below. c -c IPNTR(9): pointer to the NCV RITZ values of the +c IPNTR(9): pointer to the NCV RITZ values of the c original system. c IPNTR(10): Not Used c IPNTR(11): pointer to the NCV corresponding error bounds. @@ -210,21 +210,21 @@ c cneupd if RVEC = .TRUE. See Remark 2 below. c c ------------------------------------------------------------- -c -c WORKD Complex work array of length 3*N. (REVERSE COMMUNICATION) +c +c WORKD Complex work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The user should not use WORKD +c for reverse communication. The user should not use WORKD c as temporary workspace during the iteration !!!!!!!!!! -c See Data Distribution Note below. +c See Data Distribution Note below. c -c WORKL Complex work array of length LWORKL. (OUTPUT/WORKSPACE) +c WORKL Complex work array of length LWORKL. (OUTPUT/WORKSPACE) c Private (replicated) array on each PE or array allocated on c the front end. See Data Distribution Note below. c c LWORKL Integer. (INPUT) c LWORKL must be at least 3*NCV**2 + 5*NCV. c -c RWORK Real work array of length NCV (WORKSPACE) +c RWORK Real work array of length NCV (WORKSPACE) c Private (replicated) array on each PE or array allocated on c the front end. c @@ -236,18 +236,18 @@ c Error flag on output. c = 0: Normal exit. c = 1: Maximum number of iterations taken. -c All possible eigenvalues of OP has been found. IPARAM(5) +c All possible eigenvalues of OP has been found. IPARAM(5) c returns the number of wanted converged Ritz values. c = 2: No longer an informational error. Deprecated starting c with release 2 of ARPACK. -c = 3: No shifts could be applied during a cycle of the -c Implicitly restarted Arnoldi iteration. One possibility -c is to increase the size of NCV relative to NEV. +c = 3: No shifts could be applied during a cycle of the +c Implicitly restarted Arnoldi iteration. One possibility +c is to increase the size of NCV relative to NEV. c See remark 4 below. c = -1: N must be positive. c = -2: NEV must be positive. -c = -3: NCV-NEV >= 1 and less than or equal to N. -c = -4: The maximum number of Arnoldi update iteration +c = -3: NCV-NEV >= 2 and less than or equal to N. +c = -4: The maximum number of Arnoldi update iteration c must be greater than zero. c = -5: WHICH must be one of 'LM', 'SM', 'LR', 'SR', 'LI', 'SI' c = -6: BMAT must be one of 'I' or 'G'. @@ -268,16 +268,16 @@ c selection of WHICH should be made with this in mind when using c Mode = 3. When operating in Mode = 3 setting WHICH = 'LM' will c compute the NEV eigenvalues of the original problem that are -c closest to the shift SIGMA . After convergence, approximate eigenvalues +c closest to the shift SIGMA . After convergence, approximate eigenvalues c of the original problem may be obtained with the ARPACK subroutine cneupd. c -c 2. If a basis for the invariant subspace corresponding to the converged Ritz -c values is needed, the user must call cneupd immediately following +c 2. If a basis for the invariant subspace corresponding to the converged Ritz +c values is needed, the user must call cneupd immediately following c completion of cnaupd. This is new starting with release 2 of ARPACK. c c 3. If M can be factored into a Cholesky factorization M = LL` c then Mode = 2 should not be selected. Instead one should use -c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular +c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular c linear systems should be solved with L and L` rather c than computing inverses. After convergence, an approximate c eigenvector z of the original problem is recovered by solving @@ -287,11 +287,11 @@ c of NCV relative to NEV. The only formal requirement is that NCV > NEV + 1. c However, it is recommended that NCV .ge. 2*NEV. If many problems of c the same type are to be solved, one should experiment with increasing -c NCV while keeping NEV fixed for a given test problem. This will +c NCV while keeping NEV fixed for a given test problem. This will c usually decrease the required number of OP*x operations but it c also increases the work and storage required to maintain the orthogonal c basis vectors. The optimal "cross-over" with respect to CPU time -c is problem dependent and must be determined empirically. +c is problem dependent and must be determined empirically. c See Chapter 8 of Reference 2 for further information. c c 5. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the @@ -305,11 +305,11 @@ c c----------------------------------------------------------------------- c -c\Data Distribution Note: +c\Data Distribution Note: c c Fortran-D syntax: c ================ -c Complex resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) +c Complex resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) c decompose d1(n), d2(n,ncv) c align resid(i) with d1(i) c align v(i,j) with d2(i,j) @@ -321,13 +321,13 @@ c c Cray MPP syntax: c =============== -c Complex resid(n), v(ldv,ncv), workd(n,3), workl(lworkl) +c Complex resid(n), v(ldv,ncv), workd(n,3), workl(lworkl) c shared resid(block), v(block,:), workd(block,:) c replicated workl(lworkl) -c +c c CM2/CM5 syntax: c ============== -c +c c----------------------------------------------------------------------- c c include 'ex-nonsym.doc' @@ -343,11 +343,11 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett & Y. Saad, "_Complex_ Shift and Invert Strategies for -c Real Matrices", Linear Algebra and its Applications, vol 88/89, +c _Real_ Matrices", Linear Algebra and its Applications, vol 88/89, c pp 575-595, (1987). c c\Routines called: @@ -356,19 +356,19 @@ c cstatn ARPACK routine that initializes the timing variables. c ivout ARPACK utility routine that prints integers. c cvout ARPACK utility routine that prints vectors. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c slamch LAPACK routine that determines machine constants. c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas -c +c Applied Mathematics +c Rice University +c Houston, Texas +c c\SCCS Information: @(#) -c FILE: naupd.F SID: 2.9 DATE OF SID: 07/21/02 RELEASE: 2 +c FILE: naupd.F SID: 2.8 DATE OF SID: 04/10/01 RELEASE: 2 c c\Remarks c @@ -377,15 +377,15 @@ c----------------------------------------------------------------------- c subroutine cnaupd - & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, + & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, & ipntr, workd, workl, lworkl, rwork, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -393,7 +393,7 @@ subroutine cnaupd c character bmat*1, which*2 integer ido, info, ldv, lworkl, n, ncv, nev - Real + Real & tol c c %-----------------% @@ -403,7 +403,7 @@ subroutine cnaupd integer iparam(11), ipntr(14) Complex & resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) - Real + Real & rwork(ncv) c c %------------% @@ -412,13 +412,13 @@ subroutine cnaupd c Complex & one, zero - parameter (one = (1.0E+0, 0.0E+0), zero = (0.0E+0, 0.0E+0)) + parameter (one = (1.0E+0, 0.0E+0) , zero = (0.0E+0, 0.0E+0) ) c c %---------------% c | Local Scalars | c %---------------% c - integer bounds, ierr, ih, iq, ishift, iupd, iw, + integer bounds, ierr, ih, iq, ishift, iupd, iw, & ldh, ldq, levec, mode, msglvl, mxiter, nb, & nev0, next, np, ritz, j save bounds, ih, iq, ishift, iupd, iw, @@ -429,29 +429,29 @@ subroutine cnaupd c | External Subroutines | c %----------------------% c - external cnaup2, cvout, ivout, second, cstatn + external cnaup2, cvout, ivout, arscnd, cstatn c c %--------------------% c | External Functions | c %--------------------% c - Real + Real & slamch external slamch c c %-----------------------% c | Executable Statements | c %-----------------------% -c +c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c call cstatn - call second (t0) + call arscnd (t0) msglvl = mcaupd c c %----------------% @@ -496,7 +496,7 @@ subroutine cnaupd else if (mode .eq. 1 .and. bmat .eq. 'G') then ierr = -11 end if -c +c c %------------% c | Error Exit | c %------------% @@ -506,14 +506,14 @@ subroutine cnaupd ido = 99 go to 9000 end if -c +c c %------------------------% c | Set default parameters | c %------------------------% c if (nb .le. 0) nb = 1 - if (tol .le. 0.0E+0 ) tol = slamch('EpsMach') - if (ishift .ne. 0 .and. + if (tol .le. 0.0E+0 ) tol = slamch('EpsMach') + if (ishift .ne. 0 .and. & ishift .ne. 1 .and. & ishift .ne. 2) ishift = 1 c @@ -525,8 +525,8 @@ subroutine cnaupd c %----------------------------------------------% c np = ncv - nev - nev0 = nev -c + nev0 = nev +c c %-----------------------------% c | Zero out internal workspace | c %-----------------------------% @@ -534,7 +534,7 @@ subroutine cnaupd do 10 j = 1, 3*ncv**2 + 5*ncv workl(j) = zero 10 continue -c +c c %-------------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, BOUNDS, Q | c | etc... and the remaining workspace. | @@ -572,12 +572,12 @@ subroutine cnaupd c | Carry out the Implicitly restarted Arnoldi Iteration. | c %-------------------------------------------------------% c - call cnaup2 + call cnaup2 & ( ido, bmat, n, which, nev0, np, tol, resid, mode, iupd, - & ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritz), - & workl(bounds), workl(iq), ldq, workl(iw), + & ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritz), + & workl(bounds), workl(iq), ldq, workl(iw), & ipntr, workd, rwork, info ) -c +c c %--------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP. | @@ -585,7 +585,7 @@ subroutine cnaupd c if (ido .eq. 3) iparam(8) = np if (ido .ne. 99) go to 9000 -c +c iparam(3) = mxiter iparam(5) = np iparam(9) = nopx @@ -601,17 +601,17 @@ subroutine cnaupd if (info .eq. 2) info = 3 c if (msglvl .gt. 0) then - call ivout (logfil, 1, mxiter, ndigit, + call ivout (logfil, 1, [mxiter], ndigit, & '_naupd: Number of update iterations taken') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_naupd: Number of wanted "converged" Ritz values') - call cvout (logfil, np, workl(ritz), ndigit, + call cvout (logfil, np, workl(ritz), ndigit, & '_naupd: The final Ritz values') - call cvout (logfil, np, workl(bounds), ndigit, + call cvout (logfil, np, workl(bounds), ndigit, & '_naupd: Associated Ritz estimates') end if c - call second (t1) + call arscnd (t1) tcaupd = t1 - t0 c if (msglvl .gt. 0) then @@ -627,8 +627,8 @@ subroutine cnaupd 1000 format (//, & 5x, '=============================================',/ & 5x, '= Complex implicit Arnoldi update code =',/ - & 5x, '= Version Number: ', ' 2.3', 21x, ' =',/ - & 5x, '= Version Date: ', ' 07/31/96', 16x, ' =',/ + & 5x, '= Version Number: ', ' 2.3' , 21x, ' =',/ + & 5x, '= Version Date: ', ' 07/31/96' , 16x, ' =',/ & 5x, '=============================================',/ & 5x, '= Summary of timing statistics =',/ & 5x, '=============================================',//) diff --git a/Toolbox/arpack-src/cneigh.f b/Toolbox/arpack-src/cneigh.f index 922102e33..2e2d4d726 100644 --- a/Toolbox/arpack-src/cneigh.f +++ b/Toolbox/arpack-src/cneigh.f @@ -12,7 +12,7 @@ c c\Arguments c RNORM Real scalar. (INPUT) -c Residual norm corresponding to the current upper Hessenberg +c Residual norm corresponding to the current upper Hessenberg c matrix H. c c N Integer. (INPUT) @@ -30,8 +30,8 @@ c c BOUNDS Complex array of length N. (OUTPUT) c On output, BOUNDS contains the Ritz estimates associated with -c the eigenvalues held in RITZ. This is equal to RNORM -c times the last components of the eigenvectors corresponding +c the eigenvalues held in RITZ. This is equal to RNORM +c times the last components of the eigenvectors corresponding c to the eigenvalues in RITZ. c c Q Complex N by N array. (WORKSPACE) @@ -48,7 +48,7 @@ c c RWORK Real work array of length N (WORKSPACE) c Private (replicated) array on each PE or array allocated on -c the front end. +c the front end. c c IERR Integer. (OUTPUT) c Error exit flag from clahqr or ctrevc. @@ -64,7 +64,7 @@ c c\Routines called: c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c cmout ARPACK utility routine that prints matrices c cvout ARPACK utility routine that prints vectors. c svout ARPACK utility routine that prints vectors. @@ -74,18 +74,18 @@ c claset LAPACK matrix initialization routine. c ctrevc LAPACK routine to compute the eigenvectors of a matrix c in upper triangular form -c ccopy Level 1 BLAS that copies one vector to another. +c ccopy Level 1 BLAS that copies one vector to another. c csscal Level 1 BLAS that scales a complex vector by a real number. c scnrm2 Level 1 BLAS that computes the norm of a vector. -c +c c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c\SCCS Information: @(#) c FILE: neigh.F SID: 2.2 DATE OF SID: 4/20/96 RELEASE: 2 @@ -97,52 +97,52 @@ c c----------------------------------------------------------------------- c - subroutine cneigh (rnorm, n, h, ldh, ritz, bounds, + subroutine cneigh (rnorm, n, h, ldh, ritz, bounds, & q, ldq, workl, rwork, ierr) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | c %------------------% c integer ierr, n, ldh, ldq - Real + Real & rnorm c c %-----------------% c | Array Arguments | c %-----------------% c - Complex + Complex & bounds(n), h(ldh,n), q(ldq,n), ritz(n), - & workl(n*(n+3)) - Real + & workl(n*(n+3)) + Real & rwork(n) -c +c c %------------% c | Parameters | c %------------% c - Complex + Complex & one, zero Real & rone parameter (one = (1.0E+0, 0.0E+0), zero = (0.0E+0, 0.0E+0), & rone = 1.0E+0) -c +c c %------------------------% c | Local Scalars & Arrays | c %------------------------% c logical select(1) integer j, msglvl - Complex + Complex & vl(1) Real & temp @@ -151,14 +151,14 @@ subroutine cneigh (rnorm, n, h, ldh, ritz, bounds, c | External Subroutines | c %----------------------% c - external clacpy, clahqr, ctrevc, ccopy, - & csscal, cmout, cvout, second + external clacpy, clahqr, ctrevc, ccopy, + & csscal, cmout, cvout, arscnd c c %--------------------% c | External Functions | c %--------------------% c - Real + Real & scnrm2 external scnrm2 c @@ -171,19 +171,19 @@ subroutine cneigh (rnorm, n, h, ldh, ritz, bounds, c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mceigh -c +c if (msglvl .gt. 2) then - call cmout (logfil, n, n, h, ldh, ndigit, + call cmout (logfil, n, n, h, ldh, ndigit, & '_neigh: Entering upper Hessenberg matrix H ') end if -c +c c %----------------------------------------------------------% c | 1. Compute the eigenvalues, the last components of the | c | corresponding Schur vectors and the full Schur form T | c | of the current upper Hessenberg matrix H. | -c | clahqr returns the full Schur form of H | +c | clahqr returns the full Schur form of H | c | in WORKL(1:N**2), and the Schur vectors in q. | c %----------------------------------------------------------% c @@ -205,7 +205,7 @@ subroutine cneigh (rnorm, n, h, ldh, ritz, bounds, c | eigenvectors. | c %----------------------------------------------------------% c - call ctrevc ('Right', 'Back', select, n, workl, n, vl, n, q, + call ctrevc ('Right', 'Back', select, n, workl, n, vl, n, q, & ldq, n, n, workl(n*n+1), rwork, ierr) c if (ierr .ne. 0) go to 9000 @@ -244,7 +244,7 @@ subroutine cneigh (rnorm, n, h, ldh, ritz, bounds, & '_neigh: Ritz estimates for the eigenvalues of H') end if c - call second(t1) + call arscnd(t1) tceigh = tceigh + (t1 - t0) c 9000 continue diff --git a/Toolbox/arpack-src/cneupd.f b/Toolbox/arpack-src/cneupd.f index 17c051dac..29154ce37 100644 --- a/Toolbox/arpack-src/cneupd.f +++ b/Toolbox/arpack-src/cneupd.f @@ -1,48 +1,48 @@ c\BeginDoc -c -c\Name: cneupd -c -c\Description: -c This subroutine returns the converged approximations to eigenvalues -c of A*z = lambda*B*z and (optionally): -c -c (1) The corresponding approximate eigenvectors; -c -c (2) An orthonormal basis for the associated approximate -c invariant subspace; -c -c (3) Both. -c -c There is negligible additional cost to obtain eigenvectors. An orthonormal +c +c\Name: cneupd +c +c\Description: +c This subroutine returns the converged approximations to eigenvalues +c of A*z = lambda*B*z and (optionally): +c +c (1) The corresponding approximate eigenvectors; +c +c (2) An orthonormal basis for the associated approximate +c invariant subspace; +c +c (3) Both. +c +c There is negligible additional cost to obtain eigenvectors. An orthonormal c basis is always computed. There is an additional storage cost of n*nev -c if both are requested (in this case a separate array Z must be supplied). +c if both are requested (in this case a separate array Z must be supplied). c c The approximate eigenvalues and eigenvectors of A*z = lambda*B*z c are derived from approximate eigenvalues and eigenvectors of c of the linear operator OP prescribed by the MODE selection in the c call to CNAUPD. CNAUPD must be called before this routine is called. c These approximate eigenvalues and vectors are commonly called Ritz -c values and Ritz vectors respectively. They are referred to as such -c in the comments that follow. The computed orthonormal basis for the -c invariant subspace corresponding to these Ritz values is referred to as a -c Schur basis. -c +c values and Ritz vectors respectively. They are referred to as such +c in the comments that follow. The computed orthonormal basis for the +c invariant subspace corresponding to these Ritz values is referred to as a +c Schur basis. +c c The definition of OP as well as other terms and the relation of computed c Ritz values and vectors of OP with respect to the given problem -c A*z = lambda*B*z may be found in the header of CNAUPD. For a brief +c A*z = lambda*B*z may be found in the header of CNAUPD. For a brief c description, see definitions of IPARAM(7), MODE and WHICH in the c documentation of CNAUPD. c c\Usage: -c call cneupd -c ( RVEC, HOWMNY, SELECT, D, Z, LDZ, SIGMA, WORKEV, BMAT, -c N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, +c call cneupd +c ( RVEC, HOWMNY, SELECT, D, Z, LDZ, SIGMA, WORKEV, BMAT, +c N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, c WORKL, LWORKL, RWORK, INFO ) c c\Arguments: c RVEC LOGICAL (INPUT) c Specifies whether a basis for the invariant subspace corresponding -c to the converged Ritz value approximations for the eigenproblem +c to the converged Ritz value approximations for the eigenproblem c A*z = lambda*B*z is computed. c c RVEC = .FALSE. Compute Ritz values only. @@ -51,7 +51,7 @@ c See Remarks below. c c HOWMNY Character*1 (INPUT) -c Specifies the form of the basis for the invariant subspace +c Specifies the form of the basis for the invariant subspace c corresponding to the converged Ritz values that is to be computed. c c = 'A': Compute NEV Ritz vectors; @@ -62,34 +62,34 @@ c SELECT Logical array of dimension NCV. (INPUT) c If HOWMNY = 'S', SELECT specifies the Ritz vectors to be c computed. To select the Ritz vector corresponding to a -c Ritz value D(j), SELECT(j) must be set to .TRUE.. -c If HOWMNY = 'A' or 'P', SELECT need not be initialized +c Ritz value D(j), SELECT(j) must be set to .TRUE.. +c If HOWMNY = 'A' or 'P', SELECT need not be initialized c but it is used as internal workspace. c c D Complex array of dimension NEV+1. (OUTPUT) -c On exit, D contains the Ritz approximations +c On exit, D contains the Ritz approximations c to the eigenvalues lambda for A*z = lambda*B*z. c c Z Complex N by NEV array (OUTPUT) -c On exit, if RVEC = .TRUE. and HOWMNY = 'A', then the columns of -c Z represents approximate eigenvectors (Ritz vectors) corresponding +c On exit, if RVEC = .TRUE. and HOWMNY = 'A', then the columns of +c Z represents approximate eigenvectors (Ritz vectors) corresponding c to the NCONV=IPARAM(5) Ritz values for eigensystem c A*z = lambda*B*z. c c If RVEC = .FALSE. or HOWMNY = 'P', then Z is NOT REFERENCED. c -c NOTE: If if RVEC = .TRUE. and a Schur basis is not required, -c the array Z may be set equal to first NEV+1 columns of the Arnoldi -c basis array V computed by CNAUPD. In this case the Arnoldi basis +c NOTE: If if RVEC = .TRUE. and a Schur basis is not required, +c the array Z may be set equal to first NEV+1 columns of the Arnoldi +c basis array V computed by CNAUPD. In this case the Arnoldi basis c will be destroyed and overwritten with the eigenvector basis. c c LDZ Integer. (INPUT) c The leading dimension of the array Z. If Ritz vectors are -c desired, then LDZ .ge. max( 1, N ) is required. +c desired, then LDZ .ge. max( 1, N ) is required. c In any case, LDZ .ge. 1 is required. c c SIGMA Complex (INPUT) -c If IPARAM(7) = 3 then SIGMA represents the shift. +c If IPARAM(7) = 3 then SIGMA represents the shift. c Not referenced if IPARAM(7) = 1 or 2. c c WORKEV Complex work array of dimension 2*NCV. (WORKSPACE) @@ -97,12 +97,12 @@ c **** The remaining arguments MUST be the same as for the **** c **** call to CNAUPD that was just completed. **** c -c NOTE: The remaining arguments +c NOTE: The remaining arguments c -c BMAT, N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, -c WORKD, WORKL, LWORKL, RWORK, INFO +c BMAT, N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, +c WORKD, WORKL, LWORKL, RWORK, INFO c -c must be passed directly to CNEUPD following the last call +c must be passed directly to CNEUPD following the last call c to CNAUPD. These arguments MUST NOT BE MODIFIED between c the the last call to CNAUPD and the call to CNEUPD. c @@ -128,7 +128,7 @@ c WORKL(1:ncv*ncv+2*ncv) contains information obtained in c cnaupd. They are not changed by cneupd. c WORKL(ncv*ncv+2*ncv+1:3*ncv*ncv+4*ncv) holds the -c untransformed Ritz values, the untransformed error estimates of +c untransformed Ritz values, the untransformed error estimates of c the Ritz values, the upper triangular matrix for H, and the c associated matrix representation of the invariant subspace for H. c @@ -161,7 +161,7 @@ c c = -1: N must be positive. c = -2: NEV must be positive. -c = -3: NCV-NEV >= 1 and less than or equal to N. +c = -3: NCV-NEV >= 2 and less than or equal to N. c = -5: WHICH must be one of 'LM', 'SM', 'LR', 'SR', 'LI', 'SI' c = -6: BMAT must be one of 'I' or 'G'. c = -7: Length of private work WORKL array is not sufficient. @@ -187,18 +187,18 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B. Nour-Omid, B. N. Parlett, T. Ericsson and P. S. Jensen, c "How to Implement the Spectral Transformation", Math Comp., -c Vol. 48, No. 178, April, 1987 pp. 664-673. +c Vol. 48, No. 178, April, 1987 pp. 664-673. c c\Routines called: c ivout ARPACK utility routine that prints integers. c cmout ARPACK utility routine that prints matrices c cvout ARPACK utility routine that prints vectors. -c cgeqr2 LAPACK routine that computes the QR factorization of +c cgeqr2 LAPACK routine that computes the QR factorization of c a matrix. c clacpy LAPACK matrix copy routine. c clahqr LAPACK routine that computes the Schur form of a @@ -207,7 +207,7 @@ c ctrevc LAPACK routine to compute the eigenvectors of a matrix c in upper triangular form. c ctrsen LAPACK routine that re-orders the Schur form. -c cunm2r LAPACK routine that applies an orthogonal matrix in +c cunm2r LAPACK routine that applies an orthogonal matrix in c factored form. c slamch LAPACK routine that determines machine constants. c ctrmm Level 3 BLAS matrix times an upper triangular matrix. @@ -219,7 +219,7 @@ c c\Remarks c -c 1. Currently only HOWMNY = 'A' and 'P' are implemented. +c 1. Currently only HOWMNY = 'A' and 'P' are implemented. c c 2. Schur vectors are an orthogonal representation for the basis of c Ritz vectors. Thus, their numerical properties are often superior. @@ -227,20 +227,20 @@ c A * V(:,1:IPARAM(5)) = V(:,1:IPARAM(5)) * T, and c transpose( V(:,1:IPARAM(5)) ) * V(:,1:IPARAM(5)) = I c are approximately satisfied. -c Here T is the leading submatrix of order IPARAM(5) of the -c upper triangular matrix stored workl(ipntr(12)). +c Here T is the leading submatrix of order IPARAM(5) of the +c upper triangular matrix stored workl(ipntr(12)). c c\Authors c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University -c Chao Yang Houston, Texas -c Dept. of Computational & -c Applied Mathematics -c Rice University +c Chao Yang Houston, Texas +c Dept. of Computational & +c Applied Mathematics +c Rice University c Houston, Texas c c\SCCS Information: @(#) -c FILE: neupd.F SID: 2.8 DATE OF SID: 07/21/02 RELEASE: 2 +c FILE: neupd.F SID: 2.7 DATE OF SID: 09/20/00 RELEASE: 2 c c\EndLib c @@ -256,8 +256,8 @@ subroutine cneupd(rvec , howmny, select, d , c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -266,9 +266,9 @@ subroutine cneupd(rvec , howmny, select, d , character bmat, howmny, which*2 logical rvec integer info, ldz, ldv, lworkl, n, ncv, nev - Complex + Complex & sigma - Real + Real & tol c c %-----------------% @@ -281,7 +281,7 @@ subroutine cneupd(rvec , howmny, select, d , & rwork(ncv) Complex & d(nev) , resid(n) , v(ldv,ncv), - & z(ldz, nev), + & z(ldz, nev), & workd(3*n) , workl(lworkl), workev(2*ncv) c c %------------% @@ -301,7 +301,7 @@ subroutine cneupd(rvec , howmny, select, d , & invsub, iuptri, iwev , j , ldh , ldq , & mode , msglvl, ritz , wr , k , irz , & ibd , outncv, iq , np , numcnv, jj , - & ishift + & ishift, nconv2 Complex & rnorm, temp, vl(1) Real @@ -315,7 +315,7 @@ subroutine cneupd(rvec , howmny, select, d , external ccopy , cgeru, cgeqr2, clacpy, cmout, & cunm2r, ctrmm, cvout, ivout, & clahqr -c +c c %--------------------% c | External Functions | c %--------------------% @@ -325,13 +325,13 @@ subroutine cneupd(rvec , howmny, select, d , external scnrm2, slamch, slapy2 c Complex - & cdotc - external cdotc + & ccdotc + external ccdotc c c %-----------------------% c | Executable Statements | c %-----------------------% -c +c c %------------------------% c | Set default parameters | c %------------------------% @@ -362,7 +362,7 @@ subroutine cneupd(rvec , howmny, select, d , ierr = -1 else if (nev .le. 0) then ierr = -2 - else if (ncv .le. nev .or. ncv .gt. n) then + else if (ncv .le. nev+1 .or. ncv .gt. n) then ierr = -3 else if (which .ne. 'LM' .and. & which .ne. 'SM' .and. @@ -382,12 +382,12 @@ subroutine cneupd(rvec , howmny, select, d , else if (howmny .eq. 'S' ) then ierr = -12 end if -c +c if (mode .eq. 1 .or. mode .eq. 2) then type = 'REGULR' else if (mode .eq. 3 ) then type = 'SHIFTI' - else + else ierr = -10 end if if (mode .eq. 1 .and. bmat .eq. 'G') ierr = -11 @@ -400,7 +400,7 @@ subroutine cneupd(rvec , howmny, select, d , info = ierr go to 9000 end if -c +c c %--------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, WORKEV, Q | c | etc... and the remaining workspace. | @@ -428,7 +428,7 @@ subroutine cneupd(rvec , howmny, select, d , c | subspace for H. | c | GRAND total of NCV * ( 3 * NCV + 4 ) locations. | c %-----------------------------------------------------------% -c +c ih = ipntr(5) ritz = ipntr(6) iq = ipntr(7) @@ -524,7 +524,7 @@ subroutine cneupd(rvec , howmny, select, d , & .le. tol*rtemp) then select(jj) = .true. numcnv = numcnv + 1 - if (jj .gt. nev) reord = .true. + if (jj .gt. nconv) reord = .true. endif 11 continue c @@ -536,9 +536,9 @@ subroutine cneupd(rvec , howmny, select, d , c %-----------------------------------------------------------% c if (msglvl .gt. 2) then - call ivout(logfil, 1, numcnv, ndigit, + call ivout(logfil, 1, [numcnv], ndigit, & '_neupd: Number of specified eigenvalues') - call ivout(logfil, 1, nconv, ndigit, + call ivout(logfil, 1, [nconv], ndigit, & '_neupd: Number of "converged" eigenvalues') end if c @@ -555,10 +555,10 @@ subroutine cneupd(rvec , howmny, select, d , c %-------------------------------------------------------% c call ccopy(ldh*ncv, workl(ih), 1, workl(iuptri), 1) - call claset('All', ncv, ncv , + call claset('All', ncv, ncv , & zero , one, workl(invsub), & ldq) - call clahqr(.true., .true. , ncv , + call clahqr(.true., .true. , ncv , & 1 , ncv , workl(iuptri), & ldh , workl(iheig) , 1 , & ncv , workl(invsub), ldq , @@ -577,7 +577,7 @@ subroutine cneupd(rvec , howmny, select, d , call cvout (logfil, ncv, workl(ihbds), ndigit, & '_neupd: Last row of the Schur vector matrix') if (msglvl .gt. 3) then - call cmout (logfil , ncv, ncv , + call cmout (logfil , ncv, ncv , & workl(iuptri), ldh, ndigit, & '_neupd: The upper triangular matrix ') end if @@ -592,9 +592,13 @@ subroutine cneupd(rvec , howmny, select, d , call ctrsen('None' , 'V' , select , & ncv , workl(iuptri), ldh , & workl(invsub), ldq , workl(iheig), - & nconv , conds , sep , + & nconv2 , conds , sep , & workev , ncv , ierr) c + if (nconv2 .lt. nconv) then + nconv = nconv2 + end if + if (ierr .eq. 1) then info = 1 go to 9000 @@ -621,7 +625,7 @@ subroutine cneupd(rvec , howmny, select, d , c call ccopy(ncv , workl(invsub+ncv-1), ldq, & workl(ihbds), 1) -c +c c %--------------------------------------------% c | Place the computed eigenvalues of H into D | c | if a spectral transformation was not used. | @@ -647,7 +651,7 @@ subroutine cneupd(rvec , howmny, select, d , c | * Postmultiply Z by R. | c | The N by NCONV matrix Z is now a matrix representation | c | of the approximate invariant subspace associated with | -c | the Ritz values in workl(iheig). The first NCONV | +c | the Ritz values in workl(iheig). The first NCONV | c | columns of V are now approximate Schur vectors | c | associated with the upper triangular matrix of order | c | NCONV in workl(iuptri). | @@ -670,7 +674,7 @@ subroutine cneupd(rvec , howmny, select, d , c | matrix consisting of plus or minus ones. | c %---------------------------------------------------% c - if ( real( workl(invsub+(j-1)*ldq+j-1) ) .lt. + if ( real( workl(invsub+(j-1)*ldq+j-1) ) .lt. & real(zero) ) then call cscal(nconv, -one, workl(iuptri+j-1), ldq) call cscal(nconv, -one, workl(iuptri+(j-1)*ldq), 1) @@ -726,8 +730,8 @@ subroutine cneupd(rvec , howmny, select, d , c | upper triangular, thus the length of the | c | inner product can be set to j. | c %------------------------------------------% -c - workev(j) = cdotc(j, workl(ihbds), 1, +c + workev(j) = ccdotc(j, workl(ihbds), 1, & workl(invsub+(j-1)*ldq), 1) 40 continue c @@ -746,7 +750,7 @@ subroutine cneupd(rvec , howmny, select, d , c %---------------------------------------% c | Copy Ritz estimates into workl(ihbds) | c %---------------------------------------% -c +c call ccopy(nconv, workev, 1, workl(ihbds), 1) c c %----------------------------------------------% @@ -758,7 +762,7 @@ subroutine cneupd(rvec , howmny, select, d , & 'Non-unit', n , nconv , & one , workl(invsub), ldq , & z , ldz) - end if + end if c else c @@ -781,25 +785,25 @@ subroutine cneupd(rvec , howmny, select, d , c if (type .eq. 'REGULR') then c - if (rvec) + if (rvec) & call cscal(ncv, rnorm, workl(ihbds), 1) -c +c else -c +c c %---------------------------------------% c | A spectral transformation was used. | c | * Determine the Ritz estimates of the | c | Ritz values in the original system. | c %---------------------------------------% c - if (rvec) + if (rvec) & call cscal(ncv, rnorm, workl(ihbds), 1) -c +c do 50 k=1, ncv temp = workl(iheig+k-1) workl(ihbds+k-1) = workl(ihbds+k-1) / temp / temp 50 continue -c +c end if c c %-----------------------------------------------------------% @@ -809,7 +813,7 @@ subroutine cneupd(rvec , howmny, select, d , c | NOTES: | c | *The Ritz vectors are not affected by the transformation. | c %-----------------------------------------------------------% -c +c if (type .eq. 'SHIFTI') then do 60 k=1, nconv d(k) = one / workl(iheig+k-1) + sigma @@ -864,7 +868,7 @@ subroutine cneupd(rvec , howmny, select, d , 9000 continue c return -c +c c %---------------% c | End of cneupd| c %---------------% diff --git a/Toolbox/arpack-src/cngets.f b/Toolbox/arpack-src/cngets.f index 76552f227..20626a2d5 100644 --- a/Toolbox/arpack-src/cngets.f +++ b/Toolbox/arpack-src/cngets.f @@ -2,9 +2,9 @@ c c\Name: cngets c -c\Description: +c\Description: c Given the eigenvalues of the upper Hessenberg matrix H, -c computes the NP shifts AMU that are zeros of the polynomial of +c computes the NP shifts AMU that are zeros of the polynomial of c degree NP which filters out components of the unwanted eigenvectors c corresponding to the AMU's based on some given criteria. c @@ -40,8 +40,8 @@ c On INPUT, RITZ contains the the eigenvalues of H. c On OUTPUT, RITZ are sorted so that the unwanted c eigenvalues are in the first NP locations and the wanted -c portion is in the last KEV locations. When exact shifts are -c selected, the unwanted part corresponds to the shifts to +c portion is in the last KEV locations. When exact shifts are +c selected, the unwanted part corresponds to the shifts to c be applied. Also, if ISHIFT .eq. 1, the unwanted eigenvalues c are further sorted so that the ones with largest Ritz values c are first. @@ -49,7 +49,7 @@ c BOUNDS Complex array of length KEV+NP. (INPUT/OUTPUT) c Error bounds corresponding to the ordering in RITZ. c -c +c c c\EndDoc c @@ -63,16 +63,16 @@ c\Routines called: c csortc ARPACK sorting routine. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c cvout ARPACK utility routine that prints vectors. c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c\SCCS Information: @(#) c FILE: ngets.F SID: 2.2 DATE OF SID: 4/20/96 RELEASE: 2 @@ -91,8 +91,8 @@ subroutine cngets ( ishift, which, kev, np, ritz, bounds) c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -126,7 +126,7 @@ subroutine cngets ( ishift, which, kev, np, ritz, bounds) c | External Subroutines | c %----------------------% c - external cvout, csortc, second + external cvout, csortc, arscnd c c %-----------------------% c | Executable Statements | @@ -136,14 +136,14 @@ subroutine cngets ( ishift, which, kev, np, ritz, bounds) c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% -c - call second (t0) +c + call arscnd (t0) msglvl = mcgets -c +c call csortc (which, .true., kev+np, ritz, bounds) -c +c if ( ishift .eq. 1 ) then -c +c c %-------------------------------------------------------% c | Sort the unwanted Ritz values used as shifts so that | c | the ones with largest Ritz estimates are first | @@ -152,27 +152,27 @@ subroutine cngets ( ishift, which, kev, np, ritz, bounds) c | are applied in subroutine cnapps. | c | Be careful and use 'SM' since we want to sort BOUNDS! | c %-------------------------------------------------------% -c +c call csortc ( 'SM', .true., np, bounds, ritz ) c end if -c - call second (t1) +c + call arscnd (t1) tcgets = tcgets + (t1 - t0) c if (msglvl .gt. 0) then - call ivout (logfil, 1, kev, ndigit, '_ngets: KEV is') - call ivout (logfil, 1, np, ndigit, '_ngets: NP is') + call ivout (logfil, 1, [kev], ndigit, '_ngets: KEV is') + call ivout (logfil, 1, [np], ndigit, '_ngets: NP is') call cvout (logfil, kev+np, ritz, ndigit, & '_ngets: Eigenvalues of current H matrix ') - call cvout (logfil, kev+np, bounds, ndigit, + call cvout (logfil, kev+np, bounds, ndigit, & '_ngets: Ritz estimates of the current KEV+NP Ritz values') end if -c +c return -c +c c %---------------% c | End of cngets | c %---------------% -c +c end diff --git a/Toolbox/arpack-src/csortc.f b/Toolbox/arpack-src/csortc.f index 017c487f5..a02bd3ffa 100644 --- a/Toolbox/arpack-src/csortc.f +++ b/Toolbox/arpack-src/csortc.f @@ -3,9 +3,9 @@ c\Name: csortc c c\Description: -c Sorts the Complex array in X into the order +c Sorts the Complex array in X into the order c specified by WHICH and optionally applies the permutation to the -c Real array Y. +c Real array Y. c c\Usage: c call csortc @@ -15,7 +15,7 @@ c WHICH Character*2. (Input) c 'LM' -> sort X into increasing order of magnitude. c 'SM' -> sort X into decreasing order of magnitude. -c 'LR' -> sort X with real(X) in increasing algebraic order +c 'LR' -> sort X with real(X) in increasing algebraic order c 'SR' -> sort X with real(X) in decreasing algebraic order c 'LI' -> sort X with imag(X) in increasing algebraic order c 'SI' -> sort X with imag(X) in decreasing algebraic order @@ -45,9 +45,9 @@ c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c Adapted from the sort routine in LANSO. c @@ -72,7 +72,7 @@ subroutine csortc (which, apply, n, x, y) c | Array Arguments | c %-----------------% c - Complex + Complex & x(0:n-1), y(0:n-1) c c %---------------% @@ -80,9 +80,9 @@ subroutine csortc (which, apply, n, x, y) c %---------------% c integer i, igap, j - Complex + Complex & temp - Real + Real & temp1, temp2 c c %--------------------% @@ -103,7 +103,7 @@ subroutine csortc (which, apply, n, x, y) c %-----------------------% c igap = n / 2 -c +c if (which .eq. 'LM') then c c %--------------------------------------------% @@ -163,7 +163,7 @@ subroutine csortc (which, apply, n, x, y) temp = x(j) x(j) = x(j+igap) x(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -177,7 +177,7 @@ subroutine csortc (which, apply, n, x, y) 60 continue igap = igap / 2 go to 40 -c +c else if (which .eq. 'LR') then c c %------------------------------------------------% @@ -197,7 +197,7 @@ subroutine csortc (which, apply, n, x, y) temp = x(j) x(j) = x(j+igap) x(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -211,7 +211,7 @@ subroutine csortc (which, apply, n, x, y) 90 continue igap = igap / 2 go to 70 -c +c else if (which .eq. 'SR') then c c %------------------------------------------------% @@ -230,7 +230,7 @@ subroutine csortc (which, apply, n, x, y) temp = x(j) x(j) = x(j+igap) x(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -244,7 +244,7 @@ subroutine csortc (which, apply, n, x, y) 120 continue igap = igap / 2 go to 100 -c +c else if (which .eq. 'LI') then c c %--------------------------------------------% @@ -277,7 +277,7 @@ subroutine csortc (which, apply, n, x, y) 150 continue igap = igap / 2 go to 130 -c +c else if (which .eq. 'SI') then c c %---------------------------------------------% @@ -296,7 +296,7 @@ subroutine csortc (which, apply, n, x, y) temp = x(j) x(j) = x(j+igap) x(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -311,7 +311,7 @@ subroutine csortc (which, apply, n, x, y) igap = igap / 2 go to 160 end if -c +c 9000 continue return c diff --git a/Toolbox/arpack-src/cstatn.f b/Toolbox/arpack-src/cstatn.f index b266a5533..02f75e0b2 100644 --- a/Toolbox/arpack-src/cstatn.f +++ b/Toolbox/arpack-src/cstatn.f @@ -13,8 +13,8 @@ subroutine cstatn c | See stat.doc for documentation | c %--------------------------------% c - include 'stat.fi' - + include 'stat.h' + c %-----------------------% c | Executable Statements | c %-----------------------% @@ -24,7 +24,7 @@ subroutine cstatn nrorth = 0 nitref = 0 nrstrt = 0 - + tcaupd = 0.0E+0 tcaup2 = 0.0E+0 tcaitr = 0.0E+0 @@ -35,13 +35,13 @@ subroutine cstatn titref = 0.0E+0 tgetv0 = 0.0E+0 trvec = 0.0E+0 - + c %----------------------------------------------------% c | User time including reverse communication overhead | c %----------------------------------------------------% tmvopx = 0.0E+0 tmvbx = 0.0E+0 - + return c c %---------------% diff --git a/Toolbox/arpack-src/cvout.f b/Toolbox/arpack-src/cvout.f index 31c22fe02..1ee9afabf 100644 --- a/Toolbox/arpack-src/cvout.f +++ b/Toolbox/arpack-src/cvout.f @@ -63,21 +63,21 @@ SUBROUTINE CVOUT( LOUT, N, CX, IDIGIT, IFMT ) DO 30 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) IF (K1.NE.N) THEN - WRITE( LOUT, 9998 )K1, K2, ( CX( I ), + WRITE( LOUT, 9998 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE - WRITE( LOUT, 9997 )K1, K2, ( CX( I ), - $ I = K1, K2 ) + WRITE( LOUT, 9997 )K1, K2, ( CX( I ), + $ I = K1, K2 ) END IF 30 CONTINUE ELSE IF( NDIGIT.LE.6 ) THEN DO 40 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) IF (K1.NE.N) THEN - WRITE( LOUT, 9988 )K1, K2, ( CX( I ), + WRITE( LOUT, 9988 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE - WRITE( LOUT, 9987 )K1, K2, ( CX( I ), + WRITE( LOUT, 9987 )K1, K2, ( CX( I ), $ I = K1, K2 ) END IF 40 CONTINUE @@ -85,11 +85,11 @@ SUBROUTINE CVOUT( LOUT, N, CX, IDIGIT, IFMT ) DO 50 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) IF (K1.NE.N) THEN - WRITE( LOUT, 9978 )K1, K2, ( CX( I ), + WRITE( LOUT, 9978 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE - WRITE( LOUT, 9977 )K1, K2, ( CX( I ), - $ I = K1, K2 ) + WRITE( LOUT, 9977 )K1, K2, ( CX( I ), + $ I = K1, K2 ) END IF 50 CONTINUE ELSE @@ -104,47 +104,47 @@ SUBROUTINE CVOUT( LOUT, N, CX, IDIGIT, IFMT ) * ELSE IF( NDIGIT.LE.4 ) THEN - DO 70 K1 = 1, N, 4 + DO 70 K1 = 1, N, 4 K2 = MIN0( N, K1+3 ) IF ((K1+3).LE.N) THEN - WRITE( LOUT, 9958 )K1, K2, ( CX( I ), + WRITE( LOUT, 9958 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+3-N) .EQ. 1) THEN - WRITE( LOUT, 9957 )K1, K2, ( CX( I ), + WRITE( LOUT, 9957 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+3-N) .EQ. 2) THEN - WRITE( LOUT, 9956 )K1, K2, ( CX( I ), + WRITE( LOUT, 9956 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+3-N) .EQ. 1) THEN - WRITE( LOUT, 9955 )K1, K2, ( CX( I ), + WRITE( LOUT, 9955 )K1, K2, ( CX( I ), $ I = K1, K2 ) END IF 70 CONTINUE ELSE IF( NDIGIT.LE.6 ) THEN - DO 80 K1 = 1, N, 3 + DO 80 K1 = 1, N, 3 K2 = MIN0( N, K1+2 ) IF ((K1+2).LE.N) THEN - WRITE( LOUT, 9948 )K1, K2, ( CX( I ), + WRITE( LOUT, 9948 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+2-N) .EQ. 1) THEN - WRITE( LOUT, 9947 )K1, K2, ( CX( I ), + WRITE( LOUT, 9947 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+2-N) .EQ. 2) THEN - WRITE( LOUT, 9946 )K1, K2, ( CX( I ), + WRITE( LOUT, 9946 )K1, K2, ( CX( I ), $ I = K1, K2 ) END IF 80 CONTINUE ELSE IF( NDIGIT.LE.8 ) THEN - DO 90 K1 = 1, N, 3 + DO 90 K1 = 1, N, 3 K2 = MIN0( N, K1+2 ) IF ((K1+2).LE.N) THEN - WRITE( LOUT, 9938 )K1, K2, ( CX( I ), + WRITE( LOUT, 9938 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+2-N) .EQ. 1) THEN - WRITE( LOUT, 9937 )K1, K2, ( CX( I ), + WRITE( LOUT, 9937 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+2-N) .EQ. 2) THEN - WRITE( LOUT, 9936 )K1, K2, ( CX( I ), + WRITE( LOUT, 9936 )K1, K2, ( CX( I ), $ I = K1, K2 ) END IF 90 CONTINUE @@ -152,10 +152,10 @@ SUBROUTINE CVOUT( LOUT, N, CX, IDIGIT, IFMT ) DO 100 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) IF ((K1+2).LE.N) THEN - WRITE( LOUT, 9928 )K1, K2, ( CX( I ), + WRITE( LOUT, 9928 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+2-N) .EQ. 1) THEN - WRITE( LOUT, 9927 )K1, K2, ( CX( I ), + WRITE( LOUT, 9927 )K1, K2, ( CX( I ), $ I = K1, K2 ) END IF 100 CONTINUE @@ -171,12 +171,12 @@ SUBROUTINE CVOUT( LOUT, N, CX, IDIGIT, IFMT ) * DISPLAY 4 SIGNIFICANT DIGITS * 9998 FORMAT( 1X, I4, ' - ', I4, ':', 1X, - $ 1P,2('(',E10.3,',',E10.3,') ') ) + $ 1P,2('(',E10.3,',',E10.3,') ') ) 9997 FORMAT( 1X, I4, ' - ', I4, ':', 1X, $ 1P,1('(',E10.3,',',E10.3,') ') ) * * DISPLAY 6 SIGNIFICANT DIGITS -* +* 9988 FORMAT( 1X, I4, ' - ', I4, ':', 1X, $ 1P,2('(',E12.5,',',E12.5,') ') ) 9987 FORMAT( 1X, I4, ' - ', I4, ':', 1X, @@ -192,7 +192,7 @@ SUBROUTINE CVOUT( LOUT, N, CX, IDIGIT, IFMT ) * DISPLAY 13 SIGNIFICANT DIGITS * 9968 FORMAT( 1X, I4, ' - ', I4, ':', 1X, - $ 1P,1('(',E20.13,',',E20.13,') ') ) + $ 1P,1('(',E20.13,',',E20.13,') ') ) * *========================================================================= * FORMAT FOR 132 COLUMNS @@ -235,6 +235,6 @@ SUBROUTINE CVOUT( LOUT, N, CX, IDIGIT, IFMT ) $ 1P,1('(',E20.13,',',E20.13,') ') ) * * -* +* 9994 FORMAT( 1X, ' ' ) END diff --git a/Toolbox/arpack-src/debug.fi b/Toolbox/arpack-src/debug.h similarity index 66% rename from Toolbox/arpack-src/debug.fi rename to Toolbox/arpack-src/debug.h index 93bd42a4c..5eb0bb1b3 100644 --- a/Toolbox/arpack-src/debug.fi +++ b/Toolbox/arpack-src/debug.h @@ -1,9 +1,16 @@ +c +c\SCCS Information: @(#) +c FILE: debug.h SID: 2.3 DATE OF SID: 11/16/95 RELEASE: 2 +c +c %---------------------------------% +c | See debug.doc for documentation | +c %---------------------------------% integer logfil, ndigit, mgetv0, & msaupd, msaup2, msaitr, mseigt, msapps, msgets, mseupd, & mnaupd, mnaup2, mnaitr, mneigh, mnapps, mngets, mneupd, & mcaupd, mcaup2, mcaitr, mceigh, mcapps, mcgets, mceupd - common /debug/ + common /debug/ & logfil, ndigit, mgetv0, & msaupd, msaup2, msaitr, mseigt, msapps, msgets, mseupd, & mnaupd, mnaup2, mnaitr, mneigh, mnapps, mngets, mneupd, - & mcaupd, mcaup2, mcaitr, mceigh, mcapps, mcgets, mceupd \ No newline at end of file + & mcaupd, mcaup2, mcaitr, mceigh, mcapps, mcgets, mceupd diff --git a/Toolbox/arpack-src/dgetv0.f b/Toolbox/arpack-src/dgetv0.f index 910634f40..8be4fa26d 100644 --- a/Toolbox/arpack-src/dgetv0.f +++ b/Toolbox/arpack-src/dgetv0.f @@ -3,13 +3,13 @@ c c\Name: dgetv0 c -c\Description: +c\Description: c Generate a random initial residual vector for the Arnoldi process. -c Force the residual vector to be in the range of the operator OP. +c Force the residual vector to be in the range of the operator OP. c c\Usage: c call dgetv0 -c ( IDO, BMAT, ITRY, INITV, N, J, V, LDV, RESID, RNORM, +c ( IDO, BMAT, ITRY, INITV, N, J, V, LDV, RESID, RNORM, c IPNTR, WORKD, IERR ) c c\Arguments @@ -36,7 +36,7 @@ c B = 'G' -> generalized eigenvalue problem A*x = lambda*B*x c c ITRY Integer. (INPUT) -c ITRY counts the number of times that dgetv0 is called. +c ITRY counts the number of times that dgetv0 is called. c It should be set to 1 on the initial call to dgetv0. c c INITV Logical variable. (INPUT) @@ -55,11 +55,11 @@ c if this is a "restart". c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c RESID Double precision array of length N. (INPUT/OUTPUT) -c Initial residual vector to be generated. If RESID is +c Initial residual vector to be generated. If RESID is c provided, force RESID into the range of the operator OP. c c RNORM Double precision scalar. (OUTPUT) @@ -88,17 +88,17 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c dvout ARPACK utility routine for vector output. c dlarnv LAPACK routine for generating a random vector. c dgemv Level 2 BLAS routine for matrix vector multiplication. c dcopy Level 1 BLAS that copies one vector to another. -c ddot Level 1 BLAS that computes the scalar product of two vectors. +c ddot Level 1 BLAS that computes the scalar product of two vectors. c dnrm2 Level 1 BLAS that computes the norm of a vector. c c\Author @@ -106,26 +106,26 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: getv0.F SID: 2.7 DATE OF SID: 04/07/99 RELEASE: 2 c c\EndLib c c----------------------------------------------------------------------- c - subroutine dgetv0 - & ( ido, bmat, itry, initv, n, j, v, ldv, resid, rnorm, + subroutine dgetv0 + & ( ido, bmat, itry, initv, n, j, v, ldv, resid, rnorm, & ipntr, workd, ierr ) -c +c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -157,17 +157,17 @@ subroutine dgetv0 c | Local Scalars & Arrays | c %------------------------% c - logical first, inits, orth + logical first, orth integer idist, iseed(4), iter, msglvl, jj Double precision & rnorm0 - save first, iseed, inits, iter, msglvl, orth, rnorm0 + save first, iseed, iter, msglvl, orth, rnorm0 c c %----------------------% c | External Subroutines | c %----------------------% c - external dlarnv, dvout, dcopy, dgemv, second + external dlarnv, dvout, dcopy, dgemv, arscnd c c %--------------------% c | External Functions | @@ -183,12 +183,6 @@ subroutine dgetv0 c intrinsic abs, sqrt c -c %-----------------% -c | Data Statements | -c %-----------------% -c - data inits /.true./ -c c %-----------------------% c | Executable Statements | c %-----------------------% @@ -199,24 +193,21 @@ subroutine dgetv0 c | random number generator | c %-----------------------------------% c - if (inits) then - iseed(1) = 1 - iseed(2) = 3 - iseed(3) = 5 - iseed(4) = 7 - inits = .false. - end if + iseed(1) = 1 + iseed(2) = 3 + iseed(3) = 5 + iseed(4) = 7 c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mgetv0 -c +c ierr = 0 iter = 0 first = .FALSE. @@ -235,23 +226,25 @@ subroutine dgetv0 idist = 2 call dlarnv (idist, iseed, n, resid) end if -c +c c %----------------------------------------------------------% c | Force the starting vector into the range of OP to handle | c | the generalized problem when B is possibly (singular). | c %----------------------------------------------------------% c - call second (t2) - if (bmat .eq. 'G') then + call arscnd (t2) + if (itry .eq. 1) then nopx = nopx + 1 ipntr(1) = 1 ipntr(2) = n + 1 call dcopy (n, resid, 1, workd, 1) ido = -1 go to 9000 + else if (itry .gt. 1 .and. bmat .eq. 'G') then + call dcopy (n, resid, 1, workd(n + 1), 1) end if end if -c +c c %-----------------------------------------% c | Back from computing OP*(initial-vector) | c %-----------------------------------------% @@ -259,26 +252,26 @@ subroutine dgetv0 if (first) go to 20 c c %-----------------------------------------------% -c | Back from computing B*(orthogonalized-vector) | +c | Back from computing OP*(orthogonalized-vector) | c %-----------------------------------------------% c if (orth) go to 40 -c +c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvopx = tmvopx + (t3 - t2) end if -c +c c %------------------------------------------------------% c | Starting vector is now in the range of OP; r = OP*r; | c | Compute B-norm of starting vector. | c %------------------------------------------------------% c - call second (t2) + call arscnd (t2) first = .TRUE. + if (itry .eq. 1) call dcopy (n, workd(n + 1), 1, resid, 1) if (bmat .eq. 'G') then nbx = nbx + 1 - call dcopy (n, workd(n+1), 1, resid, 1) ipntr(1) = n + 1 ipntr(2) = 1 ido = 2 @@ -286,14 +279,14 @@ subroutine dgetv0 else if (bmat .eq. 'I') then call dcopy (n, resid, 1, workd, 1) end if -c +c 20 continue c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c first = .FALSE. if (bmat .eq. 'G') then rnorm0 = ddot (n, resid, 1, workd, 1) @@ -308,7 +301,7 @@ subroutine dgetv0 c %---------------------------------------------% c if (j .eq. 1) go to 50 -c +c c %---------------------------------------------------------------- c | Otherwise need to B-orthogonalize the starting vector against | c | the current Arnoldi basis using Gram-Schmidt with iter. ref. | @@ -324,16 +317,16 @@ subroutine dgetv0 orth = .TRUE. 30 continue c - call dgemv ('T', n, j-1, one, v, ldv, workd, 1, + call dgemv ('T', n, j-1, one, v, ldv, workd, 1, & zero, workd(n+1), 1) - call dgemv ('N', n, j-1, -one, v, ldv, workd(n+1), 1, + call dgemv ('N', n, j-1, -one, v, ldv, workd(n+1), 1, & one, resid, 1) -c +c c %----------------------------------------------------------% c | Compute the B-norm of the orthogonalized starting vector | c %----------------------------------------------------------% c - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call dcopy (n, resid, 1, workd(n+1), 1) @@ -344,14 +337,14 @@ subroutine dgetv0 else if (bmat .eq. 'I') then call dcopy (n, resid, 1, workd, 1) end if -c +c 40 continue c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c if (bmat .eq. 'G') then rnorm = ddot (n, resid, 1, workd, 1) rnorm = sqrt(abs(rnorm)) @@ -364,14 +357,14 @@ subroutine dgetv0 c %--------------------------------------% c if (msglvl .gt. 2) then - call dvout (logfil, 1, rnorm0, ndigit, + call dvout (logfil, 1, [rnorm0], ndigit, & '_getv0: re-orthonalization ; rnorm0 is') - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_getv0: re-orthonalization ; rnorm is') end if c if (rnorm .gt. 0.717*rnorm0) go to 50 -c +c iter = iter + 1 if (iter .le. 5) then c @@ -393,11 +386,11 @@ subroutine dgetv0 rnorm = zero ierr = -1 end if -c +c 50 continue c if (msglvl .gt. 0) then - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_getv0: B-norm of initial / restarted starting vector') end if if (msglvl .gt. 3) then @@ -405,10 +398,10 @@ subroutine dgetv0 & '_getv0: initial / restarted starting vector') end if ido = 99 -c - call second (t1) +c + call arscnd (t1) tgetv0 = tgetv0 + (t1 - t0) -c +c 9000 continue return c diff --git a/Toolbox/arpack-src/dlaqrb.f b/Toolbox/arpack-src/dlaqrb.f deleted file mode 100644 index d851b8636..000000000 --- a/Toolbox/arpack-src/dlaqrb.f +++ /dev/null @@ -1,521 +0,0 @@ -c----------------------------------------------------------------------- -c\BeginDoc -c -c\Name: dlaqrb -c -c\Description: -c Compute the eigenvalues and the Schur decomposition of an upper -c Hessenberg submatrix in rows and columns ILO to IHI. Only the -c last component of the Schur vectors are computed. -c -c This is mostly a modification of the LAPACK routine dlahqr. -c -c\Usage: -c call dlaqrb -c ( WANTT, N, ILO, IHI, H, LDH, WR, WI, Z, INFO ) -c -c\Arguments -c WANTT Logical variable. (INPUT) -c = .TRUE. : the full Schur form T is required; -c = .FALSE.: only eigenvalues are required. -c -c N Integer. (INPUT) -c The order of the matrix H. N >= 0. -c -c ILO Integer. (INPUT) -c IHI Integer. (INPUT) -c It is assumed that H is already upper quasi-triangular in -c rows and columns IHI+1:N, and that H(ILO,ILO-1) = 0 (unless -c ILO = 1). SLAQRB works primarily with the Hessenberg -c submatrix in rows and columns ILO to IHI, but applies -c transformations to all of H if WANTT is .TRUE.. -c 1 <= ILO <= max(1,IHI); IHI <= N. -c -c H Double precision array, dimension (LDH,N). (INPUT/OUTPUT) -c On entry, the upper Hessenberg matrix H. -c On exit, if WANTT is .TRUE., H is upper quasi-triangular in -c rows and columns ILO:IHI, with any 2-by-2 diagonal blocks in -c standard form. If WANTT is .FALSE., the contents of H are -c unspecified on exit. -c -c LDH Integer. (INPUT) -c The leading dimension of the array H. LDH >= max(1,N). -c -c WR Double precision array, dimension (N). (OUTPUT) -c WI Double precision array, dimension (N). (OUTPUT) -c The real and imaginary parts, respectively, of the computed -c eigenvalues ILO to IHI are stored in the corresponding -c elements of WR and WI. If two eigenvalues are computed as a -c complex conjugate pair, they are stored in consecutive -c elements of WR and WI, say the i-th and (i+1)th, with -c WI(i) > 0 and WI(i+1) < 0. If WANTT is .TRUE., the -c eigenvalues are stored in the same order as on the diagonal -c of the Schur form returned in H, with WR(i) = H(i,i), and, if -c H(i:i+1,i:i+1) is a 2-by-2 diagonal block, -c WI(i) = sqrt(H(i+1,i)*H(i,i+1)) and WI(i+1) = -WI(i). -c -c Z Double precision array, dimension (N). (OUTPUT) -c On exit Z contains the last components of the Schur vectors. -c -c INFO Integer. (OUPUT) -c = 0: successful exit -c > 0: SLAQRB failed to compute all the eigenvalues ILO to IHI -c in a total of 30*(IHI-ILO+1) iterations; if INFO = i, -c elements i+1:ihi of WR and WI contain those eigenvalues -c which have been successfully computed. -c -c\Remarks -c 1. None. -c -c----------------------------------------------------------------------- -c -c\BeginLib -c -c\Local variables: -c xxxxxx real -c -c\Routines called: -c dlabad LAPACK routine that computes machine constants. -c dlamch LAPACK routine that determines machine constants. -c dlanhs LAPACK routine that computes various norms of a matrix. -c dlanv2 LAPACK routine that computes the Schur factorization of -c 2 by 2 nonsymmetric matrix in standard form. -c dlarfg LAPACK Householder reflection construction routine. -c dcopy Level 1 BLAS that copies one vector to another. -c drot Level 1 BLAS that applies a rotation to a 2 by 2 matrix. - -c -c\Author -c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas -c -c\Revision history: -c xx/xx/92: Version ' 2.4' -c Modified from the LAPACK routine dlahqr so that only the -c last component of the Schur vectors are computed. -c -c\SCCS Information: @(#) -c FILE: laqrb.F SID: 2.2 DATE OF SID: 8/27/96 RELEASE: 2 -c -c\Remarks -c 1. None -c -c\EndLib -c -c----------------------------------------------------------------------- -c - subroutine dlaqrb ( wantt, n, ilo, ihi, h, ldh, wr, wi, - & z, info ) -c -c %------------------% -c | Scalar Arguments | -c %------------------% -c - logical wantt - integer ihi, ilo, info, ldh, n -c -c %-----------------% -c | Array Arguments | -c %-----------------% -c - Double precision - & h( ldh, * ), wi( * ), wr( * ), z( * ) -c -c %------------% -c | Parameters | -c %------------% -c - Double precision - & zero, one, dat1, dat2 - parameter (zero = 0.0D+0, one = 1.0D+0, dat1 = 7.5D-1, - & dat2 = -4.375D-1) -c -c %------------------------% -c | Local Scalars & Arrays | -c %------------------------% -c - integer i, i1, i2, itn, its, j, k, l, m, nh, nr - Double precision - & cs, h00, h10, h11, h12, h21, h22, h33, h33s, - & h43h34, h44, h44s, ovfl, s, smlnum, sn, sum, - & t1, t2, t3, tst1, ulp, unfl, v1, v2, v3 - Double precision - & v( 3 ), work( 1 ) -c -c %--------------------% -c | External Functions | -c %--------------------% -c - Double precision - & dlamch, dlanhs - external dlamch, dlanhs -c -c %----------------------% -c | External Subroutines | -c %----------------------% -c - external dcopy, dlabad, dlanv2, dlarfg, drot -c -c %-----------------------% -c | Executable Statements | -c %-----------------------% -c - info = 0 -c -c %--------------------------% -c | Quick return if possible | -c %--------------------------% -c - if( n.eq.0 ) - & return - if( ilo.eq.ihi ) then - wr( ilo ) = h( ilo, ilo ) - wi( ilo ) = zero - return - end if -c -c %---------------------------------------------% -c | Initialize the vector of last components of | -c | the Schur vectors for accumulation. | -c %---------------------------------------------% -c - do 5 j = 1, n-1 - z(j) = zero - 5 continue - z(n) = one -c - nh = ihi - ilo + 1 -c -c %-------------------------------------------------------------% -c | Set machine-dependent constants for the stopping criterion. | -c | If norm(H) <= sqrt(OVFL), overflow should not occur. | -c %-------------------------------------------------------------% -c - unfl = dlamch( 'safe minimum' ) - ovfl = one / unfl - call dlabad( unfl, ovfl ) - ulp = dlamch( 'precision' ) - smlnum = unfl*( nh / ulp ) -c -c %---------------------------------------------------------------% -c | I1 and I2 are the indices of the first row and last column | -c | of H to which transformations must be applied. If eigenvalues | -c | only are computed, I1 and I2 are set inside the main loop. | -c | Zero out H(J+2,J) = ZERO for J=1:N if WANTT = .TRUE. | -c | else H(J+2,J) for J=ILO:IHI-ILO-1 if WANTT = .FALSE. | -c %---------------------------------------------------------------% -c - if( wantt ) then - i1 = 1 - i2 = n - do 8 i=1,i2-2 - h(i1+i+1,i) = zero - 8 continue - else - do 9 i=1, ihi-ilo-1 - h(ilo+i+1,ilo+i-1) = zero - 9 continue - end if -c -c %---------------------------------------------------% -c | ITN is the total number of QR iterations allowed. | -c %---------------------------------------------------% -c - itn = 30*nh -c -c ------------------------------------------------------------------ -c The main loop begins here. I is the loop index and decreases from -c IHI to ILO in steps of 1 or 2. Each iteration of the loop works -c with the active submatrix in rows and columns L to I. -c Eigenvalues I+1 to IHI have already converged. Either L = ILO or -c H(L,L-1) is negligible so that the matrix splits. -c ------------------------------------------------------------------ -c - i = ihi - 10 continue - l = ilo - if( i.lt.ilo ) - & go to 150 - -c %--------------------------------------------------------------% -c | Perform QR iterations on rows and columns ILO to I until a | -c | submatrix of order 1 or 2 splits off at the bottom because a | -c | subdiagonal element has become negligible. | -c %--------------------------------------------------------------% - - do 130 its = 0, itn -c -c %----------------------------------------------% -c | Look for a single small subdiagonal element. | -c %----------------------------------------------% -c - do 20 k = i, l + 1, -1 - tst1 = abs( h( k-1, k-1 ) ) + abs( h( k, k ) ) - if( tst1.eq.zero ) - & tst1 = dlanhs( '1', i-l+1, h( l, l ), ldh, work ) - if( abs( h( k, k-1 ) ).le.max( ulp*tst1, smlnum ) ) - & go to 30 - 20 continue - 30 continue - l = k - if( l.gt.ilo ) then -c -c %------------------------% -c | H(L,L-1) is negligible | -c %------------------------% -c - h( l, l-1 ) = zero - end if -c -c %-------------------------------------------------------------% -c | Exit from loop if a submatrix of order 1 or 2 has split off | -c %-------------------------------------------------------------% -c - if( l.ge.i-1 ) - & go to 140 -c -c %---------------------------------------------------------% -c | Now the active submatrix is in rows and columns L to I. | -c | If eigenvalues only are being computed, only the active | -c | submatrix need be transformed. | -c %---------------------------------------------------------% -c - if( .not.wantt ) then - i1 = l - i2 = i - end if -c - if( its.eq.10 .or. its.eq.20 ) then -c -c %-------------------% -c | Exceptional shift | -c %-------------------% -c - s = abs( h( i, i-1 ) ) + abs( h( i-1, i-2 ) ) - h44 = dat1*s - h33 = h44 - h43h34 = dat2*s*s -c - else -c -c %-----------------------------------------% -c | Prepare to use Wilkinson's double shift | -c %-----------------------------------------% -c - h44 = h( i, i ) - h33 = h( i-1, i-1 ) - h43h34 = h( i, i-1 )*h( i-1, i ) - end if -c -c %-----------------------------------------------------% -c | Look for two consecutive small subdiagonal elements | -c %-----------------------------------------------------% -c - do 40 m = i - 2, l, -1 -c -c %---------------------------------------------------------% -c | Determine the effect of starting the double-shift QR | -c | iteration at row M, and see if this would make H(M,M-1) | -c | negligible. | -c %---------------------------------------------------------% -c - h11 = h( m, m ) - h22 = h( m+1, m+1 ) - h21 = h( m+1, m ) - h12 = h( m, m+1 ) - h44s = h44 - h11 - h33s = h33 - h11 - v1 = ( h33s*h44s-h43h34 ) / h21 + h12 - v2 = h22 - h11 - h33s - h44s - v3 = h( m+2, m+1 ) - s = abs( v1 ) + abs( v2 ) + abs( v3 ) - v1 = v1 / s - v2 = v2 / s - v3 = v3 / s - v( 1 ) = v1 - v( 2 ) = v2 - v( 3 ) = v3 - if( m.eq.l ) - & go to 50 - h00 = h( m-1, m-1 ) - h10 = h( m, m-1 ) - tst1 = abs( v1 )*( abs( h00 )+abs( h11 )+abs( h22 ) ) - if( abs( h10 )*( abs( v2 )+abs( v3 ) ).le.ulp*tst1 ) - & go to 50 - 40 continue - 50 continue -c -c %----------------------% -c | Double-shift QR step | -c %----------------------% -c - do 120 k = m, i - 1 -c -c ------------------------------------------------------------ -c The first iteration of this loop determines a reflection G -c from the vector V and applies it from left and right to H, -c thus creating a nonzero bulge below the subdiagonal. -c -c Each subsequent iteration determines a reflection G to -c restore the Hessenberg form in the (K-1)th column, and thus -c chases the bulge one step toward the bottom of the active -c submatrix. NR is the order of G. -c ------------------------------------------------------------ -c - nr = min( 3, i-k+1 ) - if( k.gt.m ) - & call dcopy( nr, h( k, k-1 ), 1, v, 1 ) - call dlarfg( nr, v( 1 ), v( 2 ), 1, t1 ) - if( k.gt.m ) then - h( k, k-1 ) = v( 1 ) - h( k+1, k-1 ) = zero - if( k.lt.i-1 ) - & h( k+2, k-1 ) = zero - else if( m.gt.l ) then - h( k, k-1 ) = -h( k, k-1 ) - end if - v2 = v( 2 ) - t2 = t1*v2 - if( nr.eq.3 ) then - v3 = v( 3 ) - t3 = t1*v3 -c -c %------------------------------------------------% -c | Apply G from the left to transform the rows of | -c | the matrix in columns K to I2. | -c %------------------------------------------------% -c - do 60 j = k, i2 - sum = h( k, j ) + v2*h( k+1, j ) + v3*h( k+2, j ) - h( k, j ) = h( k, j ) - sum*t1 - h( k+1, j ) = h( k+1, j ) - sum*t2 - h( k+2, j ) = h( k+2, j ) - sum*t3 - 60 continue -c -c %----------------------------------------------------% -c | Apply G from the right to transform the columns of | -c | the matrix in rows I1 to min(K+3,I). | -c %----------------------------------------------------% -c - do 70 j = i1, min( k+3, i ) - sum = h( j, k ) + v2*h( j, k+1 ) + v3*h( j, k+2 ) - h( j, k ) = h( j, k ) - sum*t1 - h( j, k+1 ) = h( j, k+1 ) - sum*t2 - h( j, k+2 ) = h( j, k+2 ) - sum*t3 - 70 continue -c -c %----------------------------------% -c | Accumulate transformations for Z | -c %----------------------------------% -c - sum = z( k ) + v2*z( k+1 ) + v3*z( k+2 ) - z( k ) = z( k ) - sum*t1 - z( k+1 ) = z( k+1 ) - sum*t2 - z( k+2 ) = z( k+2 ) - sum*t3 - - else if( nr.eq.2 ) then -c -c %------------------------------------------------% -c | Apply G from the left to transform the rows of | -c | the matrix in columns K to I2. | -c %------------------------------------------------% -c - do 90 j = k, i2 - sum = h( k, j ) + v2*h( k+1, j ) - h( k, j ) = h( k, j ) - sum*t1 - h( k+1, j ) = h( k+1, j ) - sum*t2 - 90 continue -c -c %----------------------------------------------------% -c | Apply G from the right to transform the columns of | -c | the matrix in rows I1 to min(K+3,I). | -c %----------------------------------------------------% -c - do 100 j = i1, i - sum = h( j, k ) + v2*h( j, k+1 ) - h( j, k ) = h( j, k ) - sum*t1 - h( j, k+1 ) = h( j, k+1 ) - sum*t2 - 100 continue -c -c %----------------------------------% -c | Accumulate transformations for Z | -c %----------------------------------% -c - sum = z( k ) + v2*z( k+1 ) - z( k ) = z( k ) - sum*t1 - z( k+1 ) = z( k+1 ) - sum*t2 - end if - 120 continue - - 130 continue -c -c %-------------------------------------------------------% -c | Failure to converge in remaining number of iterations | -c %-------------------------------------------------------% -c - info = i - return - - 140 continue - - if( l.eq.i ) then -c -c %------------------------------------------------------% -c | H(I,I-1) is negligible: one eigenvalue has converged | -c %------------------------------------------------------% -c - wr( i ) = h( i, i ) - wi( i ) = zero - - else if( l.eq.i-1 ) then -c -c %--------------------------------------------------------% -c | H(I-1,I-2) is negligible; | -c | a pair of eigenvalues have converged. | -c | | -c | Transform the 2-by-2 submatrix to standard Schur form, | -c | and compute and store the eigenvalues. | -c %--------------------------------------------------------% -c - call dlanv2( h( i-1, i-1 ), h( i-1, i ), h( i, i-1 ), - & h( i, i ), wr( i-1 ), wi( i-1 ), wr( i ), wi( i ), - & cs, sn ) - - if( wantt ) then -c -c %-----------------------------------------------------% -c | Apply the transformation to the rest of H and to Z, | -c | as required. | -c %-----------------------------------------------------% -c - if( i2.gt.i ) - & call drot( i2-i, h( i-1, i+1 ), ldh, h( i, i+1 ), ldh, - & cs, sn ) - call drot( i-i1-1, h( i1, i-1 ), 1, h( i1, i ), 1, cs, sn ) - sum = cs*z( i-1 ) + sn*z( i ) - z( i ) = cs*z( i ) - sn*z( i-1 ) - z( i-1 ) = sum - end if - end if -c -c %---------------------------------------------------------% -c | Decrement number of remaining iterations, and return to | -c | start of the main loop with new value of I. | -c %---------------------------------------------------------% -c - itn = itn - its - i = l - 1 - go to 10 - - 150 continue - return -c -c %---------------% -c | End of dlaqrb | -c %---------------% -c - end diff --git a/Toolbox/arpack-src/dnaitr.f b/Toolbox/arpack-src/dnaitr.f index b92db4ee9..c02cd3909 100644 --- a/Toolbox/arpack-src/dnaitr.f +++ b/Toolbox/arpack-src/dnaitr.f @@ -3,8 +3,8 @@ c c\Name: dnaitr c -c\Description: -c Reverse communication interface for applying NP additional steps to +c\Description: +c Reverse communication interface for applying NP additional steps to c a K step nonsymmetric Arnoldi factorization. c c Input: OP*V_{k} - V_{k}*H = r_{k}*e_{k}^T @@ -20,7 +20,7 @@ c c\Usage: c call dnaitr -c ( IDO, BMAT, N, K, NP, NB, RESID, RNORM, V, LDV, H, LDH, +c ( IDO, BMAT, N, K, NP, NB, RESID, RNORM, V, LDV, H, LDH, c IPNTR, WORKD, INFO ) c c\Arguments @@ -62,8 +62,8 @@ c Number of additional Arnoldi steps to take. c c NB Integer. (INPUT) -c Blocksize to be used in the recurrence. -c Only work for NB = 1 right now. The goal is to have a +c Blocksize to be used in the recurrence. +c Only work for NB = 1 right now. The goal is to have a c program that implement both the block and non-block method. c c RESID Double precision array of length N. (INPUT/OUTPUT) @@ -75,37 +75,37 @@ c B-norm of the updated residual r_{k+p} on output. c c V Double precision N by K+NP array. (INPUT/OUTPUT) -c On INPUT: V contains the Arnoldi vectors in the first K +c On INPUT: V contains the Arnoldi vectors in the first K c columns. c On OUTPUT: V contains the new NP Arnoldi vectors in the next c NP columns. The first K columns are unchanged. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c H Double precision (K+NP) by (K+NP) array. (INPUT/OUTPUT) c H is used to store the generated upper Hessenberg matrix. c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORK for +c Pointer to mark the starting locations in the WORK for c vectors used by the Arnoldi iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in the +c IPNTR(3): pointer to the vector B * X when used in the c shift-and-invert mode. X is the current operand. c ------------------------------------------------------------- -c +c c WORKD Double precision work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The calling program should not +c for reverse communication. The calling program should not c use WORKD as temporary workspace during the iteration !!!!!! -c On input, WORKD(1:N) = B*RESID and is used to save some +c On input, WORKD(1:N) = B*RESID and is used to save some c computation at the first step. c c INFO Integer. (OUTPUT) @@ -125,14 +125,14 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: c dgetv0 ARPACK routine to generate the initial vector. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c dmout ARPACK utility routine that prints matrices c dvout ARPACK utility routine that prints vectors. c dlabad LAPACK routine that computes machine constants. @@ -143,7 +143,7 @@ c daxpy Level 1 BLAS that computes a vector triad. c dscal Level 1 BLAS that scales a vector. c dcopy Level 1 BLAS that copies one vector to another . -c ddot Level 1 BLAS that computes the scalar product of two vectors. +c ddot Level 1 BLAS that computes the scalar product of two vectors. c dnrm2 Level 1 BLAS that computes the norm of a vector. c c\Author @@ -151,22 +151,22 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: c xx/xx/92: Version ' 2.4' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: naitr.F SID: 2.4 DATE OF SID: 8/27/96 RELEASE: 2 c c\Remarks c The algorithm implemented is: -c +c c restart = .false. -c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; +c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; c r_{k} contains the initial residual vector even for k = 0; -c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already +c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already c computed by the calling program. c c betaj = rnorm ; p_{k+1} = B*r_{k} ; @@ -174,7 +174,7 @@ c 1) if ( betaj < tol ) stop or restart depending on j. c ( At present tol is zero ) c if ( restart ) generate a new starting vector. -c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; +c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; c p_{j} = p_{j}/betaj c 3) r_{j} = OP*v_{j} where OP is defined as in dnaupd c For shift-invert mode p_{j} = B*v_{j} is already available. @@ -189,7 +189,7 @@ c 5) Re-orthogonalization step: c s = V_{j}'*B*r_{j} c r_{j} = r_{j} - V_{j}*s; rnorm1 = || r_{j} || -c alphaj = alphaj + s_{j}; +c alphaj = alphaj + s_{j}; c 6) Iterative refinement step: c If (rnorm1 > 0.717*rnorm) then c rnorm = rnorm1 @@ -199,7 +199,7 @@ c If this is the first time in step 6), go to 5) c Else r_{j} lies in the span of V_{j} numerically. c Set r_{j} = 0 and rnorm = 0; go to 1) -c EndIf +c EndIf c End Do c c\EndLib @@ -207,15 +207,15 @@ c----------------------------------------------------------------------- c subroutine dnaitr - & (ido, bmat, n, k, np, nb, resid, rnorm, v, ldv, h, ldh, + & (ido, bmat, n, k, np, nb, resid, rnorm, v, ldv, h, ldh, & ipntr, workd, info) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -250,14 +250,14 @@ subroutine dnaitr integer ierr, i, infol, ipj, irj, ivj, iter, itry, j, msglvl, & jj Double precision - & betaj, ovfl, temp1, rnorm1, smlnum, tst1, ulp, unfl, + & betaj, ovfl, temp1, rnorm1, smlnum, tst1, ulp, unfl, & wnorm save first, orth1, orth2, rstart, step3, step4, & ierr, ipj, irj, ivj, iter, itry, j, msglvl, ovfl, & betaj, rnorm1, smlnum, ulp, unfl, wnorm c c %-----------------------% -c | Local Array Arguments | +c | Local Array Arguments | c %-----------------------% c Double precision @@ -267,8 +267,8 @@ subroutine dnaitr c | External Subroutines | c %----------------------% c - external daxpy, dcopy, dscal, dgemv, dgetv0, dlabad, - & dvout, dmout, ivout, second + external daxpy, dcopy, dscal, dgemv, dgetv0, dlabad, + & dvout, dmout, ivout, arscnd c c %--------------------% c | External Functions | @@ -313,15 +313,15 @@ subroutine dnaitr end if c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mnaitr -c +c c %------------------------------% c | Initial call to this routine | c %------------------------------% @@ -337,7 +337,7 @@ subroutine dnaitr irj = ipj + n ivj = irj + n end if -c +c c %-------------------------------------------------% c | When in reverse communication mode one of: | c | STEP3, STEP4, ORTH1, ORTH2, RSTART | @@ -367,19 +367,19 @@ subroutine dnaitr c | | c | Note: B*r_{j-1} is already in WORKD(1:N)=WORKD(IPJ:IPJ+N-1) | c %--------------------------------------------------------------% - + 1000 continue c if (msglvl .gt. 1) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: generating Arnoldi vector number') - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_naitr: B-norm of the current residual is') end if -c +c c %---------------------------------------------------% c | STEP 1: Check if the B norm of j-th residual | -c | vector is zero. Equivalent to determing whether | +c | vector is zero. Equivalent to determining whether | c | an exact j-step Arnoldi factorization is present. | c %---------------------------------------------------% c @@ -393,16 +393,16 @@ subroutine dnaitr c %---------------------------------------------------% c if (msglvl .gt. 0) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: ****** RESTART AT STEP ******') end if -c +c c %---------------------------------------------% c | ITRY is the loop variable that controls the | c | maximum amount of times that a restart is | c | attempted. NRSTRT is used by stat.h | c %---------------------------------------------% -c +c betaj = zero nrstrt = nrstrt + 1 itry = 1 @@ -416,7 +416,7 @@ subroutine dnaitr c | RSTART = .true. flow returns here. | c %--------------------------------------% c - call dgetv0 (ido, bmat, itry, .false., n, j, v, ldv, + call dgetv0 (ido, bmat, itry, .false., n, j, v, ldv, & resid, rnorm, ipntr, workd, ierr) if (ido .ne. 99) go to 9000 if (ierr .lt. 0) then @@ -430,12 +430,12 @@ subroutine dnaitr c %------------------------------------------------% c info = j - 1 - call second (t1) + call arscnd (t1) tnaitr = tnaitr + (t1 - t0) ido = 99 go to 9000 end if -c +c 40 continue c c %---------------------------------------------------------% @@ -457,9 +457,9 @@ subroutine dnaitr c | use LAPACK routine SLASCL | c %-----------------------------------------% c - call dlascl ('General', i, i, rnorm, one, n, 1, + call dlascl ('General', i, i, rnorm, one, n, 1, & v(1,j), n, infol) - call dlascl ('General', i, i, rnorm, one, n, 1, + call dlascl ('General', i, i, rnorm, one, n, 1, & workd(ipj), n, infol) end if c @@ -470,29 +470,29 @@ subroutine dnaitr c step3 = .true. nopx = nopx + 1 - call second (t2) + call arscnd (t2) call dcopy (n, v(1,j), 1, workd(ivj), 1) ipntr(1) = ivj ipntr(2) = irj ipntr(3) = ipj ido = 1 -c +c c %-----------------------------------% c | Exit in order to compute OP*v_{j} | c %-----------------------------------% -c - go to 9000 +c + go to 9000 50 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(IRJ:IRJ+N-1) := OP*v_{j} | c | if step3 = .true. | c %----------------------------------% c - call second (t3) + call arscnd (t3) tmvopx = tmvopx + (t3 - t2) - + step3 = .false. c c %------------------------------------------% @@ -500,30 +500,30 @@ subroutine dnaitr c %------------------------------------------% c call dcopy (n, workd(irj), 1, resid, 1) -c +c c %---------------------------------------% c | STEP 4: Finish extending the Arnoldi | c | factorization to length j. | c %---------------------------------------% c - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 step4 = .true. ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-------------------------------------% c | Exit in order to compute B*OP*v_{j} | c %-------------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call dcopy (n, resid, 1, workd(ipj), 1) end if 60 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(IPJ:IPJ+N-1) := B*OP*v_{j} | @@ -531,10 +531,10 @@ subroutine dnaitr c %----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c step4 = .false. c c %-------------------------------------% @@ -542,7 +542,7 @@ subroutine dnaitr c | Compute the B-norm of OP*v_{j}. | c %-------------------------------------% c - if (bmat .eq. 'G') then + if (bmat .eq. 'G') then wnorm = ddot (n, resid, 1, workd(ipj), 1) wnorm = sqrt(abs(wnorm)) else if (bmat .eq. 'I') then @@ -562,13 +562,13 @@ subroutine dnaitr c | Compute the j Fourier coefficients w_{j} | c | WORKD(IPJ:IPJ+N-1) contains B*OP*v_{j}. | c %------------------------------------------% -c +c call dgemv ('T', n, j, one, v, ldv, workd(ipj), 1, & zero, h(1,j), 1) c c %--------------------------------------% c | Orthogonalize r_{j} against V_{j}. | -c | RESID contains OP*v_{j}. See STEP 3. | +c | RESID contains OP*v_{j}. See STEP 3. | c %--------------------------------------% c call dgemv ('N', n, j, -one, v, ldv, h(1,j), 1, @@ -576,51 +576,51 @@ subroutine dnaitr c if (j .gt. 1) h(j,j-1) = betaj c - call second (t4) -c + call arscnd (t4) +c orth1 = .true. c - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call dcopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*r_{j} | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call dcopy (n, resid, 1, workd(ipj), 1) - end if + end if 70 continue -c +c c %---------------------------------------------------% c | Back from reverse communication if ORTH1 = .true. | c | WORKD(IPJ:IPJ+N-1) := B*r_{j}. | c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c orth1 = .false. c c %------------------------------% c | Compute the B-norm of r_{j}. | c %------------------------------% c - if (bmat .eq. 'G') then + if (bmat .eq. 'G') then rnorm = ddot (n, resid, 1, workd(ipj), 1) rnorm = sqrt(abs(rnorm)) else if (bmat .eq. 'I') then rnorm = dnrm2(n, resid, 1) end if -c +c c %-----------------------------------------------------------% c | STEP 5: Re-orthogonalization / Iterative refinement phase | c | Maximum NITER_ITREF tries. | @@ -642,20 +642,20 @@ subroutine dnaitr if (rnorm .gt. 0.717*wnorm) go to 100 iter = 0 nrorth = nrorth + 1 -c +c c %---------------------------------------------------% c | Enter the Iterative refinement phase. If further | c | refinement is necessary, loop back here. The loop | c | variable is ITER. Perform a step of Classical | c | Gram-Schmidt using all the Arnoldi vectors V_{j} | c %---------------------------------------------------% -c +c 80 continue c if (msglvl .gt. 2) then xtemp(1) = wnorm xtemp(2) = rnorm - call dvout (logfil, 2, xtemp, ndigit, + call dvout (logfil, 2, xtemp, ndigit, & '_naitr: re-orthonalization; wnorm and rnorm are') call dvout (logfil, j, h(1,j), ndigit, & '_naitr: j-th column of H') @@ -666,7 +666,7 @@ subroutine dnaitr c | WORKD(IRJ:IRJ+J-1) = v(:,1:J)'*WORKD(IPJ:IPJ+N-1). | c %----------------------------------------------------% c - call dgemv ('T', n, j, one, v, ldv, workd(ipj), 1, + call dgemv ('T', n, j, one, v, ldv, workd(ipj), 1, & zero, workd(irj), 1) c c %---------------------------------------------% @@ -676,28 +676,28 @@ subroutine dnaitr c | + v(:,1:J)*WORKD(IRJ:IRJ+J-1)*e'_j. | c %---------------------------------------------% c - call dgemv ('N', n, j, -one, v, ldv, workd(irj), 1, + call dgemv ('N', n, j, -one, v, ldv, workd(irj), 1, & one, resid, 1) call daxpy (j, one, workd(irj), 1, h(1,j), 1) -c +c orth2 = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call dcopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-----------------------------------% c | Exit in order to compute B*r_{j}. | c | r_{j} is the corrected residual. | c %-----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call dcopy (n, resid, 1, workd(ipj), 1) - end if + end if 90 continue c c %---------------------------------------------------% @@ -705,15 +705,15 @@ subroutine dnaitr c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if c c %-----------------------------------------------------% c | Compute the B-norm of the corrected residual r_{j}. | c %-----------------------------------------------------% -c - if (bmat .eq. 'G') then +c + if (bmat .eq. 'G') then rnorm1 = ddot (n, resid, 1, workd(ipj), 1) rnorm1 = sqrt(abs(rnorm1)) else if (bmat .eq. 'I') then @@ -721,7 +721,7 @@ subroutine dnaitr end if c if (msglvl .gt. 0 .and. iter .gt. 0) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: Iterative refinement for Arnoldi residual') if (msglvl .gt. 2) then xtemp(1) = rnorm @@ -749,7 +749,7 @@ subroutine dnaitr c %---------------------------------------% c rnorm = rnorm1 -c +c else c c %-------------------------------------------% @@ -771,50 +771,50 @@ subroutine dnaitr 95 continue rnorm = zero end if -c +c c %----------------------------------------------% c | Branch here directly if iterative refinement | c | wasn't necessary or after at most NITER_REF | c | steps of iterative refinement. | c %----------------------------------------------% -c +c 100 continue -c +c rstart = .false. orth2 = .false. -c - call second (t5) +c + call arscnd (t5) titref = titref + (t5 - t4) -c +c c %------------------------------------% c | STEP 6: Update j = j+1; Continue | c %------------------------------------% c j = j + 1 if (j .gt. k+np) then - call second (t1) + call arscnd (t1) tnaitr = tnaitr + (t1 - t0) ido = 99 do 110 i = max(1,k), k+np-1 -c +c c %--------------------------------------------% c | Check for splitting and deflation. | c | Use a standard test as in the QR algorithm | c | REFERENCE: LAPACK subroutine dlahqr | c %--------------------------------------------% -c +c tst1 = abs( h( i, i ) ) + abs( h( i+1, i+1 ) ) if( tst1.eq.zero ) & tst1 = dlanhs( '1', k+np, h, ldh, workd(n+1) ) - if( abs( h( i+1,i ) ).le.max( ulp*tst1, smlnum ) ) + if( abs( h( i+1,i ) ).le.max( ulp*tst1, smlnum ) ) & h(i+1,i) = zero 110 continue -c +c if (msglvl .gt. 2) then - call dmout (logfil, k+np, k+np, h, ldh, ndigit, + call dmout (logfil, k+np, k+np, h, ldh, ndigit, & '_naitr: Final upper Hessenberg matrix H of order K+NP') end if -c +c go to 9000 end if c @@ -823,7 +823,7 @@ subroutine dnaitr c %--------------------------------------------------------% c go to 1000 -c +c c %---------------------------------------------------------------% c | | c | E N D O F M A I N I T E R A T I O N L O O P | diff --git a/Toolbox/arpack-src/dnapps.f b/Toolbox/arpack-src/dnapps.f index 2a72e0941..1cf372569 100644 --- a/Toolbox/arpack-src/dnapps.f +++ b/Toolbox/arpack-src/dnapps.f @@ -13,14 +13,14 @@ c A*(V_{k}*Q) - (V_{k}*Q)*(Q^T* H_{k}*Q) = r_{k+p}*e_{k+p}^T * Q c c where Q is an orthogonal matrix which is the product of rotations -c and reflections resulting from the NP bulge chage sweeps. +c and reflections resulting from the NP bulge change sweeps. c The updated Arnoldi factorization becomes: c c A*VNEW_{k} - VNEW_{k}*HNEW_{k} = rnew_{k}*e_{k}^T. c c\Usage: c call dnapps -c ( N, KEV, NP, SHIFTR, SHIFTI, V, LDV, H, LDH, RESID, Q, LDQ, +c ( N, KEV, NP, SHIFTR, SHIFTI, V, LDV, H, LDH, RESID, Q, LDQ, c WORKL, WORKD ) c c\Arguments @@ -29,8 +29,8 @@ c c KEV Integer. (INPUT/OUTPUT) c KEV+NP is the size of the input matrix H. -c KEV is the size of the updated matrix HNEW. KEV is only -c updated on ouput when fewer than NP shifts are applied in +c KEV is the size of the updated matrix HNEW. KEV is only +c updated on output when fewer than NP shifts are applied in c order to keep the conjugate pair together. c c NP Integer. (INPUT) @@ -38,7 +38,7 @@ c c SHIFTR, Double precision array of length NP. (INPUT) c SHIFTI Real and imaginary part of the shifts to be applied. -c Upon, entry to dnapps, the shifts must be sorted so that the +c Upon, entry to dnapps, the shifts must be sorted so that the c conjugate pairs are in consecutive locations. c c V Double precision N by (KEV+NP) array. (INPUT/OUTPUT) @@ -51,7 +51,7 @@ c program. c c H Double precision (KEV+NP) by (KEV+NP) array. (INPUT/OUTPUT) -c On INPUT, H contains the current KEV+NP by KEV+NP upper +c On INPUT, H contains the current KEV+NP by KEV+NP upper c Hessenber matrix of the Arnoldi factorization. c On OUTPUT, H contains the updated KEV by KEV upper Hessenberg c matrix in the KEV leading submatrix. @@ -62,7 +62,7 @@ c c RESID Double precision array of length N. (INPUT/OUTPUT) c On INPUT, RESID contains the the residual vector r_{k+p}. -c On OUTPUT, RESID is the update residual vector rnew_{k} +c On OUTPUT, RESID is the update residual vector rnew_{k} c in the first KEV locations. c c Q Double precision KEV+NP by KEV+NP work array. (WORKSPACE) @@ -97,12 +97,12 @@ c c\Routines called: c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c dmout ARPACK utility routine that prints matrices. c dvout ARPACK utility routine that prints vectors. c dlabad LAPACK routine that computes machine constants. c dlacpy LAPACK matrix copy routine. -c dlamch LAPACK routine that determines machine constants. +c dlamch LAPACK routine that determines machine constants. c dlanhs LAPACK routine that computes various norms of a matrix. c dlapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. c dlarf LAPACK routine that applies Householder reflection to @@ -120,13 +120,13 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.4' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: napps.F SID: 2.4 DATE OF SID: 3/28/97 RELEASE: 2 c c\Remarks @@ -141,15 +141,15 @@ c----------------------------------------------------------------------- c subroutine dnapps - & ( n, kev, np, shiftr, shifti, v, ldv, h, ldh, resid, q, ldq, + & ( n, kev, np, shiftr, shifti, v, ldv, h, ldh, resid, q, ldq, & workl, workd ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -162,7 +162,7 @@ subroutine dnapps c %-----------------% c Double precision - & h(ldh,kev+np), resid(n), shifti(np), shiftr(np), + & h(ldh,kev+np), resid(n), shifti(np), shiftr(np), & v(ldv,kev+np), q(ldq,kev+np), workd(2*n), workl(kev+np) c c %------------% @@ -180,16 +180,16 @@ subroutine dnapps integer i, iend, ir, istart, j, jj, kplusp, msglvl, nr logical cconj, first Double precision - & c, f, g, h11, h12, h21, h22, h32, ovfl, r, s, sigmai, + & c, f, g, h11, h12, h21, h22, h32, ovfl, r, s, sigmai, & sigmar, smlnum, ulp, unfl, u(3), t, tau, tst1 - save first, ovfl, smlnum, ulp, unfl + save first, ovfl, smlnum, ulp, unfl c c %----------------------% c | External Subroutines | c %----------------------% c external daxpy, dcopy, dscal, dlacpy, dlarfg, dlarf, - & dlaset, dlabad, second, dlartg + & dlaset, dlabad, arscnd, dlartg c c %--------------------% c | External Functions | @@ -206,7 +206,7 @@ subroutine dnapps intrinsic abs, max, min c c %----------------% -c | Data statments | +c | Data statements | c %----------------% c data first / .true. / @@ -237,10 +237,10 @@ subroutine dnapps c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mnapps - kplusp = kev + np -c + kplusp = kev + np +c c %--------------------------------------------% c | Initialize Q to the identity to accumulate | c | the rotations and reflections | @@ -266,11 +266,11 @@ subroutine dnapps sigmai = shifti(jj) c if (msglvl .gt. 2 ) then - call ivout (logfil, 1, jj, ndigit, + call ivout (logfil, 1, [jj], ndigit, & '_napps: shift number.') - call dvout (logfil, 1, sigmar, ndigit, + call dvout (logfil, 1, [sigmar], ndigit, & '_napps: The real part of the shift ') - call dvout (logfil, 1, sigmai, ndigit, + call dvout (logfil, 1, [sigmai], ndigit, & '_napps: The imaginary part of the shift ') end if c @@ -335,11 +335,11 @@ subroutine dnapps & tst1 = dlanhs( '1', kplusp-jj+1, h, ldh, workl ) if( abs( h( i+1,i ) ).le.max( ulp*tst1, smlnum ) ) then if (msglvl .gt. 0) then - call ivout (logfil, 1, i, ndigit, + call ivout (logfil, 1, [i], ndigit, & '_napps: matrix splitting at row/column no.') - call ivout (logfil, 1, jj, ndigit, + call ivout (logfil, 1, [jj], ndigit, & '_napps: matrix splitting with shift number.') - call dvout (logfil, 1, h(i+1,i), ndigit, + call dvout (logfil, 1, h(i+1,i), ndigit, & '_napps: off diagonal element.') end if iend = i @@ -351,9 +351,9 @@ subroutine dnapps 40 continue c if (msglvl .gt. 2) then - call ivout (logfil, 1, istart, ndigit, + call ivout (logfil, 1, [istart], ndigit, & '_napps: Start of current block ') - call ivout (logfil, 1, iend, ndigit, + call ivout (logfil, 1, [iend], ndigit, & '_napps: End of current block ') end if c @@ -368,7 +368,7 @@ subroutine dnapps c | complex conjugate pair of shifts on a 2 by 2 matrix. | c %------------------------------------------------------% c - if ( istart + 1 .eq. iend .and. abs( sigmai ) .gt. zero ) + if ( istart + 1 .eq. iend .and. abs( sigmai ) .gt. zero ) & go to 100 c h11 = h(istart,istart) @@ -381,11 +381,11 @@ subroutine dnapps c f = h11 - sigmar g = h21 -c +c do 80 i = istart, iend-1 c c %-----------------------------------------------------% -c | Contruct the plane rotation G to zero out the bulge | +c | Construct the plane rotation G to zero out the bulge | c %-----------------------------------------------------% c call dlartg (f, g, c, s, r) @@ -413,7 +413,7 @@ subroutine dnapps do 50 j = i, kplusp t = c*h(i,j) + s*h(i+1,j) h(i+1,j) = -s*h(i,j) + c*h(i+1,j) - h(i,j) = t + h(i,j) = t 50 continue c c %---------------------------------------------% @@ -423,17 +423,17 @@ subroutine dnapps do 60 j = 1, min(i+2,iend) t = c*h(j,i) + s*h(j,i+1) h(j,i+1) = -s*h(j,i) + c*h(j,i+1) - h(j,i) = t + h(j,i) = t 60 continue c c %----------------------------------------------------% c | Accumulate the rotation in the matrix Q; Q <- Q*G | c %----------------------------------------------------% c - do 70 j = 1, min( i+jj, kplusp ) + do 70 j = 1, min( i+jj, kplusp ) t = c*q(j,i) + s*q(j,i+1) q(j,i+1) = - s*q(j,i) + c*q(j,i+1) - q(j,i) = t + q(j,i) = t 70 continue c c %---------------------------% @@ -449,7 +449,7 @@ subroutine dnapps c %-----------------------------------% c | Finished applying the real shift. | c %-----------------------------------% -c +c else c c %----------------------------------------------------% @@ -465,9 +465,9 @@ subroutine dnapps c %---------------------------------------------------------% c s = 2.0*sigmar - t = dlapy2 ( sigmar, sigmai ) + t = dlapy2 ( sigmar, sigmai ) u(1) = ( h11 * (h11 - s) + t * t ) / h21 + h12 - u(2) = h11 + h22 - s + u(2) = h11 + h22 - s u(3) = h32 c do 90 i = istart, iend-1 @@ -507,7 +507,7 @@ subroutine dnapps c | Accumulate the reflector in the matrix Q; Q <- Q*G | c %-----------------------------------------------------% c - call dlarf ('Right', kplusp, nr, u, 1, tau, + call dlarf ('Right', kplusp, nr, u, 1, tau, & q(1,i), ldq, workl) c c %----------------------------% @@ -526,7 +526,7 @@ subroutine dnapps c | Finished applying a complex pair of shifts | c | to the current block | c %--------------------------------------------% -c +c end if c 100 continue @@ -568,7 +568,7 @@ subroutine dnapps tst1 = abs( h( i, i ) ) + abs( h( i+1, i+1 ) ) if( tst1.eq.zero ) & tst1 = dlanhs( '1', kev, h, ldh, workl ) - if( h( i+1,i ) .le. max( ulp*tst1, smlnum ) ) + if( h( i+1,i ) .le. max( ulp*tst1, smlnum ) ) & h(i+1,i) = zero 130 continue c @@ -581,9 +581,9 @@ subroutine dnapps c %-------------------------------------------------% c if (h(kev+1,kev) .gt. zero) - & call dgemv ('N', n, kplusp, one, v, ldv, q(1,kev+1), 1, zero, + & call dgemv ('N', n, kplusp, one, v, ldv, q(1,kev+1), 1, zero, & workd(n+1), 1) -c +c c %----------------------------------------------------------% c | Compute column 1 to kev of (V*Q) in backward order | c | taking advantage of the upper Hessenberg structure of Q. | @@ -599,15 +599,17 @@ subroutine dnapps c | Move v(:,kplusp-kev+1:kplusp) into v(:,1:kev). | c %-------------------------------------------------% c - call dlacpy ('A', n, kev, v(1,kplusp-kev+1), ldv, v, ldv) -c + do 150 i = 1, kev + call dcopy(n, v(1,kplusp-kev+i), 1, v(1,i), 1) + 150 continue +c c %--------------------------------------------------------------% c | Copy the (kev+1)-st column of (V*Q) in the appropriate place | c %--------------------------------------------------------------% c if (h(kev+1,kev) .gt. zero) & call dcopy (n, workd(n+1), 1, v(1,kev+1), 1) -c +c c %-------------------------------------% c | Update the residual vector: | c | r <- sigmak*r + betak*v(:,kev+1) | @@ -625,7 +627,7 @@ subroutine dnapps & '_napps: sigmak = (e_{kev+p}^T*Q)*e_{kev}') call dvout (logfil, 1, h(kev+1,kev), ndigit, & '_napps: betak = e_{kev+1}^T*H*e_{kev}') - call ivout (logfil, 1, kev, ndigit, + call ivout (logfil, 1, [kev], ndigit, & '_napps: Order of the final Hessenberg matrix ') if (msglvl .gt. 2) then call dmout (logfil, kev, kev, h, ldh, ndigit, @@ -633,11 +635,11 @@ subroutine dnapps end if c end if -c +c 9000 continue - call second (t1) + call arscnd (t1) tnapps = tnapps + (t1 - t0) -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/dnaup2.f b/Toolbox/arpack-src/dnaup2.f index 7afe60f8a..86375a646 100644 --- a/Toolbox/arpack-src/dnaup2.f +++ b/Toolbox/arpack-src/dnaup2.f @@ -2,67 +2,67 @@ c c\Name: dnaup2 c -c\Description: -c Intermediate level interface called by dnaupd. +c\Description: +c Intermediate level interface called by dnaupd . c c\Usage: c call dnaup2 c ( IDO, BMAT, N, WHICH, NEV, NP, TOL, RESID, MODE, IUPD, -c ISHIFT, MXITER, V, LDV, H, LDH, RITZR, RITZI, BOUNDS, +c ISHIFT, MXITER, V, LDV, H, LDH, RITZR, RITZI, BOUNDS, c Q, LDQ, WORKL, IPNTR, WORKD, INFO ) c c\Arguments c -c IDO, BMAT, N, WHICH, NEV, TOL, RESID: same as defined in dnaupd. -c MODE, ISHIFT, MXITER: see the definition of IPARAM in dnaupd. +c IDO, BMAT, N, WHICH, NEV, TOL, RESID: same as defined in dnaupd . +c MODE, ISHIFT, MXITER: see the definition of IPARAM in dnaupd . c c NP Integer. (INPUT/OUTPUT) -c Contains the number of implicit shifts to apply during -c each Arnoldi iteration. -c If ISHIFT=1, NP is adjusted dynamically at each iteration +c Contains the number of implicit shifts to apply during +c each Arnoldi iteration. +c If ISHIFT=1, NP is adjusted dynamically at each iteration c to accelerate convergence and prevent stagnation. -c This is also roughly equal to the number of matrix-vector +c This is also roughly equal to the number of matrix-vector c products (involving the operator OP) per Arnoldi iteration. c The logic for adjusting is contained within the current c subroutine. c If ISHIFT=0, NP is the number of shifts the user needs -c to provide via reverse comunication. 0 < NP < NCV-NEV. +c to provide via reverse communication. 0 < NP < NCV-NEV. c NP may be less than NCV-NEV for two reasons. The first, is -c to keep complex conjugate pairs of "wanted" Ritz values +c to keep complex conjugate pairs of "wanted" Ritz values c together. The second, is that a leading block of the current c upper Hessenberg matrix has split off and contains "unwanted" c Ritz values. -c Upon termination of the IRA iteration, NP contains the number +c Upon termination of the IRA iteration, NP contains the number c of "converged" wanted Ritz values. c c IUPD Integer. (INPUT) c IUPD .EQ. 0: use explicit restart instead implicit update. c IUPD .NE. 0: use implicit update. c -c V Double precision N by (NEV+NP) array. (INPUT/OUTPUT) -c The Arnoldi basis vectors are returned in the first NEV +c V Double precision N by (NEV+NP) array. (INPUT/OUTPUT) +c The Arnoldi basis vectors are returned in the first NEV c columns of V. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c -c H Double precision (NEV+NP) by (NEV+NP) array. (OUTPUT) +c H Double precision (NEV+NP) by (NEV+NP) array. (OUTPUT) c H is used to store the generated upper Hessenberg matrix c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c -c RITZR, Double precision arrays of length NEV+NP. (OUTPUT) +c RITZR, Double precision arrays of length NEV+NP. (OUTPUT) c RITZI RITZR(1:NEV) (resp. RITZI(1:NEV)) contains the real (resp. c imaginary) part of the computed Ritz values of OP. c -c BOUNDS Double precision array of length NEV+NP. (OUTPUT) -c BOUNDS(1:NEV) contain the error bounds corresponding to +c BOUNDS Double precision array of length NEV+NP. (OUTPUT) +c BOUNDS(1:NEV) contain the error bounds corresponding to c the computed Ritz values. -c -c Q Double precision (NEV+NP) by (NEV+NP) array. (WORKSPACE) +c +c Q Double precision (NEV+NP) by (NEV+NP) array. (WORKSPACE) c Private (replicated) work array used to accumulate the c rotation in the shift application step. c @@ -70,7 +70,7 @@ c Leading dimension of Q exactly as declared in the calling c program. c -c WORKL Double precision work array of length at least +c WORKL Double precision work array of length at least c (NEV+NP)**2 + 3*(NEV+NP). (INPUT/WORKSPACE) c Private (replicated) array on each PE or array allocated on c the front end. It is used in shifts calculation, shifts @@ -79,23 +79,23 @@ c On exit, the last 3*(NEV+NP) locations of WORKL contain c the Ritz values (real,imaginary) and associated Ritz c estimates of the current Hessenberg matrix. They are -c listed in the same order as returned from dneigh. +c listed in the same order as returned from dneigh . c c If ISHIFT .EQ. O and IDO .EQ. 3, the first 2*NP locations -c of WORKL are used in reverse communication to hold the user +c of WORKL are used in reverse communication to hold the user c supplied shifts. c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORKD for +c Pointer to mark the starting locations in the WORKD for c vectors used by the Arnoldi iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in the +c IPNTR(3): pointer to the vector B * X when used in the c shift-and-invert mode. X is the current operand. c ------------------------------------------------------------- -c -c WORKD Double precision work array of length 3*N. (WORKSPACE) +c +c WORKD Double precision work array of length 3*N. (WORKSPACE) c Distributed array to be used in the basic Arnoldi iteration c for reverse communication. The user should not use WORKD c as temporary workspace during the iteration !!!!!!!!!! @@ -108,7 +108,7 @@ c Error flag on output. c = 0: Normal return. c = 1: Maximum number of iterations taken. -c All possible eigenvalues of OP has been found. +c All possible eigenvalues of OP has been found. c NP returns the number of converged Ritz values. c = 2: No shifts could be applied. c = -8: Error return from LAPACK eigenvalue calculation; @@ -130,38 +130,38 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: -c dgetv0 ARPACK initial vector generation routine. -c dnaitr ARPACK Arnoldi factorization routine. -c dnapps ARPACK application of implicit shifts routine. -c dnconv ARPACK convergence of Ritz values routine. -c dneigh ARPACK compute Ritz values and error bounds routine. -c dngets ARPACK reorder Ritz values and error bounds routine. -c dsortc ARPACK sorting routine. +c dgetv0 ARPACK initial vector generation routine. +c dnaitr ARPACK Arnoldi factorization routine. +c dnapps ARPACK application of implicit shifts routine. +c dnconv ARPACK convergence of Ritz values routine. +c dneigh ARPACK compute Ritz values and error bounds routine. +c dngets ARPACK reorder Ritz values and error bounds routine. +c dsortc ARPACK sorting routine. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. -c dmout ARPACK utility routine that prints matrices -c dvout ARPACK utility routine that prints vectors. -c dlamch LAPACK routine that determines machine constants. -c dlapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. -c dcopy Level 1 BLAS that copies one vector to another . -c ddot Level 1 BLAS that computes the scalar product of two vectors. -c dnrm2 Level 1 BLAS that computes the norm of a vector. -c dswap Level 1 BLAS that swaps two vectors. +c arscnd ARPACK utility routine for timing. +c dmout ARPACK utility routine that prints matrices +c dvout ARPACK utility routine that prints vectors. +c dlamch LAPACK routine that determines machine constants. +c dlapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. +c dcopy Level 1 BLAS that copies one vector to another . +c ddot Level 1 BLAS that computes the scalar product of two vectors. +c dnrm2 Level 1 BLAS that computes the norm of a vector. +c dswap Level 1 BLAS that swaps two vectors. c c\Author c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas +c Richard Lehoucq CRPC / Rice University +c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c -c\SCCS Information: @(#) +c Rice University +c Houston, Texas +c +c\SCCS Information: @(#) c FILE: naup2.F SID: 2.8 DATE OF SID: 10/17/00 RELEASE: 2 c c\Remarks @@ -172,16 +172,16 @@ c----------------------------------------------------------------------- c subroutine dnaup2 - & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, - & ishift, mxiter, v, ldv, h, ldh, ritzr, ritzi, bounds, + & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, + & ishift, mxiter, v, ldv, h, ldh, ritzr, ritzi, bounds, & q, ldq, workl, ipntr, workd, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -200,7 +200,7 @@ subroutine dnaup2 integer ipntr(13) Double precision & bounds(nev+np), h(ldh,nev+np), q(ldq,nev+np), resid(n), - & ritzi(nev+np), ritzr(nev+np), v(ldv,nev+np), + & ritzi(nev+np), ritzr(nev+np), v(ldv,nev+np), & workd(3*n), workl( (nev+np)*(nev+np+3) ) c c %------------% @@ -209,7 +209,7 @@ subroutine dnaup2 c Double precision & one, zero - parameter (one = 1.0D+0, zero = 0.0D+0) + parameter (one = 1.0D+0 , zero = 0.0D+0 ) c c %---------------% c | Local Scalars | @@ -217,12 +217,12 @@ subroutine dnaup2 c character wprime*2 logical cnorm , getv0, initv, update, ushift - integer ierr , iter , j , kplusp, msglvl, nconv, + integer ierr , iter , j , kplusp, msglvl, nconv, & nevbef, nev0 , np0 , nptemp, numcnv Double precision & rnorm , temp , eps23 save cnorm , getv0, initv, update, ushift, - & rnorm , iter , eps23, kplusp, msglvl, nconv , + & rnorm , iter , eps23, kplusp, msglvl, nconv , & nevbef, nev0 , np0 , numcnv c c %-----------------------% @@ -235,16 +235,16 @@ subroutine dnaup2 c | External Subroutines | c %----------------------% c - external dcopy , dgetv0, dnaitr, dnconv, dneigh, - & dngets, dnapps, dvout , ivout , second + external dcopy , dgetv0 , dnaitr , dnconv , dneigh , + & dngets , dnapps , dvout , ivout , arscnd c c %--------------------% c | External Functions | c %--------------------% c Double precision - & ddot, dnrm2, dlapy2, dlamch - external ddot, dnrm2, dlapy2, dlamch + & ddot , dnrm2 , dlapy2 , dlamch + external ddot , dnrm2 , dlapy2 , dlamch c c %---------------------% c | Intrinsic Functions | @@ -257,17 +257,17 @@ subroutine dnaup2 c %-----------------------% c if (ido .eq. 0) then -c - call second (t0) -c +c + call arscnd (t0) +c msglvl = mnaup2 -c +c c %-------------------------------------% c | Get the machine dependent constant. | c %-------------------------------------% c - eps23 = dlamch('Epsilon-Machine') - eps23 = eps23**(2.0D+0 / 3.0D+0) + eps23 = dlamch ('Epsilon-Machine') + eps23 = eps23**(2.0D+0 / 3.0D+0 ) c nev0 = nev np0 = np @@ -284,7 +284,7 @@ subroutine dnaup2 kplusp = nev + np nconv = 0 iter = 0 -c +c c %---------------------------------------% c | Set flags for computing the first NEV | c | steps of the Arnoldi factorization. | @@ -307,7 +307,7 @@ subroutine dnaup2 initv = .false. end if end if -c +c c %---------------------------------------------% c | Get a possibly random starting vector and | c | force it into the range of the operator OP. | @@ -316,7 +316,7 @@ subroutine dnaup2 10 continue c if (getv0) then - call dgetv0 (ido, bmat, 1, initv, n, 1, v, ldv, resid, rnorm, + call dgetv0 (ido, bmat, 1, initv, n, 1, v, ldv, resid, rnorm, & ipntr, workd, info) c if (ido .ne. 99) go to 9000 @@ -324,7 +324,7 @@ subroutine dnaup2 if (rnorm .eq. zero) then c c %-----------------------------------------% -c | The initial vector is zero. Error exit. | +c | The initial vector is zero. Error exit. | c %-----------------------------------------% c info = -9 @@ -333,7 +333,7 @@ subroutine dnaup2 getv0 = .false. ido = 0 end if -c +c c %-----------------------------------% c | Back from reverse communication : | c | continue with update step | @@ -353,14 +353,14 @@ subroutine dnaup2 c %-------------------------------------% c if (cnorm) go to 100 -c +c c %----------------------------------------------------------% c | Compute the first NEV steps of the Arnoldi factorization | c %----------------------------------------------------------% c - call dnaitr (ido, bmat, n, 0, nev, mode, resid, rnorm, v, ldv, + call dnaitr (ido, bmat, n, 0, nev, mode, resid, rnorm, v, ldv, & h, ldh, ipntr, workd, info) -c +c c %---------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP and possibly B | @@ -374,7 +374,7 @@ subroutine dnaup2 info = -9999 go to 1200 end if -c +c c %--------------------------------------------------------------% c | | c | M A I N ARNOLDI I T E R A T I O N L O O P | @@ -382,28 +382,28 @@ subroutine dnaup2 c | factorization in place. | c | | c %--------------------------------------------------------------% -c +c 1000 continue c iter = iter + 1 c if (msglvl .gt. 0) then - call ivout (logfil, 1, iter, ndigit, + call ivout (logfil, 1, [iter], ndigit, & '_naup2: **** Start of major iteration number ****') end if -c +c c %-----------------------------------------------------------% c | Compute NP additional steps of the Arnoldi factorization. | c | Adjust NP since NEV might have been updated by last call | -c | to the shift application routine dnapps. | +c | to the shift application routine dnapps . | c %-----------------------------------------------------------% c np = kplusp - nev c if (msglvl .gt. 1) then - call ivout (logfil, 1, nev, ndigit, + call ivout (logfil, 1, [nev], ndigit, & '_naup2: The length of the current Arnoldi factorization') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_naup2: Extend the Arnoldi factorization by') end if c @@ -415,10 +415,10 @@ subroutine dnaup2 20 continue update = .true. c - call dnaitr (ido , bmat, n , nev, np , mode , resid, + call dnaitr (ido , bmat, n , nev, np , mode , resid, & rnorm, v , ldv, h , ldh, ipntr, workd, & info) -c +c c %---------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP and possibly B | @@ -435,16 +435,16 @@ subroutine dnaup2 update = .false. c if (msglvl .gt. 1) then - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_naup2: Corresponding B-norm of the residual') end if -c +c c %--------------------------------------------------------% c | Compute the eigenvalues and corresponding error bounds | c | of the current upper Hessenberg matrix. | c %--------------------------------------------------------% c - call dneigh (rnorm, kplusp, h, ldh, ritzr, ritzi, bounds, + call dneigh (rnorm, kplusp, h, ldh, ritzr, ritzi, bounds, & q, ldq, workl, ierr) c if (ierr .ne. 0) then @@ -454,12 +454,12 @@ subroutine dnaup2 c c %----------------------------------------------------% c | Make a copy of eigenvalues and corresponding error | -c | bounds obtained from dneigh. | +c | bounds obtained from dneigh . | c %----------------------------------------------------% c - call dcopy(kplusp, ritzr, 1, workl(kplusp**2+1), 1) - call dcopy(kplusp, ritzi, 1, workl(kplusp**2+kplusp+1), 1) - call dcopy(kplusp, bounds, 1, workl(kplusp**2+2*kplusp+1), 1) + call dcopy (kplusp, ritzr, 1, workl(kplusp**2+1), 1) + call dcopy (kplusp, ritzi, 1, workl(kplusp**2+kplusp+1), 1) + call dcopy (kplusp, bounds, 1, workl(kplusp**2+2*kplusp+1), 1) c c %---------------------------------------------------% c | Select the wanted Ritz values and their bounds | @@ -470,37 +470,37 @@ subroutine dnaup2 c | and NP may be updated if the NEV-th wanted Ritz | c | value has a non zero imaginary part. In this case | c | NEV is increased by one and NP decreased by one. | -c | NOTE: The last two arguments of dngets are no | +c | NOTE: The last two arguments of dngets are no | c | longer used as of version 2.1. | c %---------------------------------------------------% c nev = nev0 np = np0 numcnv = nev - call dngets (ishift, which, nev, np, ritzr, ritzi, + call dngets (ishift, which, nev, np, ritzr, ritzi, & bounds, workl, workl(np+1)) if (nev .eq. nev0+1) numcnv = nev0+1 -c +c c %-------------------% -c | Convergence test. | +c | Convergence test. | c %-------------------% c - call dcopy (nev, bounds(np+1), 1, workl(2*np+1), 1) - call dnconv (nev, ritzr(np+1), ritzi(np+1), workl(2*np+1), + call dcopy (nev, bounds(np+1), 1, workl(2*np+1), 1) + call dnconv (nev, ritzr(np+1), ritzi(np+1), workl(2*np+1), & tol, nconv) -c +c if (msglvl .gt. 2) then kp(1) = nev kp(2) = np kp(3) = numcnv kp(4) = nconv - call ivout (logfil, 4, kp, ndigit, + call ivout (logfil, 4, kp, ndigit, & '_naup2: NEV, NP, NUMCNV, NCONV are') - call dvout (logfil, kplusp, ritzr, ndigit, + call dvout (logfil, kplusp, ritzr, ndigit, & '_naup2: Real part of the eigenvalues of H') - call dvout (logfil, kplusp, ritzi, ndigit, + call dvout (logfil, kplusp, ritzi, ndigit, & '_naup2: Imaginary part of the eigenvalues of H') - call dvout (logfil, kplusp, bounds, ndigit, + call dvout (logfil, kplusp, bounds, ndigit, & '_naup2: Ritz estimates of the current NCV Ritz values') end if c @@ -521,22 +521,22 @@ subroutine dnaup2 nev = nev + 1 end if 30 continue -c - if ( (nconv .ge. numcnv) .or. +c + if ( (nconv .ge. numcnv) .or. & (iter .gt. mxiter) .or. & (np .eq. 0) ) then c if (msglvl .gt. 4) then - call dvout(logfil, kplusp, workl(kplusp**2+1), ndigit, + call dvout (logfil, kplusp, workl(kplusp**2+1), ndigit, & '_naup2: Real part of the eig computed by _neigh:') - call dvout(logfil, kplusp, workl(kplusp**2+kplusp+1), + call dvout (logfil, kplusp, workl(kplusp**2+kplusp+1), & ndigit, & '_naup2: Imag part of the eig computed by _neigh:') - call dvout(logfil, kplusp, workl(kplusp**2+kplusp*2+1), + call dvout (logfil, kplusp, workl(kplusp**2+kplusp*2+1), & ndigit, & '_naup2: Ritz eistmates computed by _neigh:') end if -c +c c %------------------------------------------------% c | Prepare to exit. Put the converged Ritz values | c | and corresponding bounds in RITZ(1:NCONV) and | @@ -552,10 +552,10 @@ subroutine dnaup2 h(3,1) = rnorm c c %----------------------------------------------% -c | To be consistent with dngets, we first do a | +c | To be consistent with dngets , we first do a | c | pre-processing sort in order to keep complex | c | conjugate pairs together. This is similar | -c | to the pre-processing sort used in dngets | +c | to the pre-processing sort used in dngets | c | except that the sort is done in the opposite | c | order. | c %----------------------------------------------% @@ -567,7 +567,7 @@ subroutine dnaup2 if (which .eq. 'LI') wprime = 'SM' if (which .eq. 'SI') wprime = 'LM' c - call dsortc (wprime, .true., kplusp, ritzr, ritzi, bounds) + call dsortc (wprime, .true., kplusp, ritzr, ritzi, bounds) c c %----------------------------------------------% c | Now sort Ritz values so that converged Ritz | @@ -583,7 +583,7 @@ subroutine dnaup2 if (which .eq. 'LI') wprime = 'SI' if (which .eq. 'SI') wprime = 'LI' c - call dsortc(wprime, .true., kplusp, ritzr, ritzi, bounds) + call dsortc (wprime, .true., kplusp, ritzr, ritzi, bounds) c c %--------------------------------------------------% c | Scale the Ritz estimate of each Ritz value | @@ -591,20 +591,20 @@ subroutine dnaup2 c %--------------------------------------------------% c do 35 j = 1, numcnv - temp = max(eps23,dlapy2(ritzr(j), + temp = max(eps23,dlapy2 (ritzr(j), & ritzi(j))) bounds(j) = bounds(j)/temp 35 continue c c %----------------------------------------------------% c | Sort the Ritz values according to the scaled Ritz | -c | esitmates. This will push all the converged ones | +c | estimates. This will push all the converged ones | c | towards the front of ritzr, ritzi, bounds | c | (in the case when NCONV < NEV.) | c %----------------------------------------------------% c wprime = 'LR' - call dsortc(wprime, .true., numcnv, bounds, ritzr, ritzi) + call dsortc (wprime, .true., numcnv, bounds, ritzr, ritzi) c c %----------------------------------------------% c | Scale the Ritz estimate back to its original | @@ -612,7 +612,7 @@ subroutine dnaup2 c %----------------------------------------------% c do 40 j = 1, numcnv - temp = max(eps23, dlapy2(ritzr(j), + temp = max(eps23, dlapy2 (ritzr(j), & ritzi(j))) bounds(j) = bounds(j)*temp 40 continue @@ -623,25 +623,25 @@ subroutine dnaup2 c | ritzr, ritzi and bound. | c %------------------------------------------------% c - call dsortc(which, .true., nconv, ritzr, ritzi, bounds) + call dsortc (which, .true., nconv, ritzr, ritzi, bounds) c if (msglvl .gt. 1) then - call dvout (logfil, kplusp, ritzr, ndigit, + call dvout (logfil, kplusp, ritzr, ndigit, & '_naup2: Sorted real part of the eigenvalues') - call dvout (logfil, kplusp, ritzi, ndigit, + call dvout (logfil, kplusp, ritzi, ndigit, & '_naup2: Sorted imaginary part of the eigenvalues') - call dvout (logfil, kplusp, bounds, ndigit, + call dvout (logfil, kplusp, bounds, ndigit, & '_naup2: Sorted ritz estimates.') end if c c %------------------------------------% -c | Max iterations have been exceeded. | +c | Max iterations have been exceeded. | c %------------------------------------% c if (iter .gt. mxiter .and. nconv .lt. numcnv) info = 1 c c %---------------------% -c | No shifts to apply. | +c | No shifts to apply. | c %---------------------% c if (np .eq. 0 .and. nconv .lt. numcnv) info = 2 @@ -650,7 +650,7 @@ subroutine dnaup2 go to 1100 c else if ( (nconv .lt. numcnv) .and. (ishift .eq. 1) ) then -c +c c %-------------------------------------------------% c | Do not have all the requested eigenvalues yet. | c | To prevent possible stagnation, adjust the size | @@ -664,32 +664,43 @@ subroutine dnaup2 else if (nev .eq. 1 .and. kplusp .gt. 3) then nev = 2 end if +c %---- Scipy fix ------------------------------------------------ +c | We must keep nev below this value, as otherwise we can get +c | np == 0 (note that dngets below can bump nev by 1). If np == 0, +c | the next call to `dnaitr` will write out-of-bounds. +c | + if (nev .gt. kplusp - 2) then + nev = kplusp - 2 + end if +c | +c %---- Scipy fix end -------------------------------------------- +c np = kplusp - nev -c +c c %---------------------------------------% c | If the size of NEV was just increased | c | resort the eigenvalues. | c %---------------------------------------% -c - if (nevbef .lt. nev) - & call dngets (ishift, which, nev, np, ritzr, ritzi, +c + if (nevbef .lt. nev) + & call dngets (ishift, which, nev, np, ritzr, ritzi, & bounds, workl, workl(np+1)) c - end if -c + end if +c if (msglvl .gt. 0) then - call ivout (logfil, 1, nconv, ndigit, + call ivout (logfil, 1, [nconv], ndigit, & '_naup2: no. of "converged" Ritz values at this iter.') if (msglvl .gt. 1) then kp(1) = nev kp(2) = np - call ivout (logfil, 2, kp, ndigit, + call ivout (logfil, 2, kp, ndigit, & '_naup2: NEV and NP are') - call dvout (logfil, nev, ritzr(np+1), ndigit, + call dvout (logfil, nev, ritzr(np+1), ndigit, & '_naup2: "wanted" Ritz values -- real part') - call dvout (logfil, nev, ritzi(np+1), ndigit, + call dvout (logfil, nev, ritzi(np+1), ndigit, & '_naup2: "wanted" Ritz values -- imag part') - call dvout (logfil, nev, bounds(np+1), ndigit, + call dvout (logfil, nev, bounds(np+1), ndigit, & '_naup2: Ritz estimates of the "wanted" values ') end if end if @@ -697,7 +708,7 @@ subroutine dnaup2 if (ishift .eq. 0) then c c %-------------------------------------------------------% -c | User specified shifts: reverse comminucation to | +c | User specified shifts: reverse communication to | c | compute the shifts. They are returned in the first | c | 2*NP locations of WORKL. | c %-------------------------------------------------------% @@ -706,7 +717,7 @@ subroutine dnaup2 ido = 3 go to 9000 end if -c +c 50 continue c c %------------------------------------% @@ -718,26 +729,26 @@ subroutine dnaup2 ushift = .false. c if ( ishift .eq. 0 ) then -c +c c %----------------------------------% c | Move the NP shifts from WORKL to | c | RITZR, RITZI to free up WORKL | c | for non-exact shift case. | c %----------------------------------% c - call dcopy (np, workl, 1, ritzr, 1) - call dcopy (np, workl(np+1), 1, ritzi, 1) + call dcopy (np, workl, 1, ritzr, 1) + call dcopy (np, workl(np+1), 1, ritzi, 1) end if c - if (msglvl .gt. 2) then - call ivout (logfil, 1, np, ndigit, + if (msglvl .gt. 2) then + call ivout (logfil, 1, [np], ndigit, & '_naup2: The number of shifts to apply ') - call dvout (logfil, np, ritzr, ndigit, + call dvout (logfil, np, ritzr, ndigit, & '_naup2: Real part of the shifts') - call dvout (logfil, np, ritzi, ndigit, + call dvout (logfil, np, ritzi, ndigit, & '_naup2: Imaginary part of the shifts') - if ( ishift .eq. 1 ) - & call dvout (logfil, np, bounds, ndigit, + if ( ishift .eq. 1 ) + & call dvout (logfil, np, bounds, ndigit, & '_naup2: Ritz estimates of the shifts') end if c @@ -748,60 +759,60 @@ subroutine dnaup2 c | The first 2*N locations of WORKD are used as workspace. | c %---------------------------------------------------------% c - call dnapps (n, nev, np, ritzr, ritzi, v, ldv, + call dnapps (n, nev, np, ritzr, ritzi, v, ldv, & h, ldh, resid, q, ldq, workl, workd) c c %---------------------------------------------% c | Compute the B-norm of the updated residual. | c | Keep B*RESID in WORKD(1:N) to be used in | -c | the first step of the next call to dnaitr. | +c | the first step of the next call to dnaitr . | c %---------------------------------------------% c cnorm = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 - call dcopy (n, resid, 1, workd(n+1), 1) + call dcopy (n, resid, 1, workd(n+1), 1) ipntr(1) = n + 1 ipntr(2) = 1 ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*RESID | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then - call dcopy (n, resid, 1, workd, 1) + call dcopy (n, resid, 1, workd, 1) end if -c +c 100 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(1:N) := B*RESID | c %----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c - if (bmat .eq. 'G') then - rnorm = ddot (n, resid, 1, workd, 1) +c + if (bmat .eq. 'G') then + rnorm = ddot (n, resid, 1, workd, 1) rnorm = sqrt(abs(rnorm)) else if (bmat .eq. 'I') then - rnorm = dnrm2(n, resid, 1) + rnorm = dnrm2 (n, resid, 1) end if cnorm = .false. c if (msglvl .gt. 2) then - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_naup2: B-norm of residual for compressed factorization') - call dmout (logfil, nev, nev, h, ldh, ndigit, + call dmout (logfil, nev, nev, h, ldh, ndigit, & '_naup2: Compressed upper Hessenberg matrix H') end if -c +c go to 1000 c c %---------------------------------------------------------------% @@ -814,7 +825,7 @@ subroutine dnaup2 c mxiter = iter nev = numcnv -c +c 1200 continue ido = 99 c @@ -822,13 +833,13 @@ subroutine dnaup2 c | Error Exit | c %------------% c - call second (t1) + call arscnd (t1) tnaup2 = t1 - t0 -c +c 9000 continue c c %---------------% -c | End of dnaup2 | +c | End of dnaup2 | c %---------------% c return diff --git a/Toolbox/arpack-src/dnaupd.f b/Toolbox/arpack-src/dnaupd.f index 7fe403d6b..0b4cbb0d8 100644 --- a/Toolbox/arpack-src/dnaupd.f +++ b/Toolbox/arpack-src/dnaupd.f @@ -2,19 +2,19 @@ c c\Name: dnaupd c -c\Description: +c\Description: c Reverse communication interface for the Implicitly Restarted Arnoldi -c iteration. This subroutine computes approximations to a few eigenpairs -c of a linear operator "OP" with respect to a semi-inner product defined by -c a symmetric positive semi-definite real matrix B. B may be the identity -c matrix. NOTE: If the linear operator "OP" is real and symmetric -c with respect to the real positive semi-definite symmetric matrix B, -c i.e. B*OP = (OP`)*B, then subroutine dsaupd should be used instead. +c iteration. This subroutine computes approximations to a few eigenpairs +c of a linear operator "OP" with respect to a semi-inner product defined by +c a symmetric positive semi-definite real matrix B. B may be the identity +c matrix. NOTE: If the linear operator "OP" is real and symmetric +c with respect to the real positive semi-definite symmetric matrix B, +c i.e. B*OP = (OP`)*B, then subroutine dsaupd should be used instead. c c The computed approximate eigenvalues are called Ritz values and c the corresponding approximate eigenvectors are called Ritz vectors. c -c dnaupd is usually called iteratively to solve one of the +c dnaupd is usually called iteratively to solve one of the c following problems: c c Mode 1: A*x = lambda*x. @@ -25,18 +25,18 @@ c ===> (If M can be factored see remark 3 below) c c Mode 3: A*x = lambda*M*x, M symmetric semi-definite -c ===> OP = Real_Part{ inv[A - sigma*M]*M } and B = M. +c ===> OP = Real_Part{ inv[A - sigma*M]*M } and B = M. c ===> shift-and-invert mode (in real arithmetic) -c If OP*x = amu*x, then +c If OP*x = amu*x, then c amu = 1/2 * [ 1/(lambda-sigma) + 1/(lambda-conjg(sigma)) ]. c Note: If sigma is real, i.e. imaginary part of sigma is zero; -c Real_Part{ inv[A - sigma*M]*M } == inv[A - sigma*M]*M -c amu == 1/(lambda-sigma). -c +c Real_Part{ inv[A - sigma*M]*M } == inv[A - sigma*M]*M +c amu == 1/(lambda-sigma). +c c Mode 4: A*x = lambda*M*x, M symmetric semi-definite -c ===> OP = Imaginary_Part{ inv[A - sigma*M]*M } and B = M. +c ===> OP = Imaginary_Part{ inv[A - sigma*M]*M } and B = M. c ===> shift-and-invert mode (in real arithmetic) -c If OP*x = amu*x, then +c If OP*x = amu*x, then c amu = 1/2i * [ 1/(lambda-sigma) - 1/(lambda-conjg(sigma)) ]. c c Both mode 3 and 4 give the same enhancement to eigenvalues close to @@ -63,12 +63,12 @@ c c\Arguments c IDO Integer. (INPUT/OUTPUT) -c Reverse communication flag. IDO must be zero on the first -c call to dnaupd. IDO will be set internally to +c Reverse communication flag. IDO must be zero on the first +c call to dnaupd . IDO will be set internally to c indicate the type of operation to be performed. Control is c then given back to the calling routine which has the c responsibility to carry out the requested operation and call -c dnaupd with the result. The operand is given in +c dnaupd with the result. The operand is given in c WORKD(IPNTR(1)), the result must be put in WORKD(IPNTR(2)). c ------------------------------------------------------------- c IDO = 0: first call to the reverse communication interface @@ -86,13 +86,13 @@ c IDO = 2: compute Y = B * X where c IPNTR(1) is the pointer into WORKD for X, c IPNTR(2) is the pointer into WORKD for Y. -c IDO = 3: compute the IPARAM(8) real and imaginary parts +c IDO = 3: compute the IPARAM(8) real and imaginary parts c of the shifts where INPTR(14) is the pointer c into WORKL for placing the shifts. See Remark c 5 below. c IDO = 99: done c ------------------------------------------------------------- -c +c c BMAT Character*1. (INPUT) c BMAT specifies the type of the matrix B that defines the c semi-inner product for the operator OP. @@ -110,18 +110,18 @@ c 'LI' -> want the NEV eigenvalues of largest imaginary part. c 'SI' -> want the NEV eigenvalues of smallest imaginary part. c -c NEV Integer. (INPUT/OUTPUT) +c NEV Integer. (INPUT) c Number of eigenvalues of OP to be computed. 0 < NEV < N-1. c -c TOL Double precision scalar. (INPUT) -c Stopping criterion: the relative accuracy of the Ritz value +c TOL Double precision scalar. (INPUT/OUTPUT) +c Stopping criterion: the relative accuracy of the Ritz value c is considered acceptable if BOUNDS(I) .LE. TOL*ABS(RITZ(I)) c where ABS(RITZ(I)) is the magnitude when RITZ(I) is complex. -c DEFAULT = DLAMCH('EPS') (machine precision as computed -c by the LAPACK auxiliary subroutine DLAMCH). +c DEFAULT = DLAMCH ('EPS') (machine precision as computed +c by the LAPACK auxiliary subroutine DLAMCH ). c -c RESID Double precision array of length N. (INPUT/OUTPUT) -c On INPUT: +c RESID Double precision array of length N. (INPUT/OUTPUT) +c On INPUT: c If INFO .EQ. 0, a random initial residual vector is used. c If INFO .NE. 0, RESID contains the initial residual vector, c possibly from a previous run. @@ -131,17 +131,17 @@ c NCV Integer. (INPUT) c Number of columns of the matrix V. NCV must satisfy the two c inequalities 2 <= NCV-NEV and NCV <= N. -c This will indicate how many Arnoldi vectors are generated -c at each iteration. After the startup phase in which NEV -c Arnoldi vectors are generated, the algorithm generates -c approximately NCV-NEV Arnoldi vectors at each subsequent update -c iteration. Most of the cost in generating each Arnoldi vector is -c in the matrix-vector operation OP*x. -c NOTE: 2 <= NCV-NEV in order that complex conjugate pairs of Ritz +c This will indicate how many Arnoldi vectors are generated +c at each iteration. After the startup phase in which NEV +c Arnoldi vectors are generated, the algorithm generates +c approximately NCV-NEV Arnoldi vectors at each subsequent update +c iteration. Most of the cost in generating each Arnoldi vector is +c in the matrix-vector operation OP*x. +c NOTE: 2 <= NCV-NEV in order that complex conjugate pairs of Ritz c values are kept together. (See remark 4 below) c -c V Double precision array N by NCV. (OUTPUT) -c Contains the final set of Arnoldi basis vectors. +c V Double precision array N by NCV. (OUTPUT) +c Contains the final set of Arnoldi basis vectors. c c LDV Integer. (INPUT) c Leading dimension of V exactly as declared in the calling program. @@ -154,11 +154,11 @@ c ISHIFT = 0: the shifts are provided by the user via c reverse communication. The real and imaginary c parts of the NCV eigenvalues of the Hessenberg -c matrix H are returned in the part of the WORKL -c array corresponding to RITZR and RITZI. See remark +c matrix H are returned in the part of the WORKL +c array corresponding to RITZR and RITZI. See remark c 5 below. c ISHIFT = 1: exact shifts with respect to the current -c Hessenberg matrix H. This is equivalent to +c Hessenberg matrix H. This is equivalent to c restarting the iteration with a starting vector c that is a linear combination of approximate Schur c vectors associated with the "wanted" Ritz values. @@ -167,8 +167,8 @@ c IPARAM(2) = No longer referenced. c c IPARAM(3) = MXITER -c On INPUT: maximum number of Arnoldi update iterations allowed. -c On OUTPUT: actual number of Arnoldi update iterations taken. +c On INPUT: maximum number of Arnoldi update iterations allowed. +c On OUTPUT: actual number of Arnoldi update iterations taken. c c IPARAM(4) = NB: blocksize to be used in the recurrence. c The code currently works only for NB = 1. @@ -178,23 +178,23 @@ c the convergence criterion. c c IPARAM(6) = IUPD -c No longer referenced. Implicit restarting is ALWAYS used. +c No longer referenced. Implicit restarting is ALWAYS used. c c IPARAM(7) = MODE c On INPUT determines what type of eigenproblem is being solved. -c Must be 1,2,3,4; See under \Description of dnaupd for the +c Must be 1,2,3,4; See under \Description of dnaupd for the c four modes available. c c IPARAM(8) = NP c When ido = 3 and the user provides shifts through reverse -c communication (IPARAM(1)=0), dnaupd returns NP, the number +c communication (IPARAM(1)=0), dnaupd returns NP, the number c of shifts the user is to provide. 0 < NP <=NCV-NEV. See Remark c 5 below. c c IPARAM(9) = NUMOP, IPARAM(10) = NUMOPB, IPARAM(11) = NUMREO, c OUTPUT: NUMOP = total number of OP*x operations, c NUMOPB = total number of B*x operations if BMAT='G', -c NUMREO = total number of steps of re-orthogonalization. +c NUMREO = total number of steps of re-orthogonalization. c c IPNTR Integer array of length 14. (OUTPUT) c Pointer to mark the starting locations in the WORKD and WORKL @@ -202,13 +202,13 @@ c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X in WORKD. c IPNTR(2): pointer to the current result vector Y in WORKD. -c IPNTR(3): pointer to the vector B * X in WORKD when used in +c IPNTR(3): pointer to the vector B * X in WORKD when used in c the shift-and-invert mode. c IPNTR(4): pointer to the next available location in WORKL c that is untouched by the program. c IPNTR(5): pointer to the NCV by NCV upper Hessenberg matrix c H in WORKL. -c IPNTR(6): pointer to the real part of the ritz value array +c IPNTR(6): pointer to the real part of the ritz value array c RITZR in WORKL. c IPNTR(7): pointer to the imaginary part of the ritz value array c RITZI in WORKL. @@ -217,30 +217,30 @@ c c IPNTR(14): pointer to the NP shifts in WORKL. See Remark 5 below. c -c Note: IPNTR(9:13) is only referenced by dneupd. See Remark 2 below. +c Note: IPNTR(9:13) is only referenced by dneupd . See Remark 2 below. c -c IPNTR(9): pointer to the real part of the NCV RITZ values of the +c IPNTR(9): pointer to the real part of the NCV RITZ values of the c original system. -c IPNTR(10): pointer to the imaginary part of the NCV RITZ values of +c IPNTR(10): pointer to the imaginary part of the NCV RITZ values of c the original system. c IPNTR(11): pointer to the NCV corresponding error bounds. c IPNTR(12): pointer to the NCV by NCV upper quasi-triangular c Schur matrix for H. c IPNTR(13): pointer to the NCV by NCV matrix of eigenvectors c of the upper Hessenberg matrix H. Only referenced by -c dneupd if RVEC = .TRUE. See Remark 2 below. +c dneupd if RVEC = .TRUE. See Remark 2 below. c ------------------------------------------------------------- -c -c WORKD Double precision work array of length 3*N. (REVERSE COMMUNICATION) +c +c WORKD Double precision work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The user should not use WORKD +c for reverse communication. The user should not use WORKD c as temporary workspace during the iteration. Upon termination c WORKD(1:N) contains B*RESID(1:N). If an invariant subspace c associated with the converged Ritz values is desired, see remark -c 2 below, subroutine dneupd uses this output. -c See Data Distribution Note below. +c 2 below, subroutine dneupd uses this output. +c See Data Distribution Note below. c -c WORKL Double precision work array of length LWORKL. (OUTPUT/WORKSPACE) +c WORKL Double precision work array of length LWORKL. (OUTPUT/WORKSPACE) c Private (replicated) array on each PE or array allocated on c the front end. See Data Distribution Note below. c @@ -254,18 +254,18 @@ c Error flag on output. c = 0: Normal exit. c = 1: Maximum number of iterations taken. -c All possible eigenvalues of OP has been found. IPARAM(5) +c All possible eigenvalues of OP has been found. IPARAM(5) c returns the number of wanted converged Ritz values. c = 2: No longer an informational error. Deprecated starting c with release 2 of ARPACK. -c = 3: No shifts could be applied during a cycle of the -c Implicitly restarted Arnoldi iteration. One possibility -c is to increase the size of NCV relative to NEV. +c = 3: No shifts could be applied during a cycle of the +c Implicitly restarted Arnoldi iteration. One possibility +c is to increase the size of NCV relative to NEV. c See remark 4 below. c = -1: N must be positive. c = -2: NEV must be positive. c = -3: NCV-NEV >= 2 and less than or equal to N. -c = -4: The maximum number of Arnoldi update iteration +c = -4: The maximum number of Arnoldi update iteration c must be greater than zero. c = -5: WHICH must be one of 'LM', 'SM', 'LR', 'SR', 'LI', 'SI' c = -6: BMAT must be one of 'I' or 'G'. @@ -273,7 +273,7 @@ c = -8: Error return from LAPACK eigenvalue calculation; c = -9: Starting vector is zero. c = -10: IPARAM(7) must be 1,2,3,4. -c = -11: IPARAM(7) = 1 and BMAT = 'G' are incompatable. +c = -11: IPARAM(7) = 1 and BMAT = 'G' are incompatible. c = -12: IPARAM(1) must be equal to 0 or 1. c = -9999: Could not build an Arnoldi factorization. c IPARAM(5) returns the size of the current Arnoldi @@ -283,33 +283,33 @@ c 1. The computed Ritz values are approximate eigenvalues of OP. The c selection of WHICH should be made with this in mind when c Mode = 3 and 4. After convergence, approximate eigenvalues of the -c original problem may be obtained with the ARPACK subroutine dneupd. +c original problem may be obtained with the ARPACK subroutine dneupd . c -c 2. If a basis for the invariant subspace corresponding to the converged Ritz -c values is needed, the user must call dneupd immediately following -c completion of dnaupd. This is new starting with release 2 of ARPACK. +c 2. If a basis for the invariant subspace corresponding to the converged Ritz +c values is needed, the user must call dneupd immediately following +c completion of dnaupd . This is new starting with release 2 of ARPACK. c c 3. If M can be factored into a Cholesky factorization M = LL` c then Mode = 2 should not be selected. Instead one should use -c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular +c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular c linear systems should be solved with L and L` rather c than computing inverses. After convergence, an approximate c eigenvector z of the original problem is recovered by solving c L`z = x where x is a Ritz vector of OP. c c 4. At present there is no a-priori analysis to guide the selection -c of NCV relative to NEV. The only formal requrement is that NCV > NEV + 2. +c of NCV relative to NEV. The only formal requirement is that NCV > NEV + 2. c However, it is recommended that NCV .ge. 2*NEV+1. If many problems of c the same type are to be solved, one should experiment with increasing -c NCV while keeping NEV fixed for a given test problem. This will +c NCV while keeping NEV fixed for a given test problem. This will c usually decrease the required number of OP*x operations but it c also increases the work and storage required to maintain the orthogonal c basis vectors. The optimal "cross-over" with respect to CPU time -c is problem dependent and must be determined empirically. +c is problem dependent and must be determined empirically. c See Chapter 8 of Reference 2 for further information. c -c 5. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the -c NP = IPARAM(8) real and imaginary parts of the shifts in locations +c 5. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the +c NP = IPARAM(8) real and imaginary parts of the shifts in locations c real part imaginary part c ----------------------- -------------- c 1 WORKL(IPNTR(14)) WORKL(IPNTR(14)+NP) @@ -319,10 +319,10 @@ c . . c NP WORKL(IPNTR(14)+NP-1) WORKL(IPNTR(14)+2*NP-1). c -c Only complex conjugate pairs of shifts may be applied and the pairs -c must be placed in consecutive locations. The real part of the -c eigenvalues of the current upper Hessenberg matrix are located in -c WORKL(IPNTR(6)) through WORKL(IPNTR(6)+NCV-1) and the imaginary part +c Only complex conjugate pairs of shifts may be applied and the pairs +c must be placed in consecutive locations. The real part of the +c eigenvalues of the current upper Hessenberg matrix are located in +c WORKL(IPNTR(6)) through WORKL(IPNTR(6)+NCV-1) and the imaginary part c in WORKL(IPNTR(7)) through WORKL(IPNTR(7)+NCV-1). They are ordered c according to the order defined by WHICH. The complex conjugate c pairs are kept together and the associated Ritz estimates are located in @@ -330,11 +330,11 @@ c c----------------------------------------------------------------------- c -c\Data Distribution Note: +c\Data Distribution Note: c c Fortran-D syntax: c ================ -c Double precision resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) +c Double precision resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) c decompose d1(n), d2(n,ncv) c align resid(i) with d1(i) c align v(i,j) with d2(i,j) @@ -346,13 +346,13 @@ c c Cray MPP syntax: c =============== -c Double precision resid(n), v(ldv,ncv), workd(n,3), workl(lworkl) +c Double precision resid(n), v(ldv,ncv), workd(n,3), workl(lworkl) c shared resid(block), v(block,:), workd(block,:) c replicated workl(lworkl) -c +c c CM2/CM5 syntax: c ============== -c +c c----------------------------------------------------------------------- c c include 'ex-nonsym.doc' @@ -368,7 +368,7 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett & Y. Saad, "Complex Shift and Invert Strategies for @@ -376,26 +376,26 @@ c pp 575-595, (1987). c c\Routines called: -c dnaup2 ARPACK routine that implements the Implicitly Restarted +c dnaup2 ARPACK routine that implements the Implicitly Restarted c Arnoldi Iteration. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. -c dvout ARPACK utility routine that prints vectors. -c dlamch LAPACK routine that determines machine constants. +c arscnd ARPACK utility routine for timing. +c dvout ARPACK utility routine that prints vectors. +c dlamch LAPACK routine that determines machine constants. c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: c 12/16/93: Version '1.1' c -c\SCCS Information: @(#) -c FILE: naupd.F SID: 2.10 DATE OF SID: 08/23/02 RELEASE: 2 +c\SCCS Information: @(#) +c FILE: naupd.F SID: 2.8 DATE OF SID: 04/10/01 RELEASE: 2 c c\Remarks c @@ -404,15 +404,15 @@ c----------------------------------------------------------------------- c subroutine dnaupd - & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, + & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, & ipntr, workd, workl, lworkl, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -437,13 +437,13 @@ subroutine dnaupd c Double precision & one, zero - parameter (one = 1.0D+0, zero = 0.0D+0) + parameter (one = 1.0D+0 , zero = 0.0D+0 ) c c %---------------% c | Local Scalars | c %---------------% c - integer bounds, ierr, ih, iq, ishift, iupd, iw, + integer bounds, ierr, ih, iq, ishift, iupd, iw, & ldh, ldq, levec, mode, msglvl, mxiter, nb, & nev0, next, np, ritzi, ritzr, j save bounds, ih, iq, ishift, iupd, iw, ldh, ldq, @@ -454,7 +454,7 @@ subroutine dnaupd c | External Subroutines | c %----------------------% c - external dnaup2, dvout, ivout, second, dstatn + external dnaup2 , dvout , ivout, arscnd, dstatn c c %--------------------% c | External Functions | @@ -467,16 +467,16 @@ subroutine dnaupd c %-----------------------% c | Executable Statements | c %-----------------------% -c +c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c call dstatn - call second (t0) + call arscnd (t0) msglvl = mnaupd c c %----------------% @@ -498,13 +498,13 @@ subroutine dnaupd mode = iparam(7) c if (n .le. 0) then - ierr = -1 + ierr = -1 else if (nev .le. 0) then - ierr = -2 + ierr = -2 else if (ncv .le. nev+1 .or. ncv .gt. n) then - ierr = -3 - else if (mxiter .le. 0) then - ierr = 4 + ierr = -3 + else if (mxiter .le. 0) then + ierr = -4 else if (which .ne. 'LM' .and. & which .ne. 'SM' .and. & which .ne. 'LR' .and. @@ -517,13 +517,13 @@ subroutine dnaupd else if (lworkl .lt. 3*ncv**2 + 6*ncv) then ierr = -7 else if (mode .lt. 1 .or. mode .gt. 4) then - ierr = -10 + ierr = -10 else if (mode .eq. 1 .and. bmat .eq. 'G') then - ierr = -11 + ierr = -11 else if (ishift .lt. 0 .or. ishift .gt. 1) then - ierr = -12 + ierr = -12 end if -c +c c %------------% c | Error Exit | c %------------% @@ -533,13 +533,13 @@ subroutine dnaupd ido = 99 go to 9000 end if -c +c c %------------------------% c | Set default parameters | c %------------------------% c if (nb .le. 0) nb = 1 - if (tol .le. zero) tol = dlamch('EpsMach') + if (tol .le. zero) tol = dlamch ('EpsMach') c c %----------------------------------------------% c | NP is the number of additional steps to | @@ -549,8 +549,8 @@ subroutine dnaupd c %----------------------------------------------% c np = ncv - nev - nev0 = nev -c + nev0 = nev +c c %-----------------------------% c | Zero out internal workspace | c %-----------------------------% @@ -558,7 +558,7 @@ subroutine dnaupd do 10 j = 1, 3*ncv**2 + 6*ncv workl(j) = zero 10 continue -c +c c %-------------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, BOUNDS, Q | c | etc... and the remaining workspace. | @@ -570,8 +570,8 @@ subroutine dnaupd c | workl(ncv*ncv+2*ncv+1:ncv*ncv+3*ncv) := error bounds | c | workl(ncv*ncv+3*ncv+1:2*ncv*ncv+3*ncv) := rotation matrix Q | c | workl(2*ncv*ncv+3*ncv+1:3*ncv*ncv+6*ncv) := workspace | -c | The final workspace is needed by subroutine dneigh called | -c | by dnaup2. Subroutine dneigh calls LAPACK routines for | +c | The final workspace is needed by subroutine dneigh called | +c | by dnaup2 . Subroutine dneigh calls LAPACK routines for | c | calculating eigenvalues and the last row of the eigenvector | c | matrix. | c %-------------------------------------------------------------% @@ -591,7 +591,7 @@ subroutine dnaupd ipntr(6) = ritzr ipntr(7) = ritzi ipntr(8) = bounds - ipntr(14) = iw + ipntr(14) = iw c end if c @@ -599,12 +599,12 @@ subroutine dnaupd c | Carry out the Implicitly restarted Arnoldi Iteration. | c %-------------------------------------------------------% c - call dnaup2 + call dnaup2 & ( ido, bmat, n, which, nev0, np, tol, resid, mode, iupd, - & ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritzr), - & workl(ritzi), workl(bounds), workl(iq), ldq, workl(iw), + & ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritzr), + & workl(ritzi), workl(bounds), workl(iq), ldq, workl(iw), & ipntr, workd, info ) -c +c c %--------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP or shifts. | @@ -612,7 +612,7 @@ subroutine dnaupd c if (ido .eq. 3) iparam(8) = np if (ido .ne. 99) go to 9000 -c +c iparam(3) = mxiter iparam(5) = np iparam(9) = nopx @@ -621,26 +621,26 @@ subroutine dnaupd c c %------------------------------------% c | Exit if there was an informational | -c | error within dnaup2. | +c | error within dnaup2 . | c %------------------------------------% c if (info .lt. 0) go to 9000 if (info .eq. 2) info = 3 c if (msglvl .gt. 0) then - call ivout (logfil, 1, mxiter, ndigit, + call ivout (logfil, 1, [mxiter], ndigit, & '_naupd: Number of update iterations taken') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_naupd: Number of wanted "converged" Ritz values') - call dvout (logfil, np, workl(ritzr), ndigit, + call dvout (logfil, np, workl(ritzr), ndigit, & '_naupd: Real part of the final Ritz values') - call dvout (logfil, np, workl(ritzi), ndigit, + call dvout (logfil, np, workl(ritzi), ndigit, & '_naupd: Imaginary part of the final Ritz values') - call dvout (logfil, np, workl(bounds), ndigit, + call dvout (logfil, np, workl(bounds), ndigit, & '_naupd: Associated Ritz estimates') end if c - call second (t1) + call arscnd (t1) tnaupd = t1 - t0 c if (msglvl .gt. 0) then @@ -656,8 +656,8 @@ subroutine dnaupd 1000 format (//, & 5x, '=============================================',/ & 5x, '= Nonsymmetric implicit Arnoldi update code =',/ - & 5x, '= Version Number: ', ' 2.4', 21x, ' =',/ - & 5x, '= Version Date: ', ' 07/31/96', 16x, ' =',/ + & 5x, '= Version Number: ', ' 2.4' , 21x, ' =',/ + & 5x, '= Version Date: ', ' 07/31/96' , 16x, ' =',/ & 5x, '=============================================',/ & 5x, '= Summary of timing statistics =',/ & 5x, '=============================================',//) @@ -687,7 +687,7 @@ subroutine dnaupd return c c %---------------% -c | End of dnaupd | +c | End of dnaupd | c %---------------% c end diff --git a/Toolbox/arpack-src/dnconv.f b/Toolbox/arpack-src/dnconv.f index 56fbd2e79..4d531f865 100644 --- a/Toolbox/arpack-src/dnconv.f +++ b/Toolbox/arpack-src/dnconv.f @@ -3,7 +3,7 @@ c c\Name: dnconv c -c\Description: +c\Description: c Convergence testing for the nonsymmetric Arnoldi eigenvalue routine. c c\Usage: @@ -38,22 +38,22 @@ c xxxxxx real c c\Routines called: -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c dlamch LAPACK routine that determines machine constants. c dlapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. c c\Author c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University +c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.1' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: nconv.F SID: 2.3 DATE OF SID: 4/20/96 RELEASE: 2 c c\Remarks @@ -69,8 +69,8 @@ subroutine dnconv (n, ritzr, ritzi, bounds, tol, nconv) c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -106,7 +106,7 @@ subroutine dnconv (n, ritzr, ritzi, bounds, tol, nconv) c %-----------------------% c | Executable Statements | c %-----------------------% -c +c c %-------------------------------------------------------------% c | Convergence test: unlike in the symmetric code, I am not | c | using things like refined error bounds and gap condition | @@ -119,7 +119,7 @@ subroutine dnconv (n, ritzr, ritzi, bounds, tol, nconv) c | for some appropriate choice of norm. | c %-------------------------------------------------------------% c - call second (t0) + call arscnd (t0) c c %---------------------------------% c | Get machine dependent constant. | @@ -133,10 +133,10 @@ subroutine dnconv (n, ritzr, ritzi, bounds, tol, nconv) temp = max( eps23, dlapy2( ritzr(i), ritzi(i) ) ) if (bounds(i) .le. tol*temp) nconv = nconv + 1 20 continue -c - call second (t1) +c + call arscnd (t1) tnconv = tnconv + (t1 - t0) -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/dneigh.f b/Toolbox/arpack-src/dneigh.f index 949e777a8..3c49e32bf 100644 --- a/Toolbox/arpack-src/dneigh.f +++ b/Toolbox/arpack-src/dneigh.f @@ -13,7 +13,7 @@ c c\Arguments c RNORM Double precision scalar. (INPUT) -c Residual norm corresponding to the current upper Hessenberg +c Residual norm corresponding to the current upper Hessenberg c matrix H. c c N Integer. (INPUT) @@ -27,13 +27,13 @@ c program. c c RITZR, Double precision arrays of length N. (OUTPUT) -c RITZI On output, RITZR(1:N) (resp. RITZI(1:N)) contains the real +c RITZI On output, RITZR(1:N) (resp. RITZI(1:N)) contains the real c (respectively imaginary) parts of the eigenvalues of H. c c BOUNDS Double precision array of length N. (OUTPUT) c On output, BOUNDS contains the Ritz estimates associated with -c the eigenvalues RITZR and RITZI. This is equal to RNORM -c times the last components of the eigenvectors corresponding +c the eigenvalues RITZR and RITZI. This is equal to RNORM +c times the last components of the eigenvectors corresponding c to the eigenvalues in RITZR and RITZI. c c Q Double precision N by N array. (WORKSPACE) @@ -49,7 +49,7 @@ c of H and also in the calculation of the eigenvectors of H. c c IERR Integer. (OUTPUT) -c Error exit flag from dlaqrb or dtrevc. +c Error exit flag from dlahqr or dtrevc. c c\EndDoc c @@ -61,9 +61,9 @@ c xxxxxx real c c\Routines called: -c dlaqrb ARPACK routine to compute the real Schur form of an +c dlahqr LAPACK routine to compute the real Schur form of an c upper Hessenberg matrix and last row of the Schur vectors. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c dmout ARPACK utility routine that prints matrices c dvout ARPACK utility routine that prints vectors. c dlacpy LAPACK matrix copy routine. @@ -74,20 +74,20 @@ c dcopy Level 1 BLAS that copies one vector to another . c dnrm2 Level 1 BLAS that computes the norm of a vector. c dscal Level 1 BLAS that scales a vector. -c +c c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.1' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: neigh.F SID: 2.3 DATE OF SID: 4/20/96 RELEASE: 2 c c\Remarks @@ -97,54 +97,54 @@ c c----------------------------------------------------------------------- c - subroutine dneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, + subroutine dneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, & q, ldq, workl, ierr) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | c %------------------% c integer ierr, n, ldh, ldq - Double precision + Double precision & rnorm c c %-----------------% c | Array Arguments | c %-----------------% c - Double precision + Double precision & bounds(n), h(ldh,n), q(ldq,n), ritzi(n), ritzr(n), & workl(n*(n+3)) -c +c c %------------% c | Parameters | c %------------% c - Double precision + Double precision & one, zero parameter (one = 1.0D+0, zero = 0.0D+0) -c +c c %------------------------% c | Local Scalars & Arrays | c %------------------------% c logical select(1) integer i, iconj, msglvl - Double precision + Double precision & temp, vl(1) c c %----------------------% c | External Subroutines | c %----------------------% c - external dcopy, dlacpy, dlaqrb, dtrevc, dvout, second + external dcopy, dlacpy, dlahqr, dtrevc, dvout, arscnd c c %--------------------% c | External Functions | @@ -170,25 +170,29 @@ subroutine dneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mneigh -c +c if (msglvl .gt. 2) then - call dmout (logfil, n, n, h, ldh, ndigit, + call dmout (logfil, n, n, h, ldh, ndigit, & '_neigh: Entering upper Hessenberg matrix H ') end if -c +c c %-----------------------------------------------------------% c | 1. Compute the eigenvalues, the last components of the | c | corresponding Schur vectors and the full Schur form T | c | of the current upper Hessenberg matrix H. | -c | dlaqrb returns the full Schur form of H in WORKL(1:N**2) | +c | dlahqr returns the full Schur form of H in WORKL(1:N**2) | c | and the last components of the Schur vectors in BOUNDS. | c %-----------------------------------------------------------% c call dlacpy ('All', n, n, h, ldh, workl, n) - call dlaqrb (.true., n, 1, n, workl, n, ritzr, ritzi, bounds, - & ierr) + do 5 j = 1, n-1 + bounds(j) = zero + 5 continue + bounds(n) = 1 + call dlahqr(.true., .true., n, 1, n, workl, n, ritzr, ritzi, 1, 1, + & bounds, 1, ierr) if (ierr .ne. 0) go to 9000 c if (msglvl .gt. 1) then @@ -227,7 +231,7 @@ subroutine dneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, c %----------------------% c | Real eigenvalue case | c %----------------------% -c +c temp = dnrm2( n, q(1,i), 1 ) call dscal ( n, one / temp, q(1,i), 1 ) else @@ -241,7 +245,7 @@ subroutine dneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, c %-------------------------------------------% c if (iconj .eq. 0) then - temp = dlapy2( dnrm2( n, q(1,i), 1 ), + temp = dlapy2( dnrm2( n, q(1,i), 1 ), & dnrm2( n, q(1,i+1), 1 ) ) call dscal ( n, one / temp, q(1,i), 1 ) call dscal ( n, one / temp, q(1,i+1), 1 ) @@ -249,7 +253,7 @@ subroutine dneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, else iconj = 0 end if - end if + end if 10 continue c call dgemv ('T', n, n, one, q, ldq, bounds, 1, zero, workl, 1) @@ -270,7 +274,7 @@ subroutine dneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, c %----------------------% c | Real eigenvalue case | c %----------------------% -c +c bounds(i) = rnorm * abs( workl(i) ) else c @@ -301,7 +305,7 @@ subroutine dneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, & '_neigh: Ritz estimates for the eigenvalues of H') end if c - call second (t1) + call arscnd (t1) tneigh = tneigh + (t1 - t0) c 9000 continue diff --git a/Toolbox/arpack-src/dneupd.f b/Toolbox/arpack-src/dneupd.f index cdb163c81..860ceb856 100644 --- a/Toolbox/arpack-src/dneupd.f +++ b/Toolbox/arpack-src/dneupd.f @@ -1,8 +1,8 @@ c\BeginDoc c -c\Name: dneupd +c\Name: dneupd c -c\Description: +c\Description: c c This subroutine returns the converged approximations to eigenvalues c of A*z = lambda*B*z and (optionally): @@ -28,34 +28,34 @@ c invariant subspace corresponding to these Ritz values is referred to as a c Schur basis. c -c See documentation in the header of the subroutine DNAUPD for +c See documentation in the header of the subroutine DNAUPD for c definition of OP as well as other terms and the relation of computed c Ritz values and Ritz vectors of OP with respect to the given problem -c A*z = lambda*B*z. For a brief description, see definitions of +c A*z = lambda*B*z. For a brief description, see definitions of c IPARAM(7), MODE and WHICH in the documentation of DNAUPD . c c\Usage: -c call dneupd -c ( RVEC, HOWMNY, SELECT, DR, DI, Z, LDZ, SIGMAR, SIGMAI, WORKEV, BMAT, -c N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, WORKL, +c call dneupd +c ( RVEC, HOWMNY, SELECT, DR, DI, Z, LDZ, SIGMAR, SIGMAI, WORKEV, BMAT, +c N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, WORKL, c LWORKL, INFO ) c c\Arguments: -c RVEC LOGICAL (INPUT) -c Specifies whether a basis for the invariant subspace corresponding -c to the converged Ritz value approximations for the eigenproblem +c RVEC LOGICAL (INPUT) +c Specifies whether a basis for the invariant subspace corresponding +c to the converged Ritz value approximations for the eigenproblem c A*z = lambda*B*z is computed. c c RVEC = .FALSE. Compute Ritz values only. c c RVEC = .TRUE. Compute the Ritz vectors or Schur vectors. -c See Remarks below. -c -c HOWMNY Character*1 (INPUT) -c Specifies the form of the basis for the invariant subspace +c See Remarks below. +c +c HOWMNY Character*1 (INPUT) +c Specifies the form of the basis for the invariant subspace c corresponding to the converged Ritz values that is to be computed. c -c = 'A': Compute NEV Ritz vectors; +c = 'A': Compute NEV Ritz vectors; c = 'P': Compute NEV Schur vectors; c = 'S': compute some of the Ritz vectors, specified c by the logical array SELECT. @@ -63,43 +63,43 @@ c SELECT Logical array of dimension NCV. (INPUT) c If HOWMNY = 'S', SELECT specifies the Ritz vectors to be c computed. To select the Ritz vector corresponding to a -c Ritz value (DR(j), DI(j)), SELECT(j) must be set to .TRUE.. +c Ritz value (DR(j), DI(j)), SELECT(j) must be set to .TRUE.. c If HOWMNY = 'A' or 'P', SELECT is used as internal workspace. c c DR Double precision array of dimension NEV+1. (OUTPUT) -c If IPARAM(7) = 1,2 or 3 and SIGMAI=0.0 then on exit: DR contains -c the real part of the Ritz approximations to the eigenvalues of -c A*z = lambda*B*z. +c If IPARAM(7) = 1,2 or 3 and SIGMAI=0.0 then on exit: DR contains +c the real part of the Ritz approximations to the eigenvalues of +c A*z = lambda*B*z. c If IPARAM(7) = 3, 4 and SIGMAI is not equal to zero, then on exit: -c DR contains the real part of the Ritz values of OP computed by +c DR contains the real part of the Ritz values of OP computed by c DNAUPD . A further computation must be performed by the user c to transform the Ritz values computed for OP by DNAUPD to those c of the original system A*z = lambda*B*z. See remark 3 below. c c DI Double precision array of dimension NEV+1. (OUTPUT) -c On exit, DI contains the imaginary part of the Ritz value +c On exit, DI contains the imaginary part of the Ritz value c approximations to the eigenvalues of A*z = lambda*B*z associated c with DR. c -c NOTE: When Ritz values are complex, they will come in complex -c conjugate pairs. If eigenvectors are requested, the -c corresponding Ritz vectors will also come in conjugate -c pairs and the real and imaginary parts of these are -c represented in two consecutive columns of the array Z +c NOTE: When Ritz values are complex, they will come in complex +c conjugate pairs. If eigenvectors are requested, the +c corresponding Ritz vectors will also come in conjugate +c pairs and the real and imaginary parts of these are +c represented in two consecutive columns of the array Z c (see below). c c Z Double precision N by NEV+1 array if RVEC = .TRUE. and HOWMNY = 'A'. (OUTPUT) -c On exit, if RVEC = .TRUE. and HOWMNY = 'A', then the columns of -c Z represent approximate eigenvectors (Ritz vectors) corresponding -c to the NCONV=IPARAM(5) Ritz values for eigensystem -c A*z = lambda*B*z. -c -c The complex Ritz vector associated with the Ritz value -c with positive imaginary part is stored in two consecutive -c columns. The first column holds the real part of the Ritz -c vector and the second column holds the imaginary part. The -c Ritz vector associated with the Ritz value with negative -c imaginary part is simply the complex conjugate of the Ritz vector +c On exit, if RVEC = .TRUE. and HOWMNY = 'A', then the columns of +c Z represent approximate eigenvectors (Ritz vectors) corresponding +c to the NCONV=IPARAM(5) Ritz values for eigensystem +c A*z = lambda*B*z. +c +c The complex Ritz vector associated with the Ritz value +c with positive imaginary part is stored in two consecutive +c columns. The first column holds the real part of the Ritz +c vector and the second column holds the imaginary part. The +c Ritz vector associated with the Ritz value with negative +c imaginary part is simply the complex conjugate of the Ritz vector c associated with the positive imaginary part. c c If RVEC = .FALSE. or HOWMNY = 'P', then Z is not referenced. @@ -114,11 +114,11 @@ c desired, then LDZ >= max( 1, N ). In any case, LDZ >= 1. c c SIGMAR Double precision (INPUT) -c If IPARAM(7) = 3 or 4, represents the real part of the shift. +c If IPARAM(7) = 3 or 4, represents the real part of the shift. c Not referenced if IPARAM(7) = 1 or 2. c c SIGMAI Double precision (INPUT) -c If IPARAM(7) = 3 or 4, represents the imaginary part of the shift. +c If IPARAM(7) = 3 or 4, represents the imaginary part of the shift. c Not referenced if IPARAM(7) = 1 or 2. See remark 3 below. c c WORKEV Double precision work array of dimension 3*NCV. (WORKSPACE) @@ -181,12 +181,12 @@ c c = 0: Normal exit. c -c = 1: The Schur form computed by LAPACK routine dlahqr +c = 1: The Schur form computed by LAPACK routine dlahqr c could not be reordered by LAPACK routine dtrsen . -c Re-enter subroutine dneupd with IPARAM(5)=NCV and -c increase the size of the arrays DR and DI to have -c dimension at least dimension NCV and allocate at least NCV -c columns for Z. NOTE: Not necessary if Z and V share +c Re-enter subroutine dneupd with IPARAM(5)=NCV and +c increase the size of the arrays DR and DI to have +c dimension at least dimension NCV and allocate at least NCV +c columns for Z. NOTE: Not necessary if Z and V share c the same space. Please notify the authors if this error c occurs. c @@ -218,7 +218,7 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett & Y. Saad, "Complex Shift and Invert Strategies for @@ -229,7 +229,7 @@ c ivout ARPACK utility routine that prints integers. c dmout ARPACK utility routine that prints matrices c dvout ARPACK utility routine that prints vectors. -c dgeqr2 LAPACK routine that computes the QR factorization of +c dgeqr2 LAPACK routine that computes the QR factorization of c a matrix. c dlacpy LAPACK matrix copy routine. c dlahqr LAPACK routine to compute the real Schur form of an @@ -237,7 +237,7 @@ c dlamch LAPACK routine that determines machine constants. c dlapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. c dlaset LAPACK matrix initialization routine. -c dorm2r LAPACK routine that applies an orthogonal matrix in +c dorm2r LAPACK routine that applies an orthogonal matrix in c factored form. c dtrevc LAPACK routine to compute the eigenvectors of a matrix c in upper quasi-triangular form. @@ -259,10 +259,10 @@ c Ritz vectors. Thus, their numerical properties are often superior. c If RVEC = .TRUE. then the relationship c A * V(:,1:IPARAM(5)) = V(:,1:IPARAM(5)) * T, and -c trans(V(:,1:IPARAM(5))) * V(:,1:IPARAM(5)) = I are approximately -c satisfied. Here T is the leading submatrix of order IPARAM(5) of the +c trans(V(:,1:IPARAM(5))) * V(:,1:IPARAM(5)) = I are approximately +c satisfied. Here T is the leading submatrix of order IPARAM(5) of the c real upper quasi-triangular matrix stored workl(ipntr(12)). That is, -c T is block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; +c T is block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; c each 2-by-2 diagonal block has its diagonal elements equal and its c off-diagonal elements of opposite sign. Corresponding to each 2-by-2 c diagonal block is a complex conjugate pair of Ritz values. The real @@ -270,14 +270,14 @@ c c 3. If IPARAM(7) = 3 or 4 and SIGMAI is not equal zero, then the user must c form the IPARAM(5) Rayleigh quotients in order to transform the Ritz -c values computed by DNAUPD for OP to those of A*z = lambda*B*z. +c values computed by DNAUPD for OP to those of A*z = lambda*B*z. c Set RVEC = .true. and HOWMNY = 'A', and -c compute +c compute c trans(Z(:,I)) * A * Z(:,I) if DI(I) = 0. -c If DI(I) is not equal to zero and DI(I+1) = - D(I), +c If DI(I) is not equal to zero and DI(I+1) = - D(I), c then the desired real and imaginary parts of the Ritz value are c trans(Z(:,I)) * A * Z(:,I) + trans(Z(:,I+1)) * A * Z(:,I+1), -c trans(Z(:,I)) * A * Z(:,I+1) - trans(Z(:,I+1)) * A * Z(:,I), +c trans(Z(:,I)) * A * Z(:,I+1) - trans(Z(:,I+1)) * A * Z(:,I), c respectively. c Another possibility is to set RVEC = .true. and HOWMNY = 'P' and c compute trans(V(:,1:IPARAM(5))) * A * V(:,1:IPARAM(5)) and then an upper @@ -286,20 +286,20 @@ c c\Authors c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University +c Richard Lehoucq CRPC / Rice University c Chao Yang Houston, Texas c Dept. of Computational & -c Applied Mathematics -c Rice University -c Houston, Texas -c -c\SCCS Information: @(#) -c FILE: neupd.F SID: 2.7 DATE OF SID: 09/20/00 RELEASE: 2 +c Applied Mathematics +c Rice University +c Houston, Texas +c +c\SCCS Information: @(#) +c FILE: neupd.F SID: 2.7 DATE OF SID: 09/20/00 RELEASE: 2 c c\EndLib c c----------------------------------------------------------------------- - subroutine dneupd (rvec , howmny, select, dr , di, + subroutine dneupd (rvec , howmny, select, dr , di, & z , ldz , sigmar, sigmai, workev, & bmat , n , which , nev , tol, & resid, ncv , v , ldv , iparam, @@ -309,8 +309,8 @@ subroutine dneupd (rvec , howmny, select, dr , di, c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -319,7 +319,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, character bmat, howmny, which*2 logical rvec integer info, ldz, ldv, lworkl, n, ncv, nev - Double precision + Double precision & sigmar, sigmai, tol c c %-----------------% @@ -328,16 +328,16 @@ subroutine dneupd (rvec , howmny, select, dr , di, c integer iparam(11), ipntr(14) logical select(ncv) - Double precision - & dr(nev+1) , di(nev+1), resid(n) , - & v(ldv,ncv) , z(ldz,*) , workd(3*n), + Double precision + & dr(nev+1) , di(nev+1), resid(n) , + & v(ldv,ncv) , z(ldz,*) , workd(3*n), & workl(lworkl), workev(3*ncv) c c %------------% c | Parameters | c %------------% c - Double precision + Double precision & one, zero parameter (one = 1.0D+0 , zero = 0.0D+0 ) c @@ -346,16 +346,16 @@ subroutine dneupd (rvec , howmny, select, dr , di, c %---------------% c character type*6 - integer bounds, ierr , ih , ihbds , - & iheigr, iheigi, iconj , nconv , + integer bounds, ierr , ih , ihbds , + & iheigr, iheigi, iconj , nconv , & invsub, iuptri, iwev , iwork(1), & j , k , ldh , ldq , & mode , msglvl, outncv, ritzr , & ritzi , wri , wrr , irr , & iri , ibd , ishift, numcnv , - & np , jj + & np , jj , nconv2 logical reord - Double precision + Double precision & conds , rnorm, sep , temp, & vl(1,1), temp1, eps23 c @@ -363,18 +363,18 @@ subroutine dneupd (rvec , howmny, select, dr , di, c | External Subroutines | c %----------------------% c - external dcopy , dger , dgeqr2 , dlacpy , - & dlahqr , dlaset , dmout , dorm2r , - & dtrevc , dtrmm , dtrsen , dscal , + external dcopy , dger , dgeqr2 , dlacpy , + & dlahqr , dlaset , dmout , dorm2r , + & dtrevc , dtrmm , dtrsen , dscal , & dvout , ivout c c %--------------------% c | External Functions | c %--------------------% c - Double precision - & dlapy2 , dnrm2 , dlamch , ddot - external dlapy2 , dnrm2 , dlamch , ddot + Double precision + & dlapy2 , dnrm2 , dlamch , ddot + external dlapy2 , dnrm2 , dlamch , ddot c c %---------------------% c | Intrinsic Functions | @@ -385,7 +385,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, c %-----------------------% c | Executable Statements | c %-----------------------% -c +c c %------------------------% c | Set default parameters | c %------------------------% @@ -434,7 +434,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, else if (howmny .eq. 'S' ) then ierr = -12 end if -c +c if (mode .eq. 1 .or. mode .eq. 2) then type = 'REGULR' else if (mode .eq. 3 .and. sigmai .eq. zero) then @@ -443,7 +443,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, type = 'REALPT' else if (mode .eq. 4 ) then type = 'IMAGPT' - else + else ierr = -10 end if if (mode .eq. 1 .and. bmat .eq. 'G') ierr = -11 @@ -456,7 +456,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, info = ierr go to 9000 end if -c +c c %--------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, BOUNDS, Q | c | etc... and the remaining workspace. | @@ -483,7 +483,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, c | subspace for H. | c | GRAND total of NCV * ( 3 * NCV + 6 ) locations. | c %-----------------------------------------------------------% -c +c ih = ipntr(5) ritzr = ipntr(6) ritzi = ipntr(7) @@ -537,7 +537,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, end if c if (rvec) then -c +c reord = .false. c c %---------------------------------------------------% @@ -562,7 +562,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, c np = ncv - nev ishift = 0 - call dngets (ishift , which , nev , + call dngets (ishift , which , nev , & np , workl(irr), workl(iri), & workl(bounds), workl , workl(np+1)) c @@ -589,7 +589,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, & workl(ibd+jj-1) .le. tol*temp1) then select(jj) = .true. numcnv = numcnv + 1 - if (jj .gt. nev) reord = .true. + if (jj .gt. nconv) reord = .true. endif 11 continue c @@ -601,9 +601,9 @@ subroutine dneupd (rvec , howmny, select, dr , di, c %-----------------------------------------------------------% c if (msglvl .gt. 2) then - call ivout(logfil, 1, numcnv, ndigit, + call ivout(logfil, 1, [numcnv], ndigit, & '_neupd: Number of specified eigenvalues') - call ivout(logfil, 1, nconv, ndigit, + call ivout(logfil, 1, [nconv], ndigit, & '_neupd: Number of "converged" eigenvalues') end if c @@ -618,24 +618,24 @@ subroutine dneupd (rvec , howmny, select, dr , di, c | Make a copy of the upper Hessenberg matrix. | c | Initialize the Schur vector matrix Q to the identity. | c %-----------------------------------------------------------% -c +c call dcopy (ldh*ncv, workl(ih), 1, workl(iuptri), 1) - call dlaset ('All', ncv, ncv, + call dlaset ('All', ncv, ncv, & zero , one, workl(invsub), & ldq) - call dlahqr (.true., .true. , ncv, - & 1 , ncv , workl(iuptri), + call dlahqr (.true., .true. , ncv, + & 1 , ncv , workl(iuptri), & ldh , workl(iheigr), workl(iheigi), - & 1 , ncv , workl(invsub), + & 1 , ncv , workl(invsub), & ldq , ierr) - call dcopy (ncv , workl(invsub+ncv-1), ldq, + call dcopy (ncv , workl(invsub+ncv-1), ldq, & workl(ihbds), 1) -c +c if (ierr .ne. 0) then info = -8 go to 9000 end if -c +c if (msglvl .gt. 1) then call dvout (logfil, ncv, workl(iheigr), ndigit, & '_neupd: Real part of the eigenvalues of H') @@ -644,45 +644,50 @@ subroutine dneupd (rvec , howmny, select, dr , di, call dvout (logfil, ncv, workl(ihbds), ndigit, & '_neupd: Last row of the Schur vector matrix') if (msglvl .gt. 3) then - call dmout (logfil , ncv, ncv , + call dmout (logfil , ncv, ncv , & workl(iuptri), ldh, ndigit, & '_neupd: The upper quasi-triangular matrix ') end if - end if + end if c if (reord) then -c +c c %-----------------------------------------------------% -c | Reorder the computed upper quasi-triangular matrix. | +c | Reorder the computed upper quasi-triangular matrix. | c %-----------------------------------------------------% -c - call dtrsen ('None' , 'V' , +c + call dtrsen ('None' , 'V' , & select , ncv , - & workl(iuptri), ldh , - & workl(invsub), ldq , - & workl(iheigr), workl(iheigi), - & nconv , conds , - & sep , workl(ihbds) , + & workl(iuptri), ldh , + & workl(invsub), ldq , + & workl(iheigr), workl(iheigi), + & nconv2 , conds , + & sep , workl(ihbds) , & ncv , iwork , & 1 , ierr) c + if (nconv2 .lt. nconv) then + nconv = nconv2 + end if + if (ierr .eq. 1) then info = 1 go to 9000 end if c + if (msglvl .gt. 2) then call dvout (logfil, ncv, workl(iheigr), ndigit, & '_neupd: Real part of the eigenvalues of H--reordered') call dvout (logfil, ncv, workl(iheigi), ndigit, & '_neupd: Imag part of the eigenvalues of H--reordered') if (msglvl .gt. 3) then - call dmout (logfil , ncv, ncv , + call dmout (logfil , ncv, ncv , & workl(iuptri), ldq, ndigit, & '_neupd: Quasi-triangular matrix after re-ordering') end if end if -c +c end if c c %---------------------------------------% @@ -699,23 +704,23 @@ subroutine dneupd (rvec , howmny, select, dr , di, c | if a spectral transformation was not used. | c %----------------------------------------------------% c - if (type .eq. 'REGULR') then + if (type .eq. 'REGULR') then call dcopy (nconv, workl(iheigr), 1, dr, 1) call dcopy (nconv, workl(iheigi), 1, di, 1) end if -c +c c %----------------------------------------------------------% c | Compute the QR factorization of the matrix representing | c | the wanted invariant subspace located in the first NCONV | c | columns of workl(invsub,ldq). | c %----------------------------------------------------------% -c - call dgeqr2 (ncv, nconv , workl(invsub), +c + call dgeqr2 (ncv, nconv , workl(invsub), & ldq, workev, workev(ncv+1), & ierr) c c %---------------------------------------------------------% -c | * Postmultiply V by Q using dorm2r . | +c | * Postmultiply V by Q using dorm2r . | c | * Copy the first NCONV columns of VQ into Z. | c | * Postmultiply Z by R. | c | The N by NCONV matrix Z is now a matrix representation | @@ -725,15 +730,15 @@ subroutine dneupd (rvec , howmny, select, dr , di, c | vectors associated with the real upper quasi-triangular | c | matrix of order NCONV in workl(iuptri) | c %---------------------------------------------------------% -c - call dorm2r ('Right', 'Notranspose', n , +c + call dorm2r ('Right', 'Notranspose', n , & ncv , nconv , workl(invsub), - & ldq , workev , v , + & ldq , workev , v , & ldv , workd(n+1) , ierr) call dlacpy ('All', n, nconv, v, ldv, z, ldz) c do 20 j=1, nconv -c +c c %---------------------------------------------------% c | Perform both a column and row scaling if the | c | diagonal element of workl(invsub,ldq) is negative | @@ -742,21 +747,21 @@ subroutine dneupd (rvec , howmny, select, dr , di, c | Note that since Q is orthogonal, R is a diagonal | c | matrix consisting of plus or minus ones | c %---------------------------------------------------% -c +c if (workl(invsub+(j-1)*ldq+j-1) .lt. zero) then call dscal (nconv, -one, workl(iuptri+j-1), ldq) call dscal (nconv, -one, workl(iuptri+(j-1)*ldq), 1) end if -c +c 20 continue -c +c if (howmny .eq. 'A') then -c +c c %--------------------------------------------% -c | Compute the NCONV wanted eigenvectors of T | +c | Compute the NCONV wanted eigenvectors of T | c | located in workl(iuptri,ldq). | c %--------------------------------------------% -c +c do 30 j=1, ncv if (j .le. nconv) then select(j) = .true. @@ -765,8 +770,8 @@ subroutine dneupd (rvec , howmny, select, dr , di, end if 30 continue c - call dtrevc ('Right', 'Select' , select , - & ncv , workl(iuptri), ldq , + call dtrevc ('Right', 'Select' , select , + & ncv , workl(iuptri), ldq , & vl , 1 , workl(invsub), & ldq , ncv , outncv , & workev , ierr) @@ -775,7 +780,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, info = -9 go to 9000 end if -c +c c %------------------------------------------------% c | Scale the returning eigenvectors so that their | c | Euclidean norms are all one. LAPACK subroutine | @@ -783,22 +788,22 @@ subroutine dneupd (rvec , howmny, select, dr , di, c | that the element of largest magnitude has | c | magnitude 1; | c %------------------------------------------------% -c +c iconj = 0 do 40 j=1, nconv c if ( workl(iheigi+j-1) .eq. zero ) then -c +c c %----------------------% c | real eigenvalue case | c %----------------------% -c +c temp = dnrm2 ( ncv, workl(invsub+(j-1)*ldq), 1 ) - call dscal ( ncv, one / temp, + call dscal ( ncv, one / temp, & workl(invsub+(j-1)*ldq), 1 ) c else -c +c c %-------------------------------------------% c | Complex conjugate pair case. Note that | c | since the real and imaginary part of | @@ -808,15 +813,15 @@ subroutine dneupd (rvec , howmny, select, dr , di, c %-------------------------------------------% c if (iconj .eq. 0) then - temp = dlapy2 (dnrm2 (ncv, - & workl(invsub+(j-1)*ldq), + temp = dlapy2 (dnrm2 (ncv, + & workl(invsub+(j-1)*ldq), & 1), - & dnrm2 (ncv, + & dnrm2 (ncv, & workl(invsub+j*ldq), - & 1)) - call dscal (ncv, one/temp, + & 1)) + call dscal (ncv, one/temp, & workl(invsub+(j-1)*ldq), 1 ) - call dscal (ncv, one/temp, + call dscal (ncv, one/temp, & workl(invsub+j*ldq), 1 ) iconj = 1 else @@ -856,7 +861,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, call dvout (logfil, ncv, workl(ihbds), ndigit, & '_neupd: Last row of the eigenvector matrix for T') if (msglvl .gt. 3) then - call dmout (logfil, ncv, ncv, workl(invsub), ldq, + call dmout (logfil, ncv, ncv, workl(invsub), ldq, & ndigit, '_neupd: The eigenvector matrix for T') end if end if @@ -872,32 +877,32 @@ subroutine dneupd (rvec , howmny, select, dr , di, c | associated with leading portion of T in the first NCONV | c | columns of workl(invsub,ldq). | c %---------------------------------------------------------% -c - call dgeqr2 (ncv, nconv , workl(invsub), +c + call dgeqr2 (ncv, nconv , workl(invsub), & ldq, workev, workev(ncv+1), & ierr) -c +c c %----------------------------------------------% -c | * Postmultiply Z by Q. | +c | * Postmultiply Z by Q. | c | * Postmultiply Z by R. | -c | The N by NCONV matrix Z is now contains the | +c | The N by NCONV matrix Z is now contains the | c | Ritz vectors associated with the Ritz values | c | in workl(iheigr) and workl(iheigi). | c %----------------------------------------------% -c +c call dorm2r ('Right', 'Notranspose', n , & ncv , nconv , workl(invsub), & ldq , workev , z , & ldz , workd(n+1) , ierr) -c +c call dtrmm ('Right' , 'Upper' , 'No transpose', & 'Non-unit', n , nconv , & one , workl(invsub), ldq , & z , ldz) -c +c end if -c - else +c + else c c %------------------------------------------------------% c | An approximate invariant subspace is not needed. | @@ -910,7 +915,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, call dcopy (nconv, workl(ritzi), 1, workl(iheigi), 1) call dcopy (nconv, workl(bounds), 1, workl(ihbds), 1) end if -c +c c %------------------------------------------------% c | Transform the Ritz values and possibly vectors | c | and corresponding error bounds of OP to those | @@ -919,26 +924,26 @@ subroutine dneupd (rvec , howmny, select, dr , di, c if (type .eq. 'REGULR') then c - if (rvec) - & call dscal (ncv, rnorm, workl(ihbds), 1) -c - else -c + if (rvec) + & call dscal (ncv, rnorm, workl(ihbds), 1) +c + else +c c %---------------------------------------% c | A spectral transformation was used. | c | * Determine the Ritz estimates of the | c | Ritz values in the original system. | c %---------------------------------------% -c +c if (type .eq. 'SHIFTI') then c - if (rvec) + if (rvec) & call dscal (ncv, rnorm, workl(ihbds), 1) c do 50 k=1, ncv - temp = dlapy2 ( workl(iheigr+k-1), + temp = dlapy2 ( workl(iheigr+k-1), & workl(iheigi+k-1) ) - workl(ihbds+k-1) = abs( workl(ihbds+k-1) ) + workl(ihbds+k-1) = abs( workl(ihbds+k-1) ) & / temp / temp 50 continue c @@ -953,26 +958,26 @@ subroutine dneupd (rvec , howmny, select, dr , di, 70 continue c end if -c +c c %-----------------------------------------------------------% c | * Transform the Ritz values back to the original system. | c | For TYPE = 'SHIFTI' the transformation is | c | lambda = 1/theta + sigma | c | For TYPE = 'REALPT' or 'IMAGPT' the user must from | -c | Rayleigh quotients or a projection. See remark 3 above.| +c | Rayleigh quotients or a projection. See remark 3 above.| c | NOTES: | c | *The Ritz vectors are not affected by the transformation. | c %-----------------------------------------------------------% -c - if (type .eq. 'SHIFTI') then +c + if (type .eq. 'SHIFTI') then c do 80 k=1, ncv - temp = dlapy2 ( workl(iheigr+k-1), + temp = dlapy2 ( workl(iheigr+k-1), & workl(iheigi+k-1) ) - workl(iheigr+k-1) = workl(iheigr+k-1)/temp/temp - & + sigmar + workl(iheigr+k-1) = workl(iheigr+k-1)/temp/temp + & + sigmar workl(iheigi+k-1) = -workl(iheigi+k-1)/temp/temp - & + sigmai + & + sigmai 80 continue c call dcopy (nconv, workl(iheigr), 1, dr, 1) @@ -989,9 +994,9 @@ subroutine dneupd (rvec , howmny, select, dr , di, c if (type .eq. 'SHIFTI' .and. msglvl .gt. 1) then call dvout (logfil, nconv, dr, ndigit, - & '_neupd: Untransformed real part of the Ritz valuess.') + & '_neupd: Untransformed real part of the Ritz values.') call dvout (logfil, nconv, di, ndigit, - & '_neupd: Untransformed imag part of the Ritz valuess.') + & '_neupd: Untransformed imag part of the Ritz values.') call dvout (logfil, nconv, workl(ihbds), ndigit, & '_neupd: Ritz estimates of untransformed Ritz values.') else if (type .eq. 'REGULR' .and. msglvl .gt. 1) then @@ -1002,7 +1007,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, call dvout (logfil, nconv, workl(ihbds), ndigit, & '_neupd: Associated Ritz estimates.') end if -c +c c %-------------------------------------------------% c | Eigenvector Purification step. Formally perform | c | one of inverse subspace iteration. Only used | @@ -1024,19 +1029,22 @@ subroutine dneupd (rvec , howmny, select, dr , di, c iconj = 0 do 110 j=1, nconv - if (workl(iheigi+j-1) .eq. zero) then + if ((workl(iheigi+j-1) .eq. zero) .and. + & (workl(iheigr+j-1) .ne. zero)) then workev(j) = workl(invsub+(j-1)*ldq+ncv-1) / & workl(iheigr+j-1) else if (iconj .eq. 0) then temp = dlapy2 ( workl(iheigr+j-1), workl(iheigi+j-1) ) - workev(j) = ( workl(invsub+(j-1)*ldq+ncv-1) * - & workl(iheigr+j-1) + - & workl(invsub+j*ldq+ncv-1) * - & workl(iheigi+j-1) ) / temp / temp - workev(j+1) = ( workl(invsub+j*ldq+ncv-1) * - & workl(iheigr+j-1) - - & workl(invsub+(j-1)*ldq+ncv-1) * - & workl(iheigi+j-1) ) / temp / temp + if (temp .ne. zero) then + workev(j) = ( workl(invsub+(j-1)*ldq+ncv-1) * + & workl(iheigr+j-1) + + & workl(invsub+j*ldq+ncv-1) * + & workl(iheigi+j-1) ) / temp / temp + workev(j+1) = ( workl(invsub+j*ldq+ncv-1) * + & workl(iheigr+j-1) - + & workl(invsub+(j-1)*ldq+ncv-1) * + & workl(iheigi+j-1) ) / temp / temp + end if iconj = 1 else iconj = 0 @@ -1055,7 +1063,7 @@ subroutine dneupd (rvec , howmny, select, dr , di, 9000 continue c return -c +c c %---------------% c | End of DNEUPD | c %---------------% diff --git a/Toolbox/arpack-src/dngets.f b/Toolbox/arpack-src/dngets.f index d109833c8..47d3ac2ce 100644 --- a/Toolbox/arpack-src/dngets.f +++ b/Toolbox/arpack-src/dngets.f @@ -3,9 +3,9 @@ c c\Name: dngets c -c\Description: +c\Description: c Given the eigenvalues of the upper Hessenberg matrix H, -c computes the NP shifts AMU that are zeros of the polynomial of +c computes the NP shifts AMU that are zeros of the polynomial of c degree NP which filters out components of the unwanted eigenvectors c corresponding to the AMU's based on some given criteria. c @@ -42,12 +42,12 @@ c pairs together. c c RITZR, Double precision array of length KEV+NP. (INPUT/OUTPUT) -c RITZI On INPUT, RITZR and RITZI contain the real and imaginary +c RITZI On INPUT, RITZR and RITZI contain the real and imaginary c parts of the eigenvalues of H. c On OUTPUT, RITZR and RITZI are sorted so that the unwanted c eigenvalues are in the first NP locations and the wanted -c portion is in the last KEV locations. When exact shifts are -c selected, the unwanted part corresponds to the shifts to +c portion is in the last KEV locations. When exact shifts are +c selected, the unwanted part corresponds to the shifts to c be applied. Also, if ISHIFT .eq. 1, the unwanted eigenvalues c are further sorted so that the ones with largest Ritz values c are first. @@ -56,7 +56,7 @@ c Error bounds corresponding to the ordering in RITZ. c c SHIFTR, SHIFTI *** USE deprecated as of version 2.1. *** -c +c c c\EndDoc c @@ -76,13 +76,13 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.1' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: ngets.F SID: 2.3 DATE OF SID: 4/20/96 RELEASE: 2 c c\Remarks @@ -99,8 +99,8 @@ subroutine dngets ( ishift, which, kev, np, ritzr, ritzi, bounds, c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -114,7 +114,7 @@ subroutine dngets ( ishift, which, kev, np, ritzr, ritzi, bounds, c %-----------------% c Double precision - & bounds(kev+np), ritzr(kev+np), ritzi(kev+np), + & bounds(kev+np), ritzr(kev+np), ritzi(kev+np), & shiftr(1), shifti(1) c c %------------% @@ -135,7 +135,7 @@ subroutine dngets ( ishift, which, kev, np, ritzr, ritzi, bounds, c | External Subroutines | c %----------------------% c - external dcopy, dsortc, second + external dcopy, dsortc, arscnd c c %----------------------% c | Intrinsics Functions | @@ -151,10 +151,10 @@ subroutine dngets ( ishift, which, kev, np, ritzr, ritzi, bounds, c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% -c - call second (t0) +c + call arscnd (t0) msglvl = mngets -c +c c %----------------------------------------------------% c | LM, SM, LR, SR, LI, SI case. | c | Sort the eigenvalues of H into the desired order | @@ -178,16 +178,16 @@ subroutine dngets ( ishift, which, kev, np, ritzr, ritzi, bounds, else if (which .eq. 'SI') then call dsortc ('SM', .true., kev+np, ritzr, ritzi, bounds) end if -c +c call dsortc (which, .true., kev+np, ritzr, ritzi, bounds) -c +c c %-------------------------------------------------------% c | Increase KEV by one if the ( ritzr(np),ritzi(np) ) | c | = ( ritzr(np+1),-ritzi(np+1) ) and ritz(np) .ne. zero | c | Accordingly decrease NP by one. In other words keep | c | complex conjugate pairs together. | c %-------------------------------------------------------% -c +c if ( ( ritzr(np+1) - ritzr(np) ) .eq. zero & .and. ( ritzi(np+1) + ritzi(np) ) .eq. zero ) then np = np - 1 @@ -195,7 +195,7 @@ subroutine dngets ( ishift, which, kev, np, ritzr, ritzi, bounds, end if c if ( ishift .eq. 1 ) then -c +c c %-------------------------------------------------------% c | Sort the unwanted Ritz values used as shifts so that | c | the ones with largest Ritz estimates are first | @@ -204,28 +204,28 @@ subroutine dngets ( ishift, which, kev, np, ritzr, ritzi, bounds, c | are applied in subroutine dnapps. | c | Be careful and use 'SR' since we want to sort BOUNDS! | c %-------------------------------------------------------% -c +c call dsortc ( 'SR', .true., np, bounds, ritzr, ritzi ) end if -c - call second (t1) +c + call arscnd (t1) tngets = tngets + (t1 - t0) c if (msglvl .gt. 0) then - call ivout (logfil, 1, kev, ndigit, '_ngets: KEV is') - call ivout (logfil, 1, np, ndigit, '_ngets: NP is') + call ivout (logfil, 1, [kev], ndigit, '_ngets: KEV is') + call ivout (logfil, 1, [np], ndigit, '_ngets: NP is') call dvout (logfil, kev+np, ritzr, ndigit, & '_ngets: Eigenvalues of current H matrix -- real part') call dvout (logfil, kev+np, ritzi, ndigit, & '_ngets: Eigenvalues of current H matrix -- imag part') - call dvout (logfil, kev+np, bounds, ndigit, + call dvout (logfil, kev+np, bounds, ndigit, & '_ngets: Ritz estimates of the current KEV+NP Ritz values') end if -c +c return -c +c c %---------------% c | End of dngets | c %---------------% -c +c end diff --git a/Toolbox/arpack-src/dsaitr.f b/Toolbox/arpack-src/dsaitr.f index 2d3026485..3460d990c 100644 --- a/Toolbox/arpack-src/dsaitr.f +++ b/Toolbox/arpack-src/dsaitr.f @@ -3,8 +3,8 @@ c c\Name: dsaitr c -c\Description: -c Reverse communication interface for applying NP additional steps to +c\Description: +c Reverse communication interface for applying NP additional steps to c a K step symmetric Arnoldi factorization. c c Input: OP*V_{k} - V_{k}*H = r_{k}*e_{k}^T @@ -20,7 +20,7 @@ c c\Usage: c call dsaitr -c ( IDO, BMAT, N, K, NP, MODE, RESID, RNORM, V, LDV, H, LDH, +c ( IDO, BMAT, N, K, NP, MODE, RESID, RNORM, V, LDV, H, LDH, c IPNTR, WORKD, INFO ) c c\Arguments @@ -76,13 +76,13 @@ c On OUTPUT the B-norm of the updated residual r_{k+p}. c c V Double precision N by K+NP array. (INPUT/OUTPUT) -c On INPUT: V contains the Arnoldi vectors in the first K +c On INPUT: V contains the Arnoldi vectors in the first K c columns. c On OUTPUT: V contains the new NP Arnoldi vectors in the next c NP columns. The first K columns are unchanged. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c H Double precision (K+NP) by 2 array. (INPUT/OUTPUT) @@ -91,26 +91,26 @@ c and the main diagonal in the second column. c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORK for +c Pointer to mark the starting locations in the WORK for c vectors used by the Arnoldi iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in the +c IPNTR(3): pointer to the vector B * X when used in the c shift-and-invert mode. X is the current operand. c ------------------------------------------------------------- -c +c c WORKD Double precision work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The calling program should not +c for reverse communication. The calling program should not c use WORKD as temporary workspace during the iteration !!!!!! c On INPUT, WORKD(1:N) = B*RESID where RESID is associated -c with the K step Arnoldi factorization. Used to save some -c computation at the first step. +c with the K step Arnoldi factorization. Used to save some +c computation at the first step. c On OUTPUT, WORKD(1:N) = B*RESID where RESID is associated c with the K+NP step Arnoldi factorization. c @@ -139,7 +139,7 @@ c daxpy Level 1 BLAS that computes a vector triad. c dscal Level 1 BLAS that scales a vector. c dcopy Level 1 BLAS that copies one vector to another . -c ddot Level 1 BLAS that computes the scalar product of two vectors. +c ddot Level 1 BLAS that computes the scalar product of two vectors. c dnrm2 Level 1 BLAS that computes the norm of a vector. c c\Author @@ -147,29 +147,29 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: c xx/xx/93: Version ' 2.4' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: saitr.F SID: 2.6 DATE OF SID: 8/28/96 RELEASE: 2 c c\Remarks c The algorithm implemented is: -c +c c restart = .false. -c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; +c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; c r_{k} contains the initial residual vector even for k = 0; -c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already +c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already c computed by the calling program. c c betaj = rnorm ; p_{k+1} = B*r_{k} ; c For j = k+1, ..., k+np Do c 1) if ( betaj < tol ) stop or restart depending on j. c if ( restart ) generate a new starting vector. -c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; +c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; c p_{j} = p_{j}/betaj c 3) r_{j} = OP*v_{j} where OP is defined as in dsaupd c For shift-invert mode p_{j} = B*v_{j} is already available. @@ -184,7 +184,7 @@ c 5) Re-orthogonalization step: c s = V_{j}'*B*r_{j} c r_{j} = r_{j} - V_{j}*s; rnorm1 = || r_{j} || -c alphaj = alphaj + s_{j}; +c alphaj = alphaj + s_{j}; c 6) Iterative refinement step: c If (rnorm1 > 0.717*rnorm) then c rnorm = rnorm1 @@ -194,7 +194,7 @@ c If this is the first time in step 6), go to 5) c Else r_{j} lies in the span of V_{j} numerically. c Set r_{j} = 0 and rnorm = 0; go to 1) -c EndIf +c EndIf c End Do c c\EndLib @@ -202,15 +202,15 @@ c----------------------------------------------------------------------- c subroutine dsaitr - & (ido, bmat, n, k, np, mode, resid, rnorm, v, ldv, h, ldh, + & (ido, bmat, n, k, np, mode, resid, rnorm, v, ldv, h, ldh, & ipntr, workd, info) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -242,7 +242,7 @@ subroutine dsaitr c %---------------% c logical first, orth1, orth2, rstart, step3, step4 - integer i, ierr, ipj, irj, ivj, iter, itry, j, msglvl, + integer i, ierr, ipj, irj, ivj, iter, itry, j, msglvl, & infol, jj Double precision & rnorm1, wnorm, safmin, temp1 @@ -251,7 +251,7 @@ subroutine dsaitr & rnorm1, safmin, wnorm c c %-----------------------% -c | Local Array Arguments | +c | Local Array Arguments | c %-----------------------% c Double precision @@ -262,7 +262,7 @@ subroutine dsaitr c %----------------------% c external daxpy, dcopy, dscal, dgemv, dgetv0, dvout, dmout, - & dlascl, ivout, second + & dlascl, ivout, arscnd c c %--------------------% c | External Functions | @@ -294,15 +294,15 @@ subroutine dsaitr end if c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = msaitr -c +c c %------------------------------% c | Initial call to this routine | c %------------------------------% @@ -313,14 +313,14 @@ subroutine dsaitr rstart = .false. orth1 = .false. orth2 = .false. -c +c c %--------------------------------% c | Pointer to the current step of | c | the factorization to build | c %--------------------------------% c j = k + 1 -c +c c %------------------------------------------% c | Pointers used for reverse communication | c | when using WORKD. | @@ -330,7 +330,7 @@ subroutine dsaitr irj = ipj + n ivj = irj + n end if -c +c c %-------------------------------------------------% c | When in reverse communication mode one of: | c | STEP3, STEP4, ORTH1, ORTH2, RSTART | @@ -353,7 +353,7 @@ subroutine dsaitr c %------------------------------% c | Else this is the first step. | c %------------------------------% -c +c c %--------------------------------------------------------------% c | | c | A R N O L D I I T E R A T I O N L O O P | @@ -364,15 +364,15 @@ subroutine dsaitr 1000 continue c if (msglvl .gt. 2) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_saitr: generating Arnoldi vector no.') - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_saitr: B-norm of the current residual =') end if -c +c c %---------------------------------------------------------% -c | Check for exact zero. Equivalent to determing whether a | -c | j-step Arnoldi factorization is present. | +c | Check for exact zero. Equivalent to determining whether | +c | a j-step Arnoldi factorization is present. | c %---------------------------------------------------------% c if (rnorm .gt. zero) go to 40 @@ -384,10 +384,10 @@ subroutine dsaitr c %---------------------------------------------------% c if (msglvl .gt. 0) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_saitr: ****** restart at step ******') end if -c +c c %---------------------------------------------% c | ITRY is the loop variable that controls the | c | maximum amount of times that a restart is | @@ -406,7 +406,7 @@ subroutine dsaitr c | RSTART = .true. flow returns here. | c %--------------------------------------% c - call dgetv0 (ido, bmat, itry, .false., n, j, v, ldv, + call dgetv0 (ido, bmat, itry, .false., n, j, v, ldv, & resid, rnorm, ipntr, workd, ierr) if (ido .ne. 99) go to 9000 if (ierr .lt. 0) then @@ -420,12 +420,12 @@ subroutine dsaitr c %------------------------------------------------% c info = j - 1 - call second (t1) + call arscnd (t1) tsaitr = tsaitr + (t1 - t0) ido = 99 go to 9000 end if -c +c 40 continue c c %---------------------------------------------------------% @@ -447,12 +447,12 @@ subroutine dsaitr c | use LAPACK routine SLASCL | c %-----------------------------------------% c - call dlascl ('General', i, i, rnorm, one, n, 1, + call dlascl ('General', i, i, rnorm, one, n, 1, & v(1,j), n, infol) - call dlascl ('General', i, i, rnorm, one, n, 1, + call dlascl ('General', i, i, rnorm, one, n, 1, & workd(ipj), n, infol) end if -c +c c %------------------------------------------------------% c | STEP 3: r_{j} = OP*v_{j}; Note that p_{j} = B*v_{j} | c | Note that this is not quite yet r_{j}. See STEP 4 | @@ -460,28 +460,28 @@ subroutine dsaitr c step3 = .true. nopx = nopx + 1 - call second (t2) + call arscnd (t2) call dcopy (n, v(1,j), 1, workd(ivj), 1) ipntr(1) = ivj ipntr(2) = irj ipntr(3) = ipj ido = 1 -c +c c %-----------------------------------% c | Exit in order to compute OP*v_{j} | c %-----------------------------------% -c +c go to 9000 50 continue -c +c c %-----------------------------------% c | Back from reverse communication; | c | WORKD(IRJ:IRJ+N-1) := OP*v_{j}. | c %-----------------------------------% c - call second (t3) + call arscnd (t3) tmvopx = tmvopx + (t3 - t2) -c +c step3 = .false. c c %------------------------------------------% @@ -489,7 +489,7 @@ subroutine dsaitr c %------------------------------------------% c call dcopy (n, workd(irj), 1, resid, 1) -c +c c %-------------------------------------------% c | STEP 4: Finish extending the symmetric | c | Arnoldi to length j. If MODE = 2 | @@ -500,33 +500,33 @@ subroutine dsaitr c %-------------------------------------------% c if (mode .eq. 2) go to 65 - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 step4 = .true. ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-------------------------------------% c | Exit in order to compute B*OP*v_{j} | c %-------------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call dcopy(n, resid, 1 , workd(ipj), 1) end if 60 continue -c +c c %-----------------------------------% c | Back from reverse communication; | c | WORKD(IPJ:IPJ+N-1) := B*OP*v_{j}. | c %-----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) - end if + end if c step4 = .false. c @@ -545,7 +545,7 @@ subroutine dsaitr c wnorm = ddot (n, resid, 1, workd(ivj), 1) wnorm = sqrt(abs(wnorm)) - else if (bmat .eq. 'G') then + else if (bmat .eq. 'G') then wnorm = ddot (n, resid, 1, workd(ipj), 1) wnorm = sqrt(abs(wnorm)) else if (bmat .eq. 'I') then @@ -567,19 +567,19 @@ subroutine dsaitr c %------------------------------------------% c if (mode .ne. 2 ) then - call dgemv('T', n, j, one, v, ldv, workd(ipj), 1, zero, + call dgemv('T', n, j, one, v, ldv, workd(ipj), 1, zero, & workd(irj), 1) else if (mode .eq. 2) then - call dgemv('T', n, j, one, v, ldv, workd(ivj), 1, zero, + call dgemv('T', n, j, one, v, ldv, workd(ivj), 1, zero, & workd(irj), 1) end if c c %--------------------------------------% c | Orthgonalize r_{j} against V_{j}. | -c | RESID contains OP*v_{j}. See STEP 3. | +c | RESID contains OP*v_{j}. See STEP 3. | c %--------------------------------------% c - call dgemv('N', n, j, -one, v, ldv, workd(irj), 1, one, + call dgemv('N', n, j, -one, v, ldv, workd(irj), 1, one, & resid, 1) c c %--------------------------------------% @@ -592,46 +592,46 @@ subroutine dsaitr else h(j,1) = rnorm end if - call second (t4) -c + call arscnd (t4) +c orth1 = .true. iter = 0 -c - call second (t2) +c + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call dcopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*r_{j} | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call dcopy (n, resid, 1, workd(ipj), 1) end if 70 continue -c +c c %---------------------------------------------------% c | Back from reverse communication if ORTH1 = .true. | c | WORKD(IPJ:IPJ+N-1) := B*r_{j}. | c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c orth1 = .false. c c %------------------------------% c | Compute the B-norm of r_{j}. | c %------------------------------% c - if (bmat .eq. 'G') then + if (bmat .eq. 'G') then rnorm = ddot (n, resid, 1, workd(ipj), 1) rnorm = sqrt(abs(rnorm)) else if (bmat .eq. 'I') then @@ -655,7 +655,7 @@ subroutine dsaitr c if (rnorm .gt. 0.717*wnorm) go to 100 nrorth = nrorth + 1 -c +c c %---------------------------------------------------% c | Enter the Iterative refinement phase. If further | c | refinement is necessary, loop back here. The loop | @@ -668,7 +668,7 @@ subroutine dsaitr if (msglvl .gt. 2) then xtemp(1) = wnorm xtemp(2) = rnorm - call dvout (logfil, 2, xtemp, ndigit, + call dvout (logfil, 2, xtemp, ndigit, & '_saitr: re-orthonalization ; wnorm and rnorm are') end if c @@ -677,7 +677,7 @@ subroutine dsaitr c | WORKD(IRJ:IRJ+J-1) = v(:,1:J)'*WORKD(IPJ:IPJ+N-1). | c %----------------------------------------------------% c - call dgemv ('T', n, j, one, v, ldv, workd(ipj), 1, + call dgemv ('T', n, j, one, v, ldv, workd(ipj), 1, & zero, workd(irj), 1) c c %----------------------------------------------% @@ -688,26 +688,26 @@ subroutine dsaitr c | H(j,j) is updated. | c %----------------------------------------------% c - call dgemv ('N', n, j, -one, v, ldv, workd(irj), 1, + call dgemv ('N', n, j, -one, v, ldv, workd(irj), 1, & one, resid, 1) c if (j .eq. 1 .or. rstart) h(j,1) = zero h(j,2) = h(j,2) + workd(irj + j - 1) -c +c orth2 = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call dcopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-----------------------------------% c | Exit in order to compute B*r_{j}. | c | r_{j} is the corrected residual. | c %-----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call dcopy (n, resid, 1, workd(ipj), 1) @@ -719,15 +719,15 @@ subroutine dsaitr c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if c c %-----------------------------------------------------% c | Compute the B-norm of the corrected residual r_{j}. | c %-----------------------------------------------------% -c - if (bmat .eq. 'G') then +c + if (bmat .eq. 'G') then rnorm1 = ddot (n, resid, 1, workd(ipj), 1) rnorm1 = sqrt(abs(rnorm1)) else if (bmat .eq. 'I') then @@ -735,7 +735,7 @@ subroutine dsaitr end if c if (msglvl .gt. 0 .and. iter .gt. 0) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_saitr: Iterative refinement for Arnoldi residual') if (msglvl .gt. 2) then xtemp(1) = rnorm @@ -744,7 +744,7 @@ subroutine dsaitr & '_saitr: iterative refinement ; rnorm and rnorm1 are') end if end if -c +c c %-----------------------------------------% c | Determine if we need to perform another | c | step of re-orthogonalization. | @@ -757,7 +757,7 @@ subroutine dsaitr c %--------------------------------% c rnorm = rnorm1 -c +c else c c %-------------------------------------------% @@ -779,7 +779,7 @@ subroutine dsaitr 95 continue rnorm = zero end if -c +c c %----------------------------------------------% c | Branch here directly if iterative refinement | c | wasn't necessary or after at most NITER_REF | @@ -787,13 +787,13 @@ subroutine dsaitr c %----------------------------------------------% c 100 continue -c +c rstart = .false. orth2 = .false. -c - call second (t5) +c + call arscnd (t5) titref = titref + (t5 - t4) -c +c c %----------------------------------------------------------% c | Make sure the last off-diagonal element is non negative | c | If not perform a similarity transformation on H(1:j,1:j) | @@ -802,28 +802,28 @@ subroutine dsaitr c if (h(j,1) .lt. zero) then h(j,1) = -h(j,1) - if ( j .lt. k+np) then + if ( j .lt. k+np) then call dscal(n, -one, v(1,j+1), 1) else call dscal(n, -one, resid, 1) end if end if -c +c c %------------------------------------% c | STEP 6: Update j = j+1; Continue | c %------------------------------------% c j = j + 1 if (j .gt. k+np) then - call second (t1) + call arscnd (t1) tsaitr = tsaitr + (t1 - t0) ido = 99 c if (msglvl .gt. 1) then - call dvout (logfil, k+np, h(1,2), ndigit, + call dvout (logfil, k+np, h(1,2), ndigit, & '_saitr: main diagonal of matrix H of step K+NP.') if (k+np .gt. 1) then - call dvout (logfil, k+np-1, h(2,1), ndigit, + call dvout (logfil, k+np-1, h(2,1), ndigit, & '_saitr: sub diagonal of matrix H of step K+NP.') end if end if @@ -836,7 +836,7 @@ subroutine dsaitr c %--------------------------------------------------------% c go to 1000 -c +c c %---------------------------------------------------------------% c | | c | E N D O F M A I N I T E R A T I O N L O O P | diff --git a/Toolbox/arpack-src/dsapps.f b/Toolbox/arpack-src/dsapps.f index 4089d2f8d..f84ef8389 100644 --- a/Toolbox/arpack-src/dsapps.f +++ b/Toolbox/arpack-src/dsapps.f @@ -12,8 +12,8 @@ c c A*(V_{k}*Q) - (V_{k}*Q)*(Q^T* H_{k}*Q) = r_{k+p}*e_{k+p}^T * Q c -c where Q is an orthogonal matrix of order KEV+NP. Q is the product of -c rotations resulting from the NP bulge chasing sweeps. The updated Arnoldi +c where Q is an orthogonal matrix of order KEV+NP. Q is the product of +c rotations resulting from the NP bulge chasing sweeps. The updated Arnoldi c factorization becomes: c c A*VNEW_{k} - VNEW_{k}*HNEW_{k} = rnew_{k}*e_{k}^T. @@ -49,7 +49,7 @@ c INPUT: H contains the symmetric tridiagonal matrix of the c Arnoldi factorization with the subdiagonal in the 1st column c starting at H(2,1) and the main diagonal in the 2nd column. -c OUTPUT: H contains the updated tridiagonal matrix in the +c OUTPUT: H contains the updated tridiagonal matrix in the c KEV leading submatrix. c c LDH Integer. (INPUT) @@ -85,13 +85,13 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: -c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c ivout ARPACK utility routine that prints integers. +c arscnd ARPACK utility routine for timing. c dvout ARPACK utility routine that prints vectors. c dlamch LAPACK routine that determines machine constants. c dlartg LAPACK Givens rotation construction routine. @@ -107,19 +107,19 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c 12/16/93: Version ' 2.4' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sapps.F SID: 2.6 DATE OF SID: 3/28/97 RELEASE: 2 c c\Remarks c 1. In this version, each shift is applied to all the subblocks of -c the tridiagonal matrix H and not just to the submatrix that it -c comes from. This routine assumes that the subdiagonal elements +c the tridiagonal matrix H and not just to the submatrix that it +c comes from. This routine assumes that the subdiagonal elements c of H that are stored in h(1:kev+np,1) are nonegative upon input c and enforce this condition upon output. This version incorporates c deflation. See code for documentation. @@ -135,8 +135,8 @@ subroutine dsapps c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -149,7 +149,7 @@ subroutine dsapps c %-----------------% c Double precision - & h(ldh,2), q(ldq,kev+np), resid(n), shift(np), + & h(ldh,2), q(ldq,kev+np), resid(n), shift(np), & v(ldv,kev+np), workd(2*n) c c %------------% @@ -175,8 +175,8 @@ subroutine dsapps c | External Subroutines | c %----------------------% c - external daxpy, dcopy, dscal, dlacpy, dlartg, dlaset, dvout, - & ivout, second, dgemv + external daxpy, dcopy, dscal, dlacpy, dlartg, dlaset, dvout, + & ivout, arscnd, dgemv c c %--------------------% c | External Functions | @@ -193,7 +193,7 @@ subroutine dsapps intrinsic abs c c %----------------% -c | Data statments | +c | Data statements | c %----------------% c data first / .true. / @@ -213,11 +213,11 @@ subroutine dsapps c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = msapps -c - kplusp = kev + np -c +c + kplusp = kev + np +c c %----------------------------------------------% c | Initialize Q to the identity matrix of order | c | kplusp used to accumulate the rotations. | @@ -230,7 +230,7 @@ subroutine dsapps c %----------------------------------------------% c if (np .eq. 0) go to 9000 -c +c c %----------------------------------------------------------% c | Apply the np shifts implicitly. Apply each shift to the | c | whole matrix and not just to the submatrix from which it | @@ -238,7 +238,7 @@ subroutine dsapps c %----------------------------------------------------------% c do 90 jj = 1, np -c +c istart = itop c c %----------------------------------------------------------% @@ -261,11 +261,11 @@ subroutine dsapps big = abs(h(i,2)) + abs(h(i+1,2)) if (h(i+1,1) .le. epsmch*big) then if (msglvl .gt. 0) then - call ivout (logfil, 1, i, ndigit, + call ivout (logfil, 1, [i], ndigit, & '_sapps: deflation at row/column no.') - call ivout (logfil, 1, jj, ndigit, - & '_sapps: occured before shift number.') - call dvout (logfil, 1, h(i+1,1), ndigit, + call ivout (logfil, 1, [jj], ndigit, + & '_sapps: occurred before shift number.') + call dvout (logfil, 1, h(i+1,1), ndigit, & '_sapps: the corresponding off diagonal element') end if h(i+1,1) = zero @@ -277,7 +277,7 @@ subroutine dsapps 40 continue c if (istart .lt. iend) then -c +c c %--------------------------------------------------------% c | Construct the plane rotation G'(istart,istart+1,theta) | c | that attempts to drive h(istart+1,1) to zero. | @@ -286,7 +286,7 @@ subroutine dsapps f = h(istart,2) - shift(jj) g = h(istart+1,1) call dlartg (f, g, c, s, r) -c +c c %-------------------------------------------------------% c | Apply rotation to the left and right of H; | c | H <- G' * H * G, where G = G(istart,istart+1,theta). | @@ -296,11 +296,11 @@ subroutine dsapps a1 = c*h(istart,2) + s*h(istart+1,1) a2 = c*h(istart+1,1) + s*h(istart+1,2) a4 = c*h(istart+1,2) - s*h(istart+1,1) - a3 = c*h(istart+1,1) - s*h(istart,2) + a3 = c*h(istart+1,1) - s*h(istart,2) h(istart,2) = c*a1 + s*a2 h(istart+1,2) = c*a4 - s*a3 h(istart+1,1) = c*a3 + s*a4 -c +c c %----------------------------------------------------% c | Accumulate the rotation in the matrix Q; Q <- Q*G | c %----------------------------------------------------% @@ -323,7 +323,7 @@ subroutine dsapps c %----------------------------------------------% c do 70 i = istart+1, iend-1 -c +c c %----------------------------------------------% c | Construct the plane rotation G'(i,i+1,theta) | c | that zeros the i-th bulge that was created | @@ -351,23 +351,23 @@ subroutine dsapps c = -c s = -s end if -c +c c %--------------------------------------------% c | Apply rotation to the left and right of H; | c | H <- G * H * G', where G = G(i,i+1,theta) | c %--------------------------------------------% c h(i,1) = r -c +c a1 = c*h(i,2) + s*h(i+1,1) a2 = c*h(i+1,1) + s*h(i+1,2) a3 = c*h(i+1,1) - s*h(i,2) a4 = c*h(i+1,2) - s*h(i+1,1) -c +c h(i,2) = c*a1 + s*a2 h(i+1,2) = c*a4 - s*a3 h(i+1,1) = c*a3 + s*a4 -c +c c %----------------------------------------------------% c | Accumulate the rotation in the matrix Q; Q <- Q*G | c %----------------------------------------------------% @@ -425,16 +425,16 @@ subroutine dsapps c %------------------------------------------% c | All shifts have been applied. Check for | c | more possible deflation that might occur | -c | after the last shift is applied. | +c | after the last shift is applied. | c %------------------------------------------% c do 100 i = itop, kplusp-1 big = abs(h(i,2)) + abs(h(i+1,2)) if (h(i+1,1) .le. epsmch*big) then if (msglvl .gt. 0) then - call ivout (logfil, 1, i, ndigit, + call ivout (logfil, 1, [i], ndigit, & '_sapps: deflation at row/column no.') - call dvout (logfil, 1, h(i+1,1), ndigit, + call dvout (logfil, 1, h(i+1,1), ndigit, & '_sapps: the corresponding off diagonal element') end if h(i+1,1) = zero @@ -447,13 +447,13 @@ subroutine dsapps c | This is not necessary if h(kev+1,1) = 0. | c %-------------------------------------------------% c - if ( h(kev+1,1) .gt. zero ) + if ( h(kev+1,1) .gt. zero ) & call dgemv ('N', n, kplusp, one, v, ldv, & q(1,kev+1), 1, zero, workd(n+1), 1) -c +c c %-------------------------------------------------------% c | Compute column 1 to kev of (V*Q) in backward order | -c | taking advantage that Q is an upper triangular matrix | +c | taking advantage that Q is an upper triangular matrix | c | with lower bandwidth np. | c | Place results in v(:,kplusp-kev:kplusp) temporarily. | c %-------------------------------------------------------% @@ -468,16 +468,18 @@ subroutine dsapps c | Move v(:,kplusp-kev+1:kplusp) into v(:,1:kev). | c %-------------------------------------------------% c - call dlacpy ('All', n, kev, v(1,np+1), ldv, v, ldv) -c + do 140 i = 1, kev + call dcopy (n, v(1,np+i), 1, v(1,i), 1) + 140 continue +c c %--------------------------------------------% c | Copy the (kev+1)-st column of (V*Q) in the | c | appropriate place if h(kev+1,1) .ne. zero. | c %--------------------------------------------% c - if ( h(kev+1,1) .gt. zero ) + if ( h(kev+1,1) .gt. zero ) & call dcopy (n, workd(n+1), 1, v(1,kev+1), 1) -c +c c %-------------------------------------% c | Update the residual vector: | c | r <- sigmak*r + betak*v(:,kev+1) | @@ -487,26 +489,26 @@ subroutine dsapps c %-------------------------------------% c call dscal (n, q(kplusp,kev), resid, 1) - if (h(kev+1,1) .gt. zero) + if (h(kev+1,1) .gt. zero) & call daxpy (n, h(kev+1,1), v(1,kev+1), 1, resid, 1) c if (msglvl .gt. 1) then - call dvout (logfil, 1, q(kplusp,kev), ndigit, + call dvout (logfil, 1, q(kplusp,kev), ndigit, & '_sapps: sigmak of the updated residual vector') - call dvout (logfil, 1, h(kev+1,1), ndigit, + call dvout (logfil, 1, h(kev+1,1), ndigit, & '_sapps: betak of the updated residual vector') - call dvout (logfil, kev, h(1,2), ndigit, + call dvout (logfil, kev, h(1,2), ndigit, & '_sapps: updated main diagonal of H for next iteration') if (kev .gt. 1) then - call dvout (logfil, kev-1, h(2,1), ndigit, + call dvout (logfil, kev-1, h(2,1), ndigit, & '_sapps: updated sub diagonal of H for next iteration') end if end if c - call second (t1) + call arscnd (t1) tsapps = tsapps + (t1 - t0) -c - 9000 continue +c + 9000 continue return c c %---------------% diff --git a/Toolbox/arpack-src/dsaup2.f b/Toolbox/arpack-src/dsaup2.f index b61ff5b64..fd4143f53 100644 --- a/Toolbox/arpack-src/dsaup2.f +++ b/Toolbox/arpack-src/dsaup2.f @@ -3,35 +3,35 @@ c c\Name: dsaup2 c -c\Description: +c\Description: c Intermediate level interface called by dsaupd. c c\Usage: -c call dsaup2 +c call dsaup2 c ( IDO, BMAT, N, WHICH, NEV, NP, TOL, RESID, MODE, IUPD, -c ISHIFT, MXITER, V, LDV, H, LDH, RITZ, BOUNDS, Q, LDQ, WORKL, +c ISHIFT, MXITER, V, LDV, H, LDH, RITZ, BOUNDS, Q, LDQ, WORKL, c IPNTR, WORKD, INFO ) c c\Arguments c c IDO, BMAT, N, WHICH, NEV, TOL, RESID: same as defined in dsaupd. c MODE, ISHIFT, MXITER: see the definition of IPARAM in dsaupd. -c +c c NP Integer. (INPUT/OUTPUT) -c Contains the number of implicit shifts to apply during -c each Arnoldi/Lanczos iteration. -c If ISHIFT=1, NP is adjusted dynamically at each iteration +c Contains the number of implicit shifts to apply during +c each Arnoldi/Lanczos iteration. +c If ISHIFT=1, NP is adjusted dynamically at each iteration c to accelerate convergence and prevent stagnation. -c This is also roughly equal to the number of matrix-vector +c This is also roughly equal to the number of matrix-vector c products (involving the operator OP) per Arnoldi iteration. c The logic for adjusting is contained within the current c subroutine. c If ISHIFT=0, NP is the number of shifts the user needs -c to provide via reverse comunication. 0 < NP < NCV-NEV. +c to provide via reverse communication. 0 < NP < NCV-NEV. c NP may be less than NCV-NEV since a leading block of the current c upper Tridiagonal matrix has split off and contains "unwanted" c Ritz values. -c Upon termination of the IRA iteration, NP contains the number +c Upon termination of the IRA iteration, NP contains the number c of "converged" wanted Ritz values. c c IUPD Integer. (INPUT) @@ -42,18 +42,18 @@ c The Lanczos basis vectors. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c H Double precision (NEV+NP) by 2 array. (OUTPUT) c H is used to store the generated symmetric tridiagonal matrix -c The subdiagonal is stored in the first column of H starting -c at H(2,1). The main diagonal is stored in the second column -c of H starting at H(1,2). If dsaup2 converges store the +c The subdiagonal is stored in the first column of H starting +c at H(2,1). The main diagonal is stored in the arscnd column +c of H starting at H(1,2). If dsaup2 converges store the c B-norm of the final residual vector in H(1,1). c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c RITZ Double precision array of length NEV+NP. (OUTPUT) @@ -63,33 +63,33 @@ c BOUNDS(1:NEV) contain the error bounds corresponding to RITZ. c c Q Double precision (NEV+NP) by (NEV+NP) array. (WORKSPACE) -c Private (replicated) work array used to accumulate the +c Private (replicated) work array used to accumulate the c rotation in the shift application step. c c LDQ Integer. (INPUT) c Leading dimension of Q exactly as declared in the calling c program. -c +c c WORKL Double precision array of length at least 3*(NEV+NP). (INPUT/WORKSPACE) c Private (replicated) array on each PE or array allocated on -c the front end. It is used in the computation of the +c the front end. It is used in the computation of the c tridiagonal eigenvalue problem, the calculation and c application of the shifts and convergence checking. c If ISHIFT .EQ. O and IDO .EQ. 3, the first NP locations -c of WORKL are used in reverse communication to hold the user +c of WORKL are used in reverse communication to hold the user c supplied shifts. c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORKD for +c Pointer to mark the starting locations in the WORKD for c vectors used by the Lanczos iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in one of +c IPNTR(3): pointer to the vector B * X when used in one of c the spectral transformation modes. X is the current c operand. c ------------------------------------------------------------- -c +c c WORKD Double precision work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Lanczos iteration c for reverse communication. The user should not use WORKD @@ -102,9 +102,9 @@ c possibly from a previous run. c Error flag on output. c = 0: Normal return. -c = 1: All possible eigenvalues of OP has been found. +c = 1: All possible eigenvalues of OP has been found. c NP returns the size of the invariant subspace -c spanning the operator OP. +c spanning the operator OP. c = 2: No shifts could be applied. c = -8: Error return from trid. eigenvalue calculation; c This should never happen. @@ -122,7 +122,7 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett, "The Symmetric Eigenvalue Problem". Prentice-Hall, @@ -132,15 +132,15 @@ c 5. B. Nour-Omid, B.N. Parlett, T. Ericson, P.S. Jensen, "How to c Implement the Spectral Transformation", Math. Comp., 48 (1987), c pp 663-673. -c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos -c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", +c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos +c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", c SIAM J. Matr. Anal. Apps., January (1993). c 7. L. Reichel, W.B. Gragg, "Algorithm 686: FORTRAN Subroutines c for Updating the QR decomposition", ACM TOMS, December 1990, c Volume 16 Number 4, pp 369-377. c c\Routines called: -c dgetv0 ARPACK initial vector generation routine. +c dgetv0 ARPACK initial vector generation routine. c dsaitr ARPACK Lanczos factorization routine. c dsapps ARPACK application of implicit shifts routine. c dsconv ARPACK convergence of Ritz values routine. @@ -148,11 +148,11 @@ c dsgets ARPACK reorder Ritz values and error bounds routine. c dsortr ARPACK sorting routine. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c dvout ARPACK utility routine that prints vectors. c dlamch LAPACK routine that determines machine constants. c dcopy Level 1 BLAS that copies one vector to another. -c ddot Level 1 BLAS that computes the scalar product of two vectors. +c ddot Level 1 BLAS that computes the scalar product of two vectors. c dnrm2 Level 1 BLAS that computes the norm of a vector. c dscal Level 1 BLAS that scales a vector. c dswap Level 1 BLAS that swaps two vectors. @@ -162,14 +162,14 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: c 12/15/93: Version ' 2.4' c xx/xx/95: Version ' 2.4'. (R.B. Lehoucq) c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: saup2.F SID: 2.7 DATE OF SID: 5/19/98 RELEASE: 2 c c\EndLib @@ -177,16 +177,16 @@ c----------------------------------------------------------------------- c subroutine dsaup2 - & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, - & ishift, mxiter, v, ldv, h, ldh, ritz, bounds, + & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, + & ishift, mxiter, v, ldv, h, ldh, ritz, bounds, & q, ldq, workl, ipntr, workd, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -204,8 +204,8 @@ subroutine dsaup2 c integer ipntr(3) Double precision - & bounds(nev+np), h(ldh,2), q(ldq,nev+np), resid(n), - & ritz(nev+np), v(ldv,nev+np), workd(3*n), + & bounds(nev+np), h(ldh,2), q(ldq,nev+np), resid(n), + & ritz(nev+np), v(ldv,nev+np), workd(3*n), & workl(3*(nev+np)) c c %------------% @@ -222,8 +222,8 @@ subroutine dsaup2 c character wprime*2 logical cnorm, getv0, initv, update, ushift - integer ierr, iter, j, kplusp, msglvl, nconv, nevbef, nev0, - & np0, nptemp, nevd2, nevm2, kp(3) + integer ierr, iter, j, kplusp, msglvl, nconv, nevbef, nev0, + & np0, nptemp, nevd2, nevm2, kp(3) Double precision & rnorm, temp, eps23 save cnorm, getv0, initv, update, ushift, @@ -234,8 +234,8 @@ subroutine dsaup2 c | External Subroutines | c %----------------------% c - external dcopy, dgetv0, dsaitr, dscal, dsconv, dseigt, dsgets, - & dsapps, dsortr, dvout, ivout, second, dswap + external dcopy, dgetv0, dsaitr, dscal, dsconv, dseigt, dsgets, + & dsapps, dsortr, dvout, ivout, arscnd, dswap c c %--------------------% c | External Functions | @@ -256,13 +256,13 @@ subroutine dsaup2 c %-----------------------% c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = msaup2 c c %---------------------------------% @@ -292,7 +292,7 @@ subroutine dsaup2 kplusp = nev0 + np0 nconv = 0 iter = 0 -c +c c %--------------------------------------------% c | Set flags for computing the first NEV steps | c | of the Lanczos factorization. | @@ -315,7 +315,7 @@ subroutine dsaup2 initv = .false. end if end if -c +c c %---------------------------------------------% c | Get a possibly random starting vector and | c | force it into the range of the operator OP. | @@ -332,7 +332,7 @@ subroutine dsaup2 if (rnorm .eq. zero) then c c %-----------------------------------------% -c | The initial vector is zero. Error exit. | +c | The initial vector is zero. Error exit. | c %-----------------------------------------% c info = -9 @@ -341,7 +341,7 @@ subroutine dsaup2 getv0 = .false. ido = 0 end if -c +c c %------------------------------------------------------------% c | Back from reverse communication: continue with update step | c %------------------------------------------------------------% @@ -360,14 +360,14 @@ subroutine dsaup2 c %-------------------------------------% c if (cnorm) go to 100 -c +c c %----------------------------------------------------------% c | Compute the first NEV steps of the Lanczos factorization | c %----------------------------------------------------------% c - call dsaitr (ido, bmat, n, 0, nev0, mode, resid, rnorm, v, ldv, + call dsaitr (ido, bmat, n, 0, nev0, mode, resid, rnorm, v, ldv, & h, ldh, ipntr, workd, info) -c +c c %---------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP and possibly B | @@ -388,7 +388,7 @@ subroutine dsaup2 info = -9999 go to 1200 end if -c +c c %--------------------------------------------------------------% c | | c | M A I N LANCZOS I T E R A T I O N L O O P | @@ -396,22 +396,22 @@ subroutine dsaup2 c | factorization in place. | c | | c %--------------------------------------------------------------% -c +c 1000 continue c iter = iter + 1 c if (msglvl .gt. 0) then - call ivout (logfil, 1, iter, ndigit, + call ivout (logfil, 1, [iter], ndigit, & '_saup2: **** Start of major iteration number ****') end if if (msglvl .gt. 1) then - call ivout (logfil, 1, nev, ndigit, + call ivout (logfil, 1, [nev], ndigit, & '_saup2: The length of the current Lanczos factorization') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_saup2: Extend the Lanczos factorization by') end if -c +c c %------------------------------------------------------------% c | Compute NP additional steps of the Lanczos factorization. | c %------------------------------------------------------------% @@ -420,9 +420,9 @@ subroutine dsaup2 20 continue update = .true. c - call dsaitr (ido, bmat, n, nev, np, mode, resid, rnorm, v, + call dsaitr (ido, bmat, n, nev, np, mode, resid, rnorm, v, & ldv, h, ldh, ipntr, workd, info) -c +c c %---------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP and possibly B | @@ -434,7 +434,7 @@ subroutine dsaup2 c c %-----------------------------------------------------% c | dsaitr was unable to build an Lanczos factorization | -c | of length NEV0+NP0. INFO is returned with the size | +c | of length NEV0+NP0. INFO is returned with the size | c | of the factorization built. Exit main loop. | c %-----------------------------------------------------% c @@ -446,10 +446,10 @@ subroutine dsaup2 update = .false. c if (msglvl .gt. 1) then - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_saup2: Current B-norm of residual for factorization') end if -c +c c %--------------------------------------------------------% c | Compute the eigenvalues and corresponding error bounds | c | of the current symmetric tridiagonal matrix. | @@ -483,7 +483,7 @@ subroutine dsaup2 nev = nev0 np = np0 call dsgets (ishift, which, nev, np, ritz, bounds, workl) -c +c c %-------------------% c | Convergence test. | c %-------------------% @@ -520,11 +520,11 @@ subroutine dsaup2 nev = nev + 1 end if 30 continue -c - if ( (nconv .ge. nev0) .or. +c + if ( (nconv .ge. nev0) .or. & (iter .gt. mxiter) .or. & (np .eq. 0) ) then -c +c c %------------------------------------------------% c | Prepare to exit. Put the converged Ritz values | c | and corresponding bounds in RITZ(1:NCONV) and | @@ -547,8 +547,9 @@ subroutine dsaup2 wprime = 'SA' call dsortr (wprime, .true., kplusp, ritz, bounds) nevd2 = nev0 / 2 - nevm2 = nev0 - nevd2 + nevm2 = nev0 - nevd2 if ( nev .gt. 1 ) then + np = kplusp - nev0 call dswap ( min(nevd2,np), ritz(nevm2+1), 1, & ritz( max(kplusp-nevd2+1,kplusp-np+1) ), 1) call dswap ( min(nevd2,np), bounds(nevm2+1), 1, @@ -587,7 +588,7 @@ subroutine dsaup2 c c %----------------------------------------------------% c | Sort the Ritz values according to the scaled Ritz | -c | esitmates. This will push all the converged ones | +c | estimates. This will push all the converged ones | c | towards the front of ritzr, ritzi, bounds | c | (in the case when NCONV < NEV.) | c %----------------------------------------------------% @@ -651,13 +652,13 @@ subroutine dsaup2 end if c c %------------------------------------% -c | Max iterations have been exceeded. | +c | Max iterations have been exceeded. | c %------------------------------------% c if (iter .gt. mxiter .and. nconv .lt. nev) info = 1 c c %---------------------% -c | No shifts to apply. | +c | No shifts to apply. | c %---------------------% c if (np .eq. 0 .and. nconv .lt. nev0) info = 2 @@ -681,20 +682,20 @@ subroutine dsaup2 nev = 2 end if np = kplusp - nev -c +c c %---------------------------------------% c | If the size of NEV was just increased | c | resort the eigenvalues. | c %---------------------------------------% -c - if (nevbef .lt. nev) +c + if (nevbef .lt. nev) & call dsgets (ishift, which, nev, np, ritz, bounds, & workl) c end if c if (msglvl .gt. 0) then - call ivout (logfil, 1, nconv, ndigit, + call ivout (logfil, 1, [nconv], ndigit, & '_saup2: no. of "converged" Ritz values at this iter.') if (msglvl .gt. 1) then kp(1) = nev @@ -708,7 +709,7 @@ subroutine dsaup2 end if end if -c +c if (ishift .eq. 0) then c c %-----------------------------------------------------% @@ -731,8 +732,8 @@ subroutine dsaup2 c %------------------------------------% c ushift = .false. -c -c +c +c c %---------------------------------------------------------% c | Move the NP shifts to the first NP locations of RITZ to | c | free up WORKL. This is for the non-exact shift case; | @@ -742,7 +743,7 @@ subroutine dsaup2 if (ishift .eq. 0) call dcopy (np, workl, 1, ritz, 1) c if (msglvl .gt. 2) then - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_saup2: The number of shifts to apply ') call dvout (logfil, np, workl, ndigit, & '_saup2: shifts selected') @@ -751,7 +752,7 @@ subroutine dsaup2 & '_saup2: corresponding Ritz estimates') end if end if -c +c c %---------------------------------------------------------% c | Apply the NP0 implicit shifts by QR bulge chasing. | c | Each shift is applied to the entire tridiagonal matrix. | @@ -770,36 +771,36 @@ subroutine dsaup2 c %---------------------------------------------% c cnorm = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call dcopy (n, resid, 1, workd(n+1), 1) ipntr(1) = n + 1 ipntr(2) = 1 ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*RESID | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call dcopy (n, resid, 1, workd, 1) end if -c +c 100 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(1:N) := B*RESID | c %----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c - if (bmat .eq. 'G') then +c + if (bmat .eq. 'G') then rnorm = ddot (n, resid, 1, workd, 1) rnorm = sqrt(abs(rnorm)) else if (bmat .eq. 'I') then @@ -809,14 +810,14 @@ subroutine dsaup2 130 continue c if (msglvl .gt. 2) then - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_saup2: B-norm of residual for NEV factorization') call dvout (logfil, nev, h(1,2), ndigit, & '_saup2: main diagonal of compressed H matrix') call dvout (logfil, nev-1, h(2,1), ndigit, & '_saup2: subdiagonal of compressed H matrix') end if -c +c go to 1000 c c %---------------------------------------------------------------% @@ -824,12 +825,12 @@ subroutine dsaup2 c | E N D O F M A I N I T E R A T I O N L O O P | c | | c %---------------------------------------------------------------% -c +c 1100 continue c mxiter = iter nev = nconv -c +c 1200 continue ido = 99 c @@ -837,9 +838,9 @@ subroutine dsaup2 c | Error exit | c %------------% c - call second (t1) + call arscnd (t1) tsaup2 = t1 - t0 -c +c 9000 continue return c diff --git a/Toolbox/arpack-src/dsaupd.f b/Toolbox/arpack-src/dsaupd.f index 7808e7432..81a0ce52c 100644 --- a/Toolbox/arpack-src/dsaupd.f +++ b/Toolbox/arpack-src/dsaupd.f @@ -1,33 +1,33 @@ c----------------------------------------------------------------------- c\BeginDoc c -c\Name: dsaupd +c\Name: dsaupd c -c\Description: +c\Description: c -c Reverse communication interface for the Implicitly Restarted Arnoldi -c Iteration. For symmetric problems this reduces to a variant of the Lanczos -c method. This method has been designed to compute approximations to a -c few eigenpairs of a linear operator OP that is real and symmetric -c with respect to a real positive semi-definite symmetric matrix B, +c Reverse communication interface for the Implicitly Restarted Arnoldi +c Iteration. For symmetric problems this reduces to a variant of the Lanczos +c method. This method has been designed to compute approximations to a +c few eigenpairs of a linear operator OP that is real and symmetric +c with respect to a real positive semi-definite symmetric matrix B, c i.e. -c -c B*OP = (OP`)*B. c -c Another way to express this condition is +c B*OP = (OP`)*B. +c +c Another way to express this condition is c c < x,OPy > = < OPx,y > where < z,w > = z`Bw . -c -c In the standard eigenproblem B is the identity matrix. +c +c In the standard eigenproblem B is the identity matrix. c ( A` denotes transpose of A) c c The computed approximate eigenvalues are called Ritz values and c the corresponding approximate eigenvectors are called Ritz vectors. c -c dsaupd is usually called iteratively to solve one of the +c dsaupd is usually called iteratively to solve one of the c following problems: c -c Mode 1: A*x = lambda*x, A symmetric +c Mode 1: A*x = lambda*x, A symmetric c ===> OP = A and B = I. c c Mode 2: A*x = lambda*M*x, A symmetric, M symmetric positive definite @@ -35,10 +35,10 @@ c ===> (If M can be factored see remark 3 below) c c Mode 3: K*x = lambda*M*x, K symmetric, M symmetric positive semi-definite -c ===> OP = (inv[K - sigma*M])*M and B = M. +c ===> OP = (inv[K - sigma*M])*M and B = M. c ===> Shift-and-Invert mode c -c Mode 4: K*x = lambda*KG*x, K symmetric positive semi-definite, +c Mode 4: K*x = lambda*KG*x, K symmetric positive semi-definite, c KG symmetric indefinite c ===> OP = (inv[K - sigma*KG])*K and B = K. c ===> Buckling mode @@ -60,13 +60,13 @@ c approximations. c c\Usage: -c call dsaupd +c call dsaupd c ( IDO, BMAT, N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, c IPNTR, WORKD, WORKL, LWORKL, INFO ) c c\Arguments c IDO Integer. (INPUT/OUTPUT) -c Reverse communication flag. IDO must be zero on the first +c Reverse communication flag. IDO must be zero on the first c call to dsaupd . IDO will be set internally to c indicate the type of operation to be performed. Control is c then given back to the calling routine which has the @@ -95,7 +95,7 @@ c placing the shifts. See remark 6 below. c IDO = 99: done c ------------------------------------------------------------- -c +c c BMAT Character*1. (INPUT) c BMAT specifies the type of the matrix B that defines the c semi-inner product for the operator OP. @@ -111,7 +111,7 @@ c 'LA' - compute the NEV largest (algebraic) eigenvalues. c 'SA' - compute the NEV smallest (algebraic) eigenvalues. c 'LM' - compute the NEV largest (in magnitude) eigenvalues. -c 'SM' - compute the NEV smallest (in magnitude) eigenvalues. +c 'SM' - compute the NEV smallest (in magnitude) eigenvalues. c 'BE' - compute NEV eigenvalues, half from each end of the c spectrum. When NEV is odd, compute one more from the c high end than from the low end. @@ -121,27 +121,27 @@ c Number of eigenvalues of OP to be computed. 0 < NEV < N. c c TOL Double precision scalar. (INPUT) -c Stopping criterion: the relative accuracy of the Ritz value +c Stopping criterion: the relative accuracy of the Ritz value c is considered acceptable if BOUNDS(I) .LE. TOL*ABS(RITZ(I)). c If TOL .LE. 0. is passed a default is set: c DEFAULT = DLAMCH ('EPS') (machine precision as computed c by the LAPACK auxiliary subroutine DLAMCH ). c c RESID Double precision array of length N. (INPUT/OUTPUT) -c On INPUT: +c On INPUT: c If INFO .EQ. 0, a random initial residual vector is used. c If INFO .NE. 0, RESID contains the initial residual vector, c possibly from a previous run. c On OUTPUT: -c RESID contains the final residual vector. +c RESID contains the final residual vector. c c NCV Integer. (INPUT) c Number of columns of the matrix V (less than or equal to N). -c This will indicate how many Lanczos vectors are generated -c at each iteration. After the startup phase in which NEV -c Lanczos vectors are generated, the algorithm generates +c This will indicate how many Lanczos vectors are generated +c at each iteration. After the startup phase in which NEV +c Lanczos vectors are generated, the algorithm generates c NCV-NEV Lanczos vectors at each subsequent update iteration. -c Most of the cost in generating each Lanczos vector is in the +c Most of the cost in generating each Lanczos vector is in the c matrix-vector product OP*x. (See remark 4 below). c c V Double precision N by NCV array. (OUTPUT) @@ -161,10 +161,10 @@ c the current tridiagonal matrix T are returned in c the part of WORKL array corresponding to RITZ. c See remark 6 below. -c ISHIFT = 1: exact shifts with respect to the reduced -c tridiagonal matrix T. This is equivalent to -c restarting the iteration with a starting vector -c that is a linear combination of Ritz vectors +c ISHIFT = 1: exact shifts with respect to the reduced +c tridiagonal matrix T. This is equivalent to +c restarting the iteration with a starting vector +c that is a linear combination of Ritz vectors c associated with the "wanted" Ritz values. c ------------------------------------------------------------- c @@ -172,8 +172,8 @@ c No longer referenced. See remark 2 below. c c IPARAM(3) = MXITER -c On INPUT: maximum number of Arnoldi update iterations allowed. -c On OUTPUT: actual number of Arnoldi update iterations taken. +c On INPUT: maximum number of Arnoldi update iterations allowed. +c On OUTPUT: actual number of Arnoldi update iterations taken. c c IPARAM(4) = NB: blocksize to be used in the recurrence. c The code currently works only for NB = 1. @@ -183,11 +183,11 @@ c the convergence criterion. c c IPARAM(6) = IUPD -c No longer referenced. Implicit restarting is ALWAYS used. +c No longer referenced. Implicit restarting is ALWAYS used. c c IPARAM(7) = MODE c On INPUT determines what type of eigenproblem is being solved. -c Must be 1,2,3,4,5; See under \Description of dsaupd for the +c Must be 1,2,3,4,5; See under \Description of dsaupd for the c five modes available. c c IPARAM(8) = NP @@ -199,7 +199,7 @@ c IPARAM(9) = NUMOP, IPARAM(10) = NUMOPB, IPARAM(11) = NUMREO, c OUTPUT: NUMOP = total number of OP*x operations, c NUMOPB = total number of B*x operations if BMAT='G', -c NUMREO = total number of steps of re-orthogonalization. +c NUMREO = total number of steps of re-orthogonalization. c c IPNTR Integer array of length 11. (OUTPUT) c Pointer to mark the starting locations in the WORKD and WORKL @@ -207,7 +207,7 @@ c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X in WORKD. c IPNTR(2): pointer to the current result vector Y in WORKD. -c IPNTR(3): pointer to the vector B * X in WORKD when used in +c IPNTR(3): pointer to the vector B * X in WORKD when used in c the shift-and-invert mode. c IPNTR(4): pointer to the next available location in WORKL c that is untouched by the program. @@ -224,14 +224,14 @@ c of the tridiagonal matrix T. Only referenced by c dseupd if RVEC = .TRUE. See Remarks. c ------------------------------------------------------------- -c +c c WORKD Double precision work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The user should not use WORKD +c for reverse communication. The user should not use WORKD c as temporary workspace during the iteration. Upon termination c WORKD(1:N) contains B*RESID(1:N). If the Ritz vectors are desired c subroutine dseupd uses this output. -c See Data Distribution Note below. +c See Data Distribution Note below. c c WORKL Double precision work array of length LWORKL. (OUTPUT/WORKSPACE) c Private (replicated) array on each PE or array allocated on @@ -247,13 +247,13 @@ c Error flag on output. c = 0: Normal exit. c = 1: Maximum number of iterations taken. -c All possible eigenvalues of OP has been found. IPARAM(5) +c All possible eigenvalues of OP has been found. IPARAM(5) c returns the number of wanted converged Ritz values. c = 2: No longer an informational error. Deprecated starting c with release 2 of ARPACK. -c = 3: No shifts could be applied during a cycle of the -c Implicitly restarted Arnoldi iteration. One possibility -c is to increase the size of NCV relative to NEV. +c = 3: No shifts could be applied during a cycle of the +c Implicitly restarted Arnoldi iteration. One possibility +c is to increase the size of NCV relative to NEV. c See remark 4 below. c = -1: N must be positive. c = -2: NEV must be positive. @@ -267,9 +267,9 @@ c Informatinal error from LAPACK routine dsteqr . c = -9: Starting vector is zero. c = -10: IPARAM(7) must be 1,2,3,4,5. -c = -11: IPARAM(7) = 1 and BMAT = 'G' are incompatable. +c = -11: IPARAM(7) = 1 and BMAT = 'G' are incompatible. c = -12: IPARAM(1) must be equal to 0 or 1. -c = -13: NEV and WHICH = 'BE' are incompatable. +c = -13: NEV and WHICH = 'BE' are incompatible. c = -9999: Could not build an Arnoldi factorization. c IPARAM(5) returns the size of the current Arnoldi c factorization. The user is advised to check that @@ -277,12 +277,12 @@ c c c\Remarks -c 1. The converged Ritz values are always returned in ascending +c 1. The converged Ritz values are always returned in ascending c algebraic order. The computed Ritz values are approximate c eigenvalues of OP. The selection of WHICH should be made -c with this in mind when Mode = 3,4,5. After convergence, -c approximate eigenvalues of the original problem may be obtained -c with the ARPACK subroutine dseupd . +c with this in mind when Mode = 3,4,5. After convergence, +c approximate eigenvalues of the original problem may be obtained +c with the ARPACK subroutine dseupd . c c 2. If the Ritz vectors corresponding to the converged Ritz values c are needed, the user must call dseupd immediately following completion @@ -290,38 +290,38 @@ c c 3. If M can be factored into a Cholesky factorization M = LL` c then Mode = 2 should not be selected. Instead one should use -c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular +c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular c linear systems should be solved with L and L` rather c than computing inverses. After convergence, an approximate c eigenvector z of the original problem is recovered by solving c L`z = x where x is a Ritz vector of OP. c c 4. At present there is no a-priori analysis to guide the selection -c of NCV relative to NEV. The only formal requrement is that NCV > NEV. +c of NCV relative to NEV. The only formal requirement is that NCV > NEV. c However, it is recommended that NCV .ge. 2*NEV. If many problems of c the same type are to be solved, one should experiment with increasing -c NCV while keeping NEV fixed for a given test problem. This will +c NCV while keeping NEV fixed for a given test problem. This will c usually decrease the required number of OP*x operations but it c also increases the work and storage required to maintain the orthogonal c basis vectors. The optimal "cross-over" with respect to CPU time c is problem dependent and must be determined empirically. c -c 5. If IPARAM(7) = 2 then in the Reverse commuication interface the user +c 5. If IPARAM(7) = 2 then in the Reverse communication interface the user c must do the following. When IDO = 1, Y = OP * X is to be computed. c When IPARAM(7) = 2 OP = inv(B)*A. After computing A*X the user c must overwrite X with A*X. Y is then the solution to the linear set c of equations B*Y = A*X. c -c 6. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the -c NP = IPARAM(8) shifts in locations: -c 1 WORKL(IPNTR(11)) -c 2 WORKL(IPNTR(11)+1) -c . -c . -c . -c NP WORKL(IPNTR(11)+NP-1). +c 6. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the +c NP = IPARAM(8) shifts in locations: +c 1 WORKL(IPNTR(11)) +c 2 WORKL(IPNTR(11)+1) +c . +c . +c . +c NP WORKL(IPNTR(11)+NP-1). c -c The eigenvalues of the current tridiagonal matrix are located in +c The eigenvalues of the current tridiagonal matrix are located in c WORKL(IPNTR(6)) through WORKL(IPNTR(6)+NCV-1). They are in the c order defined by WHICH. The associated Ritz estimates are located in c WORKL(IPNTR(8)), WORKL(IPNTR(8)+1), ... , WORKL(IPNTR(8)+NCV-1). @@ -347,7 +347,7 @@ c REAL RESID(N), V(LDV,NCV), WORKD(N,3), WORKL(LWORKL) c SHARED RESID(BLOCK), V(BLOCK,:), WORKD(BLOCK,:) c REPLICATED WORKL(LWORKL) -c +c c c\BeginLib c @@ -355,7 +355,7 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett, "The Symmetric Eigenvalue Problem". Prentice-Hall, @@ -365,8 +365,8 @@ c 5. B. Nour-Omid, B.N. Parlett, T. Ericson, P.S. Jensen, "How to c Implement the Spectral Transformation", Math. Comp., 48 (1987), c pp 663-673. -c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos -c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", +c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos +c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", c SIAM J. Matr. Anal. Apps., January (1993). c 7. L. Reichel, W.B. Gragg, "Algorithm 686: FORTRAN Subroutines c for Updating the QR decomposition", ACM TOMS, December 1990, @@ -380,7 +380,7 @@ c dstats ARPACK routine that initialize timing and other statistics c variables. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c dvout ARPACK utility routine that prints vectors. c dlamch LAPACK routine that determines machine constants. c @@ -389,14 +389,14 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: -c 12/15/93: Version ' 2.4' +c 12/15/93: Version ' 2.4' c -c\SCCS Information: @(#) -c FILE: saupd.F SID: 2.8 DATE OF SID: 04/10/01 RELEASE: 2 +c\SCCS Information: @(#) +c FILE: saupd.F SID: 2.8 DATE OF SID: 04/10/01 RELEASE: 2 c c\Remarks c 1. None @@ -405,16 +405,16 @@ c c----------------------------------------------------------------------- c - subroutine dsaupd - & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, + subroutine dsaupd + & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, & ipntr, workd, workl, lworkl, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -422,7 +422,7 @@ subroutine dsaupd c character bmat*1, which*2 integer ido, info, ldv, lworkl, n, ncv, nev - Double precision + Double precision & tol c c %-----------------% @@ -430,14 +430,14 @@ subroutine dsaupd c %-----------------% c integer iparam(11), ipntr(11) - Double precision + Double precision & resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) c c %------------% c | Parameters | c %------------% c - Double precision + Double precision & one, zero parameter (one = 1.0D+0 , zero = 0.0D+0 ) c @@ -445,7 +445,7 @@ subroutine dsaupd c | Local Scalars | c %---------------% c - integer bounds, ierr, ih, iq, ishift, iupd, iw, + integer bounds, ierr, ih, iq, ishift, iupd, iw, & ldh, ldq, msglvl, mxiter, mode, nb, & nev0, next, np, ritz, j save bounds, ierr, ih, iq, ishift, iupd, iw, @@ -456,20 +456,20 @@ subroutine dsaupd c | External Subroutines | c %----------------------% c - external dsaup2 , dvout , ivout, second, dstats + external dsaup2 , dvout , ivout, arscnd, dstats c c %--------------------% c | External Functions | c %--------------------% c - Double precision - & dlamch - external dlamch + Double precision + & dlamch + external dlamch c c %-----------------------% c | Executable Statements | c %-----------------------% -c +c if (ido .eq. 0) then c c %-------------------------------% @@ -477,8 +477,8 @@ subroutine dsaupd c | & message level for debugging | c %-------------------------------% c - call dstats - call second (t0) + call dstats + call arscnd (t0) msglvl = msaupd c ierr = 0 @@ -512,7 +512,7 @@ subroutine dsaupd c %----------------------------------------------% c np = ncv - nev -c +c if (mxiter .le. 0) ierr = -4 if (which .ne. 'LM' .and. & which .ne. 'SM' .and. @@ -531,7 +531,7 @@ subroutine dsaupd else if (nev .eq. 1 .and. which .eq. 'BE') then ierr = -13 end if -c +c c %------------% c | Error Exit | c %------------% @@ -541,7 +541,7 @@ subroutine dsaupd ido = 99 go to 9000 end if -c +c c %------------------------% c | Set default parameters | c %------------------------% @@ -557,8 +557,8 @@ subroutine dsaupd c %----------------------------------------------% c np = ncv - nev - nev0 = nev -c + nev0 = nev +c c %-----------------------------% c | Zero out internal workspace | c %-----------------------------% @@ -566,7 +566,7 @@ subroutine dsaupd do 10 j = 1, ncv**2 + 8*ncv workl(j) = zero 10 continue -c +c c %-------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, BOUNDS, Q | c | etc... and the remaining workspace. | @@ -599,7 +599,7 @@ subroutine dsaupd c | Carry out the Implicitly restarted Lanczos Iteration. | c %-------------------------------------------------------% c - call dsaup2 + call dsaup2 & ( ido, bmat, n, which, nev0, np, tol, resid, mode, iupd, & ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritz), & workl(bounds), workl(iq), ldq, workl(iw), ipntr, workd, @@ -612,7 +612,7 @@ subroutine dsaupd c if (ido .eq. 3) iparam(8) = np if (ido .ne. 99) go to 9000 -c +c iparam(3) = mxiter iparam(5) = np iparam(9) = nopx @@ -628,19 +628,19 @@ subroutine dsaupd if (info .eq. 2) info = 3 c if (msglvl .gt. 0) then - call ivout (logfil, 1, mxiter, ndigit, + call ivout (logfil, 1, [mxiter], ndigit, & '_saupd: number of update iterations taken') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_saupd: number of "converged" Ritz values') - call dvout (logfil, np, workl(Ritz), ndigit, + call dvout (logfil, np, workl(Ritz), ndigit, & '_saupd: final Ritz values') - call dvout (logfil, np, workl(Bounds), ndigit, + call dvout (logfil, np, workl(Bounds), ndigit, & '_saupd: corresponding error bounds') - end if + end if c - call second (t1) + call arscnd (t1) tsaupd = t1 - t0 -c +c if (msglvl .gt. 0) then c c %--------------------------------------------------------% @@ -678,9 +678,9 @@ subroutine dsaupd & 5x, 'Total time in applying the shifts = ', f12.6,/ & 5x, 'Total time in convergence testing = ', f12.6) end if -c +c 9000 continue -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/dsconv.f b/Toolbox/arpack-src/dsconv.f index 888a1dab8..82dbb6e61 100644 --- a/Toolbox/arpack-src/dsconv.f +++ b/Toolbox/arpack-src/dsconv.f @@ -3,7 +3,7 @@ c c\Name: dsconv c -c\Description: +c\Description: c Convergence testing for the symmetric Arnoldi eigenvalue routine. c c\Usage: @@ -34,23 +34,23 @@ c\BeginLib c c\Routines called: -c second ARPACK utility routine for timing. -c dlamch LAPACK routine that determines machine constants. +c arscnd ARPACK utility routine for timing. +c dlamch LAPACK routine that determines machine constants. c c\Author c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas +c Richard Lehoucq CRPC / Rice University +c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sconv.F SID: 2.4 DATE OF SID: 4/19/96 RELEASE: 2 c c\Remarks c 1. Starting with version 2.4, this routine no longer uses the -c Parlett strategy using the gap conditions. +c Parlett strategy using the gap conditions. c c\EndLib c @@ -62,8 +62,8 @@ subroutine dsconv (n, ritz, bounds, tol, nconv) c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -106,9 +106,9 @@ subroutine dsconv (n, ritz, bounds, tol, nconv) c | Executable Statements | c %-----------------------% c - call second (t0) + call arscnd (t0) c - eps23 = dlamch('Epsilon-Machine') + eps23 = dlamch('Epsilon-Machine') eps23 = eps23**(2.0D+0 / 3.0D+0) c nconv = 0 @@ -125,10 +125,10 @@ subroutine dsconv (n, ritz, bounds, tol, nconv) end if c 10 continue -c - call second (t1) +c + call arscnd (t1) tsconv = tsconv + (t1 - t0) -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/dseigt.f b/Toolbox/arpack-src/dseigt.f index fa031b090..5e20c805b 100644 --- a/Toolbox/arpack-src/dseigt.f +++ b/Toolbox/arpack-src/dseigt.f @@ -3,7 +3,7 @@ c c\Name: dseigt c -c\Description: +c\Description: c Compute the eigenvalues of the current symmetric tridiagonal matrix c and the corresponding error bounds given the current residual norm. c @@ -20,16 +20,16 @@ c Size of the symmetric tridiagonal matrix H. c c H Double precision N by 2 array. (INPUT) -c H contains the symmetric tridiagonal matrix with the -c subdiagonal in the first column starting at H(2,1) and the +c H contains the symmetric tridiagonal matrix with the +c subdiagonal in the first column starting at H(2,1) and the c main diagonal in second column. c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c EIG Double precision array of length N. (OUTPUT) -c On output, EIG contains the N eigenvalues of H possibly +c On output, EIG contains the N eigenvalues of H possibly c unsorted. The BOUNDS arrays are returned in the c same sorted order as EIG. c @@ -59,22 +59,22 @@ c dstqrb ARPACK routine that computes the eigenvalues and the c last components of the eigenvectors of a symmetric c and tridiagonal matrix. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c dvout ARPACK utility routine that prints vectors. c dcopy Level 1 BLAS that copies one vector to another. c c\Author c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas +c Richard Lehoucq CRPC / Rice University +c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.4' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: seigt.F SID: 2.4 DATE OF SID: 8/27/96 RELEASE: 2 c c\Remarks @@ -84,15 +84,15 @@ c c----------------------------------------------------------------------- c - subroutine dseigt + subroutine dseigt & ( rnorm, n, h, ldh, eig, bounds, workl, ierr ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -127,7 +127,7 @@ subroutine dseigt c | External Subroutines | c %----------------------% c - external dcopy, dstqrb, dvout, second + external dcopy, dstqrb, dvout, arscnd c c %-----------------------% c | Executable Statements | @@ -136,9 +136,9 @@ subroutine dseigt c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | -c %-------------------------------% +c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mseigt c if (msglvl .gt. 0) then @@ -167,8 +167,8 @@ subroutine dseigt do 30 k = 1, n bounds(k) = rnorm*abs(bounds(k)) 30 continue -c - call second (t1) +c + call arscnd (t1) tseigt = tseigt + (t1 - t0) c 9000 continue diff --git a/Toolbox/arpack-src/dsesrt.f b/Toolbox/arpack-src/dsesrt.f index 2b4ca8cbc..833fba4e6 100644 --- a/Toolbox/arpack-src/dsesrt.f +++ b/Toolbox/arpack-src/dsesrt.f @@ -4,7 +4,7 @@ c\Name: dsesrt c c\Description: -c Sort the array X in the order specified by WHICH and optionally +c Sort the array X in the order specified by WHICH and optionally c apply the permutation to the columns of the matrix A. c c\Usage: @@ -32,7 +32,7 @@ c Number of rows of the matrix A. c c A Double precision array of length NA by N. (INPUT/OUTPUT) -c +c c LDA Integer. (INPUT) c Leading dimension of A. c @@ -47,18 +47,18 @@ c c\Authors c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas +c Richard Lehoucq CRPC / Rice University +c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c 12/15/93: Version ' 2.1'. -c Adapted from the sort routine in LANSO and +c Adapted from the sort routine in LANSO and c the ARPACK code dsortr c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sesrt.F SID: 2.3 DATE OF SID: 4/19/96 RELEASE: 2 c c\EndLib @@ -101,7 +101,7 @@ subroutine dsesrt (which, apply, n, x, na, a, lda) c %-----------------------% c igap = n / 2 -c +c if (which .eq. 'SA') then c c X is sorted into decreasing order of algebraic. @@ -165,7 +165,7 @@ subroutine dsesrt (which, apply, n, x, na, a, lda) 80 continue c if (j.lt.0) go to 90 -c +c if (x(j).gt.x(j+igap)) then temp = x(j) x(j) = x(j+igap) @@ -179,7 +179,7 @@ subroutine dsesrt (which, apply, n, x, na, a, lda) 90 continue igap = igap / 2 go to 70 -c +c else if (which .eq. 'LM') then c c X is sorted into increasing order of magnitude. diff --git a/Toolbox/arpack-src/dseupd.f b/Toolbox/arpack-src/dseupd.f index 291ae1f85..ae123a207 100644 --- a/Toolbox/arpack-src/dseupd.f +++ b/Toolbox/arpack-src/dseupd.f @@ -1,8 +1,8 @@ c\BeginDoc c -c\Name: dseupd +c\Name: dseupd c -c\Description: +c\Description: c c This subroutine returns the converged approximations to eigenvalues c of A*z = lambda*B*z and (optionally): @@ -15,22 +15,22 @@ c (3) Both. c c There is negligible additional cost to obtain eigenvectors. An orthonormal -c (Lanczos) basis is always computed. There is an additional storage cost -c of n*nev if both are requested (in this case a separate array Z must be +c (Lanczos) basis is always computed. There is an additional storage cost +c of n*nev if both are requested (in this case a separate array Z must be c supplied). c c These quantities are obtained from the Lanczos factorization computed c by DSAUPD for the linear operator OP prescribed by the MODE selection c (see IPARAM(7) in DSAUPD documentation.) DSAUPD must be called before -c this routine is called. These approximate eigenvalues and vectors are -c commonly called Ritz values and Ritz vectors respectively. They are -c referred to as such in the comments that follow. The computed orthonormal -c basis for the invariant subspace corresponding to these Ritz values is +c this routine is called. These approximate eigenvalues and vectors are +c commonly called Ritz values and Ritz vectors respectively. They are +c referred to as such in the comments that follow. The computed orthonormal +c basis for the invariant subspace corresponding to these Ritz values is c referred to as a Lanczos basis. c -c See documentation in the header of the subroutine DSAUPD for a definition -c of OP as well as other terms and the relation of computed Ritz values -c and vectors of OP with respect to the given problem A*z = lambda*B*z. +c See documentation in the header of the subroutine DSAUPD for a definition +c of OP as well as other terms and the relation of computed Ritz values +c and vectors of OP with respect to the given problem A*z = lambda*B*z. c c The approximate eigenvalues of the original problem are returned in c ascending algebraic order. The user may elect to call this routine @@ -39,19 +39,19 @@ c with a single call. c c\Usage: -c call dseupd +c call dseupd c ( RVEC, HOWMNY, SELECT, D, Z, LDZ, SIGMA, BMAT, N, WHICH, NEV, TOL, c RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, WORKL, LWORKL, INFO ) c -c RVEC LOGICAL (INPUT) -c Specifies whether Ritz vectors corresponding to the Ritz value +c RVEC LOGICAL (INPUT) +c Specifies whether Ritz vectors corresponding to the Ritz value c approximations to the eigenproblem A*z = lambda*B*z are computed. c c RVEC = .FALSE. Compute Ritz values only. c c RVEC = .TRUE. Compute Ritz vectors. c -c HOWMNY Character*1 (INPUT) +c HOWMNY Character*1 (INPUT) c Specifies how many Ritz vectors are wanted and the form of Z c the matrix of Ritz vectors. See remark 1 below. c = 'A': compute NEV Ritz vectors; @@ -61,7 +61,7 @@ c SELECT Logical array of dimension NCV. (INPUT/WORKSPACE) c If HOWMNY = 'S', SELECT specifies the Ritz vectors to be c computed. To select the Ritz vector corresponding to a -c Ritz value D(j), SELECT(j) must be set to .TRUE.. +c Ritz value D(j), SELECT(j) must be set to .TRUE.. c If HOWMNY = 'A' , SELECT is used as a workspace for c reordering the Ritz values. c @@ -70,8 +70,8 @@ c eigenvalues of A*z = lambda*B*z. The values are returned c in ascending order. If IPARAM(7) = 3,4,5 then D represents c the Ritz values of OP computed by dsaupd transformed to -c those of the original eigensystem A*z = lambda*B*z. If -c IPARAM(7) = 1,2 then the Ritz values of OP are the same +c those of the original eigensystem A*z = lambda*B*z. If +c IPARAM(7) = 1,2 then the Ritz values of OP are the same c as the those of A*z = lambda*B*z. c c Z Double precision N by NEV array if HOWMNY = 'A'. (OUTPUT) @@ -79,7 +79,7 @@ c eigensystem A*z = lambda*B*z corresponding to the Ritz c value approximations. c If RVEC = .FALSE. then Z is not referenced. -c NOTE: The array Z may be set equal to first NEV columns of the +c NOTE: The array Z may be set equal to first NEV columns of the c Arnoldi/Lanczos basis array V computed by DSAUPD . c c LDZ Integer. (INPUT) @@ -144,7 +144,7 @@ c = -17: DSEUPD got a different count of the number of converged c Ritz values than DSAUPD got. This indicates the user c probably made an error in passing data from DSAUPD to -c DSEUPD or that the data was modified before entering +c DSEUPD or that the data was modified before entering c DSEUPD . c c\BeginLib @@ -153,7 +153,7 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett, "The Symmetric Eigenvalue Problem". Prentice-Hall, @@ -163,19 +163,19 @@ c 5. B. Nour-Omid, B.N. Parlett, T. Ericson, P.S. Jensen, "How to c Implement the Spectral Transformation", Math. Comp., 48 (1987), c pp 663-673. -c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos -c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", +c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos +c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", c SIAM J. Matr. Anal. Apps., January (1993). c 7. L. Reichel, W.B. Gragg, "Algorithm 686: FORTRAN Subroutines c for Updating the QR decomposition", ACM TOMS, December 1990, c Volume 16 Number 4, pp 369-377. c c\Remarks -c 1. The converged Ritz values are always returned in increasing +c 1. The converged Ritz values are always returned in increasing c (algebraic) order. c c 2. Currently only HOWMNY = 'A' is implemented. It is included at this -c stage for the user who wants to incorporate it. +c stage for the user who wants to incorporate it. c c\Routines called: c dsesrt ARPACK routine that sorts an array X, and applies the @@ -201,15 +201,15 @@ c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Chao Yang Houston, Texas -c Dept. of Computational & +c Dept. of Computational & c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: c 12/15/93: Version ' 2.1' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: seupd.F SID: 2.11 DATE OF SID: 04/10/01 RELEASE: 2 c c\EndLib @@ -226,8 +226,8 @@ subroutine dseupd (rvec , howmny, select, d , c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -236,7 +236,7 @@ subroutine dseupd (rvec , howmny, select, d , character bmat, howmny, which*2 logical rvec integer info, ldz, ldv, lworkl, n, ncv, nev - Double precision + Double precision & sigma, tol c c %-----------------% @@ -245,7 +245,7 @@ subroutine dseupd (rvec , howmny, select, d , c integer iparam(7), ipntr(11) logical select(ncv) - Double precision + Double precision & d(nev) , resid(n) , v(ldv,ncv), & z(ldz, nev), workd(2*n), workl(lworkl) c @@ -253,7 +253,7 @@ subroutine dseupd (rvec , howmny, select, d , c | Parameters | c %------------% c - Double precision + Double precision & one, zero parameter (one = 1.0D+0 , zero = 0.0D+0 ) c @@ -267,7 +267,7 @@ subroutine dseupd (rvec , howmny, select, d , & ldq , mode , msglvl, nconv , next , & ritz , irz , ibd , np , ishift, & leftptr, rghtptr, numcnv, jj - Double precision + Double precision & bnorm2 , rnorm, temp, temp1, eps23 logical reord c @@ -275,16 +275,16 @@ subroutine dseupd (rvec , howmny, select, d , c | External Subroutines | c %----------------------% c - external dcopy , dger , dgeqr2 , dlacpy , dorm2r , dscal , - & dsesrt , dsteqr , dswap , dvout , ivout , dsortr + external dcopy , dger , dgeqr2 , dlacpy , dorm2r , dscal , + & dsesrt , dsteqr , dswap , dvout , ivout , dsortr c c %--------------------% c | External Functions | c %--------------------% c - Double precision - & dnrm2 , dlamch - external dnrm2 , dlamch + Double precision + & dnrm2 , dlamch + external dnrm2 , dlamch c c %---------------------% c | Intrinsic Functions | @@ -295,7 +295,7 @@ subroutine dseupd (rvec , howmny, select, d , c %-----------------------% c | Executable Statements | c %-----------------------% -c +c c %------------------------% c | Set default parameters | c %------------------------% @@ -312,7 +312,7 @@ subroutine dseupd (rvec , howmny, select, d , if (nconv .eq. 0) go to 9000 ierr = 0 c - if (nconv .le. 0) ierr = -14 + if (nconv .le. 0) ierr = -14 if (n .le. 0) ierr = -1 if (nev .le. 0) ierr = -2 if (ncv .le. nev .or. ncv .gt. n) ierr = -3 @@ -324,12 +324,12 @@ subroutine dseupd (rvec , howmny, select, d , if (bmat .ne. 'I' .and. bmat .ne. 'G') ierr = -6 if ( (howmny .ne. 'A' .and. & howmny .ne. 'P' .and. - & howmny .ne. 'S') .and. rvec ) + & howmny .ne. 'S') .and. rvec ) & ierr = -15 if (rvec .and. howmny .eq. 'S') ierr = -16 c if (rvec .and. lworkl .lt. ncv**2+8*ncv) ierr = -7 -c +c if (mode .eq. 1 .or. mode .eq. 2) then type = 'REGULR' else if (mode .eq. 3 ) then @@ -338,7 +338,7 @@ subroutine dseupd (rvec , howmny, select, d , type = 'BUCKLE' else if (mode .eq. 5 ) then type = 'CAYLEY' - else + else ierr = -10 end if if (mode .eq. 1 .and. bmat .eq. 'G') ierr = -11 @@ -352,7 +352,7 @@ subroutine dseupd (rvec , howmny, select, d , info = ierr go to 9000 end if -c +c c %-------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, BOUNDS, Q | c | etc... and the remaining workspace. | @@ -427,7 +427,7 @@ subroutine dseupd (rvec , howmny, select, d , c | Set machine dependent constant. | c %---------------------------------% c - eps23 = dlamch ('Epsilon-Machine') + eps23 = dlamch ('Epsilon-Machine') eps23 = eps23**(2.0D+0 / 3.0D+0 ) c c %---------------------------------------% @@ -501,7 +501,7 @@ subroutine dseupd (rvec , howmny, select, d , & workl(ibd+jj-1) .le. tol*temp1) then select(jj) = .true. numcnv = numcnv + 1 - if (jj .gt. nev) reord = .true. + if (jj .gt. nconv) reord = .true. endif 11 continue c @@ -513,9 +513,9 @@ subroutine dseupd (rvec , howmny, select, d , c %-----------------------------------------------------------% c if (msglvl .gt. 2) then - call ivout(logfil, 1, numcnv, ndigit, + call ivout(logfil, 1, [numcnv], ndigit, & '_seupd: Number of specified eigenvalues') - call ivout(logfil, 1, nconv, ndigit, + call ivout(logfil, 1, [nconv], ndigit, & '_seupd: Number of "converged" eigenvalues') end if c @@ -609,9 +609,9 @@ subroutine dseupd (rvec , howmny, select, d , c if (leftptr .lt. rghtptr) go to 20 c - 30 end if + end if c - if (msglvl .gt. 2) then + 30 if (msglvl .gt. 2) then call dvout (logfil, ncv, workl(ihd), ndigit, & '_seupd: The eigenvalues of H--reordered') end if @@ -652,8 +652,8 @@ subroutine dseupd (rvec , howmny, select, d , call dcopy (ncv, workl(bounds), 1, workl(ihb), 1) end if c - else -c + else +c c %-------------------------------------------------------------% c | * Make a copy of all the Ritz values. | c | * Transform the Ritz values back to the original system. | @@ -670,13 +670,13 @@ subroutine dseupd (rvec , howmny, select, d , c %-------------------------------------------------------------% c call dcopy (ncv, workl(ihd), 1, workl(iw), 1) - if (type .eq. 'SHIFTI') then + if (type .eq. 'SHIFTI') then do 40 k=1, ncv workl(ihd+k-1) = one / workl(ihd+k-1) + sigma 40 continue else if (type .eq. 'BUCKLE') then do 50 k=1, ncv - workl(ihd+k-1) = sigma * workl(ihd+k-1) / + workl(ihd+k-1) = sigma * workl(ihd+k-1) / & (workl(ihd+k-1) - one) 50 continue else if (type .eq. 'CAYLEY') then @@ -685,7 +685,7 @@ subroutine dseupd (rvec , howmny, select, d , & (workl(ihd+k-1) - one) 60 continue end if -c +c c %-------------------------------------------------------------% c | * Store the wanted NCONV lambda values into D. | c | * Sort the NCONV wanted lambda in WORKL(IHD:IHD+NCONV-1) | @@ -711,8 +711,8 @@ subroutine dseupd (rvec , howmny, select, d , call dsortr ('LA', .true., nconv, d, workl(ihb)) end if c - end if -c + end if +c c %------------------------------------------------% c | Compute the Ritz vectors. Transform the wanted | c | eigenvectors of the symmetric tridiagonal H by | @@ -720,25 +720,25 @@ subroutine dseupd (rvec , howmny, select, d , c %------------------------------------------------% c if (rvec .and. howmny .eq. 'A') then -c +c c %----------------------------------------------------------% c | Compute the QR factorization of the matrix representing | c | the wanted invariant subspace located in the first NCONV | c | columns of workl(iq,ldq). | c %----------------------------------------------------------% -c +c call dgeqr2 (ncv, nconv , workl(iq) , & ldq, workl(iw+ncv), workl(ihb), & ierr) c c %--------------------------------------------------------% -c | * Postmultiply V by Q. | +c | * Postmultiply V by Q. | c | * Copy the first NCONV columns of VQ into Z. | c | The N by NCONV matrix Z is now a matrix representation | c | of the approximate invariant subspace associated with | c | the Ritz values in workl(ihd). | c %--------------------------------------------------------% -c +c call dorm2r ('Right', 'Notranspose', n , & ncv , nconv , workl(iq), & ldq , workl(iw+ncv), v , @@ -752,7 +752,7 @@ subroutine dseupd (rvec , howmny, select, d , c %-----------------------------------------------------% c do 65 j = 1, ncv-1 - workl(ihb+j-1) = zero + workl(ihb+j-1) = zero 65 continue workl(ihb+ncv-1) = one call dorm2r ('Left', 'Transpose' , ncv , @@ -760,6 +760,16 @@ subroutine dseupd (rvec , howmny, select, d , & ldq , workl(iw+ncv), workl(ihb), & ncv , temp , ierr) c +c %-----------------------------------------------------% +c | Make a copy of the last row into | +c | workl(iw+ncv:iw+2*ncv), as it is needed again in | +c | the Ritz vector purification step below | +c %-----------------------------------------------------% +c + do 67 j = 1, nconv + workl(iw+ncv+j-1) = workl(ihb+j-1) + 67 continue + else if (rvec .and. howmny .eq. 'S') then c c Not yet implemented. See remark 2 above. @@ -784,10 +794,10 @@ subroutine dseupd (rvec , howmny, select, d , c %-------------------------------------------------% c call dscal (ncv, bnorm2, workl(ihb), 1) - if (type .eq. 'SHIFTI') then + if (type .eq. 'SHIFTI') then c do 80 k=1, ncv - workl(ihb+k-1) = abs( workl(ihb+k-1) ) + workl(ihb+k-1) = abs( workl(ihb+k-1) ) & / workl(iw+k-1)**2 80 continue c @@ -812,15 +822,15 @@ subroutine dseupd (rvec , howmny, select, d , if (type .ne. 'REGULR' .and. msglvl .gt. 1) then call dvout (logfil, nconv, d, ndigit, & '_seupd: Untransformed converged Ritz values') - call dvout (logfil, nconv, workl(ihb), ndigit, + call dvout (logfil, nconv, workl(ihb), ndigit, & '_seupd: Ritz estimates of the untransformed Ritz values') else if (msglvl .gt. 1) then call dvout (logfil, nconv, d, ndigit, & '_seupd: Converged Ritz values') - call dvout (logfil, nconv, workl(ihb), ndigit, + call dvout (logfil, nconv, workl(ihb), ndigit, & '_seupd: Associated Ritz estimates') end if -c +c c %-------------------------------------------------% c | Ritz vector purification step. Formally perform | c | one of inverse subspace iteration. Only used | @@ -830,20 +840,20 @@ subroutine dseupd (rvec , howmny, select, d , if (rvec .and. (type .eq. 'SHIFTI' .or. type .eq. 'CAYLEY')) then c do 110 k=0, nconv-1 - workl(iw+k) = workl(iq+k*ldq+ncv-1) + workl(iw+k) = workl(iw+ncv+k) & / workl(iw+k) 110 continue c else if (rvec .and. type .eq. 'BUCKLE') then c do 120 k=0, nconv-1 - workl(iw+k) = workl(iq+k*ldq+ncv-1) + workl(iw+k) = workl(iw+ncv+k) & / (workl(iw+k)-one) 120 continue c - end if + end if c - if (type .ne. 'REGULR') + if (rvec .and. type .ne. 'REGULR') & call dger (n, nconv, one, resid, 1, workl(iw), 1, z, ldz) c 9000 continue diff --git a/Toolbox/arpack-src/dsgets.f b/Toolbox/arpack-src/dsgets.f index b51143d01..436a4fe84 100644 --- a/Toolbox/arpack-src/dsgets.f +++ b/Toolbox/arpack-src/dsgets.f @@ -3,13 +3,13 @@ c c\Name: dsgets c -c\Description: +c\Description: c Given the eigenvalues of the symmetric tridiagonal matrix H, -c computes the NP shifts AMU that are zeros of the polynomial of -c degree NP which filters out components of the unwanted eigenvectors +c computes the NP shifts AMU that are zeros of the polynomial of +c degree NP which filters out components of the unwanted eigenvectors c corresponding to the AMU's based on some given criteria. c -c NOTE: This is called even in the case of user specified shifts in +c NOTE: This is called even in the case of user specified shifts in c order to sort the eigenvalues, and error bounds of H for later use. c c\Usage: @@ -39,8 +39,8 @@ c c RITZ Double precision array of length KEV+NP. (INPUT/OUTPUT) c On INPUT, RITZ contains the eigenvalues of H. -c On OUTPUT, RITZ are sorted so that the unwanted eigenvalues -c are in the first NP locations and the wanted part is in +c On OUTPUT, RITZ are sorted so that the unwanted eigenvalues +c are in the first NP locations and the wanted part is in c the last KEV locations. When exact shifts are selected, the c unwanted part corresponds to the shifts to be applied. c @@ -49,7 +49,7 @@ c c SHIFTS Double precision array of length NP. (INPUT/OUTPUT) c On INPUT: contains the user specified shifts if ISHIFT = 0. -c On OUTPUT: contains the shifts sorted into decreasing order +c On OUTPUT: contains the shifts sorted into decreasing order c of magnitude with respect to the Ritz estimates contained in c BOUNDS. If ISHIFT = 0, SHIFTS is not modified on exit. c @@ -65,7 +65,7 @@ c\Routines called: c dsortr ARPACK utility sorting routine. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c dvout ARPACK utility routine that prints vectors. c dcopy Level 1 BLAS that copies one vector to another. c dswap Level 1 BLAS that swaps the contents of two vectors. @@ -75,13 +75,13 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/93: Version ' 2.1' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sgets.F SID: 2.4 DATE OF SID: 4/19/96 RELEASE: 2 c c\Remarks @@ -96,8 +96,8 @@ subroutine dsgets ( ishift, which, kev, np, ritz, bounds, shifts ) c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -131,7 +131,7 @@ subroutine dsgets ( ishift, which, kev, np, ritz, bounds, shifts ) c | External Subroutines | c %----------------------% c - external dswap, dcopy, dsortr, second + external dswap, dcopy, dsortr, arscnd c c %---------------------% c | Intrinsic Functions | @@ -142,15 +142,15 @@ subroutine dsgets ( ishift, which, kev, np, ritz, bounds, shifts ) c %-----------------------% c | Executable Statements | c %-----------------------% -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = msgets -c +c if (which .eq. 'BE') then c c %-----------------------------------------------------% @@ -163,11 +163,11 @@ subroutine dsgets ( ishift, which, kev, np, ritz, bounds, shifts ) c %-----------------------------------------------------% c call dsortr ('LA', .true., kev+np, ritz, bounds) - kevd2 = kev / 2 + kevd2 = kev / 2 if ( kev .gt. 1 ) then - call dswap ( min(kevd2,np), ritz, 1, + call dswap ( min(kevd2,np), ritz, 1, & ritz( max(kevd2,np)+1 ), 1) - call dswap ( min(kevd2,np), bounds, 1, + call dswap ( min(kevd2,np), bounds, 1, & bounds( max(kevd2,np)+1 ), 1) end if c @@ -185,7 +185,7 @@ subroutine dsgets ( ishift, which, kev, np, ritz, bounds, shifts ) end if c if (ishift .eq. 1 .and. np .gt. 0) then -c +c c %-------------------------------------------------------% c | Sort the unwanted Ritz values used as shifts so that | c | the ones with largest Ritz estimates are first. | @@ -193,23 +193,23 @@ subroutine dsgets ( ishift, which, kev, np, ritz, bounds, shifts ) c | forward instability of the iteration when the shifts | c | are applied in subroutine dsapps. | c %-------------------------------------------------------% -c +c call dsortr ('SM', .true., np, bounds, ritz) call dcopy (np, ritz, 1, shifts, 1) end if -c - call second (t1) +c + call arscnd (t1) tsgets = tsgets + (t1 - t0) c if (msglvl .gt. 0) then - call ivout (logfil, 1, kev, ndigit, '_sgets: KEV is') - call ivout (logfil, 1, np, ndigit, '_sgets: NP is') + call ivout (logfil, 1, [kev], ndigit, '_sgets: KEV is') + call ivout (logfil, 1, [np], ndigit, '_sgets: NP is') call dvout (logfil, kev+np, ritz, ndigit, & '_sgets: Eigenvalues of current H matrix') - call dvout (logfil, kev+np, bounds, ndigit, + call dvout (logfil, kev+np, bounds, ndigit, & '_sgets: Associated Ritz estimates') end if -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/dsortc.f b/Toolbox/arpack-src/dsortc.f index 91af30f8a..42baae2ba 100644 --- a/Toolbox/arpack-src/dsortc.f +++ b/Toolbox/arpack-src/dsortc.f @@ -4,7 +4,7 @@ c\Name: dsortc c c\Description: -c Sorts the complex array in XREAL and XIMAG into the order +c Sorts the complex array in XREAL and XIMAG into the order c specified by WHICH and optionally applies the permutation to the c real array Y. It is assumed that if an element of XIMAG is c nonzero, then its negative is also an element. In other words, @@ -49,14 +49,14 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.1' c Adapted from the sort routine in LANSO. c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sortc.F SID: 2.3 DATE OF SID: 4/20/96 RELEASE: 2 c c\EndLib @@ -77,7 +77,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) c | Array Arguments | c %-----------------% c - Double precision + Double precision & xreal(0:n-1), ximag(0:n-1), y(0:n-1) c c %---------------% @@ -85,14 +85,14 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) c %---------------% c integer i, igap, j - Double precision + Double precision & temp, temp1, temp2 c c %--------------------% c | External Functions | c %--------------------% c - Double precision + Double precision & dlapy2 external dlapy2 c @@ -101,7 +101,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) c %-----------------------% c igap = n / 2 -c +c if (which .eq. 'LM') then c c %------------------------------------------------------% @@ -169,7 +169,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) temp = ximag(j) ximag(j) = ximag(j+igap) ximag(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -183,7 +183,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) 60 continue igap = igap / 2 go to 40 -c +c else if (which .eq. 'LR') then c c %------------------------------------------------% @@ -207,7 +207,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) temp = ximag(j) ximag(j) = ximag(j+igap) ximag(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -221,7 +221,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) 90 continue igap = igap / 2 go to 70 -c +c else if (which .eq. 'SR') then c c %------------------------------------------------% @@ -244,7 +244,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) temp = ximag(j) ximag(j) = ximag(j+igap) ximag(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -258,7 +258,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) 120 continue igap = igap / 2 go to 100 -c +c else if (which .eq. 'LI') then c c %------------------------------------------------% @@ -281,7 +281,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) temp = ximag(j) ximag(j) = ximag(j+igap) ximag(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -295,7 +295,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) 150 continue igap = igap / 2 go to 130 -c +c else if (which .eq. 'SI') then c c %------------------------------------------------% @@ -318,7 +318,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) temp = ximag(j) ximag(j) = ximag(j+igap) ximag(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -333,7 +333,7 @@ subroutine dsortc (which, apply, n, xreal, ximag, y) igap = igap / 2 go to 160 end if -c +c 9000 continue return c diff --git a/Toolbox/arpack-src/dsortr.f b/Toolbox/arpack-src/dsortr.f index 3903b81c5..b44f916cf 100644 --- a/Toolbox/arpack-src/dsortr.f +++ b/Toolbox/arpack-src/dsortr.f @@ -4,7 +4,7 @@ c\Name: dsortr c c\Description: -c Sort the array X1 in the order specified by WHICH and optionally +c Sort the array X1 in the order specified by WHICH and optionally c applies the permutation to the array X2. c c\Usage: @@ -39,17 +39,17 @@ c c\Author c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas +c Richard Lehoucq CRPC / Rice University +c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c 12/16/93: Version ' 2.1'. c Adapted from the sort routine in LANSO. c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sortr.F SID: 2.3 DATE OF SID: 4/19/96 RELEASE: 2 c c\EndLib @@ -86,7 +86,7 @@ subroutine dsortr (which, apply, n, x1, x2) c %-----------------------% c igap = n / 2 -c +c if (which .eq. 'SA') then c c X1 is sorted into decreasing order of algebraic. @@ -158,7 +158,7 @@ subroutine dsortr (which, apply, n, x1, x2) 80 continue c if (j.lt.0) go to 90 -c +c if (x1(j).gt.x1(j+igap)) then temp = x1(j) x1(j) = x1(j+igap) @@ -176,7 +176,7 @@ subroutine dsortr (which, apply, n, x1, x2) 90 continue igap = igap / 2 go to 70 -c +c else if (which .eq. 'LM') then c c X1 is sorted into increasing order of magnitude. diff --git a/Toolbox/arpack-src/dstatn.f b/Toolbox/arpack-src/dstatn.f index 1bf371459..d09d8a371 100644 --- a/Toolbox/arpack-src/dstatn.f +++ b/Toolbox/arpack-src/dstatn.f @@ -9,10 +9,10 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: statn.F SID: 2.4 DATE OF SID: 4/20/96 RELEASE: 2 c subroutine dstatn @@ -21,8 +21,8 @@ subroutine dstatn c | See stat.doc for documentation | c %--------------------------------% c - include 'stat.fi' -c + include 'stat.h' +c c %-----------------------% c | Executable Statements | c %-----------------------% @@ -32,7 +32,7 @@ subroutine dstatn nrorth = 0 nitref = 0 nrstrt = 0 -c +c tnaupd = 0.0D+0 tnaup2 = 0.0D+0 tnaitr = 0.0D+0 @@ -43,14 +43,14 @@ subroutine dstatn titref = 0.0D+0 tgetv0 = 0.0D+0 trvec = 0.0D+0 -c +c c %----------------------------------------------------% c | User time including reverse communication overhead | c %----------------------------------------------------% c tmvopx = 0.0D+0 tmvbx = 0.0D+0 -c +c return c c diff --git a/Toolbox/arpack-src/dstats.f b/Toolbox/arpack-src/dstats.f index f1ad95d99..cb1b3f38d 100644 --- a/Toolbox/arpack-src/dstats.f +++ b/Toolbox/arpack-src/dstats.f @@ -1,18 +1,18 @@ c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: stats.F SID: 2.1 DATE OF SID: 4/19/96 RELEASE: 2 c %---------------------------------------------% c | Initialize statistic and timing information | c | for symmetric Arnoldi code. | c %---------------------------------------------% - + subroutine dstats c %--------------------------------% c | See stat.doc for documentation | c %--------------------------------% - include 'stat.fi' - + include 'stat.h' + c %-----------------------% c | Executable Statements | c %-----------------------% @@ -22,7 +22,7 @@ subroutine dstats nrorth = 0 nitref = 0 nrstrt = 0 - + tsaupd = 0.0D+0 tsaup2 = 0.0D+0 tsaitr = 0.0D+0 @@ -33,13 +33,13 @@ subroutine dstats titref = 0.0D+0 tgetv0 = 0.0D+0 trvec = 0.0D+0 - + c %----------------------------------------------------% c | User time including reverse communication overhead | c %----------------------------------------------------% tmvopx = 0.0D+0 tmvbx = 0.0D+0 - + return c c End of dstats diff --git a/Toolbox/arpack-src/dstqrb.f b/Toolbox/arpack-src/dstqrb.f index 9fef543ba..d55a59a2d 100644 --- a/Toolbox/arpack-src/dstqrb.f +++ b/Toolbox/arpack-src/dstqrb.f @@ -32,13 +32,13 @@ c On exit, E has been destroyed. c c Z Double precision array, dimension (N). (OUTPUT) -c On exit, Z contains the last row of the orthonormal -c eigenvector matrix of the symmetric tridiagonal matrix. +c On exit, Z contains the last row of the orthonormal +c eigenvector matrix of the symmetric tridiagonal matrix. c If an error exit is made, Z contains the last row of the c eigenvector matrix associated with the stored eigenvalues. c c WORK Double precision array, dimension (max(1,2*N-2)). (WORKSPACE) -c Workspace used in accumulating the transformation for +c Workspace used in accumulating the transformation for c computing the last components of the eigenvectors. c c INFO Integer. (OUTPUT) @@ -62,9 +62,9 @@ c dcopy Level 1 BLAS that copies one vector to another. c dswap Level 1 BLAS that swaps the contents of two vectors. c lsame LAPACK character comparison routine. -c dlae2 LAPACK routine that computes the eigenvalues of a 2-by-2 +c dlae2 LAPACK routine that computes the eigenvalues of a 2-by-2 c symmetric matrix. -c dlaev2 LAPACK routine that eigendecomposition of a 2-by-2 symmetric +c dlaev2 LAPACK routine that eigendecomposition of a 2-by-2 symmetric c matrix. c dlamch LAPACK routine that determines machine constants. c dlanst LAPACK routine that computes the norm of a matrix. @@ -72,7 +72,7 @@ c dlartg LAPACK Givens rotation construction routine. c dlascl LAPACK routine for careful scaling of a matrix. c dlaset LAPACK matrix initialization routine. -c dlasr LAPACK routine that applies an orthogonal transformation to +c dlasr LAPACK routine that applies an orthogonal transformation to c a matrix. c dlasrt LAPACK sorting routine. c dsteqr LAPACK routine that computes eigenvalues and eigenvectors @@ -84,19 +84,19 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: stqrb.F SID: 2.5 DATE OF SID: 8/27/96 RELEASE: 2 c c\Remarks c 1. Starting with version 2.5, this routine is a modified version c of LAPACK version 2.0 subroutine SSTEQR. No lines are deleted, -c only commeted out and new lines inserted. +c only commented out and new lines inserted. c All lines commented out have "c$$$" at the beginning. c Note that the LAPACK version 1.0 subroutine SSTEQR contained -c bugs. +c bugs. c c\EndLib c @@ -118,9 +118,9 @@ subroutine dstqrb ( n, d, e, z, work, info ) & d( n ), e( n-1 ), z( n ), work( 2*n-2 ) c c .. parameters .. - Double precision + Double precision & zero, one, two, three - parameter ( zero = 0.0D+0, one = 1.0D+0, + parameter ( zero = 0.0D+0, one = 1.0D+0, & two = 2.0D+0, three = 3.0D+0 ) integer maxit parameter ( maxit = 30 ) @@ -129,7 +129,7 @@ subroutine dstqrb ( n, d, e, z, work, info ) integer i, icompz, ii, iscale, j, jtot, k, l, l1, lend, & lendm1, lendp1, lendsv, lm1, lsv, m, mm, mm1, & nm1, nmaxit - Double precision + Double precision & anorm, b, c, eps, eps2, f, g, p, r, rt1, rt2, & s, safmax, safmin, ssfmax, ssfmin, tst c .. @@ -380,9 +380,9 @@ subroutine dstqrb ( n, d, e, z, work, info ) c c *** New starting with version 2.5 *** c - call dlasr( 'r', 'v', 'b', 1, mm, work( l ), + call dlasr( 'r', 'v', 'b', 1, mm, work( l ), & work( n-1+l ), z( l ), 1 ) -c ************************************* +c ************************************* end if c d( l ) = d( l ) - p @@ -440,7 +440,7 @@ subroutine dstqrb ( n, d, e, z, work, info ) tst = z(l) z(l) = c*tst - s*z(l-1) z(l-1) = s*tst + c*z(l-1) -c ************************************* +c ************************************* else call dlae2( d( l-1 ), e( l-1 ), d( l ), rt1, rt2 ) end if @@ -502,7 +502,7 @@ subroutine dstqrb ( n, d, e, z, work, info ) c call dlasr( 'r', 'v', 'f', 1, mm, work( m ), work( n-1+m ), & z( m ), 1 ) -c ************************************* +c ************************************* end if c d( l ) = d( l ) - p diff --git a/Toolbox/arpack-src/icnteq.f b/Toolbox/arpack-src/icnteq.f deleted file mode 100644 index dc345f9ba..000000000 --- a/Toolbox/arpack-src/icnteq.f +++ /dev/null @@ -1,18 +0,0 @@ -c -c----------------------------------------------------------------------- -c -c Count the number of elements equal to a specified integer value. -c - integer function icnteq (n, array, value) -c - integer n, value - integer array(*) -c - k = 0 - do 10 i = 1, n - if (array(i) .eq. value) k = k + 1 - 10 continue - icnteq = k -c - return - end diff --git a/Toolbox/arpack-src/icopy.f b/Toolbox/arpack-src/icopy.f deleted file mode 100644 index f9e8c1100..000000000 --- a/Toolbox/arpack-src/icopy.f +++ /dev/null @@ -1,77 +0,0 @@ -*-------------------------------------------------------------------- -*\Documentation -* -*\Name: ICOPY -* -*\Description: -* ICOPY copies an integer vector lx to an integer vector ly. -* -*\Usage: -* call icopy ( n, lx, inc, ly, incy ) -* -*\Arguments: -* n integer (input) -* On entry, n is the number of elements of lx to be -c copied to ly. -* -* lx integer array (input) -* On entry, lx is the integer vector to be copied. -* -* incx integer (input) -* On entry, incx is the increment between elements of lx. -* -* ly integer array (input) -* On exit, ly is the integer vector that contains the -* copy of lx. -* -* incy integer (input) -* On entry, incy is the increment between elements of ly. -* -*\Enddoc -* -*-------------------------------------------------------------------- -* - subroutine icopy( n, lx, incx, ly, incy ) -* -* ---------------------------- -* Specifications for arguments -* ---------------------------- - integer incx, incy, n - integer lx( 1 ), ly( 1 ) -* -* ---------------------------------- -* Specifications for local variables -* ---------------------------------- - integer i, ix, iy -* -* -------------------------- -* First executable statement -* -------------------------- - if( n.le.0 ) - $ return - if( incx.eq.1 .and. incy.eq.1 ) - $ go to 20 -c -c.....code for unequal increments or equal increments -c 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 10 i = 1, n - ly( iy ) = lx( ix ) - ix = ix + incx - iy = iy + incy - 10 continue - return -c -c.....code for both increments equal to 1 -c - 20 continue - do 30 i = 1, n - ly( i ) = lx( i ) - 30 continue - return - end diff --git a/Toolbox/arpack-src/iset.f b/Toolbox/arpack-src/iset.f deleted file mode 100644 index cb690bc3e..000000000 --- a/Toolbox/arpack-src/iset.f +++ /dev/null @@ -1,16 +0,0 @@ -c -c----------------------------------------------------------------------- -c -c Only work with increment equal to 1 right now. -c - subroutine iset (n, value, array, inc) -c - integer n, value, inc - integer array(*) -c - do 10 i = 1, n - array(i) = value - 10 continue -c - return - end diff --git a/Toolbox/arpack-src/iswap.f b/Toolbox/arpack-src/iswap.f deleted file mode 100644 index 088798d00..000000000 --- a/Toolbox/arpack-src/iswap.f +++ /dev/null @@ -1,55 +0,0 @@ - subroutine iswap (n,sx,incx,sy,incy) -c -c interchanges two vectors. -c uses unrolled loops for increments equal to 1. -c jack dongarra, linpack, 3/11/78. -c - integer sx(1),sy(1),stemp - integer i,incx,incy,ix,iy,m,mp1,n -c - if(n.le.0)return - if(incx.eq.1.and.incy.eq.1)go to 20 -c -c code for unequal increments or equal increments not equal -c to 1 -c - ix = 1 - iy = 1 - if(incx.lt.0)ix = (-n+1)*incx + 1 - if(incy.lt.0)iy = (-n+1)*incy + 1 - do 10 i = 1,n - stemp = sx(ix) - sx(ix) = sy(iy) - sy(iy) = stemp - ix = ix + incx - iy = iy + incy - 10 continue - return -c -c code for both increments equal to 1 -c -c -c clean-up loop -c - 20 m = mod(n,3) - if( m .eq. 0 ) go to 40 - do 30 i = 1,m - stemp = sx(i) - sx(i) = sy(i) - sy(i) = stemp - 30 continue - if( n .lt. 3 ) return - 40 mp1 = m + 1 - do 50 i = mp1,n,3 - stemp = sx(i) - sx(i) = sy(i) - sy(i) = stemp - stemp = sx(i + 1) - sx(i + 1) = sy(i + 1) - sy(i + 1) = stemp - stemp = sx(i + 2) - sx(i + 2) = sy(i + 2) - sy(i + 2) = stemp - 50 continue - return - end diff --git a/Toolbox/arpack-src/second.f b/Toolbox/arpack-src/second.f deleted file mode 100644 index cdb3b6e2b..000000000 --- a/Toolbox/arpack-src/second.f +++ /dev/null @@ -1,5 +0,0 @@ - SUBROUTINE SECOND(T) - REAL T - T=0D0 - RETURN - END \ No newline at end of file diff --git a/Toolbox/arpack-src/second_NONE.f b/Toolbox/arpack-src/second_NONE.f new file mode 100644 index 000000000..01fcc9dcf --- /dev/null +++ b/Toolbox/arpack-src/second_NONE.f @@ -0,0 +1,36 @@ + SUBROUTINE ARSCND( T ) +* + REAL T +* +* -- LAPACK auxiliary routine (preliminary version) -- +* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., +* Courant Institute, Argonne National Lab, and Rice University +* July 26, 1991 +* +* Purpose +* ======= +* +* SECOND returns the user time for a process in arscnds. +* This version gets the time from the system function ETIME. +* +* .. Local Scalars .. + REAL T1 +* .. +* .. Local Arrays .. + REAL TARRAY( 2 ) +* .. +* .. External Functions .. + REAL ETIME + EXTERNAL ETIME +* .. +* .. Executable Statements .. +* + +c T1 = ETIME( TARRAY ) +c T = TARRAY( 1 ) + T = 0 + RETURN +* +* End of ARSCND +* + END diff --git a/Toolbox/arpack-src/sgetv0.f b/Toolbox/arpack-src/sgetv0.f index 331251075..26130a014 100644 --- a/Toolbox/arpack-src/sgetv0.f +++ b/Toolbox/arpack-src/sgetv0.f @@ -3,13 +3,13 @@ c c\Name: sgetv0 c -c\Description: +c\Description: c Generate a random initial residual vector for the Arnoldi process. -c Force the residual vector to be in the range of the operator OP. +c Force the residual vector to be in the range of the operator OP. c c\Usage: c call sgetv0 -c ( IDO, BMAT, ITRY, INITV, N, J, V, LDV, RESID, RNORM, +c ( IDO, BMAT, ITRY, INITV, N, J, V, LDV, RESID, RNORM, c IPNTR, WORKD, IERR ) c c\Arguments @@ -36,7 +36,7 @@ c B = 'G' -> generalized eigenvalue problem A*x = lambda*B*x c c ITRY Integer. (INPUT) -c ITRY counts the number of times that sgetv0 is called. +c ITRY counts the number of times that sgetv0 is called. c It should be set to 1 on the initial call to sgetv0. c c INITV Logical variable. (INPUT) @@ -55,11 +55,11 @@ c if this is a "restart". c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c RESID Real array of length N. (INPUT/OUTPUT) -c Initial residual vector to be generated. If RESID is +c Initial residual vector to be generated. If RESID is c provided, force RESID into the range of the operator OP. c c RNORM Real scalar. (OUTPUT) @@ -88,17 +88,17 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c svout ARPACK utility routine for vector output. c slarnv LAPACK routine for generating a random vector. c sgemv Level 2 BLAS routine for matrix vector multiplication. c scopy Level 1 BLAS that copies one vector to another. -c sdot Level 1 BLAS that computes the scalar product of two vectors. +c sdot Level 1 BLAS that computes the scalar product of two vectors. c snrm2 Level 1 BLAS that computes the norm of a vector. c c\Author @@ -106,26 +106,26 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: getv0.F SID: 2.7 DATE OF SID: 04/07/99 RELEASE: 2 c c\EndLib c c----------------------------------------------------------------------- c - subroutine sgetv0 - & ( ido, bmat, itry, initv, n, j, v, ldv, resid, rnorm, + subroutine sgetv0 + & ( ido, bmat, itry, initv, n, j, v, ldv, resid, rnorm, & ipntr, workd, ierr ) -c +c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -157,17 +157,17 @@ subroutine sgetv0 c | Local Scalars & Arrays | c %------------------------% c - logical first, inits, orth + logical first, orth integer idist, iseed(4), iter, msglvl, jj Real & rnorm0 - save first, iseed, inits, iter, msglvl, orth, rnorm0 + save first, iseed, iter, msglvl, orth, rnorm0 c c %----------------------% c | External Subroutines | c %----------------------% c - external slarnv, svout, scopy, sgemv, second + external slarnv, svout, scopy, sgemv, arscnd c c %--------------------% c | External Functions | @@ -183,12 +183,6 @@ subroutine sgetv0 c intrinsic abs, sqrt c -c %-----------------% -c | Data Statements | -c %-----------------% -c - data inits /.true./ -c c %-----------------------% c | Executable Statements | c %-----------------------% @@ -199,24 +193,21 @@ subroutine sgetv0 c | random number generator | c %-----------------------------------% c - if (inits) then - iseed(1) = 1 - iseed(2) = 3 - iseed(3) = 5 - iseed(4) = 7 - inits = .false. - end if + iseed(1) = 1 + iseed(2) = 3 + iseed(3) = 5 + iseed(4) = 7 c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mgetv0 -c +c ierr = 0 iter = 0 first = .FALSE. @@ -235,23 +226,25 @@ subroutine sgetv0 idist = 2 call slarnv (idist, iseed, n, resid) end if -c +c c %----------------------------------------------------------% c | Force the starting vector into the range of OP to handle | c | the generalized problem when B is possibly (singular). | c %----------------------------------------------------------% c - call second (t2) - if (bmat .eq. 'G') then + call arscnd (t2) + if (itry .eq. 1) then nopx = nopx + 1 ipntr(1) = 1 ipntr(2) = n + 1 call scopy (n, resid, 1, workd, 1) ido = -1 go to 9000 + else if (itry .gt. 1 .and. bmat .eq. 'G') then + call scopy (n, resid, 1, workd(n + 1), 1) end if end if -c +c c %-----------------------------------------% c | Back from computing OP*(initial-vector) | c %-----------------------------------------% @@ -259,26 +252,26 @@ subroutine sgetv0 if (first) go to 20 c c %-----------------------------------------------% -c | Back from computing B*(orthogonalized-vector) | +c | Back from computing OP*(orthogonalized-vector) | c %-----------------------------------------------% c if (orth) go to 40 -c +c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvopx = tmvopx + (t3 - t2) end if -c +c c %------------------------------------------------------% c | Starting vector is now in the range of OP; r = OP*r; | c | Compute B-norm of starting vector. | c %------------------------------------------------------% c - call second (t2) + call arscnd (t2) first = .TRUE. + if (itry .eq. 1) call scopy (n, workd(n + 1), 1, resid, 1) if (bmat .eq. 'G') then nbx = nbx + 1 - call scopy (n, workd(n+1), 1, resid, 1) ipntr(1) = n + 1 ipntr(2) = 1 ido = 2 @@ -286,14 +279,14 @@ subroutine sgetv0 else if (bmat .eq. 'I') then call scopy (n, resid, 1, workd, 1) end if -c +c 20 continue c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c first = .FALSE. if (bmat .eq. 'G') then rnorm0 = sdot (n, resid, 1, workd, 1) @@ -308,7 +301,7 @@ subroutine sgetv0 c %---------------------------------------------% c if (j .eq. 1) go to 50 -c +c c %---------------------------------------------------------------- c | Otherwise need to B-orthogonalize the starting vector against | c | the current Arnoldi basis using Gram-Schmidt with iter. ref. | @@ -324,16 +317,16 @@ subroutine sgetv0 orth = .TRUE. 30 continue c - call sgemv ('T', n, j-1, one, v, ldv, workd, 1, + call sgemv ('T', n, j-1, one, v, ldv, workd, 1, & zero, workd(n+1), 1) - call sgemv ('N', n, j-1, -one, v, ldv, workd(n+1), 1, + call sgemv ('N', n, j-1, -one, v, ldv, workd(n+1), 1, & one, resid, 1) -c +c c %----------------------------------------------------------% c | Compute the B-norm of the orthogonalized starting vector | c %----------------------------------------------------------% c - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call scopy (n, resid, 1, workd(n+1), 1) @@ -344,14 +337,14 @@ subroutine sgetv0 else if (bmat .eq. 'I') then call scopy (n, resid, 1, workd, 1) end if -c +c 40 continue c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c if (bmat .eq. 'G') then rnorm = sdot (n, resid, 1, workd, 1) rnorm = sqrt(abs(rnorm)) @@ -364,14 +357,14 @@ subroutine sgetv0 c %--------------------------------------% c if (msglvl .gt. 2) then - call svout (logfil, 1, rnorm0, ndigit, + call svout (logfil, 1, [rnorm0], ndigit, & '_getv0: re-orthonalization ; rnorm0 is') - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_getv0: re-orthonalization ; rnorm is') end if c if (rnorm .gt. 0.717*rnorm0) go to 50 -c +c iter = iter + 1 if (iter .le. 5) then c @@ -393,11 +386,11 @@ subroutine sgetv0 rnorm = zero ierr = -1 end if -c +c 50 continue c if (msglvl .gt. 0) then - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_getv0: B-norm of initial / restarted starting vector') end if if (msglvl .gt. 3) then @@ -405,10 +398,10 @@ subroutine sgetv0 & '_getv0: initial / restarted starting vector') end if ido = 99 -c - call second (t1) +c + call arscnd (t1) tgetv0 = tgetv0 + (t1 - t0) -c +c 9000 continue return c diff --git a/Toolbox/arpack-src/slaqrb.f b/Toolbox/arpack-src/slaqrb.f deleted file mode 100644 index e967b18e4..000000000 --- a/Toolbox/arpack-src/slaqrb.f +++ /dev/null @@ -1,521 +0,0 @@ -c----------------------------------------------------------------------- -c\BeginDoc -c -c\Name: slaqrb -c -c\Description: -c Compute the eigenvalues and the Schur decomposition of an upper -c Hessenberg submatrix in rows and columns ILO to IHI. Only the -c last component of the Schur vectors are computed. -c -c This is mostly a modification of the LAPACK routine slahqr. -c -c\Usage: -c call slaqrb -c ( WANTT, N, ILO, IHI, H, LDH, WR, WI, Z, INFO ) -c -c\Arguments -c WANTT Logical variable. (INPUT) -c = .TRUE. : the full Schur form T is required; -c = .FALSE.: only eigenvalues are required. -c -c N Integer. (INPUT) -c The order of the matrix H. N >= 0. -c -c ILO Integer. (INPUT) -c IHI Integer. (INPUT) -c It is assumed that H is already upper quasi-triangular in -c rows and columns IHI+1:N, and that H(ILO,ILO-1) = 0 (unless -c ILO = 1). SLAQRB works primarily with the Hessenberg -c submatrix in rows and columns ILO to IHI, but applies -c transformations to all of H if WANTT is .TRUE.. -c 1 <= ILO <= max(1,IHI); IHI <= N. -c -c H Real array, dimension (LDH,N). (INPUT/OUTPUT) -c On entry, the upper Hessenberg matrix H. -c On exit, if WANTT is .TRUE., H is upper quasi-triangular in -c rows and columns ILO:IHI, with any 2-by-2 diagonal blocks in -c standard form. If WANTT is .FALSE., the contents of H are -c unspecified on exit. -c -c LDH Integer. (INPUT) -c The leading dimension of the array H. LDH >= max(1,N). -c -c WR Real array, dimension (N). (OUTPUT) -c WI Real array, dimension (N). (OUTPUT) -c The real and imaginary parts, respectively, of the computed -c eigenvalues ILO to IHI are stored in the corresponding -c elements of WR and WI. If two eigenvalues are computed as a -c complex conjugate pair, they are stored in consecutive -c elements of WR and WI, say the i-th and (i+1)th, with -c WI(i) > 0 and WI(i+1) < 0. If WANTT is .TRUE., the -c eigenvalues are stored in the same order as on the diagonal -c of the Schur form returned in H, with WR(i) = H(i,i), and, if -c H(i:i+1,i:i+1) is a 2-by-2 diagonal block, -c WI(i) = sqrt(H(i+1,i)*H(i,i+1)) and WI(i+1) = -WI(i). -c -c Z Real array, dimension (N). (OUTPUT) -c On exit Z contains the last components of the Schur vectors. -c -c INFO Integer. (OUPUT) -c = 0: successful exit -c > 0: SLAQRB failed to compute all the eigenvalues ILO to IHI -c in a total of 30*(IHI-ILO+1) iterations; if INFO = i, -c elements i+1:ihi of WR and WI contain those eigenvalues -c which have been successfully computed. -c -c\Remarks -c 1. None. -c -c----------------------------------------------------------------------- -c -c\BeginLib -c -c\Local variables: -c xxxxxx real -c -c\Routines called: -c slabad LAPACK routine that computes machine constants. -c slamch LAPACK routine that determines machine constants. -c slanhs LAPACK routine that computes various norms of a matrix. -c slanv2 LAPACK routine that computes the Schur factorization of -c 2 by 2 nonsymmetric matrix in standard form. -c slarfg LAPACK Householder reflection construction routine. -c scopy Level 1 BLAS that copies one vector to another. -c srot Level 1 BLAS that applies a rotation to a 2 by 2 matrix. - -c -c\Author -c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas -c -c\Revision history: -c xx/xx/92: Version ' 2.4' -c Modified from the LAPACK routine slahqr so that only the -c last component of the Schur vectors are computed. -c -c\SCCS Information: @(#) -c FILE: laqrb.F SID: 2.2 DATE OF SID: 8/27/96 RELEASE: 2 -c -c\Remarks -c 1. None -c -c\EndLib -c -c----------------------------------------------------------------------- -c - subroutine slaqrb ( wantt, n, ilo, ihi, h, ldh, wr, wi, - & z, info ) -c -c %------------------% -c | Scalar Arguments | -c %------------------% -c - logical wantt - integer ihi, ilo, info, ldh, n -c -c %-----------------% -c | Array Arguments | -c %-----------------% -c - Real - & h( ldh, * ), wi( * ), wr( * ), z( * ) -c -c %------------% -c | Parameters | -c %------------% -c - Real - & zero, one, dat1, dat2 - parameter (zero = 0.0E+0, one = 1.0E+0, dat1 = 7.5E-1, - & dat2 = -4.375E-1) -c -c %------------------------% -c | Local Scalars & Arrays | -c %------------------------% -c - integer i, i1, i2, itn, its, j, k, l, m, nh, nr - Real - & cs, h00, h10, h11, h12, h21, h22, h33, h33s, - & h43h34, h44, h44s, ovfl, s, smlnum, sn, sum, - & t1, t2, t3, tst1, ulp, unfl, v1, v2, v3 - Real - & v( 3 ), work( 1 ) -c -c %--------------------% -c | External Functions | -c %--------------------% -c - Real - & slamch, slanhs - external slamch, slanhs -c -c %----------------------% -c | External Subroutines | -c %----------------------% -c - external scopy, slabad, slanv2, slarfg, srot -c -c %-----------------------% -c | Executable Statements | -c %-----------------------% -c - info = 0 -c -c %--------------------------% -c | Quick return if possible | -c %--------------------------% -c - if( n.eq.0 ) - & return - if( ilo.eq.ihi ) then - wr( ilo ) = h( ilo, ilo ) - wi( ilo ) = zero - return - end if -c -c %---------------------------------------------% -c | Initialize the vector of last components of | -c | the Schur vectors for accumulation. | -c %---------------------------------------------% -c - do 5 j = 1, n-1 - z(j) = zero - 5 continue - z(n) = one -c - nh = ihi - ilo + 1 -c -c %-------------------------------------------------------------% -c | Set machine-dependent constants for the stopping criterion. | -c | If norm(H) <= sqrt(OVFL), overflow should not occur. | -c %-------------------------------------------------------------% -c - unfl = slamch( 'safe minimum' ) - ovfl = one / unfl - call slabad( unfl, ovfl ) - ulp = slamch( 'precision' ) - smlnum = unfl*( nh / ulp ) -c -c %---------------------------------------------------------------% -c | I1 and I2 are the indices of the first row and last column | -c | of H to which transformations must be applied. If eigenvalues | -c | only are computed, I1 and I2 are set inside the main loop. | -c | Zero out H(J+2,J) = ZERO for J=1:N if WANTT = .TRUE. | -c | else H(J+2,J) for J=ILO:IHI-ILO-1 if WANTT = .FALSE. | -c %---------------------------------------------------------------% -c - if( wantt ) then - i1 = 1 - i2 = n - do 8 i=1,i2-2 - h(i1+i+1,i) = zero - 8 continue - else - do 9 i=1, ihi-ilo-1 - h(ilo+i+1,ilo+i-1) = zero - 9 continue - end if -c -c %---------------------------------------------------% -c | ITN is the total number of QR iterations allowed. | -c %---------------------------------------------------% -c - itn = 30*nh -c -c ------------------------------------------------------------------ -c The main loop begins here. I is the loop index and decreases from -c IHI to ILO in steps of 1 or 2. Each iteration of the loop works -c with the active submatrix in rows and columns L to I. -c Eigenvalues I+1 to IHI have already converged. Either L = ILO or -c H(L,L-1) is negligible so that the matrix splits. -c ------------------------------------------------------------------ -c - i = ihi - 10 continue - l = ilo - if( i.lt.ilo ) - & go to 150 - -c %--------------------------------------------------------------% -c | Perform QR iterations on rows and columns ILO to I until a | -c | submatrix of order 1 or 2 splits off at the bottom because a | -c | subdiagonal element has become negligible. | -c %--------------------------------------------------------------% - - do 130 its = 0, itn -c -c %----------------------------------------------% -c | Look for a single small subdiagonal element. | -c %----------------------------------------------% -c - do 20 k = i, l + 1, -1 - tst1 = abs( h( k-1, k-1 ) ) + abs( h( k, k ) ) - if( tst1.eq.zero ) - & tst1 = slanhs( '1', i-l+1, h( l, l ), ldh, work ) - if( abs( h( k, k-1 ) ).le.max( ulp*tst1, smlnum ) ) - & go to 30 - 20 continue - 30 continue - l = k - if( l.gt.ilo ) then -c -c %------------------------% -c | H(L,L-1) is negligible | -c %------------------------% -c - h( l, l-1 ) = zero - end if -c -c %-------------------------------------------------------------% -c | Exit from loop if a submatrix of order 1 or 2 has split off | -c %-------------------------------------------------------------% -c - if( l.ge.i-1 ) - & go to 140 -c -c %---------------------------------------------------------% -c | Now the active submatrix is in rows and columns L to I. | -c | If eigenvalues only are being computed, only the active | -c | submatrix need be transformed. | -c %---------------------------------------------------------% -c - if( .not.wantt ) then - i1 = l - i2 = i - end if -c - if( its.eq.10 .or. its.eq.20 ) then -c -c %-------------------% -c | Exceptional shift | -c %-------------------% -c - s = abs( h( i, i-1 ) ) + abs( h( i-1, i-2 ) ) - h44 = dat1*s - h33 = h44 - h43h34 = dat2*s*s -c - else -c -c %-----------------------------------------% -c | Prepare to use Wilkinson's double shift | -c %-----------------------------------------% -c - h44 = h( i, i ) - h33 = h( i-1, i-1 ) - h43h34 = h( i, i-1 )*h( i-1, i ) - end if -c -c %-----------------------------------------------------% -c | Look for two consecutive small subdiagonal elements | -c %-----------------------------------------------------% -c - do 40 m = i - 2, l, -1 -c -c %---------------------------------------------------------% -c | Determine the effect of starting the double-shift QR | -c | iteration at row M, and see if this would make H(M,M-1) | -c | negligible. | -c %---------------------------------------------------------% -c - h11 = h( m, m ) - h22 = h( m+1, m+1 ) - h21 = h( m+1, m ) - h12 = h( m, m+1 ) - h44s = h44 - h11 - h33s = h33 - h11 - v1 = ( h33s*h44s-h43h34 ) / h21 + h12 - v2 = h22 - h11 - h33s - h44s - v3 = h( m+2, m+1 ) - s = abs( v1 ) + abs( v2 ) + abs( v3 ) - v1 = v1 / s - v2 = v2 / s - v3 = v3 / s - v( 1 ) = v1 - v( 2 ) = v2 - v( 3 ) = v3 - if( m.eq.l ) - & go to 50 - h00 = h( m-1, m-1 ) - h10 = h( m, m-1 ) - tst1 = abs( v1 )*( abs( h00 )+abs( h11 )+abs( h22 ) ) - if( abs( h10 )*( abs( v2 )+abs( v3 ) ).le.ulp*tst1 ) - & go to 50 - 40 continue - 50 continue -c -c %----------------------% -c | Double-shift QR step | -c %----------------------% -c - do 120 k = m, i - 1 -c -c ------------------------------------------------------------ -c The first iteration of this loop determines a reflection G -c from the vector V and applies it from left and right to H, -c thus creating a nonzero bulge below the subdiagonal. -c -c Each subsequent iteration determines a reflection G to -c restore the Hessenberg form in the (K-1)th column, and thus -c chases the bulge one step toward the bottom of the active -c submatrix. NR is the order of G. -c ------------------------------------------------------------ -c - nr = min( 3, i-k+1 ) - if( k.gt.m ) - & call scopy( nr, h( k, k-1 ), 1, v, 1 ) - call slarfg( nr, v( 1 ), v( 2 ), 1, t1 ) - if( k.gt.m ) then - h( k, k-1 ) = v( 1 ) - h( k+1, k-1 ) = zero - if( k.lt.i-1 ) - & h( k+2, k-1 ) = zero - else if( m.gt.l ) then - h( k, k-1 ) = -h( k, k-1 ) - end if - v2 = v( 2 ) - t2 = t1*v2 - if( nr.eq.3 ) then - v3 = v( 3 ) - t3 = t1*v3 -c -c %------------------------------------------------% -c | Apply G from the left to transform the rows of | -c | the matrix in columns K to I2. | -c %------------------------------------------------% -c - do 60 j = k, i2 - sum = h( k, j ) + v2*h( k+1, j ) + v3*h( k+2, j ) - h( k, j ) = h( k, j ) - sum*t1 - h( k+1, j ) = h( k+1, j ) - sum*t2 - h( k+2, j ) = h( k+2, j ) - sum*t3 - 60 continue -c -c %----------------------------------------------------% -c | Apply G from the right to transform the columns of | -c | the matrix in rows I1 to min(K+3,I). | -c %----------------------------------------------------% -c - do 70 j = i1, min( k+3, i ) - sum = h( j, k ) + v2*h( j, k+1 ) + v3*h( j, k+2 ) - h( j, k ) = h( j, k ) - sum*t1 - h( j, k+1 ) = h( j, k+1 ) - sum*t2 - h( j, k+2 ) = h( j, k+2 ) - sum*t3 - 70 continue -c -c %----------------------------------% -c | Accumulate transformations for Z | -c %----------------------------------% -c - sum = z( k ) + v2*z( k+1 ) + v3*z( k+2 ) - z( k ) = z( k ) - sum*t1 - z( k+1 ) = z( k+1 ) - sum*t2 - z( k+2 ) = z( k+2 ) - sum*t3 - - else if( nr.eq.2 ) then -c -c %------------------------------------------------% -c | Apply G from the left to transform the rows of | -c | the matrix in columns K to I2. | -c %------------------------------------------------% -c - do 90 j = k, i2 - sum = h( k, j ) + v2*h( k+1, j ) - h( k, j ) = h( k, j ) - sum*t1 - h( k+1, j ) = h( k+1, j ) - sum*t2 - 90 continue -c -c %----------------------------------------------------% -c | Apply G from the right to transform the columns of | -c | the matrix in rows I1 to min(K+3,I). | -c %----------------------------------------------------% -c - do 100 j = i1, i - sum = h( j, k ) + v2*h( j, k+1 ) - h( j, k ) = h( j, k ) - sum*t1 - h( j, k+1 ) = h( j, k+1 ) - sum*t2 - 100 continue -c -c %----------------------------------% -c | Accumulate transformations for Z | -c %----------------------------------% -c - sum = z( k ) + v2*z( k+1 ) - z( k ) = z( k ) - sum*t1 - z( k+1 ) = z( k+1 ) - sum*t2 - end if - 120 continue - - 130 continue -c -c %-------------------------------------------------------% -c | Failure to converge in remaining number of iterations | -c %-------------------------------------------------------% -c - info = i - return - - 140 continue - - if( l.eq.i ) then -c -c %------------------------------------------------------% -c | H(I,I-1) is negligible: one eigenvalue has converged | -c %------------------------------------------------------% -c - wr( i ) = h( i, i ) - wi( i ) = zero - - else if( l.eq.i-1 ) then -c -c %--------------------------------------------------------% -c | H(I-1,I-2) is negligible; | -c | a pair of eigenvalues have converged. | -c | | -c | Transform the 2-by-2 submatrix to standard Schur form, | -c | and compute and store the eigenvalues. | -c %--------------------------------------------------------% -c - call slanv2( h( i-1, i-1 ), h( i-1, i ), h( i, i-1 ), - & h( i, i ), wr( i-1 ), wi( i-1 ), wr( i ), wi( i ), - & cs, sn ) - - if( wantt ) then -c -c %-----------------------------------------------------% -c | Apply the transformation to the rest of H and to Z, | -c | as required. | -c %-----------------------------------------------------% -c - if( i2.gt.i ) - & call srot( i2-i, h( i-1, i+1 ), ldh, h( i, i+1 ), ldh, - & cs, sn ) - call srot( i-i1-1, h( i1, i-1 ), 1, h( i1, i ), 1, cs, sn ) - sum = cs*z( i-1 ) + sn*z( i ) - z( i ) = cs*z( i ) - sn*z( i-1 ) - z( i-1 ) = sum - end if - end if -c -c %---------------------------------------------------------% -c | Decrement number of remaining iterations, and return to | -c | start of the main loop with new value of I. | -c %---------------------------------------------------------% -c - itn = itn - its - i = l - 1 - go to 10 - - 150 continue - return -c -c %---------------% -c | End of slaqrb | -c %---------------% -c - end diff --git a/Toolbox/arpack-src/snaitr.f b/Toolbox/arpack-src/snaitr.f index 6a2be3a05..8a5d795be 100644 --- a/Toolbox/arpack-src/snaitr.f +++ b/Toolbox/arpack-src/snaitr.f @@ -3,8 +3,8 @@ c c\Name: snaitr c -c\Description: -c Reverse communication interface for applying NP additional steps to +c\Description: +c Reverse communication interface for applying NP additional steps to c a K step nonsymmetric Arnoldi factorization. c c Input: OP*V_{k} - V_{k}*H = r_{k}*e_{k}^T @@ -20,7 +20,7 @@ c c\Usage: c call snaitr -c ( IDO, BMAT, N, K, NP, NB, RESID, RNORM, V, LDV, H, LDH, +c ( IDO, BMAT, N, K, NP, NB, RESID, RNORM, V, LDV, H, LDH, c IPNTR, WORKD, INFO ) c c\Arguments @@ -62,8 +62,8 @@ c Number of additional Arnoldi steps to take. c c NB Integer. (INPUT) -c Blocksize to be used in the recurrence. -c Only work for NB = 1 right now. The goal is to have a +c Blocksize to be used in the recurrence. +c Only work for NB = 1 right now. The goal is to have a c program that implement both the block and non-block method. c c RESID Real array of length N. (INPUT/OUTPUT) @@ -75,37 +75,37 @@ c B-norm of the updated residual r_{k+p} on output. c c V Real N by K+NP array. (INPUT/OUTPUT) -c On INPUT: V contains the Arnoldi vectors in the first K +c On INPUT: V contains the Arnoldi vectors in the first K c columns. c On OUTPUT: V contains the new NP Arnoldi vectors in the next c NP columns. The first K columns are unchanged. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c H Real (K+NP) by (K+NP) array. (INPUT/OUTPUT) c H is used to store the generated upper Hessenberg matrix. c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORK for +c Pointer to mark the starting locations in the WORK for c vectors used by the Arnoldi iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in the +c IPNTR(3): pointer to the vector B * X when used in the c shift-and-invert mode. X is the current operand. c ------------------------------------------------------------- -c +c c WORKD Real work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The calling program should not +c for reverse communication. The calling program should not c use WORKD as temporary workspace during the iteration !!!!!! -c On input, WORKD(1:N) = B*RESID and is used to save some +c On input, WORKD(1:N) = B*RESID and is used to save some c computation at the first step. c c INFO Integer. (OUTPUT) @@ -125,14 +125,14 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: c sgetv0 ARPACK routine to generate the initial vector. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c smout ARPACK utility routine that prints matrices c svout ARPACK utility routine that prints vectors. c slabad LAPACK routine that computes machine constants. @@ -143,7 +143,7 @@ c saxpy Level 1 BLAS that computes a vector triad. c sscal Level 1 BLAS that scales a vector. c scopy Level 1 BLAS that copies one vector to another . -c sdot Level 1 BLAS that computes the scalar product of two vectors. +c sdot Level 1 BLAS that computes the scalar product of two vectors. c snrm2 Level 1 BLAS that computes the norm of a vector. c c\Author @@ -151,22 +151,22 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: c xx/xx/92: Version ' 2.4' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: naitr.F SID: 2.4 DATE OF SID: 8/27/96 RELEASE: 2 c c\Remarks c The algorithm implemented is: -c +c c restart = .false. -c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; +c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; c r_{k} contains the initial residual vector even for k = 0; -c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already +c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already c computed by the calling program. c c betaj = rnorm ; p_{k+1} = B*r_{k} ; @@ -174,7 +174,7 @@ c 1) if ( betaj < tol ) stop or restart depending on j. c ( At present tol is zero ) c if ( restart ) generate a new starting vector. -c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; +c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; c p_{j} = p_{j}/betaj c 3) r_{j} = OP*v_{j} where OP is defined as in snaupd c For shift-invert mode p_{j} = B*v_{j} is already available. @@ -189,7 +189,7 @@ c 5) Re-orthogonalization step: c s = V_{j}'*B*r_{j} c r_{j} = r_{j} - V_{j}*s; rnorm1 = || r_{j} || -c alphaj = alphaj + s_{j}; +c alphaj = alphaj + s_{j}; c 6) Iterative refinement step: c If (rnorm1 > 0.717*rnorm) then c rnorm = rnorm1 @@ -199,7 +199,7 @@ c If this is the first time in step 6), go to 5) c Else r_{j} lies in the span of V_{j} numerically. c Set r_{j} = 0 and rnorm = 0; go to 1) -c EndIf +c EndIf c End Do c c\EndLib @@ -207,15 +207,15 @@ c----------------------------------------------------------------------- c subroutine snaitr - & (ido, bmat, n, k, np, nb, resid, rnorm, v, ldv, h, ldh, + & (ido, bmat, n, k, np, nb, resid, rnorm, v, ldv, h, ldh, & ipntr, workd, info) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -250,14 +250,14 @@ subroutine snaitr integer ierr, i, infol, ipj, irj, ivj, iter, itry, j, msglvl, & jj Real - & betaj, ovfl, temp1, rnorm1, smlnum, tst1, ulp, unfl, + & betaj, ovfl, temp1, rnorm1, smlnum, tst1, ulp, unfl, & wnorm save first, orth1, orth2, rstart, step3, step4, & ierr, ipj, irj, ivj, iter, itry, j, msglvl, ovfl, & betaj, rnorm1, smlnum, ulp, unfl, wnorm c c %-----------------------% -c | Local Array Arguments | +c | Local Array Arguments | c %-----------------------% c Real @@ -267,8 +267,8 @@ subroutine snaitr c | External Subroutines | c %----------------------% c - external saxpy, scopy, sscal, sgemv, sgetv0, slabad, - & svout, smout, ivout, second + external saxpy, scopy, sscal, sgemv, sgetv0, slabad, + & svout, smout, ivout, arscnd c c %--------------------% c | External Functions | @@ -313,15 +313,15 @@ subroutine snaitr end if c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mnaitr -c +c c %------------------------------% c | Initial call to this routine | c %------------------------------% @@ -337,7 +337,7 @@ subroutine snaitr irj = ipj + n ivj = irj + n end if -c +c c %-------------------------------------------------% c | When in reverse communication mode one of: | c | STEP3, STEP4, ORTH1, ORTH2, RSTART | @@ -367,19 +367,19 @@ subroutine snaitr c | | c | Note: B*r_{j-1} is already in WORKD(1:N)=WORKD(IPJ:IPJ+N-1) | c %--------------------------------------------------------------% - + 1000 continue c if (msglvl .gt. 1) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: generating Arnoldi vector number') - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_naitr: B-norm of the current residual is') end if -c +c c %---------------------------------------------------% c | STEP 1: Check if the B norm of j-th residual | -c | vector is zero. Equivalent to determing whether | +c | vector is zero. Equivalent to determining whether | c | an exact j-step Arnoldi factorization is present. | c %---------------------------------------------------% c @@ -393,16 +393,16 @@ subroutine snaitr c %---------------------------------------------------% c if (msglvl .gt. 0) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: ****** RESTART AT STEP ******') end if -c +c c %---------------------------------------------% c | ITRY is the loop variable that controls the | c | maximum amount of times that a restart is | c | attempted. NRSTRT is used by stat.h | c %---------------------------------------------% -c +c betaj = zero nrstrt = nrstrt + 1 itry = 1 @@ -416,7 +416,7 @@ subroutine snaitr c | RSTART = .true. flow returns here. | c %--------------------------------------% c - call sgetv0 (ido, bmat, itry, .false., n, j, v, ldv, + call sgetv0 (ido, bmat, itry, .false., n, j, v, ldv, & resid, rnorm, ipntr, workd, ierr) if (ido .ne. 99) go to 9000 if (ierr .lt. 0) then @@ -430,12 +430,12 @@ subroutine snaitr c %------------------------------------------------% c info = j - 1 - call second (t1) + call arscnd (t1) tnaitr = tnaitr + (t1 - t0) ido = 99 go to 9000 end if -c +c 40 continue c c %---------------------------------------------------------% @@ -457,9 +457,9 @@ subroutine snaitr c | use LAPACK routine SLASCL | c %-----------------------------------------% c - call slascl ('General', i, i, rnorm, one, n, 1, + call slascl ('General', i, i, rnorm, one, n, 1, & v(1,j), n, infol) - call slascl ('General', i, i, rnorm, one, n, 1, + call slascl ('General', i, i, rnorm, one, n, 1, & workd(ipj), n, infol) end if c @@ -470,29 +470,29 @@ subroutine snaitr c step3 = .true. nopx = nopx + 1 - call second (t2) + call arscnd (t2) call scopy (n, v(1,j), 1, workd(ivj), 1) ipntr(1) = ivj ipntr(2) = irj ipntr(3) = ipj ido = 1 -c +c c %-----------------------------------% c | Exit in order to compute OP*v_{j} | c %-----------------------------------% -c - go to 9000 +c + go to 9000 50 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(IRJ:IRJ+N-1) := OP*v_{j} | c | if step3 = .true. | c %----------------------------------% c - call second (t3) + call arscnd (t3) tmvopx = tmvopx + (t3 - t2) - + step3 = .false. c c %------------------------------------------% @@ -500,30 +500,30 @@ subroutine snaitr c %------------------------------------------% c call scopy (n, workd(irj), 1, resid, 1) -c +c c %---------------------------------------% c | STEP 4: Finish extending the Arnoldi | c | factorization to length j. | c %---------------------------------------% c - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 step4 = .true. ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-------------------------------------% c | Exit in order to compute B*OP*v_{j} | c %-------------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call scopy (n, resid, 1, workd(ipj), 1) end if 60 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(IPJ:IPJ+N-1) := B*OP*v_{j} | @@ -531,10 +531,10 @@ subroutine snaitr c %----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c step4 = .false. c c %-------------------------------------% @@ -542,7 +542,7 @@ subroutine snaitr c | Compute the B-norm of OP*v_{j}. | c %-------------------------------------% c - if (bmat .eq. 'G') then + if (bmat .eq. 'G') then wnorm = sdot (n, resid, 1, workd(ipj), 1) wnorm = sqrt(abs(wnorm)) else if (bmat .eq. 'I') then @@ -562,13 +562,13 @@ subroutine snaitr c | Compute the j Fourier coefficients w_{j} | c | WORKD(IPJ:IPJ+N-1) contains B*OP*v_{j}. | c %------------------------------------------% -c +c call sgemv ('T', n, j, one, v, ldv, workd(ipj), 1, & zero, h(1,j), 1) c c %--------------------------------------% c | Orthogonalize r_{j} against V_{j}. | -c | RESID contains OP*v_{j}. See STEP 3. | +c | RESID contains OP*v_{j}. See STEP 3. | c %--------------------------------------% c call sgemv ('N', n, j, -one, v, ldv, h(1,j), 1, @@ -576,51 +576,51 @@ subroutine snaitr c if (j .gt. 1) h(j,j-1) = betaj c - call second (t4) -c + call arscnd (t4) +c orth1 = .true. c - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call scopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*r_{j} | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call scopy (n, resid, 1, workd(ipj), 1) - end if + end if 70 continue -c +c c %---------------------------------------------------% c | Back from reverse communication if ORTH1 = .true. | c | WORKD(IPJ:IPJ+N-1) := B*r_{j}. | c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c orth1 = .false. c c %------------------------------% c | Compute the B-norm of r_{j}. | c %------------------------------% c - if (bmat .eq. 'G') then + if (bmat .eq. 'G') then rnorm = sdot (n, resid, 1, workd(ipj), 1) rnorm = sqrt(abs(rnorm)) else if (bmat .eq. 'I') then rnorm = snrm2(n, resid, 1) end if -c +c c %-----------------------------------------------------------% c | STEP 5: Re-orthogonalization / Iterative refinement phase | c | Maximum NITER_ITREF tries. | @@ -642,20 +642,20 @@ subroutine snaitr if (rnorm .gt. 0.717*wnorm) go to 100 iter = 0 nrorth = nrorth + 1 -c +c c %---------------------------------------------------% c | Enter the Iterative refinement phase. If further | c | refinement is necessary, loop back here. The loop | c | variable is ITER. Perform a step of Classical | c | Gram-Schmidt using all the Arnoldi vectors V_{j} | c %---------------------------------------------------% -c +c 80 continue c if (msglvl .gt. 2) then xtemp(1) = wnorm xtemp(2) = rnorm - call svout (logfil, 2, xtemp, ndigit, + call svout (logfil, 2, xtemp, ndigit, & '_naitr: re-orthonalization; wnorm and rnorm are') call svout (logfil, j, h(1,j), ndigit, & '_naitr: j-th column of H') @@ -666,7 +666,7 @@ subroutine snaitr c | WORKD(IRJ:IRJ+J-1) = v(:,1:J)'*WORKD(IPJ:IPJ+N-1). | c %----------------------------------------------------% c - call sgemv ('T', n, j, one, v, ldv, workd(ipj), 1, + call sgemv ('T', n, j, one, v, ldv, workd(ipj), 1, & zero, workd(irj), 1) c c %---------------------------------------------% @@ -676,28 +676,28 @@ subroutine snaitr c | + v(:,1:J)*WORKD(IRJ:IRJ+J-1)*e'_j. | c %---------------------------------------------% c - call sgemv ('N', n, j, -one, v, ldv, workd(irj), 1, + call sgemv ('N', n, j, -one, v, ldv, workd(irj), 1, & one, resid, 1) call saxpy (j, one, workd(irj), 1, h(1,j), 1) -c +c orth2 = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call scopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-----------------------------------% c | Exit in order to compute B*r_{j}. | c | r_{j} is the corrected residual. | c %-----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call scopy (n, resid, 1, workd(ipj), 1) - end if + end if 90 continue c c %---------------------------------------------------% @@ -705,15 +705,15 @@ subroutine snaitr c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if c c %-----------------------------------------------------% c | Compute the B-norm of the corrected residual r_{j}. | c %-----------------------------------------------------% -c - if (bmat .eq. 'G') then +c + if (bmat .eq. 'G') then rnorm1 = sdot (n, resid, 1, workd(ipj), 1) rnorm1 = sqrt(abs(rnorm1)) else if (bmat .eq. 'I') then @@ -721,7 +721,7 @@ subroutine snaitr end if c if (msglvl .gt. 0 .and. iter .gt. 0) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: Iterative refinement for Arnoldi residual') if (msglvl .gt. 2) then xtemp(1) = rnorm @@ -749,7 +749,7 @@ subroutine snaitr c %---------------------------------------% c rnorm = rnorm1 -c +c else c c %-------------------------------------------% @@ -771,50 +771,50 @@ subroutine snaitr 95 continue rnorm = zero end if -c +c c %----------------------------------------------% c | Branch here directly if iterative refinement | c | wasn't necessary or after at most NITER_REF | c | steps of iterative refinement. | c %----------------------------------------------% -c +c 100 continue -c +c rstart = .false. orth2 = .false. -c - call second (t5) +c + call arscnd (t5) titref = titref + (t5 - t4) -c +c c %------------------------------------% c | STEP 6: Update j = j+1; Continue | c %------------------------------------% c j = j + 1 if (j .gt. k+np) then - call second (t1) + call arscnd (t1) tnaitr = tnaitr + (t1 - t0) ido = 99 do 110 i = max(1,k), k+np-1 -c +c c %--------------------------------------------% c | Check for splitting and deflation. | c | Use a standard test as in the QR algorithm | c | REFERENCE: LAPACK subroutine slahqr | c %--------------------------------------------% -c +c tst1 = abs( h( i, i ) ) + abs( h( i+1, i+1 ) ) if( tst1.eq.zero ) & tst1 = slanhs( '1', k+np, h, ldh, workd(n+1) ) - if( abs( h( i+1,i ) ).le.max( ulp*tst1, smlnum ) ) + if( abs( h( i+1,i ) ).le.max( ulp*tst1, smlnum ) ) & h(i+1,i) = zero 110 continue -c +c if (msglvl .gt. 2) then - call smout (logfil, k+np, k+np, h, ldh, ndigit, + call smout (logfil, k+np, k+np, h, ldh, ndigit, & '_naitr: Final upper Hessenberg matrix H of order K+NP') end if -c +c go to 9000 end if c @@ -823,7 +823,7 @@ subroutine snaitr c %--------------------------------------------------------% c go to 1000 -c +c c %---------------------------------------------------------------% c | | c | E N D O F M A I N I T E R A T I O N L O O P | diff --git a/Toolbox/arpack-src/snapps.f b/Toolbox/arpack-src/snapps.f index f7de4bda7..33b036108 100644 --- a/Toolbox/arpack-src/snapps.f +++ b/Toolbox/arpack-src/snapps.f @@ -13,14 +13,14 @@ c A*(V_{k}*Q) - (V_{k}*Q)*(Q^T* H_{k}*Q) = r_{k+p}*e_{k+p}^T * Q c c where Q is an orthogonal matrix which is the product of rotations -c and reflections resulting from the NP bulge chage sweeps. +c and reflections resulting from the NP bulge change sweeps. c The updated Arnoldi factorization becomes: c c A*VNEW_{k} - VNEW_{k}*HNEW_{k} = rnew_{k}*e_{k}^T. c c\Usage: c call snapps -c ( N, KEV, NP, SHIFTR, SHIFTI, V, LDV, H, LDH, RESID, Q, LDQ, +c ( N, KEV, NP, SHIFTR, SHIFTI, V, LDV, H, LDH, RESID, Q, LDQ, c WORKL, WORKD ) c c\Arguments @@ -29,8 +29,8 @@ c c KEV Integer. (INPUT/OUTPUT) c KEV+NP is the size of the input matrix H. -c KEV is the size of the updated matrix HNEW. KEV is only -c updated on ouput when fewer than NP shifts are applied in +c KEV is the size of the updated matrix HNEW. KEV is only +c updated on output when fewer than NP shifts are applied in c order to keep the conjugate pair together. c c NP Integer. (INPUT) @@ -38,7 +38,7 @@ c c SHIFTR, Real array of length NP. (INPUT) c SHIFTI Real and imaginary part of the shifts to be applied. -c Upon, entry to snapps, the shifts must be sorted so that the +c Upon, entry to snapps, the shifts must be sorted so that the c conjugate pairs are in consecutive locations. c c V Real N by (KEV+NP) array. (INPUT/OUTPUT) @@ -51,7 +51,7 @@ c program. c c H Real (KEV+NP) by (KEV+NP) array. (INPUT/OUTPUT) -c On INPUT, H contains the current KEV+NP by KEV+NP upper +c On INPUT, H contains the current KEV+NP by KEV+NP upper c Hessenber matrix of the Arnoldi factorization. c On OUTPUT, H contains the updated KEV by KEV upper Hessenberg c matrix in the KEV leading submatrix. @@ -62,7 +62,7 @@ c c RESID Real array of length N. (INPUT/OUTPUT) c On INPUT, RESID contains the the residual vector r_{k+p}. -c On OUTPUT, RESID is the update residual vector rnew_{k} +c On OUTPUT, RESID is the update residual vector rnew_{k} c in the first KEV locations. c c Q Real KEV+NP by KEV+NP work array. (WORKSPACE) @@ -97,12 +97,12 @@ c c\Routines called: c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c smout ARPACK utility routine that prints matrices. c svout ARPACK utility routine that prints vectors. c slabad LAPACK routine that computes machine constants. c slacpy LAPACK matrix copy routine. -c slamch LAPACK routine that determines machine constants. +c slamch LAPACK routine that determines machine constants. c slanhs LAPACK routine that computes various norms of a matrix. c slapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. c slarf LAPACK routine that applies Householder reflection to @@ -120,13 +120,13 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.4' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: napps.F SID: 2.4 DATE OF SID: 3/28/97 RELEASE: 2 c c\Remarks @@ -141,15 +141,15 @@ c----------------------------------------------------------------------- c subroutine snapps - & ( n, kev, np, shiftr, shifti, v, ldv, h, ldh, resid, q, ldq, + & ( n, kev, np, shiftr, shifti, v, ldv, h, ldh, resid, q, ldq, & workl, workd ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -162,7 +162,7 @@ subroutine snapps c %-----------------% c Real - & h(ldh,kev+np), resid(n), shifti(np), shiftr(np), + & h(ldh,kev+np), resid(n), shifti(np), shiftr(np), & v(ldv,kev+np), q(ldq,kev+np), workd(2*n), workl(kev+np) c c %------------% @@ -180,16 +180,16 @@ subroutine snapps integer i, iend, ir, istart, j, jj, kplusp, msglvl, nr logical cconj, first Real - & c, f, g, h11, h12, h21, h22, h32, ovfl, r, s, sigmai, + & c, f, g, h11, h12, h21, h22, h32, ovfl, r, s, sigmai, & sigmar, smlnum, ulp, unfl, u(3), t, tau, tst1 - save first, ovfl, smlnum, ulp, unfl + save first, ovfl, smlnum, ulp, unfl c c %----------------------% c | External Subroutines | c %----------------------% c external saxpy, scopy, sscal, slacpy, slarfg, slarf, - & slaset, slabad, second, slartg + & slaset, slabad, arscnd, slartg c c %--------------------% c | External Functions | @@ -206,7 +206,7 @@ subroutine snapps intrinsic abs, max, min c c %----------------% -c | Data statments | +c | Data statements | c %----------------% c data first / .true. / @@ -237,10 +237,10 @@ subroutine snapps c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mnapps - kplusp = kev + np -c + kplusp = kev + np +c c %--------------------------------------------% c | Initialize Q to the identity to accumulate | c | the rotations and reflections | @@ -266,11 +266,11 @@ subroutine snapps sigmai = shifti(jj) c if (msglvl .gt. 2 ) then - call ivout (logfil, 1, jj, ndigit, + call ivout (logfil, 1, [jj], ndigit, & '_napps: shift number.') - call svout (logfil, 1, sigmar, ndigit, + call svout (logfil, 1, [sigmar], ndigit, & '_napps: The real part of the shift ') - call svout (logfil, 1, sigmai, ndigit, + call svout (logfil, 1, [sigmai], ndigit, & '_napps: The imaginary part of the shift ') end if c @@ -335,11 +335,11 @@ subroutine snapps & tst1 = slanhs( '1', kplusp-jj+1, h, ldh, workl ) if( abs( h( i+1,i ) ).le.max( ulp*tst1, smlnum ) ) then if (msglvl .gt. 0) then - call ivout (logfil, 1, i, ndigit, + call ivout (logfil, 1, [i], ndigit, & '_napps: matrix splitting at row/column no.') - call ivout (logfil, 1, jj, ndigit, + call ivout (logfil, 1, [jj], ndigit, & '_napps: matrix splitting with shift number.') - call svout (logfil, 1, h(i+1,i), ndigit, + call svout (logfil, 1, h(i+1,i), ndigit, & '_napps: off diagonal element.') end if iend = i @@ -351,9 +351,9 @@ subroutine snapps 40 continue c if (msglvl .gt. 2) then - call ivout (logfil, 1, istart, ndigit, + call ivout (logfil, 1, [istart], ndigit, & '_napps: Start of current block ') - call ivout (logfil, 1, iend, ndigit, + call ivout (logfil, 1, [iend], ndigit, & '_napps: End of current block ') end if c @@ -368,7 +368,7 @@ subroutine snapps c | complex conjugate pair of shifts on a 2 by 2 matrix. | c %------------------------------------------------------% c - if ( istart + 1 .eq. iend .and. abs( sigmai ) .gt. zero ) + if ( istart + 1 .eq. iend .and. abs( sigmai ) .gt. zero ) & go to 100 c h11 = h(istart,istart) @@ -381,11 +381,11 @@ subroutine snapps c f = h11 - sigmar g = h21 -c +c do 80 i = istart, iend-1 c c %-----------------------------------------------------% -c | Contruct the plane rotation G to zero out the bulge | +c | Construct the plane rotation G to zero out the bulge | c %-----------------------------------------------------% c call slartg (f, g, c, s, r) @@ -413,7 +413,7 @@ subroutine snapps do 50 j = i, kplusp t = c*h(i,j) + s*h(i+1,j) h(i+1,j) = -s*h(i,j) + c*h(i+1,j) - h(i,j) = t + h(i,j) = t 50 continue c c %---------------------------------------------% @@ -423,17 +423,17 @@ subroutine snapps do 60 j = 1, min(i+2,iend) t = c*h(j,i) + s*h(j,i+1) h(j,i+1) = -s*h(j,i) + c*h(j,i+1) - h(j,i) = t + h(j,i) = t 60 continue c c %----------------------------------------------------% c | Accumulate the rotation in the matrix Q; Q <- Q*G | c %----------------------------------------------------% c - do 70 j = 1, min( i+jj, kplusp ) + do 70 j = 1, min( i+jj, kplusp ) t = c*q(j,i) + s*q(j,i+1) q(j,i+1) = - s*q(j,i) + c*q(j,i+1) - q(j,i) = t + q(j,i) = t 70 continue c c %---------------------------% @@ -449,7 +449,7 @@ subroutine snapps c %-----------------------------------% c | Finished applying the real shift. | c %-----------------------------------% -c +c else c c %----------------------------------------------------% @@ -465,9 +465,9 @@ subroutine snapps c %---------------------------------------------------------% c s = 2.0*sigmar - t = slapy2 ( sigmar, sigmai ) + t = slapy2 ( sigmar, sigmai ) u(1) = ( h11 * (h11 - s) + t * t ) / h21 + h12 - u(2) = h11 + h22 - s + u(2) = h11 + h22 - s u(3) = h32 c do 90 i = istart, iend-1 @@ -507,7 +507,7 @@ subroutine snapps c | Accumulate the reflector in the matrix Q; Q <- Q*G | c %-----------------------------------------------------% c - call slarf ('Right', kplusp, nr, u, 1, tau, + call slarf ('Right', kplusp, nr, u, 1, tau, & q(1,i), ldq, workl) c c %----------------------------% @@ -526,7 +526,7 @@ subroutine snapps c | Finished applying a complex pair of shifts | c | to the current block | c %--------------------------------------------% -c +c end if c 100 continue @@ -568,7 +568,7 @@ subroutine snapps tst1 = abs( h( i, i ) ) + abs( h( i+1, i+1 ) ) if( tst1.eq.zero ) & tst1 = slanhs( '1', kev, h, ldh, workl ) - if( h( i+1,i ) .le. max( ulp*tst1, smlnum ) ) + if( h( i+1,i ) .le. max( ulp*tst1, smlnum ) ) & h(i+1,i) = zero 130 continue c @@ -581,9 +581,9 @@ subroutine snapps c %-------------------------------------------------% c if (h(kev+1,kev) .gt. zero) - & call sgemv ('N', n, kplusp, one, v, ldv, q(1,kev+1), 1, zero, + & call sgemv ('N', n, kplusp, one, v, ldv, q(1,kev+1), 1, zero, & workd(n+1), 1) -c +c c %----------------------------------------------------------% c | Compute column 1 to kev of (V*Q) in backward order | c | taking advantage of the upper Hessenberg structure of Q. | @@ -600,14 +600,14 @@ subroutine snapps c %-------------------------------------------------% c call slacpy ('A', n, kev, v(1,kplusp-kev+1), ldv, v, ldv) -c +c c %--------------------------------------------------------------% c | Copy the (kev+1)-st column of (V*Q) in the appropriate place | c %--------------------------------------------------------------% c if (h(kev+1,kev) .gt. zero) & call scopy (n, workd(n+1), 1, v(1,kev+1), 1) -c +c c %-------------------------------------% c | Update the residual vector: | c | r <- sigmak*r + betak*v(:,kev+1) | @@ -625,7 +625,7 @@ subroutine snapps & '_napps: sigmak = (e_{kev+p}^T*Q)*e_{kev}') call svout (logfil, 1, h(kev+1,kev), ndigit, & '_napps: betak = e_{kev+1}^T*H*e_{kev}') - call ivout (logfil, 1, kev, ndigit, + call ivout (logfil, 1, [kev], ndigit, & '_napps: Order of the final Hessenberg matrix ') if (msglvl .gt. 2) then call smout (logfil, kev, kev, h, ldh, ndigit, @@ -633,11 +633,11 @@ subroutine snapps end if c end if -c +c 9000 continue - call second (t1) + call arscnd (t1) tnapps = tnapps + (t1 - t0) -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/snaup2.f b/Toolbox/arpack-src/snaup2.f index 048cd50df..e3be754ea 100644 --- a/Toolbox/arpack-src/snaup2.f +++ b/Toolbox/arpack-src/snaup2.f @@ -2,13 +2,13 @@ c c\Name: snaup2 c -c\Description: +c\Description: c Intermediate level interface called by snaupd. c c\Usage: c call snaup2 c ( IDO, BMAT, N, WHICH, NEV, NP, TOL, RESID, MODE, IUPD, -c ISHIFT, MXITER, V, LDV, H, LDH, RITZR, RITZI, BOUNDS, +c ISHIFT, MXITER, V, LDV, H, LDH, RITZR, RITZI, BOUNDS, c Q, LDQ, WORKL, IPNTR, WORKD, INFO ) c c\Arguments @@ -17,52 +17,52 @@ c MODE, ISHIFT, MXITER: see the definition of IPARAM in snaupd. c c NP Integer. (INPUT/OUTPUT) -c Contains the number of implicit shifts to apply during -c each Arnoldi iteration. -c If ISHIFT=1, NP is adjusted dynamically at each iteration +c Contains the number of implicit shifts to apply during +c each Arnoldi iteration. +c If ISHIFT=1, NP is adjusted dynamically at each iteration c to accelerate convergence and prevent stagnation. -c This is also roughly equal to the number of matrix-vector +c This is also roughly equal to the number of matrix-vector c products (involving the operator OP) per Arnoldi iteration. c The logic for adjusting is contained within the current c subroutine. c If ISHIFT=0, NP is the number of shifts the user needs -c to provide via reverse comunication. 0 < NP < NCV-NEV. +c to provide via reverse communication. 0 < NP < NCV-NEV. c NP may be less than NCV-NEV for two reasons. The first, is -c to keep complex conjugate pairs of "wanted" Ritz values +c to keep complex conjugate pairs of "wanted" Ritz values c together. The second, is that a leading block of the current c upper Hessenberg matrix has split off and contains "unwanted" c Ritz values. -c Upon termination of the IRA iteration, NP contains the number +c Upon termination of the IRA iteration, NP contains the number c of "converged" wanted Ritz values. c c IUPD Integer. (INPUT) c IUPD .EQ. 0: use explicit restart instead implicit update. c IUPD .NE. 0: use implicit update. c -c V Real N by (NEV+NP) array. (INPUT/OUTPUT) -c The Arnoldi basis vectors are returned in the first NEV +c V Real N by (NEV+NP) array. (INPUT/OUTPUT) +c The Arnoldi basis vectors are returned in the first NEV c columns of V. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c -c H Real (NEV+NP) by (NEV+NP) array. (OUTPUT) +c H Real (NEV+NP) by (NEV+NP) array. (OUTPUT) c H is used to store the generated upper Hessenberg matrix c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c -c RITZR, Real arrays of length NEV+NP. (OUTPUT) +c RITZR, Real arrays of length NEV+NP. (OUTPUT) c RITZI RITZR(1:NEV) (resp. RITZI(1:NEV)) contains the real (resp. c imaginary) part of the computed Ritz values of OP. c -c BOUNDS Real array of length NEV+NP. (OUTPUT) -c BOUNDS(1:NEV) contain the error bounds corresponding to +c BOUNDS Real array of length NEV+NP. (OUTPUT) +c BOUNDS(1:NEV) contain the error bounds corresponding to c the computed Ritz values. -c -c Q Real (NEV+NP) by (NEV+NP) array. (WORKSPACE) +c +c Q Real (NEV+NP) by (NEV+NP) array. (WORKSPACE) c Private (replicated) work array used to accumulate the c rotation in the shift application step. c @@ -70,7 +70,7 @@ c Leading dimension of Q exactly as declared in the calling c program. c -c WORKL Real work array of length at least +c WORKL Real work array of length at least c (NEV+NP)**2 + 3*(NEV+NP). (INPUT/WORKSPACE) c Private (replicated) array on each PE or array allocated on c the front end. It is used in shifts calculation, shifts @@ -82,20 +82,20 @@ c listed in the same order as returned from sneigh. c c If ISHIFT .EQ. O and IDO .EQ. 3, the first 2*NP locations -c of WORKL are used in reverse communication to hold the user +c of WORKL are used in reverse communication to hold the user c supplied shifts. c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORKD for +c Pointer to mark the starting locations in the WORKD for c vectors used by the Arnoldi iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in the +c IPNTR(3): pointer to the vector B * X when used in the c shift-and-invert mode. X is the current operand. c ------------------------------------------------------------- -c -c WORKD Real work array of length 3*N. (WORKSPACE) +c +c WORKD Real work array of length 3*N. (WORKSPACE) c Distributed array to be used in the basic Arnoldi iteration c for reverse communication. The user should not use WORKD c as temporary workspace during the iteration !!!!!!!!!! @@ -108,7 +108,7 @@ c Error flag on output. c = 0: Normal return. c = 1: Maximum number of iterations taken. -c All possible eigenvalues of OP has been found. +c All possible eigenvalues of OP has been found. c NP returns the number of converged Ritz values. c = 2: No shifts could be applied. c = -8: Error return from LAPACK eigenvalue calculation; @@ -130,12 +130,12 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: -c sgetv0 ARPACK initial vector generation routine. +c sgetv0 ARPACK initial vector generation routine. c snaitr ARPACK Arnoldi factorization routine. c snapps ARPACK application of implicit shifts routine. c snconv ARPACK convergence of Ritz values routine. @@ -143,25 +143,25 @@ c sngets ARPACK reorder Ritz values and error bounds routine. c ssortc ARPACK sorting routine. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c smout ARPACK utility routine that prints matrices c svout ARPACK utility routine that prints vectors. c slamch LAPACK routine that determines machine constants. c slapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. c scopy Level 1 BLAS that copies one vector to another . -c sdot Level 1 BLAS that computes the scalar product of two vectors. +c sdot Level 1 BLAS that computes the scalar product of two vectors. c snrm2 Level 1 BLAS that computes the norm of a vector. c sswap Level 1 BLAS that swaps two vectors. c c\Author c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas +c Richard Lehoucq CRPC / Rice University +c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c -c\SCCS Information: @(#) +c Rice University +c Houston, Texas +c +c\SCCS Information: @(#) c FILE: naup2.F SID: 2.8 DATE OF SID: 10/17/00 RELEASE: 2 c c\Remarks @@ -172,16 +172,16 @@ c----------------------------------------------------------------------- c subroutine snaup2 - & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, - & ishift, mxiter, v, ldv, h, ldh, ritzr, ritzi, bounds, + & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, + & ishift, mxiter, v, ldv, h, ldh, ritzr, ritzi, bounds, & q, ldq, workl, ipntr, workd, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -200,7 +200,7 @@ subroutine snaup2 integer ipntr(13) Real & bounds(nev+np), h(ldh,nev+np), q(ldq,nev+np), resid(n), - & ritzi(nev+np), ritzr(nev+np), v(ldv,nev+np), + & ritzi(nev+np), ritzr(nev+np), v(ldv,nev+np), & workd(3*n), workl( (nev+np)*(nev+np+3) ) c c %------------% @@ -209,7 +209,7 @@ subroutine snaup2 c Real & one, zero - parameter (one = 1.0E+0, zero = 0.0E+0) + parameter (one = 1.0E+0 , zero = 0.0E+0 ) c c %---------------% c | Local Scalars | @@ -217,12 +217,12 @@ subroutine snaup2 c character wprime*2 logical cnorm , getv0, initv, update, ushift - integer ierr , iter , j , kplusp, msglvl, nconv, + integer ierr , iter , j , kplusp, msglvl, nconv, & nevbef, nev0 , np0 , nptemp, numcnv Real & rnorm , temp , eps23 save cnorm , getv0, initv, update, ushift, - & rnorm , iter , eps23, kplusp, msglvl, nconv , + & rnorm , iter , eps23, kplusp, msglvl, nconv , & nevbef, nev0 , np0 , numcnv c c %-----------------------% @@ -235,8 +235,8 @@ subroutine snaup2 c | External Subroutines | c %----------------------% c - external scopy , sgetv0, snaitr, snconv, sneigh, - & sngets, snapps, svout , ivout , second + external scopy , sgetv0, snaitr, snconv, sneigh, + & sngets, snapps, svout , ivout , arscnd c c %--------------------% c | External Functions | @@ -257,17 +257,17 @@ subroutine snaup2 c %-----------------------% c if (ido .eq. 0) then -c - call second (t0) -c +c + call arscnd (t0) +c msglvl = mnaup2 -c +c c %-------------------------------------% c | Get the machine dependent constant. | c %-------------------------------------% c eps23 = slamch('Epsilon-Machine') - eps23 = eps23**(2.0E+0 / 3.0E+0) + eps23 = eps23**(2.0E+0 / 3.0E+0 ) c nev0 = nev np0 = np @@ -284,7 +284,7 @@ subroutine snaup2 kplusp = nev + np nconv = 0 iter = 0 -c +c c %---------------------------------------% c | Set flags for computing the first NEV | c | steps of the Arnoldi factorization. | @@ -307,7 +307,7 @@ subroutine snaup2 initv = .false. end if end if -c +c c %---------------------------------------------% c | Get a possibly random starting vector and | c | force it into the range of the operator OP. | @@ -324,7 +324,7 @@ subroutine snaup2 if (rnorm .eq. zero) then c c %-----------------------------------------% -c | The initial vector is zero. Error exit. | +c | The initial vector is zero. Error exit. | c %-----------------------------------------% c info = -9 @@ -333,7 +333,7 @@ subroutine snaup2 getv0 = .false. ido = 0 end if -c +c c %-----------------------------------% c | Back from reverse communication : | c | continue with update step | @@ -353,14 +353,14 @@ subroutine snaup2 c %-------------------------------------% c if (cnorm) go to 100 -c +c c %----------------------------------------------------------% c | Compute the first NEV steps of the Arnoldi factorization | c %----------------------------------------------------------% c - call snaitr (ido, bmat, n, 0, nev, mode, resid, rnorm, v, ldv, + call snaitr (ido, bmat, n, 0, nev, mode, resid, rnorm, v, ldv, & h, ldh, ipntr, workd, info) -c +c c %---------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP and possibly B | @@ -374,7 +374,7 @@ subroutine snaup2 info = -9999 go to 1200 end if -c +c c %--------------------------------------------------------------% c | | c | M A I N ARNOLDI I T E R A T I O N L O O P | @@ -382,16 +382,16 @@ subroutine snaup2 c | factorization in place. | c | | c %--------------------------------------------------------------% -c +c 1000 continue c iter = iter + 1 c if (msglvl .gt. 0) then - call ivout (logfil, 1, iter, ndigit, + call ivout (logfil, 1, [iter], ndigit, & '_naup2: **** Start of major iteration number ****') end if -c +c c %-----------------------------------------------------------% c | Compute NP additional steps of the Arnoldi factorization. | c | Adjust NP since NEV might have been updated by last call | @@ -401,9 +401,9 @@ subroutine snaup2 np = kplusp - nev c if (msglvl .gt. 1) then - call ivout (logfil, 1, nev, ndigit, + call ivout (logfil, 1, [nev], ndigit, & '_naup2: The length of the current Arnoldi factorization') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_naup2: Extend the Arnoldi factorization by') end if c @@ -415,10 +415,10 @@ subroutine snaup2 20 continue update = .true. c - call snaitr (ido , bmat, n , nev, np , mode , resid, + call snaitr (ido , bmat, n , nev, np , mode , resid, & rnorm, v , ldv, h , ldh, ipntr, workd, & info) -c +c c %---------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP and possibly B | @@ -435,10 +435,10 @@ subroutine snaup2 update = .false. c if (msglvl .gt. 1) then - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_naup2: Corresponding B-norm of the residual') end if -c +c c %--------------------------------------------------------% c | Compute the eigenvalues and corresponding error bounds | c | of the current upper Hessenberg matrix. | @@ -477,30 +477,30 @@ subroutine snaup2 nev = nev0 np = np0 numcnv = nev - call sngets (ishift, which, nev, np, ritzr, ritzi, + call sngets (ishift, which, nev, np, ritzr, ritzi, & bounds, workl, workl(np+1)) if (nev .eq. nev0+1) numcnv = nev0+1 -c +c c %-------------------% -c | Convergence test. | +c | Convergence test. | c %-------------------% c call scopy (nev, bounds(np+1), 1, workl(2*np+1), 1) - call snconv (nev, ritzr(np+1), ritzi(np+1), workl(2*np+1), + call snconv (nev, ritzr(np+1), ritzi(np+1), workl(2*np+1), & tol, nconv) -c +c if (msglvl .gt. 2) then kp(1) = nev kp(2) = np kp(3) = numcnv kp(4) = nconv - call ivout (logfil, 4, kp, ndigit, + call ivout (logfil, 4, kp, ndigit, & '_naup2: NEV, NP, NUMCNV, NCONV are') call svout (logfil, kplusp, ritzr, ndigit, & '_naup2: Real part of the eigenvalues of H') call svout (logfil, kplusp, ritzi, ndigit, & '_naup2: Imaginary part of the eigenvalues of H') - call svout (logfil, kplusp, bounds, ndigit, + call svout (logfil, kplusp, bounds, ndigit, & '_naup2: Ritz estimates of the current NCV Ritz values') end if c @@ -521,8 +521,8 @@ subroutine snaup2 nev = nev + 1 end if 30 continue -c - if ( (nconv .ge. numcnv) .or. +c + if ( (nconv .ge. numcnv) .or. & (iter .gt. mxiter) .or. & (np .eq. 0) ) then c @@ -536,7 +536,7 @@ subroutine snaup2 & ndigit, & '_naup2: Ritz eistmates computed by _neigh:') end if -c +c c %------------------------------------------------% c | Prepare to exit. Put the converged Ritz values | c | and corresponding bounds in RITZ(1:NCONV) and | @@ -598,7 +598,7 @@ subroutine snaup2 c c %----------------------------------------------------% c | Sort the Ritz values according to the scaled Ritz | -c | esitmates. This will push all the converged ones | +c | estimates. This will push all the converged ones | c | towards the front of ritzr, ritzi, bounds | c | (in the case when NCONV < NEV.) | c %----------------------------------------------------% @@ -635,13 +635,13 @@ subroutine snaup2 end if c c %------------------------------------% -c | Max iterations have been exceeded. | +c | Max iterations have been exceeded. | c %------------------------------------% c if (iter .gt. mxiter .and. nconv .lt. numcnv) info = 1 c c %---------------------% -c | No shifts to apply. | +c | No shifts to apply. | c %---------------------% c if (np .eq. 0 .and. nconv .lt. numcnv) info = 2 @@ -650,7 +650,7 @@ subroutine snaup2 go to 1100 c else if ( (nconv .lt. numcnv) .and. (ishift .eq. 1) ) then -c +c c %-------------------------------------------------% c | Do not have all the requested eigenvalues yet. | c | To prevent possible stagnation, adjust the size | @@ -664,26 +664,38 @@ subroutine snaup2 else if (nev .eq. 1 .and. kplusp .gt. 3) then nev = 2 end if +c %---- Scipy fix ------------------------------------------------ +c | We must keep nev below this value, as otherwise we can get +c | np == 0 (note that sngets below can bump nev by 1). If np == 0, +c | the next call to `snaitr` will write out-of-bounds. +c | + if (nev .gt. kplusp - 2) then + nev = kplusp - 2 + end if +c | +c %---- Scipy fix end -------------------------------------------- + +c np = kplusp - nev -c +c c %---------------------------------------% c | If the size of NEV was just increased | c | resort the eigenvalues. | c %---------------------------------------% -c - if (nevbef .lt. nev) - & call sngets (ishift, which, nev, np, ritzr, ritzi, +c + if (nevbef .lt. nev) + & call sngets (ishift, which, nev, np, ritzr, ritzi, & bounds, workl, workl(np+1)) c - end if -c + end if +c if (msglvl .gt. 0) then - call ivout (logfil, 1, nconv, ndigit, + call ivout (logfil, 1, [nconv], ndigit, & '_naup2: no. of "converged" Ritz values at this iter.') if (msglvl .gt. 1) then kp(1) = nev kp(2) = np - call ivout (logfil, 2, kp, ndigit, + call ivout (logfil, 2, kp, ndigit, & '_naup2: NEV and NP are') call svout (logfil, nev, ritzr(np+1), ndigit, & '_naup2: "wanted" Ritz values -- real part') @@ -697,7 +709,7 @@ subroutine snaup2 if (ishift .eq. 0) then c c %-------------------------------------------------------% -c | User specified shifts: reverse comminucation to | +c | User specified shifts: reverse communication to | c | compute the shifts. They are returned in the first | c | 2*NP locations of WORKL. | c %-------------------------------------------------------% @@ -706,7 +718,7 @@ subroutine snaup2 ido = 3 go to 9000 end if -c +c 50 continue c c %------------------------------------% @@ -718,7 +730,7 @@ subroutine snaup2 ushift = .false. c if ( ishift .eq. 0 ) then -c +c c %----------------------------------% c | Move the NP shifts from WORKL to | c | RITZR, RITZI to free up WORKL | @@ -729,14 +741,14 @@ subroutine snaup2 call scopy (np, workl(np+1), 1, ritzi, 1) end if c - if (msglvl .gt. 2) then - call ivout (logfil, 1, np, ndigit, + if (msglvl .gt. 2) then + call ivout (logfil, 1, [np], ndigit, & '_naup2: The number of shifts to apply ') call svout (logfil, np, ritzr, ndigit, & '_naup2: Real part of the shifts') call svout (logfil, np, ritzi, ndigit, & '_naup2: Imaginary part of the shifts') - if ( ishift .eq. 1 ) + if ( ishift .eq. 1 ) & call svout (logfil, np, bounds, ndigit, & '_naup2: Ritz estimates of the shifts') end if @@ -748,7 +760,7 @@ subroutine snaup2 c | The first 2*N locations of WORKD are used as workspace. | c %---------------------------------------------------------% c - call snapps (n, nev, np, ritzr, ritzi, v, ldv, + call snapps (n, nev, np, ritzr, ritzi, v, ldv, & h, ldh, resid, q, ldq, workl, workd) c c %---------------------------------------------% @@ -758,36 +770,36 @@ subroutine snaup2 c %---------------------------------------------% c cnorm = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call scopy (n, resid, 1, workd(n+1), 1) ipntr(1) = n + 1 ipntr(2) = 1 ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*RESID | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call scopy (n, resid, 1, workd, 1) end if -c +c 100 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(1:N) := B*RESID | c %----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c - if (bmat .eq. 'G') then +c + if (bmat .eq. 'G') then rnorm = sdot (n, resid, 1, workd, 1) rnorm = sqrt(abs(rnorm)) else if (bmat .eq. 'I') then @@ -796,12 +808,12 @@ subroutine snaup2 cnorm = .false. c if (msglvl .gt. 2) then - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_naup2: B-norm of residual for compressed factorization') call smout (logfil, nev, nev, h, ldh, ndigit, & '_naup2: Compressed upper Hessenberg matrix H') end if -c +c go to 1000 c c %---------------------------------------------------------------% @@ -814,7 +826,7 @@ subroutine snaup2 c mxiter = iter nev = numcnv -c +c 1200 continue ido = 99 c @@ -822,9 +834,9 @@ subroutine snaup2 c | Error Exit | c %------------% c - call second (t1) + call arscnd (t1) tnaup2 = t1 - t0 -c +c 9000 continue c c %---------------% diff --git a/Toolbox/arpack-src/snaupd.f b/Toolbox/arpack-src/snaupd.f index 76592ad2c..d6fad3386 100644 --- a/Toolbox/arpack-src/snaupd.f +++ b/Toolbox/arpack-src/snaupd.f @@ -2,19 +2,19 @@ c c\Name: snaupd c -c\Description: +c\Description: c Reverse communication interface for the Implicitly Restarted Arnoldi -c iteration. This subroutine computes approximations to a few eigenpairs -c of a linear operator "OP" with respect to a semi-inner product defined by -c a symmetric positive semi-definite real matrix B. B may be the identity -c matrix. NOTE: If the linear operator "OP" is real and symmetric -c with respect to the real positive semi-definite symmetric matrix B, +c iteration. This subroutine computes approximations to a few eigenpairs +c of a linear operator "OP" with respect to a semi-inner product defined by +c a symmetric positive semi-definite real matrix B. B may be the identity +c matrix. NOTE: If the linear operator "OP" is real and symmetric +c with respect to the real positive semi-definite symmetric matrix B, c i.e. B*OP = (OP`)*B, then subroutine ssaupd should be used instead. c c The computed approximate eigenvalues are called Ritz values and c the corresponding approximate eigenvectors are called Ritz vectors. c -c snaupd is usually called iteratively to solve one of the +c snaupd is usually called iteratively to solve one of the c following problems: c c Mode 1: A*x = lambda*x. @@ -25,18 +25,18 @@ c ===> (If M can be factored see remark 3 below) c c Mode 3: A*x = lambda*M*x, M symmetric semi-definite -c ===> OP = Real_Part{ inv[A - sigma*M]*M } and B = M. +c ===> OP = Real_Part{ inv[A - sigma*M]*M } and B = M. c ===> shift-and-invert mode (in real arithmetic) -c If OP*x = amu*x, then +c If OP*x = amu*x, then c amu = 1/2 * [ 1/(lambda-sigma) + 1/(lambda-conjg(sigma)) ]. c Note: If sigma is real, i.e. imaginary part of sigma is zero; -c Real_Part{ inv[A - sigma*M]*M } == inv[A - sigma*M]*M -c amu == 1/(lambda-sigma). -c +c Real_Part{ inv[A - sigma*M]*M } == inv[A - sigma*M]*M +c amu == 1/(lambda-sigma). +c c Mode 4: A*x = lambda*M*x, M symmetric semi-definite -c ===> OP = Imaginary_Part{ inv[A - sigma*M]*M } and B = M. +c ===> OP = Imaginary_Part{ inv[A - sigma*M]*M } and B = M. c ===> shift-and-invert mode (in real arithmetic) -c If OP*x = amu*x, then +c If OP*x = amu*x, then c amu = 1/2i * [ 1/(lambda-sigma) - 1/(lambda-conjg(sigma)) ]. c c Both mode 3 and 4 give the same enhancement to eigenvalues close to @@ -63,7 +63,7 @@ c c\Arguments c IDO Integer. (INPUT/OUTPUT) -c Reverse communication flag. IDO must be zero on the first +c Reverse communication flag. IDO must be zero on the first c call to snaupd. IDO will be set internally to c indicate the type of operation to be performed. Control is c then given back to the calling routine which has the @@ -86,13 +86,13 @@ c IDO = 2: compute Y = B * X where c IPNTR(1) is the pointer into WORKD for X, c IPNTR(2) is the pointer into WORKD for Y. -c IDO = 3: compute the IPARAM(8) real and imaginary parts +c IDO = 3: compute the IPARAM(8) real and imaginary parts c of the shifts where INPTR(14) is the pointer c into WORKL for placing the shifts. See Remark c 5 below. c IDO = 99: done c ------------------------------------------------------------- -c +c c BMAT Character*1. (INPUT) c BMAT specifies the type of the matrix B that defines the c semi-inner product for the operator OP. @@ -110,18 +110,18 @@ c 'LI' -> want the NEV eigenvalues of largest imaginary part. c 'SI' -> want the NEV eigenvalues of smallest imaginary part. c -c NEV Integer. (INPUT/OUTPUT) +c NEV Integer. (INPUT) c Number of eigenvalues of OP to be computed. 0 < NEV < N-1. c -c TOL Real scalar. (INPUT) -c Stopping criterion: the relative accuracy of the Ritz value +c TOL Real scalar. (INPUT) +c Stopping criterion: the relative accuracy of the Ritz value c is considered acceptable if BOUNDS(I) .LE. TOL*ABS(RITZ(I)) c where ABS(RITZ(I)) is the magnitude when RITZ(I) is complex. c DEFAULT = SLAMCH('EPS') (machine precision as computed c by the LAPACK auxiliary subroutine SLAMCH). c -c RESID Real array of length N. (INPUT/OUTPUT) -c On INPUT: +c RESID Real array of length N. (INPUT/OUTPUT) +c On INPUT: c If INFO .EQ. 0, a random initial residual vector is used. c If INFO .NE. 0, RESID contains the initial residual vector, c possibly from a previous run. @@ -131,17 +131,17 @@ c NCV Integer. (INPUT) c Number of columns of the matrix V. NCV must satisfy the two c inequalities 2 <= NCV-NEV and NCV <= N. -c This will indicate how many Arnoldi vectors are generated -c at each iteration. After the startup phase in which NEV -c Arnoldi vectors are generated, the algorithm generates -c approximately NCV-NEV Arnoldi vectors at each subsequent update -c iteration. Most of the cost in generating each Arnoldi vector is -c in the matrix-vector operation OP*x. -c NOTE: 2 <= NCV-NEV in order that complex conjugate pairs of Ritz +c This will indicate how many Arnoldi vectors are generated +c at each iteration. After the startup phase in which NEV +c Arnoldi vectors are generated, the algorithm generates +c approximately NCV-NEV Arnoldi vectors at each subsequent update +c iteration. Most of the cost in generating each Arnoldi vector is +c in the matrix-vector operation OP*x. +c NOTE: 2 <= NCV-NEV in order that complex conjugate pairs of Ritz c values are kept together. (See remark 4 below) c -c V Real array N by NCV. (OUTPUT) -c Contains the final set of Arnoldi basis vectors. +c V Real array N by NCV. (OUTPUT) +c Contains the final set of Arnoldi basis vectors. c c LDV Integer. (INPUT) c Leading dimension of V exactly as declared in the calling program. @@ -154,11 +154,11 @@ c ISHIFT = 0: the shifts are provided by the user via c reverse communication. The real and imaginary c parts of the NCV eigenvalues of the Hessenberg -c matrix H are returned in the part of the WORKL -c array corresponding to RITZR and RITZI. See remark +c matrix H are returned in the part of the WORKL +c array corresponding to RITZR and RITZI. See remark c 5 below. c ISHIFT = 1: exact shifts with respect to the current -c Hessenberg matrix H. This is equivalent to +c Hessenberg matrix H. This is equivalent to c restarting the iteration with a starting vector c that is a linear combination of approximate Schur c vectors associated with the "wanted" Ritz values. @@ -167,8 +167,8 @@ c IPARAM(2) = No longer referenced. c c IPARAM(3) = MXITER -c On INPUT: maximum number of Arnoldi update iterations allowed. -c On OUTPUT: actual number of Arnoldi update iterations taken. +c On INPUT: maximum number of Arnoldi update iterations allowed. +c On OUTPUT: actual number of Arnoldi update iterations taken. c c IPARAM(4) = NB: blocksize to be used in the recurrence. c The code currently works only for NB = 1. @@ -178,11 +178,11 @@ c the convergence criterion. c c IPARAM(6) = IUPD -c No longer referenced. Implicit restarting is ALWAYS used. +c No longer referenced. Implicit restarting is ALWAYS used. c c IPARAM(7) = MODE c On INPUT determines what type of eigenproblem is being solved. -c Must be 1,2,3,4; See under \Description of snaupd for the +c Must be 1,2,3,4; See under \Description of snaupd for the c four modes available. c c IPARAM(8) = NP @@ -194,7 +194,7 @@ c IPARAM(9) = NUMOP, IPARAM(10) = NUMOPB, IPARAM(11) = NUMREO, c OUTPUT: NUMOP = total number of OP*x operations, c NUMOPB = total number of B*x operations if BMAT='G', -c NUMREO = total number of steps of re-orthogonalization. +c NUMREO = total number of steps of re-orthogonalization. c c IPNTR Integer array of length 14. (OUTPUT) c Pointer to mark the starting locations in the WORKD and WORKL @@ -202,13 +202,13 @@ c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X in WORKD. c IPNTR(2): pointer to the current result vector Y in WORKD. -c IPNTR(3): pointer to the vector B * X in WORKD when used in +c IPNTR(3): pointer to the vector B * X in WORKD when used in c the shift-and-invert mode. c IPNTR(4): pointer to the next available location in WORKL c that is untouched by the program. c IPNTR(5): pointer to the NCV by NCV upper Hessenberg matrix c H in WORKL. -c IPNTR(6): pointer to the real part of the ritz value array +c IPNTR(6): pointer to the real part of the ritz value array c RITZR in WORKL. c IPNTR(7): pointer to the imaginary part of the ritz value array c RITZI in WORKL. @@ -219,9 +219,9 @@ c c Note: IPNTR(9:13) is only referenced by sneupd. See Remark 2 below. c -c IPNTR(9): pointer to the real part of the NCV RITZ values of the +c IPNTR(9): pointer to the real part of the NCV RITZ values of the c original system. -c IPNTR(10): pointer to the imaginary part of the NCV RITZ values of +c IPNTR(10): pointer to the imaginary part of the NCV RITZ values of c the original system. c IPNTR(11): pointer to the NCV corresponding error bounds. c IPNTR(12): pointer to the NCV by NCV upper quasi-triangular @@ -230,17 +230,17 @@ c of the upper Hessenberg matrix H. Only referenced by c sneupd if RVEC = .TRUE. See Remark 2 below. c ------------------------------------------------------------- -c -c WORKD Real work array of length 3*N. (REVERSE COMMUNICATION) +c +c WORKD Real work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The user should not use WORKD +c for reverse communication. The user should not use WORKD c as temporary workspace during the iteration. Upon termination c WORKD(1:N) contains B*RESID(1:N). If an invariant subspace c associated with the converged Ritz values is desired, see remark c 2 below, subroutine sneupd uses this output. -c See Data Distribution Note below. +c See Data Distribution Note below. c -c WORKL Real work array of length LWORKL. (OUTPUT/WORKSPACE) +c WORKL Real work array of length LWORKL. (OUTPUT/WORKSPACE) c Private (replicated) array on each PE or array allocated on c the front end. See Data Distribution Note below. c @@ -254,18 +254,18 @@ c Error flag on output. c = 0: Normal exit. c = 1: Maximum number of iterations taken. -c All possible eigenvalues of OP has been found. IPARAM(5) +c All possible eigenvalues of OP has been found. IPARAM(5) c returns the number of wanted converged Ritz values. c = 2: No longer an informational error. Deprecated starting c with release 2 of ARPACK. -c = 3: No shifts could be applied during a cycle of the -c Implicitly restarted Arnoldi iteration. One possibility -c is to increase the size of NCV relative to NEV. +c = 3: No shifts could be applied during a cycle of the +c Implicitly restarted Arnoldi iteration. One possibility +c is to increase the size of NCV relative to NEV. c See remark 4 below. c = -1: N must be positive. c = -2: NEV must be positive. c = -3: NCV-NEV >= 2 and less than or equal to N. -c = -4: The maximum number of Arnoldi update iteration +c = -4: The maximum number of Arnoldi update iteration c must be greater than zero. c = -5: WHICH must be one of 'LM', 'SM', 'LR', 'SR', 'LI', 'SI' c = -6: BMAT must be one of 'I' or 'G'. @@ -273,7 +273,7 @@ c = -8: Error return from LAPACK eigenvalue calculation; c = -9: Starting vector is zero. c = -10: IPARAM(7) must be 1,2,3,4. -c = -11: IPARAM(7) = 1 and BMAT = 'G' are incompatable. +c = -11: IPARAM(7) = 1 and BMAT = 'G' are incompatible. c = -12: IPARAM(1) must be equal to 0 or 1. c = -9999: Could not build an Arnoldi factorization. c IPARAM(5) returns the size of the current Arnoldi @@ -285,31 +285,31 @@ c Mode = 3 and 4. After convergence, approximate eigenvalues of the c original problem may be obtained with the ARPACK subroutine sneupd. c -c 2. If a basis for the invariant subspace corresponding to the converged Ritz -c values is needed, the user must call sneupd immediately following +c 2. If a basis for the invariant subspace corresponding to the converged Ritz +c values is needed, the user must call sneupd immediately following c completion of snaupd. This is new starting with release 2 of ARPACK. c c 3. If M can be factored into a Cholesky factorization M = LL` c then Mode = 2 should not be selected. Instead one should use -c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular +c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular c linear systems should be solved with L and L` rather c than computing inverses. After convergence, an approximate c eigenvector z of the original problem is recovered by solving c L`z = x where x is a Ritz vector of OP. c c 4. At present there is no a-priori analysis to guide the selection -c of NCV relative to NEV. The only formal requrement is that NCV > NEV + 2. +c of NCV relative to NEV. The only formal requirement is that NCV > NEV + 2. c However, it is recommended that NCV .ge. 2*NEV+1. If many problems of c the same type are to be solved, one should experiment with increasing -c NCV while keeping NEV fixed for a given test problem. This will +c NCV while keeping NEV fixed for a given test problem. This will c usually decrease the required number of OP*x operations but it c also increases the work and storage required to maintain the orthogonal c basis vectors. The optimal "cross-over" with respect to CPU time -c is problem dependent and must be determined empirically. +c is problem dependent and must be determined empirically. c See Chapter 8 of Reference 2 for further information. c -c 5. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the -c NP = IPARAM(8) real and imaginary parts of the shifts in locations +c 5. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the +c NP = IPARAM(8) real and imaginary parts of the shifts in locations c real part imaginary part c ----------------------- -------------- c 1 WORKL(IPNTR(14)) WORKL(IPNTR(14)+NP) @@ -319,10 +319,10 @@ c . . c NP WORKL(IPNTR(14)+NP-1) WORKL(IPNTR(14)+2*NP-1). c -c Only complex conjugate pairs of shifts may be applied and the pairs -c must be placed in consecutive locations. The real part of the -c eigenvalues of the current upper Hessenberg matrix are located in -c WORKL(IPNTR(6)) through WORKL(IPNTR(6)+NCV-1) and the imaginary part +c Only complex conjugate pairs of shifts may be applied and the pairs +c must be placed in consecutive locations. The real part of the +c eigenvalues of the current upper Hessenberg matrix are located in +c WORKL(IPNTR(6)) through WORKL(IPNTR(6)+NCV-1) and the imaginary part c in WORKL(IPNTR(7)) through WORKL(IPNTR(7)+NCV-1). They are ordered c according to the order defined by WHICH. The complex conjugate c pairs are kept together and the associated Ritz estimates are located in @@ -330,11 +330,11 @@ c c----------------------------------------------------------------------- c -c\Data Distribution Note: +c\Data Distribution Note: c c Fortran-D syntax: c ================ -c Real resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) +c Real resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) c decompose d1(n), d2(n,ncv) c align resid(i) with d1(i) c align v(i,j) with d2(i,j) @@ -346,13 +346,13 @@ c c Cray MPP syntax: c =============== -c Real resid(n), v(ldv,ncv), workd(n,3), workl(lworkl) +c Real resid(n), v(ldv,ncv), workd(n,3), workl(lworkl) c shared resid(block), v(block,:), workd(block,:) c replicated workl(lworkl) -c +c c CM2/CM5 syntax: c ============== -c +c c----------------------------------------------------------------------- c c include 'ex-nonsym.doc' @@ -368,7 +368,7 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett & Y. Saad, "Complex Shift and Invert Strategies for @@ -379,7 +379,7 @@ c snaup2 ARPACK routine that implements the Implicitly Restarted c Arnoldi Iteration. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c svout ARPACK utility routine that prints vectors. c slamch LAPACK routine that determines machine constants. c @@ -388,14 +388,14 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: c 12/16/93: Version '1.1' c -c\SCCS Information: @(#) -c FILE: naupd.F SID: 2.10 DATE OF SID: 08/23/02 RELEASE: 2 +c\SCCS Information: @(#) +c FILE: naupd.F SID: 2.8 DATE OF SID: 04/10/01 RELEASE: 2 c c\Remarks c @@ -404,15 +404,15 @@ c----------------------------------------------------------------------- c subroutine snaupd - & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, + & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, & ipntr, workd, workl, lworkl, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -437,13 +437,13 @@ subroutine snaupd c Real & one, zero - parameter (one = 1.0E+0, zero = 0.0E+0) + parameter (one = 1.0E+0 , zero = 0.0E+0 ) c c %---------------% c | Local Scalars | c %---------------% c - integer bounds, ierr, ih, iq, ishift, iupd, iw, + integer bounds, ierr, ih, iq, ishift, iupd, iw, & ldh, ldq, levec, mode, msglvl, mxiter, nb, & nev0, next, np, ritzi, ritzr, j save bounds, ih, iq, ishift, iupd, iw, ldh, ldq, @@ -454,7 +454,7 @@ subroutine snaupd c | External Subroutines | c %----------------------% c - external snaup2, svout, ivout, second, sstatn + external snaup2, svout, ivout, arscnd, sstatn c c %--------------------% c | External Functions | @@ -467,16 +467,16 @@ subroutine snaupd c %-----------------------% c | Executable Statements | c %-----------------------% -c +c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c call sstatn - call second (t0) + call arscnd (t0) msglvl = mnaupd c c %----------------% @@ -498,13 +498,13 @@ subroutine snaupd mode = iparam(7) c if (n .le. 0) then - ierr = -1 + ierr = -1 else if (nev .le. 0) then - ierr = -2 + ierr = -2 else if (ncv .le. nev+1 .or. ncv .gt. n) then - ierr = -3 - else if (mxiter .le. 0) then - ierr = 4 + ierr = -3 + else if (mxiter .le. 0) then + ierr = -4 else if (which .ne. 'LM' .and. & which .ne. 'SM' .and. & which .ne. 'LR' .and. @@ -517,13 +517,13 @@ subroutine snaupd else if (lworkl .lt. 3*ncv**2 + 6*ncv) then ierr = -7 else if (mode .lt. 1 .or. mode .gt. 4) then - ierr = -10 + ierr = -10 else if (mode .eq. 1 .and. bmat .eq. 'G') then - ierr = -11 + ierr = -11 else if (ishift .lt. 0 .or. ishift .gt. 1) then - ierr = -12 + ierr = -12 end if -c +c c %------------% c | Error Exit | c %------------% @@ -533,7 +533,7 @@ subroutine snaupd ido = 99 go to 9000 end if -c +c c %------------------------% c | Set default parameters | c %------------------------% @@ -549,8 +549,8 @@ subroutine snaupd c %----------------------------------------------% c np = ncv - nev - nev0 = nev -c + nev0 = nev +c c %-----------------------------% c | Zero out internal workspace | c %-----------------------------% @@ -558,7 +558,7 @@ subroutine snaupd do 10 j = 1, 3*ncv**2 + 6*ncv workl(j) = zero 10 continue -c +c c %-------------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, BOUNDS, Q | c | etc... and the remaining workspace. | @@ -591,7 +591,7 @@ subroutine snaupd ipntr(6) = ritzr ipntr(7) = ritzi ipntr(8) = bounds - ipntr(14) = iw + ipntr(14) = iw c end if c @@ -599,12 +599,12 @@ subroutine snaupd c | Carry out the Implicitly restarted Arnoldi Iteration. | c %-------------------------------------------------------% c - call snaup2 + call snaup2 & ( ido, bmat, n, which, nev0, np, tol, resid, mode, iupd, - & ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritzr), - & workl(ritzi), workl(bounds), workl(iq), ldq, workl(iw), + & ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritzr), + & workl(ritzi), workl(bounds), workl(iq), ldq, workl(iw), & ipntr, workd, info ) -c +c c %--------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP or shifts. | @@ -612,7 +612,7 @@ subroutine snaupd c if (ido .eq. 3) iparam(8) = np if (ido .ne. 99) go to 9000 -c +c iparam(3) = mxiter iparam(5) = np iparam(9) = nopx @@ -628,19 +628,19 @@ subroutine snaupd if (info .eq. 2) info = 3 c if (msglvl .gt. 0) then - call ivout (logfil, 1, mxiter, ndigit, + call ivout (logfil, 1, [mxiter], ndigit, & '_naupd: Number of update iterations taken') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_naupd: Number of wanted "converged" Ritz values') - call svout (logfil, np, workl(ritzr), ndigit, + call svout (logfil, np, workl(ritzr), ndigit, & '_naupd: Real part of the final Ritz values') - call svout (logfil, np, workl(ritzi), ndigit, + call svout (logfil, np, workl(ritzi), ndigit, & '_naupd: Imaginary part of the final Ritz values') - call svout (logfil, np, workl(bounds), ndigit, + call svout (logfil, np, workl(bounds), ndigit, & '_naupd: Associated Ritz estimates') end if c - call second (t1) + call arscnd (t1) tnaupd = t1 - t0 c if (msglvl .gt. 0) then @@ -656,8 +656,8 @@ subroutine snaupd 1000 format (//, & 5x, '=============================================',/ & 5x, '= Nonsymmetric implicit Arnoldi update code =',/ - & 5x, '= Version Number: ', ' 2.4', 21x, ' =',/ - & 5x, '= Version Date: ', ' 07/31/96', 16x, ' =',/ + & 5x, '= Version Number: ', ' 2.4' , 21x, ' =',/ + & 5x, '= Version Date: ', ' 07/31/96' , 16x, ' =',/ & 5x, '=============================================',/ & 5x, '= Summary of timing statistics =',/ & 5x, '=============================================',//) diff --git a/Toolbox/arpack-src/snconv.f b/Toolbox/arpack-src/snconv.f index 7194c7584..af94700a9 100644 --- a/Toolbox/arpack-src/snconv.f +++ b/Toolbox/arpack-src/snconv.f @@ -3,7 +3,7 @@ c c\Name: snconv c -c\Description: +c\Description: c Convergence testing for the nonsymmetric Arnoldi eigenvalue routine. c c\Usage: @@ -38,22 +38,22 @@ c xxxxxx real c c\Routines called: -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c slamch LAPACK routine that determines machine constants. c slapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. c c\Author c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University +c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.1' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: nconv.F SID: 2.3 DATE OF SID: 4/20/96 RELEASE: 2 c c\Remarks @@ -69,8 +69,8 @@ subroutine snconv (n, ritzr, ritzi, bounds, tol, nconv) c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -106,7 +106,7 @@ subroutine snconv (n, ritzr, ritzi, bounds, tol, nconv) c %-----------------------% c | Executable Statements | c %-----------------------% -c +c c %-------------------------------------------------------------% c | Convergence test: unlike in the symmetric code, I am not | c | using things like refined error bounds and gap condition | @@ -119,7 +119,7 @@ subroutine snconv (n, ritzr, ritzi, bounds, tol, nconv) c | for some appropriate choice of norm. | c %-------------------------------------------------------------% c - call second (t0) + call arscnd (t0) c c %---------------------------------% c | Get machine dependent constant. | @@ -133,10 +133,10 @@ subroutine snconv (n, ritzr, ritzi, bounds, tol, nconv) temp = max( eps23, slapy2( ritzr(i), ritzi(i) ) ) if (bounds(i) .le. tol*temp) nconv = nconv + 1 20 continue -c - call second (t1) +c + call arscnd (t1) tnconv = tnconv + (t1 - t0) -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/sneigh.f b/Toolbox/arpack-src/sneigh.f index 96ae87ff2..7ffb48658 100644 --- a/Toolbox/arpack-src/sneigh.f +++ b/Toolbox/arpack-src/sneigh.f @@ -13,7 +13,7 @@ c c\Arguments c RNORM Real scalar. (INPUT) -c Residual norm corresponding to the current upper Hessenberg +c Residual norm corresponding to the current upper Hessenberg c matrix H. c c N Integer. (INPUT) @@ -27,13 +27,13 @@ c program. c c RITZR, Real arrays of length N. (OUTPUT) -c RITZI On output, RITZR(1:N) (resp. RITZI(1:N)) contains the real +c RITZI On output, RITZR(1:N) (resp. RITZI(1:N)) contains the real c (respectively imaginary) parts of the eigenvalues of H. c c BOUNDS Real array of length N. (OUTPUT) c On output, BOUNDS contains the Ritz estimates associated with -c the eigenvalues RITZR and RITZI. This is equal to RNORM -c times the last components of the eigenvectors corresponding +c the eigenvalues RITZR and RITZI. This is equal to RNORM +c times the last components of the eigenvectors corresponding c to the eigenvalues in RITZR and RITZI. c c Q Real N by N array. (WORKSPACE) @@ -49,7 +49,7 @@ c of H and also in the calculation of the eigenvectors of H. c c IERR Integer. (OUTPUT) -c Error exit flag from slaqrb or strevc. +c Error exit flag from slahqr or strevc. c c\EndDoc c @@ -61,9 +61,9 @@ c xxxxxx real c c\Routines called: -c slaqrb ARPACK routine to compute the real Schur form of an +c slahqr LAPACK routine to compute the real Schur form of an c upper Hessenberg matrix and last row of the Schur vectors. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c smout ARPACK utility routine that prints matrices c svout ARPACK utility routine that prints vectors. c slacpy LAPACK matrix copy routine. @@ -74,20 +74,20 @@ c scopy Level 1 BLAS that copies one vector to another . c snrm2 Level 1 BLAS that computes the norm of a vector. c sscal Level 1 BLAS that scales a vector. -c +c c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.1' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: neigh.F SID: 2.3 DATE OF SID: 4/20/96 RELEASE: 2 c c\Remarks @@ -97,54 +97,54 @@ c c----------------------------------------------------------------------- c - subroutine sneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, + subroutine sneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, & q, ldq, workl, ierr) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | c %------------------% c integer ierr, n, ldh, ldq - Real + Real & rnorm c c %-----------------% c | Array Arguments | c %-----------------% c - Real + Real & bounds(n), h(ldh,n), q(ldq,n), ritzi(n), ritzr(n), & workl(n*(n+3)) -c +c c %------------% c | Parameters | c %------------% c - Real + Real & one, zero parameter (one = 1.0E+0, zero = 0.0E+0) -c +c c %------------------------% c | Local Scalars & Arrays | c %------------------------% c logical select(1) integer i, iconj, msglvl - Real + Real & temp, vl(1) c c %----------------------% c | External Subroutines | c %----------------------% c - external scopy, slacpy, slaqrb, strevc, svout, second + external scopy, slacpy, slahqr, strevc, svout, arscnd c c %--------------------% c | External Functions | @@ -170,25 +170,29 @@ subroutine sneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mneigh -c +c if (msglvl .gt. 2) then - call smout (logfil, n, n, h, ldh, ndigit, + call smout (logfil, n, n, h, ldh, ndigit, & '_neigh: Entering upper Hessenberg matrix H ') end if -c +c c %-----------------------------------------------------------% c | 1. Compute the eigenvalues, the last components of the | c | corresponding Schur vectors and the full Schur form T | c | of the current upper Hessenberg matrix H. | -c | slaqrb returns the full Schur form of H in WORKL(1:N**2) | +c | slahqr returns the full Schur form of H in WORKL(1:N**2) | c | and the last components of the Schur vectors in BOUNDS. | c %-----------------------------------------------------------% c call slacpy ('All', n, n, h, ldh, workl, n) - call slaqrb (.true., n, 1, n, workl, n, ritzr, ritzi, bounds, - & ierr) + do 5 j = 1, n-1 + bounds(j) = zero + 5 continue + bounds(n) = one + call slahqr(.true., .true., n, 1, n, workl, n, ritzr, ritzi, 1, 1, + & bounds, 1, ierr) if (ierr .ne. 0) go to 9000 c if (msglvl .gt. 1) then @@ -227,7 +231,7 @@ subroutine sneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, c %----------------------% c | Real eigenvalue case | c %----------------------% -c +c temp = snrm2( n, q(1,i), 1 ) call sscal ( n, one / temp, q(1,i), 1 ) else @@ -241,7 +245,7 @@ subroutine sneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, c %-------------------------------------------% c if (iconj .eq. 0) then - temp = slapy2( snrm2( n, q(1,i), 1 ), + temp = slapy2( snrm2( n, q(1,i), 1 ), & snrm2( n, q(1,i+1), 1 ) ) call sscal ( n, one / temp, q(1,i), 1 ) call sscal ( n, one / temp, q(1,i+1), 1 ) @@ -249,7 +253,7 @@ subroutine sneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, else iconj = 0 end if - end if + end if 10 continue c call sgemv ('T', n, n, one, q, ldq, bounds, 1, zero, workl, 1) @@ -270,7 +274,7 @@ subroutine sneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, c %----------------------% c | Real eigenvalue case | c %----------------------% -c +c bounds(i) = rnorm * abs( workl(i) ) else c @@ -301,7 +305,7 @@ subroutine sneigh (rnorm, n, h, ldh, ritzr, ritzi, bounds, & '_neigh: Ritz estimates for the eigenvalues of H') end if c - call second (t1) + call arscnd (t1) tneigh = tneigh + (t1 - t0) c 9000 continue diff --git a/Toolbox/arpack-src/sneupd.f b/Toolbox/arpack-src/sneupd.f index 890140b80..1c2c7ce16 100644 --- a/Toolbox/arpack-src/sneupd.f +++ b/Toolbox/arpack-src/sneupd.f @@ -2,7 +2,7 @@ c c\Name: sneupd c -c\Description: +c\Description: c c This subroutine returns the converged approximations to eigenvalues c of A*z = lambda*B*z and (optionally): @@ -28,34 +28,34 @@ c invariant subspace corresponding to these Ritz values is referred to as a c Schur basis. c -c See documentation in the header of the subroutine SNAUPD for +c See documentation in the header of the subroutine SNAUPD for c definition of OP as well as other terms and the relation of computed c Ritz values and Ritz vectors of OP with respect to the given problem -c A*z = lambda*B*z. For a brief description, see definitions of +c A*z = lambda*B*z. For a brief description, see definitions of c IPARAM(7), MODE and WHICH in the documentation of SNAUPD. c c\Usage: -c call sneupd -c ( RVEC, HOWMNY, SELECT, DR, DI, Z, LDZ, SIGMAR, SIGMAI, WORKEV, BMAT, -c N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, WORKL, +c call sneupd +c ( RVEC, HOWMNY, SELECT, DR, DI, Z, LDZ, SIGMAR, SIGMAI, WORKEV, BMAT, +c N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, WORKL, c LWORKL, INFO ) c c\Arguments: -c RVEC LOGICAL (INPUT) -c Specifies whether a basis for the invariant subspace corresponding -c to the converged Ritz value approximations for the eigenproblem +c RVEC LOGICAL (INPUT) +c Specifies whether a basis for the invariant subspace corresponding +c to the converged Ritz value approximations for the eigenproblem c A*z = lambda*B*z is computed. c c RVEC = .FALSE. Compute Ritz values only. c c RVEC = .TRUE. Compute the Ritz vectors or Schur vectors. -c See Remarks below. -c -c HOWMNY Character*1 (INPUT) -c Specifies the form of the basis for the invariant subspace +c See Remarks below. +c +c HOWMNY Character*1 (INPUT) +c Specifies the form of the basis for the invariant subspace c corresponding to the converged Ritz values that is to be computed. c -c = 'A': Compute NEV Ritz vectors; +c = 'A': Compute NEV Ritz vectors; c = 'P': Compute NEV Schur vectors; c = 'S': compute some of the Ritz vectors, specified c by the logical array SELECT. @@ -63,43 +63,43 @@ c SELECT Logical array of dimension NCV. (INPUT) c If HOWMNY = 'S', SELECT specifies the Ritz vectors to be c computed. To select the Ritz vector corresponding to a -c Ritz value (DR(j), DI(j)), SELECT(j) must be set to .TRUE.. +c Ritz value (DR(j), DI(j)), SELECT(j) must be set to .TRUE.. c If HOWMNY = 'A' or 'P', SELECT is used as internal workspace. c c DR Real array of dimension NEV+1. (OUTPUT) -c If IPARAM(7) = 1,2 or 3 and SIGMAI=0.0 then on exit: DR contains -c the real part of the Ritz approximations to the eigenvalues of -c A*z = lambda*B*z. +c If IPARAM(7) = 1,2 or 3 and SIGMAI=0.0 then on exit: DR contains +c the real part of the Ritz approximations to the eigenvalues of +c A*z = lambda*B*z. c If IPARAM(7) = 3, 4 and SIGMAI is not equal to zero, then on exit: -c DR contains the real part of the Ritz values of OP computed by +c DR contains the real part of the Ritz values of OP computed by c SNAUPD. A further computation must be performed by the user c to transform the Ritz values computed for OP by SNAUPD to those c of the original system A*z = lambda*B*z. See remark 3 below. c c DI Real array of dimension NEV+1. (OUTPUT) -c On exit, DI contains the imaginary part of the Ritz value +c On exit, DI contains the imaginary part of the Ritz value c approximations to the eigenvalues of A*z = lambda*B*z associated c with DR. c -c NOTE: When Ritz values are complex, they will come in complex -c conjugate pairs. If eigenvectors are requested, the -c corresponding Ritz vectors will also come in conjugate -c pairs and the real and imaginary parts of these are -c represented in two consecutive columns of the array Z +c NOTE: When Ritz values are complex, they will come in complex +c conjugate pairs. If eigenvectors are requested, the +c corresponding Ritz vectors will also come in conjugate +c pairs and the real and imaginary parts of these are +c represented in two consecutive columns of the array Z c (see below). c c Z Real N by NEV+1 array if RVEC = .TRUE. and HOWMNY = 'A'. (OUTPUT) -c On exit, if RVEC = .TRUE. and HOWMNY = 'A', then the columns of -c Z represent approximate eigenvectors (Ritz vectors) corresponding -c to the NCONV=IPARAM(5) Ritz values for eigensystem -c A*z = lambda*B*z. -c -c The complex Ritz vector associated with the Ritz value -c with positive imaginary part is stored in two consecutive -c columns. The first column holds the real part of the Ritz -c vector and the second column holds the imaginary part. The -c Ritz vector associated with the Ritz value with negative -c imaginary part is simply the complex conjugate of the Ritz vector +c On exit, if RVEC = .TRUE. and HOWMNY = 'A', then the columns of +c Z represent approximate eigenvectors (Ritz vectors) corresponding +c to the NCONV=IPARAM(5) Ritz values for eigensystem +c A*z = lambda*B*z. +c +c The complex Ritz vector associated with the Ritz value +c with positive imaginary part is stored in two consecutive +c columns. The first column holds the real part of the Ritz +c vector and the second column holds the imaginary part. The +c Ritz vector associated with the Ritz value with negative +c imaginary part is simply the complex conjugate of the Ritz vector c associated with the positive imaginary part. c c If RVEC = .FALSE. or HOWMNY = 'P', then Z is not referenced. @@ -114,11 +114,11 @@ c desired, then LDZ >= max( 1, N ). In any case, LDZ >= 1. c c SIGMAR Real (INPUT) -c If IPARAM(7) = 3 or 4, represents the real part of the shift. +c If IPARAM(7) = 3 or 4, represents the real part of the shift. c Not referenced if IPARAM(7) = 1 or 2. c c SIGMAI Real (INPUT) -c If IPARAM(7) = 3 or 4, represents the imaginary part of the shift. +c If IPARAM(7) = 3 or 4, represents the imaginary part of the shift. c Not referenced if IPARAM(7) = 1 or 2. See remark 3 below. c c WORKEV Real work array of dimension 3*NCV. (WORKSPACE) @@ -183,10 +183,10 @@ c c = 1: The Schur form computed by LAPACK routine slahqr c could not be reordered by LAPACK routine strsen. -c Re-enter subroutine sneupd with IPARAM(5)=NCV and -c increase the size of the arrays DR and DI to have -c dimension at least dimension NCV and allocate at least NCV -c columns for Z. NOTE: Not necessary if Z and V share +c Re-enter subroutine sneupd with IPARAM(5)=NCV and +c increase the size of the arrays DR and DI to have +c dimension at least dimension NCV and allocate at least NCV +c columns for Z. NOTE: Not necessary if Z and V share c the same space. Please notify the authors if this error c occurs. c @@ -218,7 +218,7 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett & Y. Saad, "Complex Shift and Invert Strategies for @@ -229,7 +229,7 @@ c ivout ARPACK utility routine that prints integers. c smout ARPACK utility routine that prints matrices c svout ARPACK utility routine that prints vectors. -c sgeqr2 LAPACK routine that computes the QR factorization of +c sgeqr2 LAPACK routine that computes the QR factorization of c a matrix. c slacpy LAPACK matrix copy routine. c slahqr LAPACK routine to compute the real Schur form of an @@ -237,7 +237,7 @@ c slamch LAPACK routine that determines machine constants. c slapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. c slaset LAPACK matrix initialization routine. -c sorm2r LAPACK routine that applies an orthogonal matrix in +c sorm2r LAPACK routine that applies an orthogonal matrix in c factored form. c strevc LAPACK routine to compute the eigenvectors of a matrix c in upper quasi-triangular form. @@ -259,10 +259,10 @@ c Ritz vectors. Thus, their numerical properties are often superior. c If RVEC = .TRUE. then the relationship c A * V(:,1:IPARAM(5)) = V(:,1:IPARAM(5)) * T, and -c trans(V(:,1:IPARAM(5))) * V(:,1:IPARAM(5)) = I are approximately -c satisfied. Here T is the leading submatrix of order IPARAM(5) of the +c trans(V(:,1:IPARAM(5))) * V(:,1:IPARAM(5)) = I are approximately +c satisfied. Here T is the leading submatrix of order IPARAM(5) of the c real upper quasi-triangular matrix stored workl(ipntr(12)). That is, -c T is block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; +c T is block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; c each 2-by-2 diagonal block has its diagonal elements equal and its c off-diagonal elements of opposite sign. Corresponding to each 2-by-2 c diagonal block is a complex conjugate pair of Ritz values. The real @@ -270,14 +270,14 @@ c c 3. If IPARAM(7) = 3 or 4 and SIGMAI is not equal zero, then the user must c form the IPARAM(5) Rayleigh quotients in order to transform the Ritz -c values computed by SNAUPD for OP to those of A*z = lambda*B*z. +c values computed by SNAUPD for OP to those of A*z = lambda*B*z. c Set RVEC = .true. and HOWMNY = 'A', and -c compute +c compute c trans(Z(:,I)) * A * Z(:,I) if DI(I) = 0. -c If DI(I) is not equal to zero and DI(I+1) = - D(I), +c If DI(I) is not equal to zero and DI(I+1) = - D(I), c then the desired real and imaginary parts of the Ritz value are c trans(Z(:,I)) * A * Z(:,I) + trans(Z(:,I+1)) * A * Z(:,I+1), -c trans(Z(:,I)) * A * Z(:,I+1) - trans(Z(:,I+1)) * A * Z(:,I), +c trans(Z(:,I)) * A * Z(:,I+1) - trans(Z(:,I+1)) * A * Z(:,I), c respectively. c Another possibility is to set RVEC = .true. and HOWMNY = 'P' and c compute trans(V(:,1:IPARAM(5))) * A * V(:,1:IPARAM(5)) and then an upper @@ -286,20 +286,20 @@ c c\Authors c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University +c Richard Lehoucq CRPC / Rice University c Chao Yang Houston, Texas c Dept. of Computational & -c Applied Mathematics -c Rice University -c Houston, Texas -c -c\SCCS Information: @(#) -c FILE: neupd.F SID: 2.7 DATE OF SID: 09/20/00 RELEASE: 2 +c Applied Mathematics +c Rice University +c Houston, Texas +c +c\SCCS Information: @(#) +c FILE: neupd.F SID: 2.7 DATE OF SID: 09/20/00 RELEASE: 2 c c\EndLib c c----------------------------------------------------------------------- - subroutine sneupd(rvec , howmny, select, dr , di, + subroutine sneupd(rvec , howmny, select, dr , di, & z , ldz , sigmar, sigmai, workev, & bmat , n , which , nev , tol, & resid, ncv , v , ldv , iparam, @@ -309,8 +309,8 @@ subroutine sneupd(rvec , howmny, select, dr , di, c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -319,7 +319,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, character bmat, howmny, which*2 logical rvec integer info, ldz, ldv, lworkl, n, ncv, nev - Real + Real & sigmar, sigmai, tol c c %-----------------% @@ -328,16 +328,16 @@ subroutine sneupd(rvec , howmny, select, dr , di, c integer iparam(11), ipntr(14) logical select(ncv) - Real - & dr(nev+1) , di(nev+1), resid(n) , - & v(ldv,ncv) , z(ldz,*) , workd(3*n), + Real + & dr(nev+1) , di(nev+1), resid(n) , + & v(ldv,ncv) , z(ldz,*) , workd(3*n), & workl(lworkl), workev(3*ncv) c c %------------% c | Parameters | c %------------% c - Real + Real & one, zero parameter (one = 1.0E+0 , zero = 0.0E+0 ) c @@ -346,16 +346,16 @@ subroutine sneupd(rvec , howmny, select, dr , di, c %---------------% c character type*6 - integer bounds, ierr , ih , ihbds , - & iheigr, iheigi, iconj , nconv , + integer bounds, ierr , ih , ihbds , + & iheigr, iheigi, iconj , nconv , & invsub, iuptri, iwev , iwork(1), & j , k , ldh , ldq , & mode , msglvl, outncv, ritzr , & ritzi , wri , wrr , irr , & iri , ibd , ishift, numcnv , - & np , jj + & np , jj , nconv2 logical reord - Real + Real & conds , rnorm, sep , temp, & vl(1,1), temp1, eps23 c @@ -363,16 +363,16 @@ subroutine sneupd(rvec , howmny, select, dr , di, c | External Subroutines | c %----------------------% c - external scopy , sger , sgeqr2, slacpy, - & slahqr, slaset, smout , sorm2r, - & strevc, strmm , strsen, sscal , + external scopy , sger , sgeqr2, slacpy, + & slahqr, slaset, smout , sorm2r, + & strevc, strmm , strsen, sscal , & svout , ivout c c %--------------------% c | External Functions | c %--------------------% c - Real + Real & slapy2, snrm2, slamch, sdot external slapy2, snrm2, slamch, sdot c @@ -385,7 +385,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, c %-----------------------% c | Executable Statements | c %-----------------------% -c +c c %------------------------% c | Set default parameters | c %------------------------% @@ -434,7 +434,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, else if (howmny .eq. 'S' ) then ierr = -12 end if -c +c if (mode .eq. 1 .or. mode .eq. 2) then type = 'REGULR' else if (mode .eq. 3 .and. sigmai .eq. zero) then @@ -443,7 +443,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, type = 'REALPT' else if (mode .eq. 4 ) then type = 'IMAGPT' - else + else ierr = -10 end if if (mode .eq. 1 .and. bmat .eq. 'G') ierr = -11 @@ -456,7 +456,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, info = ierr go to 9000 end if -c +c c %--------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, BOUNDS, Q | c | etc... and the remaining workspace. | @@ -483,7 +483,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, c | subspace for H. | c | GRAND total of NCV * ( 3 * NCV + 6 ) locations. | c %-----------------------------------------------------------% -c +c ih = ipntr(5) ritzr = ipntr(6) ritzi = ipntr(7) @@ -537,7 +537,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, end if c if (rvec) then -c +c reord = .false. c c %---------------------------------------------------% @@ -562,7 +562,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, c np = ncv - nev ishift = 0 - call sngets(ishift , which , nev , + call sngets(ishift , which , nev , & np , workl(irr), workl(iri), & workl(bounds), workl , workl(np+1)) c @@ -589,7 +589,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, & workl(ibd+jj-1) .le. tol*temp1) then select(jj) = .true. numcnv = numcnv + 1 - if (jj .gt. nev) reord = .true. + if (jj .gt. nconv) reord = .true. endif 11 continue c @@ -601,9 +601,9 @@ subroutine sneupd(rvec , howmny, select, dr , di, c %-----------------------------------------------------------% c if (msglvl .gt. 2) then - call ivout(logfil, 1, numcnv, ndigit, + call ivout(logfil, 1, [numcnv], ndigit, & '_neupd: Number of specified eigenvalues') - call ivout(logfil, 1, nconv, ndigit, + call ivout(logfil, 1, [nconv], ndigit, & '_neupd: Number of "converged" eigenvalues') end if c @@ -618,24 +618,24 @@ subroutine sneupd(rvec , howmny, select, dr , di, c | Make a copy of the upper Hessenberg matrix. | c | Initialize the Schur vector matrix Q to the identity. | c %-----------------------------------------------------------% -c +c call scopy(ldh*ncv, workl(ih), 1, workl(iuptri), 1) - call slaset('All', ncv, ncv, + call slaset('All', ncv, ncv, & zero , one, workl(invsub), & ldq) - call slahqr(.true., .true. , ncv, - & 1 , ncv , workl(iuptri), + call slahqr(.true., .true. , ncv, + & 1 , ncv , workl(iuptri), & ldh , workl(iheigr), workl(iheigi), - & 1 , ncv , workl(invsub), + & 1 , ncv , workl(invsub), & ldq , ierr) - call scopy(ncv , workl(invsub+ncv-1), ldq, + call scopy(ncv , workl(invsub+ncv-1), ldq, & workl(ihbds), 1) -c +c if (ierr .ne. 0) then info = -8 go to 9000 end if -c +c if (msglvl .gt. 1) then call svout(logfil, ncv, workl(iheigr), ndigit, & '_neupd: Real part of the eigenvalues of H') @@ -644,28 +644,32 @@ subroutine sneupd(rvec , howmny, select, dr , di, call svout(logfil, ncv, workl(ihbds), ndigit, & '_neupd: Last row of the Schur vector matrix') if (msglvl .gt. 3) then - call smout(logfil , ncv, ncv , + call smout(logfil , ncv, ncv , & workl(iuptri), ldh, ndigit, & '_neupd: The upper quasi-triangular matrix ') end if - end if + end if c if (reord) then -c +c c %-----------------------------------------------------% -c | Reorder the computed upper quasi-triangular matrix. | +c | Reorder the computed upper quasi-triangular matrix. | c %-----------------------------------------------------% -c - call strsen('None' , 'V' , +c + call strsen('None' , 'V' , & select , ncv , - & workl(iuptri), ldh , - & workl(invsub), ldq , - & workl(iheigr), workl(iheigi), - & nconv , conds , - & sep , workl(ihbds) , + & workl(iuptri), ldh , + & workl(invsub), ldq , + & workl(iheigr), workl(iheigi), + & nconv2 , conds , + & sep , workl(ihbds) , & ncv , iwork , & 1 , ierr) c + if (nconv2 .lt. nconv) then + nconv = nconv2 + end if + if (ierr .eq. 1) then info = 1 go to 9000 @@ -677,12 +681,12 @@ subroutine sneupd(rvec , howmny, select, dr , di, call svout(logfil, ncv, workl(iheigi), ndigit, & '_neupd: Imag part of the eigenvalues of H--reordered') if (msglvl .gt. 3) then - call smout(logfil , ncv, ncv , + call smout(logfil , ncv, ncv , & workl(iuptri), ldq, ndigit, & '_neupd: Quasi-triangular matrix after re-ordering') end if end if -c +c end if c c %---------------------------------------% @@ -699,23 +703,23 @@ subroutine sneupd(rvec , howmny, select, dr , di, c | if a spectral transformation was not used. | c %----------------------------------------------------% c - if (type .eq. 'REGULR') then + if (type .eq. 'REGULR') then call scopy(nconv, workl(iheigr), 1, dr, 1) call scopy(nconv, workl(iheigi), 1, di, 1) end if -c +c c %----------------------------------------------------------% c | Compute the QR factorization of the matrix representing | c | the wanted invariant subspace located in the first NCONV | c | columns of workl(invsub,ldq). | c %----------------------------------------------------------% -c - call sgeqr2(ncv, nconv , workl(invsub), +c + call sgeqr2(ncv, nconv , workl(invsub), & ldq, workev, workev(ncv+1), & ierr) c c %---------------------------------------------------------% -c | * Postmultiply V by Q using sorm2r. | +c | * Postmultiply V by Q using sorm2r. | c | * Copy the first NCONV columns of VQ into Z. | c | * Postmultiply Z by R. | c | The N by NCONV matrix Z is now a matrix representation | @@ -725,15 +729,15 @@ subroutine sneupd(rvec , howmny, select, dr , di, c | vectors associated with the real upper quasi-triangular | c | matrix of order NCONV in workl(iuptri) | c %---------------------------------------------------------% -c - call sorm2r('Right', 'Notranspose', n , +c + call sorm2r('Right', 'Notranspose', n , & ncv , nconv , workl(invsub), - & ldq , workev , v , + & ldq , workev , v , & ldv , workd(n+1) , ierr) call slacpy('All', n, nconv, v, ldv, z, ldz) c do 20 j=1, nconv -c +c c %---------------------------------------------------% c | Perform both a column and row scaling if the | c | diagonal element of workl(invsub,ldq) is negative | @@ -742,21 +746,21 @@ subroutine sneupd(rvec , howmny, select, dr , di, c | Note that since Q is orthogonal, R is a diagonal | c | matrix consisting of plus or minus ones | c %---------------------------------------------------% -c +c if (workl(invsub+(j-1)*ldq+j-1) .lt. zero) then call sscal(nconv, -one, workl(iuptri+j-1), ldq) call sscal(nconv, -one, workl(iuptri+(j-1)*ldq), 1) end if -c +c 20 continue -c +c if (howmny .eq. 'A') then -c +c c %--------------------------------------------% -c | Compute the NCONV wanted eigenvectors of T | +c | Compute the NCONV wanted eigenvectors of T | c | located in workl(iuptri,ldq). | c %--------------------------------------------% -c +c do 30 j=1, ncv if (j .le. nconv) then select(j) = .true. @@ -765,8 +769,8 @@ subroutine sneupd(rvec , howmny, select, dr , di, end if 30 continue c - call strevc('Right', 'Select' , select , - & ncv , workl(iuptri), ldq , + call strevc('Right', 'Select' , select , + & ncv , workl(iuptri), ldq , & vl , 1 , workl(invsub), & ldq , ncv , outncv , & workev , ierr) @@ -775,7 +779,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, info = -9 go to 9000 end if -c +c c %------------------------------------------------% c | Scale the returning eigenvectors so that their | c | Euclidean norms are all one. LAPACK subroutine | @@ -783,22 +787,22 @@ subroutine sneupd(rvec , howmny, select, dr , di, c | that the element of largest magnitude has | c | magnitude 1; | c %------------------------------------------------% -c +c iconj = 0 do 40 j=1, nconv c if ( workl(iheigi+j-1) .eq. zero ) then -c +c c %----------------------% c | real eigenvalue case | c %----------------------% -c +c temp = snrm2( ncv, workl(invsub+(j-1)*ldq), 1 ) - call sscal( ncv, one / temp, + call sscal( ncv, one / temp, & workl(invsub+(j-1)*ldq), 1 ) c else -c +c c %-------------------------------------------% c | Complex conjugate pair case. Note that | c | since the real and imaginary part of | @@ -808,15 +812,15 @@ subroutine sneupd(rvec , howmny, select, dr , di, c %-------------------------------------------% c if (iconj .eq. 0) then - temp = slapy2(snrm2(ncv, - & workl(invsub+(j-1)*ldq), + temp = slapy2(snrm2(ncv, + & workl(invsub+(j-1)*ldq), & 1), - & snrm2(ncv, + & snrm2(ncv, & workl(invsub+j*ldq), - & 1)) - call sscal(ncv, one/temp, + & 1)) + call sscal(ncv, one/temp, & workl(invsub+(j-1)*ldq), 1 ) - call sscal(ncv, one/temp, + call sscal(ncv, one/temp, & workl(invsub+j*ldq), 1 ) iconj = 1 else @@ -856,7 +860,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, call svout(logfil, ncv, workl(ihbds), ndigit, & '_neupd: Last row of the eigenvector matrix for T') if (msglvl .gt. 3) then - call smout(logfil, ncv, ncv, workl(invsub), ldq, + call smout(logfil, ncv, ncv, workl(invsub), ldq, & ndigit, '_neupd: The eigenvector matrix for T') end if end if @@ -872,32 +876,32 @@ subroutine sneupd(rvec , howmny, select, dr , di, c | associated with leading portion of T in the first NCONV | c | columns of workl(invsub,ldq). | c %---------------------------------------------------------% -c - call sgeqr2(ncv, nconv , workl(invsub), +c + call sgeqr2(ncv, nconv , workl(invsub), & ldq, workev, workev(ncv+1), & ierr) -c +c c %----------------------------------------------% -c | * Postmultiply Z by Q. | +c | * Postmultiply Z by Q. | c | * Postmultiply Z by R. | -c | The N by NCONV matrix Z is now contains the | +c | The N by NCONV matrix Z is now contains the | c | Ritz vectors associated with the Ritz values | c | in workl(iheigr) and workl(iheigi). | c %----------------------------------------------% -c +c call sorm2r('Right', 'Notranspose', n , & ncv , nconv , workl(invsub), & ldq , workev , z , & ldz , workd(n+1) , ierr) -c +c call strmm('Right' , 'Upper' , 'No transpose', & 'Non-unit', n , nconv , & one , workl(invsub), ldq , & z , ldz) -c +c end if -c - else +c + else c c %------------------------------------------------------% c | An approximate invariant subspace is not needed. | @@ -910,7 +914,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, call scopy(nconv, workl(ritzi), 1, workl(iheigi), 1) call scopy(nconv, workl(bounds), 1, workl(ihbds), 1) end if -c +c c %------------------------------------------------% c | Transform the Ritz values and possibly vectors | c | and corresponding error bounds of OP to those | @@ -919,26 +923,26 @@ subroutine sneupd(rvec , howmny, select, dr , di, c if (type .eq. 'REGULR') then c - if (rvec) - & call sscal(ncv, rnorm, workl(ihbds), 1) -c - else -c + if (rvec) + & call sscal(ncv, rnorm, workl(ihbds), 1) +c + else +c c %---------------------------------------% c | A spectral transformation was used. | c | * Determine the Ritz estimates of the | c | Ritz values in the original system. | c %---------------------------------------% -c +c if (type .eq. 'SHIFTI') then c - if (rvec) + if (rvec) & call sscal(ncv, rnorm, workl(ihbds), 1) c do 50 k=1, ncv - temp = slapy2( workl(iheigr+k-1), + temp = slapy2( workl(iheigr+k-1), & workl(iheigi+k-1) ) - workl(ihbds+k-1) = abs( workl(ihbds+k-1) ) + workl(ihbds+k-1) = abs( workl(ihbds+k-1) ) & / temp / temp 50 continue c @@ -953,26 +957,26 @@ subroutine sneupd(rvec , howmny, select, dr , di, 70 continue c end if -c +c c %-----------------------------------------------------------% c | * Transform the Ritz values back to the original system. | c | For TYPE = 'SHIFTI' the transformation is | c | lambda = 1/theta + sigma | c | For TYPE = 'REALPT' or 'IMAGPT' the user must from | -c | Rayleigh quotients or a projection. See remark 3 above.| +c | Rayleigh quotients or a projection. See remark 3 above.| c | NOTES: | c | *The Ritz vectors are not affected by the transformation. | c %-----------------------------------------------------------% -c - if (type .eq. 'SHIFTI') then +c + if (type .eq. 'SHIFTI') then c do 80 k=1, ncv - temp = slapy2( workl(iheigr+k-1), + temp = slapy2( workl(iheigr+k-1), & workl(iheigi+k-1) ) - workl(iheigr+k-1) = workl(iheigr+k-1)/temp/temp - & + sigmar + workl(iheigr+k-1) = workl(iheigr+k-1)/temp/temp + & + sigmar workl(iheigi+k-1) = -workl(iheigi+k-1)/temp/temp - & + sigmai + & + sigmai 80 continue c call scopy(nconv, workl(iheigr), 1, dr, 1) @@ -989,9 +993,9 @@ subroutine sneupd(rvec , howmny, select, dr , di, c if (type .eq. 'SHIFTI' .and. msglvl .gt. 1) then call svout(logfil, nconv, dr, ndigit, - & '_neupd: Untransformed real part of the Ritz valuess.') + & '_neupd: Untransformed real part of the Ritz values.') call svout (logfil, nconv, di, ndigit, - & '_neupd: Untransformed imag part of the Ritz valuess.') + & '_neupd: Untransformed imag part of the Ritz values.') call svout(logfil, nconv, workl(ihbds), ndigit, & '_neupd: Ritz estimates of untransformed Ritz values.') else if (type .eq. 'REGULR' .and. msglvl .gt. 1) then @@ -1002,7 +1006,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, call svout(logfil, nconv, workl(ihbds), ndigit, & '_neupd: Associated Ritz estimates.') end if -c +c c %-------------------------------------------------% c | Eigenvector Purification step. Formally perform | c | one of inverse subspace iteration. Only used | @@ -1024,19 +1028,22 @@ subroutine sneupd(rvec , howmny, select, dr , di, c iconj = 0 do 110 j=1, nconv - if (workl(iheigi+j-1) .eq. zero) then + if ((workl(iheigi+j-1) .eq. zero) .and. + & (workl(iheigr+j-1) .ne. zero)) then workev(j) = workl(invsub+(j-1)*ldq+ncv-1) / & workl(iheigr+j-1) else if (iconj .eq. 0) then temp = slapy2( workl(iheigr+j-1), workl(iheigi+j-1) ) - workev(j) = ( workl(invsub+(j-1)*ldq+ncv-1) * - & workl(iheigr+j-1) + - & workl(invsub+j*ldq+ncv-1) * - & workl(iheigi+j-1) ) / temp / temp - workev(j+1) = ( workl(invsub+j*ldq+ncv-1) * - & workl(iheigr+j-1) - - & workl(invsub+(j-1)*ldq+ncv-1) * - & workl(iheigi+j-1) ) / temp / temp + if (temp. ne. zero) then + workev(j) = ( workl(invsub+(j-1)*ldq+ncv-1) * + & workl(iheigr+j-1) + + & workl(invsub+j*ldq+ncv-1) * + & workl(iheigi+j-1) ) / temp / temp + workev(j+1) = ( workl(invsub+j*ldq+ncv-1) * + & workl(iheigr+j-1) - + & workl(invsub+(j-1)*ldq+ncv-1) * + & workl(iheigi+j-1) ) / temp / temp + end if iconj = 1 else iconj = 0 @@ -1055,7 +1062,7 @@ subroutine sneupd(rvec , howmny, select, dr , di, 9000 continue c return -c +c c %---------------% c | End of SNEUPD | c %---------------% diff --git a/Toolbox/arpack-src/sngets.f b/Toolbox/arpack-src/sngets.f index dd15a0b3e..7e48c0bb1 100644 --- a/Toolbox/arpack-src/sngets.f +++ b/Toolbox/arpack-src/sngets.f @@ -3,9 +3,9 @@ c c\Name: sngets c -c\Description: +c\Description: c Given the eigenvalues of the upper Hessenberg matrix H, -c computes the NP shifts AMU that are zeros of the polynomial of +c computes the NP shifts AMU that are zeros of the polynomial of c degree NP which filters out components of the unwanted eigenvectors c corresponding to the AMU's based on some given criteria. c @@ -42,12 +42,12 @@ c pairs together. c c RITZR, Real array of length KEV+NP. (INPUT/OUTPUT) -c RITZI On INPUT, RITZR and RITZI contain the real and imaginary +c RITZI On INPUT, RITZR and RITZI contain the real and imaginary c parts of the eigenvalues of H. c On OUTPUT, RITZR and RITZI are sorted so that the unwanted c eigenvalues are in the first NP locations and the wanted -c portion is in the last KEV locations. When exact shifts are -c selected, the unwanted part corresponds to the shifts to +c portion is in the last KEV locations. When exact shifts are +c selected, the unwanted part corresponds to the shifts to c be applied. Also, if ISHIFT .eq. 1, the unwanted eigenvalues c are further sorted so that the ones with largest Ritz values c are first. @@ -56,7 +56,7 @@ c Error bounds corresponding to the ordering in RITZ. c c SHIFTR, SHIFTI *** USE deprecated as of version 2.1. *** -c +c c c\EndDoc c @@ -76,13 +76,13 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.1' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: ngets.F SID: 2.3 DATE OF SID: 4/20/96 RELEASE: 2 c c\Remarks @@ -99,8 +99,8 @@ subroutine sngets ( ishift, which, kev, np, ritzr, ritzi, bounds, c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -114,7 +114,7 @@ subroutine sngets ( ishift, which, kev, np, ritzr, ritzi, bounds, c %-----------------% c Real - & bounds(kev+np), ritzr(kev+np), ritzi(kev+np), + & bounds(kev+np), ritzr(kev+np), ritzi(kev+np), & shiftr(1), shifti(1) c c %------------% @@ -135,7 +135,7 @@ subroutine sngets ( ishift, which, kev, np, ritzr, ritzi, bounds, c | External Subroutines | c %----------------------% c - external scopy, ssortc, second + external scopy, ssortc, arscnd c c %----------------------% c | Intrinsics Functions | @@ -151,10 +151,10 @@ subroutine sngets ( ishift, which, kev, np, ritzr, ritzi, bounds, c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% -c - call second (t0) +c + call arscnd (t0) msglvl = mngets -c +c c %----------------------------------------------------% c | LM, SM, LR, SR, LI, SI case. | c | Sort the eigenvalues of H into the desired order | @@ -178,16 +178,16 @@ subroutine sngets ( ishift, which, kev, np, ritzr, ritzi, bounds, else if (which .eq. 'SI') then call ssortc ('SM', .true., kev+np, ritzr, ritzi, bounds) end if -c +c call ssortc (which, .true., kev+np, ritzr, ritzi, bounds) -c +c c %-------------------------------------------------------% c | Increase KEV by one if the ( ritzr(np),ritzi(np) ) | c | = ( ritzr(np+1),-ritzi(np+1) ) and ritz(np) .ne. zero | c | Accordingly decrease NP by one. In other words keep | c | complex conjugate pairs together. | c %-------------------------------------------------------% -c +c if ( ( ritzr(np+1) - ritzr(np) ) .eq. zero & .and. ( ritzi(np+1) + ritzi(np) ) .eq. zero ) then np = np - 1 @@ -195,7 +195,7 @@ subroutine sngets ( ishift, which, kev, np, ritzr, ritzi, bounds, end if c if ( ishift .eq. 1 ) then -c +c c %-------------------------------------------------------% c | Sort the unwanted Ritz values used as shifts so that | c | the ones with largest Ritz estimates are first | @@ -204,28 +204,28 @@ subroutine sngets ( ishift, which, kev, np, ritzr, ritzi, bounds, c | are applied in subroutine snapps. | c | Be careful and use 'SR' since we want to sort BOUNDS! | c %-------------------------------------------------------% -c +c call ssortc ( 'SR', .true., np, bounds, ritzr, ritzi ) end if -c - call second (t1) +c + call arscnd (t1) tngets = tngets + (t1 - t0) c if (msglvl .gt. 0) then - call ivout (logfil, 1, kev, ndigit, '_ngets: KEV is') - call ivout (logfil, 1, np, ndigit, '_ngets: NP is') + call ivout (logfil, 1, [kev], ndigit, '_ngets: KEV is') + call ivout (logfil, 1, [np], ndigit, '_ngets: NP is') call svout (logfil, kev+np, ritzr, ndigit, & '_ngets: Eigenvalues of current H matrix -- real part') call svout (logfil, kev+np, ritzi, ndigit, & '_ngets: Eigenvalues of current H matrix -- imag part') - call svout (logfil, kev+np, bounds, ndigit, + call svout (logfil, kev+np, bounds, ndigit, & '_ngets: Ritz estimates of the current KEV+NP Ritz values') end if -c +c return -c +c c %---------------% c | End of sngets | c %---------------% -c +c end diff --git a/Toolbox/arpack-src/ssaitr.f b/Toolbox/arpack-src/ssaitr.f index aacb9ceeb..a5df2c2ec 100644 --- a/Toolbox/arpack-src/ssaitr.f +++ b/Toolbox/arpack-src/ssaitr.f @@ -3,8 +3,8 @@ c c\Name: ssaitr c -c\Description: -c Reverse communication interface for applying NP additional steps to +c\Description: +c Reverse communication interface for applying NP additional steps to c a K step symmetric Arnoldi factorization. c c Input: OP*V_{k} - V_{k}*H = r_{k}*e_{k}^T @@ -20,7 +20,7 @@ c c\Usage: c call ssaitr -c ( IDO, BMAT, N, K, NP, MODE, RESID, RNORM, V, LDV, H, LDH, +c ( IDO, BMAT, N, K, NP, MODE, RESID, RNORM, V, LDV, H, LDH, c IPNTR, WORKD, INFO ) c c\Arguments @@ -76,13 +76,13 @@ c On OUTPUT the B-norm of the updated residual r_{k+p}. c c V Real N by K+NP array. (INPUT/OUTPUT) -c On INPUT: V contains the Arnoldi vectors in the first K +c On INPUT: V contains the Arnoldi vectors in the first K c columns. c On OUTPUT: V contains the new NP Arnoldi vectors in the next c NP columns. The first K columns are unchanged. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c H Real (K+NP) by 2 array. (INPUT/OUTPUT) @@ -91,26 +91,26 @@ c and the main diagonal in the second column. c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORK for +c Pointer to mark the starting locations in the WORK for c vectors used by the Arnoldi iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in the +c IPNTR(3): pointer to the vector B * X when used in the c shift-and-invert mode. X is the current operand. c ------------------------------------------------------------- -c +c c WORKD Real work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The calling program should not +c for reverse communication. The calling program should not c use WORKD as temporary workspace during the iteration !!!!!! c On INPUT, WORKD(1:N) = B*RESID where RESID is associated -c with the K step Arnoldi factorization. Used to save some -c computation at the first step. +c with the K step Arnoldi factorization. Used to save some +c computation at the first step. c On OUTPUT, WORKD(1:N) = B*RESID where RESID is associated c with the K+NP step Arnoldi factorization. c @@ -139,7 +139,7 @@ c saxpy Level 1 BLAS that computes a vector triad. c sscal Level 1 BLAS that scales a vector. c scopy Level 1 BLAS that copies one vector to another . -c sdot Level 1 BLAS that computes the scalar product of two vectors. +c sdot Level 1 BLAS that computes the scalar product of two vectors. c snrm2 Level 1 BLAS that computes the norm of a vector. c c\Author @@ -147,29 +147,29 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: c xx/xx/93: Version ' 2.4' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: saitr.F SID: 2.6 DATE OF SID: 8/28/96 RELEASE: 2 c c\Remarks c The algorithm implemented is: -c +c c restart = .false. -c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; +c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; c r_{k} contains the initial residual vector even for k = 0; -c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already +c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already c computed by the calling program. c c betaj = rnorm ; p_{k+1} = B*r_{k} ; c For j = k+1, ..., k+np Do c 1) if ( betaj < tol ) stop or restart depending on j. c if ( restart ) generate a new starting vector. -c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; +c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; c p_{j} = p_{j}/betaj c 3) r_{j} = OP*v_{j} where OP is defined as in ssaupd c For shift-invert mode p_{j} = B*v_{j} is already available. @@ -184,7 +184,7 @@ c 5) Re-orthogonalization step: c s = V_{j}'*B*r_{j} c r_{j} = r_{j} - V_{j}*s; rnorm1 = || r_{j} || -c alphaj = alphaj + s_{j}; +c alphaj = alphaj + s_{j}; c 6) Iterative refinement step: c If (rnorm1 > 0.717*rnorm) then c rnorm = rnorm1 @@ -194,7 +194,7 @@ c If this is the first time in step 6), go to 5) c Else r_{j} lies in the span of V_{j} numerically. c Set r_{j} = 0 and rnorm = 0; go to 1) -c EndIf +c EndIf c End Do c c\EndLib @@ -202,15 +202,15 @@ c----------------------------------------------------------------------- c subroutine ssaitr - & (ido, bmat, n, k, np, mode, resid, rnorm, v, ldv, h, ldh, + & (ido, bmat, n, k, np, mode, resid, rnorm, v, ldv, h, ldh, & ipntr, workd, info) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -242,7 +242,7 @@ subroutine ssaitr c %---------------% c logical first, orth1, orth2, rstart, step3, step4 - integer i, ierr, ipj, irj, ivj, iter, itry, j, msglvl, + integer i, ierr, ipj, irj, ivj, iter, itry, j, msglvl, & infol, jj Real & rnorm1, wnorm, safmin, temp1 @@ -251,7 +251,7 @@ subroutine ssaitr & rnorm1, safmin, wnorm c c %-----------------------% -c | Local Array Arguments | +c | Local Array Arguments | c %-----------------------% c Real @@ -262,7 +262,7 @@ subroutine ssaitr c %----------------------% c external saxpy, scopy, sscal, sgemv, sgetv0, svout, smout, - & slascl, ivout, second + & slascl, ivout, arscnd c c %--------------------% c | External Functions | @@ -294,15 +294,15 @@ subroutine ssaitr end if c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = msaitr -c +c c %------------------------------% c | Initial call to this routine | c %------------------------------% @@ -313,14 +313,14 @@ subroutine ssaitr rstart = .false. orth1 = .false. orth2 = .false. -c +c c %--------------------------------% c | Pointer to the current step of | c | the factorization to build | c %--------------------------------% c j = k + 1 -c +c c %------------------------------------------% c | Pointers used for reverse communication | c | when using WORKD. | @@ -330,7 +330,7 @@ subroutine ssaitr irj = ipj + n ivj = irj + n end if -c +c c %-------------------------------------------------% c | When in reverse communication mode one of: | c | STEP3, STEP4, ORTH1, ORTH2, RSTART | @@ -353,7 +353,7 @@ subroutine ssaitr c %------------------------------% c | Else this is the first step. | c %------------------------------% -c +c c %--------------------------------------------------------------% c | | c | A R N O L D I I T E R A T I O N L O O P | @@ -364,15 +364,15 @@ subroutine ssaitr 1000 continue c if (msglvl .gt. 2) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_saitr: generating Arnoldi vector no.') - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_saitr: B-norm of the current residual =') end if -c +c c %---------------------------------------------------------% -c | Check for exact zero. Equivalent to determing whether a | -c | j-step Arnoldi factorization is present. | +c | Check for exact zero. Equivalent to determining whether | +c | a j-step Arnoldi factorization is present. | c %---------------------------------------------------------% c if (rnorm .gt. zero) go to 40 @@ -384,10 +384,10 @@ subroutine ssaitr c %---------------------------------------------------% c if (msglvl .gt. 0) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_saitr: ****** restart at step ******') end if -c +c c %---------------------------------------------% c | ITRY is the loop variable that controls the | c | maximum amount of times that a restart is | @@ -406,7 +406,7 @@ subroutine ssaitr c | RSTART = .true. flow returns here. | c %--------------------------------------% c - call sgetv0 (ido, bmat, itry, .false., n, j, v, ldv, + call sgetv0 (ido, bmat, itry, .false., n, j, v, ldv, & resid, rnorm, ipntr, workd, ierr) if (ido .ne. 99) go to 9000 if (ierr .lt. 0) then @@ -420,12 +420,12 @@ subroutine ssaitr c %------------------------------------------------% c info = j - 1 - call second (t1) + call arscnd (t1) tsaitr = tsaitr + (t1 - t0) ido = 99 go to 9000 end if -c +c 40 continue c c %---------------------------------------------------------% @@ -447,12 +447,12 @@ subroutine ssaitr c | use LAPACK routine SLASCL | c %-----------------------------------------% c - call slascl ('General', i, i, rnorm, one, n, 1, + call slascl ('General', i, i, rnorm, one, n, 1, & v(1,j), n, infol) - call slascl ('General', i, i, rnorm, one, n, 1, + call slascl ('General', i, i, rnorm, one, n, 1, & workd(ipj), n, infol) end if -c +c c %------------------------------------------------------% c | STEP 3: r_{j} = OP*v_{j}; Note that p_{j} = B*v_{j} | c | Note that this is not quite yet r_{j}. See STEP 4 | @@ -460,28 +460,28 @@ subroutine ssaitr c step3 = .true. nopx = nopx + 1 - call second (t2) + call arscnd (t2) call scopy (n, v(1,j), 1, workd(ivj), 1) ipntr(1) = ivj ipntr(2) = irj ipntr(3) = ipj ido = 1 -c +c c %-----------------------------------% c | Exit in order to compute OP*v_{j} | c %-----------------------------------% -c +c go to 9000 50 continue -c +c c %-----------------------------------% c | Back from reverse communication; | c | WORKD(IRJ:IRJ+N-1) := OP*v_{j}. | c %-----------------------------------% c - call second (t3) + call arscnd (t3) tmvopx = tmvopx + (t3 - t2) -c +c step3 = .false. c c %------------------------------------------% @@ -489,7 +489,7 @@ subroutine ssaitr c %------------------------------------------% c call scopy (n, workd(irj), 1, resid, 1) -c +c c %-------------------------------------------% c | STEP 4: Finish extending the symmetric | c | Arnoldi to length j. If MODE = 2 | @@ -500,33 +500,33 @@ subroutine ssaitr c %-------------------------------------------% c if (mode .eq. 2) go to 65 - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 step4 = .true. ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-------------------------------------% c | Exit in order to compute B*OP*v_{j} | c %-------------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call scopy(n, resid, 1 , workd(ipj), 1) end if 60 continue -c +c c %-----------------------------------% c | Back from reverse communication; | c | WORKD(IPJ:IPJ+N-1) := B*OP*v_{j}. | c %-----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) - end if + end if c step4 = .false. c @@ -545,7 +545,7 @@ subroutine ssaitr c wnorm = sdot (n, resid, 1, workd(ivj), 1) wnorm = sqrt(abs(wnorm)) - else if (bmat .eq. 'G') then + else if (bmat .eq. 'G') then wnorm = sdot (n, resid, 1, workd(ipj), 1) wnorm = sqrt(abs(wnorm)) else if (bmat .eq. 'I') then @@ -567,19 +567,19 @@ subroutine ssaitr c %------------------------------------------% c if (mode .ne. 2 ) then - call sgemv('T', n, j, one, v, ldv, workd(ipj), 1, zero, + call sgemv('T', n, j, one, v, ldv, workd(ipj), 1, zero, & workd(irj), 1) else if (mode .eq. 2) then - call sgemv('T', n, j, one, v, ldv, workd(ivj), 1, zero, + call sgemv('T', n, j, one, v, ldv, workd(ivj), 1, zero, & workd(irj), 1) end if c c %--------------------------------------% c | Orthgonalize r_{j} against V_{j}. | -c | RESID contains OP*v_{j}. See STEP 3. | +c | RESID contains OP*v_{j}. See STEP 3. | c %--------------------------------------% c - call sgemv('N', n, j, -one, v, ldv, workd(irj), 1, one, + call sgemv('N', n, j, -one, v, ldv, workd(irj), 1, one, & resid, 1) c c %--------------------------------------% @@ -592,46 +592,46 @@ subroutine ssaitr else h(j,1) = rnorm end if - call second (t4) -c + call arscnd (t4) +c orth1 = .true. iter = 0 -c - call second (t2) +c + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call scopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*r_{j} | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call scopy (n, resid, 1, workd(ipj), 1) end if 70 continue -c +c c %---------------------------------------------------% c | Back from reverse communication if ORTH1 = .true. | c | WORKD(IPJ:IPJ+N-1) := B*r_{j}. | c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c orth1 = .false. c c %------------------------------% c | Compute the B-norm of r_{j}. | c %------------------------------% c - if (bmat .eq. 'G') then + if (bmat .eq. 'G') then rnorm = sdot (n, resid, 1, workd(ipj), 1) rnorm = sqrt(abs(rnorm)) else if (bmat .eq. 'I') then @@ -655,7 +655,7 @@ subroutine ssaitr c if (rnorm .gt. 0.717*wnorm) go to 100 nrorth = nrorth + 1 -c +c c %---------------------------------------------------% c | Enter the Iterative refinement phase. If further | c | refinement is necessary, loop back here. The loop | @@ -668,7 +668,7 @@ subroutine ssaitr if (msglvl .gt. 2) then xtemp(1) = wnorm xtemp(2) = rnorm - call svout (logfil, 2, xtemp, ndigit, + call svout (logfil, 2, xtemp, ndigit, & '_saitr: re-orthonalization ; wnorm and rnorm are') end if c @@ -677,7 +677,7 @@ subroutine ssaitr c | WORKD(IRJ:IRJ+J-1) = v(:,1:J)'*WORKD(IPJ:IPJ+N-1). | c %----------------------------------------------------% c - call sgemv ('T', n, j, one, v, ldv, workd(ipj), 1, + call sgemv ('T', n, j, one, v, ldv, workd(ipj), 1, & zero, workd(irj), 1) c c %----------------------------------------------% @@ -688,26 +688,26 @@ subroutine ssaitr c | H(j,j) is updated. | c %----------------------------------------------% c - call sgemv ('N', n, j, -one, v, ldv, workd(irj), 1, + call sgemv ('N', n, j, -one, v, ldv, workd(irj), 1, & one, resid, 1) c if (j .eq. 1 .or. rstart) h(j,1) = zero h(j,2) = h(j,2) + workd(irj + j - 1) -c +c orth2 = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call scopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-----------------------------------% c | Exit in order to compute B*r_{j}. | c | r_{j} is the corrected residual. | c %-----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call scopy (n, resid, 1, workd(ipj), 1) @@ -719,15 +719,15 @@ subroutine ssaitr c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if c c %-----------------------------------------------------% c | Compute the B-norm of the corrected residual r_{j}. | c %-----------------------------------------------------% -c - if (bmat .eq. 'G') then +c + if (bmat .eq. 'G') then rnorm1 = sdot (n, resid, 1, workd(ipj), 1) rnorm1 = sqrt(abs(rnorm1)) else if (bmat .eq. 'I') then @@ -735,7 +735,7 @@ subroutine ssaitr end if c if (msglvl .gt. 0 .and. iter .gt. 0) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_saitr: Iterative refinement for Arnoldi residual') if (msglvl .gt. 2) then xtemp(1) = rnorm @@ -744,7 +744,7 @@ subroutine ssaitr & '_saitr: iterative refinement ; rnorm and rnorm1 are') end if end if -c +c c %-----------------------------------------% c | Determine if we need to perform another | c | step of re-orthogonalization. | @@ -757,7 +757,7 @@ subroutine ssaitr c %--------------------------------% c rnorm = rnorm1 -c +c else c c %-------------------------------------------% @@ -779,7 +779,7 @@ subroutine ssaitr 95 continue rnorm = zero end if -c +c c %----------------------------------------------% c | Branch here directly if iterative refinement | c | wasn't necessary or after at most NITER_REF | @@ -787,13 +787,13 @@ subroutine ssaitr c %----------------------------------------------% c 100 continue -c +c rstart = .false. orth2 = .false. -c - call second (t5) +c + call arscnd (t5) titref = titref + (t5 - t4) -c +c c %----------------------------------------------------------% c | Make sure the last off-diagonal element is non negative | c | If not perform a similarity transformation on H(1:j,1:j) | @@ -802,28 +802,28 @@ subroutine ssaitr c if (h(j,1) .lt. zero) then h(j,1) = -h(j,1) - if ( j .lt. k+np) then + if ( j .lt. k+np) then call sscal(n, -one, v(1,j+1), 1) else call sscal(n, -one, resid, 1) end if end if -c +c c %------------------------------------% c | STEP 6: Update j = j+1; Continue | c %------------------------------------% c j = j + 1 if (j .gt. k+np) then - call second (t1) + call arscnd (t1) tsaitr = tsaitr + (t1 - t0) ido = 99 c if (msglvl .gt. 1) then - call svout (logfil, k+np, h(1,2), ndigit, + call svout (logfil, k+np, h(1,2), ndigit, & '_saitr: main diagonal of matrix H of step K+NP.') if (k+np .gt. 1) then - call svout (logfil, k+np-1, h(2,1), ndigit, + call svout (logfil, k+np-1, h(2,1), ndigit, & '_saitr: sub diagonal of matrix H of step K+NP.') end if end if @@ -836,7 +836,7 @@ subroutine ssaitr c %--------------------------------------------------------% c go to 1000 -c +c c %---------------------------------------------------------------% c | | c | E N D O F M A I N I T E R A T I O N L O O P | diff --git a/Toolbox/arpack-src/ssapps.f b/Toolbox/arpack-src/ssapps.f index 5269a8591..77bd9d52c 100644 --- a/Toolbox/arpack-src/ssapps.f +++ b/Toolbox/arpack-src/ssapps.f @@ -12,8 +12,8 @@ c c A*(V_{k}*Q) - (V_{k}*Q)*(Q^T* H_{k}*Q) = r_{k+p}*e_{k+p}^T * Q c -c where Q is an orthogonal matrix of order KEV+NP. Q is the product of -c rotations resulting from the NP bulge chasing sweeps. The updated Arnoldi +c where Q is an orthogonal matrix of order KEV+NP. Q is the product of +c rotations resulting from the NP bulge chasing sweeps. The updated Arnoldi c factorization becomes: c c A*VNEW_{k} - VNEW_{k}*HNEW_{k} = rnew_{k}*e_{k}^T. @@ -49,7 +49,7 @@ c INPUT: H contains the symmetric tridiagonal matrix of the c Arnoldi factorization with the subdiagonal in the 1st column c starting at H(2,1) and the main diagonal in the 2nd column. -c OUTPUT: H contains the updated tridiagonal matrix in the +c OUTPUT: H contains the updated tridiagonal matrix in the c KEV leading submatrix. c c LDH Integer. (INPUT) @@ -85,13 +85,13 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: -c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c ivout ARPACK utility routine that prints integers. +c arscnd ARPACK utility routine for timing. c svout ARPACK utility routine that prints vectors. c slamch LAPACK routine that determines machine constants. c slartg LAPACK Givens rotation construction routine. @@ -107,19 +107,19 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c 12/16/93: Version ' 2.4' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sapps.F SID: 2.6 DATE OF SID: 3/28/97 RELEASE: 2 c c\Remarks c 1. In this version, each shift is applied to all the subblocks of -c the tridiagonal matrix H and not just to the submatrix that it -c comes from. This routine assumes that the subdiagonal elements +c the tridiagonal matrix H and not just to the submatrix that it +c comes from. This routine assumes that the subdiagonal elements c of H that are stored in h(1:kev+np,1) are nonegative upon input c and enforce this condition upon output. This version incorporates c deflation. See code for documentation. @@ -135,8 +135,8 @@ subroutine ssapps c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -149,7 +149,7 @@ subroutine ssapps c %-----------------% c Real - & h(ldh,2), q(ldq,kev+np), resid(n), shift(np), + & h(ldh,2), q(ldq,kev+np), resid(n), shift(np), & v(ldv,kev+np), workd(2*n) c c %------------% @@ -175,8 +175,8 @@ subroutine ssapps c | External Subroutines | c %----------------------% c - external saxpy, scopy, sscal, slacpy, slartg, slaset, svout, - & ivout, second, sgemv + external saxpy, scopy, sscal, slacpy, slartg, slaset, svout, + & ivout, arscnd, sgemv c c %--------------------% c | External Functions | @@ -193,7 +193,7 @@ subroutine ssapps intrinsic abs c c %----------------% -c | Data statments | +c | Data statements | c %----------------% c data first / .true. / @@ -213,11 +213,11 @@ subroutine ssapps c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = msapps -c - kplusp = kev + np -c +c + kplusp = kev + np +c c %----------------------------------------------% c | Initialize Q to the identity matrix of order | c | kplusp used to accumulate the rotations. | @@ -230,7 +230,7 @@ subroutine ssapps c %----------------------------------------------% c if (np .eq. 0) go to 9000 -c +c c %----------------------------------------------------------% c | Apply the np shifts implicitly. Apply each shift to the | c | whole matrix and not just to the submatrix from which it | @@ -238,7 +238,7 @@ subroutine ssapps c %----------------------------------------------------------% c do 90 jj = 1, np -c +c istart = itop c c %----------------------------------------------------------% @@ -261,11 +261,11 @@ subroutine ssapps big = abs(h(i,2)) + abs(h(i+1,2)) if (h(i+1,1) .le. epsmch*big) then if (msglvl .gt. 0) then - call ivout (logfil, 1, i, ndigit, + call ivout (logfil, 1, [i], ndigit, & '_sapps: deflation at row/column no.') - call ivout (logfil, 1, jj, ndigit, - & '_sapps: occured before shift number.') - call svout (logfil, 1, h(i+1,1), ndigit, + call ivout (logfil, 1, [jj], ndigit, + & '_sapps: occurred before shift number.') + call svout (logfil, 1, h(i+1,1), ndigit, & '_sapps: the corresponding off diagonal element') end if h(i+1,1) = zero @@ -277,7 +277,7 @@ subroutine ssapps 40 continue c if (istart .lt. iend) then -c +c c %--------------------------------------------------------% c | Construct the plane rotation G'(istart,istart+1,theta) | c | that attempts to drive h(istart+1,1) to zero. | @@ -286,7 +286,7 @@ subroutine ssapps f = h(istart,2) - shift(jj) g = h(istart+1,1) call slartg (f, g, c, s, r) -c +c c %-------------------------------------------------------% c | Apply rotation to the left and right of H; | c | H <- G' * H * G, where G = G(istart,istart+1,theta). | @@ -296,11 +296,11 @@ subroutine ssapps a1 = c*h(istart,2) + s*h(istart+1,1) a2 = c*h(istart+1,1) + s*h(istart+1,2) a4 = c*h(istart+1,2) - s*h(istart+1,1) - a3 = c*h(istart+1,1) - s*h(istart,2) + a3 = c*h(istart+1,1) - s*h(istart,2) h(istart,2) = c*a1 + s*a2 h(istart+1,2) = c*a4 - s*a3 h(istart+1,1) = c*a3 + s*a4 -c +c c %----------------------------------------------------% c | Accumulate the rotation in the matrix Q; Q <- Q*G | c %----------------------------------------------------% @@ -323,7 +323,7 @@ subroutine ssapps c %----------------------------------------------% c do 70 i = istart+1, iend-1 -c +c c %----------------------------------------------% c | Construct the plane rotation G'(i,i+1,theta) | c | that zeros the i-th bulge that was created | @@ -351,23 +351,23 @@ subroutine ssapps c = -c s = -s end if -c +c c %--------------------------------------------% c | Apply rotation to the left and right of H; | c | H <- G * H * G', where G = G(i,i+1,theta) | c %--------------------------------------------% c h(i,1) = r -c +c a1 = c*h(i,2) + s*h(i+1,1) a2 = c*h(i+1,1) + s*h(i+1,2) a3 = c*h(i+1,1) - s*h(i,2) a4 = c*h(i+1,2) - s*h(i+1,1) -c +c h(i,2) = c*a1 + s*a2 h(i+1,2) = c*a4 - s*a3 h(i+1,1) = c*a3 + s*a4 -c +c c %----------------------------------------------------% c | Accumulate the rotation in the matrix Q; Q <- Q*G | c %----------------------------------------------------% @@ -425,16 +425,16 @@ subroutine ssapps c %------------------------------------------% c | All shifts have been applied. Check for | c | more possible deflation that might occur | -c | after the last shift is applied. | +c | after the last shift is applied. | c %------------------------------------------% c do 100 i = itop, kplusp-1 big = abs(h(i,2)) + abs(h(i+1,2)) if (h(i+1,1) .le. epsmch*big) then if (msglvl .gt. 0) then - call ivout (logfil, 1, i, ndigit, + call ivout (logfil, 1, [i], ndigit, & '_sapps: deflation at row/column no.') - call svout (logfil, 1, h(i+1,1), ndigit, + call svout (logfil, 1, h(i+1,1), ndigit, & '_sapps: the corresponding off diagonal element') end if h(i+1,1) = zero @@ -447,13 +447,13 @@ subroutine ssapps c | This is not necessary if h(kev+1,1) = 0. | c %-------------------------------------------------% c - if ( h(kev+1,1) .gt. zero ) + if ( h(kev+1,1) .gt. zero ) & call sgemv ('N', n, kplusp, one, v, ldv, & q(1,kev+1), 1, zero, workd(n+1), 1) -c +c c %-------------------------------------------------------% c | Compute column 1 to kev of (V*Q) in backward order | -c | taking advantage that Q is an upper triangular matrix | +c | taking advantage that Q is an upper triangular matrix | c | with lower bandwidth np. | c | Place results in v(:,kplusp-kev:kplusp) temporarily. | c %-------------------------------------------------------% @@ -469,15 +469,15 @@ subroutine ssapps c %-------------------------------------------------% c call slacpy ('All', n, kev, v(1,np+1), ldv, v, ldv) -c +c c %--------------------------------------------% c | Copy the (kev+1)-st column of (V*Q) in the | c | appropriate place if h(kev+1,1) .ne. zero. | c %--------------------------------------------% c - if ( h(kev+1,1) .gt. zero ) + if ( h(kev+1,1) .gt. zero ) & call scopy (n, workd(n+1), 1, v(1,kev+1), 1) -c +c c %-------------------------------------% c | Update the residual vector: | c | r <- sigmak*r + betak*v(:,kev+1) | @@ -487,26 +487,26 @@ subroutine ssapps c %-------------------------------------% c call sscal (n, q(kplusp,kev), resid, 1) - if (h(kev+1,1) .gt. zero) + if (h(kev+1,1) .gt. zero) & call saxpy (n, h(kev+1,1), v(1,kev+1), 1, resid, 1) c if (msglvl .gt. 1) then - call svout (logfil, 1, q(kplusp,kev), ndigit, + call svout (logfil, 1, q(kplusp,kev), ndigit, & '_sapps: sigmak of the updated residual vector') - call svout (logfil, 1, h(kev+1,1), ndigit, + call svout (logfil, 1, h(kev+1,1), ndigit, & '_sapps: betak of the updated residual vector') - call svout (logfil, kev, h(1,2), ndigit, + call svout (logfil, kev, h(1,2), ndigit, & '_sapps: updated main diagonal of H for next iteration') if (kev .gt. 1) then - call svout (logfil, kev-1, h(2,1), ndigit, + call svout (logfil, kev-1, h(2,1), ndigit, & '_sapps: updated sub diagonal of H for next iteration') end if end if c - call second (t1) + call arscnd (t1) tsapps = tsapps + (t1 - t0) -c - 9000 continue +c + 9000 continue return c c %---------------% diff --git a/Toolbox/arpack-src/ssaup2.f b/Toolbox/arpack-src/ssaup2.f index bf346297c..504f28fb0 100644 --- a/Toolbox/arpack-src/ssaup2.f +++ b/Toolbox/arpack-src/ssaup2.f @@ -3,35 +3,35 @@ c c\Name: ssaup2 c -c\Description: +c\Description: c Intermediate level interface called by ssaupd. c c\Usage: -c call ssaup2 +c call ssaup2 c ( IDO, BMAT, N, WHICH, NEV, NP, TOL, RESID, MODE, IUPD, -c ISHIFT, MXITER, V, LDV, H, LDH, RITZ, BOUNDS, Q, LDQ, WORKL, +c ISHIFT, MXITER, V, LDV, H, LDH, RITZ, BOUNDS, Q, LDQ, WORKL, c IPNTR, WORKD, INFO ) c c\Arguments c c IDO, BMAT, N, WHICH, NEV, TOL, RESID: same as defined in ssaupd. c MODE, ISHIFT, MXITER: see the definition of IPARAM in ssaupd. -c +c c NP Integer. (INPUT/OUTPUT) -c Contains the number of implicit shifts to apply during -c each Arnoldi/Lanczos iteration. -c If ISHIFT=1, NP is adjusted dynamically at each iteration +c Contains the number of implicit shifts to apply during +c each Arnoldi/Lanczos iteration. +c If ISHIFT=1, NP is adjusted dynamically at each iteration c to accelerate convergence and prevent stagnation. -c This is also roughly equal to the number of matrix-vector +c This is also roughly equal to the number of matrix-vector c products (involving the operator OP) per Arnoldi iteration. c The logic for adjusting is contained within the current c subroutine. c If ISHIFT=0, NP is the number of shifts the user needs -c to provide via reverse comunication. 0 < NP < NCV-NEV. +c to provide via reverse communication. 0 < NP < NCV-NEV. c NP may be less than NCV-NEV since a leading block of the current c upper Tridiagonal matrix has split off and contains "unwanted" c Ritz values. -c Upon termination of the IRA iteration, NP contains the number +c Upon termination of the IRA iteration, NP contains the number c of "converged" wanted Ritz values. c c IUPD Integer. (INPUT) @@ -42,18 +42,18 @@ c The Lanczos basis vectors. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c H Real (NEV+NP) by 2 array. (OUTPUT) c H is used to store the generated symmetric tridiagonal matrix -c The subdiagonal is stored in the first column of H starting +c The subdiagonal is stored in the first column of H starting c at H(2,1). The main diagonal is stored in the second column -c of H starting at H(1,2). If ssaup2 converges store the +c of H starting at H(1,2). If ssaup2 converges store the c B-norm of the final residual vector in H(1,1). c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c RITZ Real array of length NEV+NP. (OUTPUT) @@ -63,33 +63,33 @@ c BOUNDS(1:NEV) contain the error bounds corresponding to RITZ. c c Q Real (NEV+NP) by (NEV+NP) array. (WORKSPACE) -c Private (replicated) work array used to accumulate the +c Private (replicated) work array used to accumulate the c rotation in the shift application step. c c LDQ Integer. (INPUT) c Leading dimension of Q exactly as declared in the calling c program. -c +c c WORKL Real array of length at least 3*(NEV+NP). (INPUT/WORKSPACE) c Private (replicated) array on each PE or array allocated on -c the front end. It is used in the computation of the +c the front end. It is used in the computation of the c tridiagonal eigenvalue problem, the calculation and c application of the shifts and convergence checking. c If ISHIFT .EQ. O and IDO .EQ. 3, the first NP locations -c of WORKL are used in reverse communication to hold the user +c of WORKL are used in reverse communication to hold the user c supplied shifts. c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORKD for +c Pointer to mark the starting locations in the WORKD for c vectors used by the Lanczos iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in one of +c IPNTR(3): pointer to the vector B * X when used in one of c the spectral transformation modes. X is the current c operand. c ------------------------------------------------------------- -c +c c WORKD Real work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Lanczos iteration c for reverse communication. The user should not use WORKD @@ -102,9 +102,9 @@ c possibly from a previous run. c Error flag on output. c = 0: Normal return. -c = 1: All possible eigenvalues of OP has been found. +c = 1: All possible eigenvalues of OP has been found. c NP returns the size of the invariant subspace -c spanning the operator OP. +c spanning the operator OP. c = 2: No shifts could be applied. c = -8: Error return from trid. eigenvalue calculation; c This should never happen. @@ -122,7 +122,7 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett, "The Symmetric Eigenvalue Problem". Prentice-Hall, @@ -132,15 +132,15 @@ c 5. B. Nour-Omid, B.N. Parlett, T. Ericson, P.S. Jensen, "How to c Implement the Spectral Transformation", Math. Comp., 48 (1987), c pp 663-673. -c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos -c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", +c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos +c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", c SIAM J. Matr. Anal. Apps., January (1993). c 7. L. Reichel, W.B. Gragg, "Algorithm 686: FORTRAN Subroutines c for Updating the QR decomposition", ACM TOMS, December 1990, c Volume 16 Number 4, pp 369-377. c c\Routines called: -c sgetv0 ARPACK initial vector generation routine. +c sgetv0 ARPACK initial vector generation routine. c ssaitr ARPACK Lanczos factorization routine. c ssapps ARPACK application of implicit shifts routine. c ssconv ARPACK convergence of Ritz values routine. @@ -148,11 +148,11 @@ c ssgets ARPACK reorder Ritz values and error bounds routine. c ssortr ARPACK sorting routine. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c svout ARPACK utility routine that prints vectors. c slamch LAPACK routine that determines machine constants. c scopy Level 1 BLAS that copies one vector to another. -c sdot Level 1 BLAS that computes the scalar product of two vectors. +c sdot Level 1 BLAS that computes the scalar product of two vectors. c snrm2 Level 1 BLAS that computes the norm of a vector. c sscal Level 1 BLAS that scales a vector. c sswap Level 1 BLAS that swaps two vectors. @@ -162,14 +162,14 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: c 12/15/93: Version ' 2.4' c xx/xx/95: Version ' 2.4'. (R.B. Lehoucq) c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: saup2.F SID: 2.7 DATE OF SID: 5/19/98 RELEASE: 2 c c\EndLib @@ -177,16 +177,16 @@ c----------------------------------------------------------------------- c subroutine ssaup2 - & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, - & ishift, mxiter, v, ldv, h, ldh, ritz, bounds, + & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, + & ishift, mxiter, v, ldv, h, ldh, ritz, bounds, & q, ldq, workl, ipntr, workd, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -204,8 +204,8 @@ subroutine ssaup2 c integer ipntr(3) Real - & bounds(nev+np), h(ldh,2), q(ldq,nev+np), resid(n), - & ritz(nev+np), v(ldv,nev+np), workd(3*n), + & bounds(nev+np), h(ldh,2), q(ldq,nev+np), resid(n), + & ritz(nev+np), v(ldv,nev+np), workd(3*n), & workl(3*(nev+np)) c c %------------% @@ -222,8 +222,8 @@ subroutine ssaup2 c character wprime*2 logical cnorm, getv0, initv, update, ushift - integer ierr, iter, j, kplusp, msglvl, nconv, nevbef, nev0, - & np0, nptemp, nevd2, nevm2, kp(3) + integer ierr, iter, j, kplusp, msglvl, nconv, nevbef, nev0, + & np0, nptemp, nevd2, nevm2, kp(3) Real & rnorm, temp, eps23 save cnorm, getv0, initv, update, ushift, @@ -234,8 +234,8 @@ subroutine ssaup2 c | External Subroutines | c %----------------------% c - external scopy, sgetv0, ssaitr, sscal, ssconv, sseigt, ssgets, - & ssapps, ssortr, svout, ivout, second, sswap + external scopy, sgetv0, ssaitr, sscal, ssconv, sseigt, ssgets, + & ssapps, ssortr, svout, ivout, arscnd, sswap c c %--------------------% c | External Functions | @@ -256,13 +256,13 @@ subroutine ssaup2 c %-----------------------% c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = msaup2 c c %---------------------------------% @@ -292,7 +292,7 @@ subroutine ssaup2 kplusp = nev0 + np0 nconv = 0 iter = 0 -c +c c %--------------------------------------------% c | Set flags for computing the first NEV steps | c | of the Lanczos factorization. | @@ -315,7 +315,7 @@ subroutine ssaup2 initv = .false. end if end if -c +c c %---------------------------------------------% c | Get a possibly random starting vector and | c | force it into the range of the operator OP. | @@ -332,7 +332,7 @@ subroutine ssaup2 if (rnorm .eq. zero) then c c %-----------------------------------------% -c | The initial vector is zero. Error exit. | +c | The initial vector is zero. Error exit. | c %-----------------------------------------% c info = -9 @@ -341,7 +341,7 @@ subroutine ssaup2 getv0 = .false. ido = 0 end if -c +c c %------------------------------------------------------------% c | Back from reverse communication: continue with update step | c %------------------------------------------------------------% @@ -360,14 +360,14 @@ subroutine ssaup2 c %-------------------------------------% c if (cnorm) go to 100 -c +c c %----------------------------------------------------------% c | Compute the first NEV steps of the Lanczos factorization | c %----------------------------------------------------------% c - call ssaitr (ido, bmat, n, 0, nev0, mode, resid, rnorm, v, ldv, + call ssaitr (ido, bmat, n, 0, nev0, mode, resid, rnorm, v, ldv, & h, ldh, ipntr, workd, info) -c +c c %---------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP and possibly B | @@ -388,7 +388,7 @@ subroutine ssaup2 info = -9999 go to 1200 end if -c +c c %--------------------------------------------------------------% c | | c | M A I N LANCZOS I T E R A T I O N L O O P | @@ -396,22 +396,22 @@ subroutine ssaup2 c | factorization in place. | c | | c %--------------------------------------------------------------% -c +c 1000 continue c iter = iter + 1 c if (msglvl .gt. 0) then - call ivout (logfil, 1, iter, ndigit, + call ivout (logfil, 1, [iter], ndigit, & '_saup2: **** Start of major iteration number ****') end if if (msglvl .gt. 1) then - call ivout (logfil, 1, nev, ndigit, + call ivout (logfil, 1, [nev], ndigit, & '_saup2: The length of the current Lanczos factorization') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_saup2: Extend the Lanczos factorization by') end if -c +c c %------------------------------------------------------------% c | Compute NP additional steps of the Lanczos factorization. | c %------------------------------------------------------------% @@ -420,9 +420,9 @@ subroutine ssaup2 20 continue update = .true. c - call ssaitr (ido, bmat, n, nev, np, mode, resid, rnorm, v, + call ssaitr (ido, bmat, n, nev, np, mode, resid, rnorm, v, & ldv, h, ldh, ipntr, workd, info) -c +c c %---------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP and possibly B | @@ -434,7 +434,7 @@ subroutine ssaup2 c c %-----------------------------------------------------% c | ssaitr was unable to build an Lanczos factorization | -c | of length NEV0+NP0. INFO is returned with the size | +c | of length NEV0+NP0. INFO is returned with the size | c | of the factorization built. Exit main loop. | c %-----------------------------------------------------% c @@ -446,10 +446,10 @@ subroutine ssaup2 update = .false. c if (msglvl .gt. 1) then - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_saup2: Current B-norm of residual for factorization') end if -c +c c %--------------------------------------------------------% c | Compute the eigenvalues and corresponding error bounds | c | of the current symmetric tridiagonal matrix. | @@ -483,7 +483,7 @@ subroutine ssaup2 nev = nev0 np = np0 call ssgets (ishift, which, nev, np, ritz, bounds, workl) -c +c c %-------------------% c | Convergence test. | c %-------------------% @@ -520,11 +520,11 @@ subroutine ssaup2 nev = nev + 1 end if 30 continue -c - if ( (nconv .ge. nev0) .or. +c + if ( (nconv .ge. nev0) .or. & (iter .gt. mxiter) .or. & (np .eq. 0) ) then -c +c c %------------------------------------------------% c | Prepare to exit. Put the converged Ritz values | c | and corresponding bounds in RITZ(1:NCONV) and | @@ -547,7 +547,7 @@ subroutine ssaup2 wprime = 'SA' call ssortr (wprime, .true., kplusp, ritz, bounds) nevd2 = nev0 / 2 - nevm2 = nev0 - nevd2 + nevm2 = nev0 - nevd2 if ( nev .gt. 1 ) then call sswap ( min(nevd2,np), ritz(nevm2+1), 1, & ritz( max(kplusp-nevd2+1,kplusp-np+1) ), 1) @@ -587,7 +587,7 @@ subroutine ssaup2 c c %----------------------------------------------------% c | Sort the Ritz values according to the scaled Ritz | -c | esitmates. This will push all the converged ones | +c | estimates. This will push all the converged ones | c | towards the front of ritzr, ritzi, bounds | c | (in the case when NCONV < NEV.) | c %----------------------------------------------------% @@ -651,13 +651,13 @@ subroutine ssaup2 end if c c %------------------------------------% -c | Max iterations have been exceeded. | +c | Max iterations have been exceeded. | c %------------------------------------% c if (iter .gt. mxiter .and. nconv .lt. nev) info = 1 c c %---------------------% -c | No shifts to apply. | +c | No shifts to apply. | c %---------------------% c if (np .eq. 0 .and. nconv .lt. nev0) info = 2 @@ -681,20 +681,20 @@ subroutine ssaup2 nev = 2 end if np = kplusp - nev -c +c c %---------------------------------------% c | If the size of NEV was just increased | c | resort the eigenvalues. | c %---------------------------------------% -c - if (nevbef .lt. nev) +c + if (nevbef .lt. nev) & call ssgets (ishift, which, nev, np, ritz, bounds, & workl) c end if c if (msglvl .gt. 0) then - call ivout (logfil, 1, nconv, ndigit, + call ivout (logfil, 1, [nconv], ndigit, & '_saup2: no. of "converged" Ritz values at this iter.') if (msglvl .gt. 1) then kp(1) = nev @@ -708,7 +708,7 @@ subroutine ssaup2 end if end if -c +c if (ishift .eq. 0) then c c %-----------------------------------------------------% @@ -731,8 +731,8 @@ subroutine ssaup2 c %------------------------------------% c ushift = .false. -c -c +c +c c %---------------------------------------------------------% c | Move the NP shifts to the first NP locations of RITZ to | c | free up WORKL. This is for the non-exact shift case; | @@ -742,7 +742,7 @@ subroutine ssaup2 if (ishift .eq. 0) call scopy (np, workl, 1, ritz, 1) c if (msglvl .gt. 2) then - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_saup2: The number of shifts to apply ') call svout (logfil, np, workl, ndigit, & '_saup2: shifts selected') @@ -751,7 +751,7 @@ subroutine ssaup2 & '_saup2: corresponding Ritz estimates') end if end if -c +c c %---------------------------------------------------------% c | Apply the NP0 implicit shifts by QR bulge chasing. | c | Each shift is applied to the entire tridiagonal matrix. | @@ -770,36 +770,36 @@ subroutine ssaup2 c %---------------------------------------------% c cnorm = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call scopy (n, resid, 1, workd(n+1), 1) ipntr(1) = n + 1 ipntr(2) = 1 ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*RESID | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call scopy (n, resid, 1, workd, 1) end if -c +c 100 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(1:N) := B*RESID | c %----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c - if (bmat .eq. 'G') then +c + if (bmat .eq. 'G') then rnorm = sdot (n, resid, 1, workd, 1) rnorm = sqrt(abs(rnorm)) else if (bmat .eq. 'I') then @@ -809,14 +809,14 @@ subroutine ssaup2 130 continue c if (msglvl .gt. 2) then - call svout (logfil, 1, rnorm, ndigit, + call svout (logfil, 1, [rnorm], ndigit, & '_saup2: B-norm of residual for NEV factorization') call svout (logfil, nev, h(1,2), ndigit, & '_saup2: main diagonal of compressed H matrix') call svout (logfil, nev-1, h(2,1), ndigit, & '_saup2: subdiagonal of compressed H matrix') end if -c +c go to 1000 c c %---------------------------------------------------------------% @@ -824,12 +824,12 @@ subroutine ssaup2 c | E N D O F M A I N I T E R A T I O N L O O P | c | | c %---------------------------------------------------------------% -c +c 1100 continue c mxiter = iter nev = nconv -c +c 1200 continue ido = 99 c @@ -837,9 +837,9 @@ subroutine ssaup2 c | Error exit | c %------------% c - call second (t1) + call arscnd (t1) tsaup2 = t1 - t0 -c +c 9000 continue return c diff --git a/Toolbox/arpack-src/ssaupd.f b/Toolbox/arpack-src/ssaupd.f index 1989ed254..975681527 100644 --- a/Toolbox/arpack-src/ssaupd.f +++ b/Toolbox/arpack-src/ssaupd.f @@ -3,31 +3,31 @@ c c\Name: ssaupd c -c\Description: +c\Description: c -c Reverse communication interface for the Implicitly Restarted Arnoldi -c Iteration. For symmetric problems this reduces to a variant of the Lanczos -c method. This method has been designed to compute approximations to a -c few eigenpairs of a linear operator OP that is real and symmetric -c with respect to a real positive semi-definite symmetric matrix B, +c Reverse communication interface for the Implicitly Restarted Arnoldi +c Iteration. For symmetric problems this reduces to a variant of the Lanczos +c method. This method has been designed to compute approximations to a +c few eigenpairs of a linear operator OP that is real and symmetric +c with respect to a real positive semi-definite symmetric matrix B, c i.e. -c -c B*OP = (OP`)*B. c -c Another way to express this condition is +c B*OP = (OP`)*B. +c +c Another way to express this condition is c c < x,OPy > = < OPx,y > where < z,w > = z`Bw . -c -c In the standard eigenproblem B is the identity matrix. +c +c In the standard eigenproblem B is the identity matrix. c ( A` denotes transpose of A) c c The computed approximate eigenvalues are called Ritz values and c the corresponding approximate eigenvectors are called Ritz vectors. c -c ssaupd is usually called iteratively to solve one of the +c ssaupd is usually called iteratively to solve one of the c following problems: c -c Mode 1: A*x = lambda*x, A symmetric +c Mode 1: A*x = lambda*x, A symmetric c ===> OP = A and B = I. c c Mode 2: A*x = lambda*M*x, A symmetric, M symmetric positive definite @@ -35,10 +35,10 @@ c ===> (If M can be factored see remark 3 below) c c Mode 3: K*x = lambda*M*x, K symmetric, M symmetric positive semi-definite -c ===> OP = (inv[K - sigma*M])*M and B = M. +c ===> OP = (inv[K - sigma*M])*M and B = M. c ===> Shift-and-Invert mode c -c Mode 4: K*x = lambda*KG*x, K symmetric positive semi-definite, +c Mode 4: K*x = lambda*KG*x, K symmetric positive semi-definite, c KG symmetric indefinite c ===> OP = (inv[K - sigma*KG])*K and B = K. c ===> Buckling mode @@ -60,13 +60,13 @@ c approximations. c c\Usage: -c call ssaupd +c call ssaupd c ( IDO, BMAT, N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, c IPNTR, WORKD, WORKL, LWORKL, INFO ) c c\Arguments c IDO Integer. (INPUT/OUTPUT) -c Reverse communication flag. IDO must be zero on the first +c Reverse communication flag. IDO must be zero on the first c call to ssaupd. IDO will be set internally to c indicate the type of operation to be performed. Control is c then given back to the calling routine which has the @@ -95,7 +95,7 @@ c placing the shifts. See remark 6 below. c IDO = 99: done c ------------------------------------------------------------- -c +c c BMAT Character*1. (INPUT) c BMAT specifies the type of the matrix B that defines the c semi-inner product for the operator OP. @@ -111,7 +111,7 @@ c 'LA' - compute the NEV largest (algebraic) eigenvalues. c 'SA' - compute the NEV smallest (algebraic) eigenvalues. c 'LM' - compute the NEV largest (in magnitude) eigenvalues. -c 'SM' - compute the NEV smallest (in magnitude) eigenvalues. +c 'SM' - compute the NEV smallest (in magnitude) eigenvalues. c 'BE' - compute NEV eigenvalues, half from each end of the c spectrum. When NEV is odd, compute one more from the c high end than from the low end. @@ -121,27 +121,27 @@ c Number of eigenvalues of OP to be computed. 0 < NEV < N. c c TOL Real scalar. (INPUT) -c Stopping criterion: the relative accuracy of the Ritz value +c Stopping criterion: the relative accuracy of the Ritz value c is considered acceptable if BOUNDS(I) .LE. TOL*ABS(RITZ(I)). c If TOL .LE. 0. is passed a default is set: c DEFAULT = SLAMCH('EPS') (machine precision as computed c by the LAPACK auxiliary subroutine SLAMCH). c c RESID Real array of length N. (INPUT/OUTPUT) -c On INPUT: +c On INPUT: c If INFO .EQ. 0, a random initial residual vector is used. c If INFO .NE. 0, RESID contains the initial residual vector, c possibly from a previous run. c On OUTPUT: -c RESID contains the final residual vector. +c RESID contains the final residual vector. c c NCV Integer. (INPUT) c Number of columns of the matrix V (less than or equal to N). -c This will indicate how many Lanczos vectors are generated -c at each iteration. After the startup phase in which NEV -c Lanczos vectors are generated, the algorithm generates +c This will indicate how many Lanczos vectors are generated +c at each iteration. After the startup phase in which NEV +c Lanczos vectors are generated, the algorithm generates c NCV-NEV Lanczos vectors at each subsequent update iteration. -c Most of the cost in generating each Lanczos vector is in the +c Most of the cost in generating each Lanczos vector is in the c matrix-vector product OP*x. (See remark 4 below). c c V Real N by NCV array. (OUTPUT) @@ -161,10 +161,10 @@ c the current tridiagonal matrix T are returned in c the part of WORKL array corresponding to RITZ. c See remark 6 below. -c ISHIFT = 1: exact shifts with respect to the reduced -c tridiagonal matrix T. This is equivalent to -c restarting the iteration with a starting vector -c that is a linear combination of Ritz vectors +c ISHIFT = 1: exact shifts with respect to the reduced +c tridiagonal matrix T. This is equivalent to +c restarting the iteration with a starting vector +c that is a linear combination of Ritz vectors c associated with the "wanted" Ritz values. c ------------------------------------------------------------- c @@ -172,8 +172,8 @@ c No longer referenced. See remark 2 below. c c IPARAM(3) = MXITER -c On INPUT: maximum number of Arnoldi update iterations allowed. -c On OUTPUT: actual number of Arnoldi update iterations taken. +c On INPUT: maximum number of Arnoldi update iterations allowed. +c On OUTPUT: actual number of Arnoldi update iterations taken. c c IPARAM(4) = NB: blocksize to be used in the recurrence. c The code currently works only for NB = 1. @@ -183,11 +183,11 @@ c the convergence criterion. c c IPARAM(6) = IUPD -c No longer referenced. Implicit restarting is ALWAYS used. +c No longer referenced. Implicit restarting is ALWAYS used. c c IPARAM(7) = MODE c On INPUT determines what type of eigenproblem is being solved. -c Must be 1,2,3,4,5; See under \Description of ssaupd for the +c Must be 1,2,3,4,5; See under \Description of ssaupd for the c five modes available. c c IPARAM(8) = NP @@ -199,7 +199,7 @@ c IPARAM(9) = NUMOP, IPARAM(10) = NUMOPB, IPARAM(11) = NUMREO, c OUTPUT: NUMOP = total number of OP*x operations, c NUMOPB = total number of B*x operations if BMAT='G', -c NUMREO = total number of steps of re-orthogonalization. +c NUMREO = total number of steps of re-orthogonalization. c c IPNTR Integer array of length 11. (OUTPUT) c Pointer to mark the starting locations in the WORKD and WORKL @@ -207,7 +207,7 @@ c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X in WORKD. c IPNTR(2): pointer to the current result vector Y in WORKD. -c IPNTR(3): pointer to the vector B * X in WORKD when used in +c IPNTR(3): pointer to the vector B * X in WORKD when used in c the shift-and-invert mode. c IPNTR(4): pointer to the next available location in WORKL c that is untouched by the program. @@ -224,14 +224,14 @@ c of the tridiagonal matrix T. Only referenced by c sseupd if RVEC = .TRUE. See Remarks. c ------------------------------------------------------------- -c +c c WORKD Real work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The user should not use WORKD +c for reverse communication. The user should not use WORKD c as temporary workspace during the iteration. Upon termination c WORKD(1:N) contains B*RESID(1:N). If the Ritz vectors are desired c subroutine sseupd uses this output. -c See Data Distribution Note below. +c See Data Distribution Note below. c c WORKL Real work array of length LWORKL. (OUTPUT/WORKSPACE) c Private (replicated) array on each PE or array allocated on @@ -247,13 +247,13 @@ c Error flag on output. c = 0: Normal exit. c = 1: Maximum number of iterations taken. -c All possible eigenvalues of OP has been found. IPARAM(5) +c All possible eigenvalues of OP has been found. IPARAM(5) c returns the number of wanted converged Ritz values. c = 2: No longer an informational error. Deprecated starting c with release 2 of ARPACK. -c = 3: No shifts could be applied during a cycle of the -c Implicitly restarted Arnoldi iteration. One possibility -c is to increase the size of NCV relative to NEV. +c = 3: No shifts could be applied during a cycle of the +c Implicitly restarted Arnoldi iteration. One possibility +c is to increase the size of NCV relative to NEV. c See remark 4 below. c = -1: N must be positive. c = -2: NEV must be positive. @@ -267,9 +267,9 @@ c Informatinal error from LAPACK routine ssteqr. c = -9: Starting vector is zero. c = -10: IPARAM(7) must be 1,2,3,4,5. -c = -11: IPARAM(7) = 1 and BMAT = 'G' are incompatable. +c = -11: IPARAM(7) = 1 and BMAT = 'G' are incompatible. c = -12: IPARAM(1) must be equal to 0 or 1. -c = -13: NEV and WHICH = 'BE' are incompatable. +c = -13: NEV and WHICH = 'BE' are incompatible. c = -9999: Could not build an Arnoldi factorization. c IPARAM(5) returns the size of the current Arnoldi c factorization. The user is advised to check that @@ -277,12 +277,12 @@ c c c\Remarks -c 1. The converged Ritz values are always returned in ascending +c 1. The converged Ritz values are always returned in ascending c algebraic order. The computed Ritz values are approximate c eigenvalues of OP. The selection of WHICH should be made -c with this in mind when Mode = 3,4,5. After convergence, -c approximate eigenvalues of the original problem may be obtained -c with the ARPACK subroutine sseupd. +c with this in mind when Mode = 3,4,5. After convergence, +c approximate eigenvalues of the original problem may be obtained +c with the ARPACK subroutine sseupd. c c 2. If the Ritz vectors corresponding to the converged Ritz values c are needed, the user must call sseupd immediately following completion @@ -290,38 +290,38 @@ c c 3. If M can be factored into a Cholesky factorization M = LL` c then Mode = 2 should not be selected. Instead one should use -c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular +c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular c linear systems should be solved with L and L` rather c than computing inverses. After convergence, an approximate c eigenvector z of the original problem is recovered by solving c L`z = x where x is a Ritz vector of OP. c c 4. At present there is no a-priori analysis to guide the selection -c of NCV relative to NEV. The only formal requrement is that NCV > NEV. +c of NCV relative to NEV. The only formal requirement is that NCV > NEV. c However, it is recommended that NCV .ge. 2*NEV. If many problems of c the same type are to be solved, one should experiment with increasing -c NCV while keeping NEV fixed for a given test problem. This will +c NCV while keeping NEV fixed for a given test problem. This will c usually decrease the required number of OP*x operations but it c also increases the work and storage required to maintain the orthogonal c basis vectors. The optimal "cross-over" with respect to CPU time c is problem dependent and must be determined empirically. c -c 5. If IPARAM(7) = 2 then in the Reverse commuication interface the user +c 5. If IPARAM(7) = 2 then in the Reverse communication interface the user c must do the following. When IDO = 1, Y = OP * X is to be computed. c When IPARAM(7) = 2 OP = inv(B)*A. After computing A*X the user c must overwrite X with A*X. Y is then the solution to the linear set c of equations B*Y = A*X. c -c 6. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the -c NP = IPARAM(8) shifts in locations: -c 1 WORKL(IPNTR(11)) -c 2 WORKL(IPNTR(11)+1) -c . -c . -c . -c NP WORKL(IPNTR(11)+NP-1). +c 6. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the +c NP = IPARAM(8) shifts in locations: +c 1 WORKL(IPNTR(11)) +c 2 WORKL(IPNTR(11)+1) +c . +c . +c . +c NP WORKL(IPNTR(11)+NP-1). c -c The eigenvalues of the current tridiagonal matrix are located in +c The eigenvalues of the current tridiagonal matrix are located in c WORKL(IPNTR(6)) through WORKL(IPNTR(6)+NCV-1). They are in the c order defined by WHICH. The associated Ritz estimates are located in c WORKL(IPNTR(8)), WORKL(IPNTR(8)+1), ... , WORKL(IPNTR(8)+NCV-1). @@ -347,7 +347,7 @@ c REAL RESID(N), V(LDV,NCV), WORKD(N,3), WORKL(LWORKL) c SHARED RESID(BLOCK), V(BLOCK,:), WORKD(BLOCK,:) c REPLICATED WORKL(LWORKL) -c +c c c\BeginLib c @@ -355,7 +355,7 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett, "The Symmetric Eigenvalue Problem". Prentice-Hall, @@ -365,8 +365,8 @@ c 5. B. Nour-Omid, B.N. Parlett, T. Ericson, P.S. Jensen, "How to c Implement the Spectral Transformation", Math. Comp., 48 (1987), c pp 663-673. -c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos -c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", +c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos +c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", c SIAM J. Matr. Anal. Apps., January (1993). c 7. L. Reichel, W.B. Gragg, "Algorithm 686: FORTRAN Subroutines c for Updating the QR decomposition", ACM TOMS, December 1990, @@ -380,7 +380,7 @@ c sstats ARPACK routine that initialize timing and other statistics c variables. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c svout ARPACK utility routine that prints vectors. c slamch LAPACK routine that determines machine constants. c @@ -389,14 +389,14 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: -c 12/15/93: Version ' 2.4' +c 12/15/93: Version ' 2.4' c -c\SCCS Information: @(#) -c FILE: saupd.F SID: 2.8 DATE OF SID: 04/10/01 RELEASE: 2 +c\SCCS Information: @(#) +c FILE: saupd.F SID: 2.8 DATE OF SID: 04/10/01 RELEASE: 2 c c\Remarks c 1. None @@ -406,15 +406,15 @@ c----------------------------------------------------------------------- c subroutine ssaupd - & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, + & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, & ipntr, workd, workl, lworkl, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -422,7 +422,7 @@ subroutine ssaupd c character bmat*1, which*2 integer ido, info, ldv, lworkl, n, ncv, nev - Real + Real & tol c c %-----------------% @@ -430,14 +430,14 @@ subroutine ssaupd c %-----------------% c integer iparam(11), ipntr(11) - Real + Real & resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) c c %------------% c | Parameters | c %------------% c - Real + Real & one, zero parameter (one = 1.0E+0 , zero = 0.0E+0 ) c @@ -445,7 +445,7 @@ subroutine ssaupd c | Local Scalars | c %---------------% c - integer bounds, ierr, ih, iq, ishift, iupd, iw, + integer bounds, ierr, ih, iq, ishift, iupd, iw, & ldh, ldq, msglvl, mxiter, mode, nb, & nev0, next, np, ritz, j save bounds, ierr, ih, iq, ishift, iupd, iw, @@ -456,20 +456,20 @@ subroutine ssaupd c | External Subroutines | c %----------------------% c - external ssaup2, svout, ivout, second, sstats + external ssaup2, svout, ivout, arscnd, sstats c c %--------------------% c | External Functions | c %--------------------% c - Real + Real & slamch external slamch c c %-----------------------% c | Executable Statements | c %-----------------------% -c +c if (ido .eq. 0) then c c %-------------------------------% @@ -478,7 +478,7 @@ subroutine ssaupd c %-------------------------------% c call sstats - call second (t0) + call arscnd (t0) msglvl = msaupd c ierr = 0 @@ -512,7 +512,7 @@ subroutine ssaupd c %----------------------------------------------% c np = ncv - nev -c +c if (mxiter .le. 0) ierr = -4 if (which .ne. 'LM' .and. & which .ne. 'SM' .and. @@ -531,7 +531,7 @@ subroutine ssaupd else if (nev .eq. 1 .and. which .eq. 'BE') then ierr = -13 end if -c +c c %------------% c | Error Exit | c %------------% @@ -541,7 +541,7 @@ subroutine ssaupd ido = 99 go to 9000 end if -c +c c %------------------------% c | Set default parameters | c %------------------------% @@ -557,8 +557,8 @@ subroutine ssaupd c %----------------------------------------------% c np = ncv - nev - nev0 = nev -c + nev0 = nev +c c %-----------------------------% c | Zero out internal workspace | c %-----------------------------% @@ -566,7 +566,7 @@ subroutine ssaupd do 10 j = 1, ncv**2 + 8*ncv workl(j) = zero 10 continue -c +c c %-------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, BOUNDS, Q | c | etc... and the remaining workspace. | @@ -599,7 +599,7 @@ subroutine ssaupd c | Carry out the Implicitly restarted Lanczos Iteration. | c %-------------------------------------------------------% c - call ssaup2 + call ssaup2 & ( ido, bmat, n, which, nev0, np, tol, resid, mode, iupd, & ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritz), & workl(bounds), workl(iq), ldq, workl(iw), ipntr, workd, @@ -612,7 +612,7 @@ subroutine ssaupd c if (ido .eq. 3) iparam(8) = np if (ido .ne. 99) go to 9000 -c +c iparam(3) = mxiter iparam(5) = np iparam(9) = nopx @@ -628,19 +628,19 @@ subroutine ssaupd if (info .eq. 2) info = 3 c if (msglvl .gt. 0) then - call ivout (logfil, 1, mxiter, ndigit, + call ivout (logfil, 1, [mxiter], ndigit, & '_saupd: number of update iterations taken') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_saupd: number of "converged" Ritz values') - call svout (logfil, np, workl(Ritz), ndigit, + call svout (logfil, np, workl(Ritz), ndigit, & '_saupd: final Ritz values') - call svout (logfil, np, workl(Bounds), ndigit, + call svout (logfil, np, workl(Bounds), ndigit, & '_saupd: corresponding error bounds') - end if + end if c - call second (t1) + call arscnd (t1) tsaupd = t1 - t0 -c +c if (msglvl .gt. 0) then c c %--------------------------------------------------------% @@ -678,9 +678,9 @@ subroutine ssaupd & 5x, 'Total time in applying the shifts = ', f12.6,/ & 5x, 'Total time in convergence testing = ', f12.6) end if -c +c 9000 continue -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/ssconv.f b/Toolbox/arpack-src/ssconv.f index 4987c7e25..11e4cab26 100644 --- a/Toolbox/arpack-src/ssconv.f +++ b/Toolbox/arpack-src/ssconv.f @@ -3,7 +3,7 @@ c c\Name: ssconv c -c\Description: +c\Description: c Convergence testing for the symmetric Arnoldi eigenvalue routine. c c\Usage: @@ -34,23 +34,23 @@ c\BeginLib c c\Routines called: -c second ARPACK utility routine for timing. -c slamch LAPACK routine that determines machine constants. +c arscnd ARPACK utility routine for timing. +c slamch LAPACK routine that determines machine constants. c c\Author c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas +c Richard Lehoucq CRPC / Rice University +c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sconv.F SID: 2.4 DATE OF SID: 4/19/96 RELEASE: 2 c c\Remarks c 1. Starting with version 2.4, this routine no longer uses the -c Parlett strategy using the gap conditions. +c Parlett strategy using the gap conditions. c c\EndLib c @@ -62,8 +62,8 @@ subroutine ssconv (n, ritz, bounds, tol, nconv) c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -106,9 +106,9 @@ subroutine ssconv (n, ritz, bounds, tol, nconv) c | Executable Statements | c %-----------------------% c - call second (t0) + call arscnd (t0) c - eps23 = slamch('Epsilon-Machine') + eps23 = slamch('Epsilon-Machine') eps23 = eps23**(2.0E+0 / 3.0E+0) c nconv = 0 @@ -125,10 +125,10 @@ subroutine ssconv (n, ritz, bounds, tol, nconv) end if c 10 continue -c - call second (t1) +c + call arscnd (t1) tsconv = tsconv + (t1 - t0) -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/sseigt.f b/Toolbox/arpack-src/sseigt.f index 0b4a586cd..3ac336690 100644 --- a/Toolbox/arpack-src/sseigt.f +++ b/Toolbox/arpack-src/sseigt.f @@ -3,7 +3,7 @@ c c\Name: sseigt c -c\Description: +c\Description: c Compute the eigenvalues of the current symmetric tridiagonal matrix c and the corresponding error bounds given the current residual norm. c @@ -20,16 +20,16 @@ c Size of the symmetric tridiagonal matrix H. c c H Real N by 2 array. (INPUT) -c H contains the symmetric tridiagonal matrix with the -c subdiagonal in the first column starting at H(2,1) and the +c H contains the symmetric tridiagonal matrix with the +c subdiagonal in the first column starting at H(2,1) and the c main diagonal in second column. c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c EIG Real array of length N. (OUTPUT) -c On output, EIG contains the N eigenvalues of H possibly +c On output, EIG contains the N eigenvalues of H possibly c unsorted. The BOUNDS arrays are returned in the c same sorted order as EIG. c @@ -59,22 +59,22 @@ c sstqrb ARPACK routine that computes the eigenvalues and the c last components of the eigenvectors of a symmetric c and tridiagonal matrix. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c svout ARPACK utility routine that prints vectors. c scopy Level 1 BLAS that copies one vector to another. c c\Author c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas +c Richard Lehoucq CRPC / Rice University +c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.4' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: seigt.F SID: 2.4 DATE OF SID: 8/27/96 RELEASE: 2 c c\Remarks @@ -84,15 +84,15 @@ c c----------------------------------------------------------------------- c - subroutine sseigt + subroutine sseigt & ( rnorm, n, h, ldh, eig, bounds, workl, ierr ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -127,7 +127,7 @@ subroutine sseigt c | External Subroutines | c %----------------------% c - external scopy, sstqrb, svout, second + external scopy, sstqrb, svout, arscnd c c %-----------------------% c | Executable Statements | @@ -136,9 +136,9 @@ subroutine sseigt c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | -c %-------------------------------% +c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mseigt c if (msglvl .gt. 0) then @@ -167,8 +167,8 @@ subroutine sseigt do 30 k = 1, n bounds(k) = rnorm*abs(bounds(k)) 30 continue -c - call second (t1) +c + call arscnd (t1) tseigt = tseigt + (t1 - t0) c 9000 continue diff --git a/Toolbox/arpack-src/ssesrt.f b/Toolbox/arpack-src/ssesrt.f index 36e8787e1..afc71b088 100644 --- a/Toolbox/arpack-src/ssesrt.f +++ b/Toolbox/arpack-src/ssesrt.f @@ -4,7 +4,7 @@ c\Name: ssesrt c c\Description: -c Sort the array X in the order specified by WHICH and optionally +c Sort the array X in the order specified by WHICH and optionally c apply the permutation to the columns of the matrix A. c c\Usage: @@ -32,7 +32,7 @@ c Number of rows of the matrix A. c c A Real array of length NA by N. (INPUT/OUTPUT) -c +c c LDA Integer. (INPUT) c Leading dimension of A. c @@ -47,18 +47,18 @@ c c\Authors c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas +c Richard Lehoucq CRPC / Rice University +c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c 12/15/93: Version ' 2.1'. -c Adapted from the sort routine in LANSO and +c Adapted from the sort routine in LANSO and c the ARPACK code ssortr c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sesrt.F SID: 2.3 DATE OF SID: 4/19/96 RELEASE: 2 c c\EndLib @@ -101,7 +101,7 @@ subroutine ssesrt (which, apply, n, x, na, a, lda) c %-----------------------% c igap = n / 2 -c +c if (which .eq. 'SA') then c c X is sorted into decreasing order of algebraic. @@ -165,7 +165,7 @@ subroutine ssesrt (which, apply, n, x, na, a, lda) 80 continue c if (j.lt.0) go to 90 -c +c if (x(j).gt.x(j+igap)) then temp = x(j) x(j) = x(j+igap) @@ -179,7 +179,7 @@ subroutine ssesrt (which, apply, n, x, na, a, lda) 90 continue igap = igap / 2 go to 70 -c +c else if (which .eq. 'LM') then c c X is sorted into increasing order of magnitude. diff --git a/Toolbox/arpack-src/sseupd.f b/Toolbox/arpack-src/sseupd.f index b8b10edbb..03ba7ac50 100644 --- a/Toolbox/arpack-src/sseupd.f +++ b/Toolbox/arpack-src/sseupd.f @@ -2,7 +2,7 @@ c c\Name: sseupd c -c\Description: +c\Description: c c This subroutine returns the converged approximations to eigenvalues c of A*z = lambda*B*z and (optionally): @@ -15,22 +15,22 @@ c (3) Both. c c There is negligible additional cost to obtain eigenvectors. An orthonormal -c (Lanczos) basis is always computed. There is an additional storage cost -c of n*nev if both are requested (in this case a separate array Z must be +c (Lanczos) basis is always computed. There is an additional storage cost +c of n*nev if both are requested (in this case a separate array Z must be c supplied). c c These quantities are obtained from the Lanczos factorization computed c by SSAUPD for the linear operator OP prescribed by the MODE selection c (see IPARAM(7) in SSAUPD documentation.) SSAUPD must be called before -c this routine is called. These approximate eigenvalues and vectors are -c commonly called Ritz values and Ritz vectors respectively. They are -c referred to as such in the comments that follow. The computed orthonormal -c basis for the invariant subspace corresponding to these Ritz values is +c this routine is called. These approximate eigenvalues and vectors are +c commonly called Ritz values and Ritz vectors respectively. They are +c referred to as such in the comments that follow. The computed orthonormal +c basis for the invariant subspace corresponding to these Ritz values is c referred to as a Lanczos basis. c -c See documentation in the header of the subroutine SSAUPD for a definition -c of OP as well as other terms and the relation of computed Ritz values -c and vectors of OP with respect to the given problem A*z = lambda*B*z. +c See documentation in the header of the subroutine SSAUPD for a definition +c of OP as well as other terms and the relation of computed Ritz values +c and vectors of OP with respect to the given problem A*z = lambda*B*z. c c The approximate eigenvalues of the original problem are returned in c ascending algebraic order. The user may elect to call this routine @@ -39,19 +39,19 @@ c with a single call. c c\Usage: -c call sseupd +c call sseupd c ( RVEC, HOWMNY, SELECT, D, Z, LDZ, SIGMA, BMAT, N, WHICH, NEV, TOL, c RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, WORKL, LWORKL, INFO ) c -c RVEC LOGICAL (INPUT) -c Specifies whether Ritz vectors corresponding to the Ritz value +c RVEC LOGICAL (INPUT) +c Specifies whether Ritz vectors corresponding to the Ritz value c approximations to the eigenproblem A*z = lambda*B*z are computed. c c RVEC = .FALSE. Compute Ritz values only. c c RVEC = .TRUE. Compute Ritz vectors. c -c HOWMNY Character*1 (INPUT) +c HOWMNY Character*1 (INPUT) c Specifies how many Ritz vectors are wanted and the form of Z c the matrix of Ritz vectors. See remark 1 below. c = 'A': compute NEV Ritz vectors; @@ -61,7 +61,7 @@ c SELECT Logical array of dimension NCV. (INPUT/WORKSPACE) c If HOWMNY = 'S', SELECT specifies the Ritz vectors to be c computed. To select the Ritz vector corresponding to a -c Ritz value D(j), SELECT(j) must be set to .TRUE.. +c Ritz value D(j), SELECT(j) must be set to .TRUE.. c If HOWMNY = 'A' , SELECT is used as a workspace for c reordering the Ritz values. c @@ -70,8 +70,8 @@ c eigenvalues of A*z = lambda*B*z. The values are returned c in ascending order. If IPARAM(7) = 3,4,5 then D represents c the Ritz values of OP computed by ssaupd transformed to -c those of the original eigensystem A*z = lambda*B*z. If -c IPARAM(7) = 1,2 then the Ritz values of OP are the same +c those of the original eigensystem A*z = lambda*B*z. If +c IPARAM(7) = 1,2 then the Ritz values of OP are the same c as the those of A*z = lambda*B*z. c c Z Real N by NEV array if HOWMNY = 'A'. (OUTPUT) @@ -79,7 +79,7 @@ c eigensystem A*z = lambda*B*z corresponding to the Ritz c value approximations. c If RVEC = .FALSE. then Z is not referenced. -c NOTE: The array Z may be set equal to first NEV columns of the +c NOTE: The array Z may be set equal to first NEV columns of the c Arnoldi/Lanczos basis array V computed by SSAUPD. c c LDZ Integer. (INPUT) @@ -144,7 +144,7 @@ c = -17: SSEUPD got a different count of the number of converged c Ritz values than SSAUPD got. This indicates the user c probably made an error in passing data from SSAUPD to -c SSEUPD or that the data was modified before entering +c SSEUPD or that the data was modified before entering c SSEUPD. c c\BeginLib @@ -153,7 +153,7 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett, "The Symmetric Eigenvalue Problem". Prentice-Hall, @@ -163,19 +163,19 @@ c 5. B. Nour-Omid, B.N. Parlett, T. Ericson, P.S. Jensen, "How to c Implement the Spectral Transformation", Math. Comp., 48 (1987), c pp 663-673. -c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos -c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", +c 6. R.G. Grimes, J.G. Lewis and H.D. Simon, "A Shifted Block Lanczos +c Algorithm for Solving Sparse Symmetric Generalized Eigenproblems", c SIAM J. Matr. Anal. Apps., January (1993). c 7. L. Reichel, W.B. Gragg, "Algorithm 686: FORTRAN Subroutines c for Updating the QR decomposition", ACM TOMS, December 1990, c Volume 16 Number 4, pp 369-377. c c\Remarks -c 1. The converged Ritz values are always returned in increasing +c 1. The converged Ritz values are always returned in increasing c (algebraic) order. c c 2. Currently only HOWMNY = 'A' is implemented. It is included at this -c stage for the user who wants to incorporate it. +c stage for the user who wants to incorporate it. c c\Routines called: c ssesrt ARPACK routine that sorts an array X, and applies the @@ -201,15 +201,15 @@ c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Chao Yang Houston, Texas -c Dept. of Computational & +c Dept. of Computational & c Applied Mathematics -c Rice University -c Houston, Texas -c +c Rice University +c Houston, Texas +c c\Revision history: c 12/15/93: Version ' 2.1' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: seupd.F SID: 2.11 DATE OF SID: 04/10/01 RELEASE: 2 c c\EndLib @@ -226,8 +226,8 @@ subroutine sseupd(rvec , howmny, select, d , c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -236,7 +236,7 @@ subroutine sseupd(rvec , howmny, select, d , character bmat, howmny, which*2 logical rvec integer info, ldz, ldv, lworkl, n, ncv, nev - Real + Real & sigma, tol c c %-----------------% @@ -245,7 +245,7 @@ subroutine sseupd(rvec , howmny, select, d , c integer iparam(7), ipntr(11) logical select(ncv) - Real + Real & d(nev) , resid(n) , v(ldv,ncv), & z(ldz, nev), workd(2*n), workl(lworkl) c @@ -253,7 +253,7 @@ subroutine sseupd(rvec , howmny, select, d , c | Parameters | c %------------% c - Real + Real & one, zero parameter (one = 1.0E+0 , zero = 0.0E+0 ) c @@ -267,7 +267,7 @@ subroutine sseupd(rvec , howmny, select, d , & ldq , mode , msglvl, nconv , next , & ritz , irz , ibd , np , ishift, & leftptr, rghtptr, numcnv, jj - Real + Real & bnorm2 , rnorm, temp, temp1, eps23 logical reord c @@ -275,14 +275,14 @@ subroutine sseupd(rvec , howmny, select, d , c | External Subroutines | c %----------------------% c - external scopy , sger , sgeqr2, slacpy, sorm2r, sscal, + external scopy , sger , sgeqr2, slacpy, sorm2r, sscal, & ssesrt, ssteqr, sswap , svout , ivout , ssortr c c %--------------------% c | External Functions | c %--------------------% c - Real + Real & snrm2, slamch external snrm2, slamch c @@ -295,7 +295,7 @@ subroutine sseupd(rvec , howmny, select, d , c %-----------------------% c | Executable Statements | c %-----------------------% -c +c c %------------------------% c | Set default parameters | c %------------------------% @@ -312,7 +312,7 @@ subroutine sseupd(rvec , howmny, select, d , if (nconv .eq. 0) go to 9000 ierr = 0 c - if (nconv .le. 0) ierr = -14 + if (nconv .le. 0) ierr = -14 if (n .le. 0) ierr = -1 if (nev .le. 0) ierr = -2 if (ncv .le. nev .or. ncv .gt. n) ierr = -3 @@ -324,12 +324,12 @@ subroutine sseupd(rvec , howmny, select, d , if (bmat .ne. 'I' .and. bmat .ne. 'G') ierr = -6 if ( (howmny .ne. 'A' .and. & howmny .ne. 'P' .and. - & howmny .ne. 'S') .and. rvec ) + & howmny .ne. 'S') .and. rvec ) & ierr = -15 if (rvec .and. howmny .eq. 'S') ierr = -16 c if (rvec .and. lworkl .lt. ncv**2+8*ncv) ierr = -7 -c +c if (mode .eq. 1 .or. mode .eq. 2) then type = 'REGULR' else if (mode .eq. 3 ) then @@ -338,7 +338,7 @@ subroutine sseupd(rvec , howmny, select, d , type = 'BUCKLE' else if (mode .eq. 5 ) then type = 'CAYLEY' - else + else ierr = -10 end if if (mode .eq. 1 .and. bmat .eq. 'G') ierr = -11 @@ -352,7 +352,7 @@ subroutine sseupd(rvec , howmny, select, d , info = ierr go to 9000 end if -c +c c %-------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, BOUNDS, Q | c | etc... and the remaining workspace. | @@ -427,7 +427,7 @@ subroutine sseupd(rvec , howmny, select, d , c | Set machine dependent constant. | c %---------------------------------% c - eps23 = slamch('Epsilon-Machine') + eps23 = slamch('Epsilon-Machine') eps23 = eps23**(2.0E+0 / 3.0E+0 ) c c %---------------------------------------% @@ -501,7 +501,7 @@ subroutine sseupd(rvec , howmny, select, d , & workl(ibd+jj-1) .le. tol*temp1) then select(jj) = .true. numcnv = numcnv + 1 - if (jj .gt. nev) reord = .true. + if (jj .gt. nconv) reord = .true. endif 11 continue c @@ -513,9 +513,9 @@ subroutine sseupd(rvec , howmny, select, d , c %-----------------------------------------------------------% c if (msglvl .gt. 2) then - call ivout(logfil, 1, numcnv, ndigit, + call ivout(logfil, 1, [numcnv], ndigit, & '_seupd: Number of specified eigenvalues') - call ivout(logfil, 1, nconv, ndigit, + call ivout(logfil, 1, [nconv], ndigit, & '_seupd: Number of "converged" eigenvalues') end if c @@ -609,9 +609,9 @@ subroutine sseupd(rvec , howmny, select, d , c if (leftptr .lt. rghtptr) go to 20 c - 30 end if + end if c - if (msglvl .gt. 2) then + 30 if (msglvl .gt. 2) then call svout (logfil, ncv, workl(ihd), ndigit, & '_seupd: The eigenvalues of H--reordered') end if @@ -652,8 +652,8 @@ subroutine sseupd(rvec , howmny, select, d , call scopy(ncv, workl(bounds), 1, workl(ihb), 1) end if c - else -c + else +c c %-------------------------------------------------------------% c | * Make a copy of all the Ritz values. | c | * Transform the Ritz values back to the original system. | @@ -670,13 +670,13 @@ subroutine sseupd(rvec , howmny, select, d , c %-------------------------------------------------------------% c call scopy (ncv, workl(ihd), 1, workl(iw), 1) - if (type .eq. 'SHIFTI') then + if (type .eq. 'SHIFTI') then do 40 k=1, ncv workl(ihd+k-1) = one / workl(ihd+k-1) + sigma 40 continue else if (type .eq. 'BUCKLE') then do 50 k=1, ncv - workl(ihd+k-1) = sigma * workl(ihd+k-1) / + workl(ihd+k-1) = sigma * workl(ihd+k-1) / & (workl(ihd+k-1) - one) 50 continue else if (type .eq. 'CAYLEY') then @@ -685,7 +685,7 @@ subroutine sseupd(rvec , howmny, select, d , & (workl(ihd+k-1) - one) 60 continue end if -c +c c %-------------------------------------------------------------% c | * Store the wanted NCONV lambda values into D. | c | * Sort the NCONV wanted lambda in WORKL(IHD:IHD+NCONV-1) | @@ -711,8 +711,8 @@ subroutine sseupd(rvec , howmny, select, d , call ssortr('LA', .true., nconv, d, workl(ihb)) end if c - end if -c + end if +c c %------------------------------------------------% c | Compute the Ritz vectors. Transform the wanted | c | eigenvectors of the symmetric tridiagonal H by | @@ -720,25 +720,25 @@ subroutine sseupd(rvec , howmny, select, d , c %------------------------------------------------% c if (rvec .and. howmny .eq. 'A') then -c +c c %----------------------------------------------------------% c | Compute the QR factorization of the matrix representing | c | the wanted invariant subspace located in the first NCONV | c | columns of workl(iq,ldq). | c %----------------------------------------------------------% -c +c call sgeqr2(ncv, nconv , workl(iq) , & ldq, workl(iw+ncv), workl(ihb), & ierr) c c %--------------------------------------------------------% -c | * Postmultiply V by Q. | +c | * Postmultiply V by Q. | c | * Copy the first NCONV columns of VQ into Z. | c | The N by NCONV matrix Z is now a matrix representation | c | of the approximate invariant subspace associated with | c | the Ritz values in workl(ihd). | c %--------------------------------------------------------% -c +c call sorm2r('Right', 'Notranspose', n , & ncv , nconv , workl(iq), & ldq , workl(iw+ncv), v , @@ -752,7 +752,7 @@ subroutine sseupd(rvec , howmny, select, d , c %-----------------------------------------------------% c do 65 j = 1, ncv-1 - workl(ihb+j-1) = zero + workl(ihb+j-1) = zero 65 continue workl(ihb+ncv-1) = one call sorm2r('Left', 'Transpose' , ncv , @@ -760,6 +760,16 @@ subroutine sseupd(rvec , howmny, select, d , & ldq , workl(iw+ncv), workl(ihb), & ncv , temp , ierr) c +c %-----------------------------------------------------% +c | Make a copy of the last row into | +c | workl(iw+ncv:iw+2*ncv), as it is needed again in | +c | the Ritz vector purification step below | +c %-----------------------------------------------------% +c + do 67 j = 1, nconv + workl(iw+ncv+j-1) = workl(ihb+j-1) + 67 continue + else if (rvec .and. howmny .eq. 'S') then c c Not yet implemented. See remark 2 above. @@ -784,10 +794,10 @@ subroutine sseupd(rvec , howmny, select, d , c %-------------------------------------------------% c call sscal (ncv, bnorm2, workl(ihb), 1) - if (type .eq. 'SHIFTI') then + if (type .eq. 'SHIFTI') then c do 80 k=1, ncv - workl(ihb+k-1) = abs( workl(ihb+k-1) ) + workl(ihb+k-1) = abs( workl(ihb+k-1) ) & / workl(iw+k-1)**2 80 continue c @@ -812,15 +822,15 @@ subroutine sseupd(rvec , howmny, select, d , if (type .ne. 'REGULR' .and. msglvl .gt. 1) then call svout(logfil, nconv, d, ndigit, & '_seupd: Untransformed converged Ritz values') - call svout(logfil, nconv, workl(ihb), ndigit, + call svout(logfil, nconv, workl(ihb), ndigit, & '_seupd: Ritz estimates of the untransformed Ritz values') else if (msglvl .gt. 1) then call svout(logfil, nconv, d, ndigit, & '_seupd: Converged Ritz values') - call svout(logfil, nconv, workl(ihb), ndigit, + call svout(logfil, nconv, workl(ihb), ndigit, & '_seupd: Associated Ritz estimates') end if -c +c c %-------------------------------------------------% c | Ritz vector purification step. Formally perform | c | one of inverse subspace iteration. Only used | @@ -830,18 +840,18 @@ subroutine sseupd(rvec , howmny, select, d , if (rvec .and. (type .eq. 'SHIFTI' .or. type .eq. 'CAYLEY')) then c do 110 k=0, nconv-1 - workl(iw+k) = workl(iq+k*ldq+ncv-1) + workl(iw+k) = workl(iw+ncv+k) & / workl(iw+k) 110 continue c else if (rvec .and. type .eq. 'BUCKLE') then c do 120 k=0, nconv-1 - workl(iw+k) = workl(iq+k*ldq+ncv-1) + workl(iw+k) = workl(iw+ncv+k) & / (workl(iw+k)-one) 120 continue c - end if + end if c if (type .ne. 'REGULR') & call sger (n, nconv, one, resid, 1, workl(iw), 1, z, ldz) diff --git a/Toolbox/arpack-src/ssgets.f b/Toolbox/arpack-src/ssgets.f index a0e3182d1..f40ca76a8 100644 --- a/Toolbox/arpack-src/ssgets.f +++ b/Toolbox/arpack-src/ssgets.f @@ -3,13 +3,13 @@ c c\Name: ssgets c -c\Description: +c\Description: c Given the eigenvalues of the symmetric tridiagonal matrix H, -c computes the NP shifts AMU that are zeros of the polynomial of -c degree NP which filters out components of the unwanted eigenvectors +c computes the NP shifts AMU that are zeros of the polynomial of +c degree NP which filters out components of the unwanted eigenvectors c corresponding to the AMU's based on some given criteria. c -c NOTE: This is called even in the case of user specified shifts in +c NOTE: This is called even in the case of user specified shifts in c order to sort the eigenvalues, and error bounds of H for later use. c c\Usage: @@ -39,8 +39,8 @@ c c RITZ Real array of length KEV+NP. (INPUT/OUTPUT) c On INPUT, RITZ contains the eigenvalues of H. -c On OUTPUT, RITZ are sorted so that the unwanted eigenvalues -c are in the first NP locations and the wanted part is in +c On OUTPUT, RITZ are sorted so that the unwanted eigenvalues +c are in the first NP locations and the wanted part is in c the last KEV locations. When exact shifts are selected, the c unwanted part corresponds to the shifts to be applied. c @@ -49,7 +49,7 @@ c c SHIFTS Real array of length NP. (INPUT/OUTPUT) c On INPUT: contains the user specified shifts if ISHIFT = 0. -c On OUTPUT: contains the shifts sorted into decreasing order +c On OUTPUT: contains the shifts sorted into decreasing order c of magnitude with respect to the Ritz estimates contained in c BOUNDS. If ISHIFT = 0, SHIFTS is not modified on exit. c @@ -65,7 +65,7 @@ c\Routines called: c ssortr ARPACK utility sorting routine. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c svout ARPACK utility routine that prints vectors. c scopy Level 1 BLAS that copies one vector to another. c sswap Level 1 BLAS that swaps the contents of two vectors. @@ -75,13 +75,13 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/93: Version ' 2.1' c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sgets.F SID: 2.4 DATE OF SID: 4/19/96 RELEASE: 2 c c\Remarks @@ -96,8 +96,8 @@ subroutine ssgets ( ishift, which, kev, np, ritz, bounds, shifts ) c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -131,7 +131,7 @@ subroutine ssgets ( ishift, which, kev, np, ritz, bounds, shifts ) c | External Subroutines | c %----------------------% c - external sswap, scopy, ssortr, second + external sswap, scopy, ssortr, arscnd c c %---------------------% c | Intrinsic Functions | @@ -142,15 +142,15 @@ subroutine ssgets ( ishift, which, kev, np, ritz, bounds, shifts ) c %-----------------------% c | Executable Statements | c %-----------------------% -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = msgets -c +c if (which .eq. 'BE') then c c %-----------------------------------------------------% @@ -163,11 +163,11 @@ subroutine ssgets ( ishift, which, kev, np, ritz, bounds, shifts ) c %-----------------------------------------------------% c call ssortr ('LA', .true., kev+np, ritz, bounds) - kevd2 = kev / 2 + kevd2 = kev / 2 if ( kev .gt. 1 ) then - call sswap ( min(kevd2,np), ritz, 1, + call sswap ( min(kevd2,np), ritz, 1, & ritz( max(kevd2,np)+1 ), 1) - call sswap ( min(kevd2,np), bounds, 1, + call sswap ( min(kevd2,np), bounds, 1, & bounds( max(kevd2,np)+1 ), 1) end if c @@ -185,7 +185,7 @@ subroutine ssgets ( ishift, which, kev, np, ritz, bounds, shifts ) end if c if (ishift .eq. 1 .and. np .gt. 0) then -c +c c %-------------------------------------------------------% c | Sort the unwanted Ritz values used as shifts so that | c | the ones with largest Ritz estimates are first. | @@ -193,23 +193,23 @@ subroutine ssgets ( ishift, which, kev, np, ritz, bounds, shifts ) c | forward instability of the iteration when the shifts | c | are applied in subroutine ssapps. | c %-------------------------------------------------------% -c +c call ssortr ('SM', .true., np, bounds, ritz) call scopy (np, ritz, 1, shifts, 1) end if -c - call second (t1) +c + call arscnd (t1) tsgets = tsgets + (t1 - t0) c if (msglvl .gt. 0) then - call ivout (logfil, 1, kev, ndigit, '_sgets: KEV is') - call ivout (logfil, 1, np, ndigit, '_sgets: NP is') + call ivout (logfil, 1, [kev], ndigit, '_sgets: KEV is') + call ivout (logfil, 1, [np], ndigit, '_sgets: NP is') call svout (logfil, kev+np, ritz, ndigit, & '_sgets: Eigenvalues of current H matrix') - call svout (logfil, kev+np, bounds, ndigit, + call svout (logfil, kev+np, bounds, ndigit, & '_sgets: Associated Ritz estimates') end if -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/ssortc.f b/Toolbox/arpack-src/ssortc.f index dba628ff9..e322039cd 100644 --- a/Toolbox/arpack-src/ssortc.f +++ b/Toolbox/arpack-src/ssortc.f @@ -4,7 +4,7 @@ c\Name: ssortc c c\Description: -c Sorts the complex array in XREAL and XIMAG into the order +c Sorts the complex array in XREAL and XIMAG into the order c specified by WHICH and optionally applies the permutation to the c real array Y. It is assumed that if an element of XIMAG is c nonzero, then its negative is also an element. In other words, @@ -49,14 +49,14 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c xx/xx/92: Version ' 2.1' c Adapted from the sort routine in LANSO. c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sortc.F SID: 2.3 DATE OF SID: 4/20/96 RELEASE: 2 c c\EndLib @@ -77,7 +77,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) c | Array Arguments | c %-----------------% c - Real + Real & xreal(0:n-1), ximag(0:n-1), y(0:n-1) c c %---------------% @@ -85,14 +85,14 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) c %---------------% c integer i, igap, j - Real + Real & temp, temp1, temp2 c c %--------------------% c | External Functions | c %--------------------% c - Real + Real & slapy2 external slapy2 c @@ -101,7 +101,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) c %-----------------------% c igap = n / 2 -c +c if (which .eq. 'LM') then c c %------------------------------------------------------% @@ -169,7 +169,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) temp = ximag(j) ximag(j) = ximag(j+igap) ximag(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -183,7 +183,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) 60 continue igap = igap / 2 go to 40 -c +c else if (which .eq. 'LR') then c c %------------------------------------------------% @@ -207,7 +207,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) temp = ximag(j) ximag(j) = ximag(j+igap) ximag(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -221,7 +221,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) 90 continue igap = igap / 2 go to 70 -c +c else if (which .eq. 'SR') then c c %------------------------------------------------% @@ -244,7 +244,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) temp = ximag(j) ximag(j) = ximag(j+igap) ximag(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -258,7 +258,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) 120 continue igap = igap / 2 go to 100 -c +c else if (which .eq. 'LI') then c c %------------------------------------------------% @@ -281,7 +281,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) temp = ximag(j) ximag(j) = ximag(j+igap) ximag(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -295,7 +295,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) 150 continue igap = igap / 2 go to 130 -c +c else if (which .eq. 'SI') then c c %------------------------------------------------% @@ -318,7 +318,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) temp = ximag(j) ximag(j) = ximag(j+igap) ximag(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -333,7 +333,7 @@ subroutine ssortc (which, apply, n, xreal, ximag, y) igap = igap / 2 go to 160 end if -c +c 9000 continue return c diff --git a/Toolbox/arpack-src/ssortr.f b/Toolbox/arpack-src/ssortr.f index 267b1251c..25d324b65 100644 --- a/Toolbox/arpack-src/ssortr.f +++ b/Toolbox/arpack-src/ssortr.f @@ -4,7 +4,7 @@ c\Name: ssortr c c\Description: -c Sort the array X1 in the order specified by WHICH and optionally +c Sort the array X1 in the order specified by WHICH and optionally c applies the permutation to the array X2. c c\Usage: @@ -39,17 +39,17 @@ c c\Author c Danny Sorensen Phuong Vu -c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas +c Richard Lehoucq CRPC / Rice University +c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c c\Revision history: c 12/16/93: Version ' 2.1'. c Adapted from the sort routine in LANSO. c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: sortr.F SID: 2.3 DATE OF SID: 4/19/96 RELEASE: 2 c c\EndLib @@ -86,7 +86,7 @@ subroutine ssortr (which, apply, n, x1, x2) c %-----------------------% c igap = n / 2 -c +c if (which .eq. 'SA') then c c X1 is sorted into decreasing order of algebraic. @@ -158,7 +158,7 @@ subroutine ssortr (which, apply, n, x1, x2) 80 continue c if (j.lt.0) go to 90 -c +c if (x1(j).gt.x1(j+igap)) then temp = x1(j) x1(j) = x1(j+igap) @@ -176,7 +176,7 @@ subroutine ssortr (which, apply, n, x1, x2) 90 continue igap = igap / 2 go to 70 -c +c else if (which .eq. 'LM') then c c X1 is sorted into increasing order of magnitude. diff --git a/Toolbox/arpack-src/sstatn.f b/Toolbox/arpack-src/sstatn.f index fba67fdb6..f3288c1ab 100644 --- a/Toolbox/arpack-src/sstatn.f +++ b/Toolbox/arpack-src/sstatn.f @@ -9,10 +9,10 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: statn.F SID: 2.4 DATE OF SID: 4/20/96 RELEASE: 2 c subroutine sstatn @@ -21,8 +21,8 @@ subroutine sstatn c | See stat.doc for documentation | c %--------------------------------% c - include 'stat.fi' -c + include 'stat.h' +c c %-----------------------% c | Executable Statements | c %-----------------------% @@ -32,7 +32,7 @@ subroutine sstatn nrorth = 0 nitref = 0 nrstrt = 0 -c +c tnaupd = 0.0E+0 tnaup2 = 0.0E+0 tnaitr = 0.0E+0 @@ -43,14 +43,14 @@ subroutine sstatn titref = 0.0E+0 tgetv0 = 0.0E+0 trvec = 0.0E+0 -c +c c %----------------------------------------------------% c | User time including reverse communication overhead | c %----------------------------------------------------% c tmvopx = 0.0E+0 tmvbx = 0.0E+0 -c +c return c c diff --git a/Toolbox/arpack-src/sstats.f b/Toolbox/arpack-src/sstats.f index fef9112c6..0822d3f3a 100644 --- a/Toolbox/arpack-src/sstats.f +++ b/Toolbox/arpack-src/sstats.f @@ -1,18 +1,18 @@ c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: stats.F SID: 2.1 DATE OF SID: 4/19/96 RELEASE: 2 c %---------------------------------------------% c | Initialize statistic and timing information | c | for symmetric Arnoldi code. | c %---------------------------------------------% - + subroutine sstats c %--------------------------------% c | See stat.doc for documentation | c %--------------------------------% - include 'stat.fi' - + include 'stat.h' + c %-----------------------% c | Executable Statements | c %-----------------------% @@ -22,7 +22,7 @@ subroutine sstats nrorth = 0 nitref = 0 nrstrt = 0 - + tsaupd = 0.0E+0 tsaup2 = 0.0E+0 tsaitr = 0.0E+0 @@ -33,13 +33,13 @@ subroutine sstats titref = 0.0E+0 tgetv0 = 0.0E+0 trvec = 0.0E+0 - + c %----------------------------------------------------% c | User time including reverse communication overhead | c %----------------------------------------------------% tmvopx = 0.0E+0 tmvbx = 0.0E+0 - + return c c End of sstats diff --git a/Toolbox/arpack-src/sstqrb.f b/Toolbox/arpack-src/sstqrb.f index 9fd1e1925..9697c3660 100644 --- a/Toolbox/arpack-src/sstqrb.f +++ b/Toolbox/arpack-src/sstqrb.f @@ -32,13 +32,13 @@ c On exit, E has been destroyed. c c Z Real array, dimension (N). (OUTPUT) -c On exit, Z contains the last row of the orthonormal -c eigenvector matrix of the symmetric tridiagonal matrix. +c On exit, Z contains the last row of the orthonormal +c eigenvector matrix of the symmetric tridiagonal matrix. c If an error exit is made, Z contains the last row of the c eigenvector matrix associated with the stored eigenvalues. c c WORK Real array, dimension (max(1,2*N-2)). (WORKSPACE) -c Workspace used in accumulating the transformation for +c Workspace used in accumulating the transformation for c computing the last components of the eigenvectors. c c INFO Integer. (OUTPUT) @@ -62,9 +62,9 @@ c scopy Level 1 BLAS that copies one vector to another. c sswap Level 1 BLAS that swaps the contents of two vectors. c lsame LAPACK character comparison routine. -c slae2 LAPACK routine that computes the eigenvalues of a 2-by-2 +c slae2 LAPACK routine that computes the eigenvalues of a 2-by-2 c symmetric matrix. -c slaev2 LAPACK routine that eigendecomposition of a 2-by-2 symmetric +c slaev2 LAPACK routine that eigendecomposition of a 2-by-2 symmetric c matrix. c slamch LAPACK routine that determines machine constants. c slanst LAPACK routine that computes the norm of a matrix. @@ -72,7 +72,7 @@ c slartg LAPACK Givens rotation construction routine. c slascl LAPACK routine for careful scaling of a matrix. c slaset LAPACK matrix initialization routine. -c slasr LAPACK routine that applies an orthogonal transformation to +c slasr LAPACK routine that applies an orthogonal transformation to c a matrix. c slasrt LAPACK sorting routine. c ssteqr LAPACK routine that computes eigenvalues and eigenvectors @@ -84,19 +84,19 @@ c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas c Applied Mathematics -c Rice University -c Houston, Texas +c Rice University +c Houston, Texas c -c\SCCS Information: @(#) +c\SCCS Information: @(#) c FILE: stqrb.F SID: 2.5 DATE OF SID: 8/27/96 RELEASE: 2 c c\Remarks c 1. Starting with version 2.5, this routine is a modified version c of LAPACK version 2.0 subroutine SSTEQR. No lines are deleted, -c only commeted out and new lines inserted. +c only commented out and new lines inserted. c All lines commented out have "c$$$" at the beginning. c Note that the LAPACK version 1.0 subroutine SSTEQR contained -c bugs. +c bugs. c c\EndLib c @@ -118,9 +118,9 @@ subroutine sstqrb ( n, d, e, z, work, info ) & d( n ), e( n-1 ), z( n ), work( 2*n-2 ) c c .. parameters .. - Real + Real & zero, one, two, three - parameter ( zero = 0.0E+0, one = 1.0E+0, + parameter ( zero = 0.0E+0, one = 1.0E+0, & two = 2.0E+0, three = 3.0E+0 ) integer maxit parameter ( maxit = 30 ) @@ -129,7 +129,7 @@ subroutine sstqrb ( n, d, e, z, work, info ) integer i, icompz, ii, iscale, j, jtot, k, l, l1, lend, & lendm1, lendp1, lendsv, lm1, lsv, m, mm, mm1, & nm1, nmaxit - Real + Real & anorm, b, c, eps, eps2, f, g, p, r, rt1, rt2, & s, safmax, safmin, ssfmax, ssfmin, tst c .. @@ -380,9 +380,9 @@ subroutine sstqrb ( n, d, e, z, work, info ) c c *** New starting with version 2.5 *** c - call slasr( 'r', 'v', 'b', 1, mm, work( l ), + call slasr( 'r', 'v', 'b', 1, mm, work( l ), & work( n-1+l ), z( l ), 1 ) -c ************************************* +c ************************************* end if c d( l ) = d( l ) - p @@ -440,7 +440,7 @@ subroutine sstqrb ( n, d, e, z, work, info ) tst = z(l) z(l) = c*tst - s*z(l-1) z(l-1) = s*tst + c*z(l-1) -c ************************************* +c ************************************* else call slae2( d( l-1 ), e( l-1 ), d( l ), rt1, rt2 ) end if @@ -502,7 +502,7 @@ subroutine sstqrb ( n, d, e, z, work, info ) c call slasr( 'r', 'v', 'f', 1, mm, work( m ), work( n-1+m ), & z( m ), 1 ) -c ************************************* +c ************************************* end if c d( l ) = d( l ) - p diff --git a/Toolbox/arpack-src/stat.fi b/Toolbox/arpack-src/stat.h similarity index 69% rename from Toolbox/arpack-src/stat.fi rename to Toolbox/arpack-src/stat.h index 1ca12fd20..66a8e9f87 100644 --- a/Toolbox/arpack-src/stat.fi +++ b/Toolbox/arpack-src/stat.h @@ -1,13 +1,21 @@ +c %--------------------------------% +c | See stat.doc for documentation | +c %--------------------------------% +c +c\SCCS Information: @(#) +c FILE: stat.h SID: 2.2 DATE OF SID: 11/16/95 RELEASE: 2 +c real t0, t1, t2, t3, t4, t5 save t0, t1, t2, t3, t4, t5 +c integer nopx, nbx, nrorth, nitref, nrstrt real tsaupd, tsaup2, tsaitr, tseigt, tsgets, tsapps, tsconv, & tnaupd, tnaup2, tnaitr, tneigh, tngets, tnapps, tnconv, & tcaupd, tcaup2, tcaitr, tceigh, tcgets, tcapps, tcconv, & tmvopx, tmvbx, tgetv0, titref, trvec - common /timing/ + common /timing/ & nopx, nbx, nrorth, nitref, nrstrt, & tsaupd, tsaup2, tsaitr, tseigt, tsgets, tsapps, tsconv, & tnaupd, tnaup2, tnaitr, tneigh, tngets, tnapps, tnconv, & tcaupd, tcaup2, tcaitr, tceigh, tcgets, tcapps, tcconv, - & tmvopx, tmvbx, tgetv0, titref, trvec \ No newline at end of file + & tmvopx, tmvbx, tgetv0, titref, trvec diff --git a/Toolbox/arpack-src/version.h b/Toolbox/arpack-src/version.h new file mode 100644 index 000000000..ecdd9b340 --- /dev/null +++ b/Toolbox/arpack-src/version.h @@ -0,0 +1,30 @@ +/* + + In the current version, the parameter KAPPA in the Kahan's test + for orthogonality is set to 0.717, the same as used by Gragg & Reichel. + However computational experience indicates that this is a little too + strict and will frequently force reorthogonalization when it is not + necessary to do so. + + Also the "moving boundary" idea is not currently activated in the nonsymmetric + code since it is not conclusive that it's the right thing to do all the time. + Requires further investigation. + + As of 02/01/93 Richard Lehoucq assumes software control of the codes from + Phuong Vu. On 03/01/93 all the *.F files were migrated SCCS. The 1.1 version + of codes are those received from Phuong Vu. The frozen version of 07/08/92 + is now considered version 1.1. + + Version 2.1 contains two new symmetric routines, sesrt and seupd. + Changes as well as bug fixes for version 1.1 codes that were only corrected + for programming bugs are version 1.2. These 1.2 versions will also be in version 2.1. + Subroutine [d,s]saupd now requires slightly more workspace. See [d,s]saupd for the + details. + + \SCCS Information: @(#) + FILE: version.h SID: 2.3 DATE OF SID: 11/16/95 RELEASE: 2 + + */ + +#define VERSION_NUMBER ' 2.1' +#define VERSION_DATE ' 11/15/95' diff --git a/Toolbox/arpack-src/zgetv0.f b/Toolbox/arpack-src/zgetv0.f index b0cb74719..cc13c3cfb 100644 --- a/Toolbox/arpack-src/zgetv0.f +++ b/Toolbox/arpack-src/zgetv0.f @@ -2,13 +2,13 @@ c c\Name: zgetv0 c -c\Description: +c\Description: c Generate a random initial residual vector for the Arnoldi process. -c Force the residual vector to be in the range of the operator OP. +c Force the residual vector to be in the range of the operator OP. c c\Usage: c call zgetv0 -c ( IDO, BMAT, ITRY, INITV, N, J, V, LDV, RESID, RNORM, +c ( IDO, BMAT, ITRY, INITV, N, J, V, LDV, RESID, RNORM, c IPNTR, WORKD, IERR ) c c\Arguments @@ -35,7 +35,7 @@ c B = 'G' -> generalized eigenvalue problem A*x = lambda*B*x c c ITRY Integer. (INPUT) -c ITRY counts the number of times that zgetv0 is called. +c ITRY counts the number of times that zgetv0 is called. c It should be set to 1 on the initial call to zgetv0. c c INITV Logical variable. (INPUT) @@ -54,11 +54,11 @@ c if this is a "restart". c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c RESID Complex*16 array of length N. (INPUT/OUTPUT) -c Initial residual vector to be generated. If RESID is +c Initial residual vector to be generated. If RESID is c provided, force RESID into the range of the operator OP. c c RNORM Double precision scalar. (OUTPUT) @@ -89,21 +89,21 @@ c pp 357-385. c c\Routines called: -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c zvout ARPACK utility routine that prints vectors. -c zlarnv LAPACK routine for generating a random vector. +c zlarnv LAPACK routine for generating a random vector. c zgemv Level 2 BLAS routine for matrix vector multiplication. c zcopy Level 1 BLAS that copies one vector to another. c zdotc Level 1 BLAS that computes the scalar product of two vectors. -c dznrm2 Level 1 BLAS that computes the norm of a vector. +c dznrm2 Level 1 BLAS that computes the norm of a vector. c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c\SCCS Information: @(#) c FILE: getv0.F SID: 2.3 DATE OF SID: 08/27/96 RELEASE: 2 @@ -112,16 +112,16 @@ c c----------------------------------------------------------------------- c - subroutine zgetv0 - & ( ido, bmat, itry, initv, n, j, v, ldv, resid, rnorm, + subroutine zgetv0 + & ( ido, bmat, itry, initv, n, j, v, ldv, resid, rnorm, & ipntr, workd, ierr ) -c +c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -156,35 +156,29 @@ subroutine zgetv0 c | Local Scalars & Arrays | c %------------------------% c - logical first, inits, orth + logical first, orth integer idist, iseed(4), iter, msglvl, jj Double precision & rnorm0 Complex*16 & cnorm - save first, iseed, inits, iter, msglvl, orth, rnorm0 + save first, iseed, iter, msglvl, orth, rnorm0 c c %----------------------% c | External Subroutines | c %----------------------% c - external zcopy, zgemv, zlarnv, zvout, second + external zcopy, zgemv, zlarnv, zvout, arscnd c c %--------------------% c | External Functions | c %--------------------% c - Double precision + Double precision & dznrm2, dlapy2 Complex*16 - & zdotc - external zdotc, dznrm2, dlapy2 -c -c %-----------------% -c | Data Statements | -c %-----------------% -c - data inits /.true./ + & zzdotc + external zzdotc, dznrm2, dlapy2 c c %-----------------------% c | Executable Statements | @@ -196,24 +190,21 @@ subroutine zgetv0 c | random number generator | c %-----------------------------------% c - if (inits) then - iseed(1) = 1 - iseed(2) = 3 - iseed(3) = 5 - iseed(4) = 7 - inits = .false. - end if + iseed(1) = 1 + iseed(2) = 3 + iseed(3) = 5 + iseed(4) = 7 c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mgetv0 -c +c ierr = 0 iter = 0 first = .FALSE. @@ -232,48 +223,50 @@ subroutine zgetv0 idist = 2 call zlarnv (idist, iseed, n, resid) end if -c +c c %----------------------------------------------------------% c | Force the starting vector into the range of OP to handle | c | the generalized problem when B is possibly (singular). | c %----------------------------------------------------------% c - call second (t2) - if (bmat .eq. 'G') then + call arscnd (t2) + if (itry .eq. 1) then nopx = nopx + 1 ipntr(1) = 1 ipntr(2) = n + 1 call zcopy (n, resid, 1, workd, 1) ido = -1 go to 9000 + else if (itry .gt. 1 .and. bmat .eq. 'G') then + call zcopy (n, resid, 1, workd(n + 1), 1) end if end if -c +c c %----------------------------------------% -c | Back from computing B*(initial-vector) | +c | Back from computing OP*(initial-vector) | c %----------------------------------------% c if (first) go to 20 c c %-----------------------------------------------% -c | Back from computing B*(orthogonalized-vector) | +c | Back from computing OP*(orthogonalized-vector) | c %-----------------------------------------------% c if (orth) go to 40 -c - call second (t3) +c + call arscnd (t3) tmvopx = tmvopx + (t3 - t2) -c +c c %------------------------------------------------------% c | Starting vector is now in the range of OP; r = OP*r; | c | Compute B-norm of starting vector. | c %------------------------------------------------------% c - call second (t2) + call arscnd (t2) first = .TRUE. + if (itry .eq. 1) call zcopy (n, workd(n + 1), 1, resid, 1) if (bmat .eq. 'G') then nbx = nbx + 1 - call zcopy (n, workd(n+1), 1, resid, 1) ipntr(1) = n + 1 ipntr(2) = 1 ido = 2 @@ -281,18 +274,18 @@ subroutine zgetv0 else if (bmat .eq. 'I') then call zcopy (n, resid, 1, workd, 1) end if -c +c 20 continue c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c first = .FALSE. if (bmat .eq. 'G') then - cnorm = zdotc (n, resid, 1, workd, 1) - rnorm0 = sqrt(dlapy2(dble(cnorm),dimag(cnorm))) + cnorm = zzdotc (n, resid, 1, workd, 1) + rnorm0 = sqrt(dlapy2(dble(cnorm),aimag(cnorm))) else if (bmat .eq. 'I') then rnorm0 = dznrm2(n, resid, 1) end if @@ -303,7 +296,7 @@ subroutine zgetv0 c %---------------------------------------------% c if (j .eq. 1) go to 50 -c +c c %---------------------------------------------------------------- c | Otherwise need to B-orthogonalize the starting vector against | c | the current Arnoldi basis using Gram-Schmidt with iter. ref. | @@ -319,16 +312,16 @@ subroutine zgetv0 orth = .TRUE. 30 continue c - call zgemv ('C', n, j-1, one, v, ldv, workd, 1, + call zgemv ('C', n, j-1, one, v, ldv, workd, 1, & zero, workd(n+1), 1) - call zgemv ('N', n, j-1, -one, v, ldv, workd(n+1), 1, + call zgemv ('N', n, j-1, -one, v, ldv, workd(n+1), 1, & one, resid, 1) -c +c c %----------------------------------------------------------% c | Compute the B-norm of the orthogonalized starting vector | c %----------------------------------------------------------% c - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call zcopy (n, resid, 1, workd(n+1), 1) @@ -339,17 +332,17 @@ subroutine zgetv0 else if (bmat .eq. 'I') then call zcopy (n, resid, 1, workd, 1) end if -c +c 40 continue c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c if (bmat .eq. 'G') then - cnorm = zdotc (n, resid, 1, workd, 1) - rnorm = sqrt(dlapy2(dble(cnorm),dimag(cnorm))) + cnorm = zzdotc (n, resid, 1, workd, 1) + rnorm = sqrt(dlapy2(dble(cnorm),aimag(cnorm))) else if (bmat .eq. 'I') then rnorm = dznrm2(n, resid, 1) end if @@ -359,14 +352,14 @@ subroutine zgetv0 c %--------------------------------------% c if (msglvl .gt. 2) then - call dvout (logfil, 1, rnorm0, ndigit, + call dvout (logfil, 1, [rnorm0], ndigit, & '_getv0: re-orthonalization ; rnorm0 is') - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_getv0: re-orthonalization ; rnorm is') end if c if (rnorm .gt. 0.717*rnorm0) go to 50 -c +c iter = iter + 1 if (iter .le. 1) then c @@ -388,11 +381,11 @@ subroutine zgetv0 rnorm = rzero ierr = -1 end if -c +c 50 continue c if (msglvl .gt. 0) then - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_getv0: B-norm of initial / restarted starting vector') end if if (msglvl .gt. 2) then @@ -400,10 +393,10 @@ subroutine zgetv0 & '_getv0: initial / restarted starting vector') end if ido = 99 -c - call second (t1) +c + call arscnd (t1) tgetv0 = tgetv0 + (t1 - t0) -c +c 9000 continue return c diff --git a/Toolbox/arpack-src/zmout.f b/Toolbox/arpack-src/zmout.f index 9877aa833..c39f6defe 100644 --- a/Toolbox/arpack-src/zmout.f +++ b/Toolbox/arpack-src/zmout.f @@ -74,34 +74,34 @@ SUBROUTINE ZMOUT( LOUT, M, N, A, LDA, IDIGIT, IFMT ) IF (K1.NE.N) THEN WRITE( LOUT, 9994 )I, ( A( I, J ), J = K1, K2 ) ELSE - WRITE( LOUT, 9984 )I, ( A( I, J ), J = K1, K2 ) + WRITE( LOUT, 9984 )I, ( A( I, J ), J = K1, K2 ) END IF 30 CONTINUE 40 CONTINUE * ELSE IF( NDIGIT.LE.6 ) THEN - DO 60 K1 = 1, N, 2 + DO 60 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) WRITE( LOUT, 9997 )( ICOL, I, I = K1, K2 ) DO 50 I = 1, M IF (K1.NE.N) THEN WRITE( LOUT, 9993 )I, ( A( I, J ), J = K1, K2 ) - ELSE - WRITE( LOUT, 9983 )I, ( A( I, J ), J = K1, K2 ) + ELSE + WRITE( LOUT, 9983 )I, ( A( I, J ), J = K1, K2 ) END IF 50 CONTINUE 60 CONTINUE * ELSE IF( NDIGIT.LE.8 ) THEN - DO 80 K1 = 1, N, 2 + DO 80 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) WRITE( LOUT, 9996 )( ICOL, I, I = K1, K2 ) DO 70 I = 1, M IF (K1.NE.N) THEN WRITE( LOUT, 9992 )I, ( A( I, J ), J = K1, K2 ) ELSE - WRITE( LOUT, 9982 )I, ( A( I, J ), J = K1, K2 ) - END IF + WRITE( LOUT, 9982 )I, ( A( I, J ), J = K1, K2 ) + END IF 70 CONTINUE 80 CONTINUE * @@ -124,20 +124,20 @@ SUBROUTINE ZMOUT( LOUT, M, N, A, LDA, IDIGIT, IFMT ) K2 = MIN0( N, K1+3 ) WRITE( LOUT, 9998 )( ICOL, I, I = K1, K2 ) DO 110 I = 1, M - IF ((K1+3).LE.N) THEN + IF ((K1+3).LE.N) THEN WRITE( LOUT, 9974 )I, ( A( I, J ), J = K1, K2 ) ELSE IF ((K1+3-N).EQ.1) THEN WRITE( LOUT, 9964 )I, ( A( I, J ), J = k1, K2 ) ELSE IF ((K1+3-N).EQ.2) THEN WRITE( LOUT, 9954 )I, ( A( I, J ), J = K1, K2 ) ELSE IF ((K1+3-N).EQ.3) THEN - WRITE( LOUT, 9944 )I, ( A( I, J ), J = K1, K2 ) + WRITE( LOUT, 9944 )I, ( A( I, J ), J = K1, K2 ) END IF 110 CONTINUE 120 CONTINUE * ELSE IF( NDIGIT.LE.6 ) THEN - DO 140 K1 = 1, N, 3 + DO 140 K1 = 1, N, 3 K2 = MIN0( N, K1+ 2) WRITE( LOUT, 9997 )( ICOL, I, I = K1, K2 ) DO 130 I = 1, M @@ -185,14 +185,14 @@ SUBROUTINE ZMOUT( LOUT, M, N, A, LDA, IDIGIT, IFMT ) 9998 FORMAT( 11X, 4( 9X, 3A1, I4, 9X ) ) 9997 FORMAT( 10X, 4( 11X, 3A1, I4, 11X ) ) 9996 FORMAT( 10X, 3( 13X, 3A1, I4, 13X ) ) - 9995 FORMAT( 12X, 2( 18x, 3A1, I4, 18X ) ) + 9995 FORMAT( 12X, 2( 18x, 3A1, I4, 18X ) ) * *======================================================== * FORMAT FOR 72 COLUMN *======================================================== * * DISPLAY 4 SIGNIFICANT DIGITS -* +* 9994 FORMAT( 1X, ' Row', I4, ':', 1X, 1P,2('(',D10.3,',',D10.3,') ') ) 9984 FORMAT( 1X, ' Row', I4, ':', 1X, 1P,1('(',D10.3,',',D10.3,') ') ) * diff --git a/Toolbox/arpack-src/znaitr.f b/Toolbox/arpack-src/znaitr.f index 3b64ad4f2..240412ca0 100644 --- a/Toolbox/arpack-src/znaitr.f +++ b/Toolbox/arpack-src/znaitr.f @@ -2,8 +2,8 @@ c c\Name: znaitr c -c\Description: -c Reverse communication interface for applying NP additional steps to +c\Description: +c Reverse communication interface for applying NP additional steps to c a K step nonsymmetric Arnoldi factorization. c c Input: OP*V_{k} - V_{k}*H = r_{k}*e_{k}^T @@ -19,7 +19,7 @@ c c\Usage: c call znaitr -c ( IDO, BMAT, N, K, NP, NB, RESID, RNORM, V, LDV, H, LDH, +c ( IDO, BMAT, N, K, NP, NB, RESID, RNORM, V, LDV, H, LDH, c IPNTR, WORKD, INFO ) c c\Arguments @@ -61,8 +61,8 @@ c Number of additional Arnoldi steps to take. c c NB Integer. (INPUT) -c Blocksize to be used in the recurrence. -c Only work for NB = 1 right now. The goal is to have a +c Blocksize to be used in the recurrence. +c Only work for NB = 1 right now. The goal is to have a c program that implement both the block and non-block method. c c RESID Complex*16 array of length N. (INPUT/OUTPUT) @@ -74,37 +74,37 @@ c B-norm of the updated residual r_{k+p} on output. c c V Complex*16 N by K+NP array. (INPUT/OUTPUT) -c On INPUT: V contains the Arnoldi vectors in the first K +c On INPUT: V contains the Arnoldi vectors in the first K c columns. c On OUTPUT: V contains the new NP Arnoldi vectors in the next c NP columns. The first K columns are unchanged. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c H Complex*16 (K+NP) by (K+NP) array. (INPUT/OUTPUT) c H is used to store the generated upper Hessenberg matrix. c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORK for +c Pointer to mark the starting locations in the WORK for c vectors used by the Arnoldi iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in the +c IPNTR(3): pointer to the vector B * X when used in the c shift-and-invert mode. X is the current operand. c ------------------------------------------------------------- -c +c c WORKD Complex*16 work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The calling program should not +c for reverse communication. The calling program should not c use WORKD as temporary workspace during the iteration !!!!!! -c On input, WORKD(1:N) = B*RESID and is used to save some +c On input, WORKD(1:N) = B*RESID and is used to save some c computation at the first step. c c INFO Integer. (OUTPUT) @@ -124,14 +124,14 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: c zgetv0 ARPACK routine to generate the initial vector. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c zmout ARPACK utility routine that prints matrices c zvout ARPACK utility routine that prints vectors. c zlanhs LAPACK routine that computes various norms of a matrix. @@ -143,29 +143,29 @@ c zgemv Level 2 BLAS routine for matrix vector multiplication. c zaxpy Level 1 BLAS that computes a vector triad. c zcopy Level 1 BLAS that copies one vector to another . -c zdotc Level 1 BLAS that computes the scalar product of two vectors. +c zdotc Level 1 BLAS that computes the scalar product of two vectors. c zscal Level 1 BLAS that scales a vector. -c zdscal Level 1 BLAS that scales a complex vector by a real number. +c zdscal Level 1 BLAS that scales a complex vector by a real number. c dznrm2 Level 1 BLAS that computes the norm of a vector. c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University -c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas -c +c Dept. of Computational & Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas +c c\SCCS Information: @(#) c FILE: naitr.F SID: 2.3 DATE OF SID: 8/27/96 RELEASE: 2 c c\Remarks c The algorithm implemented is: -c +c c restart = .false. -c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; +c Given V_{k} = [v_{1}, ..., v_{k}], r_{k}; c r_{k} contains the initial residual vector even for k = 0; -c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already +c Also assume that rnorm = || B*r_{k} || and B*r_{k} are already c computed by the calling program. c c betaj = rnorm ; p_{k+1} = B*r_{k} ; @@ -173,7 +173,7 @@ c 1) if ( betaj < tol ) stop or restart depending on j. c ( At present tol is zero ) c if ( restart ) generate a new starting vector. -c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; +c 2) v_{j} = r(j-1)/betaj; V_{j} = [V_{j-1}, v_{j}]; c p_{j} = p_{j}/betaj c 3) r_{j} = OP*v_{j} where OP is defined as in znaupd c For shift-invert mode p_{j} = B*v_{j} is already available. @@ -188,7 +188,7 @@ c 5) Re-orthogonalization step: c s = V_{j}'*B*r_{j} c r_{j} = r_{j} - V_{j}*s; rnorm1 = || r_{j} || -c alphaj = alphaj + s_{j}; +c alphaj = alphaj + s_{j}; c 6) Iterative refinement step: c If (rnorm1 > 0.717*rnorm) then c rnorm = rnorm1 @@ -198,7 +198,7 @@ c If this is the first time in step 6), go to 5) c Else r_{j} lies in the span of V_{j} numerically. c Set r_{j} = 0 and rnorm = 0; go to 1) -c EndIf +c EndIf c End Do c c\EndLib @@ -206,15 +206,15 @@ c----------------------------------------------------------------------- c subroutine znaitr - & (ido, bmat, n, k, np, nb, resid, rnorm, v, ldv, h, ldh, + & (ido, bmat, n, k, np, nb, resid, rnorm, v, ldv, h, ldh, & ipntr, workd, info) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -241,7 +241,7 @@ subroutine znaitr & one, zero Double precision & rone, rzero - parameter (one = (1.0D+0, 0.0D+0), zero = (0.0D+0, 0.0D+0), + parameter (one = (1.0D+0, 0.0D+0), zero = (0.0D+0, 0.0D+0), & rone = 1.0D+0, rzero = 0.0D+0) c c %--------------% @@ -258,7 +258,7 @@ subroutine znaitr logical first, orth1, orth2, rstart, step3, step4 integer ierr, i, infol, ipj, irj, ivj, iter, itry, j, msglvl, & jj - Double precision + Double precision & ovfl, smlnum, tst1, ulp, unfl, betaj, & temp1, rnorm1, wnorm Complex*16 @@ -272,24 +272,24 @@ subroutine znaitr c | External Subroutines | c %----------------------% c - external zaxpy, zcopy, zscal, zdscal, zgemv, zgetv0, - & dlabad, zvout, zmout, ivout, second + external zaxpy, zcopy, zscal, zdscal, zgemv, zgetv0, + & dlabad, zvout, zmout, ivout, arscnd c c %--------------------% c | External Functions | c %--------------------% c Complex*16 - & zdotc - Double precision + & zzdotc + Double precision & dlamch, dznrm2, zlanhs, dlapy2 - external zdotc, dznrm2, zlanhs, dlamch, dlapy2 + external zzdotc, dznrm2, zlanhs, dlamch, dlapy2 c c %---------------------% c | Intrinsic Functions | c %---------------------% c - intrinsic dimag, dble, max, sqrt + intrinsic aimag, dble, max, sqrt c c %-----------------% c | Data statements | @@ -320,15 +320,15 @@ subroutine znaitr end if c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mcaitr -c +c c %------------------------------% c | Initial call to this routine | c %------------------------------% @@ -344,7 +344,7 @@ subroutine znaitr irj = ipj + n ivj = irj + n end if -c +c c %-------------------------------------------------% c | When in reverse communication mode one of: | c | STEP3, STEP4, ORTH1, ORTH2, RSTART | @@ -374,16 +374,16 @@ subroutine znaitr c | | c | Note: B*r_{j-1} is already in WORKD(1:N)=WORKD(IPJ:IPJ+N-1) | c %--------------------------------------------------------------% - + 1000 continue c if (msglvl .gt. 1) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: generating Arnoldi vector number') - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_naitr: B-norm of the current residual is') end if -c +c c %---------------------------------------------------% c | STEP 1: Check if the B norm of j-th residual | c | vector is zero. Equivalent to determine whether | @@ -400,16 +400,16 @@ subroutine znaitr c %---------------------------------------------------% c if (msglvl .gt. 0) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: ****** RESTART AT STEP ******') end if -c +c c %---------------------------------------------% c | ITRY is the loop variable that controls the | c | maximum amount of times that a restart is | c | attempted. NRSTRT is used by stat.h | c %---------------------------------------------% -c +c betaj = rzero nrstrt = nrstrt + 1 itry = 1 @@ -423,7 +423,7 @@ subroutine znaitr c | RSTART = .true. flow returns here. | c %--------------------------------------% c - call zgetv0 (ido, bmat, itry, .false., n, j, v, ldv, + call zgetv0 (ido, bmat, itry, .false., n, j, v, ldv, & resid, rnorm, ipntr, workd, ierr) if (ido .ne. 99) go to 9000 if (ierr .lt. 0) then @@ -437,12 +437,12 @@ subroutine znaitr c %------------------------------------------------% c info = j - 1 - call second (t1) + call arscnd (t1) tcaitr = tcaitr + (t1 - t0) ido = 99 go to 9000 end if -c +c 40 continue c c %---------------------------------------------------------% @@ -466,7 +466,7 @@ subroutine znaitr c call zlascl ('General', i, i, rnorm, rone, & n, 1, v(1,j), n, infol) - call zlascl ('General', i, i, rnorm, rone, + call zlascl ('General', i, i, rnorm, rone, & n, 1, workd(ipj), n, infol) end if c @@ -477,29 +477,29 @@ subroutine znaitr c step3 = .true. nopx = nopx + 1 - call second (t2) + call arscnd (t2) call zcopy (n, v(1,j), 1, workd(ivj), 1) ipntr(1) = ivj ipntr(2) = irj ipntr(3) = ipj ido = 1 -c +c c %-----------------------------------% c | Exit in order to compute OP*v_{j} | c %-----------------------------------% -c - go to 9000 +c + go to 9000 50 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(IRJ:IRJ+N-1) := OP*v_{j} | c | if step3 = .true. | c %----------------------------------% c - call second (t3) + call arscnd (t3) tmvopx = tmvopx + (t3 - t2) - + step3 = .false. c c %------------------------------------------% @@ -507,30 +507,30 @@ subroutine znaitr c %------------------------------------------% c call zcopy (n, workd(irj), 1, resid, 1) -c +c c %---------------------------------------% c | STEP 4: Finish extending the Arnoldi | c | factorization to length j. | c %---------------------------------------% c - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 step4 = .true. ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-------------------------------------% c | Exit in order to compute B*OP*v_{j} | c %-------------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call zcopy (n, resid, 1, workd(ipj), 1) end if 60 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(IPJ:IPJ+N-1) := B*OP*v_{j} | @@ -538,10 +538,10 @@ subroutine znaitr c %----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c step4 = .false. c c %-------------------------------------% @@ -549,9 +549,9 @@ subroutine znaitr c | Compute the B-norm of OP*v_{j}. | c %-------------------------------------% c - if (bmat .eq. 'G') then - cnorm = zdotc (n, resid, 1, workd(ipj), 1) - wnorm = sqrt( dlapy2(dble(cnorm),dimag(cnorm)) ) + if (bmat .eq. 'G') then + cnorm = zzdotc (n, resid, 1, workd(ipj), 1) + wnorm = sqrt( dlapy2(dble(cnorm),aimag(cnorm)) ) else if (bmat .eq. 'I') then wnorm = dznrm2(n, resid, 1) end if @@ -569,65 +569,65 @@ subroutine znaitr c | Compute the j Fourier coefficients w_{j} | c | WORKD(IPJ:IPJ+N-1) contains B*OP*v_{j}. | c %------------------------------------------% -c +c call zgemv ('C', n, j, one, v, ldv, workd(ipj), 1, & zero, h(1,j), 1) c c %--------------------------------------% c | Orthogonalize r_{j} against V_{j}. | -c | RESID contains OP*v_{j}. See STEP 3. | +c | RESID contains OP*v_{j}. See STEP 3. | c %--------------------------------------% c call zgemv ('N', n, j, -one, v, ldv, h(1,j), 1, & one, resid, 1) c - if (j .gt. 1) h(j,j-1) = dcmplx(betaj, rzero) + if (j .gt. 1) h(j,j-1) = cmplx(betaj, rzero, Kind=Kind(0d0)) +c + call arscnd (t4) c - call second (t4) -c orth1 = .true. -c - call second (t2) +c + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call zcopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*r_{j} | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call zcopy (n, resid, 1, workd(ipj), 1) - end if + end if 70 continue -c +c c %---------------------------------------------------% c | Back from reverse communication if ORTH1 = .true. | c | WORKD(IPJ:IPJ+N-1) := B*r_{j}. | c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c +c orth1 = .false. c c %------------------------------% c | Compute the B-norm of r_{j}. | c %------------------------------% c - if (bmat .eq. 'G') then - cnorm = zdotc (n, resid, 1, workd(ipj), 1) - rnorm = sqrt( dlapy2(dble(cnorm),dimag(cnorm)) ) + if (bmat .eq. 'G') then + cnorm = zzdotc (n, resid, 1, workd(ipj), 1) + rnorm = sqrt( dlapy2(dble(cnorm),aimag(cnorm)) ) else if (bmat .eq. 'I') then rnorm = dznrm2(n, resid, 1) end if -c +c c %-----------------------------------------------------------% c | STEP 5: Re-orthogonalization / Iterative refinement phase | c | Maximum NITER_ITREF tries. | @@ -650,20 +650,20 @@ subroutine znaitr c iter = 0 nrorth = nrorth + 1 -c +c c %---------------------------------------------------% c | Enter the Iterative refinement phase. If further | c | refinement is necessary, loop back here. The loop | c | variable is ITER. Perform a step of Classical | c | Gram-Schmidt using all the Arnoldi vectors V_{j} | c %---------------------------------------------------% -c +c 80 continue c if (msglvl .gt. 2) then rtemp(1) = wnorm rtemp(2) = rnorm - call dvout (logfil, 2, rtemp, ndigit, + call dvout (logfil, 2, rtemp, ndigit, & '_naitr: re-orthogonalization; wnorm and rnorm are') call zvout (logfil, j, h(1,j), ndigit, & '_naitr: j-th column of H') @@ -674,7 +674,7 @@ subroutine znaitr c | WORKD(IRJ:IRJ+J-1) = v(:,1:J)'*WORKD(IPJ:IPJ+N-1). | c %----------------------------------------------------% c - call zgemv ('C', n, j, one, v, ldv, workd(ipj), 1, + call zgemv ('C', n, j, one, v, ldv, workd(ipj), 1, & zero, workd(irj), 1) c c %---------------------------------------------% @@ -684,28 +684,28 @@ subroutine znaitr c | + v(:,1:J)*WORKD(IRJ:IRJ+J-1)*e'_j. | c %---------------------------------------------% c - call zgemv ('N', n, j, -one, v, ldv, workd(irj), 1, + call zgemv ('N', n, j, -one, v, ldv, workd(irj), 1, & one, resid, 1) call zaxpy (j, one, workd(irj), 1, h(1,j), 1) -c +c orth2 = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call zcopy (n, resid, 1, workd(irj), 1) ipntr(1) = irj ipntr(2) = ipj ido = 2 -c +c c %-----------------------------------% c | Exit in order to compute B*r_{j}. | c | r_{j} is the corrected residual. | c %-----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call zcopy (n, resid, 1, workd(ipj), 1) - end if + end if 90 continue c c %---------------------------------------------------% @@ -713,23 +713,23 @@ subroutine znaitr c %---------------------------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) - end if + end if c c %-----------------------------------------------------% c | Compute the B-norm of the corrected residual r_{j}. | c %-----------------------------------------------------% -c - if (bmat .eq. 'G') then - cnorm = zdotc (n, resid, 1, workd(ipj), 1) - rnorm1 = sqrt( dlapy2(dble(cnorm),dimag(cnorm)) ) +c + if (bmat .eq. 'G') then + cnorm = zzdotc (n, resid, 1, workd(ipj), 1) + rnorm1 = sqrt( dlapy2(dble(cnorm),aimag(cnorm)) ) else if (bmat .eq. 'I') then rnorm1 = dznrm2(n, resid, 1) end if -c +c if (msglvl .gt. 0 .and. iter .gt. 0 ) then - call ivout (logfil, 1, j, ndigit, + call ivout (logfil, 1, [j], ndigit, & '_naitr: Iterative refinement for Arnoldi residual') if (msglvl .gt. 2) then rtemp(1) = rnorm @@ -757,7 +757,7 @@ subroutine znaitr c %---------------------------------------% c rnorm = rnorm1 -c +c else c c %-------------------------------------------% @@ -776,55 +776,55 @@ subroutine znaitr c do 95 jj = 1, n resid(jj) = zero - 95 continue + 95 continue rnorm = rzero end if -c +c c %----------------------------------------------% c | Branch here directly if iterative refinement | c | wasn't necessary or after at most NITER_REF | c | steps of iterative refinement. | c %----------------------------------------------% -c +c 100 continue -c +c rstart = .false. orth2 = .false. -c - call second (t5) +c + call arscnd (t5) titref = titref + (t5 - t4) -c +c c %------------------------------------% c | STEP 6: Update j = j+1; Continue | c %------------------------------------% c j = j + 1 if (j .gt. k+np) then - call second (t1) + call arscnd (t1) tcaitr = tcaitr + (t1 - t0) ido = 99 do 110 i = max(1,k), k+np-1 -c +c c %--------------------------------------------% c | Check for splitting and deflation. | c | Use a standard test as in the QR algorithm | c | REFERENCE: LAPACK subroutine zlahqr | c %--------------------------------------------% -c - tst1 = dlapy2(dble(h(i,i)),dimag(h(i,i))) - & + dlapy2(dble(h(i+1,i+1)), dimag(h(i+1,i+1))) +c + tst1 = dlapy2(dble(h(i,i)),aimag(h(i,i))) + & + dlapy2(dble(h(i+1,i+1)), aimag(h(i+1,i+1))) if( tst1.eq.dble(zero) ) & tst1 = zlanhs( '1', k+np, h, ldh, workd(n+1) ) - if( dlapy2(dble(h(i+1,i)),dimag(h(i+1,i))) .le. - & max( ulp*tst1, smlnum ) ) + if( dlapy2(dble(h(i+1,i)),aimag(h(i+1,i))) .le. + & max( ulp*tst1, smlnum ) ) & h(i+1,i) = zero 110 continue -c +c if (msglvl .gt. 2) then - call zmout (logfil, k+np, k+np, h, ldh, ndigit, + call zmout (logfil, k+np, k+np, h, ldh, ndigit, & '_naitr: Final upper Hessenberg matrix H of order K+NP') end if -c +c go to 9000 end if c @@ -833,7 +833,7 @@ subroutine znaitr c %--------------------------------------------------------% c go to 1000 -c +c c %---------------------------------------------------------------% c | | c | E N D O F M A I N I T E R A T I O N L O O P | diff --git a/Toolbox/arpack-src/znapps.f b/Toolbox/arpack-src/znapps.f index 48f421346..792fe6168 100644 --- a/Toolbox/arpack-src/znapps.f +++ b/Toolbox/arpack-src/znapps.f @@ -19,7 +19,7 @@ c c\Usage: c call znapps -c ( N, KEV, NP, SHIFT, V, LDV, H, LDH, RESID, Q, LDQ, +c ( N, KEV, NP, SHIFT, V, LDV, H, LDH, RESID, Q, LDQ, c WORKL, WORKD ) c c\Arguments @@ -28,7 +28,7 @@ c c KEV Integer. (INPUT/OUTPUT) c KEV+NP is the size of the input matrix H. -c KEV is the size of the updated matrix HNEW. +c KEV is the size of the updated matrix HNEW. c c NP Integer. (INPUT) c Number of implicit shifts to be applied. @@ -46,7 +46,7 @@ c program. c c H Complex*16 (KEV+NP) by (KEV+NP) array. (INPUT/OUTPUT) -c On INPUT, H contains the current KEV+NP by KEV+NP upper +c On INPUT, H contains the current KEV+NP by KEV+NP upper c Hessenberg matrix of the Arnoldi factorization. c On OUTPUT, H contains the updated KEV by KEV upper Hessenberg c matrix in the KEV leading submatrix. @@ -57,7 +57,7 @@ c c RESID Complex*16 array of length N. (INPUT/OUTPUT) c On INPUT, RESID contains the the residual vector r_{k+p}. -c On OUTPUT, RESID is the update residual vector rnew_{k} +c On OUTPUT, RESID is the update residual vector rnew_{k} c in the first KEV locations. c c Q Complex*16 KEV+NP by KEV+NP work array. (WORKSPACE) @@ -92,7 +92,7 @@ c c\Routines called: c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c zmout ARPACK utility routine that prints matrices c zvout ARPACK utility routine that prints vectors. c zlacpy LAPACK matrix copy routine. @@ -112,9 +112,9 @@ c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c\SCCS Information: @(#) c FILE: napps.F SID: 2.3 DATE OF SID: 3/28/97 RELEASE: 2 @@ -132,15 +132,15 @@ c----------------------------------------------------------------------- c subroutine znapps - & ( n, kev, np, shift, v, ldv, h, ldh, resid, q, ldq, + & ( n, kev, np, shift, v, ldv, h, ldh, resid, q, ldq, & workl, workd ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -153,7 +153,7 @@ subroutine znapps c %-----------------% c Complex*16 - & h(ldh,kev+np), resid(n), shift(np), + & h(ldh,kev+np), resid(n), shift(np), & v(ldv,kev+np), q(ldq,kev+np), workd(2*n), workl(kev+np) c c %------------% @@ -175,22 +175,22 @@ subroutine znapps logical first Complex*16 & cdum, f, g, h11, h21, r, s, sigma, t - Double precision + Double precision & c, ovfl, smlnum, ulp, unfl, tst1 - save first, ovfl, smlnum, ulp, unfl + save first, ovfl, smlnum, ulp, unfl c c %----------------------% c | External Subroutines | c %----------------------% c - external zaxpy, zcopy, zgemv, zscal, zlacpy, zlartg, - & zvout, zlaset, dlabad, zmout, second, ivout + external zaxpy, zcopy, zgemv, zscal, zlacpy, zlartg, + & zvout, zlaset, dlabad, zmout, arscnd, ivout c c %--------------------% c | External Functions | c %--------------------% c - Double precision + Double precision & zlanhs, dlamch, dlapy2 external zlanhs, dlamch, dlapy2 c @@ -198,18 +198,18 @@ subroutine znapps c | Intrinsics Functions | c %----------------------% c - intrinsic abs, dimag, conjg, dcmplx, max, min, dble + intrinsic abs, aimag, conjg, cmplx, max, min, dble c c %---------------------% c | Statement Functions | c %---------------------% c - Double precision + Double precision & zabs1 - zabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) ) + zabs1( cdum ) = abs( dble( cdum ) ) + abs( aimag( cdum ) ) c c %----------------% -c | Data statments | +c | Data statements | c %----------------% c data first / .true. / @@ -240,11 +240,11 @@ subroutine znapps c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mcapps -c - kplusp = kev + np -c +c + kplusp = kev + np +c c %--------------------------------------------% c | Initialize Q to the identity to accumulate | c | the rotations and reflections | @@ -268,9 +268,9 @@ subroutine znapps sigma = shift(jj) c if (msglvl .gt. 2 ) then - call ivout (logfil, 1, jj, ndigit, + call ivout (logfil, 1, [jj], ndigit, & '_napps: shift number.') - call zvout (logfil, 1, sigma, ndigit, + call zvout (logfil, 1, [sigma], ndigit, & '_napps: Value of the shift ') end if c @@ -288,14 +288,14 @@ subroutine znapps tst1 = zabs1( h( i, i ) ) + zabs1( h( i+1, i+1 ) ) if( tst1.eq.rzero ) & tst1 = zlanhs( '1', kplusp-jj+1, h, ldh, workl ) - if ( abs(dble(h(i+1,i))) + if ( abs(dble(h(i+1,i))) & .le. max(ulp*tst1, smlnum) ) then if (msglvl .gt. 0) then - call ivout (logfil, 1, i, ndigit, + call ivout (logfil, 1, [i], ndigit, & '_napps: matrix splitting at row/column no.') - call ivout (logfil, 1, jj, ndigit, + call ivout (logfil, 1, [jj], ndigit, & '_napps: matrix splitting with shift number.') - call zvout (logfil, 1, h(i+1,i), ndigit, + call zvout (logfil, 1, h(i+1,i), ndigit, & '_napps: off diagonal element.') end if iend = i @@ -307,9 +307,9 @@ subroutine znapps 40 continue c if (msglvl .gt. 2) then - call ivout (logfil, 1, istart, ndigit, + call ivout (logfil, 1, [istart], ndigit, & '_napps: Start of current block ') - call ivout (logfil, 1, iend, ndigit, + call ivout (logfil, 1, [iend], ndigit, & '_napps: End of current block ') end if c @@ -325,7 +325,7 @@ subroutine znapps h21 = h(istart+1,istart) f = h11 - sigma g = h21 -c +c do 80 i = istart, iend-1 c c %------------------------------------------------------% @@ -345,7 +345,7 @@ subroutine znapps do 50 j = i, kplusp t = c*h(i,j) + s*h(i+1,j) h(i+1,j) = -conjg(s)*h(i,j) + c*h(i+1,j) - h(i,j) = t + h(i,j) = t 50 continue c c %---------------------------------------------% @@ -355,7 +355,7 @@ subroutine znapps do 60 j = 1, min(i+2,iend) t = c*h(j,i) + conjg(s)*h(j,i+1) h(j,i+1) = -s*h(j,i) + c*h(j,i+1) - h(j,i) = t + h(j,i) = t 60 continue c c %-----------------------------------------------------% @@ -365,7 +365,7 @@ subroutine znapps do 70 j = 1, min(i+jj, kplusp) t = c*q(j,i) + conjg(s)*q(j,i+1) q(j,i+1) = - s*q(j,i) + c*q(j,i+1) - q(j,i) = t + q(j,i) = t 70 continue c c %---------------------------% @@ -381,7 +381,7 @@ subroutine znapps c %-------------------------------% c | Finished applying the shift. | c %-------------------------------% -c +c 100 continue c c %---------------------------------------------------------% @@ -405,12 +405,12 @@ subroutine znapps c do 120 j=1,kev if ( dble( h(j+1,j) ) .lt. rzero .or. - & dimag( h(j+1,j) ) .ne. rzero ) then - t = h(j+1,j) / dlapy2(dble(h(j+1,j)),dimag(h(j+1,j))) + & aimag( h(j+1,j) ) .ne. rzero ) then + t = h(j+1,j) / dlapy2(dble(h(j+1,j)),aimag(h(j+1,j))) call zscal( kplusp-j+1, conjg(t), h(j+1,j), ldh ) call zscal( min(j+2, kplusp), t, h(1,j+1), 1 ) call zscal( min(j+np+1,kplusp), t, q(1,j+1), 1 ) - h(j+1,j) = dcmplx( dble( h(j+1,j) ), rzero ) + h(j+1,j) = cmplx( dble( h(j+1,j) ), rzero, Kind=Kind(0d0) ) end if 120 continue c @@ -428,7 +428,7 @@ subroutine znapps tst1 = zabs1( h( i, i ) ) + zabs1( h( i+1, i+1 ) ) if( tst1 .eq. rzero ) & tst1 = zlanhs( '1', kev, h, ldh, workl ) - if( dble( h( i+1,i ) ) .le. max( ulp*tst1, smlnum ) ) + if( dble( h( i+1,i ) ) .le. max( ulp*tst1, smlnum ) ) & h(i+1,i) = zero 130 continue c @@ -441,9 +441,9 @@ subroutine znapps c %-------------------------------------------------% c if ( dble( h(kev+1,kev) ) .gt. rzero ) - & call zgemv ('N', n, kplusp, one, v, ldv, q(1,kev+1), 1, zero, + & call zgemv ('N', n, kplusp, one, v, ldv, q(1,kev+1), 1, zero, & workd(n+1), 1) -c +c c %----------------------------------------------------------% c | Compute column 1 to kev of (V*Q) in backward order | c | taking advantage of the upper Hessenberg structure of Q. | @@ -460,14 +460,14 @@ subroutine znapps c %-------------------------------------------------% c call zlacpy ('A', n, kev, v(1,kplusp-kev+1), ldv, v, ldv) -c +c c %--------------------------------------------------------------% c | Copy the (kev+1)-st column of (V*Q) in the appropriate place | c %--------------------------------------------------------------% c if ( dble( h(kev+1,kev) ) .gt. rzero ) & call zcopy (n, workd(n+1), 1, v(1,kev+1), 1) -c +c c %-------------------------------------% c | Update the residual vector: | c | r <- sigmak*r + betak*v(:,kev+1) | @@ -485,7 +485,7 @@ subroutine znapps & '_napps: sigmak = (e_{kev+p}^T*Q)*e_{kev}') call zvout (logfil, 1, h(kev+1,kev), ndigit, & '_napps: betak = e_{kev+1}^T*H*e_{kev}') - call ivout (logfil, 1, kev, ndigit, + call ivout (logfil, 1, [kev], ndigit, & '_napps: Order of the final Hessenberg matrix ') if (msglvl .gt. 2) then call zmout (logfil, kev, kev, h, ldh, ndigit, @@ -495,9 +495,9 @@ subroutine znapps end if c 9000 continue - call second (t1) + call arscnd (t1) tcapps = tcapps + (t1 - t0) -c +c return c c %---------------% diff --git a/Toolbox/arpack-src/znaup2.f b/Toolbox/arpack-src/znaup2.f index 3d196a264..0ab01dd0e 100644 --- a/Toolbox/arpack-src/znaup2.f +++ b/Toolbox/arpack-src/znaup2.f @@ -1,14 +1,14 @@ c\BeginDoc c -c\Name: znaup2 +c\Name: znaup2 c -c\Description: +c\Description: c Intermediate level interface called by znaupd . c c\Usage: -c call znaup2 +c call znaup2 c ( IDO, BMAT, N, WHICH, NEV, NP, TOL, RESID, MODE, IUPD, -c ISHIFT, MXITER, V, LDV, H, LDH, RITZ, BOUNDS, +c ISHIFT, MXITER, V, LDV, H, LDH, RITZ, BOUNDS, c Q, LDQ, WORKL, IPNTR, WORKD, RWORK, INFO ) c c\Arguments @@ -26,7 +26,7 @@ c The logic for adjusting is contained within the current c subroutine. c If ISHIFT=0, NP is the number of shifts the user needs -c to provide via reverse comunication. 0 < NP < NCV-NEV. +c to provide via reverse communication. 0 < NP < NCV-NEV. c NP may be less than NCV-NEV since a leading block of the current c upper Hessenberg matrix has split off and contains "unwanted" c Ritz values. @@ -38,27 +38,27 @@ c IUPD .NE. 0: use implicit update. c c V Complex*16 N by (NEV+NP) array. (INPUT/OUTPUT) -c The Arnoldi basis vectors are returned in the first NEV +c The Arnoldi basis vectors are returned in the first NEV c columns of V. c c LDV Integer. (INPUT) -c Leading dimension of V exactly as declared in the calling +c Leading dimension of V exactly as declared in the calling c program. c c H Complex*16 (NEV+NP) by (NEV+NP) array. (OUTPUT) c H is used to store the generated upper Hessenberg matrix c c LDH Integer. (INPUT) -c Leading dimension of H exactly as declared in the calling +c Leading dimension of H exactly as declared in the calling c program. c c RITZ Complex*16 array of length NEV+NP. (OUTPUT) c RITZ(1:NEV) contains the computed Ritz values of OP. c c BOUNDS Complex*16 array of length NEV+NP. (OUTPUT) -c BOUNDS(1:NEV) contain the error bounds corresponding to +c BOUNDS(1:NEV) contain the error bounds corresponding to c the computed Ritz values. -c +c c Q Complex*16 (NEV+NP) by (NEV+NP) array. (WORKSPACE) c Private (replicated) work array used to accumulate the c rotation in the shift application step. @@ -67,7 +67,7 @@ c Leading dimension of Q exactly as declared in the calling c program. c -c WORKL Complex*16 work array of length at least +c WORKL Complex*16 work array of length at least c (NEV+NP)**2 + 3*(NEV+NP). (WORKSPACE) c Private (replicated) array on each PE or array allocated on c the front end. It is used in shifts calculation, shifts @@ -75,15 +75,15 @@ c c c IPNTR Integer array of length 3. (OUTPUT) -c Pointer to mark the starting locations in the WORKD for +c Pointer to mark the starting locations in the WORKD for c vectors used by the Arnoldi iteration. c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X. c IPNTR(2): pointer to the current result vector Y. -c IPNTR(3): pointer to the vector B * X when used in the +c IPNTR(3): pointer to the vector B * X when used in the c shift-and-invert mode. X is the current operand. c ------------------------------------------------------------- -c +c c WORKD Complex*16 work array of length 3*N. (WORKSPACE) c Distributed array to be used in the basic Arnoldi iteration c for reverse communication. The user should not use WORKD @@ -101,7 +101,7 @@ c Error flag on output. c = 0: Normal return. c = 1: Maximum number of iterations taken. -c All possible eigenvalues of OP has been found. +c All possible eigenvalues of OP has been found. c NP returns the number of converged Ritz values. c = 2: No shifts could be applied. c = -8: Error return from LAPACK eigenvalue calculation; @@ -117,32 +117,32 @@ c\BeginLib c c\Local variables: -c xxxxxx Complex*16 +c xxxxxx Complex*16 c c\References: c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c c\Routines called: -c zgetv0 ARPACK initial vector generation routine. +c zgetv0 ARPACK initial vector generation routine. c znaitr ARPACK Arnoldi factorization routine. c znapps ARPACK application of implicit shifts routine. -c zneigh ARPACK compute Ritz values and error bounds routine. +c zneigh ARPACK compute Ritz values and error bounds routine. c zngets ARPACK reorder Ritz values and error bounds routine. c zsortc ARPACK sorting routine. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c zmout ARPACK utility routine that prints matrices c zvout ARPACK utility routine that prints vectors. c dvout ARPACK utility routine that prints vectors. c dlamch LAPACK routine that determines machine constants. c dlapy2 LAPACK routine to compute sqrt(x**2+y**2) carefully. c zcopy Level 1 BLAS that copies one vector to another . -c zdotc Level 1 BLAS that computes the scalar product of two vectors. +c zdotc Level 1 BLAS that computes the scalar product of two vectors. c zswap Level 1 BLAS that swaps two vectors. c dznrm2 Level 1 BLAS that computes the norm of a vector. c @@ -151,10 +151,10 @@ c Richard Lehoucq CRPC / Rice Universitya c Chao Yang Houston, Texas c Dept. of Computational & -c Applied Mathematics -c Rice University -c Houston, Texas -c +c Applied Mathematics +c Rice University +c Houston, Texas +c c\SCCS Information: @(#) c FILE: naup2.F SID: 2.6 DATE OF SID: 06/01/00 RELEASE: 2 c @@ -165,17 +165,17 @@ c c----------------------------------------------------------------------- c - subroutine znaup2 - & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, - & ishift, mxiter, v, ldv, h, ldh, ritz, bounds, + subroutine znaup2 + & ( ido, bmat, n, which, nev, np, tol, resid, mode, iupd, + & ishift, mxiter, v, ldv, h, ldh, ritz, bounds, & q, ldq, workl, ipntr, workd, rwork, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -184,7 +184,7 @@ subroutine znaup2 character bmat*1, which*2 integer ido, info, ishift, iupd, mode, ldh, ldq, ldv, mxiter, & n, nev, np - Double precision + Double precision & tol c c %-----------------% @@ -192,20 +192,20 @@ subroutine znaup2 c %-----------------% c integer ipntr(13) - Complex*16 - & bounds(nev+np), h(ldh,nev+np), q(ldq,nev+np), - & resid(n), ritz(nev+np), v(ldv,nev+np), + Complex*16 + & bounds(nev+np), h(ldh,nev+np), q(ldq,nev+np), + & resid(n), ritz(nev+np), v(ldv,nev+np), & workd(3*n), workl( (nev+np)*(nev+np+3) ) - Double precision + Double precision & rwork(nev+np) c c %------------% c | Parameters | c %------------% c - Complex*16 + Complex*16 & one, zero - Double precision + Double precision & rzero parameter (one = (1.0D+0, 0.0D+0) , zero = (0.0D+0, 0.0D+0) , & rzero = 0.0D+0 ) @@ -215,16 +215,16 @@ subroutine znaup2 c %---------------% c logical cnorm , getv0, initv , update, ushift - integer ierr , iter , kplusp, msglvl, nconv, + integer ierr , iter , kplusp, msglvl, nconv, & nevbef, nev0 , np0 , nptemp, i , - & j - Complex*16 + & j + Complex*16 & cmpnorm - Double precision + Double precision & rnorm , eps23, rtemp character wprime*2 c - save cnorm, getv0, initv , update, ushift, + save cnorm, getv0, initv , update, ushift, & rnorm, iter , kplusp, msglvl, nconv , & nevbef, nev0 , np0 , eps23 c @@ -240,34 +240,34 @@ subroutine znaup2 c %----------------------% c external zcopy , zgetv0 , znaitr , zneigh , zngets , znapps , - & zsortc , zswap , zmout , zvout , ivout, second + & zsortc , zswap , zmout , zvout , ivout, arscnd c c %--------------------% c | External functions | c %--------------------% c - Complex*16 - & zdotc - Double precision - & dznrm2 , dlamch , dlapy2 - external zdotc , dznrm2 , dlamch , dlapy2 + Complex*16 + & zzdotc + Double precision + & dznrm2 , dlamch , dlapy2 + external zzdotc , dznrm2 , dlamch , dlapy2 c c %---------------------% c | Intrinsic Functions | c %---------------------% c - intrinsic dimag , dble , min, max + intrinsic aimag , dble , min, max c c %-----------------------% c | Executable Statements | c %-----------------------% c if (ido .eq. 0) then -c - call second (t0) -c +c + call arscnd (t0) +c msglvl = mcaup2 -c +c nev0 = nev np0 = np c @@ -283,7 +283,7 @@ subroutine znaup2 kplusp = nev + np nconv = 0 iter = 0 -c +c c %---------------------------------% c | Get machine dependent constant. | c %---------------------------------% @@ -313,7 +313,7 @@ subroutine znaup2 initv = .false. end if end if -c +c c %---------------------------------------------% c | Get a possibly random starting vector and | c | force it into the range of the operator OP. | @@ -330,7 +330,7 @@ subroutine znaup2 if (rnorm .eq. rzero) then c c %-----------------------------------------% -c | The initial vector is zero. Error exit. | +c | The initial vector is zero. Error exit. | c %-----------------------------------------% c info = -9 @@ -339,7 +339,7 @@ subroutine znaup2 getv0 = .false. ido = 0 end if -c +c c %-----------------------------------% c | Back from reverse communication : | c | continue with update step | @@ -359,12 +359,12 @@ subroutine znaup2 c %-------------------------------------% c if (cnorm) go to 100 -c +c c %----------------------------------------------------------% c | Compute the first NEV steps of the Arnoldi factorization | c %----------------------------------------------------------% c - call znaitr (ido, bmat, n, 0, nev, mode, resid, rnorm, v, ldv, + call znaitr (ido, bmat, n, 0, nev, mode, resid, rnorm, v, ldv, & h, ldh, ipntr, workd, info) c if (ido .ne. 99) go to 9000 @@ -375,7 +375,7 @@ subroutine znaup2 info = -9999 go to 1200 end if -c +c c %--------------------------------------------------------------% c | | c | M A I N ARNOLDI I T E R A T I O N L O O P | @@ -383,16 +383,16 @@ subroutine znaup2 c | factorization in place. | c | | c %--------------------------------------------------------------% -c +c 1000 continue c iter = iter + 1 c if (msglvl .gt. 0) then - call ivout (logfil, 1, iter, ndigit, + call ivout (logfil, 1, [iter], ndigit, & '_naup2: **** Start of major iteration number ****') end if -c +c c %-----------------------------------------------------------% c | Compute NP additional steps of the Arnoldi factorization. | c | Adjust NP since NEV might have been updated by last call | @@ -402,9 +402,9 @@ subroutine znaup2 np = kplusp - nev c if (msglvl .gt. 1) then - call ivout (logfil, 1, nev, ndigit, + call ivout (logfil, 1, [nev], ndigit, & '_naup2: The length of the current Arnoldi factorization') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_naup2: Extend the Arnoldi factorization by') end if c @@ -430,10 +430,10 @@ subroutine znaup2 update = .false. c if (msglvl .gt. 1) then - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_naup2: Corresponding B-norm of the residual') end if -c +c c %--------------------------------------------------------% c | Compute the eigenvalues and corresponding error bounds | c | of the current upper Hessenberg matrix. | @@ -452,7 +452,7 @@ subroutine znaup2 c | to be used in the convergence test. | c | The wanted part of the spectrum and corresponding | c | error bounds are in the last NEV loc. of RITZ, | -c | and BOUNDS respectively. | +c | and BOUNDS respectively. | c %---------------------------------------------------% c nev = nev0 @@ -475,7 +475,7 @@ subroutine znaup2 c %---------------------------------------------------% c call zngets (ishift, which, nev, np, ritz, bounds) -c +c c %------------------------------------------------------------% c | Convergence test: currently we use the following criteria. | c | The relative accuracy of a Ritz value is considered | @@ -489,22 +489,22 @@ subroutine znaup2 c do 25 i = 1, nev rtemp = max( eps23, dlapy2 ( dble (ritz(np+i)), - & dimag (ritz(np+i)) ) ) - if ( dlapy2 (dble (bounds(np+i)),dimag (bounds(np+i))) + & aimag (ritz(np+i)) ) ) + if ( dlapy2 (dble (bounds(np+i)),aimag (bounds(np+i))) & .le. tol*rtemp ) then nconv = nconv + 1 end if 25 continue -c +c if (msglvl .gt. 2) then kp(1) = nev kp(2) = np kp(3) = nconv - call ivout (logfil, 3, kp, ndigit, + call ivout (logfil, 3, kp, ndigit, & '_naup2: NEV, NP, NCONV are') call zvout (logfil, kplusp, ritz, ndigit, & '_naup2: The eigenvalues of H') - call zvout (logfil, kplusp, bounds, ndigit, + call zvout (logfil, kplusp, bounds, ndigit, & '_naup2: Ritz estimates of the current NCV Ritz values') end if c @@ -525,8 +525,8 @@ subroutine znaup2 nev = nev + 1 end if 30 continue -c - if ( (nconv .ge. nev0) .or. +c + if ( (nconv .ge. nev0) .or. & (iter .gt. mxiter) .or. & (np .eq. 0) ) then c @@ -537,7 +537,7 @@ subroutine znaup2 & ndigit, & '_naup2: Ritz estimates computed by _neigh:') end if -c +c c %------------------------------------------------% c | Prepare to exit. Put the converged Ritz values | c | and corresponding bounds in RITZ(1:NCONV) and | @@ -550,7 +550,7 @@ subroutine znaup2 c | rnorm to zneupd if needed | c %------------------------------------------% - h(3,1) = dcmplx (rnorm,rzero) + h(3,1) = cmplx (rnorm,rzero,Kind=Kind(0d0)) c c %----------------------------------------------% c | Sort Ritz values so that converged Ritz | @@ -573,9 +573,9 @@ subroutine znaup2 c | by 1 / max(eps23, magnitude of the Ritz value). | c %--------------------------------------------------% c - do 35 j = 1, nev0 + do 35 j = 1, nev0 rtemp = max( eps23, dlapy2 ( dble (ritz(j)), - & dimag (ritz(j)) ) ) + & aimag (ritz(j)) ) ) bounds(j) = bounds(j)/rtemp 35 continue c @@ -596,7 +596,7 @@ subroutine znaup2 c do 40 j = 1, nev0 rtemp = max( eps23, dlapy2 ( dble (ritz(j)), - & dimag (ritz(j)) ) ) + & aimag (ritz(j)) ) ) bounds(j) = bounds(j)*rtemp 40 continue c @@ -616,13 +616,13 @@ subroutine znaup2 end if c c %------------------------------------% -c | Max iterations have been exceeded. | +c | Max iterations have been exceeded. | c %------------------------------------% c if (iter .gt. mxiter .and. nconv .lt. nev0) info = 1 c c %---------------------% -c | No shifts to apply. | +c | No shifts to apply. | c %---------------------% c if (np .eq. 0 .and. nconv .lt. nev0) info = 2 @@ -631,7 +631,7 @@ subroutine znaup2 go to 1100 c else if ( (nconv .lt. nev0) .and. (ishift .eq. 1) ) then -c +c c %-------------------------------------------------% c | Do not have all the requested eigenvalues yet. | c | To prevent possible stagnation, adjust the size | @@ -646,24 +646,24 @@ subroutine znaup2 nev = 2 end if np = kplusp - nev -c +c c %---------------------------------------% c | If the size of NEV was just increased | c | resort the eigenvalues. | c %---------------------------------------% -c - if (nevbef .lt. nev) +c + if (nevbef .lt. nev) & call zngets (ishift, which, nev, np, ritz, bounds) c - end if -c + end if +c if (msglvl .gt. 0) then - call ivout (logfil, 1, nconv, ndigit, + call ivout (logfil, 1, [nconv], ndigit, & '_naup2: no. of "converged" Ritz values at this iter.') if (msglvl .gt. 1) then kp(1) = nev kp(2) = np - call ivout (logfil, 2, kp, ndigit, + call ivout (logfil, 2, kp, ndigit, & '_naup2: NEV and NP are') call zvout (logfil, nev, ritz(np+1), ndigit, & '_naup2: "wanted" Ritz values ') @@ -687,7 +687,7 @@ subroutine znaup2 ushift = .false. c if ( ishift .ne. 1 ) then -c +c c %----------------------------------% c | Move the NP shifts from WORKL to | c | RITZ, to free up WORKL | @@ -697,12 +697,12 @@ subroutine znaup2 call zcopy (np, workl, 1, ritz, 1) end if c - if (msglvl .gt. 2) then - call ivout (logfil, 1, np, ndigit, + if (msglvl .gt. 2) then + call ivout (logfil, 1, [np], ndigit, & '_naup2: The number of shifts to apply ') call zvout (logfil, np, ritz, ndigit, & '_naup2: values of the shifts') - if ( ishift .eq. 1 ) + if ( ishift .eq. 1 ) & call zvout (logfil, np, bounds, ndigit, & '_naup2: Ritz estimates of the shifts') end if @@ -714,7 +714,7 @@ subroutine znaup2 c | The first 2*N locations of WORKD are used as workspace. | c %---------------------------------------------------------% c - call znapps (n, nev, np, ritz, v, ldv, + call znapps (n, nev, np, ritz, v, ldv, & h, ldh, resid, q, ldq, workl, workd) c c %---------------------------------------------% @@ -724,50 +724,50 @@ subroutine znaup2 c %---------------------------------------------% c cnorm = .true. - call second (t2) + call arscnd (t2) if (bmat .eq. 'G') then nbx = nbx + 1 call zcopy (n, resid, 1, workd(n+1), 1) ipntr(1) = n + 1 ipntr(2) = 1 ido = 2 -c +c c %----------------------------------% c | Exit in order to compute B*RESID | c %----------------------------------% -c +c go to 9000 else if (bmat .eq. 'I') then call zcopy (n, resid, 1, workd, 1) end if -c +c 100 continue -c +c c %----------------------------------% c | Back from reverse communication; | c | WORKD(1:N) := B*RESID | c %----------------------------------% c if (bmat .eq. 'G') then - call second (t3) + call arscnd (t3) tmvbx = tmvbx + (t3 - t2) end if -c - if (bmat .eq. 'G') then - cmpnorm = zdotc (n, resid, 1, workd, 1) - rnorm = sqrt(dlapy2 (dble (cmpnorm),dimag (cmpnorm))) +c + if (bmat .eq. 'G') then + cmpnorm = zzdotc (n, resid, 1, workd, 1) + rnorm = sqrt(dlapy2 (dble (cmpnorm),aimag (cmpnorm))) else if (bmat .eq. 'I') then rnorm = dznrm2 (n, resid, 1) end if cnorm = .false. c if (msglvl .gt. 2) then - call dvout (logfil, 1, rnorm, ndigit, + call dvout (logfil, 1, [rnorm], ndigit, & '_naup2: B-norm of residual for compressed factorization') call zmout (logfil, nev, nev, h, ldh, ndigit, & '_naup2: Compressed upper Hessenberg matrix H') end if -c +c go to 1000 c c %---------------------------------------------------------------% @@ -780,7 +780,7 @@ subroutine znaup2 c mxiter = iter nev = nconv -c +c 1200 continue ido = 99 c @@ -788,9 +788,9 @@ subroutine znaup2 c | Error Exit | c %------------% c - call second (t1) + call arscnd (t1) tcaup2 = t1 - t0 -c +c 9000 continue c c %---------------% diff --git a/Toolbox/arpack-src/znaupd.f b/Toolbox/arpack-src/znaupd.f index 44c743ce7..c7d58aaab 100644 --- a/Toolbox/arpack-src/znaupd.f +++ b/Toolbox/arpack-src/znaupd.f @@ -2,19 +2,19 @@ c c\Name: znaupd c -c\Description: +c\Description: c Reverse communication interface for the Implicitly Restarted Arnoldi -c iteration. This is intended to be used to find a few eigenpairs of a -c complex linear operator OP with respect to a semi-inner product defined -c by a hermitian positive semi-definite real matrix B. B may be the identity -c matrix. NOTE: if both OP and B are real, then dsaupd or dnaupd should +c iteration. This is intended to be used to find a few eigenpairs of a +c complex linear operator OP with respect to a semi-inner product defined +c by a hermitian positive semi-definite real matrix B. B may be the identity +c matrix. NOTE: if both OP and B are real, then dsaupd or dnaupd should c be used. c c c The computed approximate eigenvalues are called Ritz values and c the corresponding approximate eigenvectors are called Ritz vectors. c -c znaupd is usually called iteratively to solve one of the +c znaupd is usually called iteratively to solve one of the c following problems: c c Mode 1: A*x = lambda*x. @@ -25,10 +25,10 @@ c ===> (If M can be factored see remark 3 below) c c Mode 3: A*x = lambda*M*x, M hermitian semi-definite -c ===> OP = inv[A - sigma*M]*M and B = M. -c ===> shift-and-invert mode +c ===> OP = inv[A - sigma*M]*M and B = M. +c ===> shift-and-invert mode c If OP*x = amu*x, then lambda = sigma + 1/amu. -c +c c c NOTE: The action of w <- inv[A - sigma*M]*v or w <- inv[M]*v c should be accomplished either by a direct method @@ -49,12 +49,12 @@ c c\Arguments c IDO Integer. (INPUT/OUTPUT) -c Reverse communication flag. IDO must be zero on the first -c call to znaupd. IDO will be set internally to +c Reverse communication flag. IDO must be zero on the first +c call to znaupd . IDO will be set internally to c indicate the type of operation to be performed. Control is c then given back to the calling routine which has the c responsibility to carry out the requested operation and call -c znaupd with the result. The operand is given in +c znaupd with the result. The operand is given in c WORKD(IPNTR(1)), the result must be put in WORKD(IPNTR(2)). c ------------------------------------------------------------- c IDO = 0: first call to the reverse communication interface @@ -72,14 +72,14 @@ c IDO = 2: compute Y = M * X where c IPNTR(1) is the pointer into WORKD for X, c IPNTR(2) is the pointer into WORKD for Y. -c IDO = 3: compute and return the shifts in the first +c IDO = 3: compute and return the shifts in the first c NP locations of WORKL. c IDO = 99: done c ------------------------------------------------------------- -c After the initialization phase, when the routine is used in -c the "shift-and-invert" mode, the vector M * X is already +c After the initialization phase, when the routine is used in +c the "shift-and-invert" mode, the vector M * X is already c available and does not need to be recomputed in forming OP*X. -c +c c BMAT Character*1. (INPUT) c BMAT specifies the type of the matrix B that defines the c semi-inner product for the operator OP. @@ -100,15 +100,15 @@ c NEV Integer. (INPUT) c Number of eigenvalues of OP to be computed. 0 < NEV < N-1. c -c TOL Double precision scalar. (INPUT) -c Stopping criteria: the relative accuracy of the Ritz value +c TOL Double precision scalar. (INPUT) +c Stopping criteria: the relative accuracy of the Ritz value c is considered acceptable if BOUNDS(I) .LE. TOL*ABS(RITZ(I)) c where ABS(RITZ(I)) is the magnitude when RITZ(I) is complex. -c DEFAULT = dlamch('EPS') (machine precision as computed -c by the LAPACK auxiliary subroutine dlamch). +c DEFAULT = dlamch ('EPS') (machine precision as computed +c by the LAPACK auxiliary subroutine dlamch ). c -c RESID Complex*16 array of length N. (INPUT/OUTPUT) -c On INPUT: +c RESID Complex*16 array of length N. (INPUT/OUTPUT) +c On INPUT: c If INFO .EQ. 0, a random initial residual vector is used. c If INFO .NE. 0, RESID contains the initial residual vector, c possibly from a previous run. @@ -118,15 +118,15 @@ c NCV Integer. (INPUT) c Number of columns of the matrix V. NCV must satisfy the two c inequalities 1 <= NCV-NEV and NCV <= N. -c This will indicate how many Arnoldi vectors are generated -c at each iteration. After the startup phase in which NEV -c Arnoldi vectors are generated, the algorithm generates -c approximately NCV-NEV Arnoldi vectors at each subsequent update -c iteration. Most of the cost in generating each Arnoldi vector is +c This will indicate how many Arnoldi vectors are generated +c at each iteration. After the startup phase in which NEV +c Arnoldi vectors are generated, the algorithm generates +c approximately NCV-NEV Arnoldi vectors at each subsequent update +c iteration. Most of the cost in generating each Arnoldi vector is c in the matrix-vector operation OP*x. (See remark 4 below.) c -c V Complex*16 array N by NCV. (OUTPUT) -c Contains the final set of Arnoldi basis vectors. +c V Complex*16 array N by NCV. (OUTPUT) +c Contains the final set of Arnoldi basis vectors. c c LDV Integer. (INPUT) c Leading dimension of V exactly as declared in the calling program. @@ -137,23 +137,23 @@ c the components of the unwanted eigenvector. c ------------------------------------------------------------- c ISHIFT = 0: the shifts are to be provided by the user via -c reverse communication. The NCV eigenvalues of +c reverse communication. The NCV eigenvalues of c the Hessenberg matrix H are returned in the part c of WORKL array corresponding to RITZ. c ISHIFT = 1: exact shifts with respect to the current -c Hessenberg matrix H. This is equivalent to -c restarting the iteration from the beginning +c Hessenberg matrix H. This is equivalent to +c restarting the iteration from the beginning c after updating the starting vector with a linear -c combination of Ritz vectors associated with the +c combination of Ritz vectors associated with the c "wanted" eigenvalues. c ISHIFT = 2: other choice of internal shift to be defined. c ------------------------------------------------------------- c -c IPARAM(2) = No longer referenced +c IPARAM(2) = No longer referenced c c IPARAM(3) = MXITER -c On INPUT: maximum number of Arnoldi update iterations allowed. -c On OUTPUT: actual number of Arnoldi update iterations taken. +c On INPUT: maximum number of Arnoldi update iterations allowed. +c On OUTPUT: actual number of Arnoldi update iterations taken. c c IPARAM(4) = NB: blocksize to be used in the recurrence. c The code currently works only for NB = 1. @@ -163,11 +163,11 @@ c the convergence criterion. c c IPARAM(6) = IUPD -c No longer referenced. Implicit restarting is ALWAYS used. +c No longer referenced. Implicit restarting is ALWAYS used. c c IPARAM(7) = MODE c On INPUT determines what type of eigenproblem is being solved. -c Must be 1,2,3; See under \Description of znaupd for the +c Must be 1,2,3; See under \Description of znaupd for the c four modes available. c c IPARAM(8) = NP @@ -186,7 +186,7 @@ c ------------------------------------------------------------- c IPNTR(1): pointer to the current operand vector X in WORKD. c IPNTR(2): pointer to the current result vector Y in WORKD. -c IPNTR(3): pointer to the vector B * X in WORKD when used in +c IPNTR(3): pointer to the vector B * X in WORKD when used in c the shift-and-invert mode. c IPNTR(4): pointer to the next available location in WORKL c that is untouched by the program. @@ -197,9 +197,9 @@ c IPNTR(8): pointer to the error BOUNDS array in WORKL. c IPNTR(14): pointer to the NP shifts in WORKL. See Remark 5 below. c -c Note: IPNTR(9:13) is only referenced by zneupd. See Remark 2 below. +c Note: IPNTR(9:13) is only referenced by zneupd . See Remark 2 below. c -c IPNTR(9): pointer to the NCV RITZ values of the +c IPNTR(9): pointer to the NCV RITZ values of the c original system. c IPNTR(10): Not Used c IPNTR(11): pointer to the NCV corresponding error bounds. @@ -207,24 +207,24 @@ c Schur matrix for H. c IPNTR(13): pointer to the NCV by NCV matrix of eigenvectors c of the upper Hessenberg matrix H. Only referenced by -c zneupd if RVEC = .TRUE. See Remark 2 below. +c zneupd if RVEC = .TRUE. See Remark 2 below. c c ------------------------------------------------------------- -c -c WORKD Complex*16 work array of length 3*N. (REVERSE COMMUNICATION) +c +c WORKD Complex*16 work array of length 3*N. (REVERSE COMMUNICATION) c Distributed array to be used in the basic Arnoldi iteration -c for reverse communication. The user should not use WORKD +c for reverse communication. The user should not use WORKD c as temporary workspace during the iteration !!!!!!!!!! -c See Data Distribution Note below. +c See Data Distribution Note below. c -c WORKL Complex*16 work array of length LWORKL. (OUTPUT/WORKSPACE) +c WORKL Complex*16 work array of length LWORKL. (OUTPUT/WORKSPACE) c Private (replicated) array on each PE or array allocated on c the front end. See Data Distribution Note below. c c LWORKL Integer. (INPUT) c LWORKL must be at least 3*NCV**2 + 5*NCV. c -c RWORK Double precision work array of length NCV (WORKSPACE) +c RWORK Double precision work array of length NCV (WORKSPACE) c Private (replicated) array on each PE or array allocated on c the front end. c @@ -236,18 +236,18 @@ c Error flag on output. c = 0: Normal exit. c = 1: Maximum number of iterations taken. -c All possible eigenvalues of OP has been found. IPARAM(5) +c All possible eigenvalues of OP has been found. IPARAM(5) c returns the number of wanted converged Ritz values. c = 2: No longer an informational error. Deprecated starting c with release 2 of ARPACK. -c = 3: No shifts could be applied during a cycle of the -c Implicitly restarted Arnoldi iteration. One possibility -c is to increase the size of NCV relative to NEV. +c = 3: No shifts could be applied during a cycle of the +c Implicitly restarted Arnoldi iteration. One possibility +c is to increase the size of NCV relative to NEV. c See remark 4 below. c = -1: N must be positive. c = -2: NEV must be positive. -c = -3: NCV-NEV >= 1 and less than or equal to N. -c = -4: The maximum number of Arnoldi update iteration +c = -3: NCV-NEV >= 2 and less than or equal to N. +c = -4: The maximum number of Arnoldi update iteration c must be greater than zero. c = -5: WHICH must be one of 'LM', 'SM', 'LR', 'SR', 'LI', 'SI' c = -6: BMAT must be one of 'I' or 'G'. @@ -268,16 +268,16 @@ c selection of WHICH should be made with this in mind when using c Mode = 3. When operating in Mode = 3 setting WHICH = 'LM' will c compute the NEV eigenvalues of the original problem that are -c closest to the shift SIGMA . After convergence, approximate eigenvalues -c of the original problem may be obtained with the ARPACK subroutine zneupd. +c closest to the shift SIGMA . After convergence, approximate eigenvalues +c of the original problem may be obtained with the ARPACK subroutine zneupd . c -c 2. If a basis for the invariant subspace corresponding to the converged Ritz -c values is needed, the user must call zneupd immediately following -c completion of znaupd. This is new starting with release 2 of ARPACK. +c 2. If a basis for the invariant subspace corresponding to the converged Ritz +c values is needed, the user must call zneupd immediately following +c completion of znaupd . This is new starting with release 2 of ARPACK. c c 3. If M can be factored into a Cholesky factorization M = LL` c then Mode = 2 should not be selected. Instead one should use -c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular +c Mode = 1 with OP = inv(L)*A*inv(L`). Appropriate triangular c linear systems should be solved with L and L` rather c than computing inverses. After convergence, an approximate c eigenvector z of the original problem is recovered by solving @@ -287,11 +287,11 @@ c of NCV relative to NEV. The only formal requirement is that NCV > NEV + 1. c However, it is recommended that NCV .ge. 2*NEV. If many problems of c the same type are to be solved, one should experiment with increasing -c NCV while keeping NEV fixed for a given test problem. This will +c NCV while keeping NEV fixed for a given test problem. This will c usually decrease the required number of OP*x operations but it c also increases the work and storage required to maintain the orthogonal c basis vectors. The optimal "cross-over" with respect to CPU time -c is problem dependent and must be determined empirically. +c is problem dependent and must be determined empirically. c See Chapter 8 of Reference 2 for further information. c c 5. When IPARAM(1) = 0, and IDO = 3, the user needs to provide the @@ -305,11 +305,11 @@ c c----------------------------------------------------------------------- c -c\Data Distribution Note: +c\Data Distribution Note: c c Fortran-D syntax: c ================ -c Complex*16 resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) +c Complex*16 resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) c decompose d1(n), d2(n,ncv) c align resid(i) with d1(i) c align v(i,j) with d2(i,j) @@ -321,13 +321,13 @@ c c Cray MPP syntax: c =============== -c Complex*16 resid(n), v(ldv,ncv), workd(n,3), workl(lworkl) +c Complex*16 resid(n), v(ldv,ncv), workd(n,3), workl(lworkl) c shared resid(block), v(block,:), workd(block,:) c replicated workl(lworkl) -c +c c CM2/CM5 syntax: c ============== -c +c c----------------------------------------------------------------------- c c include 'ex-nonsym.doc' @@ -343,32 +343,32 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B.N. Parlett & Y. Saad, "_Complex_ Shift and Invert Strategies for -c Double precision Matrices", Linear Algebra and its Applications, vol 88/89, +c _Real_ Matrices", Linear Algebra and its Applications, vol 88/89, c pp 575-595, (1987). c c\Routines called: -c znaup2 ARPACK routine that implements the Implicitly Restarted +c znaup2 ARPACK routine that implements the Implicitly Restarted c Arnoldi Iteration. -c zstatn ARPACK routine that initializes the timing variables. +c zstatn ARPACK routine that initializes the timing variables. c ivout ARPACK utility routine that prints integers. -c zvout ARPACK utility routine that prints vectors. -c second ARPACK utility routine for timing. -c dlamch LAPACK routine that determines machine constants. +c zvout ARPACK utility routine that prints vectors. +c arscnd ARPACK utility routine for timing. +c dlamch LAPACK routine that determines machine constants. c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas -c +c Applied Mathematics +c Rice University +c Houston, Texas +c c\SCCS Information: @(#) -c FILE: naupd.F SID: 2.9 DATE OF SID: 07/21/02 RELEASE: 2 +c FILE: naupd.F SID: 2.8 DATE OF SID: 04/10/01 RELEASE: 2 c c\Remarks c @@ -377,15 +377,15 @@ c----------------------------------------------------------------------- c subroutine znaupd - & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, + & ( ido, bmat, n, which, nev, tol, resid, ncv, v, ldv, iparam, & ipntr, workd, workl, lworkl, rwork, info ) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -393,7 +393,7 @@ subroutine znaupd c character bmat*1, which*2 integer ido, info, ldv, lworkl, n, ncv, nev - Double precision + Double precision & tol c c %-----------------% @@ -403,7 +403,7 @@ subroutine znaupd integer iparam(11), ipntr(14) Complex*16 & resid(n), v(ldv,ncv), workd(3*n), workl(lworkl) - Double precision + Double precision & rwork(ncv) c c %------------% @@ -412,13 +412,13 @@ subroutine znaupd c Complex*16 & one, zero - parameter (one = (1.0D+0, 0.0D+0), zero = (0.0D+0, 0.0D+0)) + parameter (one = (1.0D+0, 0.0D+0) , zero = (0.0D+0, 0.0D+0) ) c c %---------------% c | Local Scalars | c %---------------% c - integer bounds, ierr, ih, iq, ishift, iupd, iw, + integer bounds, ierr, ih, iq, ishift, iupd, iw, & ldh, ldq, levec, mode, msglvl, mxiter, nb, & nev0, next, np, ritz, j save bounds, ih, iq, ishift, iupd, iw, @@ -429,29 +429,29 @@ subroutine znaupd c | External Subroutines | c %----------------------% c - external znaup2, zvout, ivout, second, zstatn + external znaup2 , zvout , ivout, arscnd, zstatn c c %--------------------% c | External Functions | c %--------------------% c - Double precision + Double precision & dlamch external dlamch c c %-----------------------% c | Executable Statements | c %-----------------------% -c +c if (ido .eq. 0) then -c +c c %-------------------------------% c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% c call zstatn - call second (t0) + call arscnd (t0) msglvl = mcaupd c c %----------------% @@ -496,7 +496,7 @@ subroutine znaupd else if (mode .eq. 1 .and. bmat .eq. 'G') then ierr = -11 end if -c +c c %------------% c | Error Exit | c %------------% @@ -506,14 +506,14 @@ subroutine znaupd ido = 99 go to 9000 end if -c +c c %------------------------% c | Set default parameters | c %------------------------% c if (nb .le. 0) nb = 1 - if (tol .le. 0.0D+0 ) tol = dlamch('EpsMach') - if (ishift .ne. 0 .and. + if (tol .le. 0.0D+0 ) tol = dlamch ('EpsMach') + if (ishift .ne. 0 .and. & ishift .ne. 1 .and. & ishift .ne. 2) ishift = 1 c @@ -525,8 +525,8 @@ subroutine znaupd c %----------------------------------------------% c np = ncv - nev - nev0 = nev -c + nev0 = nev +c c %-----------------------------% c | Zero out internal workspace | c %-----------------------------% @@ -534,7 +534,7 @@ subroutine znaupd do 10 j = 1, 3*ncv**2 + 5*ncv workl(j) = zero 10 continue -c +c c %-------------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, BOUNDS, Q | c | etc... and the remaining workspace. | @@ -545,8 +545,8 @@ subroutine znaupd c | workl(ncv*ncv+ncv+1:ncv*ncv+2*ncv) := error bounds | c | workl(ncv*ncv+2*ncv+1:2*ncv*ncv+2*ncv) := rotation matrix Q | c | workl(2*ncv*ncv+2*ncv+1:3*ncv*ncv+5*ncv) := workspace | -c | The final workspace is needed by subroutine zneigh called | -c | by znaup2. Subroutine zneigh calls LAPACK routines for | +c | The final workspace is needed by subroutine zneigh called | +c | by znaup2 . Subroutine zneigh calls LAPACK routines for | c | calculating eigenvalues and the last row of the eigenvector | c | matrix. | c %-------------------------------------------------------------% @@ -572,12 +572,12 @@ subroutine znaupd c | Carry out the Implicitly restarted Arnoldi Iteration. | c %-------------------------------------------------------% c - call znaup2 + call znaup2 & ( ido, bmat, n, which, nev0, np, tol, resid, mode, iupd, - & ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritz), - & workl(bounds), workl(iq), ldq, workl(iw), + & ishift, mxiter, v, ldv, workl(ih), ldh, workl(ritz), + & workl(bounds), workl(iq), ldq, workl(iw), & ipntr, workd, rwork, info ) -c +c c %--------------------------------------------------% c | ido .ne. 99 implies use of reverse communication | c | to compute operations involving OP. | @@ -585,7 +585,7 @@ subroutine znaupd c if (ido .eq. 3) iparam(8) = np if (ido .ne. 99) go to 9000 -c +c iparam(3) = mxiter iparam(5) = np iparam(9) = nopx @@ -594,24 +594,24 @@ subroutine znaupd c c %------------------------------------% c | Exit if there was an informational | -c | error within znaup2. | +c | error within znaup2 . | c %------------------------------------% c if (info .lt. 0) go to 9000 if (info .eq. 2) info = 3 c if (msglvl .gt. 0) then - call ivout (logfil, 1, mxiter, ndigit, + call ivout (logfil, 1, [mxiter], ndigit, & '_naupd: Number of update iterations taken') - call ivout (logfil, 1, np, ndigit, + call ivout (logfil, 1, [np], ndigit, & '_naupd: Number of wanted "converged" Ritz values') - call zvout (logfil, np, workl(ritz), ndigit, + call zvout (logfil, np, workl(ritz), ndigit, & '_naupd: The final Ritz values') - call zvout (logfil, np, workl(bounds), ndigit, + call zvout (logfil, np, workl(bounds), ndigit, & '_naupd: Associated Ritz estimates') end if c - call second (t1) + call arscnd (t1) tcaupd = t1 - t0 c if (msglvl .gt. 0) then @@ -627,8 +627,8 @@ subroutine znaupd 1000 format (//, & 5x, '=============================================',/ & 5x, '= Complex implicit Arnoldi update code =',/ - & 5x, '= Version Number: ', ' 2.3', 21x, ' =',/ - & 5x, '= Version Date: ', ' 07/31/96', 16x, ' =',/ + & 5x, '= Version Number: ', ' 2.3' , 21x, ' =',/ + & 5x, '= Version Date: ', ' 07/31/96' , 16x, ' =',/ & 5x, '=============================================',/ & 5x, '= Summary of timing statistics =',/ & 5x, '=============================================',//) @@ -658,7 +658,7 @@ subroutine znaupd return c c %---------------% -c | End of znaupd | +c | End of znaupd | c %---------------% c end diff --git a/Toolbox/arpack-src/zneigh.f b/Toolbox/arpack-src/zneigh.f index c9ace20a9..db1bc2298 100644 --- a/Toolbox/arpack-src/zneigh.f +++ b/Toolbox/arpack-src/zneigh.f @@ -12,7 +12,7 @@ c c\Arguments c RNORM Double precision scalar. (INPUT) -c Residual norm corresponding to the current upper Hessenberg +c Residual norm corresponding to the current upper Hessenberg c matrix H. c c N Integer. (INPUT) @@ -30,8 +30,8 @@ c c BOUNDS Complex*16 array of length N. (OUTPUT) c On output, BOUNDS contains the Ritz estimates associated with -c the eigenvalues held in RITZ. This is equal to RNORM -c times the last components of the eigenvectors corresponding +c the eigenvalues held in RITZ. This is equal to RNORM +c times the last components of the eigenvectors corresponding c to the eigenvalues in RITZ. c c Q Complex*16 N by N array. (WORKSPACE) @@ -48,7 +48,7 @@ c c RWORK Double precision work array of length N (WORKSPACE) c Private (replicated) array on each PE or array allocated on -c the front end. +c the front end. c c IERR Integer. (OUTPUT) c Error exit flag from zlahqr or ztrevc. @@ -64,7 +64,7 @@ c c\Routines called: c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c zmout ARPACK utility routine that prints matrices c zvout ARPACK utility routine that prints vectors. c dvout ARPACK utility routine that prints vectors. @@ -74,18 +74,18 @@ c zlaset LAPACK matrix initialization routine. c ztrevc LAPACK routine to compute the eigenvectors of a matrix c in upper triangular form -c zcopy Level 1 BLAS that copies one vector to another. +c zcopy Level 1 BLAS that copies one vector to another. c zdscal Level 1 BLAS that scales a complex vector by a real number. c dznrm2 Level 1 BLAS that computes the norm of a vector. -c +c c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c\SCCS Information: @(#) c FILE: neigh.F SID: 2.2 DATE OF SID: 4/20/96 RELEASE: 2 @@ -97,52 +97,52 @@ c c----------------------------------------------------------------------- c - subroutine zneigh (rnorm, n, h, ldh, ritz, bounds, + subroutine zneigh (rnorm, n, h, ldh, ritz, bounds, & q, ldq, workl, rwork, ierr) c c %----------------------------------------------------% c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | c %------------------% c integer ierr, n, ldh, ldq - Double precision + Double precision & rnorm c c %-----------------% c | Array Arguments | c %-----------------% c - Complex*16 + Complex*16 & bounds(n), h(ldh,n), q(ldq,n), ritz(n), - & workl(n*(n+3)) - Double precision + & workl(n*(n+3)) + Double precision & rwork(n) -c +c c %------------% c | Parameters | c %------------% c - Complex*16 + Complex*16 & one, zero Double precision & rone parameter (one = (1.0D+0, 0.0D+0), zero = (0.0D+0, 0.0D+0), & rone = 1.0D+0) -c +c c %------------------------% c | Local Scalars & Arrays | c %------------------------% c logical select(1) integer j, msglvl - Complex*16 + Complex*16 & vl(1) Double precision & temp @@ -151,14 +151,14 @@ subroutine zneigh (rnorm, n, h, ldh, ritz, bounds, c | External Subroutines | c %----------------------% c - external zlacpy, zlahqr, ztrevc, zcopy, - & zdscal, zmout, zvout, second + external zlacpy, zlahqr, ztrevc, zcopy, + & zdscal, zmout, zvout, arscnd c c %--------------------% c | External Functions | c %--------------------% c - Double precision + Double precision & dznrm2 external dznrm2 c @@ -171,19 +171,19 @@ subroutine zneigh (rnorm, n, h, ldh, ritz, bounds, c | & message level for debugging | c %-------------------------------% c - call second (t0) + call arscnd (t0) msglvl = mceigh -c +c if (msglvl .gt. 2) then - call zmout (logfil, n, n, h, ldh, ndigit, + call zmout (logfil, n, n, h, ldh, ndigit, & '_neigh: Entering upper Hessenberg matrix H ') end if -c +c c %----------------------------------------------------------% c | 1. Compute the eigenvalues, the last components of the | c | corresponding Schur vectors and the full Schur form T | c | of the current upper Hessenberg matrix H. | -c | zlahqr returns the full Schur form of H | +c | zlahqr returns the full Schur form of H | c | in WORKL(1:N**2), and the Schur vectors in q. | c %----------------------------------------------------------% c @@ -205,7 +205,7 @@ subroutine zneigh (rnorm, n, h, ldh, ritz, bounds, c | eigenvectors. | c %----------------------------------------------------------% c - call ztrevc ('Right', 'Back', select, n, workl, n, vl, n, q, + call ztrevc ('Right', 'Back', select, n, workl, n, vl, n, q, & ldq, n, n, workl(n*n+1), rwork, ierr) c if (ierr .ne. 0) go to 9000 @@ -244,7 +244,7 @@ subroutine zneigh (rnorm, n, h, ldh, ritz, bounds, & '_neigh: Ritz estimates for the eigenvalues of H') end if c - call second(t1) + call arscnd(t1) tceigh = tceigh + (t1 - t0) c 9000 continue diff --git a/Toolbox/arpack-src/zneupd.f b/Toolbox/arpack-src/zneupd.f index da8e3614b..92e7dc998 100644 --- a/Toolbox/arpack-src/zneupd.f +++ b/Toolbox/arpack-src/zneupd.f @@ -1,48 +1,48 @@ c\BeginDoc -c -c\Name: zneupd -c -c\Description: -c This subroutine returns the converged approximations to eigenvalues -c of A*z = lambda*B*z and (optionally): -c -c (1) The corresponding approximate eigenvectors; -c -c (2) An orthonormal basis for the associated approximate -c invariant subspace; -c -c (3) Both. -c -c There is negligible additional cost to obtain eigenvectors. An orthonormal +c +c\Name: zneupd +c +c\Description: +c This subroutine returns the converged approximations to eigenvalues +c of A*z = lambda*B*z and (optionally): +c +c (1) The corresponding approximate eigenvectors; +c +c (2) An orthonormal basis for the associated approximate +c invariant subspace; +c +c (3) Both. +c +c There is negligible additional cost to obtain eigenvectors. An orthonormal c basis is always computed. There is an additional storage cost of n*nev -c if both are requested (in this case a separate array Z must be supplied). +c if both are requested (in this case a separate array Z must be supplied). c c The approximate eigenvalues and eigenvectors of A*z = lambda*B*z c are derived from approximate eigenvalues and eigenvectors of c of the linear operator OP prescribed by the MODE selection in the c call to ZNAUPD. ZNAUPD must be called before this routine is called. c These approximate eigenvalues and vectors are commonly called Ritz -c values and Ritz vectors respectively. They are referred to as such -c in the comments that follow. The computed orthonormal basis for the -c invariant subspace corresponding to these Ritz values is referred to as a -c Schur basis. -c +c values and Ritz vectors respectively. They are referred to as such +c in the comments that follow. The computed orthonormal basis for the +c invariant subspace corresponding to these Ritz values is referred to as a +c Schur basis. +c c The definition of OP as well as other terms and the relation of computed c Ritz values and vectors of OP with respect to the given problem -c A*z = lambda*B*z may be found in the header of ZNAUPD. For a brief +c A*z = lambda*B*z may be found in the header of ZNAUPD. For a brief c description, see definitions of IPARAM(7), MODE and WHICH in the c documentation of ZNAUPD. c c\Usage: -c call zneupd -c ( RVEC, HOWMNY, SELECT, D, Z, LDZ, SIGMA, WORKEV, BMAT, -c N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, +c call zneupd +c ( RVEC, HOWMNY, SELECT, D, Z, LDZ, SIGMA, WORKEV, BMAT, +c N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, WORKD, c WORKL, LWORKL, RWORK, INFO ) c c\Arguments: c RVEC LOGICAL (INPUT) c Specifies whether a basis for the invariant subspace corresponding -c to the converged Ritz value approximations for the eigenproblem +c to the converged Ritz value approximations for the eigenproblem c A*z = lambda*B*z is computed. c c RVEC = .FALSE. Compute Ritz values only. @@ -51,7 +51,7 @@ c See Remarks below. c c HOWMNY Character*1 (INPUT) -c Specifies the form of the basis for the invariant subspace +c Specifies the form of the basis for the invariant subspace c corresponding to the converged Ritz values that is to be computed. c c = 'A': Compute NEV Ritz vectors; @@ -62,34 +62,34 @@ c SELECT Logical array of dimension NCV. (INPUT) c If HOWMNY = 'S', SELECT specifies the Ritz vectors to be c computed. To select the Ritz vector corresponding to a -c Ritz value D(j), SELECT(j) must be set to .TRUE.. -c If HOWMNY = 'A' or 'P', SELECT need not be initialized +c Ritz value D(j), SELECT(j) must be set to .TRUE.. +c If HOWMNY = 'A' or 'P', SELECT need not be initialized c but it is used as internal workspace. c c D Complex*16 array of dimension NEV+1. (OUTPUT) -c On exit, D contains the Ritz approximations +c On exit, D contains the Ritz approximations c to the eigenvalues lambda for A*z = lambda*B*z. c c Z Complex*16 N by NEV array (OUTPUT) -c On exit, if RVEC = .TRUE. and HOWMNY = 'A', then the columns of -c Z represents approximate eigenvectors (Ritz vectors) corresponding +c On exit, if RVEC = .TRUE. and HOWMNY = 'A', then the columns of +c Z represents approximate eigenvectors (Ritz vectors) corresponding c to the NCONV=IPARAM(5) Ritz values for eigensystem c A*z = lambda*B*z. c c If RVEC = .FALSE. or HOWMNY = 'P', then Z is NOT REFERENCED. c -c NOTE: If if RVEC = .TRUE. and a Schur basis is not required, -c the array Z may be set equal to first NEV+1 columns of the Arnoldi -c basis array V computed by ZNAUPD. In this case the Arnoldi basis +c NOTE: If if RVEC = .TRUE. and a Schur basis is not required, +c the array Z may be set equal to first NEV+1 columns of the Arnoldi +c basis array V computed by ZNAUPD. In this case the Arnoldi basis c will be destroyed and overwritten with the eigenvector basis. c c LDZ Integer. (INPUT) c The leading dimension of the array Z. If Ritz vectors are -c desired, then LDZ .ge. max( 1, N ) is required. +c desired, then LDZ .ge. max( 1, N ) is required. c In any case, LDZ .ge. 1 is required. c c SIGMA Complex*16 (INPUT) -c If IPARAM(7) = 3 then SIGMA represents the shift. +c If IPARAM(7) = 3 then SIGMA represents the shift. c Not referenced if IPARAM(7) = 1 or 2. c c WORKEV Complex*16 work array of dimension 2*NCV. (WORKSPACE) @@ -97,12 +97,12 @@ c **** The remaining arguments MUST be the same as for the **** c **** call to ZNAUPD that was just completed. **** c -c NOTE: The remaining arguments +c NOTE: The remaining arguments c -c BMAT, N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, -c WORKD, WORKL, LWORKL, RWORK, INFO +c BMAT, N, WHICH, NEV, TOL, RESID, NCV, V, LDV, IPARAM, IPNTR, +c WORKD, WORKL, LWORKL, RWORK, INFO c -c must be passed directly to ZNEUPD following the last call +c must be passed directly to ZNEUPD following the last call c to ZNAUPD. These arguments MUST NOT BE MODIFIED between c the the last call to ZNAUPD and the call to ZNEUPD. c @@ -128,7 +128,7 @@ c WORKL(1:ncv*ncv+2*ncv) contains information obtained in c znaupd. They are not changed by zneupd. c WORKL(ncv*ncv+2*ncv+1:3*ncv*ncv+4*ncv) holds the -c untransformed Ritz values, the untransformed error estimates of +c untransformed Ritz values, the untransformed error estimates of c the Ritz values, the upper triangular matrix for H, and the c associated matrix representation of the invariant subspace for H. c @@ -187,18 +187,18 @@ c 1. D.C. Sorensen, "Implicit Application of Polynomial Filters in c a k-Step Arnoldi Method", SIAM J. Matr. Anal. Apps., 13 (1992), c pp 357-385. -c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly +c 2. R.B. Lehoucq, "Analysis and Implementation of an Implicitly c Restarted Arnoldi Iteration", Rice University Technical Report c TR95-13, Department of Computational and Applied Mathematics. c 3. B. Nour-Omid, B. N. Parlett, T. Ericsson and P. S. Jensen, c "How to Implement the Spectral Transformation", Math Comp., -c Vol. 48, No. 178, April, 1987 pp. 664-673. +c Vol. 48, No. 178, April, 1987 pp. 664-673. c c\Routines called: c ivout ARPACK utility routine that prints integers. c zmout ARPACK utility routine that prints matrices c zvout ARPACK utility routine that prints vectors. -c zgeqr2 LAPACK routine that computes the QR factorization of +c zgeqr2 LAPACK routine that computes the QR factorization of c a matrix. c zlacpy LAPACK matrix copy routine. c zlahqr LAPACK routine that computes the Schur form of a @@ -207,7 +207,7 @@ c ztrevc LAPACK routine to compute the eigenvectors of a matrix c in upper triangular form. c ztrsen LAPACK routine that re-orders the Schur form. -c zunm2r LAPACK routine that applies an orthogonal matrix in +c zunm2r LAPACK routine that applies an orthogonal matrix in c factored form. c dlamch LAPACK routine that determines machine constants. c ztrmm Level 3 BLAS matrix times an upper triangular matrix. @@ -219,7 +219,7 @@ c c\Remarks c -c 1. Currently only HOWMNY = 'A' and 'P' are implemented. +c 1. Currently only HOWMNY = 'A' and 'P' are implemented. c c 2. Schur vectors are an orthogonal representation for the basis of c Ritz vectors. Thus, their numerical properties are often superior. @@ -227,16 +227,16 @@ c A * V(:,1:IPARAM(5)) = V(:,1:IPARAM(5)) * T, and c transpose( V(:,1:IPARAM(5)) ) * V(:,1:IPARAM(5)) = I c are approximately satisfied. -c Here T is the leading submatrix of order IPARAM(5) of the -c upper triangular matrix stored workl(ipntr(12)). +c Here T is the leading submatrix of order IPARAM(5) of the +c upper triangular matrix stored workl(ipntr(12)). c c\Authors c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University -c Chao Yang Houston, Texas -c Dept. of Computational & -c Applied Mathematics -c Rice University +c Chao Yang Houston, Texas +c Dept. of Computational & +c Applied Mathematics +c Rice University c Houston, Texas c c\SCCS Information: @(#) @@ -256,8 +256,8 @@ subroutine zneupd(rvec , howmny, select, d , c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -266,9 +266,9 @@ subroutine zneupd(rvec , howmny, select, d , character bmat, howmny, which*2 logical rvec integer info, ldz, ldv, lworkl, n, ncv, nev - Complex*16 + Complex*16 & sigma - Double precision + Double precision & tol c c %-----------------% @@ -281,7 +281,7 @@ subroutine zneupd(rvec , howmny, select, d , & rwork(ncv) Complex*16 & d(nev) , resid(n) , v(ldv,ncv), - & z(ldz, nev), + & z(ldz, nev), & workd(3*n) , workl(lworkl), workev(2*ncv) c c %------------% @@ -301,7 +301,7 @@ subroutine zneupd(rvec , howmny, select, d , & invsub, iuptri, iwev , j , ldh , ldq , & mode , msglvl, ritz , wr , k , irz , & ibd , outncv, iq , np , numcnv, jj , - & ishift + & ishift, nconv2 Complex*16 & rnorm, temp, vl(1) Double precision @@ -315,7 +315,7 @@ subroutine zneupd(rvec , howmny, select, d , external zcopy , zgeru, zgeqr2, zlacpy, zmout, & zunm2r, ztrmm, zvout, ivout, & zlahqr -c +c c %--------------------% c | External Functions | c %--------------------% @@ -325,13 +325,13 @@ subroutine zneupd(rvec , howmny, select, d , external dznrm2, dlamch, dlapy2 c Complex*16 - & zdotc - external zdotc + & zzdotc + external zzdotc c c %-----------------------% c | Executable Statements | c %-----------------------% -c +c c %------------------------% c | Set default parameters | c %------------------------% @@ -362,7 +362,7 @@ subroutine zneupd(rvec , howmny, select, d , ierr = -1 else if (nev .le. 0) then ierr = -2 - else if (ncv .le. nev .or. ncv .gt. n) then + else if (ncv .le. nev+1 .or. ncv .gt. n) then ierr = -3 else if (which .ne. 'LM' .and. & which .ne. 'SM' .and. @@ -382,12 +382,12 @@ subroutine zneupd(rvec , howmny, select, d , else if (howmny .eq. 'S' ) then ierr = -12 end if -c +c if (mode .eq. 1 .or. mode .eq. 2) then type = 'REGULR' else if (mode .eq. 3 ) then type = 'SHIFTI' - else + else ierr = -10 end if if (mode .eq. 1 .and. bmat .eq. 'G') ierr = -11 @@ -400,7 +400,7 @@ subroutine zneupd(rvec , howmny, select, d , info = ierr go to 9000 end if -c +c c %--------------------------------------------------------% c | Pointer into WORKL for address of H, RITZ, WORKEV, Q | c | etc... and the remaining workspace. | @@ -428,7 +428,7 @@ subroutine zneupd(rvec , howmny, select, d , c | subspace for H. | c | GRAND total of NCV * ( 3 * NCV + 4 ) locations. | c %-----------------------------------------------------------% -c +c ih = ipntr(5) ritz = ipntr(6) iq = ipntr(7) @@ -516,15 +516,15 @@ subroutine zneupd(rvec , howmny, select, d , do 11 j = 1,ncv rtemp = max(eps23, & dlapy2 ( dble(workl(irz+ncv-j)), - & dimag(workl(irz+ncv-j)) )) + & aimag(workl(irz+ncv-j)) )) jj = workl(bounds + ncv - j) if (numcnv .lt. nconv .and. & dlapy2( dble(workl(ibd+jj-1)), - & dimag(workl(ibd+jj-1)) ) + & aimag(workl(ibd+jj-1)) ) & .le. tol*rtemp) then select(jj) = .true. numcnv = numcnv + 1 - if (jj .gt. nev) reord = .true. + if (jj .gt. nconv) reord = .true. endif 11 continue c @@ -536,9 +536,9 @@ subroutine zneupd(rvec , howmny, select, d , c %-----------------------------------------------------------% c if (msglvl .gt. 2) then - call ivout(logfil, 1, numcnv, ndigit, + call ivout(logfil, 1, [numcnv], ndigit, & '_neupd: Number of specified eigenvalues') - call ivout(logfil, 1, nconv, ndigit, + call ivout(logfil, 1, [nconv], ndigit, & '_neupd: Number of "converged" eigenvalues') end if c @@ -555,10 +555,10 @@ subroutine zneupd(rvec , howmny, select, d , c %-------------------------------------------------------% c call zcopy(ldh*ncv, workl(ih), 1, workl(iuptri), 1) - call zlaset('All', ncv, ncv , + call zlaset('All', ncv, ncv , & zero , one, workl(invsub), & ldq) - call zlahqr(.true., .true. , ncv , + call zlahqr(.true., .true. , ncv , & 1 , ncv , workl(iuptri), & ldh , workl(iheig) , 1 , & ncv , workl(invsub), ldq , @@ -577,7 +577,7 @@ subroutine zneupd(rvec , howmny, select, d , call zvout (logfil, ncv, workl(ihbds), ndigit, & '_neupd: Last row of the Schur vector matrix') if (msglvl .gt. 3) then - call zmout (logfil , ncv, ncv , + call zmout (logfil , ncv, ncv , & workl(iuptri), ldh, ndigit, & '_neupd: The upper triangular matrix ') end if @@ -592,9 +592,13 @@ subroutine zneupd(rvec , howmny, select, d , call ztrsen('None' , 'V' , select , & ncv , workl(iuptri), ldh , & workl(invsub), ldq , workl(iheig), - & nconv , conds , sep , + & nconv2 , conds , sep , & workev , ncv , ierr) c + if (nconv2 .lt. nconv) then + nconv = nconv2 + end if + if (ierr .eq. 1) then info = 1 go to 9000 @@ -621,7 +625,7 @@ subroutine zneupd(rvec , howmny, select, d , c call zcopy(ncv , workl(invsub+ncv-1), ldq, & workl(ihbds), 1) -c +c c %--------------------------------------------% c | Place the computed eigenvalues of H into D | c | if a spectral transformation was not used. | @@ -647,7 +651,7 @@ subroutine zneupd(rvec , howmny, select, d , c | * Postmultiply Z by R. | c | The N by NCONV matrix Z is now a matrix representation | c | of the approximate invariant subspace associated with | -c | the Ritz values in workl(iheig). The first NCONV | +c | the Ritz values in workl(iheig). The first NCONV | c | columns of V are now approximate Schur vectors | c | associated with the upper triangular matrix of order | c | NCONV in workl(iuptri). | @@ -670,7 +674,7 @@ subroutine zneupd(rvec , howmny, select, d , c | matrix consisting of plus or minus ones. | c %---------------------------------------------------% c - if ( dble( workl(invsub+(j-1)*ldq+j-1) ) .lt. + if ( dble( workl(invsub+(j-1)*ldq+j-1) ) .lt. & dble(zero) ) then call zscal(nconv, -one, workl(iuptri+j-1), ldq) call zscal(nconv, -one, workl(iuptri+(j-1)*ldq), 1) @@ -726,8 +730,8 @@ subroutine zneupd(rvec , howmny, select, d , c | upper triangular, thus the length of the | c | inner product can be set to j. | c %------------------------------------------% -c - workev(j) = zdotc(j, workl(ihbds), 1, +c + workev(j) = zzdotc(j, workl(ihbds), 1, & workl(invsub+(j-1)*ldq), 1) 40 continue c @@ -746,7 +750,7 @@ subroutine zneupd(rvec , howmny, select, d , c %---------------------------------------% c | Copy Ritz estimates into workl(ihbds) | c %---------------------------------------% -c +c call zcopy(nconv, workev, 1, workl(ihbds), 1) c c %----------------------------------------------% @@ -758,7 +762,7 @@ subroutine zneupd(rvec , howmny, select, d , & 'Non-unit', n , nconv , & one , workl(invsub), ldq , & z , ldz) - end if + end if c else c @@ -781,25 +785,25 @@ subroutine zneupd(rvec , howmny, select, d , c if (type .eq. 'REGULR') then c - if (rvec) + if (rvec) & call zscal(ncv, rnorm, workl(ihbds), 1) -c +c else -c +c c %---------------------------------------% c | A spectral transformation was used. | c | * Determine the Ritz estimates of the | c | Ritz values in the original system. | c %---------------------------------------% c - if (rvec) + if (rvec) & call zscal(ncv, rnorm, workl(ihbds), 1) -c +c do 50 k=1, ncv temp = workl(iheig+k-1) workl(ihbds+k-1) = workl(ihbds+k-1) / temp / temp 50 continue -c +c end if c c %-----------------------------------------------------------% @@ -809,7 +813,7 @@ subroutine zneupd(rvec , howmny, select, d , c | NOTES: | c | *The Ritz vectors are not affected by the transformation. | c %-----------------------------------------------------------% -c +c if (type .eq. 'SHIFTI') then do 60 k=1, nconv d(k) = one / workl(iheig+k-1) + sigma @@ -864,7 +868,7 @@ subroutine zneupd(rvec , howmny, select, d , 9000 continue c return -c +c c %---------------% c | End of zneupd| c %---------------% diff --git a/Toolbox/arpack-src/zngets.f b/Toolbox/arpack-src/zngets.f index 903eacb85..e7d243349 100644 --- a/Toolbox/arpack-src/zngets.f +++ b/Toolbox/arpack-src/zngets.f @@ -2,9 +2,9 @@ c c\Name: zngets c -c\Description: +c\Description: c Given the eigenvalues of the upper Hessenberg matrix H, -c computes the NP shifts AMU that are zeros of the polynomial of +c computes the NP shifts AMU that are zeros of the polynomial of c degree NP which filters out components of the unwanted eigenvectors c corresponding to the AMU's based on some given criteria. c @@ -40,8 +40,8 @@ c On INPUT, RITZ contains the the eigenvalues of H. c On OUTPUT, RITZ are sorted so that the unwanted c eigenvalues are in the first NP locations and the wanted -c portion is in the last KEV locations. When exact shifts are -c selected, the unwanted part corresponds to the shifts to +c portion is in the last KEV locations. When exact shifts are +c selected, the unwanted part corresponds to the shifts to c be applied. Also, if ISHIFT .eq. 1, the unwanted eigenvalues c are further sorted so that the ones with largest Ritz values c are first. @@ -49,7 +49,7 @@ c BOUNDS Complex*16 array of length KEV+NP. (INPUT/OUTPUT) c Error bounds corresponding to the ordering in RITZ. c -c +c c c\EndDoc c @@ -63,16 +63,16 @@ c\Routines called: c zsortc ARPACK sorting routine. c ivout ARPACK utility routine that prints integers. -c second ARPACK utility routine for timing. +c arscnd ARPACK utility routine for timing. c zvout ARPACK utility routine that prints vectors. c c\Author c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c\SCCS Information: @(#) c FILE: ngets.F SID: 2.2 DATE OF SID: 4/20/96 RELEASE: 2 @@ -91,8 +91,8 @@ subroutine zngets ( ishift, which, kev, np, ritz, bounds) c | Include files for debugging and timing information | c %----------------------------------------------------% c - include 'debug.fi' - include 'stat.fi' + include 'debug.h' + include 'stat.h' c c %------------------% c | Scalar Arguments | @@ -126,7 +126,7 @@ subroutine zngets ( ishift, which, kev, np, ritz, bounds) c | External Subroutines | c %----------------------% c - external zvout, zsortc, second + external zvout, zsortc, arscnd c c %-----------------------% c | Executable Statements | @@ -136,14 +136,14 @@ subroutine zngets ( ishift, which, kev, np, ritz, bounds) c | Initialize timing statistics | c | & message level for debugging | c %-------------------------------% -c - call second (t0) +c + call arscnd (t0) msglvl = mcgets -c +c call zsortc (which, .true., kev+np, ritz, bounds) -c +c if ( ishift .eq. 1 ) then -c +c c %-------------------------------------------------------% c | Sort the unwanted Ritz values used as shifts so that | c | the ones with largest Ritz estimates are first | @@ -152,27 +152,27 @@ subroutine zngets ( ishift, which, kev, np, ritz, bounds) c | are applied in subroutine znapps. | c | Be careful and use 'SM' since we want to sort BOUNDS! | c %-------------------------------------------------------% -c +c call zsortc ( 'SM', .true., np, bounds, ritz ) c end if -c - call second (t1) +c + call arscnd (t1) tcgets = tcgets + (t1 - t0) c if (msglvl .gt. 0) then - call ivout (logfil, 1, kev, ndigit, '_ngets: KEV is') - call ivout (logfil, 1, np, ndigit, '_ngets: NP is') + call ivout (logfil, 1, [kev], ndigit, '_ngets: KEV is') + call ivout (logfil, 1, [np], ndigit, '_ngets: NP is') call zvout (logfil, kev+np, ritz, ndigit, & '_ngets: Eigenvalues of current H matrix ') - call zvout (logfil, kev+np, bounds, ndigit, + call zvout (logfil, kev+np, bounds, ndigit, & '_ngets: Ritz estimates of the current KEV+NP Ritz values') end if -c +c return -c +c c %---------------% c | End of zngets | c %---------------% -c +c end diff --git a/Toolbox/arpack-src/zsortc.f b/Toolbox/arpack-src/zsortc.f index 7dc688a06..6ea37a42f 100644 --- a/Toolbox/arpack-src/zsortc.f +++ b/Toolbox/arpack-src/zsortc.f @@ -3,9 +3,9 @@ c\Name: zsortc c c\Description: -c Sorts the Complex*16 array in X into the order +c Sorts the Complex*16 array in X into the order c specified by WHICH and optionally applies the permutation to the -c Double precision array Y. +c Double precision array Y. c c\Usage: c call zsortc @@ -15,7 +15,7 @@ c WHICH Character*2. (Input) c 'LM' -> sort X into increasing order of magnitude. c 'SM' -> sort X into decreasing order of magnitude. -c 'LR' -> sort X with real(X) in increasing algebraic order +c 'LR' -> sort X with real(X) in increasing algebraic order c 'SR' -> sort X with real(X) in decreasing algebraic order c 'LI' -> sort X with imag(X) in increasing algebraic order c 'SI' -> sort X with imag(X) in decreasing algebraic order @@ -45,9 +45,9 @@ c Danny Sorensen Phuong Vu c Richard Lehoucq CRPC / Rice University c Dept. of Computational & Houston, Texas -c Applied Mathematics -c Rice University -c Houston, Texas +c Applied Mathematics +c Rice University +c Houston, Texas c c Adapted from the sort routine in LANSO. c @@ -72,7 +72,7 @@ subroutine zsortc (which, apply, n, x, y) c | Array Arguments | c %-----------------% c - Complex*16 + Complex*16 & x(0:n-1), y(0:n-1) c c %---------------% @@ -80,9 +80,9 @@ subroutine zsortc (which, apply, n, x, y) c %---------------% c integer i, igap, j - Complex*16 + Complex*16 & temp - Double precision + Double precision & temp1, temp2 c c %--------------------% @@ -96,14 +96,14 @@ subroutine zsortc (which, apply, n, x, y) c | Intrinsic Functions | c %--------------------% Intrinsic - & dble, dimag + & dble, aimag c c %-----------------------% c | Executable Statements | c %-----------------------% c igap = n / 2 -c +c if (which .eq. 'LM') then c c %--------------------------------------------% @@ -119,8 +119,8 @@ subroutine zsortc (which, apply, n, x, y) c if (j.lt.0) go to 30 c - temp1 = dlapy2(dble(x(j)),dimag(x(j))) - temp2 = dlapy2(dble(x(j+igap)),dimag(x(j+igap))) + temp1 = dlapy2(dble(x(j)),aimag(x(j))) + temp2 = dlapy2(dble(x(j+igap)),aimag(x(j+igap))) c if (temp1.gt.temp2) then temp = x(j) @@ -156,14 +156,14 @@ subroutine zsortc (which, apply, n, x, y) c if (j .lt. 0) go to 60 c - temp1 = dlapy2(dble(x(j)),dimag(x(j))) - temp2 = dlapy2(dble(x(j+igap)),dimag(x(j+igap))) + temp1 = dlapy2(dble(x(j)),aimag(x(j))) + temp2 = dlapy2(dble(x(j+igap)),aimag(x(j+igap))) c if (temp1.lt.temp2) then temp = x(j) x(j) = x(j+igap) x(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -177,7 +177,7 @@ subroutine zsortc (which, apply, n, x, y) 60 continue igap = igap / 2 go to 40 -c +c else if (which .eq. 'LR') then c c %------------------------------------------------% @@ -197,7 +197,7 @@ subroutine zsortc (which, apply, n, x, y) temp = x(j) x(j) = x(j+igap) x(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -211,7 +211,7 @@ subroutine zsortc (which, apply, n, x, y) 90 continue igap = igap / 2 go to 70 -c +c else if (which .eq. 'SR') then c c %------------------------------------------------% @@ -230,7 +230,7 @@ subroutine zsortc (which, apply, n, x, y) temp = x(j) x(j) = x(j+igap) x(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -244,7 +244,7 @@ subroutine zsortc (which, apply, n, x, y) 120 continue igap = igap / 2 go to 100 -c +c else if (which .eq. 'LI') then c c %--------------------------------------------% @@ -259,7 +259,7 @@ subroutine zsortc (which, apply, n, x, y) c if (j.lt.0) go to 150 c - if (dimag(x(j)).gt.dimag(x(j+igap))) then + if (aimag(x(j)).gt.aimag(x(j+igap))) then temp = x(j) x(j) = x(j+igap) x(j+igap) = temp @@ -277,7 +277,7 @@ subroutine zsortc (which, apply, n, x, y) 150 continue igap = igap / 2 go to 130 -c +c else if (which .eq. 'SI') then c c %---------------------------------------------% @@ -292,11 +292,11 @@ subroutine zsortc (which, apply, n, x, y) c if (j.lt.0) go to 180 c - if (dimag(x(j)).lt.dimag(x(j+igap))) then + if (aimag(x(j)).lt.aimag(x(j+igap))) then temp = x(j) x(j) = x(j+igap) x(j+igap) = temp -c +c if (apply) then temp = y(j) y(j) = y(j+igap) @@ -311,7 +311,7 @@ subroutine zsortc (which, apply, n, x, y) igap = igap / 2 go to 160 end if -c +c 9000 continue return c diff --git a/Toolbox/arpack-src/zstatn.f b/Toolbox/arpack-src/zstatn.f index 7766b33f4..ddc5240f3 100644 --- a/Toolbox/arpack-src/zstatn.f +++ b/Toolbox/arpack-src/zstatn.f @@ -13,8 +13,8 @@ subroutine zstatn c | See stat.doc for documentation | c %--------------------------------% c - include 'stat.fi' - + include 'stat.h' + c %-----------------------% c | Executable Statements | c %-----------------------% @@ -24,7 +24,7 @@ subroutine zstatn nrorth = 0 nitref = 0 nrstrt = 0 - + tcaupd = 0.0D+0 tcaup2 = 0.0D+0 tcaitr = 0.0D+0 @@ -35,13 +35,13 @@ subroutine zstatn titref = 0.0D+0 tgetv0 = 0.0D+0 trvec = 0.0D+0 - + c %----------------------------------------------------% c | User time including reverse communication overhead | c %----------------------------------------------------% tmvopx = 0.0D+0 tmvbx = 0.0D+0 - + return c c %---------------% diff --git a/Toolbox/arpack-src/zvout.f b/Toolbox/arpack-src/zvout.f index ac7e6f9fc..8c42eb890 100644 --- a/Toolbox/arpack-src/zvout.f +++ b/Toolbox/arpack-src/zvout.f @@ -63,21 +63,21 @@ SUBROUTINE ZVOUT( LOUT, N, CX, IDIGIT, IFMT ) DO 30 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) IF (K1.NE.N) THEN - WRITE( LOUT, 9998 )K1, K2, ( CX( I ), + WRITE( LOUT, 9998 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE - WRITE( LOUT, 9997 )K1, K2, ( CX( I ), - $ I = K1, K2 ) + WRITE( LOUT, 9997 )K1, K2, ( CX( I ), + $ I = K1, K2 ) END IF 30 CONTINUE ELSE IF( NDIGIT.LE.6 ) THEN DO 40 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) IF (K1.NE.N) THEN - WRITE( LOUT, 9988 )K1, K2, ( CX( I ), + WRITE( LOUT, 9988 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE - WRITE( LOUT, 9987 )K1, K2, ( CX( I ), + WRITE( LOUT, 9987 )K1, K2, ( CX( I ), $ I = K1, K2 ) END IF 40 CONTINUE @@ -85,11 +85,11 @@ SUBROUTINE ZVOUT( LOUT, N, CX, IDIGIT, IFMT ) DO 50 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) IF (K1.NE.N) THEN - WRITE( LOUT, 9978 )K1, K2, ( CX( I ), + WRITE( LOUT, 9978 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE - WRITE( LOUT, 9977 )K1, K2, ( CX( I ), - $ I = K1, K2 ) + WRITE( LOUT, 9977 )K1, K2, ( CX( I ), + $ I = K1, K2 ) END IF 50 CONTINUE ELSE @@ -104,47 +104,47 @@ SUBROUTINE ZVOUT( LOUT, N, CX, IDIGIT, IFMT ) * ELSE IF( NDIGIT.LE.4 ) THEN - DO 70 K1 = 1, N, 4 + DO 70 K1 = 1, N, 4 K2 = MIN0( N, K1+3 ) IF ((K1+3).LE.N) THEN - WRITE( LOUT, 9958 )K1, K2, ( CX( I ), + WRITE( LOUT, 9958 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+3-N) .EQ. 1) THEN - WRITE( LOUT, 9957 )K1, K2, ( CX( I ), + WRITE( LOUT, 9957 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+3-N) .EQ. 2) THEN - WRITE( LOUT, 9956 )K1, K2, ( CX( I ), + WRITE( LOUT, 9956 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+3-N) .EQ. 1) THEN - WRITE( LOUT, 9955 )K1, K2, ( CX( I ), + WRITE( LOUT, 9955 )K1, K2, ( CX( I ), $ I = K1, K2 ) END IF 70 CONTINUE ELSE IF( NDIGIT.LE.6 ) THEN - DO 80 K1 = 1, N, 3 + DO 80 K1 = 1, N, 3 K2 = MIN0( N, K1+2 ) IF ((K1+2).LE.N) THEN - WRITE( LOUT, 9948 )K1, K2, ( CX( I ), + WRITE( LOUT, 9948 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+2-N) .EQ. 1) THEN - WRITE( LOUT, 9947 )K1, K2, ( CX( I ), + WRITE( LOUT, 9947 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+2-N) .EQ. 2) THEN - WRITE( LOUT, 9946 )K1, K2, ( CX( I ), + WRITE( LOUT, 9946 )K1, K2, ( CX( I ), $ I = K1, K2 ) END IF 80 CONTINUE ELSE IF( NDIGIT.LE.8 ) THEN - DO 90 K1 = 1, N, 3 + DO 90 K1 = 1, N, 3 K2 = MIN0( N, K1+2 ) IF ((K1+2).LE.N) THEN - WRITE( LOUT, 9938 )K1, K2, ( CX( I ), + WRITE( LOUT, 9938 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+2-N) .EQ. 1) THEN - WRITE( LOUT, 9937 )K1, K2, ( CX( I ), + WRITE( LOUT, 9937 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+2-N) .EQ. 2) THEN - WRITE( LOUT, 9936 )K1, K2, ( CX( I ), + WRITE( LOUT, 9936 )K1, K2, ( CX( I ), $ I = K1, K2 ) END IF 90 CONTINUE @@ -152,10 +152,10 @@ SUBROUTINE ZVOUT( LOUT, N, CX, IDIGIT, IFMT ) DO 100 K1 = 1, N, 2 K2 = MIN0( N, K1+1 ) IF ((K1+2).LE.N) THEN - WRITE( LOUT, 9928 )K1, K2, ( CX( I ), + WRITE( LOUT, 9928 )K1, K2, ( CX( I ), $ I = K1, K2 ) ELSE IF ((K1+2-N) .EQ. 1) THEN - WRITE( LOUT, 9927 )K1, K2, ( CX( I ), + WRITE( LOUT, 9927 )K1, K2, ( CX( I ), $ I = K1, K2 ) END IF 100 CONTINUE @@ -171,12 +171,12 @@ SUBROUTINE ZVOUT( LOUT, N, CX, IDIGIT, IFMT ) * DISPLAY 4 SIGNIFICANT DIGITS * 9998 FORMAT( 1X, I4, ' - ', I4, ':', 1X, - $ 1P,2('(',D10.3,',',D10.3,') ') ) + $ 1P,2('(',D10.3,',',D10.3,') ') ) 9997 FORMAT( 1X, I4, ' - ', I4, ':', 1X, $ 1P,1('(',D10.3,',',D10.3,') ') ) * * DISPLAY 6 SIGNIFICANT DIGITS -* +* 9988 FORMAT( 1X, I4, ' - ', I4, ':', 1X, $ 1P,2('(',D12.5,',',D12.5,') ') ) 9987 FORMAT( 1X, I4, ' - ', I4, ':', 1X, @@ -192,7 +192,7 @@ SUBROUTINE ZVOUT( LOUT, N, CX, IDIGIT, IFMT ) * DISPLAY 13 SIGNIFICANT DIGITS * 9968 FORMAT( 1X, I4, ' - ', I4, ':', 1X, - $ 1P,1('(',D20.13,',',D20.13,') ') ) + $ 1P,1('(',D20.13,',',D20.13,') ') ) * *========================================================================= * FORMAT FOR 132 COLUMNS @@ -235,6 +235,6 @@ SUBROUTINE ZVOUT( LOUT, N, CX, IDIGIT, IFMT ) $ 1P,1('(',D20.13,',',D20.13,') ') ) * * -* +* 9994 FORMAT( 1X, ' ' ) END diff --git a/Toolbox/arpack-src/zzdotc.f b/Toolbox/arpack-src/zzdotc.f new file mode 100644 index 000000000..a98c34230 --- /dev/null +++ b/Toolbox/arpack-src/zzdotc.f @@ -0,0 +1,36 @@ + double complex function zzdotc(n,zx,incx,zy,incy) +c +c forms the dot product of a vector. +c jack dongarra, 3/11/78. +c modified 12/3/93, array(1) declarations changed to array(*) +c + double complex zx(*),zy(*),ztemp + integer i,incx,incy,ix,iy,n + ztemp = (0.0d0,0.0d0) + zzdotc = (0.0d0,0.0d0) + if(n.le.0)return + if(incx.eq.1.and.incy.eq.1)go to 20 +c +c code for unequal increments or equal increments +c not equal to 1 +c + ix = 1 + iy = 1 + if(incx.lt.0)ix = (-n+1)*incx + 1 + if(incy.lt.0)iy = (-n+1)*incy + 1 + do 10 i = 1,n + ztemp = ztemp + conjg(zx(ix))*zy(iy) + ix = ix + incx + iy = iy + incy + 10 continue + zzdotc = ztemp + return +c +c code for both increments equal to 1 +c + 20 do 30 i = 1,n + ztemp = ztemp + conjg(zx(i))*zy(i) + 30 continue + zzdotc = ztemp + return + end diff --git a/Toolbox/arpack_wrapper.cpp b/Toolbox/arpack_wrapper.cpp index 030d4079a..16667e75e 100644 --- a/Toolbox/arpack_wrapper.cpp +++ b/Toolbox/arpack_wrapper.cpp @@ -20,72 +20,6 @@ #include "arpack_wrapper.h" #include -int eig_solve(cx_vec& eigval, cx_mat& eigvec, const std::shared_ptr>& K, const unsigned num, const char* form) { - auto IDO = 0; - auto BMAT = 'I'; // standard eigenvalue problem A*x=lambda*x - auto N = static_cast(K->n_rows); - char WHICH[2]; - for(auto I = 0; I < 2; ++I) WHICH[I] = form[I]; - auto NEV = std::min(static_cast(num), N - 2); - auto TOL = 0.; - auto NCV = std::min(std::max(NEV + 2, 2 * NEV + 1), N); - auto LDV = N; - auto LWORKL = 3 * NCV * (NCV + 2); - auto INFO = 0; - - podarray IPARAM(11), IPNTR(14); - podarray RESID(N), V(N * uword(NCV)), WORKD(3llu * N), WORKL(LWORKL); - - IPARAM(0) = 1; // exact shift - IPARAM(2) = 1000; // maximum iteration - IPARAM(6) = 1; // mode 1: A*x=lambda*x - - while(IDO != 99) { - arma_fortran(arma_dnaupd)(&IDO, &BMAT, &N, WHICH, &NEV, &TOL, RESID.memptr(), &NCV, V.memptr(), &LDV, IPARAM.memptr(), IPNTR.memptr(), WORKD.memptr(), WORKL.memptr(), &LWORKL, &INFO); - if(IDO == 1 || IDO == -1) { - const vec X(WORKD.memptr() + IPNTR[0] - 1, N, false); - // ReSharper disable once CppInitializedValueIsAlwaysRewritten - // ReSharper disable once CppEntityAssignedButNoRead - vec Y(WORKD.memptr() + IPNTR[1] - 1, N, false); - Y = K * X; - } - } - - if(INFO != 0) return INFO; - - auto RVEC = 1; - auto HOWMNY = 'A'; - auto LDZ = N; - auto SIGMAR = 0.; - auto SIGMAI = 0.; - - podarray SELECT(NCV); - podarray DR(NEV + 1llu), DI(NEV + 1llu), Z(N * (NEV + 1llu)), WORKEV(3llu * NCV); - - arma_fortran(arma_dneupd)(&RVEC, &HOWMNY, SELECT.memptr(), DR.memptr(), DI.memptr(), Z.memptr(), &LDZ, &SIGMAR, &SIGMAI, WORKEV.memptr(), &BMAT, &N, WHICH, &NEV, &TOL, RESID.memptr(), &NCV, V.memptr(), &LDV, IPARAM.memptr(), IPNTR.memptr(), WORKD.memptr(), WORKL.memptr(), &LWORKL, &INFO); - - eigval.set_size(NEV); - eigvec.set_size(N, NEV); - - // get eigenvalues - for(uword I = 0; I < uword(NEV); ++I) eigval(I) = std::complex(DR(I), DI(I)); - - // get eigenvectors - for(uword I = 0; I < uword(NEV); ++I) { - if(I < NEV - 1llu && eigval[I] == std::conj(eigval[I + 1llu])) { - for(uword J = 0; J < uword(N); ++J) { - eigvec.at(J, I) = std::complex(Z[N * I + J], Z[N * I + N + J]); - eigvec.at(J, I + 1llu) = std::complex(Z[N * I + J], -Z[N * I + N + J]); - } - ++I; - } - else if(I == NEV - 1llu && std::complex(eigval[I]).imag() != 0.) for(auto J = 0; J < N; ++J) eigvec.at(J, I) = std::complex(Z[N * I + J], Z[N * I + N + J]); - else for(auto J = 0; J < N; ++J) eigvec.at(J, I) = std::complex(Z[N * I + J], 0.); - } - - return INFO; -} - int eig_solve(vec& eigval, mat& eigvec, const std::shared_ptr>& K, const std::shared_ptr>& M, const unsigned num, const char* form) { auto IDO = 0; auto BMAT = 'G'; // generalized eigenvalue problem A*x=lambda*M*x @@ -126,9 +60,13 @@ int eig_solve(vec& eigval, mat& eigvec, const std::shared_ptr>& const vec X(WORKD.memptr() + IPNTR[0] - 1, N, false); Y = K * X; } + else if(0 != INFO) break; } - if(0 != INFO) return INFO; + if(0 != INFO) { + suanpan_error("arpack solver returns %d.\n", INFO); + return SUANPAN_FAIL; + } suanpan_debug("Arnoldi iteration counter: %d.\n", IPARAM(2)); @@ -154,7 +92,7 @@ int eig_solve(cx_vec& eigval, cx_mat& eigvec, const std::shared_ptr(num), N - 2); auto TOL = 0.; - auto NCV = std::min(std::max(NEV + 2, 2 * NEV + 1), N); + auto NCV = std::min(std::max(NEV + 3, 2 * NEV + 1), N); auto LDV = N; auto LWORKL = 3 * NCV * (NCV + 2); auto INFO = 0; @@ -164,14 +102,12 @@ int eig_solve(cx_vec& eigval, cx_mat& eigvec, const std::shared_ptrsolve(X); - first_solve = false; - } - else Y = K->solve(X); + Y = K->solve(X); } else if(1 == IDO) { const vec X(WORKD.memptr() + IPNTR[2] - 1, N, false); @@ -193,147 +125,14 @@ int eig_solve(cx_vec& eigval, cx_mat& eigvec, const std::shared_ptr SELECT(NCV); - podarray DR(NEV + 1llu), DI(NEV + 1llu), Z(N * (NEV + 1llu)), WORKEV(3llu * NCV); - - arma_fortran(arma_dneupd)(&RVEC, &HOWMNY, SELECT.memptr(), DR.memptr(), DI.memptr(), Z.memptr(), &LDZ, &SIGMAR, &SIGMAI, WORKEV.memptr(), &BMAT, &N, WHICH, &NEV, &TOL, RESID.memptr(), &NCV, V.memptr(), &LDV, IPARAM.memptr(), IPNTR.memptr(), WORKD.memptr(), WORKL.memptr(), &LWORKL, &INFO); - - eigval.set_size(NEV); - eigvec.set_size(N, NEV); - - // get eigenvalues - for(uword I = 0; I < uword(NEV); ++I) eigval(I) = std::complex(DR(I), DI(I)); - - // get eigenvectors - for(uword I = 0; I < uword(NEV); ++I) { - if(I < NEV - 1llu && eigval[I] == std::conj(eigval[I + 1llu])) { - for(uword J = 0; J < uword(N); ++J) { - eigvec.at(J, I) = std::complex(Z[N * I + J], Z[N * I + N + J]); - eigvec.at(J, I + 1llu) = std::complex(Z[N * I + J], -Z[N * I + N + J]); - } - ++I; - } - else if(I == NEV - 1llu && std::complex(eigval[I]).imag() != 0.) for(auto J = 0; J < N; ++J) eigvec.at(J, I) = std::complex(Z[N * I + J], Z[N * I + N + J]); - else for(auto J = 0; J < N; ++J) eigvec.at(J, I) = std::complex(Z[N * I + J], 0.); - } - - return INFO; -} - -int eig_solve(vec& eigval, mat& eigvec, const std::shared_ptr>& K, const std::shared_ptr>& KG) { - auto IDO = 0; - auto BMAT = 'G'; // generalized eigenvalue problem A*x=lambda*M*x - auto N = static_cast(K->n_cols); - char WHICH[2] = {'S', 'M'}; - auto NEV = 1; - auto TOL = 0.; - auto NCV = std::min(2 * NEV, N); - auto LDV = N; - auto LWORKL = 2 * NCV * (NCV + 8); - auto INFO = 0; - - podarray IPARAM(11), IPNTR(14); - podarray RESID(N), V(uword(N) * uword(NCV)), WORKD(5 * uword(N)), WORKL(LWORKL); - - IPARAM(0) = 1; // exact shift - IPARAM(2) = 1000; // maximum iteration - IPARAM(6) = 4; // mode 4: K*x=lambda*KG*x - - auto SIGMA = -1.; - - KG *= SIGMA; - - // for buckling analysis KG from FEM is actually -KG in ARPACK - KG += K; - - while(99 != IDO) { - arma_fortran(arma_dsaupd)(&IDO, &BMAT, &N, WHICH, &NEV, &TOL, RESID.memptr(), &NCV, V.memptr(), &LDV, IPARAM.memptr(), IPNTR.memptr(), WORKD.memptr(), WORKL.memptr(), &LWORKL, &INFO); - // ReSharper disable once CppEntityAssignedButNoRead - if(vec Y(WORKD.memptr() + IPNTR[1] - 1, N, false); -1 == IDO) { - vec X(WORKD.memptr() + IPNTR[0] - 1, N, false); - X = K * X; - Y = KG->solve(X); - } - else if(1 == IDO) { - const vec X(WORKD.memptr() + IPNTR[2] - 1, N, false); - Y = KG->solve(X); - } - else if(2 == IDO) { - const vec X(WORKD.memptr() + IPNTR[0] - 1, N, false); - Y = K * X; - } - } - - if(0 != INFO) return INFO; - - suanpan_debug("Arnoldi iteration counter: %d.\n", IPARAM(2)); - - auto RVEC = 1; - auto HOWMNY = 'A'; - auto LDZ = N; - - podarray SELECT(NCV); - - eigval.set_size(NEV); - eigvec.set_size(N, NEV); - - arma_fortran(arma_dseupd)(&RVEC, &HOWMNY, SELECT.memptr(), eigval.memptr(), eigvec.memptr(), &LDZ, &SIGMA, &BMAT, &N, WHICH, &NEV, &TOL, RESID.memptr(), &NCV, V.memptr(), &LDV, IPARAM.memptr(), IPNTR.memptr(), WORKD.memptr(), WORKL.memptr(), &LWORKL, &INFO); - - return INFO; -} - -int eig_solve(cx_vec& eigval, cx_mat& eigvec, const std::shared_ptr>& K, const std::shared_ptr>& KG) { - auto IDO = 0; - auto BMAT = 'G'; // standard eigenvalue problem A*x=lambda*x - auto N = static_cast(K->n_rows); - char WHICH[2] = {'L', 'M'}; - auto NEV = 1; - auto TOL = 0.; - auto NCV = std::min(std::max(NEV + 2, 2 * NEV + 1), N); - auto LDV = N; - auto LWORKL = 3 * NCV * (NCV + 2); - auto INFO = 0; - - podarray IPARAM(11), IPNTR(14); - podarray RESID(N), V(N * uword(NCV)), WORKD(3llu * N), WORKL(LWORKL); - - IPARAM(0) = 1; // exact shift - IPARAM(2) = 1000; // maximum iteration - IPARAM(6) = 3; // mode 1: K*x=lambda*KG*x - - auto SIGMAR = -1.; - auto SIGMAI = 0.; - - K -= KG; - - while(99 != IDO) { - arma_fortran(arma_dnaupd)(&IDO, &BMAT, &N, WHICH, &NEV, &TOL, RESID.memptr(), &NCV, V.memptr(), &LDV, IPARAM.memptr(), IPNTR.memptr(), WORKD.memptr(), WORKL.memptr(), &LWORKL, &INFO); - // ReSharper disable once CppEntityAssignedButNoRead - if(vec Y(WORKD.memptr() + IPNTR[1] - 1, N, false); -1 == IDO) { - vec X(WORKD.memptr() + IPNTR[0] - 1, N, false); - X = KG * X; - Y = K->solve(X); - } - else if(1 == IDO) { - const vec X(WORKD.memptr() + IPNTR[2] - 1, N, false); - Y = K->solve(X); - } - else if(2 == IDO) { - const vec X(WORKD.memptr() + IPNTR[0] - 1, N, false); - Y = KG * X; - } + if(0 != INFO) { + suanpan_error("arpack solver returns %d.\n", INFO); + return SUANPAN_FAIL; } - if(INFO != 0) return INFO; - auto RVEC = 1; auto HOWMNY = 'A'; auto LDZ = N; diff --git a/Toolbox/arpack_wrapper.h b/Toolbox/arpack_wrapper.h index b56766904..068f4ba59 100644 --- a/Toolbox/arpack_wrapper.h +++ b/Toolbox/arpack_wrapper.h @@ -21,17 +21,8 @@ #include #include -// general matrix -int eig_solve(cx_vec&, cx_mat&, const std::shared_ptr>&, unsigned, const char* = "SM"); +int eig_solve(vec&, mat&, const std::shared_ptr>&, const std::shared_ptr>&, unsigned, const char* = "SM"); -// modal analysis -int eig_solve(vec& eigval, mat& eigvec, const std::shared_ptr>&, const std::shared_ptr>&, unsigned, const char* = "SM"); - -int eig_solve(cx_vec& eigval, cx_mat& eigvec, const std::shared_ptr>&, const std::shared_ptr>&, unsigned, const char* = "LM"); - -// buckling analysis -int eig_solve(vec& eigval, mat& eigvec, const std::shared_ptr>&, const std::shared_ptr>&); - -int eig_solve(cx_vec& eigval, cx_mat& eigvec, const std::shared_ptr>&, const std::shared_ptr>&); +int eig_solve(cx_vec&, cx_mat&, const std::shared_ptr>&, const std::shared_ptr>&, unsigned, const char* = "LM"); #endif diff --git a/Toolbox/commandParser.cpp b/Toolbox/commandParser.cpp index 0d64ba219..1fbb44a45 100644 --- a/Toolbox/commandParser.cpp +++ b/Toolbox/commandParser.cpp @@ -400,7 +400,7 @@ int process_command(const shared_ptr& model, istringstream& command) { auto flag = true; for(const auto& t_integrator : domain->get_integrator_pool()) - if(t_integrator->get_domain().lock() != nullptr) { + if(t_integrator->get_domain() != nullptr) { t_integrator->clear_status(); flag = false; } @@ -415,7 +415,7 @@ int process_command(const shared_ptr& model, istringstream& command) { auto flag = true; for(const auto& t_integrator : domain->get_integrator_pool()) - if(t_integrator->get_domain().lock() != nullptr) { + if(t_integrator->get_domain() != nullptr) { t_integrator->reset_status(); flag = false; } @@ -1129,6 +1129,12 @@ int set_property(const shared_ptr& domain, istringstream& command) { return SUANPAN_SUCCESS; } + if(is_equal(property_id, "linear_system")) { + domain->set_attribute(ModalAttribute::LinearSystem); + + return SUANPAN_SUCCESS; + } + if(domain->get_current_step_tag() == 0) return SUANPAN_SUCCESS; const auto& t_step = domain->get_current_step(); diff --git a/Toolbox/fext/CMakeLists.txt b/Toolbox/fext/CMakeLists.txt index 9b1b8348c..e49a207bf 100644 --- a/Toolbox/fext/CMakeLists.txt +++ b/Toolbox/fext/CMakeLists.txt @@ -9,7 +9,6 @@ include(../../Driver.cmake) add_library(${PROJECT_NAME} ${LIBRARY_TYPE} $ $ - $ $ $ $ diff --git a/Toolbox/lapack-ext/CMakeLists.txt b/Toolbox/lapack-ext/CMakeLists.txt deleted file mode 100644 index 7a794fe27..000000000 --- a/Toolbox/lapack-ext/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -cmake_minimum_required(VERSION 3.13.0) - -project(spmm Fortran) - -set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../../Libs) - -file(GLOB SPMM_SRC "*.f") - -include(../../Driver.cmake) - -add_library(spmm_obj OBJECT ${SPMM_SRC}) - -add_library(${PROJECT_NAME} ${LIBRARY_TYPE} $) - -message(STATUS "SPMM Fortran_FLAGS: ${CMAKE_Fortran_FLAGS}") \ No newline at end of file diff --git a/Toolbox/lapack-ext/dspmm.f b/Toolbox/lapack-ext/dspmm.f deleted file mode 100644 index ef94bc4f0..000000000 --- a/Toolbox/lapack-ext/dspmm.f +++ /dev/null @@ -1,458 +0,0 @@ -* Purpose: To compute alpha*op(A,B)+beta*C, op(A,B) could be either -* A*B, -* B*A, -* A*B**T, -* B**T*A. -* -* \param[in] SIDE -* SIDE is CHARACTER*1 -* Select which problem to compute: -* 'L' C=alpha*B*A+beta*C, -* 'R' C=alpha*A*B+beta*C. -* -* \param[in] UPLO -* UPLO is CHARACTER*1 -* Select which part of A is stored: -* 'U' Upper Triangle, -* 'L' Lower Triangle. -* -* \param[in] TRAN -* TRAN is CHARACTER*1 -* Select if B is transverse: -* 'N' No transverse, -* 'T' Transverse. -* -* \param[in] M -* M is INTEGER -* The size of square matrix A. -* -* \param[in] N -* N is INTEGER -* Another dimension of matrix B. -* For SIDE='L', B=>(N,M), -* For SIDE='R', B=>(M,N). -* -* \param[in] ALPHA -* ALPHA is DOUBLEPRECISION -* The factor. -* -* \param[in] A -* A is DOUBLEPRECISION(*) array of DIMENSION ((M+1)*M/2) -* -* \param[in] B -* B is DOUBLEPRECISION(*,*) array of DIMENSION (M,N) or (N,M) -* -* \param[in] LDB -* LDB is INTEGER -* The leading dimension of matrix B, should be at least max(1,M) or max(1,N). -* -* \param[in] BETA -* BETA is DOUBLEPRECISION -* The factor. -* -* \param[in/out] C -* C is DOUBLEPRECISION(*,*) array of DIMENSION (M,N) or (N,M) -* -* \param[in] LDC -* LDC is INTEGER -* The leading dimension of matrix C, should be at least max(1,M) or max(1,N) based on SIDE. -* - SUBROUTINE DSPMM(SIDE,UPLO,TRAN,M,N,A,ALPHA,B,LDB,BETA,C,LDC) - - !...INPUT ARGUMENTS... - CHARACTER SIDE,UPLO,TRAN - INTEGER M,N,LDB,LDC - DOUBLEPRECISION ALPHA,BETA,A(*),B(LDB,*),C(LDC,*) - - !...TEMP VARIABLES... - INTEGER I,J,K,X,Y,Z,DIMA,DIMB,PTYPE,INFO - DOUBLEPRECISION TEMPA - LOGICAL S,U,T - - !...TWO CONSTANTS... - DOUBLEPRECISION ZERO,ONE - PARAMETER (ZERO=0.0D+0,ONE=1.0D+0) - - !...EXTERNAL SUBROUTINES... - LOGICAL LSAME - EXTERNAL LSAME - EXTERNAL XERBLA - - !...FLAGS... - S=LSAME(SIDE,'R') - U=LSAME(UPLO,'U') - T=LSAME(TRAN,'N') - - !...CHECK IF ACCEPTABLE ARGUMENTS ARE GIVEN... - INFO=0 - IF((.NOT.S).AND.(.NOT.LSAME(SIDE,'L')))THEN - INFO=1 - ELSEIF((.NOT.U).AND.(.NOT.LSAME(UPLO,'U')))THEN - INFO=2 - ELSEIF((.NOT.T).AND.(.NOT.LSAME(TRAN,'T')))THEN - INFO=3 - ENDIF - - IF(INFO.NE.0)THEN - CALL XERBLA('DSPMM ',INFO) - RETURN - ENDIF - - !...SWITCH TO PROPER DIMENSION... - !...THE DIMENSION OF C IS AWAYS (DIMA,DIMB)... - IF(S)THEN - DIMA=M - DIMB=N - ELSE - DIMA=N - DIMB=M - ENDIF - - !...QUICK RETURN... - IF(ALPHA.EQ.ZERO)THEN - IF(BETA.EQ.ZERO)THEN - DO 20 J=1,DIMB - DO 10 I=1,DIMA - C(I,J)=ZERO - 10 CONTINUE - 20 CONTINUE - ELSEIF(BETA.NE.ONE)THEN - DO 40 J=1,DIMB - DO 30 I=1,DIMA - C(I,J)=BETA*C(I,J) - 30 CONTINUE - 40 CONTINUE - ENDIF - RETURN - ENDIF - - !...ALPHA.NE.ZERO... - !...CHECK beta*C FIRST... - IF(BETA.EQ.ZERO)THEN - DO 60 J=1,DIMB - DO 50 I=1,DIMA - C(I,J)=ZERO - 50 CONTINUE - 60 CONTINUE - ELSEIF(BETA.NE.ONE)THEN - DO 80 J=1,DIMB - DO 70 I=1,DIMA - C(I,J)=BETA*C(I,J) - 70 CONTINUE - 80 CONTINUE - ENDIF - - !...ASSIGN PROBLEM TYPE ACCORDING TO GIVEN FLAGS... - PTYPE=0000 - IF(S)PTYPE=PTYPE+1000 - IF(U)PTYPE=PTYPE+100 - IF(T)PTYPE=PTYPE+10 - IF(ALPHA.EQ.ONE)PTYPE=PTYPE+1 - - X=1 - - !...U*B - IF(PTYPE==1111)THEN - DO J=1,M - DO I=1,J-1 - DO K=1,N - C(I,K)=C(I,K)+A(X)*B(J,K) - C(J,K)=C(J,K)+A(X)*B(I,K) - ENDDO - X=X+1 - ENDDO - DO K=1,N - C(J,K)=C(J,K)+A(X)*B(J,K) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...U*B**T - IF(PTYPE==1101)THEN - DO J=1,M - DO I=1,J-1 - DO K=1,N - C(I,K)=C(I,K)+A(X)*B(K,J) - C(J,K)=C(J,K)+A(X)*B(K,I) - ENDDO - X=X+1 - ENDDO - DO K=1,N - C(J,K)=C(J,K)+A(X)*B(K,J) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...B*U - IF(PTYPE==0111)THEN - DO J=1,M - DO I=1,J-1 - DO K=1,N - C(K,I)=C(K,I)+A(X)*B(K,J) - C(K,J)=C(K,J)+A(X)*B(K,I) - ENDDO - X=X+1 - ENDDO - DO K=1,N - C(K,J)=C(K,J)+A(X)*B(K,J) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...B**T*U - IF(PTYPE==0101)THEN - DO J=1,M - DO I=1,J-1 - DO K=1,N - C(K,I)=C(K,I)+A(X)*B(J,K) - C(K,J)=C(K,J)+A(X)*B(I,K) - ENDDO - X=X+1 - ENDDO - DO K=1,N - C(K,J)=C(K,J)+A(X)*B(J,K) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...L*B - IF(PTYPE==1011)THEN - DO J=1,M - DO K=1,N - C(J,K)=C(J,K)+A(X)*B(J,K) - ENDDO - X=X+1 - DO I=J+1,M - DO K=1,N - C(I,K)=C(I,K)+A(X)*B(J,K) - C(J,K)=C(J,K)+A(X)*B(I,K) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...L*B**T - IF(PTYPE==1001)THEN - DO J=1,M - DO K=1,N - C(J,K)=C(J,K)+A(X)*B(K,J) - ENDDO - X=X+1 - DO I=J+1,M - DO K=1,N - C(I,K)=C(I,K)+A(X)*B(K,J) - C(J,K)=C(J,K)+A(X)*B(K,I) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...B*L - IF(PTYPE==0011)THEN - DO J=1,M - DO K=1,N - C(K,J)=C(K,J)+A(X)*B(K,J) - ENDDO - X=X+1 - DO I=J+1,M - DO K=1,N - C(K,I)=C(K,I)+A(X)*B(K,J) - C(K,J)=C(K,J)+A(X)*B(K,I) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...B**T*L - IF(PTYPE==0001)THEN - DO J=1,M - DO K=1,N - C(K,J)=C(K,J)+A(X)*B(J,K) - ENDDO - X=X+1 - DO I=J+1,M - DO K=1,N - C(K,I)=C(K,I)+A(X)*B(J,K) - C(K,J)=C(K,J)+A(X)*B(I,K) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...U*B - IF(PTYPE==1110)THEN - DO J=1,M - DO I=1,J-1 - TEMPA=ALPHA*A(X) - DO K=1,N - C(I,K)=C(I,K)+TEMPA*B(J,K) - C(J,K)=C(J,K)+TEMPA*B(I,K) - ENDDO - X=X+1 - ENDDO - TEMPA=ALPHA*A(X) - DO K=1,N - C(J,K)=C(J,K)+TEMPA*B(J,K) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...U*B**T - IF(PTYPE==1100)THEN - DO J=1,M - DO I=1,J-1 - TEMPA=ALPHA*A(X) - DO K=1,N - C(I,K)=C(I,K)+TEMPA*B(K,J) - C(J,K)=C(J,K)+TEMPA*B(K,I) - ENDDO - X=X+1 - ENDDO - TEMPA=ALPHA*A(X) - DO K=1,N - C(J,K)=C(J,K)+TEMPA*B(K,J) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...B*U - IF(PTYPE==0110)THEN - DO J=1,M - DO I=1,J-1 - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,I)=C(K,I)+TEMPA*B(K,J) - C(K,J)=C(K,J)+TEMPA*B(K,I) - ENDDO - X=X+1 - ENDDO - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,J)=C(K,J)+TEMPA*B(K,J) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...B**T*U - IF(PTYPE==0100)THEN - DO J=1,M - DO I=1,J-1 - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,I)=C(K,I)+TEMPA*B(J,K) - C(K,J)=C(K,J)+TEMPA*B(I,K) - ENDDO - X=X+1 - ENDDO - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,J)=C(K,J)+TEMPA*B(J,K) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...L*B - IF(PTYPE==1010)THEN - DO J=1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(J,K)=C(J,K)+TEMPA*B(J,K) - ENDDO - X=X+1 - DO I=J+1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(I,K)=C(I,K)+TEMPA*B(J,K) - C(J,K)=C(J,K)+TEMPA*B(I,K) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...L*B**T - IF(PTYPE==1000)THEN - DO J=1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(J,K)=C(J,K)+TEMPA*B(K,J) - ENDDO - X=X+1 - DO I=J+1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(I,K)=C(I,K)+TEMPA*B(K,J) - C(J,K)=C(J,K)+TEMPA*B(K,I) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...B*L - IF(PTYPE==0010)THEN - DO J=1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,J)=C(K,J)+TEMPA*B(K,J) - ENDDO - X=X+1 - DO I=J+1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,I)=C(K,I)+TEMPA*B(K,J) - C(K,J)=C(K,J)+TEMPA*B(K,I) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...B**T*L - IF(PTYPE==0000)THEN - DO J=1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,J)=C(K,J)+TEMPA*B(J,K) - ENDDO - X=X+1 - DO I=J+1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,I)=C(K,I)+TEMPA*B(J,K) - C(K,J)=C(K,J)+TEMPA*B(I,K) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - END diff --git a/Toolbox/lapack-ext/sspmm.f b/Toolbox/lapack-ext/sspmm.f deleted file mode 100644 index ecd9a427b..000000000 --- a/Toolbox/lapack-ext/sspmm.f +++ /dev/null @@ -1,458 +0,0 @@ -* Purpose: To compute alpha*op(A,B)+beta*C, op(A,B) could be either -* A*B, -* B*A, -* A*B**T, -* B**T*A. -* -* \param[in] SIDE -* SIDE is CHARACTER*1 -* Select which problem to compute: -* 'L' C=alpha*B*A+beta*C, -* 'R' C=alpha*A*B+beta*C. -* -* \param[in] UPLO -* UPLO is CHARACTER*1 -* Select which part of A is stored: -* 'U' Upper Triangle, -* 'L' Lower Triangle. -* -* \param[in] TRAN -* TRAN is CHARACTER*1 -* Select if B is transverse: -* 'N' No transverse, -* 'T' Transverse. -* -* \param[in] M -* M is INTEGER -* The size of square matrix A. -* -* \param[in] N -* N is INTEGER -* Another dimension of matrix B. -* For SIDE='L', B=>(N,M), -* For SIDE='R', B=>(M,N). -* -* \param[in] ALPHA -* ALPHA is REAL -* The factor. -* -* \param[in] A -* A is REAL(*) array of DIMENSION ((M+1)*M/2) -* -* \param[in] B -* B is REAL(*,*) array of DIMENSION (M,N) or (N,M) -* -* \param[in] LDB -* LDB is INTEGER -* The leading dimension of matrix B, should be at least max(1,M) or max(1,N). -* -* \param[in] BETA -* BETA is REAL -* The factor. -* -* \param[in/out] C -* C is REAL(*,*) array of DIMENSION (M,N) or (N,M) -* -* \param[in] LDC -* LDC is INTEGER -* The leading dimension of matrix C, should be at least max(1,M) or max(1,N) based on SIDE. -* - SUBROUTINE SSPMM(SIDE,UPLO,TRAN,M,N,A,ALPHA,B,LDB,BETA,C,LDC) - - !...INPUT ARGUMENTS... - CHARACTER SIDE,UPLO,TRAN - INTEGER M,N,LDB,LDC - REAL ALPHA,BETA,A(*),B(LDB,*),C(LDC,*) - - !...TEMP VARIABLES... - INTEGER I,J,K,X,Y,Z,DIMA,DIMB,PTYPE,INFO - REAL TEMPA - LOGICAL S,U,T - - !...TWO CONSTANTS... - REAL ZERO,ONE - PARAMETER (ZERO=0.0D+0,ONE=1.0D+0) - - !...EXTERNAL SUBROUTINES... - LOGICAL LSAME - EXTERNAL LSAME - EXTERNAL XERBLA - - !...FLAGS... - S=LSAME(SIDE,'R') - U=LSAME(UPLO,'U') - T=LSAME(TRAN,'N') - - !...CHECK IF ACCEPTABLE ARGUMENTS ARE GIVEN... - INFO=0 - IF((.NOT.S).AND.(.NOT.LSAME(SIDE,'L')))THEN - INFO=1 - ELSEIF((.NOT.U).AND.(.NOT.LSAME(UPLO,'U')))THEN - INFO=2 - ELSEIF((.NOT.T).AND.(.NOT.LSAME(TRAN,'T')))THEN - INFO=3 - ENDIF - - IF(INFO.NE.0)THEN - CALL XERBLA('SSPMM ',INFO) - RETURN - ENDIF - - !...SWITCH TO PROPER DIMENSION... - !...THE DIMENSION OF C IS AWAYS (DIMA,DIMB)... - IF(S)THEN - DIMA=M - DIMB=N - ELSE - DIMA=N - DIMB=M - ENDIF - - !...QUICK RETURN... - IF(ALPHA.EQ.ZERO)THEN - IF(BETA.EQ.ZERO)THEN - DO 20 J=1,DIMB - DO 10 I=1,DIMA - C(I,J)=ZERO - 10 CONTINUE - 20 CONTINUE - ELSEIF(BETA.NE.ONE)THEN - DO 40 J=1,DIMB - DO 30 I=1,DIMA - C(I,J)=BETA*C(I,J) - 30 CONTINUE - 40 CONTINUE - ENDIF - RETURN - ENDIF - - !...ALPHA.NE.ZERO... - !...CHECK beta*C FIRST... - IF(BETA.EQ.ZERO)THEN - DO 60 J=1,DIMB - DO 50 I=1,DIMA - C(I,J)=ZERO - 50 CONTINUE - 60 CONTINUE - ELSEIF(BETA.NE.ONE)THEN - DO 80 J=1,DIMB - DO 70 I=1,DIMA - C(I,J)=BETA*C(I,J) - 70 CONTINUE - 80 CONTINUE - ENDIF - - !...ASSIGN PROBLEM TYPE ACCORDING TO GIVEN FLAGS... - PTYPE=0000 - IF(S)PTYPE=PTYPE+1000 - IF(U)PTYPE=PTYPE+100 - IF(T)PTYPE=PTYPE+10 - IF(ALPHA.EQ.ONE)PTYPE=PTYPE+1 - - X=1 - - !...U*B - IF(PTYPE==1111)THEN - DO J=1,M - DO I=1,J-1 - DO K=1,N - C(I,K)=C(I,K)+A(X)*B(J,K) - C(J,K)=C(J,K)+A(X)*B(I,K) - ENDDO - X=X+1 - ENDDO - DO K=1,N - C(J,K)=C(J,K)+A(X)*B(J,K) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...U*B**T - IF(PTYPE==1101)THEN - DO J=1,M - DO I=1,J-1 - DO K=1,N - C(I,K)=C(I,K)+A(X)*B(K,J) - C(J,K)=C(J,K)+A(X)*B(K,I) - ENDDO - X=X+1 - ENDDO - DO K=1,N - C(J,K)=C(J,K)+A(X)*B(K,J) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...B*U - IF(PTYPE==0111)THEN - DO J=1,M - DO I=1,J-1 - DO K=1,N - C(K,I)=C(K,I)+A(X)*B(K,J) - C(K,J)=C(K,J)+A(X)*B(K,I) - ENDDO - X=X+1 - ENDDO - DO K=1,N - C(K,J)=C(K,J)+A(X)*B(K,J) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...B**T*U - IF(PTYPE==0101)THEN - DO J=1,M - DO I=1,J-1 - DO K=1,N - C(K,I)=C(K,I)+A(X)*B(J,K) - C(K,J)=C(K,J)+A(X)*B(I,K) - ENDDO - X=X+1 - ENDDO - DO K=1,N - C(K,J)=C(K,J)+A(X)*B(J,K) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...L*B - IF(PTYPE==1011)THEN - DO J=1,M - DO K=1,N - C(J,K)=C(J,K)+A(X)*B(J,K) - ENDDO - X=X+1 - DO I=J+1,M - DO K=1,N - C(I,K)=C(I,K)+A(X)*B(J,K) - C(J,K)=C(J,K)+A(X)*B(I,K) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...L*B**T - IF(PTYPE==1001)THEN - DO J=1,M - DO K=1,N - C(J,K)=C(J,K)+A(X)*B(K,J) - ENDDO - X=X+1 - DO I=J+1,M - DO K=1,N - C(I,K)=C(I,K)+A(X)*B(K,J) - C(J,K)=C(J,K)+A(X)*B(K,I) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...B*L - IF(PTYPE==0011)THEN - DO J=1,M - DO K=1,N - C(K,J)=C(K,J)+A(X)*B(K,J) - ENDDO - X=X+1 - DO I=J+1,M - DO K=1,N - C(K,I)=C(K,I)+A(X)*B(K,J) - C(K,J)=C(K,J)+A(X)*B(K,I) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...B**T*L - IF(PTYPE==0001)THEN - DO J=1,M - DO K=1,N - C(K,J)=C(K,J)+A(X)*B(J,K) - ENDDO - X=X+1 - DO I=J+1,M - DO K=1,N - C(K,I)=C(K,I)+A(X)*B(J,K) - C(K,J)=C(K,J)+A(X)*B(I,K) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...U*B - IF(PTYPE==1110)THEN - DO J=1,M - DO I=1,J-1 - TEMPA=ALPHA*A(X) - DO K=1,N - C(I,K)=C(I,K)+TEMPA*B(J,K) - C(J,K)=C(J,K)+TEMPA*B(I,K) - ENDDO - X=X+1 - ENDDO - TEMPA=ALPHA*A(X) - DO K=1,N - C(J,K)=C(J,K)+TEMPA*B(J,K) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...U*B**T - IF(PTYPE==1100)THEN - DO J=1,M - DO I=1,J-1 - TEMPA=ALPHA*A(X) - DO K=1,N - C(I,K)=C(I,K)+TEMPA*B(K,J) - C(J,K)=C(J,K)+TEMPA*B(K,I) - ENDDO - X=X+1 - ENDDO - TEMPA=ALPHA*A(X) - DO K=1,N - C(J,K)=C(J,K)+TEMPA*B(K,J) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...B*U - IF(PTYPE==0110)THEN - DO J=1,M - DO I=1,J-1 - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,I)=C(K,I)+TEMPA*B(K,J) - C(K,J)=C(K,J)+TEMPA*B(K,I) - ENDDO - X=X+1 - ENDDO - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,J)=C(K,J)+TEMPA*B(K,J) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...B**T*U - IF(PTYPE==0100)THEN - DO J=1,M - DO I=1,J-1 - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,I)=C(K,I)+TEMPA*B(J,K) - C(K,J)=C(K,J)+TEMPA*B(I,K) - ENDDO - X=X+1 - ENDDO - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,J)=C(K,J)+TEMPA*B(J,K) - ENDDO - X=X+1 - ENDDO - RETURN - ENDIF - - !...L*B - IF(PTYPE==1010)THEN - DO J=1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(J,K)=C(J,K)+TEMPA*B(J,K) - ENDDO - X=X+1 - DO I=J+1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(I,K)=C(I,K)+TEMPA*B(J,K) - C(J,K)=C(J,K)+TEMPA*B(I,K) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...L*B**T - IF(PTYPE==1000)THEN - DO J=1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(J,K)=C(J,K)+TEMPA*B(K,J) - ENDDO - X=X+1 - DO I=J+1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(I,K)=C(I,K)+TEMPA*B(K,J) - C(J,K)=C(J,K)+TEMPA*B(K,I) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...B*L - IF(PTYPE==0010)THEN - DO J=1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,J)=C(K,J)+TEMPA*B(K,J) - ENDDO - X=X+1 - DO I=J+1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,I)=C(K,I)+TEMPA*B(K,J) - C(K,J)=C(K,J)+TEMPA*B(K,I) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - !...B**T*L - IF(PTYPE==0000)THEN - DO J=1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,J)=C(K,J)+TEMPA*B(J,K) - ENDDO - X=X+1 - DO I=J+1,M - TEMPA=ALPHA*A(X) - DO K=1,N - C(K,I)=C(K,I)+TEMPA*B(J,K) - C(K,J)=C(K,J)+TEMPA*B(I,K) - ENDDO - X=X+1 - ENDDO - ENDDO - RETURN - ENDIF - - END diff --git a/Toolbox/sync_ostream.h b/Toolbox/sync_ostream.h index cb4112098..95d5e235c 100644 --- a/Toolbox/sync_ostream.h +++ b/Toolbox/sync_ostream.h @@ -23,6 +23,7 @@ class sync_ostream { std::unique_lock print_lock; std::ostream* ostream; + public: explicit sync_ostream(std::ostream&); sync_ostream(const sync_ostream&) = delete; diff --git a/Toolbox/tensorToolbox.h b/Toolbox/tensorToolbox.h index 08858d5ea..52e6d7d98 100644 --- a/Toolbox/tensorToolbox.h +++ b/Toolbox/tensorToolbox.h @@ -87,8 +87,7 @@ namespace tensor { double double_contraction(const vec&, const vec&); double double_contraction(vec&&, vec&&); } // namespace stress - -} // namespace tensor +} // namespace tensor namespace transform { double atan2(const vec&); @@ -175,7 +174,6 @@ namespace transform { namespace triangle { vec to_area_coordinate(const vec&, const mat&); } - } // namespace transform namespace suanpan { diff --git a/Toolbox/utility.h b/Toolbox/utility.h index 0b82cb260..6ffcb4e25 100644 --- a/Toolbox/utility.h +++ b/Toolbox/utility.h @@ -18,17 +18,29 @@ #ifndef UTILITY_H #define UTILITY_H -#include #include +#include +#ifdef __cpp_lib_execution +#include +#endif template void suanpan_for(const IT start, const IT end, F&& FN) { #ifdef SUANPAN_MT - tbb::parallel_for(start, end, std::forward(FN)); + static tbb::affinity_partitioner ap; + tbb::parallel_for(start, end, std::forward(FN), ap); #else for(IT I = start; I < end; ++I) FN(I); #endif } +template constexpr T suanpan_max_element(T start, T end) { +#ifdef __cpp_lib_execution + return std::max_element(std::execution::par, start, end); +#else + return std::max_element(start, end); +#endif +} + namespace suanpan { template [[maybe_unused]] const std::vector& unique(std::vector& container) { std::sort(container.begin(), container.end()); @@ -66,7 +78,7 @@ template bool get_input(istringstream& I, Col& O) { return code; } -template bool get_input(istringstream& I, T& O, U&...R) { return static_cast(I >> O) ? get_input(I, R...) : false; } +template bool get_input(istringstream& I, T& O, U&... R) { return static_cast(I >> O) ? get_input(I, R...) : false; } template T get_input(istringstream& I) { T O; @@ -88,7 +100,7 @@ template bool get_optional_input(istringstream& I, Col& O) { return code; } -template bool get_optional_input(istringstream& I, T& O, U&...R) { +template bool get_optional_input(istringstream& I, T& O, U&... R) { if(I.eof()) return true; return static_cast(I >> O) ? get_optional_input(I, R...) : false; diff --git a/UnitTest/CMakeLists.txt b/UnitTest/CMakeLists.txt index 9539dd640..b3476f909 100644 --- a/UnitTest/CMakeLists.txt +++ b/UnitTest/CMakeLists.txt @@ -1,11 +1,13 @@ target_sources(${PROJECT_NAME} PRIVATE CatchTest.cpp TestColoring.cpp + TestEigen.cpp TestIntegration.cpp TestMatrix.cpp TestMode.cpp TestNURBS.cpp TestQuaternion.cpp + TestSampling.cpp TestShape.cpp TestSolver.cpp TestSorting.cpp @@ -13,5 +15,4 @@ target_sources(${PROJECT_NAME} PRIVATE TestSurfaceNM.cpp TestTensor.cpp TestUtility.cpp - TestSampling.cpp ) diff --git a/UnitTest/CatchTest.cpp b/UnitTest/CatchTest.cpp index 85eff01a3..55f0fdb17 100644 --- a/UnitTest/CatchTest.cpp +++ b/UnitTest/CatchTest.cpp @@ -4,7 +4,6 @@ #include "CatchHeader.h" int catchtest_main(const int argc, char** argv) { - for(auto I = 1; I < argc; ++I) if(constexpr auto t_argv = ""; is_equal(argv[I], "-ctest") || is_equal(argv[I], "--catchtest")) argv[I] = const_cast(t_argv); return Catch::Session().run(argc, argv); diff --git a/UnitTest/TestEigen.cpp b/UnitTest/TestEigen.cpp new file mode 100644 index 000000000..4b8811c7e --- /dev/null +++ b/UnitTest/TestEigen.cpp @@ -0,0 +1,48 @@ +#include +#include "CatchHeader.h" +#include +#include + +TEST_CASE("Eigensolver", "[Utility.Eigen]") { + constexpr auto N = 100; + constexpr auto Q = 6; + + const vec D = regspace(1, 1, N); + + for(auto L = 0; L < N; ++L) { + const mat P = orth(randn(D.n_elem, D.n_elem)); + + mat K = P * diagmat(D) * P.t(); + + mat M = 2. * eye(size(K)); + + auto KK = make_shared>(D.n_elem, D.n_elem); + + for(auto I = 0llu; I < D.n_elem; ++I) for(auto J = 0llu; J < D.n_elem; ++J) KK->at(J, I) = K(J, I); + + auto MM = make_shared>(D.n_elem, D.n_elem); + + for(auto I = 0llu; I < D.n_elem; ++I) MM->at(I, I) = M(I, I); + + vec eigval; + mat eigvec; + + REQUIRE(eig_solve(eigval, eigvec, KK, MM->make_copy(), Q, "SM") == 0); + + for(auto I = 0; I < Q; ++I) + REQUIRE(Approx(eigval(I)) == .5 * I + .5); + + REQUIRE(eig_solve(eigval, eigvec, KK, MM->make_copy(), Q, "LM") == 0); + + for(auto I = 0; I < Q; ++I) + REQUIRE(Approx(eigval(Q - 1 - I)) == .5 * (N - I)); + + cx_vec cx_eigval; + cx_mat cx_eigvec; + + REQUIRE(eig_solve(cx_eigval, cx_eigvec, KK->make_copy(), MM->make_copy(), Q, "LM") == 0); + + for(auto I = 0; I < Q; ++I) + REQUIRE(Approx(cx_eigval(I).real()) == .5 * I + .5); + } +} diff --git a/UnitTest/TestMatrix.cpp b/UnitTest/TestMatrix.cpp index 4fe409a98..4405fc5bf 100644 --- a/UnitTest/TestMatrix.cpp +++ b/UnitTest/TestMatrix.cpp @@ -57,18 +57,18 @@ template void benchmark_mat_solve(string&& title, vec D; BENCHMARK((title + " Full").c_str()) { - clear_mat(); - A.solve(D, C); - REQUIRE(norm(E - D) < static_cast(C.n_elem) * tol); - }; + clear_mat(); + A.solve(D, C); + REQUIRE(norm(E - D) < static_cast(C.n_elem) * tol); + }; A.get_solver_setting().precision = Precision::MIXED; BENCHMARK((title + " Mixed").c_str()) { - clear_mat(); - A.solve(D, C); - REQUIRE(norm(E - D) < static_cast(C.n_elem) * tol); - }; + clear_mat(); + A.solve(D, C); + REQUIRE(norm(E - D) < static_cast(C.n_elem) * tol); + }; } template void benchmark_mat_setup(const int I) { @@ -384,16 +384,16 @@ TEST_CASE("Benchmark Triplet Assembly", "[Matrix.Sparse]") { for(auto J = 2; J != REPEAT; J *= 2) BENCHMARK(string("Assemble " + std::to_string(J)).c_str()) { - triplet_form C(N + REPEAT, N + REPEAT, B.n_elem * REPEAT); + triplet_form C(N + REPEAT, N + REPEAT, B.n_elem * REPEAT); - for(auto I = 0; I < J; ++I) C.assemble(B, I, I, randu()); + for(auto I = 0; I < J; ++I) C.assemble(B, I, I, randu()); - REQUIRE(C.n_elem == NNZ * J); + REQUIRE(C.n_elem == NNZ * J); - C.csc_condense(); + C.csc_condense(); - return C; - }; + return C; + }; } TEST_CASE("Triplet/CSR/CSC Conversion", "[Matrix.Sparse]") { diff --git a/UnitTest/TestUtility.cpp b/UnitTest/TestUtility.cpp index e385fbc22..536e41993 100644 --- a/UnitTest/TestUtility.cpp +++ b/UnitTest/TestUtility.cpp @@ -19,18 +19,18 @@ TEST_CASE("Sign", "[Utility.Sign]") { TEST_CASE("Matrix Allocation", "[Utility.Matrix]") { BENCHMARK("Static Size 20") { - mat::fixed<20, 20> A(fill::randn); - A(10, 10) = 1.; - REQUIRE(A.n_elem == 400); - return A; - }; + mat::fixed<20, 20> A(fill::randn); + A(10, 10) = 1.; + REQUIRE(A.n_elem == 400); + return A; + }; BENCHMARK("Dynamic Size 20") { - mat A(20, 20, fill::randn); - A(10, 10) = 1.; - REQUIRE(A.n_elem == 400); - return A; - }; + mat A(20, 20, fill::randn); + A(10, 10) = 1.; + REQUIRE(A.n_elem == 400); + return A; + }; } TEST_CASE("Sync Stream", "[Utility.Print]") { diff --git a/snapcraft.yaml b/snapcraft.yaml index c2e8e6489..a31871fc1 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -9,7 +9,7 @@ issues: https://github.com/TLCFEM/suanPan/issues license: GPL-3.0 source-code: https://github.com/TLCFEM/suanPan summary: An Open Source, Parallel and Heterogeneous Finite Element Analysis Framework -version: "2.6.1" +version: "2.7" website: https://bit.ly/suanpan-doc description: | [**suanPan**](https://github.com/TLCFEM/suanPan) is a finite element method (FEM) simulation platform for applications @@ -57,8 +57,8 @@ parts: override-build: | wget -q https://github.com/TLCFEM/prebuilds/releases/download/latest/VTK-9.2.2-linux.tar.gz tar xf VTK-9.2.2-linux.tar.gz - wget -q https://registrationcenter-download.intel.com/akdlm/irc_nas/18898/l_onemkl_p_2022.2.0.8748_offline.sh - sh ./l_onemkl_p_2022.2.0.8748_offline.sh -a --silent --eula accept + wget -q https://registrationcenter-download.intel.com/akdlm/irc_nas/19138/l_onemkl_p_2023.0.0.25398_offline.sh + sh ./l_onemkl_p_2023.0.0.25398_offline.sh -a --silent --eula accept craftctl default stage-packages: - libgfortran5 diff --git a/suanPan.cpp b/suanPan.cpp index 65dfd57e3..1fb9ed9c1 100644 --- a/suanPan.cpp +++ b/suanPan.cpp @@ -27,6 +27,9 @@ BOOL WIN_EVENT(DWORD) { return TRUE; } // ReSharper disable once CppParameterMayBeConst int main(int argc, char** argv) { #ifdef SUANPAN_WIN +#if defined(SUANPAN_DEBUG) && defined(SUANPAN_MSVC) + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); +#endif if(!SetConsoleCtrlHandler(WIN_EVENT, TRUE)) return 0; const auto handle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO info;

  2. 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

s6npSL;YcYq?l(`ieb5?C_ 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 j657=C>Hv)WdE5ylv@>klf>m#&lfi0g@% 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 ?|k+xuOCDHxj_}8LJj!v!0XR!>xVc~W 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