From 85d039785d2e6e08a7f572ff5da382ab5961d449 Mon Sep 17 00:00:00 2001 From: Adam Liwo Date: Tue, 1 Apr 2014 00:37:15 -0400 Subject: [PATCH] Added src_Eshel (decoy processing for threading) --- .../MD/unres_gfortran_single_decoy_E0LL2Y.exe | Bin 0 -> 621657 bytes bin/unres/MD/unres_gfortran_single_decoy_GAB.exe | Bin 0 -> 618038 bytes bin/unres/MD/unres_mchain-ifort_MPICH_GAB-NEWC.exe | Bin 0 -> 6852147 bytes .../unres/new/MREMD/ff_gab/1L2Y_MREMD.inp.orig | 18 + source/unres/src_Eshel/CMakeLists.txt | 393 + source/unres/src_Eshel/COMMON.BOUNDS | 2 + source/unres/src_Eshel/COMMON.CACHE | 6 + source/unres/src_Eshel/COMMON.CALC | 15 + source/unres/src_Eshel/COMMON.CHAIN | 13 + source/unres/src_Eshel/COMMON.CONTACTS | 82 + source/unres/src_Eshel/COMMON.CONTACTS.moment | 68 + source/unres/src_Eshel/COMMON.CONTROL | 13 + source/unres/src_Eshel/COMMON.DBASE | 3 + source/unres/src_Eshel/COMMON.DERIV | 36 + source/unres/src_Eshel/COMMON.DISTFIT | 14 + source/unres/src_Eshel/COMMON.ECOMPON | 5 + source/unres/src_Eshel/COMMON.FFIELD | 25 + source/unres/src_Eshel/COMMON.GEO | 2 + source/unres/src_Eshel/COMMON.HAIRPIN | 5 + source/unres/src_Eshel/COMMON.HEADER | 2 + source/unres/src_Eshel/COMMON.INFO | 21 + source/unres/src_Eshel/COMMON.INTERACT | 34 + source/unres/src_Eshel/COMMON.IOUNITS | 70 + source/unres/src_Eshel/COMMON.LANGEVIN | 21 + source/unres/src_Eshel/COMMON.LANGEVIN.lang0 | 11 + source/unres/src_Eshel/COMMON.LOCAL | 55 + source/unres/src_Eshel/COMMON.LOCMOVE | 19 + source/unres/src_Eshel/COMMON.MAP | 4 + source/unres/src_Eshel/COMMON.MAXGRAD | 12 + source/unres/src_Eshel/COMMON.MCE | 13 + source/unres/src_Eshel/COMMON.MCM | 70 + source/unres/src_Eshel/COMMON.MD | 43 + source/unres/src_Eshel/COMMON.MINIM | 5 + source/unres/src_Eshel/COMMON.MUCA | 10 + source/unres/src_Eshel/COMMON.NAMES | 7 + source/unres/src_Eshel/COMMON.REMD | 36 + source/unres/src_Eshel/COMMON.SBRIDGE | 12 + source/unres/src_Eshel/COMMON.SCCOR | 17 + source/unres/src_Eshel/COMMON.SCROT | 3 + source/unres/src_Eshel/COMMON.SETUP | 21 + source/unres/src_Eshel/COMMON.SPLITELE | 2 + source/unres/src_Eshel/COMMON.THREAD | 7 + source/unres/src_Eshel/COMMON.TIME1 | 28 + source/unres/src_Eshel/COMMON.TORCNSTR | 6 + source/unres/src_Eshel/COMMON.TORSION | 23 + source/unres/src_Eshel/COMMON.VAR | 21 + source/unres/src_Eshel/COMMON.VECTORS | 3 + source/unres/src_Eshel/DIMENSIONS | 139 + source/unres/src_Eshel/DIMENSIONS.2100 | 80 + source/unres/src_Eshel/DIMENSIONS.4100 | 80 + source/unres/src_Eshel/MP.F | 516 + source/unres/src_Eshel/Makefile | 1 + source/unres/src_Eshel/Makefile_MPICH_ifort | 124 + source/unres/src_Eshel/Makefile_single_gfortran | 128 + source/unres/src_Eshel/Makefile_single_ifort | 104 + .../OLD-Makefiles/Makefile-intrepid-with-tau | 154 + .../OLD-Makefiles/Makefile.tau-mpi-f77-pdt | 860 ++ .../unres/src_Eshel/OLD-Makefiles/Makefile_aix_xlf | 113 + .../unres/src_Eshel/OLD-Makefiles/Makefile_bigben | 138 + .../OLD-Makefiles/Makefile_bigben-oldparm | 136 + .../src_Eshel/OLD-Makefiles/Makefile_bigben-tau | 137 + .../unres/src_Eshel/OLD-Makefiles/Makefile_galera | 147 + .../src_Eshel/OLD-Makefiles/Makefile_intrepid | 151 + .../OLD-Makefiles/Makefile_lnx_ifc10_opteron | 143 + .../Makefile_lnx_ifc10_opteron_oldparm | 143 + source/unres/src_Eshel/README | 2 + source/unres/src_Eshel/SRC-SURPLUS/COMMON.MD | 77 + source/unres/src_Eshel/SRC-SURPLUS/MD_A-MTS.F | 3461 +++++++ source/unres/src_Eshel/SRC-SURPLUS/MREMD.F | 2102 ++++ source/unres/src_Eshel/SRC-SURPLUS/add.f | 28 + source/unres/src_Eshel/SRC-SURPLUS/banach.f | 99 + source/unres/src_Eshel/SRC-SURPLUS/blas.f | 575 + .../unres/src_Eshel/SRC-SURPLUS/check_sc_distr.f | 43 + source/unres/src_Eshel/SRC-SURPLUS/compare_s1.F | 188 + source/unres/src_Eshel/SRC-SURPLUS/eigen.f | 2351 +++++ .../SRC-SURPLUS/energy_p_new-sep_barrier.F | 2322 +++++ .../unres/src_Eshel/SRC-SURPLUS/energy_split-sep.F | 476 + source/unres/src_Eshel/SRC-SURPLUS/entmcm.F | 684 ++ source/unres/src_Eshel/SRC-SURPLUS/gauss.f | 69 + .../unres/src_Eshel/SRC-SURPLUS/kinetic_lesyng.f | 104 + .../src_Eshel/SRC-SURPLUS/lagrangian_lesyng.F | 726 ++ source/unres/src_Eshel/SRC-SURPLUS/mc.F | 819 ++ source/unres/src_Eshel/SRC-SURPLUS/mcm.F | 1481 +++ source/unres/src_Eshel/SRC-SURPLUS/minim_mcmf.F | 121 + source/unres/src_Eshel/SRC-SURPLUS/moments.f | 328 + source/unres/src_Eshel/SRC-SURPLUS/muca_md.f | 334 + source/unres/src_Eshel/SRC-SURPLUS/prng_32.F | 1077 ++ source/unres/src_Eshel/SRC-SURPLUS/q_measure.F | 487 + source/unres/src_Eshel/SRC-SURPLUS/q_measure1.F | 470 + source/unres/src_Eshel/SRC-SURPLUS/q_measure3.F | 529 + source/unres/src_Eshel/SRC-SURPLUS/rattle.F | 706 ++ source/unres/src_Eshel/SRC-SURPLUS/sort.f | 589 ++ source/unres/src_Eshel/SRC-SURPLUS/stochfric.F | 626 ++ source/unres/src_Eshel/SRC-SURPLUS/surfatom.f | 494 + source/unres/src_Eshel/SRC-SURPLUS/test.F | 863 ++ source/unres/src_Eshel/SRC-SURPLUS/thread.F | 549 + source/unres/src_Eshel/arcos.f | 9 + source/unres/src_Eshel/bond_move.f | 124 + source/unres/src_Eshel/cartder.F | 314 + source/unres/src_Eshel/cartprint.f | 19 + source/unres/src_Eshel/chainbuild.F | 274 + source/unres/src_Eshel/change.awk | 11 + source/unres/src_Eshel/check_bond.f | 20 + source/unres/src_Eshel/checkder_p.F | 618 ++ source/unres/src_Eshel/compinfo.c | 82 + source/unres/src_Eshel/contact.f | 195 + source/unres/src_Eshel/convert.f | 196 + source/unres/src_Eshel/cored.f | 3151 ++++++ source/unres/src_Eshel/dihed_cons.F | 185 + source/unres/src_Eshel/djacob.f | 107 + source/unres/src_Eshel/econstr_local.F | 91 + source/unres/src_Eshel/elecont.f | 509 + source/unres/src_Eshel/energy_p_new_barrier.F | 9316 +++++++++++++++++ source/unres/src_Eshel/fitsq.f | 364 + source/unres/src_Eshel/gen_rand_conf.F | 910 ++ source/unres/src_Eshel/geomout.F | 492 + source/unres/src_Eshel/gnmr1.f | 43 + source/unres/src_Eshel/gradient_p.F | 421 + source/unres/src_Eshel/icant.f | 9 + source/unres/src_Eshel/initialize_p.F | 1390 +++ source/unres/src_Eshel/int_to_cart.f | 278 + source/unres/src_Eshel/intcartderiv.F | 725 ++ source/unres/src_Eshel/intcor.f | 91 + source/unres/src_Eshel/intlocal.f | 517 + source/unres/src_Eshel/local_move.f | 972 ++ source/unres/src_Eshel/map.f | 90 + source/unres/src_Eshel/matmult.f | 18 + source/unres/src_Eshel/minimize_p.F | 641 ++ source/unres/src_Eshel/misc.f | 203 + source/unres/src_Eshel/openunits.F | 367 + source/unres/src_Eshel/parmread.F | 1036 ++ source/unres/src_Eshel/pinorm.f | 17 + source/unres/src_Eshel/printmat.f | 16 + source/unres/src_Eshel/prng.f | 525 + source/unres/src_Eshel/proc_proc.c | 139 + source/unres/src_Eshel/randgens.f | 99 + source/unres/src_Eshel/readpdb.F | 441 + source/unres/src_Eshel/readrtns.F | 1700 +++ source/unres/src_Eshel/refsys.f | 60 + source/unres/src_Eshel/regularize.F | 76 + source/unres/src_Eshel/rescode.f | 32 + source/unres/src_Eshel/rmdd.f | 159 + source/unres/src_Eshel/rmsd.F | 140 + source/unres/src_Eshel/sc_move.F | 823 ++ source/unres/src_Eshel/sizes.i | 83 + source/unres/src_Eshel/sumsld.f | 1446 +++ source/unres/src_Eshel/timing.F | 344 + source/unres/src_Eshel/unres.F | 210 + source/unres/src_Eshel/xdrf | 1 + source/unres/src_MD-M/CMakeCache.txt | 326 + .../unres/src_MD-M/CMakeFiles/CMakeCCompiler.cmake | 41 + .../src_MD-M/CMakeFiles/CMakeCXXCompiler.cmake | 42 + .../CMakeFiles/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 6997 bytes .../CMakeFiles/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 7283 bytes .../CMakeDetermineCompilerABI_Fortran.bin | Bin 0 -> 8365 bytes .../src_MD-M/CMakeFiles/CMakeFortranCompiler.cmake | 34 + source/unres/src_MD-M/CMakeFiles/CMakeOutput.log | 380 + source/unres/src_MD-M/CMakeFiles/CMakeSystem.cmake | 15 + .../CMakeFiles/CompilerIdC/CMakeCCompilerId.c | 188 + source/unres/src_MD-M/CMakeFiles/CompilerIdC/a.out | Bin 0 -> 6478 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 175 + .../unres/src_MD-M/CMakeFiles/CompilerIdCXX/a.out | Bin 0 -> 6851 bytes .../CompilerIdFortran/CMakeFortranCompilerId.F | 108 + .../src_MD-M/CMakeFiles/CompilerIdFortran/a.out | Bin 0 -> 7916 bytes source/unres/src_MD-M/CMakeFiles/cmake.check_cache | 1 + source/unres/src_MD-M/energy_p_new_barrier.F.orig | 8915 ++++++++++++++++ source/unres/src_MD-NEWSC/CMakeLists.txt | 398 + source/unres/src_MD-NEWSC/COMMON.BOUNDS | 2 + source/unres/src_MD-NEWSC/COMMON.CACHE | 6 + source/unres/src_MD-NEWSC/COMMON.CALC | 15 + source/unres/src_MD-NEWSC/COMMON.CHAIN | 13 + source/unres/src_MD-NEWSC/COMMON.CONTACTS | 82 + source/unres/src_MD-NEWSC/COMMON.CONTACTS.moment | 68 + source/unres/src_MD-NEWSC/COMMON.CONTROL | 13 + source/unres/src_MD-NEWSC/COMMON.DBASE | 3 + source/unres/src_MD-NEWSC/COMMON.DERIV | 40 + source/unres/src_MD-NEWSC/COMMON.DISTFIT | 14 + source/unres/src_MD-NEWSC/COMMON.EMP | 126 + source/unres/src_MD-NEWSC/COMMON.FFIELD | 26 + source/unres/src_MD-NEWSC/COMMON.GEO | 2 + source/unres/src_MD-NEWSC/COMMON.HAIRPIN | 5 + source/unres/src_MD-NEWSC/COMMON.HEADER | 2 + source/unres/src_MD-NEWSC/COMMON.INFO | 21 + source/unres/src_MD-NEWSC/COMMON.INTERACT | 45 + source/unres/src_MD-NEWSC/COMMON.IOUNITS | 69 + source/unres/src_MD-NEWSC/COMMON.LANGEVIN | 21 + source/unres/src_MD-NEWSC/COMMON.LANGEVIN.lang0 | 11 + source/unres/src_MD-NEWSC/COMMON.LOCAL | 55 + source/unres/src_MD-NEWSC/COMMON.LOCMOVE | 19 + source/unres/src_MD-NEWSC/COMMON.MAP | 4 + source/unres/src_MD-NEWSC/COMMON.MAXGRAD | 12 + source/unres/src_MD-NEWSC/COMMON.MCE | 13 + source/unres/src_MD-NEWSC/COMMON.MCM | 70 + source/unres/src_MD-NEWSC/COMMON.MD | 77 + source/unres/src_MD-NEWSC/COMMON.MINIM | 5 + source/unres/src_MD-NEWSC/COMMON.MUCA | 10 + source/unres/src_MD-NEWSC/COMMON.NAMES | 7 + source/unres/src_MD-NEWSC/COMMON.REMD | 36 + source/unres/src_MD-NEWSC/COMMON.SBRIDGE | 17 + source/unres/src_MD-NEWSC/COMMON.SCCOR | 17 + source/unres/src_MD-NEWSC/COMMON.SCROT | 3 + source/unres/src_MD-NEWSC/COMMON.SETUP | 21 + source/unres/src_MD-NEWSC/COMMON.SPLITELE | 2 + source/unres/src_MD-NEWSC/COMMON.THREAD | 7 + source/unres/src_MD-NEWSC/COMMON.TIME1 | 28 + source/unres/src_MD-NEWSC/COMMON.TORCNSTR | 6 + source/unres/src_MD-NEWSC/COMMON.TORSION | 23 + source/unres/src_MD-NEWSC/COMMON.VAR | 21 + source/unres/src_MD-NEWSC/COMMON.VECTORS | 3 + source/unres/src_MD-NEWSC/DIMENSIONS | 139 + source/unres/src_MD-NEWSC/DIMENSIONS.2100 | 80 + source/unres/src_MD-NEWSC/DIMENSIONS.4100 | 80 + source/unres/src_MD-NEWSC/MD_A-MTS.F | 3461 +++++++ source/unres/src_MD-NEWSC/MP.F | 516 + source/unres/src_MD-NEWSC/MREMD.F | 2102 ++++ source/unres/src_MD-NEWSC/Makefile | 1 + .../unres/src_MD-NEWSC/Makefile-intrepid-with-tau | 154 + source/unres/src_MD-NEWSC/Makefile.tau-mpi-f77-pdt | 860 ++ source/unres/src_MD-NEWSC/Makefile_MPICH_ifort | 127 + .../src_MD-NEWSC/Makefile_MPICH_ifort_09_05_2013 | 127 + source/unres/src_MD-NEWSC/Makefile_aix_xlf | 113 + source/unres/src_MD-NEWSC/Makefile_bigben | 138 + source/unres/src_MD-NEWSC/Makefile_bigben-oldparm | 136 + source/unres/src_MD-NEWSC/Makefile_bigben-tau | 137 + source/unres/src_MD-NEWSC/Makefile_galera | 147 + source/unres/src_MD-NEWSC/Makefile_gitdefault | 127 + source/unres/src_MD-NEWSC/Makefile_intrepid | 151 + source/unres/src_MD-NEWSC/Makefile_single_gfortran | 130 + source/unres/src_MD-NEWSC/Makefile_single_ifort | 127 + source/unres/src_MD-NEWSC/README | 2 + source/unres/src_MD-NEWSC/add.f | 28 + source/unres/src_MD-NEWSC/arcos.f | 9 + source/unres/src_MD-NEWSC/banach.f | 99 + source/unres/src_MD-NEWSC/blas.f | 575 + source/unres/src_MD-NEWSC/bond_move.f | 124 + source/unres/src_MD-NEWSC/build.txt | 1 + source/unres/src_MD-NEWSC/cartder.F | 314 + source/unres/src_MD-NEWSC/cartprint.f | 19 + source/unres/src_MD-NEWSC/chainbuild.F | 274 + source/unres/src_MD-NEWSC/change.awk | 11 + source/unres/src_MD-NEWSC/check_bond.f | 20 + source/unres/src_MD-NEWSC/check_sc_distr.f | 43 + source/unres/src_MD-NEWSC/checkder_p.F | 713 ++ source/unres/src_MD-NEWSC/compare_s1.F | 188 + source/unres/src_MD-NEWSC/compinfo.c | 82 + source/unres/src_MD-NEWSC/contact.f | 195 + source/unres/src_MD-NEWSC/convert.f | 196 + source/unres/src_MD-NEWSC/cored.f | 3151 ++++++ source/unres/src_MD-NEWSC/dihed_cons.F | 185 + source/unres/src_MD-NEWSC/djacob.f | 107 + source/unres/src_MD-NEWSC/econstr_local.F | 91 + source/unres/src_MD-NEWSC/eigen.f | 2351 +++++ source/unres/src_MD-NEWSC/elecont.f | 509 + .../unres/src_MD-NEWSC/energy_p_new-sep_barrier.F | 2322 +++++ source/unres/src_MD-NEWSC/energy_p_new_barrier.F |10943 +++++++++++++++++++ .../src_MD-NEWSC/energy_p_new_barrier_v3ok1.F |10958 ++++++++++++++++++++ source/unres/src_MD-NEWSC/energy_split-sep.F | 476 + source/unres/src_MD-NEWSC/entmcm.F | 684 ++ source/unres/src_MD-NEWSC/fitsq.f | 364 + source/unres/src_MD-NEWSC/gauss.f | 69 + source/unres/src_MD-NEWSC/gen_rand_conf.F | 910 ++ source/unres/src_MD-NEWSC/geomout.F | 507 + source/unres/src_MD-NEWSC/gnmr1.f | 43 + source/unres/src_MD-NEWSC/gradient_p.F | 421 + source/unres/src_MD-NEWSC/initialize_p.F | 1399 +++ source/unres/src_MD-NEWSC/int_to_cart.f | 278 + source/unres/src_MD-NEWSC/intcartderiv.F | 725 ++ source/unres/src_MD-NEWSC/intcor.f | 91 + source/unres/src_MD-NEWSC/intlocal.f | 517 + source/unres/src_MD-NEWSC/kinetic_lesyng.f | 104 + source/unres/src_MD-NEWSC/lagrangian_lesyng.F | 726 ++ source/unres/src_MD-NEWSC/local_move.f | 972 ++ source/unres/src_MD-NEWSC/map.f | 90 + source/unres/src_MD-NEWSC/matmult.f | 18 + source/unres/src_MD-NEWSC/mc.F | 819 ++ source/unres/src_MD-NEWSC/mcm.F | 1481 +++ source/unres/src_MD-NEWSC/minim_mcmf.F | 121 + source/unres/src_MD-NEWSC/minimize_p.F | 641 ++ source/unres/src_MD-NEWSC/misc.f | 203 + source/unres/src_MD-NEWSC/moments.f | 328 + source/unres/src_MD-NEWSC/muca_md.f | 334 + source/unres/src_MD-NEWSC/parmread.F | 1223 +++ source/unres/src_MD-NEWSC/parmread_v3ok1.F | 1250 +++ source/unres/src_MD-NEWSC/pinorm.f | 17 + source/unres/src_MD-NEWSC/printmat.f | 16 + source/unres/src_MD-NEWSC/prng.f | 525 + source/unres/src_MD-NEWSC/prng_32.F | 1077 ++ source/unres/src_MD-NEWSC/proc_proc.c | 139 + source/unres/src_MD-NEWSC/q_measure.F | 487 + source/unres/src_MD-NEWSC/q_measure1.F | 470 + source/unres/src_MD-NEWSC/q_measure3.F | 529 + source/unres/src_MD-NEWSC/randgens.f | 99 + source/unres/src_MD-NEWSC/rattle.F | 706 ++ source/unres/src_MD-NEWSC/readpdb.F | 432 + source/unres/src_MD-NEWSC/readrtns.F | 2711 +++++ source/unres/src_MD-NEWSC/refsys.f | 60 + source/unres/src_MD-NEWSC/regularize.F | 76 + source/unres/src_MD-NEWSC/rescode.f | 32 + source/unres/src_MD-NEWSC/rmdd.f | 159 + source/unres/src_MD-NEWSC/rmsd.F | 140 + source/unres/src_MD-NEWSC/sc_move.F | 823 ++ source/unres/src_MD-NEWSC/sizes.i | 83 + source/unres/src_MD-NEWSC/sort.f | 589 ++ source/unres/src_MD-NEWSC/ssMD.F | 1951 ++++ source/unres/src_MD-NEWSC/stochfric.F | 626 ++ source/unres/src_MD-NEWSC/sumsld.f | 1446 +++ source/unres/src_MD-NEWSC/surfatom.f | 494 + source/unres/src_MD-NEWSC/test.F | 863 ++ source/unres/src_MD-NEWSC/thread.F | 549 + source/unres/src_MD-NEWSC/timing.F | 344 + source/unres/src_MD-NEWSC/unres.F | 799 ++ source/unres/src_MD-NEWSC/xdrf/CMakeLists.txt | 19 + source/unres/src_MD-NEWSC/xdrf/Makefile | 27 + source/unres/src_MD-NEWSC/xdrf/Makefile_jubl | 31 + source/unres/src_MD-NEWSC/xdrf/Makefile_linux | 27 + source/unres/src_MD-NEWSC/xdrf/RS6K.m4 | 20 + source/unres/src_MD-NEWSC/xdrf/ftocstr.c | 35 + source/unres/src_MD-NEWSC/xdrf/libxdrf.m4 | 1238 +++ source/unres/src_MD-NEWSC/xdrf/types.h | 99 + source/unres/src_MD-NEWSC/xdrf/underscore.m4 | 19 + source/unres/src_MD-NEWSC/xdrf/xdr.c | 752 ++ source/unres/src_MD-NEWSC/xdrf/xdr.h | 379 + source/unres/src_MD-NEWSC/xdrf/xdr_array.c | 174 + source/unres/src_MD-NEWSC/xdrf/xdr_float.c | 307 + source/unres/src_MD-NEWSC/xdrf/xdr_stdio.c | 196 + source/unres/src_MD-NEWSC/xdrf/xdrf.h | 10 + source/unres/src_MD/Makefile~HEAD | 1 + source/unres/src_MD/readrtns.F.orig | 2668 +++++ source/wham/src/DIMENSIONS.FREE.orig | 14 + source/wham/src/DIMENSIONS.orig | 142 + source/wham/src/cxread.F.orig | 330 + source/wham/src/readrtns.F.orig | 779 ++ 332 files changed, 149778 insertions(+) create mode 100755 bin/unres/MD/unres_gfortran_single_decoy_E0LL2Y.exe create mode 100755 bin/unres/MD/unres_gfortran_single_decoy_GAB.exe create mode 100755 bin/unres/MD/unres_mchain-ifort_MPICH_GAB-NEWC.exe create mode 100644 examples/unres/new/MREMD/ff_gab/1L2Y_MREMD.inp.orig create mode 100644 source/unres/src_Eshel/CMakeLists.txt create mode 100644 source/unres/src_Eshel/COMMON.BOUNDS create mode 100644 source/unres/src_Eshel/COMMON.CACHE create mode 100644 source/unres/src_Eshel/COMMON.CALC create mode 100644 source/unres/src_Eshel/COMMON.CHAIN create mode 100644 source/unres/src_Eshel/COMMON.CONTACTS create mode 100644 source/unres/src_Eshel/COMMON.CONTACTS.moment create mode 100644 source/unres/src_Eshel/COMMON.CONTROL create mode 100644 source/unres/src_Eshel/COMMON.DBASE create mode 100644 source/unres/src_Eshel/COMMON.DERIV create mode 100644 source/unres/src_Eshel/COMMON.DISTFIT create mode 100644 source/unres/src_Eshel/COMMON.ECOMPON create mode 100644 source/unres/src_Eshel/COMMON.FFIELD create mode 100644 source/unres/src_Eshel/COMMON.GEO create mode 100644 source/unres/src_Eshel/COMMON.HAIRPIN create mode 100644 source/unres/src_Eshel/COMMON.HEADER create mode 100644 source/unres/src_Eshel/COMMON.INFO create mode 100644 source/unres/src_Eshel/COMMON.INTERACT create mode 100644 source/unres/src_Eshel/COMMON.IOUNITS create mode 100644 source/unres/src_Eshel/COMMON.LANGEVIN create mode 100644 source/unres/src_Eshel/COMMON.LANGEVIN.lang0 create mode 100644 source/unres/src_Eshel/COMMON.LOCAL create mode 100644 source/unres/src_Eshel/COMMON.LOCMOVE create mode 100644 source/unres/src_Eshel/COMMON.MAP create mode 100644 source/unres/src_Eshel/COMMON.MAXGRAD create mode 100644 source/unres/src_Eshel/COMMON.MCE create mode 100644 source/unres/src_Eshel/COMMON.MCM create mode 100644 source/unres/src_Eshel/COMMON.MD create mode 100644 source/unres/src_Eshel/COMMON.MINIM create mode 100644 source/unres/src_Eshel/COMMON.MUCA create mode 100644 source/unres/src_Eshel/COMMON.NAMES create mode 100644 source/unres/src_Eshel/COMMON.REMD create mode 100644 source/unres/src_Eshel/COMMON.SBRIDGE create mode 100644 source/unres/src_Eshel/COMMON.SCCOR create mode 100644 source/unres/src_Eshel/COMMON.SCROT create mode 100644 source/unres/src_Eshel/COMMON.SETUP create mode 100644 source/unres/src_Eshel/COMMON.SPLITELE create mode 100644 source/unres/src_Eshel/COMMON.THREAD create mode 100644 source/unres/src_Eshel/COMMON.TIME1 create mode 100644 source/unres/src_Eshel/COMMON.TORCNSTR create mode 100644 source/unres/src_Eshel/COMMON.TORSION create mode 100644 source/unres/src_Eshel/COMMON.VAR create mode 100644 source/unres/src_Eshel/COMMON.VECTORS create mode 100644 source/unres/src_Eshel/DIMENSIONS create mode 100644 source/unres/src_Eshel/DIMENSIONS.2100 create mode 100644 source/unres/src_Eshel/DIMENSIONS.4100 create mode 100644 source/unres/src_Eshel/MP.F create mode 120000 source/unres/src_Eshel/Makefile create mode 100644 source/unres/src_Eshel/Makefile_MPICH_ifort create mode 100644 source/unres/src_Eshel/Makefile_single_gfortran create mode 100644 source/unres/src_Eshel/Makefile_single_ifort create mode 100644 source/unres/src_Eshel/OLD-Makefiles/Makefile-intrepid-with-tau create mode 100644 source/unres/src_Eshel/OLD-Makefiles/Makefile.tau-mpi-f77-pdt create mode 100644 source/unres/src_Eshel/OLD-Makefiles/Makefile_aix_xlf create mode 100644 source/unres/src_Eshel/OLD-Makefiles/Makefile_bigben create mode 100644 source/unres/src_Eshel/OLD-Makefiles/Makefile_bigben-oldparm create mode 100644 source/unres/src_Eshel/OLD-Makefiles/Makefile_bigben-tau create mode 100644 source/unres/src_Eshel/OLD-Makefiles/Makefile_galera create mode 100644 source/unres/src_Eshel/OLD-Makefiles/Makefile_intrepid create mode 100644 source/unres/src_Eshel/OLD-Makefiles/Makefile_lnx_ifc10_opteron create mode 100644 source/unres/src_Eshel/OLD-Makefiles/Makefile_lnx_ifc10_opteron_oldparm create mode 100644 source/unres/src_Eshel/README create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/COMMON.MD create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/MD_A-MTS.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/MREMD.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/add.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/banach.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/blas.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/check_sc_distr.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/compare_s1.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/eigen.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/energy_p_new-sep_barrier.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/energy_split-sep.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/entmcm.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/gauss.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/kinetic_lesyng.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/lagrangian_lesyng.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/mc.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/mcm.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/minim_mcmf.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/moments.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/muca_md.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/prng_32.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/q_measure.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/q_measure1.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/q_measure3.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/rattle.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/sort.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/stochfric.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/surfatom.f create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/test.F create mode 100644 source/unres/src_Eshel/SRC-SURPLUS/thread.F create mode 100644 source/unres/src_Eshel/arcos.f create mode 100644 source/unres/src_Eshel/bond_move.f create mode 100644 source/unres/src_Eshel/cartder.F create mode 100644 source/unres/src_Eshel/cartprint.f create mode 100644 source/unres/src_Eshel/chainbuild.F create mode 100644 source/unres/src_Eshel/change.awk create mode 100644 source/unres/src_Eshel/check_bond.f create mode 100644 source/unres/src_Eshel/checkder_p.F create mode 100644 source/unres/src_Eshel/compinfo.c create mode 100644 source/unres/src_Eshel/contact.f create mode 100644 source/unres/src_Eshel/convert.f create mode 100644 source/unres/src_Eshel/cored.f create mode 100644 source/unres/src_Eshel/dihed_cons.F create mode 100644 source/unres/src_Eshel/djacob.f create mode 100644 source/unres/src_Eshel/econstr_local.F create mode 100644 source/unres/src_Eshel/elecont.f create mode 100644 source/unres/src_Eshel/energy_p_new_barrier.F create mode 100644 source/unres/src_Eshel/fitsq.f create mode 100644 source/unres/src_Eshel/gen_rand_conf.F create mode 100644 source/unres/src_Eshel/geomout.F create mode 100644 source/unres/src_Eshel/gnmr1.f create mode 100644 source/unres/src_Eshel/gradient_p.F create mode 100644 source/unres/src_Eshel/icant.f create mode 100644 source/unres/src_Eshel/initialize_p.F create mode 100644 source/unres/src_Eshel/int_to_cart.f create mode 100644 source/unres/src_Eshel/intcartderiv.F create mode 100644 source/unres/src_Eshel/intcor.f create mode 100644 source/unres/src_Eshel/intlocal.f create mode 100644 source/unres/src_Eshel/local_move.f create mode 100644 source/unres/src_Eshel/map.f create mode 100644 source/unres/src_Eshel/matmult.f create mode 100644 source/unres/src_Eshel/minimize_p.F create mode 100644 source/unres/src_Eshel/misc.f create mode 100644 source/unres/src_Eshel/openunits.F create mode 100644 source/unres/src_Eshel/parmread.F create mode 100644 source/unres/src_Eshel/pinorm.f create mode 100644 source/unres/src_Eshel/printmat.f create mode 100644 source/unres/src_Eshel/prng.f create mode 100644 source/unres/src_Eshel/proc_proc.c create mode 100644 source/unres/src_Eshel/randgens.f create mode 100644 source/unres/src_Eshel/readpdb.F create mode 100644 source/unres/src_Eshel/readrtns.F create mode 100644 source/unres/src_Eshel/refsys.f create mode 100644 source/unres/src_Eshel/regularize.F create mode 100644 source/unres/src_Eshel/rescode.f create mode 100644 source/unres/src_Eshel/rmdd.f create mode 100644 source/unres/src_Eshel/rmsd.F create mode 100644 source/unres/src_Eshel/sc_move.F create mode 100644 source/unres/src_Eshel/sizes.i create mode 100644 source/unres/src_Eshel/sumsld.f create mode 100644 source/unres/src_Eshel/timing.F create mode 100644 source/unres/src_Eshel/unres.F create mode 120000 source/unres/src_Eshel/xdrf create mode 100644 source/unres/src_MD-M/CMakeCache.txt create mode 100644 source/unres/src_MD-M/CMakeFiles/CMakeCCompiler.cmake create mode 100644 source/unres/src_MD-M/CMakeFiles/CMakeCXXCompiler.cmake create mode 100755 source/unres/src_MD-M/CMakeFiles/CMakeDetermineCompilerABI_C.bin create mode 100755 source/unres/src_MD-M/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin create mode 100755 source/unres/src_MD-M/CMakeFiles/CMakeDetermineCompilerABI_Fortran.bin create mode 100644 source/unres/src_MD-M/CMakeFiles/CMakeFortranCompiler.cmake create mode 100644 source/unres/src_MD-M/CMakeFiles/CMakeOutput.log create mode 100644 source/unres/src_MD-M/CMakeFiles/CMakeSystem.cmake create mode 100644 source/unres/src_MD-M/CMakeFiles/CompilerIdC/CMakeCCompilerId.c create mode 100755 source/unres/src_MD-M/CMakeFiles/CompilerIdC/a.out create mode 100644 source/unres/src_MD-M/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 source/unres/src_MD-M/CMakeFiles/CompilerIdCXX/a.out create mode 100644 source/unres/src_MD-M/CMakeFiles/CompilerIdFortran/CMakeFortranCompilerId.F create mode 100755 source/unres/src_MD-M/CMakeFiles/CompilerIdFortran/a.out create mode 100644 source/unres/src_MD-M/CMakeFiles/cmake.check_cache create mode 100644 source/unres/src_MD-M/energy_p_new_barrier.F.orig create mode 100644 source/unres/src_MD-NEWSC/CMakeLists.txt create mode 100644 source/unres/src_MD-NEWSC/COMMON.BOUNDS create mode 100644 source/unres/src_MD-NEWSC/COMMON.CACHE create mode 100644 source/unres/src_MD-NEWSC/COMMON.CALC create mode 100644 source/unres/src_MD-NEWSC/COMMON.CHAIN create mode 100644 source/unres/src_MD-NEWSC/COMMON.CONTACTS create mode 100644 source/unres/src_MD-NEWSC/COMMON.CONTACTS.moment create mode 100644 source/unres/src_MD-NEWSC/COMMON.CONTROL create mode 100644 source/unres/src_MD-NEWSC/COMMON.DBASE create mode 100644 source/unres/src_MD-NEWSC/COMMON.DERIV create mode 100644 source/unres/src_MD-NEWSC/COMMON.DISTFIT create mode 100644 source/unres/src_MD-NEWSC/COMMON.EMP create mode 100644 source/unres/src_MD-NEWSC/COMMON.FFIELD create mode 100644 source/unres/src_MD-NEWSC/COMMON.GEO create mode 100644 source/unres/src_MD-NEWSC/COMMON.HAIRPIN create mode 100644 source/unres/src_MD-NEWSC/COMMON.HEADER create mode 100644 source/unres/src_MD-NEWSC/COMMON.INFO create mode 100644 source/unres/src_MD-NEWSC/COMMON.INTERACT create mode 100644 source/unres/src_MD-NEWSC/COMMON.IOUNITS create mode 100644 source/unres/src_MD-NEWSC/COMMON.LANGEVIN create mode 100644 source/unres/src_MD-NEWSC/COMMON.LANGEVIN.lang0 create mode 100644 source/unres/src_MD-NEWSC/COMMON.LOCAL create mode 100644 source/unres/src_MD-NEWSC/COMMON.LOCMOVE create mode 100644 source/unres/src_MD-NEWSC/COMMON.MAP create mode 100644 source/unres/src_MD-NEWSC/COMMON.MAXGRAD create mode 100644 source/unres/src_MD-NEWSC/COMMON.MCE create mode 100644 source/unres/src_MD-NEWSC/COMMON.MCM create mode 100644 source/unres/src_MD-NEWSC/COMMON.MD create mode 100644 source/unres/src_MD-NEWSC/COMMON.MINIM create mode 100644 source/unres/src_MD-NEWSC/COMMON.MUCA create mode 100644 source/unres/src_MD-NEWSC/COMMON.NAMES create mode 100644 source/unres/src_MD-NEWSC/COMMON.REMD create mode 100644 source/unres/src_MD-NEWSC/COMMON.SBRIDGE create mode 100644 source/unres/src_MD-NEWSC/COMMON.SCCOR create mode 100644 source/unres/src_MD-NEWSC/COMMON.SCROT create mode 100644 source/unres/src_MD-NEWSC/COMMON.SETUP create mode 100644 source/unres/src_MD-NEWSC/COMMON.SPLITELE create mode 100644 source/unres/src_MD-NEWSC/COMMON.THREAD create mode 100644 source/unres/src_MD-NEWSC/COMMON.TIME1 create mode 100644 source/unres/src_MD-NEWSC/COMMON.TORCNSTR create mode 100644 source/unres/src_MD-NEWSC/COMMON.TORSION create mode 100644 source/unres/src_MD-NEWSC/COMMON.VAR create mode 100644 source/unres/src_MD-NEWSC/COMMON.VECTORS create mode 100644 source/unres/src_MD-NEWSC/DIMENSIONS create mode 100644 source/unres/src_MD-NEWSC/DIMENSIONS.2100 create mode 100644 source/unres/src_MD-NEWSC/DIMENSIONS.4100 create mode 100644 source/unres/src_MD-NEWSC/MD_A-MTS.F create mode 100644 source/unres/src_MD-NEWSC/MP.F create mode 100644 source/unres/src_MD-NEWSC/MREMD.F create mode 120000 source/unres/src_MD-NEWSC/Makefile create mode 100644 source/unres/src_MD-NEWSC/Makefile-intrepid-with-tau create mode 100644 source/unres/src_MD-NEWSC/Makefile.tau-mpi-f77-pdt create mode 100644 source/unres/src_MD-NEWSC/Makefile_MPICH_ifort create mode 100644 source/unres/src_MD-NEWSC/Makefile_MPICH_ifort_09_05_2013 create mode 100644 source/unres/src_MD-NEWSC/Makefile_aix_xlf create mode 100644 source/unres/src_MD-NEWSC/Makefile_bigben create mode 100644 source/unres/src_MD-NEWSC/Makefile_bigben-oldparm create mode 100644 source/unres/src_MD-NEWSC/Makefile_bigben-tau create mode 100644 source/unres/src_MD-NEWSC/Makefile_galera create mode 100644 source/unres/src_MD-NEWSC/Makefile_gitdefault create mode 100644 source/unres/src_MD-NEWSC/Makefile_intrepid create mode 100644 source/unres/src_MD-NEWSC/Makefile_single_gfortran create mode 100644 source/unres/src_MD-NEWSC/Makefile_single_ifort create mode 100644 source/unres/src_MD-NEWSC/README create mode 100644 source/unres/src_MD-NEWSC/add.f create mode 100644 source/unres/src_MD-NEWSC/arcos.f create mode 100644 source/unres/src_MD-NEWSC/banach.f create mode 100644 source/unres/src_MD-NEWSC/blas.f create mode 100644 source/unres/src_MD-NEWSC/bond_move.f create mode 100644 source/unres/src_MD-NEWSC/build.txt create mode 100644 source/unres/src_MD-NEWSC/cartder.F create mode 100644 source/unres/src_MD-NEWSC/cartprint.f create mode 100644 source/unres/src_MD-NEWSC/chainbuild.F create mode 100644 source/unres/src_MD-NEWSC/change.awk create mode 100644 source/unres/src_MD-NEWSC/check_bond.f create mode 100644 source/unres/src_MD-NEWSC/check_sc_distr.f create mode 100644 source/unres/src_MD-NEWSC/checkder_p.F create mode 100644 source/unres/src_MD-NEWSC/compare_s1.F create mode 100644 source/unres/src_MD-NEWSC/compinfo.c create mode 100644 source/unres/src_MD-NEWSC/contact.f create mode 100644 source/unres/src_MD-NEWSC/convert.f create mode 100644 source/unres/src_MD-NEWSC/cored.f create mode 100644 source/unres/src_MD-NEWSC/dihed_cons.F create mode 100644 source/unres/src_MD-NEWSC/djacob.f create mode 100644 source/unres/src_MD-NEWSC/econstr_local.F create mode 100644 source/unres/src_MD-NEWSC/eigen.f create mode 100644 source/unres/src_MD-NEWSC/elecont.f create mode 100644 source/unres/src_MD-NEWSC/energy_p_new-sep_barrier.F create mode 100644 source/unres/src_MD-NEWSC/energy_p_new_barrier.F create mode 100644 source/unres/src_MD-NEWSC/energy_p_new_barrier_v3ok1.F create mode 100644 source/unres/src_MD-NEWSC/energy_split-sep.F create mode 100644 source/unres/src_MD-NEWSC/entmcm.F create mode 100644 source/unres/src_MD-NEWSC/fitsq.f create mode 100644 source/unres/src_MD-NEWSC/gauss.f create mode 100644 source/unres/src_MD-NEWSC/gen_rand_conf.F create mode 100644 source/unres/src_MD-NEWSC/geomout.F create mode 100644 source/unres/src_MD-NEWSC/gnmr1.f create mode 100644 source/unres/src_MD-NEWSC/gradient_p.F create mode 100644 source/unres/src_MD-NEWSC/initialize_p.F create mode 100644 source/unres/src_MD-NEWSC/int_to_cart.f create mode 100644 source/unres/src_MD-NEWSC/intcartderiv.F create mode 100644 source/unres/src_MD-NEWSC/intcor.f create mode 100644 source/unres/src_MD-NEWSC/intlocal.f create mode 100644 source/unres/src_MD-NEWSC/kinetic_lesyng.f create mode 100644 source/unres/src_MD-NEWSC/lagrangian_lesyng.F create mode 100644 source/unres/src_MD-NEWSC/local_move.f create mode 100644 source/unres/src_MD-NEWSC/map.f create mode 100644 source/unres/src_MD-NEWSC/matmult.f create mode 100644 source/unres/src_MD-NEWSC/mc.F create mode 100644 source/unres/src_MD-NEWSC/mcm.F create mode 100644 source/unres/src_MD-NEWSC/minim_mcmf.F create mode 100644 source/unres/src_MD-NEWSC/minimize_p.F create mode 100644 source/unres/src_MD-NEWSC/misc.f create mode 100644 source/unres/src_MD-NEWSC/moments.f create mode 100644 source/unres/src_MD-NEWSC/muca_md.f create mode 100644 source/unres/src_MD-NEWSC/parmread.F create mode 100644 source/unres/src_MD-NEWSC/parmread_v3ok1.F create mode 100644 source/unres/src_MD-NEWSC/pinorm.f create mode 100644 source/unres/src_MD-NEWSC/printmat.f create mode 100644 source/unres/src_MD-NEWSC/prng.f create mode 100644 source/unres/src_MD-NEWSC/prng_32.F create mode 100644 source/unres/src_MD-NEWSC/proc_proc.c create mode 100644 source/unres/src_MD-NEWSC/q_measure.F create mode 100644 source/unres/src_MD-NEWSC/q_measure1.F create mode 100644 source/unres/src_MD-NEWSC/q_measure3.F create mode 100644 source/unres/src_MD-NEWSC/randgens.f create mode 100644 source/unres/src_MD-NEWSC/rattle.F create mode 100644 source/unres/src_MD-NEWSC/readpdb.F create mode 100644 source/unres/src_MD-NEWSC/readrtns.F create mode 100644 source/unres/src_MD-NEWSC/refsys.f create mode 100644 source/unres/src_MD-NEWSC/regularize.F create mode 100644 source/unres/src_MD-NEWSC/rescode.f create mode 100644 source/unres/src_MD-NEWSC/rmdd.f create mode 100644 source/unres/src_MD-NEWSC/rmsd.F create mode 100644 source/unres/src_MD-NEWSC/sc_move.F create mode 100644 source/unres/src_MD-NEWSC/sizes.i create mode 100644 source/unres/src_MD-NEWSC/sort.f create mode 100644 source/unres/src_MD-NEWSC/ssMD.F create mode 100644 source/unres/src_MD-NEWSC/stochfric.F create mode 100644 source/unres/src_MD-NEWSC/sumsld.f create mode 100644 source/unres/src_MD-NEWSC/surfatom.f create mode 100644 source/unres/src_MD-NEWSC/test.F create mode 100644 source/unres/src_MD-NEWSC/thread.F create mode 100644 source/unres/src_MD-NEWSC/timing.F create mode 100644 source/unres/src_MD-NEWSC/unres.F create mode 100644 source/unres/src_MD-NEWSC/xdrf/CMakeLists.txt create mode 100644 source/unres/src_MD-NEWSC/xdrf/Makefile create mode 100644 source/unres/src_MD-NEWSC/xdrf/Makefile_jubl create mode 100644 source/unres/src_MD-NEWSC/xdrf/Makefile_linux create mode 100644 source/unres/src_MD-NEWSC/xdrf/RS6K.m4 create mode 100644 source/unres/src_MD-NEWSC/xdrf/ftocstr.c create mode 100644 source/unres/src_MD-NEWSC/xdrf/libxdrf.m4 create mode 100644 source/unres/src_MD-NEWSC/xdrf/types.h create mode 100644 source/unres/src_MD-NEWSC/xdrf/underscore.m4 create mode 100644 source/unres/src_MD-NEWSC/xdrf/xdr.c create mode 100644 source/unres/src_MD-NEWSC/xdrf/xdr.h create mode 100644 source/unres/src_MD-NEWSC/xdrf/xdr_array.c create mode 100644 source/unres/src_MD-NEWSC/xdrf/xdr_float.c create mode 100644 source/unres/src_MD-NEWSC/xdrf/xdr_stdio.c create mode 100644 source/unres/src_MD-NEWSC/xdrf/xdrf.h create mode 120000 source/unres/src_MD/Makefile~HEAD create mode 100644 source/unres/src_MD/readrtns.F.orig create mode 100644 source/wham/src/DIMENSIONS.FREE.orig create mode 100644 source/wham/src/DIMENSIONS.orig create mode 100644 source/wham/src/cxread.F.orig create mode 100644 source/wham/src/readrtns.F.orig diff --git a/bin/unres/MD/unres_gfortran_single_decoy_E0LL2Y.exe b/bin/unres/MD/unres_gfortran_single_decoy_E0LL2Y.exe new file mode 100755 index 0000000000000000000000000000000000000000..261d557c55acc74056b7c1df36f9151bf123c0e9 GIT binary patch literal 621657 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�Db%ZUd1zplV5qjEx)QA`BU5?kL$$yf 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 literal 0 HcmV?d00001 diff --git a/bin/unres/MD/unres_gfortran_single_decoy_GAB.exe b/bin/unres/MD/unres_gfortran_single_decoy_GAB.exe new file mode 100755 index 0000000000000000000000000000000000000000..0fe66b7637d2d26c6c836b98de742b6a1be7edac GIT binary patch literal 618038 zcmd44eOy&l_CJ1kxJCtDEFmf_s#{^BhNT51#no$bFf68z6_q81kCP9iQ1)af(0IDu zq8X;Fv0};^XQnAED?q&>ijX}FmKIqmmF2lUBv}@f%J=nGmu5u8|JUvrL>eu0@cAO|Ue=;3uju`y99p^au z0Cx(FDNM`ka;?*%L)REdbvUAMjV2ta36Yr!(ANP9bA+xT4S8jGoqw4cRM*erPY^tG zbvTj*XFlrMs?%HJrwKiDt-DrGM_cyMWCf`U)nmSxeoAgkKb0?Z4b>}j4b_iz$KZd+{sKfeqDW)S2EDpGGX0P*^{@ zmeu|5B^25deS0tbO})?;K(U_WT+@quhDlHSSMxF)x7y8Ct>Q&VX{};XZC8rlT9lgjor58CPdZ}+mFZ2g{ zDR)pW5j??db|%MVZ59+bsF1qQzlKGIC;)&yO3#93a8Az$5v2SD!A=6 zn^!modQF)>Wn#gk!s)gQ(Cps1GYaiOr%s+!h&mMA*_CbXlzV5)o@}EP%()jf>1viK zw4aR!qvX$-oj<9tM>9)hx|=C%l}U5w zPP)$~XwJOjd_C_zgx9QY)ej5EpFU~sqqHh4>ND)R}W8DX2)v5V0yY!IocepJS>D z%UPXr5RQ&{g_F?)M8=(S=FHUcrAUgHJg4Z+nNx&1r(n|EMGCxUNPbWYp%ax{0*M#CJsXa{vt6ij>bP;L;s^?uFM%TDf~xDq)z8maWa=3atasu zJLxK?ou<;1T*54!TqgwqkN7Z6N;)s|j##tfuKJNnwv zBOoZ0U!_NNO@~~j^RIZy&yW`BI78=eIz{!PT%*JZhx!TiuUylqm5!oYnxCsK3<2T4 zHX9uUg#X%Ybk;Zgcd9Cva;u zLVxpZ^n?%**J2x;YrfFmVjDd%M8vh+MnBC)UuvT#+31xv`sp_M3LE_l8@Rz1>E4+vtw| zo$-IZjUHp8Utpuh+vpeC=t(wuijAIZqYtvtQ*88$Z1hwc{WmsxnvFi#M$fd-huG+b zjXu;y&#}=jw$XEK^i&%?&qg0+qffWdFR{@JZ1hWQ^!YaWa2vhYM(3I{^taeXzbr(= zwcJL(+(ut&qo>*El{R|1jlRN0zrseZveB=!(W`Crkv4jrjhkcLheuy}`>|ng$dx^8F4mt$?k~q8QVB1mF ze>?GH;;n*zNSs}AuvzfU#Mu=G>jbYS&Mr7uC3r1ycD=z$!CxoNE;m>%_&!hx*>wez1wTZbT~;t&@V&&@RRtY_e@UEORIu$=@jvlQ;;n*zNSs|#uvzfU z#Mu=E>wx1bf5Q%BnOp8K%rA|S-EBGJvl{E-Z@+y8Df%&-54jKvu-qY)iN*RF2ItqNp|1ZphY*G6ppuTe(H zz6c||WuAMg>uhv*MoC?SVLEq=y3o1cgtLwUL9X3tHY8$IK1{2ycC{xmd6!~C@* zBbar0Uq{hNlEr!)4O>B{z7*j&C z!{7h#;-P288UE-@{BLO9NO<_+O3)6u;v)~aCKOlC=;(kb)U7@S^@}mm4;6it{&S%d zLifE@lJU1IS0+X*xKhepm(*}(T)={q8j7f`R&t_Gpe}tNF_t2mfW^WLkX6#2RJ7CQ z96WSaY`XJKNP6f-W2xbfg*LgGl$ zJvTwF*0p3k^tFmURaV)8jyjNh$2E?1Zu}@(o*9imDRr-a%_}Ef;{aF%@Lv1}Scyw9 z{`;H{8EJ85se3sP!~cpT80JCi7erw#`@=vAM3OQe6d2c?RLfz6lqV5*ygv7HM@LD< zGy@(hoXRp6V<6LImIHhM{Gb*CELLDCKn_+ckz`6)%n~^Q1V-r+`>;f$Tm|`t|3SB* zYPRmq2uDdqe-`H|9Tve#Y#h8Rw#14+J!VEb9NGSv?&;b7$?jCcze*_M%-}e)wI&yW zYxD54ZZdw9v@>Tr#ZL2)QR`d`aG_GP0AR5K3jv07CYhRT{RKL6lnqSRI^RGFQXSdm zH{|#dx{JZG&2Nd{sq6IncGL+*$%RN=Y#zWxs;nG<#Q=TIo!5wa#)Cj(F@a)kJFehQ zS&*&Z8QlsFA_sGR_Y<$XROMfIIZB(M_OEPM6QbP+HLp9VB%}2jvF|9@SMi=$2z?Ts zOhaR8^VswE~~q5e>iZAHy)a(C{yDFNK9zP#O!$ zWP~Jpsykc2SACRc4QQxMoCC0exfrB?=fGGs6rr4=0nscbYA9T^XbwLAAkh1Ne=XD2}4UGn~B@EAoVWwxBhY*3;re=Gj zK1%e6!IVzx5fAWLRk#CSu>zw3hV&qrdhA50wVaCup3-_uAO%%J)Jv4_hd#B;7Wk*; zxT2HeN6Od?4qop(%wG5+uY0igJx0}Hu+&1LF+STJbI5fE`_^oC9&Kk~+NpJJ1Nfp+ zv=v~n0(S!p=}a=qxrpV{w}F*fqZQNuM#>BKXPdx7-Vc7j6$Le6{;CUV2Dn^FuLGzH z+6XXI5XsEEo>iAFp+*;UH7PVsz&rWgzT{b}D?fz=g&IQQi*SiA$}sKG-)~+h`aiub z8rD6wt`1U_krv&^_VD?r|80BtC`z@56_|GGYE=Pz1)7Oj0qgeA29WiF4JrY$J*;(4 zo*(BMtbfCWoh^ctaiDaz2vR;nO?jR7y)x}$OzpJ}ZdefW-i%O-k{lz*sz~6q&=~lfV&p7dc6x|9prjOj%_j1aAGKAzAuP$Om*E{H`SHWT*C$lplLOFZ1l(KXpc^+12xGrwR=x#VG$(-I?^ac8FOno*)?As^}F&Dq%-ShFg z#9a&?T}%s$lJH|ufy|X{iK|=jQ&Wi&YKz~MVmKqp9e|EJw?Aesxv`NlCCaFTn4(rl zM28Cyz%ut@1&nv+0L^w6Fc5RGY}3BT1NbgjNL~s!MonZY0irLWFLD5iFPy8cRwE?{ zhJTqPz);pOM4W1U{gIiJ*XVOJ{9N7ecUkX~#|c4!B+cW~JUL;WzlV7SYMyDrvq~xx zW?Muy>G{spY?+#kRSmP<7S<|7vz@L>oFC@7JY3>n&2#uWrFlV^=hSd$lzRnc%tIbBAZ*20e*y6JF@EjvcP`a9e0_dg5rb?z@`mIVeW6gax;HedkZR zDlM+j>+a9k9aFY@!S4q;D+Rw9ic`odW(Sd3LT#gKA1jByuUJcBzb;7+s)&VSd4RMGT`Pi4zzS6`$v+ z2uA=bC&#)>NU`!^P%N;xq{1Wy%Ypc~>a;#+E#sS}x`xJm4*34axfijqfEKq#(r$`d zjw^Vb#4+(%f5>%Fi?_(QgKbDWl6|wSA@LpKmZ=E z8pGd4qA|c6G(bE(e-Xvvdgwq$hu1gcPv`849aDC|^;jt^j%=|syk`wNc{ZLlpq@bM zkna*Xd5B$`nss&@+h9BBqCu$}cV8UbA0nB@kb-&AZD#^x_XsM5P#cdg+Kqnr2cXoT z5+*b9QDjzr=_9ezK=iN5d^Ta4qn6uUhw3l+!ASQrj(D7Ghmh-Ab~ERKwEf!34!*SfMqXHrO)GW=aRdMfAl zR0GP+-LJ}1aT@DMZ*Y~pfE^<=Ci>Xkm^#ORV8YbRv|h?4Jxa$PoQGAdy~BfTVQBln~5!1-zH|yeOJt782$mDL8s^)xnt({B}2t}<(J%g zsdbKFuBtcUB2nLdOX_nJ0Brz>OTAGSjmtl9t$+M1M^=e-qTwIBO>J3>+~)YhKyF<$ zsQrNf+j#ZVuxVwZi^|OMk4^Hd2Id%x&4juO?(3UvHfNg?IBA9j`Fj#H!!>t3b`O%& zPDfMG9%wQK>cHj6NN)n_0uM&+eo^*N|g}UgF zV`1$0ggKW=C+fx?)y-d4(^<&ByeS3SZAgX%K;I71vL7b@6#=%_j zzS3j>V{)Fprr~<6f52|T9N)6k2r#$9(RMW)*)&~PRyC!xDv6o;nyas=xFS+4l)qQW z1_8j5raaA&rU@-e6;RqVohkm6W5x@oyG`l+LZng|S5+mrszs7g6=?vJzXg*rT~R}* zEXbbYQ>3HG^s8t}6Y?#wtn!kUrHUJc1Hd%#{ZxbxV(l<(Y4}IJZ=HW%Up4G~26uRT zMVMD^GW-UnPXpe8LQACgLCziXCFe*)ZnO*k8&uTB0*+NXTK)k$%E5z7*eUCW+T6na zptw2X7@U<`y!dZNaqWk&vu|*1FZy@Mw-IQfgE}jf|3wX|@Q&@QbK;5CgXP z4N7p1h^R}nrUxYsB(~y44`Uyc(hN&%K{*NMU3NKj!59w;I*5L8gFul2u+KR{Qv1a@ z)zz7RE65k9%TFT&iyhh|(tW#;txQGIt z+PV|&@9UB7$5Y(`cwGw|5@-Wd(*`KZ*FPf5>>p|P`k#O+R*n6!JKMic=g#9g4yB%I z_7W1gp4D_|R#@At{N`-`Shz8ITeWyDcAMiu_})x4eC3X-j-e&w7!a3aq&F1>v-}I= zv1l;Xw>qyg`zK+ql|4aS#J=i~!B!pH9*a7^sV;Bv;!F5jYh9vYCR8cnN_BZ%UEZkp zj2Tv`%bRjZcuQe#t4p=I)ZDa#oVDt*8ka^VX{ef`(fNizY?jU{#jz3>cs6brN>}Er zjzQJdrJ^4VIIxXd)6DT-c5prD_}MVIk1O#gE0<_SXmsa3Zp%8yq|k(M8uxliHYRPr zZZ(2V3a}o+9S`5Y%p~kV{u;Gl5T{dI?sN7E)%Aq+V}vay8hYSQ-%zyMmk^6QMt*&^ zKRYuj;zJ|h=ph6!t* zYMA{DU&>f>W|KA6H?ze8RA<>ca)VpP*rLwHqVFA6<+j^5l=~7Eod)fHiCQpNg2q$B z`Gt|+5t+WFXqVS_w%3=ix~4vHO!`Nz(x*`Al3yYh z4EFfPMpR1(YB@h=Q-*had$#F4MgbT{{PR1~KPmdk8R-n*MCEYr{tH21vy^d z!0Dj!yt+fnXg2)!clauvIC52_qwK>4=Vilgz9m09aMS2IGka6JH)1;sX!zFr?6{Ww z@`E3@d()e-rbVEx|9*pQIt|CItHa4l<-G_073Hv@%g|_i&VAMOiI_jfmenn|M@Cl} z!aQp#_eGxO2`uNYDl(#lGtH3=)nOIxn~%lED9ld|v}4MZKEWMZ^s+DGU;dZf~M4UHyn{;-gs2H1yvU>nS-J zwP2WReq@)KeYCbj`ZU0$@XmXYoD|It@^|$=a2Zk zQec;#yP!U&1qwnSrmW8Om=6@s8vHmsYuTxK&3)Ajg{Y)z#zIt*$J|*>?|P$Bjr`Ae z_YCvy9hmIs{nq`M;=_cP@s7*?F$;s*SpS5>T*Ls$)aUEWsj zm6#b7qLvL2`xYuye9kOU`bzw|O8*I7pL6x8yJ8u)CGC-}$NmHoI-?kB>{-XA5P_T?|M-Msj3>mv4(Fw_s}gs3w>i3cElIqF-+oAWQbCi9yAY=z-RrCCR3k%l(9II1Q%@-8Ox*IIs^dU!2*%iCs5+fgTH=3|B zYegt4?&v(|PE}b)hqGqoH+p^UvSqU)PlLH!kMVJearyhR5CM?kyotF-xh8lIu(QXC zWry=xkahsF)pOL22?yZVuf&g0N!pDe9pd90gKW!~H0qJ2^jKXOs)7!Iw%d z3t1Rz)niyx-=!+;#wsd&k8fJIWQ4^x@x6q_L!qoW%$lQ=9vsfv)rbpbc-Bf2HNWyi z-HvWgnrWwhlcA=v1+0)ufw@ZHXLCbV@S3e2y-`ru&@Ntn@auNP#e4tC4Ey@1tEXgB zgr}r2qJ&M*dnNW!TxAP!%hYR5cE@rmfIic{j^d00do|xfB`n3_ozMTiO3h$s&U=P{ zlu!W@e8nj&R{648gK+8^V+~hoM#*Ra(ebx+?JJWoByxuQyIn}bVnEc-IwuGUp4Ms)H&|`w;|6L zcbVu9W2DCv&f*9-9rlWwFr!Mwz7N#c7aI18F0c)In`GGAfRTwI%3iG~{(i3eL*pK( z7#v}oZ4Qil8`|Mk41S@J@9l0QpZ&N+d86~5(I3m+n$NlQy&-)~=WO71zbxF}jH#@w z=WDs&h7$~prHhuN(B|AlTNM9#7>pg!30@Zl>w26$x-V|(2JflZm%S@)SFG3k)tu?B@c3`y z)@r%O{K#wmiYsOeXvY5Ec5t&U0gHbR zmOx_${WQir=8Y-9O0CDD%sN6iuOAfTl$PygxRE4*d{#z2qxv)SG$GLj;nhR9c*D1XT=a?GG6kN?56 zW6a&?+}gS_kw)@mJO|lk#v0(5mj77_n%7~Dcnt(qkn8acU_>#inPHTF@X2G$mNDjb z&!Fud^N86lv69}fz>P_3W9g#|X?oi0ADrYhUwO0~vFbHTA7!BK%lD+$KXgGiMstZU zdCUgSpdFHhtZAKGEZ5s3SE!J9+(%*|@w-)(jgIsWTxHYX%`t<%^7uzyscQW)rbJR} zXTeFkVzJd>#{C7PM(3aLi?-u1oqq!48)%+}+7H}7IAI}R|6JI<8mKw&E&TfD9x+F( zBrq?^95I>nggf!u=vEdvv zA%b6sU#e-woeu~BY7R^WU?!X;$w~O7OfxP~@Ob=Ed4!MYJXuHy_*D{41%&Nq_CvNk z72A4g;r@0AYjpl&KqF6B0$Lu1?!W2vB#LQt?$57EOd8@H-{|}X(68s5nAzxT4b!#@ z?R3y~1DY~#NLr(FC!ibFJ3y-o^VJI9&sR4(Hv&q3_J$W4odH1C?0N#UYC!Gl^Ur8> zz7FW~m$H%f6+nOR?it(Yd>K&E&6~hid0tu^>)+^n29VNkIUw4g(fLO}CkWI6=q!O2 z0istLoihRP=0T%#Dj>P#D>UBhK)Ik@D$oQ#Fd1ks02(e(HXs~00PPw;rwQZ*gxwR+ zt^$Np0)Wy0;no?TO90^>37{lE{RKJ~5bm*qHWJX~0$l(oO`v2z=>i=)H!bcIf!YD_ zCV8Xt7eKuE+~|x3-#~$Of+qK5oGpOP6xxDEs}fbs=L0%hXmbH23p5kZIRZ@ubgn>o zfX)->RzPln#sfNEpz8o#D3Af@0)a*W;t^BS0}zL_M(1UKE&^o86h!TuImh(f#yy^! z)McW&g=>FxB17Nzx?~%+ere3W8nE*Y zOx0Fy^zO2(4?8+!X&+#u)ZjmMY@&B?W5qmVn3yRoHgGNn0|K{8N`8qh+KY|wC}ZKT zbufC-M^b?RZz9MJ%<33GHSuy!0b6lqf1KpNwjB4+GPog8WI?wWaWJNSEK&qynH#dq zM#F5#GV2U;y^)V;Vz&R@4(#S1mO;Qj{Al^7yo*2J=+b!JkBdE;dj;kRW~5;*Dnm?J_|Qh$z=nv?DWk=P0|%#XD&Nb2Onjd%YMm)*J|_LYfB_C z*~85gBMU1ttBgnNruABBkRD<~XS3$@~vW%9}!fY=;I1OK}|wyclhl zSKb5VwGP+ou+N-2E$TF5{Wp-iscHs5e}8Onj{NiI9I*L-wNK^6 z9%n{mo7Yt0{|fxCLY||kcSoJ3&QO>q8Rl5T!Pt1-IlcM--lfNq=laa0r(D=z~UYkbcu>bWS@*fon4p`NSqR4=pwi3*_h>btm*W&HP0Lq61YA2ja;Rh$k88JBvQSZJKCf;jv2OD|BLRzpqxJ zs-~^tyTsapzkZk47){ZR#%OkeJjWYtWH4%qzG-ycU*lz`fmT@@3^ zca)xL&sox*Q*^M(QN!t;-gcA_k1;Y9@4diL)TRngT5)OL+6e=H+qd_^h0*%*{sTesJC4j!TzZ6~hLx7I_{ksnvo%aG7cW36+lJ`Z&kKZOy(W;0S zqczy*Tv6AcN2nJRl-cN92Ix}!H9DUZ=%cGK*l|GXaj^5O;TWOjwY+t@LT#DIu8;UD zE5E_O%x;{&f8#jwyKMgeTw1U#`vIoCxb0SnWrr8P*jmOtw_8r+o)$)3+)_iNtdA*a zk1qO(`%saHAKYlGPs%F!`NX0%o|65tsgB*9=cInP73p4K_y%BOe*iZ6Cq!WRHX$;J zP%5ERc1m*0c)P70USH%GEZNSLl@n&+zU-%tT$%mkk)o5l>2-xCLy>(!5x+q=Heljt zMquyEpLxu59(<9zK{-dwgdiY)bfoFD05m$cHc+7h7zwFO?WNNvN ziz{wQ`tQd4c#X+B`zIA9A!7SXd$CXyBq^7d5!|-c|X8-k_;&U z$DJHc4qADj82M4SJA#FHb!PDceFL1`ikYqbcmqsXo!H8i)f{H4A{#TG$IQ6i_8zYK zfQ6{04p`hv?LxAPRi;vRGTJhD<>fypiTP4MN`^uJQvouD0kQ**2JCbG^9(s0C1)^j zo`nfkAeyu_)!285NrS2riIZu_43{aQQ3=VbTWP~bVD+oM6 z!UT@8ufGp_aUvABK|e(f~x8RE2;k)4`V z!#7&9I)DqcX6=A8lxFNFWuAt^?sOz(RzBxnPM5l`0)d(_f#oMrGw?eChSuy!I6=;x z1o9Rn;%LAw%S{R=d4X}7XKt8hvgUEnb>LmPnRkJ%IJPsE13e7P?XIEH&el0b|CA)h zY1k&0Jju3UqG{^Y+($(gXYkzhL@k%1TDq2%0L$bqRo*H3RC{_PRNDBhS7zK_R@tXmSiks!9}--`!M!~+z0S6RcIAJ zRp|GpDL;WAe&Q9P3s|Vk;HK$9zlEilasdj(?tkNvo!A#Y5J9su9C0Tg!u1$8@zoI~ zo`J&IAnY!A*71N75094fNHxw3#dv(`5E3`LO4?5u}y;=_FoC+Bh7Z>3L8K02ZTQpY!8HF-{=}G!7GJg8zXjYPsSF%-6=*0;4eH z#HNr(p1(NS5qz5JL*i0YJQQ63pHbz|94yD5y$K$_Nho9JE+XgZ|3si^3iP2OJ z)#dl&=Ir?O)*?vb&fZ)haOZk(9dCHxE=^er6+;vxNd>V~NMziCkoy)&#x*Yq9JuO3 za*GmRQ~Mz~CsiN9$}}SbtyqHMcwN0oxry@zZ9X1=OOgWA0XQiG4-k;dVmc4N0c6Ju zUh$nwiy`wV8m3EW3A(g#C@sKM;ku*H!#c*oF&BwdAv1FljyFMO3*u7i(hBfe<;rG& z#mMS&zSv(vW-AENhRwjoHNWJbYVPC+`YDW5I}}m_sXA{X&4!eYjXnDAJ8GhwB+A&Gq({iZ zkkF;{fhe8je(lP#y#AsXY=o}g)2FQCKG(Xs`$MKXo8{(r7-b!58s@sL-TI6=l+_iT zw5|p73~T>}j*cvIW0v`;$FyqhfWq3en;_A83|95}A3D)%b{sE#Jx$(C`a@l%KPJ)} zJT+4xSe*jNHox$4RSWqY)=-ETSGK!Q8t{7L_4;2r5drEo_Z(l|?|LXNu4{Q`p**Z$ zJvF13z0lWF&Dl@38T4}Tg7WrQ0kDrNJHYY|TEAmnJq3XSafa7Ai$yS<-Wq00x4e+t z#R1E3&#$abR+RtA1RK$Ho2Vj4M z$bUMGx^O=qG|w`zXMR|wy6fn7)omQX&9|~T)j++jtX2=k-UxHo@wF0rb*t4|tVXAY z8tYgq*l=1nj3vS(YBoXBsnFDGd#LGQRk+j*g}06I4?fG=lSv<96}uIl-nH$+x zocZ$@v&}Gr=5`5YJU=IVI#^4AcorV*K)18t6vNz8t788f%ZC#7U5GQC+2&q(5^#?- zA0(ANXfKZU3=SkCmvsrs2?xRm%0{1*giz2udosXX=&1~Ixw`-`Qs?8satwc|Y$O>N zveQ&jJTAqV!quN#_+wim*)mX4$r`ow157chqLttTs|^!g7E* zEyfH(>r@W#E2UF0K&?|LK&8_fH_2A^amCL=@$9L;a%Hu6{db|K?xATFF~YjV!7wV( z8HA$()D63HUwF)xnn$5=XHR|5+6`u}e;#`39>#&wdXWAR#dS*Gy;h>k-cuviyyjjB zwx6t0QAP*bX+Zq{?5&&lJ6XHcWlGo5?m=m)n|P+PpVs37x(Uh;hvGk&6`@1(Qk|XF ze9=XB5$Fh)8tUAe{U<{}ul9ec2kHOQ zRr+K|M=S5u{?QZ>8kwF#-rns$sE5+Nrt+P2`EfPt!fv`p`%`|{{ucr1-c8>m%4-jt zNMzwgcEz@NbC+F^_JM5vc$x!?g@7#mL$j#!E?~+lvUv2=pnYMQK!%zMX_9*bOI6cU zO?eR}sa!NIL0QLfXPaLJp0#t22e;v`aC3or9CzRaJL@3LYC%Cy4c2=hHCBKtP-SNw zfvFufE4bQ?s6&TmVZFd-fYr6aU56VrSh`77YFHIdHR}?nwhM9oMue~)B4oc7qOKM0 zN+k3oWUXCD-9@T?dFVmAF?0Hi_8X|T^M95?ejL^Bff>`XK%<@cRWQpURayQAM2xOA z7Ah&|8+XH0?AduL?Q>`#i&@-NF!EIz9$|4D^Cj##_v6^~ic(tTp%Y96*jYM!2^+x@ zl~9Xcocz+f3qrg$9SRt=Vd*(seU)xy<#ANPd8xCH!}UlSFki)1mgXznxCR$)J$T)2 zJRiOcHchX0J>DNY@|YyH5>X|Ru{<{NE2K)u&1^VdkOb#)3nabS^>_ou8;?ABx_b8s zv-^4i+<4{)u@p7dBSa;@0yRRE1LO$dQO~JX0Od0CVpKr({{xki)iU;9wVrB z6SAd|hyopfziPHe>}=GDZ2dsw_3za%3$l~Wj*=BpPP_ib2uJM_oVWHxa#QVEUljKN zqKu_JWeuD!c!b9yfHE`D7MzXXuCRAgd&nXNOp*(mWtkP5Vz!NQ1RJ3mj`bDY1_vPS z5eGaMIoG?3?EGUC9$mUh~Rv`3yW(YP4Az5OtMbh>E&6w}Z31cr+W05z1h* zyAJ=I{i6Cftif-0#tew18(9-M>2r*Ap$q3D4zvr40s7%WlB)r~2>S!90|*xqEC8q; zC6h;h3xRU2aAOTz7Kfz3+sH!7NAQaBtXdW3(@WSu^$#!W&$|-hbnsooua*s!OHXU0LuCnZ-l0;LgBtl4X zyUKnzB1vr1Dv1!1Qe0(&RT8@@G^CNRfxYE>I1xktos)!X*S6{1nu$|vJc5VQna9vo zAdc9tpciOSV?C&4wGF+gu_(Pv7Et98XHgBXQ#$cnEJi-=*Po zpsvtPHO4j47_n=Kn-WO&l~%C*6Hf8^)(E1TvNyfm^>{A(Wc3tzs6Ax+3vi%Y3Pd9) z?b;?v8DyP}VfyGBg@V(e)VK1OiVb>qkLT zF;!nHy{|ZYjQJDon+B@3ZzjN%ssko(F>I+j;Nd_yufI-=ga<6q3gzCQYK6P32Gq*P zR|&jdsGH#~>lH}|jcCK|w%TQ#E#f*89UpxiYN)%c$gYWH%l>$4r`Q`i%WEj_Y{t8+ z_vjXAy73JdbBr38nt2bebSon+)S&K}V?tS5d&7;c(gFYY3s!$;SM$+KUyLVWNySoh z?jbJV63N;5MYv`BZ3INsO&#qT8vR4jx%VgI@s2lHajXa5q-CmMJcrfy`cNpN3-0PY zarp!AE6(PXEFaRhi|=sqnJ=`KM#gzxJPv|nqnDrvIxPvfc3LvP^}12y0{&Pviadbq zYQfCRa{okn-2T95ps!#cdz;v0O(KO3l~;f4vc7wrJ`H=v-tF$PwsuRjwT)fY+g%g8 zI{l(<5z)ozaa|L;Iz6wOSX=wrWqkzgS+CEkdgzJq5V@;t1B`8(4c$p;xPOePb#K$| z6x^)fuCpPw_To(hY#lgRT?{MvoG~4jbJy9++Y*^9`{IxV1N+O0a941b^{Xo|PGQupAdyN#jH(cC)8ESF=u9KqG{t*SMcOSHA9&eZ@RFMzEJU?olr?VRVubC2XG7N3n_q>>{Rwo!^vnhb5UPz(yv7Q*9UjseO-4uHx+zdb4z;=7I6 z%9ub+Xb&Ubc?%R^N0(Dt)Y94Wef=z8oj*jxJC)y$}$ z#D_8#O4rJ8>-=n`3~MCHNaNfMj9aVU&?fogQ9sUjqKno4(oq+Vq^83gTAwUXGZ!*{ z+6!~lvo>Z_O(YMX{>Mr7j*6hz389)&?4ehC=FC4%fm|rS9688QU3^(V-;y*(Vc*)t zi0_gs5U?(ohVE#B*R%zi0iLTYKwr`V`sD%}f%2L5(NI)P;!l{uxqgSW9^%7ec04K9 z_o!lzX6mqB@3H2kqk1q?hjsX0Jy*WFnL4a@d*SSErVeWu6rk4WuOM^~FzOcKNX!!P zIKg(#EuF9af_MTRjwh@Qam3=dc*@2x?&NIWOgw-CyRJa&Yr9qfyg=ENEuu5BmIKSi z9f>79n{3e+*V}@Hb7e9=+za#XSK63WWc_5-qgp*g)*><4;B)U$ZHQu*_Q+YfXdu=I z-Gb{U>sQ#9nZExgyf49Z1%j(uf-4Qdb&3wI#c2522;~3=DI>5uumx8sP-$P#z#d$9 ze-A0Fih&6sf(!AF0*|jxX-}5I`lZJxC|%Tpr4Cw4dz9=w&Qb@h**$XhXsLtN7F2P>0EQ2{T~>Y+8KWoJD@9sy!Br? zdG{W|KEHN-xJQ`%8o|aOvQ~3(?WuRWLQL>r2g%RXMou9l>*Z9UgU z7{it%<151W-z-VaMLmn`YDqG_v!X{Og)wYNGFF0-*R;R&5TJiTfYx%v^hNrO2=gR# zivwI`m$gIo!i}7W*(YhCmy9mPV8LfZ(O<@h?J*m89<8`B+Pws!i8By541yaO)}LWW z-;inBcgB_+ja+aczxsoT{RZ|nOL5{u?*i0|Rt4|{rCB9Fn`X;_QZtgR zoizTCs+Qw4!#nH9r)`EaJX*6o*1O2k)n+1T)k|VC!ZyubLN$FOav-0}<#J%yl5-|q zT9qizaaD&NGyCzxJ`Q7@@x}f9UwwFLrjfse&)9-B7O$Zgy7?Z2*vMuugu*5bS z{%4Y51w4EP{Fc}j5?esb#0E|`;==ko49+1UR61WGRR%{%R}(N+9>)I1E-MNK;?=hthH~C` z^_xkYh;VayJ<4VSqY9jaGpZP9?I37(IuI{%P6XsMz$c+c1DFXA8}kI&LbwR6oe&x= zslv4aFVKCGC=r))uTbzufbagnu;Zi4%x5@4c0T zx2Y`{C3ieI31Su+9Iqkp4?j=|cFD+btog4JjRz?sc00X}LxRQ7 z*XNvjK>9j2cV&|4?5D$KNybwUq@0FgeFL)=drw8S0qmK0z*oJa5VNfT>?KmbE5@Y# zzJXR~RRh$LZ2(^R@(GXeC0n;^!}7SQHf%h=J5(I9TclF(GN0O@Yh|ASFxAL|8uF^V zz%cRPE^8;mDG!EJoyh{g8~q%&f({4tR?rXoWh3=e%>j zG=tqBPyr@T=q?rq*b!EM_35g>J`}7DR}a@prh~^f@Z>*qvEDF-rpWElfGmRhkuv3D-rvhM}OIgadtcaKV=4XaOEY05w6l1 z$k{nn?_4Xc(B^7FMs2QUfKzD>STP0;N>|Mw9w5Szo?|I&2I@rZMqq6F%W0PLX*vTr zNI4gjPHnK>=zJ9-lcSg+nhM~+?Eq4qK)uzW+yX6P7br|QZ5c$N=oP50*0T!W46UaH zSnJsaQ0qzCP*3Dr4p4#(KK_-ZgcYUN?*pY5MVWjnGlUf-#ezDWijr~}Mc_L7FJ0U! z??C+hF-GdXQaq95dTcJt#hNUJlDa140Oz76pcVrxhSomk+MonzDF_TuCQ$y)kS+nY zZn_hoi*LvuAwAr54=lJgoF^1~wp)a|tQ49vl+tCRx-X^K+I2(GT6S_Q-dcpZQFVSh zMXO!_aGp{<51>-Lk5YXy2vma!RK0{oqZtF`y4^&CDWS?djv~}U2^E@W2Ms#pjgsT5 zCvroT=u*8bDjG`ZQoV~Q?fB|Zl=a5bNONYPB+l_RqgJN#S07$%pthf+S9CpIhL#kZ zk3`IOvC$b*h7Ha?uwCN6LxyzK9Ci7;3s}Mt9q*Ii+vR+vf~D6Np5cfSd^d%mmokD!stiaQf1qoN)$L z=q9z~8SRE}vpa(noczFv63sIm6y~m6syv?3xsp!>_^?)lAHmUz6adtUBm>mV&JB>w zjtitxmSWT7pcUColY>?{TwvD(?_&prxf7v@ye8-@%zJ{*qeY<)L{BKYGOQ~)TNYf+ zVZs-WmuRJk2YdtME{$3(QTq4#G6Y0?-hr*%lj12lC74ZymBIRJG9 z@p)6JpwBtr8)>A`Ah4A%!CJ;TNSJ@g5Dt+OLS!*}nEV{-rA`cfW9QyO!-uk-@f7x1 zj;|L3yIZ|p?Orbnw}ExN+5kSL>y?6MBXzw}0qT0S@}4pJOP|yGwHh5kpcYK9Hd50r z^%8PMh#an$kT*f+uJsbKOV>+~QBSJIh$ri6)#(@S=60ySAm7YsFaJUl3^YPl+2SL} zG2-Qi(L{e-@EhO274PhfRqq#({Q2u6mMvmq!-dml&Y3+O>6?na#srF!q+Tabs8^PG z42OO>jhZeN^STQhy02aVJ@YeLciwo8Ou06!RYIH^|Ov zTs0>B>xWO_p$(kqyWnzOZK2Iul0|-K-FnJ#fQ#DKER^UM=XVn zbX%$f=+wc{0$2w}D?kYjbj$!5ADw%_6`;`bOtDUbJtaK&8t4%55DN++2|y%3vdv#4 zK$ud1IJKr`sz4zU4itXkg@^=7u|_0Nc;c8T5-2=#Ohf`@sYWDFDm5a3vO*&gC{-Gf zK&cj_-dMjkjdF5}f4RU_nt<-u?&=S{+SRgG<1%ncIX@@t>XYPo5^F1M+|A47f27^R zkCOcL37}>JULom@_f)f$*!?^j0_f)}=x2o7Hto`Vpzk}siU_L|vv*VT!5H_&NWKK0%5^sfe`|zBVH37Epm>a`YUk15+vs~#)@OIZY1{!<(Uc50B9bWj^v%@eG zHY50Ey{P_fo}eo5`X;;aq~gX1&!CNvCIx$3SsM`}^O={}Cc{?>;LzA~OX}+}1)>o6oMIMUL|s-!6b=Gt=FYZBBN#@@B4;jpysyvhn7k zcK9&`%?MBBWSKu^nOhC>T`%G)c8vLc$Xefd&CP~+OalA?SkY{N)lc?CdCX{c5O@9Y z{8#5lbSXMezt`C{rvDwbPgcYyEVjUhSKJ~B2Q`!(Q2kg|!+(ip{ixp+P(asTzLQle zZa-*^!WD~;`0#f7y?vC1hHshd9UHz^&7<{Njk8(%#6n#tGS&Ub!y zK8mXSoP1~4`Ho^*+ofFLYaw5S%K zYR?8&pg^jM^UFRJMjx5DLPiRvXu7~ufKTWGrvrW*S-?>MaG)wM8KBJbx#jBy!W|6~ zIhkJx$!f#-6)6kn-AJK>0(2pH);_9(I`D?(IXTS3h#}9@-cYzXr(Qpoc=QW(C0&6?-=a4trP=o8ktS@S#)=3#`0KH%Z?uZwYAxRDJ7Z_@7a z{7o9xjCjB1fj7c8#omCro&f#B&lAS4bzJ{F{A*iH;geqC+5fPb3eA>fIrX4B&pJrm z)Wq)_4*Gf4`}Cqf-$Oe+L;f;6L(W9MXn9Bc|6wVm8_Op!vur8jS;=**inSe8z?*DN z&C1`@SX$;79O0nVf=T$*dA1*y=jG$_prUx+E`D^L9mnOFdt4p{bFiv2PwR1cu2Ok0 zoet^7D8zdz(JZ-UKpyW3oH9+eo~2K-UjC_r?;87; zqu=4A<5?5!tPg;7l+U{sQ@x^iU+J^actXI$1<%Cq>sPWya7PhdAR&;iLQ+C}>s_yH zE_5*`htB8K(&$Z?~lYz{1zuW8MVCIWo5%E zwZp*_NQTC=(`Fci*T^#1i7D%tV!Z(r=Ye*x;dQAlAKeO!w^w%qs+;ZqXC3x+V4wpk z2LnpmQgYW`F_K7ODiOEtCULS?FIMiiO65KnpQ}c3`~J@>PO?Jm^8n3Yr2} zyf3~Zz?5}Nv7RW!I`vAta-r}$Zbm%h-K^}OmU*`I=UpYGolYt~04+=Z*! z^o`{MT)ZEO`QQN08on(@Jw~v0Iza9(m()d$@r`tQqcTPy7vHH0)+9VE^6=fVN30Iw z^Thp9J}Khyjl=S6%8S<$ID4PCK;dt=;g zOJYYjKn44oXX9W!-m@S5J<3l~yJkr^QeRX-eR!m@FqY410SVsPfqIv0OzFAO3-|LJ z54-O038H^+zyrZ}3TDJL2NvUzqS$zh0^uV?qhNKsefQM2cH;Y6KQ747_wdcH^=*9I z!^eI6;qn^7@S1K2U3L8Z`}cf9qBd0VExrz3(vLoz`ZwzGhe(s zJ`*p-$ML1;NEFfe5iM@}Y=+xWf(P#*EBXMUaMK*`BCFw9rq>o>YT4gi@?{h}Tg`45 zpJ;GBGK&VtcV@l0lP}kiPiw*8Bl{Q;9Y(|^`9K98cCF!uHVj`p7QmK;O{6xwC2f4W zC2udow?)2QR|#t=@ASdr`@SJRuaaXs*t3`|n_!;mI(*W~KQ{sop5)`>Gx$FFCf^%?oAVd5JK@r%?~rzhYTP(OTTgkN{ItHoCehQ3DqbJ4%kzg1@!d}1K9 zLIz!L0l9b~^&R;0+glM?pSd2ZM*QI*#px${PnBZ{GVSol=7FcS^10Ge*VW-r%^3gP z5h@0~<^jCldV#|~Pp#h`G22o&H0hMeBcCI!zPIRdX}o;9E_ z<%b2hqMUZz1<|Fm*E|YdP}@K)2I%8F_6H#BKuKgb8Kls&D0Gtu-DOP+7t903 zc-Zd;c59x|EI8j;`259qC}5SNzHok=oFFE5Be;2;2&Hf?BJ-`Su~33$V;jS+o$Il` zK$x6J;B*n+(pn`SzxAwZ{ar%b+T`ejIK4L0pOMJ6xJFU~59j(de5nr~&<-kfR6E<- zMlKE*K@+vt;E^_@*TGG-6MP)r1YwhEVXUq z`^C<8o$zs*ulZPm+Gg@Orpvgc>Tp4Kc^r*vtH^hPo$uJeZmUM&t0rHZo$uow`Rd4b zs-5rE?tG$O3;9mB^F7idUn}{}w)5T5BcDaS^X+_>^~l#mzTepS_~}GXO?UehlW&-v z@0)LXh?Ls-5?^kXl=Z<`KxX^Zj_B2fN^#*nvCjT+PB|D|I@hHBnlDoo|Kk;dXy0O6QZW znS8}|zGC6CwT^P~Rg-V2oiCSs64*7*l7sffD>u|0L-T{O5<0=tc!FqV-+K|Ote{o? zYL^!Sc^F)rL*CpP%V!r4x$2voASCn`!uTyyT{q%uIycFO&m5rPDO~nD_!O1li~HNE zt$5#7c0)Vh7X@C@!2JNA%QVWlDbNOu@|*_HO&YC^6?C0OE%uoRmQ%!e`<6EpF8x$Woxtrn-)OFXf)y5}T+5S+?MX$gy0=fFw|&lL(Zo53 z7oT&p!p>9JMuiPjSU_RFRamvcvK02Z!bU6X6@`sa*vksLT49w6OIO%43cFNc6$;z- zy6Ezl!v3wW#R~ho!WJp)MTI@6urh_+qp&>+D^S=Zh5cS(f8hmZNEP;Hqy=vXjd@+i zwt_EUZ`||9pRMa4OAiCwEaB_kK{r!gmjP}}cX_=Ga07efJAQyWEK>uUej=}q<#rk1 z-tW%W%K-OMk9@6^*JXfvs7F4Fd|d{(8++tyB43vQZiw)8w_h>&x(skm;p^_V;|I7M zd%8wJZv)($!q;8i@dKQ{M|sB&a8rcO=8s+mxQy<6y$o;(;4}OcYJS*#0?>7o+xrcx zY%98#QLbM2{`)BRjPTh^)5|C~mwdgAa(jzplsgG$!(ZDPOXaw3Pwt{;*U?TSSpy-I zL*1xXIn)hxz7TLa?!lY4`#DoULD%x>zi`2KSQPe=!e%P$eT7X`*iQ<}Q`pZ6yH#P| zD{Q>N4lC?Bg&kCwp|GIBs1Hj2N?{`vR;IAa6!x&fQWbWK!Y)$S|0v9@un`J7OJPqb zEJ9tTRz!Iz*NKV4O z*9uH3044)$05`y9aHxHzF?F)fv=sy{lbFE8O#M78fn9BRDPam*6Df&dN~NYmhbfCSkh&D#8qq3L0(@4h&;qzosn7}# zb40384p0J$Ywijl3?>q3fFhQKS)3!#B4zEezK2OvcyU%vo_=#fJTbG?#^%4lLjzq8 z1L5`icq>sq9P7e6$gu*Ks|aA;ZK65eXE+-#BIeAD+1mcD?3#;}yz7xgpt4enkzZG; z9AKrcR1;ur*Jgm)uEhXVD>-|uw31Q~STQEB;AO1FKvry+R{9K5Y-ZhM#ehQIOejYU zrekKTH7Ef1qSjyq;Oig+9900>^Z@1o?CROcpwP2Sp|?(FfhklWS5#2`Q?}*$i9BzL z3OJuIOQ~R-8CD?&;7eMC#elU6^1=gxnD*)&@A8(W5sw z!VVg)Z7>oF&^Lwf4ZeS;ul@8j9*;8MPOEzOPJKCR3m%$#4P6#8@hLj>cwGyK8$b*_ zG#7rn?vvw*3+wmUi0bh=9F;8jIicvUurHSZjNEmV*h5nzQ7}3R`(37Ax7Nk0rM2?A zkMv#&ysf>L3h;Gpy6J$cl=lh%>RvV(po*VewGuyW5NJLo(0mgR6UtS2y3aU?29R)r~*TJm#Y%3@7f5~hTD+55wkV$Cx>ObPX} zH-#xHG>!xT$XS{T%@W$W+R%Wm<} zZ+KySa}E4fbQgUVgVm?@I)706d>;pBFpN=Z-=Hf%??xoS1}+Q?UD=R2`GUlaM- z$=7V>`{MI%@>-k zc0P~rb*|%TlE}vs?SW)F-|65h$#6ZYTVCI4X?e}M_O`sQY1F$aPnMz7bu)g2eNg+M`wh1=xp+w8Rq$&=J_drzehw~`lA#cM}WtHhE;bIB^exi!W1IS_!36lZ#0my<#X69;&`~YIa%o)8e?k z04>%PLRr-%JtF7$m$+jv9@aM9doVGu@!D?_Z8!DC-pS8_oGHqd?TJ)crC{U_4Tb<) zl|7RI7DF+g^XoU%s0RYIVgk$V6SfWCwMI%Q9fWJF*k% z5(DsjQ~-9!0Z6w2bO2N)nXU?t27$-PnP4qJ?R^99Sc-4Ebl#!C)1Oz%j0%GJhz&XU z<}=wz^%s^Mk@s})5upsIhX)9lz?;r$vlWknVwR!{xONI=psTdv7Pcm};%xxG){3X3 z;yrUp@l=3#9E*y#f12`?N-2n1vk?od19GWYSVPBnwc#VEX!ZG?1*f>)w&Vq;RhgoJ%;U7oFL)t)#D3p zC|c)>Yk3kkh<}b)aJk_dvSt*&TAZ;Kmukco)+Bf>$7*$(7H4H&`MA9mRWl#_s2zK* zd^CJZ(Ko(~Cn@1zL`g@)f?V9;{R2?R?WtjQb+dOhzY({Vl5mSRp0{}Oo3iqkET&?H zukhXWEOXTsk?vdaZY7Gwj`_AwDW4Q=_Kiq|SbMbmxL}g(4~IU)YWQ!(``DkLz=Xn6 z5Em%KS0Q-GF9}6)jipbQ&x2t6?K`#Pm;SDbde>VY;(JmPcs7E-CdULetnc$fU6!dksJlU7 z%HJpPuI2e-|ICl??2oY3l!vY#dlOQ_FCwhGlr7{H)iS`j0=N$FDu6um0xG#g8F{JM za$qcnWh-!J&YohU!t%7&Ni=a=pnuVgOlmN*k%zzZkd%tSC9%EB^ z3?CJJibEWxYGdpJr(YhfNddsqR88^#ilvKVC?=*jys+K zcQfS$)TJcjuAwWF(9@m-78!if!=>Z^JYAKN36Q0%mRCJ-eeVT@Jtk8)oR45JF)Sui ziaBVF7L(z9rznP!Q?3k4P6c>|lAH{Xl4XkJ2EzW1MC&W4=^OI?kd;Zu%>EYP@4#7- zLK#QMX$u|JEgT)`EU`1OA?p@7_>U5!PzfL>g`O!@6nC z`j<3KK5s7LR7SXt@c;*^IywMK9i5-OB0h=+fwf=)b;^apwcMQzJg4LBV-(ZXYm-Si zlRSUZJg1Cw(Pxx3ZBbzeArfUXxq4IAXz+wlx-e3Qrx?T{Z>*W>onGcJo>HB-ycR!+r_U5w7 z>aV>yU;@Mby~56x~PH{{5m=I4fkTp1sj|_p&Pa>@=f##i($ts{met zT9a%6))Ue;fOt*k1`}wEyIA#ez!YfF#t5RyOgZN^IXzSVSeHIk zPS5b=n&Ch$_F`rs-{A8|pXyl?zZ{>{g-VN&qC>kJ;D|`2X%pa|RcJQ@L|?+trkKvq zE(Jy<-lH-)w6pTn7v->-)%h+5GF=WP)!ks5OD2gR)h-P8U5Z`xeK z(%zJm_%|6>1x0L~rL>b+a8oH^K}uCfQU7Ba>d#0ep>dnasOby~%DT;;Z0n}2_BQ>e zonfIx{f}X86%DH5U;BH$&N=tw-sE;Q-(MeX@B8yU@ALkD-sgPI=bv-lJLA%h89sCW z_GVgw7q`5@7X|OXtDR2>?)`H6E<@|MKojKyqZm$Q_P3c0<1Kz&QRFn?D?X25t0d0aj^LvvZ z1jZzY8f4KJ{Afo@;%knpxP#MH!^GDdPX!~|kE&$bs^7HpnbD<7UdZO=tHm6Y9I)b; zmUAE_}k=$vWv&KEZ6?EC2P;pXa%{Gf?-caxb7=lt`?d z_RqaV7q=#RvS7K9eJpa;JwlSED_eDK@n~*kC^*<&DRGGGPPbvXHCh#%&@#MqDdaIulcr~;l3N|m$A*pFZ;V58NtGi7qX+l zAI>7*Ix-Fl?g!8u+!f@yn~xX>W0 z4f4zc@)UzS(IBg@a>L@R2hD2WuP7x`3d+4Hg@6+<1#CWGy<8A{X138e3_?1qL7I(` z&Sta6=RYCslmEhG!^MBibhf8Se9iQSo~GEPNWG`gjoXqn7>s@&Iz`?%Zt@|_beMeA zujPl495#$T+#vUl22YQ@kj--(Lk0$`Xr{n52lt?DJ@m&L`ay>Na>A8!NzIT$H=fHLWN+GMuI~++DVb%9haotXG&UA8ydpSi; z&H{WX+LMuE2ggfS%e&v)Z%XN~OqJ4&=Ah|kl#In%R9nLEBM|bTky`1u>LjmUC*b97 zBxIfJM?wyu8wnjy*pYD6{U)oHgOKKGkTx69YQa9ze3H}r7f#PV{yd@QC+xmkMIPlg z^?51}(VXU?=Pu-lfT1<~A02x3OhUgj;~>yugg7|&<~Oo4K1AK5CHjfxeCLV4$wLRt zZ_`cVI^U^0nXktGA|nzV^>L(m)Th9F4BNpCO9%46_H&Wu5v$$l&kJ==^)5&Bb)Y`m zQqwWQs`}RxwJr796>hcm>V0^*?ov5$&d z5jXqhmR9Gfh%$ycX>?GQiLA!C@1m0x+_1!k8q1K;F#5!VGA9^iu9Y&=PVvgL0^V$u zsRxuY5HtdUG^z+K8AnN#oj}I!b*d~PST^+&L-=@)NeujvVAT7$lgxT*yJ?T?k`y1a zo-!YXSSS`Hi_I+9!Cs%7P<>irZRHmvEv12P^t49FLAz$mY|7U2TQi$-`00JaR`096 z4%zTZCJnVxyjv;rtV(aokT`b53ShR zqV0MXZ4IM$`W;zy{f;)#^`eJ{(Wf1Ka4+ioI-#cBtK4f^NM>^X9S3|{DAd@(t|H&4 z=S2tL8+x)rjn^8?4xz?h7+}Xx;{^gnSK9t}n>F5@$p<&pYEY`g3ODE}4n5BE6zq_)EMxsV z-~Q?eCWoY~f6_j5lb$V3+Pkmg6}-{Wlct*8(xxrfPd1MenN3kWMs!j4K$u2qR&&UaD(Y_wL}73HkO1aX#;SZaRuoQg&yZ>GLiJP)~pe9RYSpUjgWnJ^*Nw{@-_* zq|XGQq*sGd`z&I&U^j?j&$*<3eXLFTq2)ZvrGGkx{v27Ur{>5%= zt`k;c^BrOA*o;r`YIXxIO^lkeyqbl8PR%YTteQt!HQxatHPs+B=b_Yse5u*()I8j& zdFk;a-_V>J$g3|0Tz@cL4z6wwviC49xccSCc9|y$W-C5YqgymeUpD*dRa@}-htZ*H zuUEf;*B7ea1Fqk1)sHn&a=*rxd-AZEjepbi{piqp)b;%g9$&M)FLAxkRBx>9)BCX0 z-e=L9Egu4>*+%4Ch6v3#ot2$bDR9hk63m{^)r3e*w@%?d?cv-)s?=^7`ElL*>%LE? zhSB3MQZ%^f;EdlW8g>C!?Ss$>_?!zu*4aJ?Ie;z*9Z=XH{C$>Pz=2Q@)Sw{zh!n63 zxST8P8Q-6AzFO9mZILM(xp9WfV0(UUxChvMc|_ND&#{~Kq7cjaiKZ-y$aF}&v#Rb{ zOi{L<#Oa69dJY}kEZz?IIu?KxyLtqXg2QYc z14h9$mjE`zXK<{(!!W^29%$wSwgPrpfznq3k=+QW^|$Q)f!OcJLF|0zk>4fQ#}dzR z9W2cLqM71ot`$ZTL+p1Bb3vk)yDssCl!5=RB8lbj{_O*G5zWrS2SU#ItDI>s0Sap9 znHXxC!=x=MCY|T4s0Dla668qkwVQu=nOsCnK&M6kkh{lNhf6L}+zwkD<0uFZQRls|r3KX4yD#w8JfU>#we&I$ix}v8RmE>h;ZqGdn z=q*f%F!EVUZ|4-|Ul?njq&>pX?4?Yh<&>Y~c% z8oAP|S^=1oa4YZxt77CrG)kfcNm~p0-7LyJyKloh_8uTP;+^rt}(F63q@rXEy28p9efecIk>n zw6RIAO*mi`uKSt^iCYkkiO#*l+~hFpnCQYLLFvAqbd0NK1qg7}r4Vp8XZ|GMDc1a2 zz+J5Q(njWU%ZK~+PZ*4>n@-@z)@(YyW$u;t3_ahz3P$)$@b+|mhV#cK_`#%;&iZA7 z$bKoL+5EiKk^K`4pRk4D4Ji!&DoS(@#1aheOJ-<%0K?&)Y^Gy)4Va{KN&Pq>rz&oB zpqmq=(Y4Ct-t0>LXe`e^s1c&`iqmBo;SDt%=N1K7*LeTt0Pf-Z8v%B+Sp^_irB?vZ zrq`Sqb{YYp^iqQa?k6Mo{qQK&j(cZN2@?ARf!}CD>*U`7Ye%II0zK z2O(3{AT>Tmyq)Xra7j=HMlFy0RC{FSCi}=-Ie#5?{(@uM4R-yklLh-~L^H>Lb^dDy zJlF*^4ty_C(5oBJl{T?30kwC;a3twxNiS7YxAMG!X!=|;?wlug#^mpLknuLuZha7u z_g;p|I#Vf)h zuFKXAK$je~fHqq`};ok zGwT`02(LewZR2O1vHmeJam(_V?1i~!(&j*9!tI~DJ{6zv!nWUag#O;q9Gn$Be6S<^ zvq-m>b%}?x4@x1uPo(qNCQCdYu20dMPlCthC9874qf%JGc5gdaCB~EPy?=15GnuXk zm7VApMWN}~i*Cmmy;^R%MWT~fcBw7j7L_1=3|_HQ*U?BH1|$cmyl~+W_5Crvgyf*}K%K z1fzw6TC`YMJ1S8gMjM4T#7_mIR}STyGeyx%W;E&dx+C~SKoOIaQ=u4eyi;Kcuv4KP z(5X-eXaAeJUiz2P2igHn`da9n?OlLpIq7)}QYSqh&`IwU zbAoT~FI&TbqzfsIUC46hu}=B~Cq2tczs^Z-EV7>08xfrJ4!~+By$9Gy53u@j(%Zp$ z>2o|h6j%2>W|LAMsZ^1j4yLV;G#uvS{Z~<&x*?d5xnlpXb zygG&SU%jNi7paoplb&En@3r$leJ|;w{S??Yh3nxYF!WMLn}-hP ze;Y9ql=+L)OUdYUSxT>73ws*9g)2p>y6;KvOd(y=OZrSdT`o=`{dF(tntohMQb=nc z<#m7s8hnM$*RLe{*!P#@&|v|3u>!e1Xbf&1T0pmCJG<0HIqH>v;qZzVUE$2QQ_Pe6Zrs862vi1G4oKF*7MolMta=;V8s=b2YSw?=eX zK%U>ZhE7A)(dCLRu6MlTCDV33<6gr+5lNc zYf@?jtOtw+pTE(plV*ZYNl=4^`H6?)U@4Fg7=Px+V3h4K=^>gk!07kWAE_kt#wsjj zmFzZF6Jhm9=)ev=NndpXPtr&96h8GMX+fbmctHoBl8zljXInh(#JH8g18+Rse0zIk zu+&4pc2Kg=!z5J2&I;XtZsf-0D}(E%9zIx=C7IZdTuZ#v5{Fg>*FdZ#x`ezR;1e|Xxrw{{$0}f@3aTmhH6Fx*HwS6d@z>+rZ5G$e5eP!T^f)O^MDh}X+R87 zn$!ZCStIzTdb^wkVV2YSCG-U&NQwg?ibYUWn1_@M{JwD*yHESjvUmzD@mqhGnj?3~ zHOeOI&tmuxE+TM5{o&d#3atB=S-JN{;NH|8gME)IdMGmM?&;Ixe)UiRurgjlGb`i8 z8`#}dkBj>B_@jDAy6y2t+hZi}kD!Ms-!@nxNuH?!*KW*_oP{|^KIXTkFmd1AI0Yj~ zhv%e2@5p?L4tOMcWpMfRhY!}N#rpBd#VR)N8XNZ?c`-6tG)oSZm^b6&B*rY(jH~7krbp`3zmmSq!Dp`XQ=)%s zvX9GbL-O}tl00!yoIS}@Lvm{`$(|xnHTEPE49VnPlKn)Y8OD@KcWsG%{Gx}ovHSS< z4<3AE@Z+JSJBMcIGET~yW%qE1$ff9!^k!LW*}`kEtkiz6x>PE2CJ~5TX;gkMzVu+R zuY&zS!P{WZspJQylFl{1E;rtb9|4`cOkYOo?w*KyjI?F1>8QW4KL4yXYjf5z{_|8tKaQKwmIaqMcKXIq>mbBZHV7~Am98L z`Ch1LBSlm%Y(>eW-Lgo-2U#{JPL~o5%d=A77{6*5FQ-)j!6D`aX1)RxT$`A&=9%jJ zaJUuLh9=VdN(|UI8S4=uxz`KH~CWVfm*Yc?s6V~Rt9e|(BR^g!A78~2fh2_mBH(QX1>&U z)XLx#pc^heF=u7)7eG@N{P`&5@+uS^bdyQiPQcM($^J25Jzz9=%T=bfEC(USs6kcY zGzN~HWU5QKPZG?z9uqm%Vtx+B+$4&|zVQ6iA-j^12l&4A-)l107>KtHaDz~!)ia~=F zk9t5iK4)_%!B>*(2|kgQ(qg{SHDZONdrKzwq0sGcD=M(vQ=FVc!9&4M+7B6tdr@l3 z%HEdmC$)&79O4;fsFChp>`&pFX^UOWQuAm{OL;MO5|=;2S8}qKH+;EcT}a=kp4WNa zz+JTuv7Rr&KCj)1VVAR8Q4*R^x~7MpA&qO=u$`+4@|V4NLr_CcZm8*R4D*KT7$Bj> z&CEG+p+2_mT-XYDDt%270UyZ#fua)-7YeKgROL&$lf4m?0;eV!Qd>Y89RyjdnC`-S zglYO6HjH1GOk(zS5^DjgoWwc67g>q=NV28{h^qn3#9^)}Oyo$ygcZwy5{4n%`Qn64 zMVKiHvFjY>GGWN^Kx25)ClVaXKDrDIB1Q}fp4b^_O$}KX{8vj*VIyuWU8=YnI~b&``G?}_Lc8;k9bdC|HUdMzvQt91Z=~QFa1(Al2xM6bB zK;1BzxF9QXimDnnp|fw)vuqc24Al6Xlqd-zI=jCV-InQ#f@nsk zrzwoM!XcX742>O>y@f+9Tat97#T5>_-wlk#03!n`s1i@3mwWQ&9() zdYMvD_c11p4X#S=_OHz^-y*94hC=ZomtzztmUDesga14hLF2 zWF#jU_RfQa8)O^enKZgsp|ZKZL%K(5+(gh)S}{asORn$quYJ>)%iZvG9ot|vvLCC) zt+JBp=UKnXEPp*abkoEeQ4mS1@R0LCC*Vca2lAWu!E!l~6#a%2b-F>7&dk>86y4M* zPA6iQ8r6oLfpr~feJbCyN?ej|tEO7r<`6ZfTRY&zRyW1c>o!|~#mKXJb+aKzm#d8f z+NF1LB-Hnqt*JO)t@~RQB{fOK{hW%^NGPXbE8rzoMWvZnv5^CP>mo)RdPmxb6-A%A zY*6EpK8g=gl;V!wq{IS4wn}p1-X3YY08rGr~H2y=rHzwxWl!mUj7ay-CN&Z4z1 zDvom?Ndy#dGHlE^1YT(CRyUv~d5GHpHC^=Xr_2VU{S>t*v!6zoedSq)nFBY($AD4G zjeA)WrtR(pwgO(|1g--9$O`NPB>N<=9#8_!z;EQhtcUbVb*h#ubB|QuI=dcvAkd#akvwyR79ieu;2 zTEJ_Zm3oW$8L)(+9Z<>xsguMgj(+WV{ z5~Ea|2JAAY70_i)F`)5j@WBhrm?#BdR(<+K-ac|&Aw;oS7vnZ!YqO`#VP<&DqYiVO z$1HT13q9s3hpFT1E##lOkZ0}V z9gzcgv$R6P2(Sxz1)vLg0MLf~FXx+(XM!+GWBnrcP}wV@Slk8X5dvaEzT+=#3HhzZ z^iv0-Re)|#UI45-HYX-ugm-*S3a-}C63HfQ+E z6wh<+y0x@eOGuH(Uvy;bMyp4@RaR!yTiQZG50ylQ(z=>09Igx>MMW!<2`II z9H30(eZU9lcW!tRzoxE&cNy6Vc!x8074T#5hF2%xuAl+MMCQ7OdKx*D&_xoyjg&mV z(DY_m(mMXl_$X|KePYg9WX=O=k$d@Nwc0BAcYaHe-kNLO5O!Js-hq=;YHapBj zFp_!q&M8^u*GClxqZ4kf;@4SN4S0{Ua29a(^(Lv>09oKEsnp3>Xx2rQ97)6l619z- zdI49vpu*x?&Saf1PLm)1Z6>?Nnf>5STMO;>ThJC&iVpRL7X#ietw2u!cA>2YbfGN- zw4sexo6wE`q0p*9J~$WqQfIQaal9=B!|;DckfTM_AM1$6mVRW-%!9^-JslZ`gA= zlK5XpjctVe4Z^V1+3aJ(z>YtS<*8H6=I*%0<#}x5nTnxr|0Iv+SW*|WamUyf{ zTB>?OrIDGg-)8B0Q?jlXZ8Fjxkw9F=Zd62 zX*gm=GQ^3I40xbuU_J|Y0+|EY2AGW;zzTsnj|=|DimU{o*;fskV@IS$uBnpuZJKq8 z8h?+W$zff~Weexa4e{O8Q}eg=h8QNDY+rggLT$_&dUmWE6j>P@UA>eOa&DXWeq`1H zT>()8iL(carF)VLex#gSR;0ZK3INz6z3IOSq2=WYl6Kc9aTo0Tk< zxXGRcFfT62Jvox`2_Jk~(<%?~JInpH@ymn2ykw#7#fFs`EyrycxuR~VeQk;OBc^~K z?WqFhJJ9=KNmnqkvOeehff_Z&^+iAS5h(^d!ty8tG#ekmdE;#@0ikHCA-)i=IYE${ zkO;4-Rl>bAyA65cC0Yi`XWsq4wQd)&J#7=D&7_4%Y;|TVw$XiBHOlQ!nc^PJ6paaUFnK zc5nA9B$O;HW&`t>=8wvw7u&?o`-yjRKA_$$he0`jaobq~`PT=5D@E zJ&cmGy1eBtM}(T#QP~1w1aElau|he@ zWr1oKr$LIEtEzprc>eSS&VqRD5k8;00QGb;*iJzGi3UGA&6Kb;AQW0P#DBA+-`||P zJ$O3g9qHNVWv~^n5xNTaLOVBA1G>tZ185gp*IMqmAT;f%LGx@60_+_zwQfmtB^b3l znw7F7(pgk(sm`LPt`S1l%!P1n&pjGG{c>r%0{jPdVeN)&;|9)D&5$1Db=M6Br#jt> zfbX=r7XyaS8H>6hmhSdt4X*ZV1gW`IjhY#Yq`x`0e8}j(A^vwR-~9Kr6z^kz#_q1p zb-n7dY(s-kaUg{jj z_>M`W?Pk3p23p+wrk^)P@~YH2mHdRdw`HdHWT@#s+QoWofc3)^>V^j2wf37g(S2CaSWY=Sxr3pdF%QE?a*bHM`)Jtd2aZ1htKG7=K2B=jvN>%_`B@ePnR)SEHszI4N2a#r37dw~E z!VF8RtQo4N)3+L`L-0X5OUzIeoA{Oi)|?`0v-5c|;6!K66yQs&IrXBj=BSWcbH<-! z*Uuozo43T@Qh@u_m&thG|27PD~t*6sX-vPGo2oPo$M86ErEhuLaI@Y?&cDoAm zOEKg($S=7d4oSHO~u-H+#h$ca^wQ-bFpZYyf&^i67DVPfE! zmsDPZs=BRD3)^r$i{a6~zs&5{To*1VSy;+hUCCngGqVx?a|zf5_%vN%C$GviZe6v8 zLyd)L#LdLHyqR6!4e=~vaqo<)9AU<-m%`Rxnf1Jrn>(N~d5WrZ!0Vc4jN`JDNpLt7 zj>&WOwm2~7_u-H$4sgoevRUqv=1J~*vYPa;?%_3Lk(%lDI<=2yb~7gpxA6@Lbj%&Y zbh*px=H#J(n-Rw8wuCCb1A}6Af-GGj(bv2$c;r#AklJIdPLq%$2*f;1gpS@D=$LK6$75+i&v$ zb@rm64uzcvue99PfY4l{26_Hd1T4@pEOw1qwD3I|Flzb3m&7Far>~Z)_7=cPqnE#C zhu|=j(P?4(Y5JXQUMs4Ct@kHJhhC{pyn2C7@{s97m4A!TVJ=kaM6z|9)q5Ts5<>v+ zb%^OEzV*m5H^|JD5Q@NY(iOqnJ&UfwtoX`dw2v(Pgsc$KoW0%V$nH%hlSU#t0Hl7G ze1W})oP|P8kv70LtRhm=D>9P*fY9@R=O6~K127wEK)uJ+1XkB!Cv%{)x?yOMW5vj@e7r*U}Incm)Nz<*nZ>qVjU*k&SM$$`d#knso! zxqwZ9Kx{7V@Msgi1kFb7ut?{BTbR@P-|Tkb(js!#B|tIYyUzbpfR|hU*8@8LE786G zM{uB7>LC;Telup;f?6#0eW$zqFfmO4(=td?kvGKO`5!cBOQ*pDVt^@s+O)OsJx7gn zwK1g#=7*Ywf1SPv7KEDKQ+*7c`MIek+HXv*CO_JN{MBCirK%o9B4YmyqU7rFDXWTT za1YBtr6nAKcQ&(zN$RLzo zYKUJ>BAYD>?Gc^f(PPLok3QX_f0T?K=h1sAFB2S(vc47fq}lFoRS0#ZBlP#m@EJ$6 zX7Nl;-64tjT*%WMayKF603pX&WT^3Va#CjYu&i{M9H54=w-i{yjBAY%(-9^rPZGTbbn@%3XVs<>X6dOBcC)#yk;E*!(78~a`<$Q z8Q?JEJjU>cwtz>>Vg)F?Sn9-I=1|71o#>700@TF}u$_QfGev`cKH3+@MNjgO+zoqz1z@BRz>$TY9SyWj{FVqWydqsQ^#61 zD{8&|$i79e1}Muad^5N6G?i>Vki>Hg#y~Cbr9mAUV2;?>S|Etm2tJ_3s!vU$)K9YY zSuH$JW!5BbYa8GeI)c^PR;{h?7aLn=f{^#r5dY7&2*g$mKIeZjSjP7;*sF1a4Prm5 z@AVXCeqv0Q(n+STuC%64xzL+l5128)&gg*F^bJQD(6-GUo4WPIXk+>a5Hej2@y~GPwoF&$(b7@_Giit))3hmc>lo5_-P!zC((qx1**z%Y zU=i{HT#%2{aCz<97J=N=6v@uV(ORpPq$==U{4%3u@3Kb|1C^uIYwlpVjuTRD9%x*a zmeDY0t|8oJS#lcflt!c1iA3@`>RV})j?qjQm5lr_)bxy9^+>bQmPr|<%@3QZXBM=- z(^+F8WaoTjl0e~0N`kcni9)G5YYU|yP7hf$jr~0RdWuEUAlsx$Yd6E z?}!J8d|s_juzW!G1=JkCdg9%ChiEPsvlpsg#&kCt>v!G<{KBW_a?dC53sy!pQM6=+2g70s6|7{0(R$@f^33Y`qD^Xj^-Qx1|ekh_$5?5H3kR zSp!BPR7?EL53webc5|NT(Nzg_VnyUz-oVJ-Gft1*pAMo`_SrR2Lc$}y!`|{&0=-EQ zpo1(*?Qoqss0hcx$sJax!?#!g^k13C&iy^p;mJ&EzXj9u%N;R&e!XmPo;>$`4hX}% zIv<7(z@2Ou+5r^?dy>zAvQkK8-B*80IjhY_-Ld;(E&IV zEdZ71{;Y8_2f8Ryi&7@q<;|OQ+$xK|bzR=t;_UPIS{eJl@WHIUYaXM||HLQF!a+=q z|E^3DQ?Qt92NV4cj++{*a*?#`JxY>RKO^YC!kB-U>h^OK&Nx1f!%=i<0eK zq<0HRC4r`dEUH$W}Brb-*CXskjeb=;ZT~_z1 zmw5-*c(*lfjLb|kZm8n<*q}J^*K8c_pdCemDLc>hoaKR*XtgUI_JKdE>X?2&xU|Wv9&jPM|1(^;|Sc-35bbFsk#P? zf~FP)>j+uO?*K%Yg45{vbO8PUKE}_$E~^4fKC9Zn`mCDEfg&tq{OxZW;dJMeCac6I z5fUl5B&`ozRvDQ`z4I-Dw#}@X#kB8=aT{RRIbkiZ%c?FwmsMILq-NDjFxta>1CzDRq+2$R;62revi1=ta>jV;@h?T&$?5xYRWY4hGL6anSjK)&f0x9VJ^Z4`u)^uD#E1Y_V8(?oxjpT*k1pR25&g%Y&M|CTsuFbHN+gG#E+TGDMCIX* zlNQ1|iU?fZ4DW$_z>(GiIe;ibA}l-9cpw*qsq*~BZ;)>jJ3tgu@#Va&o|1Rt&8$MT zn(X53Zq@~wkJRhsx3=DEIA7sQ-|GSOO0XEl0l6i1Nq+k2&k+A#)X{})ux{*gL0wr|p3u8x)IZ8DSY>t3zM9#P3$nQ< zVeT$6_kX^`esh7p#9mAPD;w_UQ(`)LOG`t=WFKmDCb(0nHOj1@XIw~nElCHy#c){BJ zZ|wdg(o#NTsvo8An*Aa~s^zm+h+puy{mi^k056pd{+gxtjhUKUSV7*Q-`U~T-$-dre(pim z(4Ew&|26v`(#c=5Z@<&(y%r9M@dWsDH=Y3Nk!4Pc)<_6-=5{nQqsd>hACkZ%woycO z_p6Y}{#fFg{rkco92I-->Z}7P@-Kp#R!Ypmk4}j;z{I!N*8;oi_FaJ4h=y2B_bcz2 z9B6%cDVp>zG2eXx5zkltuRPOCAmV$Y@!EUwTh^LVp*gR2iD5;VC;^+l#ntn93iK2{YjR#oJ>i&Zt?8EzoX z0(RH<+W=jxG%$RuDml=^xzuG#>SVvo5}sx{*bqNlY0S#zf8>>BI@l0@|GVjxW;)mq zzgN7l^`RHH7UOneobD`u{p?q_awin$4!?GHLKXeaN1+(-JewJXfXa;C?U@l^RH4)& zeU4T1`5la28hLs5c|Q4o=UYBGfIh==InbGekgAXaVXVaVJjHAlbPVD(4v^j!;GqVxh@WVKUoEoFGm?!HF5H6XN8 zHW%ac`!vQ8FVQ7U>}`624yN-Enkb`y7h9%M#WFp|GMy{kaQ|5_rB^(|ogpy}1#^GI zvcx+q*}sJdiE6O*K~O`_pt?@67-jX5h$MY-^cdT9;bLAk`9m>8$Smwn6j#7Yt!k}+ ziiUkPuX}6fOu33mpO3$7B=m|$VeUnmpG#Ecg**VHewVDaai4;Rouqoe%aCMz1ALd= zk?H^(j8xQ8I8+*(=*b+aI6er^B+u9vM9!hN8uOC1kT-;UU=6AvDiHglBl{SP&Ja>v zD%$OpNa49yqpniJHr!GsAgw8{3?_ zLwS_D2Mp_J5jd3b_^x4FEVg>(S5}0F`oNwSDp&>2L3df6(`Fgn{v+z?=95DxF=G-) zey6n>WsVLRc7}_vIlFDQt5}?7Sfsk^1Eqr>o*0#==WLn|k5cRDfT8_)$7C&X}NbWigHEp7Zx0Qxni9hw69bV^j+Tm67s25WV_(v4l7+E~aK+Jgh>U zK(B_aKiJOk&TIF)^8x>4dFKFn-nks8pOEp*V!{wJD?SDS-{;FA5A0nI38LSifPa|K z-U^b}k7%-p5#qIHtVmd(_Qy@Ty>ZrE_^C>6zms;+{q9+7 z*Sx=Z6*>SPwJNj&dKKn!pjlB!&3!Ym!rIlYD1zBZG2?d(O!3ul@|wRk&rHE5O%nwl zupJ>nuLb@KEC9Ozv*-e-oc1fUnH*?t$(Mx0+Ay(i)Kc2|J)J_UB-%Jb`S-0*4(dla z-DtfbK9l#l^kfs_*@dwIBJg+^F`UB zBuqoOS3k-cDAnVlr?=&(qD5Z+V!*#!M->8EN3Gc1IBEn4IZ6$3$I&Ql9ktLossjh9 zrRSgN9hFC+bB@XfoaY=>1?(JE4d@)Ds^}e+%YjZepOu6(<{#9@eBQ^u6_;{lBq{gA z^9U&Qdo)^aJ)>w*k+Qia$lfzj>b56(I=pFtC4oSP^+`KrI>~-w+-B zu6T-HjjpAhPZ!`4=c2r2{=xEmz)W~T+zEwu(HaiKSx9kw0L}}-5X3r6cs9g;;AD++ zvgR%KvN`~lIaxixaXY{RD|n}imDLW`%bLr9DK7dY;6ITpx(8z4n`(>8-*BeI404zU zgkgFO#6k}9E05X9VQvs6Q#3;z<`R$D&0)>}Bbm4V!+LDilirFpz!j*WdIUHfM!XLu z&t&gR5Sky<5Z@ntAyOFmYfKRyl*S+%#bs_H3kRW;yBYgGlHwd&?wj8&B&WR)7?*OIM$ ztP*}3R=tqUstQ>Budy;Z>}stNoMctmK{i%JPkXD10asb83IVNEe;#V|-u=dIR~B`8-xdR|b>j(e zy2-qAce3LNgjtX1mkHtIg!^J$?o))F%M;T{^{F45&!WV@i1t{1sRV^|O-lV2d3$Cw zc-xlM*?dw!uc5g~0u|T1=eYaqeJW%0U=G*An92v z&}$!vVnuFJyGfdoW$alw%w(tO!%H`BSfK-S`dB>B+nyS67ExYO)9*(`u-7-6qx+4L!k7 zxLeQWDGAXLEA5Fd=85GgtNYkVNQo66Bp<%?SiZYWK^ z_g#A9`hF{fS7c-VGnL%Bg^q3VFvzXDJ&k-nuo?C92D?!&pImQw_Z>{`mIq_f8FHJo zJ1Ny$!q{Oq_@?h<{k7^P@2^h4_g%_lt@W42asV0ha$^S+N}1l3?Q$?$f2u|6&wWW; zdnaw-zIds(%BA30fb zfCD$0X`~&HB$v;tg~jJ)i)JDRk|m^M&4si5#7!0*h54Z{3Rf)TF!@e;m6INM(@U=a z+~A~71J1S5TSZ}|7Xy0fr5tF`2pJy|>76u^(YKZ@!zuv+-vEOa5e~3{q zP?<838~gP;be|1fv{Qi!!zwxeJgIh!wbuy%daE9(ux#m-stg zU^n3BPGG^izGM^vy0O^>h0oY`IFKwM#j#PcQcA`EC+i4gean)u|8X$G`K$ip)#?QN z!l{+@o-Y|WfKIIrD7;$BIgnaHO05qUqE<@DxCo3|9#~*qFemP1wF7?XWW|9acF=YM zx|zKV(94=F5@ZP}j#DLTd$~JNGPYp4`3_+0Bo}}WJ?0FDc~zmH_s&kAY43Y|S^>Xy z`m6#z*Xq*=NWy49)&qKd8aYtT2^rrgucsCf;kQ*p#!8#56_IMWE~znP9Q=&Nv=wH$ z*Qszm73LD1bD`O!54@eVfCC2Fnha~7w^I0=%!CsXJ^(`Ch0wo${tvtl?3OP!Sgu1itt{NsY~|FGH0CGPjNE(9M_UM z&FfA=6M%>0KGmSt@D8n8;}{Kvhg*FOW~3^;A|LtmssP-P^b&d+uq&mlfUcAl18Nxc zmeNu%8ry2o=zI{P?CNWZ8@Ky{QOg;B=NHZe-CkfJ;P;%sNx*LPRSW29Rz9E~w_y$> zOGt4XDOo9{^zp~7tPOwr)}{2d5}2V@)+b)A9Dz=)2(VjyRRB7*0)SqvOb(=$kW%Y@ zlt?Y5`A)4W)RL_Dr(RY!V93cT*vOkOZRsimbfvTl3NPy&4kSxR$vRxJQcCGu+?-lU z@AsHC7m`+w`J=;J?=f>7=3+3CFng}mdDUlL=T5*OPUoymlyR$b4&Y#P#lQ|Iyw1xx zP|^z-Z-OlZ$!j*@w^eT6kmr&rYD)F^SgIy9rWA!WeHv57`r~~XQ-<(eG^Q&Ap{5gb zr6*xg!(S=Z9SjgfcFyPCOYMNW;w7+cfYb3vG`PDo=64YT6e*k6HnDbLdsTt}1r|x~g0csL|G2l^emROsGYJ zI7E)x1#YJs-YsaNmKE)Gcu)Gu3#9~He}dP@uB>~jq+v-$!;={en{(?PFYSE|d15LpS-3M27D-HEnK`S3N!PQF)a)85(i(h2G#YE%umW% z?!GIN@+6X1coBQX2F9okmdc1PhSvS|*p|}$GI#|=Ny7&j4c`n6HB}N1=SJ#bpfoY@ z+08{be<1E9i5=zTiNJ zWBGIzrcM|$P{%k-jmK0v%t;M)-_ zOd6uap?~rzrFiyR3WRQ*hI306>w<&1l2sDjzM&^$@{VjyPY&wC8~baZY5Mp3#d>e2 zeKO@}8?T(qW$X9x&5m4wUp?z*3RYF)G69jAhs|=WoL?~<(~|iJI^nI-aDI74yu4*% zQ-G`*()hL^Zz+8wFt%l~!+k2;0&TlTkBApwUirX_!}()cDj!*osO;4`YdJ4eIkahG zCYRGr9eRoRtsHa;zvN4KIDeilH<47j_@;|&*_~xAGsD-S2@Gfl{gj$?U*J);S9a%^ z==82C5^7BI^ltq!jylIQ&+J~yNp(rXQ3FCV7R#@R*M)MjlymoLHz;0>+Q$tdHBW+` zxhyeOIGDb=#|)gD*~=*jW;>^jiR3kJrYJwH@_3Uq3;Izen8*POkZsLC;!%f#NLzsv3|dA z5#sD+eFJRX-`X<$ma`Z+^5#Eza7)UxCJ@U^E)AHxgDz?`-KR(=ZlOw~lu4zFZ&3ti zt}iZ?(T6;DC69rb2cHt@mAwobI2|32cNL-ugs5Q2Jd+DW8C&AJ|8et{L~uzZlxd9X zo%sHl>x9^r5hytK&*n_AMQ?PSd5eLGDYdbC{gLSvoNK7&D}Bg~4)|w&oG@1Xg;?Uw zhWDm&Ynsdo`tp(kcp+qF_5^Naj6zWXxHnD#3;^2lvd1Pv`uyTMg~GXYzBr zjn);?GwBrOGA6e4%Pc;+mFxzy3^MBzGcc(jdtLaEseD7<&()sRGEj|6i>m$I6|U}& z`-iFrm4vt6&wCTSp$oI%sC*mTautsyQ}#31#-(d*?=D*OkJfP=^ft%b=_{-0J^T}T zQ^Ur+OYhlB@`f3a{{|8MlK-9tJAKJKi`5L1{R#h>n>m(L?avw8vW$kWShtk*8mM)P zD=1GACq;QxmXC5L;GH(g9f0)^M}u#DY%0fc5L%e1L0+DKmlxzi5o>o#gV$ygMp|+o zNLd>A?+~`_XwzyAzb>uX0q=4ZEDqdhD_A$6TmP$*sbD7CW^*JFZ%I_rI=$+kr0r3~ zKe=(%@TA7``!x0>_Z-uwu_$pHiDVw!r?KkiNo;faG|s9_YW%d1wmr!`U+mLZbV^ds z`Oc+F?%Ucq0?V*1D}$fi@-r7q1My4)i1b ztPH+nphLht2W0#H(?G+(t?;&SraoVgxQ8IZJh z0LJVc=$8}A)%TN%JV+jhy z<#auLA_r#gK)-N2U$W${*uX}6G5K9$V^`K)n;Ul)%|Hf#e!u6WM{>OM3cy89`ZVBO zV1ja(^thAWBn@$NAhy4w`I)Ebb~I-@ z|6K4p>z{(1yoQBt1NAm@oB{Ksn*6BeTGp!Ew zrgQ@?1C9D!fb~Qz8m#@mp235V-f9q!55>JeajkOlE>iSpdEg$n>n0vk&Uf|PI{{Z% z?j3-Z`%aeoauBAR>lYrkdhYd(`yj{t7;(SFai6oB=iUyu(sFMDwA|;eH@eRTA?|7r z_rt{9oW;&@+#ge1X?gE%xDR*Sr|sdnw*o$8xz__)?x$MrjUdEb4dSsHUJHIK&#ZOa zPjcLw#r;{5!4!eLJoj3_r!DttK+C=7eWUwC5aO-|ajz5i!^AzO$)16KibvFPkhs@6 z?vcGc_X@y&S?UEDe?squu&-@nd8fwzL;0K<2A>ebCdp@A$ zKFV?rgAjK$i2Hna*$->iJMKSm+%FUNxmYFcS^IkKIe@DzcYU+ea(`o;@k}NNaaV)5 zpCRsr@QAfL?l0pJwG4s#`f*|%=QAmZH6-8*mUS1PW!+#|zXL+7)gT4|u|7boyBzE5 z9qYf}mALEgVQ7%>0WM;>6j=A~TR4lJx_s5JjKCRZmW(esvt&ZaS<6~mOHL~}wd9nN z%2R$GY51Tj()>+X^Tw4bKa91?2ikXu4n3Lwd9Ofub8yzsm-9w;hHjOEOBSta-F>%` z=qarEK6ygtF{ROkf6YFhmpvDj?LDZubKv%oS@YWt*<(<7OKI^p+P2En;;S@VP|jOa zbX>lq8w6Vbe0!vLAS=4e74^^?qP#KD#wFD}aUN+7UcNIgHZc6gL~~bU-MrVJNb}H% zAWgqWG;>AIO~M7Mz>TfhQpOicq5P))yn#H%J9I(r%X!he|2m!O&^$gIX?is@<12>L z@h!QFdHQca1ltPvKBB53UTzKR^aWf|Bv@p?(r|HEjm(6`o_A!joR-C=-Qzk(!cAJp4jB~PiB8e$_?}mR@R7>z`THI1M zSZAmvhl_l_i%e@y<5PJh;x;6BP7?V9L(Z0+$R&ADWrBR3BR}3CsVR00= zfx)-_`FeIl`<{e5l#}~{g3tCrWw-!FLvJ4&oH240JAfS->)%c37~R=*`+jn_BX{o8>AmPc z-9EN64;kfznx=DObd;|mbCk>8qH=uQVc>K>IbA+wUZB5cq~$tx^;99^i+Pfjp`(R`PMr1(gl6na?y9uS16jq}?*Tgi2inrs z4pRl_Mv?XA2 z)7S3yd!85nHGOcbyj~g3<<04@czy?CW<|8LaZlFVbL1!zsqtnNTQ+g?_)`&2jF;w*fw% zt@MV4hI629{xKszo4i8_oBr!A;iTD8{90Gv`lQ7izPy&?l+iLg)U+pkrd}7$HAlDJ zZxtnFn(hQ-w1!toS!tim>jRFFrWiGalN%S?dO+Qg3$_-p9^z=Q`rl^uoeV-#q#86u zzK-wh3HUUVM$E@b78K3(H;AvB3C&J$iOq2|KM@VRFT0)je;K~CYRRe6r3zxFOEqAD z)ujSZy7cCBB^ZTPEy~jhDf4{^THtc}SwyGi^mt*Q-FO?n$SUGmr;}9-cmT4DJAhqI z*8{qoE(G*BJ%R(}ppfwwV5^UFl34Ftf2c_Zm(skH0|GLGJsVWY(s0%KeJHyVGsydiL)dhx+d0BETL+9+nxVQ*@6V4g zRtig_MaMMp_OoZ;W5QJ4JUm<;y*NCntoZ{IB`zjPiO^#!B7DoZf=`8(wM>2?pzkeL zm9<>AB47vP=~^T(g_VBLQ!?_+y5;3j_%y$(K84Yp&~}vGE_fbd&^jMY*!{P=>)|Ji z4M^cz%vS$MdCl8es+GRm^U2Rb<4gb3!|YcYuGJh+Yvr9a%q%0QZ_+PP7J6*CRASE0 z32qs{`hYLB@%?5dNJtX@S7nA_lo`e_)?{I$Txs-((ve@?a2_Q%AAI@1iG0D?q$jLO zSM#&-4e5>h-l{KgiyKVA;OZMfx@Gh0rMyC zfY9(dK5xDymPd*$&gVbNfEA8re8V6oGt8VGJPfO@94q^7ec5b%W`jO$N&Mv*oAv5E z)&ZLNLpKj#_i6opeHkiUEkp13^?zk$u0-5glCClf(aC(G+a>9;@|yj}Hoaq1EDuGx z#x}oK_W4UCwt{jsDBPw|*_;_JZ?W&@C~NMVUw}~y3i&V6ym|2mZ{anK#)#lK+>?mn zw(phaXsE9xms}C*0=%7M1=|T&kG6no0QqaGozSXa=d?0f4+R-3GO{+ryKdFM+z`*h zK`RF;$<~>-2;=^OsHU*6z5uide90pI;|kx3j50oL(6FAB;z^CK$rv0vsBo=atJ$68 zA=AUNOvAX~W86xEPuZ?T2izLm^pYq+%#-Kvff^!QceKZIP0yq#Pe-bP@>*f($cw|_ zP}9|uiw45 zEzv%~ns#RW|7qyJ zr<#`>@Lcm#4NEgPc%FZ(RS8M(zHb!8aZAa7C7*_dcXAFpc4?B=yXAHHnsSs*#y$CF zxay34EMXgu%MYv!XX89wMIN*h?D5hP>CYJ~>uY!yEK51zsM2s%AS=Vwk>+wu$;>UT zzQI><3XXe$TpTbtBzS1vW4qK14ecGc#!f?SdR@w}($LtB=J@<()n~%OMb2Xa(afgG zX#;nKZ>g%!%}_ESj!*_Z(RJ=X-X+B6%os1_E!?gPwyfopeCbnFUIW>QEu)IXg$;q? zvX;`DFG498BP-K}KIizBQ5_}oDNunD^I@#A8t$s8+}JZus7TFNx@P}_e={N(ToRie z8i|ZZl;CnF*m7ZCMmwlS)Q4N z@R{KvOKvLPxaXAemBD<%$(=>C7AIOk5p7z_gGDCT4INpSlT-KCvX){dgHjT?}y(#hFGgnSsWZast1_$pc+E_G8t!}}6rRmA^|Yt+>%J#tCiOPXIRKoqo$QT7JgaM?BPYDN{^& z4Qd%y#;~LD^ zVyD!iq0dswPwZx#gC%a6MjDmadjl8CaU~0tY-KfXuvztLY4ew*%{?sZsjOv0dn9A?*l6R%9xk7iH#a_AK;N?H+>JS$SVx-YKCJ;muGlS~Sfr&fTrama z+m)N zJqOsyYX@}lssSYrf{B2XeIre1@!X}Kw3$s-+S3iH1WXF9(yujojz8mTWy@>z@F5|S zvNfU^g|lM)n&B3IhkhIpIQUvgPH@nu zRFfJtHmInya%y6!r4X7>nGPfLl=kp%ZJSnlN?TfK%dvnM!b>2cXaKSCg@SKoBB%jh zh#>O+{`TI_WCCc<|K4*y_j4~FGS7b2-h1t}*IsMwwO^l5q_iIUadMd5pxrAl9(@v~ zW*j%@5oSMcN~czZoYtXXA<6PBPa9cQFW4pz#EjnD@U>N5Q-mnJ5wP(HqM@*N&M_~NHrm58jHg35g;GZCY!zB=h|8 zI&yq4)p$r;UJ?qN5>ylGGQ#S-HD(7QmS0_5V5NPtlFc-AC~x11k}u+O^tO1TjK%~t z1CaZM$YCte^h;6diSJnzE3&g65QxJ^^>+tt+Yv4|0Px7!%d7o(T;I*aHC&Z7xJG5* z8g9ITXx&Zd>6Od?jo=ou>kln!+dV)&{G853u!sy@fgx=B(-(=qKtfy+M z)U+ojS~oBnU+-=S?0slop)L?*FIEphi>&BfM6GFEPNpkvo%~4R0w$n!VZTuhcqVw62}0>hEi+I&pGx+~Lwq(>}Fa z+n$?B{q>*GYLUN@{pAnX-K(qs+7psY4ec&ctljiXiYw-sMhxY8DRPVTQHQKGxM2Co zNI=sFxGPK>N`mukjqW(zw$HbE#N%qs(`aJm8dM&F>vJ@f{Z-tINa9>gu;atLd_kiJH_@Y7t z%Yd<^duBw!t>Q!svI;pR5Y9dhQVUz_F%{g#X$fsLok=L~6iTo({*mgETaN#_tlb+T ziIFQF7tXf^n3aJhv3ezGSV<6h;m1`*McukI>9Ke(G#^cC;4b#^%g|VQ+Z&!wWQVia zKo%(;Y={#723xYuc4W;UizVw6L)N>FthtfIMHO}H(`7!UCBNv*wZngcX%p+jwF7p4 zU~@;O$2A+s?MUF!~*Maf>7 z-+BstYv@z;6Bx)27CGtp{=r&d3hh3=>ELa_=6|OzVUcI~A{KvEEMn!SbqUKpX%GG0 z9kBbZ|cd!gL6@P>hU>>ea}=H!Bzh!0-1CO(i9SVk&H z#OS~if83rMockZ7Z5mVgwIzl4)j#DWTskoLAe&T}@F^`Q1s;5`N#M}~gGqMAkod11 zBTrEW+yp8=f(O7!YyQz ztssPjv+}6&pT7Ud@>c>;+IOe2t6pu_jVZvI62ixz@nWn*=4$O`FjI_X-+f~Kyd3N* z1~6o%QtGxQ=FIa8!lYfId7fJz%-1A4n@6zM#zVqhGR-6pL?A0eFIpM$Z(o3bnKj6F zC|4_zh2iAoy1w`|(vGj=zOh$g@wb#&0Gs(2WPVI5hvpQ?JH3T8Jo5wGUmaZ#OHRQd z+d^-BgL-xlvGo*OAkz(zo6&fz-qC#4RR6X>x^>{8x6EL|`7?m^0s%T3;irtdv zOg@B#y7{-O##Y~sN%XKZ(Ut+nB6@*Gw8P!I=P06Imkg=vuryu>jeT|4%y58*RC#k|z%MM?=)v}WCUNSie_aSN%9e5OBH%==jNFoi+dh}$RmI%DP z&WsD+1t1w$gyeQIa=T&-iCR-mqu%(ImFTnXvl`Wf8oTm#61?4&SBSQ_@`?z$@;XW3 zH0oJ`o<<3*(mn!r|I((p(v~)O`Xj%eRi45ut3)#EcE%=0j2Ruc@OPM{2WRSI2binT zfk$t`1kE|0T;k5MfoW>n2-4eFrV$=8+l-oZy%KNY&JsNhcQ&sz+*t}h+);$+y-M_& zEq=qvEXY&h3fi1wtY#FQ0(b*J^WM7d&|aqh`QDI{@!Vc-nYe&?1job{f(?$WF2ati zodg|O^9VX7&L`+GQDEU*uG0Dub+K2zqh|xm>`%{s0a4!Z&|}Qh?pUHA^; z=GWdVOk7BF!bRh?R;xu>gNBva4H}(ksg~H`i2<719f%I01FKWnz=mOA%$5wT&`a=X z{oJOuf$H~1MG|L)OV>q$SMOB+5?!g5W?I*9j&`1{=C-Xrk04t@6kRSJD|;w0fC3^? z*Yebja4J$du{d|e1z6|Y7`C*?F142*Vq)lvDi-pdbE0F@tQmf!}9QF2Pc ztJM2Yn_N1U64MpJBu7Drpo$VWN_eNGppu|l@E1q>Q{V@p)xU8RKE7`MmC5@14n?!! zhUEY;ZTEVtx)4^C#E2X&Rs|pN7qi5B9P8Zez7_H)glA1ZZm|&mc52nXfnYQai?*k1 z$m+fvw+z!f%vT@80_5g2P3Guh_sOisGL)7OWeC{3etRI<>!g`Es7%UaL+q@Ns;cdC^MB~e8-O>tEfS2q!E8~o@^I|#uK^S=#YSJ!LPzhrVe?mOiU9J{3^8;Kkj{)fh=75Qo~k>l_^V_)_RxY=QN`2#{F+N$X!6h%wK4FN;rT9#*=yVOO`D1iR>wsGmPs0GDFj89@bFKKv8Ag9|pT z9C>2cbQ*R~TX<#pU-q(e-orc(E)}PV6OsADG1ROVcJV&{o!%d72xbnTGR<|)Lw^-+ zW>I+20`8zW&z6hO=D+&BmE~jmvA#xE+8dm!75c=|ANi5kSn{Wba`p92D zt?8oy^_Ru!G+AV`GcnL17j(`hd9Gt;ZK?m}*m(El=jQ$_oV9vyHEd^xN)$mmjPv4R<};khuH#(9ph~$7R&l|7tCg3 zcRej@U%z`ZRT}f1$3}8@Yx7#k!Onem_*N}uuFNLbMEV%BAvGE{OjM6DH5T6+i@#wK z+BC~AV0$&HF^WFLsYW@$FM$r|aDt6CID(+MK(i!DSh770sj~NROm)(J;OkDu86YUd z5A?2Vt#e$8uD%rJ;^IlXE2VET8{$7>iE5#vI`6zJGT|JtgHfe&Ci3QnSD(T* z-C?Fcrr4ioRVFLx$WG)rrdQ13K?h=p7G{iHFI?X_Y|Dpc^`Yl z*wL_dUL^6Ev25h7#Cg>tJ_$? ziag7FmnS0M|M2pQ{109p_dgh`d*bqVWbTKN(&t&sV^>dWykHV|xo4T*ch+8)IFpkH z@gLJ5`(IrCc<-+&<6Zl^S06Yz-nF{-%%N-U+;ZOSr}>6%z4JwO*!X6yJ?UnqG)WPT zcZOH@+En48ZDa3jQ@Y5|wJWkZ4$mOP8}a8>f8?;Nzw`ZpNKO2Oq5I;`MebZHRNDV-y0vf>t6ES8R+66+F-M2 zGp%A6>F6`OPSe*DiLZ~u1HZL-7w}kBX7V0~y$UaPtq_)A&G`_3#p>!YfoSA++M>{pE13!L2dSo|pp`%K@_Byg@ZcIiqr$r_#QXIMg zmD%7g=GT`Ph-LPJGhsnv_h`)QW=guE{4+U zntm;H8#Y(%`(3kPa#&kDat4#wYyHug2Q@L)@EkMRAz5RNikW}u(_%CCs5L9%A63NP z(;8=Gc%?=dW)HF1_9SORy|GyS?Lj>8aFcT~?$L<zuSuNxx%ymNb=i(3V zek}OtaVvIk>4w30$$*A|@viPB;X~LtxsR14)h-ENVTTnyeJ|TcV^x<0)RqE}RNAg| z#9!!2>2x$P%yh(#)ZaXY^Cbnn|9v72AeuDC$@|%2GS6G;ykm7=f&K9=q(_zadMWWH zT6ZdY#_9I1J;atha{|i$o;v~M-(=QBlA09BEyw)jzvm7={5DX{Fu`0bVa>*9 z9VetU3D%f3Sn`zB)o@Bo(SA$2M|k zcNf!225*UN_>kH21|86C1cAM++Flzf*!_E1<_T;xIlmzI2e4?PWne7$NU`-9eTYu82x(NocK@_Udig-0sE)cJepxA1fb#f{Ovq=#(DJZsvB5ife=2^Bjm>lFK zm58lT4u>ZPGP%G)#->zBev!T)^1G@}d=ZNc2ttJp5Dwb_ zwzr~nY?iPm3X9=O%|BOIjVZg2BqI*6`-+wH&|uCg)@UmhbcFKt^4y9{Asn#}DX)+a z<}z-qdD;^;KaEqf9=20pweD4U{FEw5;Bz zs2+ja1a330qrgW3inbmC@{wqa;zD?S!4C4b%kr^sZ(v_ zY>b7kXMV|auO&aQ-RqYyJM>JA)~@-@#3c6hty&BhJ~(^sNhpguSrFVSMqgi?a-tvy zZt)<^4w4c?Ggz%*m+OnlWgttgF5pP*uGEBEZKqjtGf&qI8)9s4UM_mriO8c7L+Q(vBzT!6PxD-kymbUU@&s1qB|@9Qy&b9Z)5Lh>t)%{zpB{O?7sQ-Os&wS_ z3SzjIa^#)j$oq^VZxM4uj=UuVBbGePJUQ|f67!5xR>L|`ze@J!mqz-xmUt8ts`$Z!I&kl zh@c~{n4m|Vz{>n%q3y@Llhed_mWz#Y0xV27BTni$Xi12E0(+#f{wg} z1U>Qu7J0cxk@tf%F&=q^X^6+l;{-94`kNzfLYlk|N8UHVtP<|Of#=M1>U?ipYerOd zc*}(t(fHPA9G_0pQ0lqq!vo*hgb=_STj z9E2}Y9k?PRX;onJ6C{e*L}T&k&JWBWTf^Y{PmgXG3yaNmB;#pT1%~{}Y~ljTForh_ zYK9Tg@+R)sFteG9ozZxlhR^ttK_ePWl(xYK+Mp3^llUXea633U^*3g4G(v-;;o`?n z)m%*D4Kpn+$TD#VNJ$#rLI(WM|_`NqMw`t7%_n|xW!6jKuW4^Ue^Xap;IC=^l^NLy=psFNcys+9&1As&~ ztla*v9afq%cWlvdgUhc%@QNZ*wnoV&o^**P@Gm#bt@qPuCb=|ANn_Qg@fW|wZ`+aD zqBJV8b+$`0FP&zROY~_Q7oVCG6PYpi0v8nrbGe_I>LDqf8Hy$Vo&Tk7o+V+k)gxBL82V)WQVEn!1 zols!rQ8{MH8r(&Y7GGnq&)PC|@bb-l(f=SipJ)dEzYxA?q6V)x!Fba6!aCu{UV+Iv z+&9r2I8zCzW8z|c8mdm`D@H7zspUvXj#;-(t)t$v+RB6T+slKGzL~fvBjxw{r~Ii& zX{r^Bq~dH%7|cOr#(}YfL{Q$iu>$6d8|Miomhwj+lQGHdZbi-xS|ex_A0ybIa|B3**m3hT55;V6=Dn z7O&}2H$y}u{`#!8`pd#iht8gU5<>;Eyv-rS)E5xB-RD%)y%~+aVGb?sN__^9jUW03 zqqJeIMNpXPy2fD9qUa@KOJAQBs;J}C=0CJn@#b~l7&5-@O=giC=mkI|hz)&%qjl$7 z3_k$_3m_Mn%Chjw^k?wV{FCFGo4RkEnx7o^{aH`U$g}5in%*c1&(1%wG-c1)Y>}{y zQhS%Hy`wrlS*cALRWa5(Yia&TM!Nrp88-w*d@SR7uRV%!uLC-oalfqmSjH_Cj{c1M z6`&&-cM}*shH+sr?msgax90ztafx7f*&W<+sEPVi{O_v|53uv}8wL(?zlQ(weH%OlkFz<Qx)n-_rbh;?o?K=VF8Dp9GO?SDH!o&JMB^_gPV!^ zb2?hW5r2pBhnNFH^vcu5*qi@t;~vMBR?rQEsk2_3@gg(6rk0tto4H3P+RO=P<|3o< z{9<;Z;S@}I87s+i$`H!tSt}aMB)nOMuT5>aT3!I&!+Kv4o8YpdD~jB|Xgm~+SAwfj zPddBGBK}JF8_wS-{>nF$N0s>Y4dt<-qV?rh6){nrC@Z#9e-`g2-mYcfd6cP@|4?|9 ziq{hDPM*sv^}@WoeeO@ata`r5@x@@pwz2VE&L4AE$os1lojO3{!h=s6$!9`*)w5L0 z7W6f<%d~!)nGhnasWKBn1c&k`u$;Lrae|!$1es}3a3_zP5d6^Xp|A0x<^RnTY;u}`4z8msyOZF#4xB@2FWRz01ZgIf-6lVi zvb9q$hn;%O#p{4*H;rQCD=ng6bF8d&2e}3LJP>(op%q#Z5+q*`p0O+Y{3;1Th6>F4 zn5zjUMdQ7AFI+TZHhxCggdOLO_>eDk3rGp*dXXCfm;Bhc_PEO0org5w)Vs7y()){3 zU&u_I>!mhl@JwpBUPDq7JL9Uc0a+?t!lh?|w1eGL6=lzd`mpQ~dC@lnY_FGcE zXrXLPQBt?n=d%WAPjOY5IFGy~Mj?w%k(|DV`j|5XsQW z60y7vMC19tKW>Kp?#bYPlsW{ZjV9SqY6>w6J7k!o4FBme*e4lE$S~2%(Bd+%tU`u~ z%Fy64*e4l^9#d*`%`7i*c-KDJSHiE;%7MWI>3aYh2G|VBgPY_LE2ICyv*Wqpp zn5V)M^Nms0n!Dc9f_u7IHYOKS8E7zr>%ea2DtLM&Qnc#3JS9tt#VywoE1q>!toEgT z;UUn(2}VsAerGW-Nnt2&$;^&9TUy)*L^vufj<0$+a>7mD_4%fMNvN2isR`WTVVYtv zsrfA-$@xYWWE-anQ`;8eEo ztu5=G!VntQYvNRM<>JJ$?n^CTk_AjE>;8~4-=vsq0h7zjA#m{9`J>-I=BJiSeWK@( z?+I*12b1Ar&Dy;))QD4!q~Pt} zWjLQc9rRcH41=am%$f}z4#I=kiFdkbB_CS3r(uWNhP~LHYr@$I>*U|`F%l6@LDvMz zJUq1qkF+L@M=!DXN5WHX@w^Qoy9e6@kcnZ)jNNR=>?a-)4A^dn&q<5M->oFXY{SRO zx_@HNsH@5~@vtf)9jS@8kSDN1{^IMDO^pdh0D?<_~XMf{zj!hwgpIc^y!#-)B z7P5k&%VCfiRDUkPq5;XN80CD(<+M*{J;?d2%V`qpMTzfmiS3ibGEO8GpRDjU7Z;gg znu|M39!j!ItPWi0GTSG0nL^H`898$tfx}Iiicy&d|7NRZpOh&ndEDyM;^LG^#YGJ* zCP1{Ri6U4t2+x{}h1Wntt$|n-M_EuA67+gVgxWxQOyHb$5pcgFz&=T?GG!=sg12du zul`nPl(8Wm!a`zX!!;so^AFKXS)yX3 zrV*xJuNP&brB#8z*8g%9u>wIwMrD?&7nQ1(R$bb7+ETw`nPNLsQ*q6OQD;14ZmdmH zcb&()B4c-DIMSW4IO>csdsGNxlxhv9`PHQjHGzvf`qZFC=*kUAT;{~nF}#ny1?h5M ze8-a>Yg@mPrjhFOy6P-SCtvI(FG)9|sq--t&+rmsZBP%@$@m)lmY7Ody(B^4V>RJ9pbZf1v;RG?v@nhmpsr5 zi$|F}qnZxMC1@|}eg*%6YjkBwrq<^*S#wj?{g4HBrojr8bzfz{GIln#LS@|ta6&-R zl?E$R*8Qjj%SPMO3YB%=W?h!RWHvw>dTZffhlDc)N1!jqK;fW;_GCigf`#^GLg9gh zYU^eiL%9dlCQb{556rA$0xd+{RuzaouG>oGn0#v|eVA{C-{nSx5C_-r3!X>k#&odV`&0!tilKZLlvON)m) z;47KHQ4Y9CB!lL*ODyS=DAAEVg`hU;LV7L1MjO=aO&;k2D|3}-(9BQk364Y0IZo(A zB}X{SBu*`1q{DC3fR>exc?psm;kU?yW#1oCBbjj$!wtPq-@sZnz)HjHlk~NuRD-8e>P0F4mrH4% zq^u(4e3w!qr!K-#hI6)6C_|CTd5g*`g2vbC9P#{EN0>y_brm%%>CU{y@( z1d9w#l%m!&e24dHHBY#V%HSd(&1!h_YBfk*H2Q4@{70(q_)uGEoI z;wEpwAnP;<=9`0j(hBpA{)q$?eMGMt zIsM4PWVG1KU;WY`va@mAKSz3u2$};IQ@o@x>ZOkZD~l_ss^!$B1}VBo)zCt#kA~MGSy3@&Q|Jv1y#&(L){CPdnnoGxj}p5>JqyjmAbXmY z8ZP!xw6a(psipp;{yED{&hqr6&D)%VVz#c{+NS!l?*9^CrBOcXaZ3%$y6>{!1-w|W zLS@~jS+LB31uIn6-G!5n<^*2)t*S~x!8Ge#YlH;}uo7sI2W`oOQaPJ;Q5p*K%cWgQ zEJOw`hv3HdJm{l2M#mpPZ_b!(?>w-|{5A7s)HGe=mc{JMKvphV1 zNMQLJ6EDOc%HhR%$@v$#cS!+7abKt)c!=nLxzT<{s`d*R5N0sBFC`Pg!sm`uStg`h zkaK{D%r;2y{4A{kQfuQ&>PApQ9cel;;HivoPez)ZUKlRwe7!8~5@0GrHxAIfU``Pv z!u@@%(C{?(@kUJ+63QaW~$c{P}sb>XN(b)apbrQAMAEJ`J;x|D&gAUJEKMV9xU zN{Kzq*Mfk~^_p`ky1E({+cQ%k#c`xUCpkJOZBB8on#6OeOj0`wTw)lX`ogQO+X$r- zDTnqZVTMQ9M7drfrgP>S0WiLuTRa{5ic#0hxqlVSd-v}}J2Y!9yC(0ohgH`aqq$I~ z^=A}0@3wE5bI8_)YkfLRiBf3H2_=r)@0qe-z9lynXJImv(yw{(X-XxQLYkg9zyIZr zBUhAKPw^5KgOJOEmdg)Ks8wM$K)jB)s(N%6axY3KR@;GRAZaEI_+UXjhvR}*p z%!oop|MT##4FfZJ;v$bMvllFLdcVpmktOf>#p!hY*>#bZD9tW8(%wz_m4+-Vt!%2D z)w2zo)BQsyl)q~bMY@C+04|_y#FCGtYK>P@>%Je=e!uqO(*&vggfC6iiXE=~j-tx3 zo=tI?jJVoE>2O%^PZX2A-T zb>~~KY@-D$RM!2Zo%JesutiO#3t2;fADFQ1FKaP4R1I3WBE5wyHj#~-lo@I17X}+S zB{Nc_yPSN+pt*RejWk`wDB98Wn&kw4L{hBoaDt6CID#P72gmIp16C(-{<-uZzBV-*l`@o@3=@?h$7QJWGK9=T1lwtIwd+6@7eTTk!1Sbq9Ts|WPAp1=Z54Wh znUj#!fj|A+(*C}A65VK`jl;)B6Ii&Y(o#Gf$TBYi51KV$Q)IP93SI&kC8)rFDS`Sm z3NQ)OA%Q^>1Sng1So)-}79i>VM-n2LlK7|-imF6k>d=eMTr-nvyD_cLV%h8EXQrnr zp7WBK5t&>l;Sx>Jq+N)#=(=BU=t^XOeWfK5)rCg*pz zm>Gnd1CED~kLZvkbZE3S?6OLwE$j z<7M1N=zl`!EQuMVK%7VcVkof`LPW14x5rdR#JeiT)=+V{kXgfx3k;|yGgU9FOJ2^U ze{I28--P@`;F;^U=fZca3isnee*oIExMRW0&y1pRWY$VlAq_Cttz|b$RwOIgAcwZ; z>s^f`)5~ysQ%|x=Ura04CWLbtwgn$y(*zr*yU$GK588ZybkT5pOC(z(x&^R+x=x`T zCmo0;YKp5?F&pNKvaLFq|6bd``%fgn#aysQYkevj*Jn@oRIQ1H$(YxN7qShzZBv=K|?ia&Q}S z5YaG~{prrwVQu4+-^~`u3`yUtNPd|X#mq+ez)De+&r=Rfu?Ly2=8Sl=cir8-@yYzQ zSiF-;ZBnIl$RUT;F|!dNLe-zboO0;gP(+2g8rYjSh>4a#$MMCN>}b;lNL^nTD}BCU zS(GcmRqa^mp@w!KM0{X(-*y>*<3QNI#P7QffBZy?wH(!+_UrZxl{##HF*X|!&*RT4RV=s(6K z^S6hvM=GCLf|}ymh&mbF=BO_^&)jh4V6saf6iJQhi=&7n7j7(GC(PrLW$oqJcbOzp z)k)RbuP$Ac9M<0U`EMf>oICNqCzFR(w;>(~1>K|(3?uew!O&dZpn*sPlF^Q2NIKSX zsp5eF?kh}xH5fSWmt`)-IApFqrq>R4(#3KJu!2q9a3lxT=fp-c`4*gYnXzUQRiSlU z#5b{c>iD`3E4Y+TV_NXD3mmqv$t}M;n*1uGlZWiAr*1}o*5=MiZnjgG^p(5RHPMIn zz&F*CkKfI`9O!B9{I|WQ#!%04?#4P!&QYTZ zb+{iVOsf3twj~g($r&1YjD}cmH59(1j2lqKCmY(__OQsc*=z>(ePFJRF`vd&X)UHS z|MtSNGxEmA*V#|>g_j%I<3obU=9i{Y$MJms0Pn-7OL7F~8o0~a3|v0mR`fLN;x71e z|9Qa~8siW0ucpm7K-8YK`?r$8DX64+W}m(CYFu*g_MO=qX-ouoeDYp)JYwx)SjH0i ztMSRY52T7Et?G1P_?GeUmt%3eZB>F$TT#~=OWt#MT=Jnk5^9w&iblH_-fb&??Jm=b zCF7Ed&n_Ru^j&i0=rW$PnqT*&5YWvapy59b#?8O;BlcFZ}Yo)c%u&7nt{+3fmqy=PUt?3 z+-+4zE{F2n+>^Ly(Uvlr^!@Erg2IC_Ic9ygk8&!&@V$eO;d0w@q3Gig!!+5 z>x`#w6E4jp8C&oauyTYQ6;Sz-dQ!5SVOXdR(pZU2M)=Ifpd|BC!jdT8<6>A07Ig9w zt$Plsdsb3cksQ1w7T>73)qmA3B`>E{_}E3j$Q$l$yU)to`mEi5j8Gx<6}nV-YH;p( zh+TxPWhz>z9wRceGx!K5ojW?;I5X)Vu(_84Yl)P#mvNE6Nr|v9R+?mMr^u$3^QBE} zwy~?Y$r0d%^jyRBebid|Px#H>4fwe!*XKU zux#KXD(YYO^7~?qucq*gqT)uH&Yj@V?rA(EyfrN8u+>*ViLnSAO>&NxPIG>ufNd~V zbu32Qb#0~pXjmotstzkQ8sDU0fy7}F6z6UiFI6Np(moRknXT&5CBjKM1KFECwTSWI zlU;pk(N80|2Az5sjfiaSMIE*p%lqF~hpc0$!xDWEG0ZmxO6|0HaMoBxZ_*LTJG_(c zG&VWWPj_o!O^XdoLOqpBW=Gq6^?A}EB)+oy6>j!Vobl-^x98HlB^>?YF}&#@e!C6| z!IZ!wztI&+j5^E1<|A-;AJ*AQKIA%79EDbi1%;HLIRp7pySZPN&Lh;^ZjBZB3&+>( z;;V(l4CUZ3pH>bvzpg7{qx8%>#ViKJDW0jZr|}*9CaoNHFv5bxiXnA3twit4f?pHo#H+|}1B_lg(FU%81jw=G@-v9i)BS&&!6fKB)G!7QN1(zweIYZdTTg zge|_e75$lBii=oY5Yy*Etg+}XMbpd&MGjWW@#iAbmdvF>ykD4e+Ym?O1Q zlxnzksw8-=Z6{T(5l$omuiav6gTc@Sm+x zP9Yee6re=}rId-lNK0-p0LiH$Bv^kDkvclty39%Va6ycszUm;K0iv|mLnH!m?>~H8@Z$@)emt6-EGs^idtZ$=^-!_CFragYF$swbcPyOvim$YDhQ7V5n{A4wOuAF> z!rM3aii&pM7~hB?1DF5Cka@FcBGTs zI(dpoGU?Xc1sOT-`MS+{$E{*h4)nNI4H3M3&{Jn4D2D#6E!3el7F#P2>Z^~Io%>6or`j8mg_ zsVmZv-!4rq-^I94w?#5wL*qf1{RcN(_VPcYcLn2r%jR zB%KI*2gDMdMV6_*t}$2V6i1UaIGRu}L~Q#kX<9>M5ai*YrR~K$iQdR*;qAHPA55!h z^$_PQrP7f)zHzqF+$4-B4TfRNUgfB5b>7yg{|&!4s}TNTlY~23nu~Ll1S@8q-lFgY zq*IgdW%dyWb4|Iq(=~h9Y(7M{!hH>JPLJ;{T{fitzKXxl{4N1#6!tCLtPKq6_(KnM zI4Dk0i7xHzAVMxh-YYa0P2%QLIvf6Ah~kv{gSSG{=)k|1Z_k}^ou-eQiwl7yYKjN* zi5TAUd1GoMj?*dX_1RNA7X_(^BIQ0R3m351Zs?ic*@~O*d#N0(OjFs9^)<&&)lVjr zQYhGb51q{leMvBTfaPE@Sd^YSRN`~YM`RKw@y*5grU5i891MTv*f;eBu5e{b7k;f* z_>y*?9Ah<3M)|>JKSJ`DDOJ}34EKtxJWM&mc#}BJH}m9Xa+nfV+K;hPvS!b9&kTht zsjcqLMR-0d&Ac4nYiQo%<4CosMde2zDl;gBd=#Phn(ULgF`Ks$LdER!WZy^8qfO%MK+J-O6t1e&V-I3g*!e_WPXr?)TtG zJQdFN7sLB1(uR{`r5Fn^mWq7o13?~k(z(ovf0_EI_69UMXYY8uql|vmgQl4Rk_qs znT=SS9q1_I`&bKv{~H#+zkPw`+ce82{JZnB0}D+WJTwErxVa`*?>{(Px;{8-2wNVo zf28A1E3PiN!+f$}RT~IaXi_3t$BKx*oZ&#UPWC9WqnF<~YxFTr>BXew-`u5J(6XzWmy*+n1_4oA^og6&WSRwz7 z{}bg>16Q=Xf*frSYu z>5sppD!x9z8NMsIAkKKmw4{>)wQ&(yX>J*mM)E$!nf*L-GmSAVjAM+c!8e~fkaj(l zB&}7(`n{dX10t_|Y(S&Tdl%nRKrAEF-#(Q&LcQX%q!JzqBDFPDoqyGk(7kMJGJLWz zi(rz-jKT&-rkej;OJ+I2MhY<$MtCtJEj^**O|q`g_vl*haTMMyWW+q|*V7G0F9&GL zdXbL@tE>`wd{@?Rf?u#@6%kCARm_VSFz88J&Qw{rgTB`9nzDAJ4#Ne-TufQ3#6??1 zmtoHJfA9v9BUfE))VGX6^!1tGgBu7~?bXo(9|I!|5*VoByYb=(3lSVC7K%57e_%CM zV=`Sm3RF2WG}h0nZW8)C1b9xk-uFYFnbtLP*wV`~2FB$dn!BZ%2MilGnu?BS*94wX zK;^lP+Tv`{`7}Ij-m{G)msv?JGp5<>*-ZqNymu})HU^GgonT!r@O%4~ZQmB!w?l1- zEVeZ~`o&B}v`zoEUCF9z=K}$dke?OhJBnG@^Ri7;49Ek%oNushH+Wm^)=l(+xtj{F z(|i85sd}Hep-|BY7Dq3NCcY4jUuYKTnpnPP9nvma^fv6EKc#mKGqL{TFjKw}#!ZIR zDHdTJt9uBRJ63C$`D4p!4Kv+%a;H{o&3N+lN;4vQ4S<>V&=Vo}8cbesHi=qWoOtYn zWr`^r0P6xPMl!)_zr$!IeAtvSd$kcUyE91xM?NUP6nHer1QdcMND+3TjDD3m>njS| zI&sCb1K$9bS)3>b-Y%Gtyl8??fIQ?cm*GyFu3(XZh8J3~*CHmX_FZA~feQOIvd7hj zR@7~eCF|sqgqmMdb__CIkdqWYr8H-^Gcv|z2VS{fz5){vIZD*-OwEFpY|2a@MtSuS zGvQ!sW{{a>2E?u(GJ~WhFxQ~$Lw03i|e86d}&g16Wsqd5f*xWSuZHLgGn?++XxOsVB{(jt4A{DxTd&xB? zYOx)QtD`cws?@Hbn4{RAN>LL>9oyG9&_SJ3uX0ihoEC) z3qi}q@+%D+7XlC)6(Kf0PD}M?$D#OU#%THtbSMC;e^o#gM%3U|GKZVn zDOVZ-Qcp^@*7E7DJy{KpS^TCKKca{Qrif#4ev+tPH;Uq7+e~qKc++Cac2tp78Abjf zO~|ze56Q3g8~}EF4GYe?nTv*SVCAHKoCDiM|JdJIWh65}9M5!GTd?tJ?kcp$HFqt+ zb~Oy(1%%zgOAA4_@S-8Unwta~tBdz)Y=PC-orsXV@BUraBVQ$nl&CyHL%6`w$ z_n@74J4b2A{j~#!4ttbt2+aPKb9Gzpd^*$BtzmJ;lqtFN+|AcHpQb*u*CKf8Exao#}BY2hL_XBZAQRZCGuGH`0OMhpw=3hFK z$H7yl;l`Of?gJxBHP)G|NjsCch(8*ZSv@xHE}-aNdE=Z|UFY~ax6~q1#&ZlW_icF* z&jSB(1YFHO&iIe(V_ED%@xK?{u{A3ikXI`Ya?0VS|x^uJ1##9MvW-LYJwi7u!YShqSjr&23h&Z!I$wDxM=<;Gs+1CTf=LPD4a zv->-h36(?4+WoLFaND`YsT_=;8iCMG=O3aSvR}hd0~EG~NxFhDq%$8VpP=t__+ zC(fbC&2%8~8f*MTIFc3dngD*xPoqqY$de37sf-6HPg34Bp5!yp4ehM2G8d-ZA(*Ur zk`olHHkQ22ufmP%I^o*G70LPe>zxO=V2bgZ{Mzy4--<_`$ou&@+jCj>s7QOd6AGk3 zfv@*Vn#{)~Wjn6vu5E%?zXagYXOK5G{4G8AUHu!Uiz3Y|d9j3jb0A;&aE2mp6{g9| zzgASryQ@gV-Yks9b1iYcV-qL(YXVQ+qsmZ^qlvQ#e(xpdBTl<*gR`Dz9w2P?j)cvg zDmydj{PBN?s&FE|IBSh-w-2LPe7r0a_^QEI6_FJm#II)QGSqb!UR88$k}!NFPI;wZGXAYipVu9J*j;I+&} z&&UsF<;WNjR*p2oA|@^3>AJur1Wgyng048^&ERmXM_x>==0CQ+hvhh(gsm5vj_vK# zH9!;-f5%!X&6zt(r5;oBODbnJVOP#Pg08F8pwKjimMY9#J`EwD8sZLvc}MC3F!R0k z&d=-c!rNKYLW>8;!C}^`mJno-K|U6~v?g(i=v5Li4R0CoFZdEBZ-rUAz~$0s`ZO(A z6}Wq{)vp)q=xc)S12a~OcVufPC+k$pTF&jvT5b$lV&z`V`m!e1$r;0ydo|gs7tRpP z*{eBTPJ4G2S`FC7x*9rGrX`HD5DzxvYd6wkCwMZqeG1r-gZAMcZK2y(qi(|>Kow6w z|2f)mbKZu#tucuO&>rn2uF+y-AX+BUs{@M^O;uXV^JcS9IZScbpWNfD_vjf_H$?xH zTA~F0xCRt9F#IlgmniPA-kphYBPDSAEG;Ti=G0kx+zW^GPbJ=Z}P4107n( zOgOU`ajVa^Wvb(ZBPO>t1ZRCs8;4+Q3cYsZNX1JWIVBh>N6v79j+~vO$ka$~`vxLm zSBz>o+R*cMD%;hz1FPWBcM=@x(C0Ao9L;#XUMMxfBr-pj|aSzWUwETWg z%U@yfLMA^wg^iYf!)bYx5v(JplHeFej)wb=9F5K$IpqXJj@R$fBLXq&5_(e0uNZpX zPMsloWXexYqaRN2QipyLVTXPSL5IGGU|REvc`==(o?t!*|7^cL(`os)#ZhAZyxW$Q zgU8^i5+e8|S5}m;E31;AE6YbPU6!90V>|VPn{y3jzUKz!MBszZq{kX%%B?RGJh+HZ z|6YA3jzmOku3*+$-{kiCboO^?BrL`F$wVp0Ab)3=JrR*a!7o4^PTtQaVj{((!lk`4 z?id^2JT|^I5^rl&_in})ePe@@KDaEI%TT~Lr5t#8QoTM$OrGN#Mhl-*udf&N`cJxE z|G7fvegC~-+1Q~kT*2mkQ)n$RV1(A)&hSq2R071aA4yo@8ZrnYdMZEHg8-c9##j&DH@($W}epAJgvBY zVQf;glM|C3g4a4RDPg_uXV$wIPH-?_!(ZMgd;~AfcO#X!JKWKX?N%#MKz( zyz;kGQ-K`i31s*iDR89CPc$)@lVoqRt7F7=ovt$ewn|zf@g`ZU^k74OujB}m^S}C` zBjmaMsh#tSrI0sF9!u>a%mrKxB;+ zqel5U6s>@1zSh4vYqVR;CgyXZkpd?%nsWtCA^25S;3C4Vz$FA-fwcq;2QBbs`G{{ho)zq6EeDEva>2Hn7i!!Xy%r$3{Ak!dK1x~1y`t+Hi zlfnD{qA9wR^#wJaF+~rYc9bdl!jYz^jx_&+rs$Aoigb2t8GMB~eFL3;+-&X25vJ&t z3&g|fz$!&!ivDJv))akNasR>;MQJ1_Bb5XvQ>u|w!p;=UBPd}+pwyyPOKL7MiWvbQ ziF+Bj=x>S+bK60GQ}iZ~PclU}A+`NX(ReNkJJJ%3l4u)C^y(*DqF_I4ka*&2Rw+u( zN>_L|!LL&zqbr1+QcNM}l%j~Bt?=C!nhF;KkYXr8ijh(^c`kYN7?$W6St7H_b+q)? z1oCcDiy{4{sZ(vt{P#BCRUaoM9^Fhu)_ z6VZwgu@^z~iZj5`+G#Auj?|yU9Adg(k$xvm@$L}N@Hd}Acuk?Cl3umj?7fw>CZpU;c^3S>;3(xDKEV1J z)MgZuB8h_UlLiVt9Qp#svVxCnjc=8ok$>{$1IY=4Xx1&9G{1Iy)@!kNaj}`KVxC*O z0hp-k=VOeI@1jpV&bS!In!q^jMysSp==B5Vie=S-U0>C+DzL*mtzO@)xPPJ7DVoMf zOb@|XPGU+vpVsT)1f5>19j%x*UtlEWH2~7<;}PrrdVMw$(qFF&fP9i(&jLqUuVe9p zu|zRm#vbEkq_@4Ouo@Enw{-iWOpMBT;ZAa5pE}M?SGtqn_g$rPm^g515+dl-q>U7| z(sR!@m0kxxYN7}!L$0dI^VuE8(Ctoi8)>dR*({livMWMu)2}z*1#Q)o*kkfAy#a4B z=KCO;nD!(WRjgcZCdznWWoqSmGf|d^J;|K+ob_^1Rx$LLUqr183B-# zw7%&~#rMT)Vp{(pQ&D@8OohGz+|N`zaFnTNJQw|92B2w8whYD52GJXzynllP9>Pkj zg3eH=6|KD7c&?F`W&qN_ok&A}L-Eme;VA?kb`@Sk*eS>of=)qd3EB$Zb&jdHshT_=dGQ!V zVw*J*ql4RXxd>_c`2SJkaI{TW5bw&%88LYkFZyvUotI(u^;?gLIRI{n8Fp>7E-<*_B3&C)>b@ z6g_pHAuO@@d-ZRLlqq`?&EK0sFy1|MH68x&WaR+Pvp!L}ZQ5-Z%;NWQ4&8I&a@7U< zGaL_vJJDVs4Q5F8bSqodYuJ5%l3A52SQRtsgsC+LX*X)-qiKz9P~#x(%^b+B@^jc` zkbkq8)W|A*qhV<@!Ic$J9Tnh`krJ9^I3oxOX(JsQ%a*BV@^bAIbpn>#nOMAJF$6~v zOPA@H9Ge{}?U^35r*LHmyBE_Osszbnd`W7haD-P?HuDi?gI^as6_L;E@o!#hHfK|f zwY}`zHN{p%*@#eOE!qY5=nzII@6{_!-Po3|t@-vte?qTC{J=0IzM_uhdb1S!Emnq!u;Dwv*rGLyFUihhLUxUZfU> zxl}$BF5M8Et3CRb{mIDJ@hF-H91`8Z(BO7)3=VSF)8BcYzqQwF45=aTj%n#RTYEVu zOWPC3H767hf)@;gzz|)o%&xCgp=CA5q#8TVWu04R$x-I99drpk8 z87_y7;fQW~PWWw}#qBwB-Y(QyP0#I$AKaevcfs@9bI$7FncJT8buNP7+4E<```dGt z>7D%9dka^HU6lR?T(3UgkU`)!=&pL5x0Jxcv{?5#B)tm1Cu(nK)!8uoY%klnUbeF` za}7Nz)91@cK!}KroyR|@%c}})l}))Cgq$n3FIR*pWwm0*xmdB<0G3<8+(x9qgN=8Isyx6j z2bkmmE^>fc4=}(1rh0(W9H7Vp6gohO2M9XAa1Zbq2Z(xrfCH3!0KWrNdVm*$wz8uv zpz47IrW&EV@41L6Udn0MRvxYKtMijvZ~f|H~DrF9&*0T$2As%&b!~H9r8W% ztRAw@avA9oBi}u4d+xpnNo zr+^2Y-q!#!!Rz_6TN#40zJz%l$I*qBnt`V>u-LBW5?`xoM{WGv%^G4Cg}Kt4XBF+L z`*mcfGn#YTJ4TZ>UD>BeGYONo;LdQLCjETeF*IqB&4f5rpOJ4eSxu_7aHC0O7TFmS zK>!g)Y0_&JZZv7QO*>?ic~%cuWa6sxeCECCWy&ciwy?A&Ew=fMCiN0djQoAJ)1)jD z70SD{!qjKX2Rx-Sp9S5~niR}{{(nJ}Zd7Fh)wYgfhNzCxq+Ay$I9V~$qyY{RI3CCm zniOq&*4wlBf2>e8Z{Nn9@bdqk=~e9s+dSq-z3i*0@BbAo%ediS!$8^SL_y@aM^3>z zUYa=LQiW=YpDKMJICrY1APQddu?#bzxI>$|y2dB3l17gC+f~v?_npf^@`?VlCf(Kk#)o-vym&Ado3@+HqB!SORjA;Z^hdh zdE<*D>k5L+yYRUagMU8dda%_LFVQ`s&jPZy8(o>4KjZiXmoQH}Y@5dIx*=>?44Z=tU%?NnDPG1&?~`{hMqQ!fvx%iY2#o~w;va;rVzl^HaPHSZTM^$HV+ws; zQ!hnV%H6MfE}Urokq*PM68(9z5?xcF3Jl(^3SiFu!Jgv^0QuWh2>{zPU{ytOH>n~( zo|2K>Dl@#5-bj7f8eXcn+`?Qmw%WWz>zItrjaMY+{NUakGpz7$s(q^G6y@zuUbd6n z(55Q3@W#|!3&#EYjrX0VtC-fvc&}E{HYGJb8-#WsKe`H5ee9r`VwpzF`k)ELavL!6 zjQ>)xcy}!Rj@WOu4A&YRG;&2HRFMp;t!qWAm#Q`5_xm81D9<)`Kr&|1A@G2Ij6n-4s^@fQj+HXH zIi*%Ltc{QbYqpga`iZKE9X+IM?kxetYovFlImMl5{$+k6Vz}~`^XDLjy}`M<8w30! zCo+6St~W*ZY|E;c*>1$UuB#$><>AYk%6{(1Dj zqahdgW+<$lzgq2shGTW4+snz%}-U1LS`f^_0tGA zR=T%gYiTd4*Ot}&sHO=^H}bM3tNUH-VTO)@&#nf5R1$_#z3D}i%E%wsZ zo|r%{S}7**r{3+9T_a(dx9hxUgzf_;X|jA$8;f@$aMW9-kBWg5wT=UB8d=$ z;vH9(@gNFa)%Ykr+kAYseQz-tOe}v#Q$t5i->o)P%q)9Y?@S#mm<%9U`JV8X)%bF^^Y$x4fk-o>x@*rwC_g#K_C5VAAoj640*pTs-*RQzq_a$S!W z-|UJw^(yy!;@w_RPXb!|nEpH>L9kK9Z_(=(UN5#e{~nb#y6Pa4NEh5Eh;4!x{VA2j z!&Vaz;`R-G>zHCa=1;5^h&b>`{$U%{c4)$fj5Y1nDlqa(bbvXg4zJwBPwV4Dyy#qO z5#YkRtVv<#Vxs+?6h52-Uq6Tv96vRTiL-hglo$#z*vRj~ywH_D{Lz(^*G;+7PZ)QN zee`gi&4sZQcLwh#y5G7tN#703nGaif;%%PSLM!2CPZb;uMi}X#_$~velMFfbpAJ}s zZ>3p}3FxrZHm|Em$s9HOaQ>C^C0a`BU!b1*G#Yg0;`@2QFJ4=Gfo+Y8p86kFS>h4W z`v5-i4to!}y;^9!UwG`&Q>UIJs1s7d+*60cH-o<`hGz{SRy3ZPo}nvXvsQ8eR43H> zRs0I|_X`jKQIxONN*~HVvlkqb)_;aZVK~=5;df^YEqs+k$~M35?x0QK2N@c`j=kn& zL*5%eJV2+dI_542Gg8YaCqSB-Ax=y@>9@CJb>&wor+nqhH4UNEezAsKczsu%j}m-- zdVcq5nC6wsDwZ8psBo&Iw$wBnR+T!Sx?uy#D_ZiXUstE+KQ18Qd*qhXNmZ$$*rgA) zA1pzt5LojcoA&8b3S*bv>ypM@7*EgNX-Vn$HSeQstgrv#7DS=VOR=84t@ugy~150TCns^IjwQysYFNmpr@Ud@or;#@wysd&@VoAVu)wKUK0Q zG_iccH5XYRXB&bkU!sm1{5qg5axGCV>c7FS!zH)7IR=c ze)4FpRkTq6@78*n?RjDIwkv!JWdtSQg*wCai=Fe_=>F8mR*0+%= zy4Zm5tW~Lk)}G~mEmp&-lJ2>t;hvgH_e>@TApvWv3Hm&ne`hm(x=^pEW%Z&uBSqb` z%G(m&&P&bj2w|DTlk-=%`|q({d+)OMmX1*Od%U--?&iJb(wB9_7?j0PA@$1R;HJDYJOj6t^@A%fXCc<2b+!OuioKj_TG2#Ztz|1 zd*~w9)-f-W4t&1%KGu7W@*Yo(!s430y2OXAdC|%)^fQITK71=SFZsv& z@ZNic4=HAG4OT zZ{||uSZZNkXlx^kvnQfhfue$l&{7CDsdCO2W`*lLCx9!lXTyN!a zO+}S=izru$DBXEU3Ao-#sgb1a2 z-O-bqI?1EXF8n3LFSx+q%gyg={{q)4e5lJ2%y`K9q$G$}a|Ikjw8b#l%2eDNrO$Maz9>ITk3j;x61yc^GX+LYV2VWIDF<57Q`s*>GR z$(`wGY*2eSma~m^EVxd=X!Bl0Ah4)-JSn$%DQs|2v#{`xgGi`*Dx2TQZM>;6{e_$) zGV8tY%%X|Oo!hTPP8P~cIUBVvj_+t!b@Li1Xg3tZfwQ40h#4=|@OcE&N(rZ$bX&Uy zdWrBYyLNfE1V?oPG29NPOTTuWp|(vn-=Uke*mps;b%zis$j!y>fuuRzk}4!EvrX8dDWWN80;N4p3#?s_mVpr}?Q&e6(+4%L zJwu}dG7z=D1&xL0JDgD`tvov2%sb#m~gliDQ@5i=mX5w9=8B4dp z#OQUbfs13tRWJl^>MOKo^BI;uB-!bb%xH-M-MVr_MxN>4?avd5ULLY6k)q30uGG`T-ReFssDZT$yR+(u zM348twMOkhyW&0Q%+hI*1E)d9$I{n}n50|xTIOga}UPVu~&QjXR>g{Jpep8*5dibi9`5C`VBbv5uugslR=4S?%8Ht|e@K?ld z^s`oAr0BEoiwO`di#uVWCGpH49 z@9Rci!*f;Y;7Uw!x3MMM+6pVoUUgZ?1h(BniR37r4HPXb{+a#C?-(uMPaP!Bwv?*W zr>auJC#GX)L+cw)u1tSLWqD;N`!~Go-ybsj_ERf~0MMT!sP%X++ZjV1iEn%~W9 ze3H#!xiPMpSP^Uf;K-TbSn~DlcchA!^ljD2A}*m}XJvO)q^3(TM=R4cyl#rrbi^9) z7TgPSFguL=5tFg?U1)G8Nzb$d!WYqQOTSD(}Pg$Ax zqfElU(q}k0ZAU4(L=11K*SpkXNIb?*Ti}&&j0(`7=+RXEwBC-^+b0-Ld;0`Apvc;} z-CmBUV4{9%uPd9D7wN_ogA5I~p6Hqkc}gs;#HF!>UBtiW!Rjf`2glR5882XRwVkSg zpxzA%tn1$7_;B1RPR-_0w{gYiR9Po-l!#-0D~`pm&R|&T#N4UH%!!_z&%-4C*jA47 zqr9ERpF{_mwCthiBsuhCkA6)LYW@XKwn91UR?b>~TZsI7MPD+@_S5A09RI#WIngU9 zI(o65Yz627y`EhnNw{7U+=F^rqo=i+>dbpdNwqjwB?;voDEhvdDEHJ;Bw)=JeS_j; zt;oxPNggRWt3<6GqD!k|ShjfmQ)jcac@q0<&SqEhB(~|F&4%Vl7{HjnRjEi#Lq|<( zyAfqP5^IkqJ7aHe!iu@N+Rni{H8b9@u_n2(CUVE->YVLW$)5Algd#!nU>yd|IIKEy zM^|;a;DA`F;DK1O;N8mdj>e~|%I|aA3eBEc-CR!O)(4p1XzgkIW8kBpoaz0Xs1UJM zh*$-h<+U?cZlWEKllXU*5cebL37|!nW+Zl!@XdTpF^JgOZRC1@Ul!yO@_X2ozCPY5 z6$I7pB%LiJe4JsGYV4y|mZ+|7)oiWWv8E|EImlFf?YrlrQ5U`CfH$XLYhWwO@L29ucQyb)+o>w@8NTML3hTm?tKe zrSjg!8W#UdD}c)?_8WdEH}L#z_d$G|7i(yltz`CwDq-nuNCBL@!08W~=$m6ni6tS? z$&l-0spQ-j+0pnC+a@ARA+t1TG!ntcH9m*?#W?*YA2XWn z?c7f!$Fe}Z6z`7b@?z<~L=RP6)5~HQ9AyhsOhc}l)0VU!R8puA;_O=UF2CKOy<(&! zUs>7yrz^c^rjL_Y)9`F{$Fq4gL`PGBy3MTuD8fUznlITc;X}?LwlNWD5fMDE8c3wa-+JCGFoY z;liz_Glu7j)NEHsJ)bc=6D;w0Z7Hm9nA=QB=3vl?C5uKL3Z66Z_cx$YxzM-MmDFIh z@}*r~D-ClJM8ap#M#$T>uE$#UZpOg&DHPmZv37Ij*KDkf@mgYsw`Q;MTk?(mmh7bs zBH(NceVST4426O*J=_vAG4u~o24HAWHyE!Zi{~&2c+*&)h4qpQ>U#Zc`kJ2bas`Ns@vT(f zN*qZ&s&BlK7LeKZz>OhsEUMwlp*zSGlyAIG8Dm`b2b6sPX>cV)F?JUH-C^9X$@id z$C|Opxg-k2u)|h}WTWi(Nb6mwPBE^0oQCw>b!4RVM&46}2Rwnc-j|c|CW5na(%;`x zz9Dk{4zA^q98S;5!NpPDk$fj|-g;Ok{Hs~mIy#a!6TfZ4BZv|Gx_dWqSAS_Y7jR)1 z&5OIx%Pb345rUavEU|EUE9H-=Tq?o4RC=*lF1nqtG-kWUry$1=A8i|UjW^4=i_Xv4 z&`Ty56umOa-J1fKzad(l0iYP%0Nkg&E|hc%p3f_GSLbxsq?g41dWQ66=@s)ggapSv zg;BfsTQq7H$7Zg89u}XR1y$lo8-;dKG-}5=>2W8=(<`zd#ttZ_CcV5k3qTj9WmPnL z?fn(zMpvl`MSdE!16#xr@wAL;M?KzRjcTXDqvPr8yz;tfc-w|qUU?(i1v9d}Cfzb3 z3t;X50PLNE`+M&SVPC#AicQukgvB0iI%LAgE~$M0R7NYQU87(vz(n$TqXBL^SVR{CuCv`ISzV>pt;7%eLwsS6Dv*(s$J5(DLqy`tZ|yE z6QL^jLB3a)6p|%u>IqdI&n4Pkm8JJ(RCyRxa`B#5o70HA+7|LjLgdYz5--Ge?V_OV zQ~i3X8`ga6TK@i;gk0xPwM_DAxhb<2)lp%niwku^2A+l`O{SH3%_|eK(oTmOh))mX z`&0`(5u(E+0r9bS*#mv)wuj)>#DssrF`qW`NmykRf-(Ekp{NMUEteaLo2+P{^=f05 z%4ybp?$4^(XcIQ_Lb+6oxlEug-vyShHoWUlxropTqXWkA5+A=GI*#}%msDhq;}>`C zbsV4Nlg9DH9X5{0)a_sQEBTN?98|?CJN7z=v%Mtx z+|5W2q(+asZ-4c}xqAZmRfD$`?}aqJ8Pqv|#a*Dx<3Fd}^c^n@$2(P@NgJn9@m_em zi%+Vv=oNq9wtvH~C7U)rqK*x(?3FmCdUgEeWxo#9P&x#Aqc;b#ZlbXD;q3hj>imDi z-ixg0+VK9zIO^Q6)lug=FNr!uhV`i&-C4)N52RSrPnbrjh?* z4Jyz{!N(}=|Ix_3MbS1ed*$ug!XF>3QLPOh{|Ws%i}>x!2M$EvFNHG6^mG==f+tl}S^InALzdS%BBSR&Ni7AY2MZu7~j@1ql$oLqd!u5YlABf-WKm|MWbMUsr){@0VwgZGz-&;Z%#vlBAO*F+y9gdVb()Yi3xjmM>=_|q zvep^hi|%08h3xtQEY8|CR{?nvm_`R2iL1=PqM>2|$CbNay>p($v1L*V%bKW>nq`&H znCYA%9xzjRdT4s2^QwG`DeWiWuP}kIe!fno7VaO%u5a`X$@~O8ci*q=6HV5JkBNAc zJbr*u^Q{aeG^0L@^C)Un_%SsxtKJwY{B5MV@@G;%mBmua%N7KQgegYckow@>t-T)eC#Ts+yxU`uCH?=e&%0>j>9SE(@&H`08t%uU`AE$51GD zi?~7$@C$9CP`QY^)xeJDuodraDv>Y#c?Y;lZAAJm;QIS@KP%sD{q$2hLdpY%K89tzj=m6fueq2 z-|0R$5Rdv*uDrMGHr+iuP?DT*f()+86)yem9!sf} zso@!2RWFz1XZG@UW=-3HTRV9>xPQ!q(_$Jm9u!m89!mIyZU_^t1cVz=LYyDDUI@mI zJjHpGXSms%UTb)j9CP3qQ#KCeGB;&2ttBeWWyyYpmn)VEMYfbw5!_+^yQegxy`r)A zko!5%ZOCOZnecMx?jX}xhx{4+IXusBf#s+T|7Aa+B6C=D|1|oFxWQ$B=oU&YFM++El%fhp0i?fo*euNDQAcm#DaTX{PNyR-AFBhkQ*Jd1c!V@ZJR4 z+?nUr_SfK`-jnM^o>*j_XvQc*mM01{PW3U)z_HAKspqSnf#_zqC$K#kk9C=IDu%Bc zu2vzbC4pcNnpf-Q0op2YjXov;{_kdfTT0=oZGiyaMXtRG@ayw+4w5^)Sp}$0J}Rwm zjO67a5lg>>FjwA|mGav-^v!=#hPhmU<|N8=^?ka>BL@~IiT0&}=;@fjrIoJsOFNI! z1k^8-vh9tnd^b8VS>8jD)eZYm_aM*Oy(%azye6N>Xl4rD=dlR+FDWz+jK zOGyMh@=T1MludTsz0hv}>fvxRta{Zi>_kJh z$~XZnSW{va4439Pvn*eSYNM*Nm-4(icktL(Y8CbH*hC%xp5>AMsgsp`9(tEjyoCu| z5mSYJ^2w?dvQ~9o6hSY;lC-{fFXy^OX@XUwoDQUhbP+?&Ye+Yb+e@wXb{?C617Ho0 zenXVpJ2q%Y+-ry>{}0u94Onawx$3qrpY|GJFRN0tYTfF;?SaH7{WdV;RlkVGSE%05 z!}DZH2Vw`0m`8dP8bjcm$6I++t8|&+Zz7!R0$8NJ>1tS?PyI--?!lt0xvmTK9awYQ1YGyIF8oX=s{vg(I!sbYC=}?u(vuYeDPk_bDkQGD<;4 zV4#7>#%@hpZPdWseGEtDODtejW3?Crk z&-4a8?bL_wJTg%11omCdqn@y4)5c&eY4GR_sP;fr+eN#Fs`l+oL&~Y3?pB(m+5dru zB`YNQGG<_?or=95wlfv}V?$sn$Q;<4sgMvaC*O;$V?QEZnQ-a1+VSk1IGP_^xl^mkdm}gf7YuN> zc2QQY(ET8l%VU#XImEUzq2Nr#!`{67=6rlQ9OeIpcqQ2#<5WTO@>V&2NUR}I{pm4*6TV)oYR)nO}+9U^A3uJWDd{rL}L^0f9H-Cl4j^R6+U#+sfDy^Cj0w( ze|vo(d1sbQRm$Bzl?=0c)y8$si{|+EqwncGB?&A@2(3`vg8hV_qKLE8loBCDjg%b- zW~cEt{A+N?*mEN!QrBH>!K7nn63MZR7AWU)t>lz4r9AB@-#8kv8eL1KRJ^ZJN2*jT zcskIYt+PcAJ6pIDK_RQv82Si$aO>T>?^K%|>_@rZdQX^Xn&Uxh!t?0GB zMITbdS1j3DkV^~YGE7%h)0t@ACJhT?pV#S#fNG~TpLylRaR;H9j3Aq)!D&?Mk-!Wd z*NOyMtT9dCCKWE)2oh;D1{-m3>>W(*Et!c2tIf4+0jHlkhgqPV2})t zhPI`Qpcv4?V*3rUUrToN3Obri_VGnIK? zKqE;M`6at^!%zHUtKCOmP{D@+V-%p)TPS)Bl^;T=^a-CPwUpCKq9>c&*zPpBa`u90VtZ*=5(4LV!dDt6l}VLT{`ZrDYnIUO&7*6XSs zpr}_BPEdWA^S};D13&TIrMwn?^-UveJ|*Tn&<)YqrwSrY{KIG$&WlbjtAP5hE?ELy zK(;Do`u*dn2~V@@eW+dn&O=AkICOoNAx3p|wIKNZgjmU7Uu+ zMZJU9sy8HPyZNW`yUM%WiEsh~B(~tBCM~{(*(mW8$GGi`G;}_+B{U~VHyuHJ=F7nerEe( z&rS$_o-3zbi7fD(jgQk-5YL{Whf-2z=>hkq1p(FbES|6T+B25t1@;_1^3{`xhw;X44uJ;se9>b{BNSFmYO3_Y*?|8r@%&oi!-Y%@46Rve~C2D*s zduR(O_OhaWaxuP>CwsdDlYBmaSQ0=?^C14^lM2Z5~*i2PR?&z|Ic9mUv*NdSFeN zV5I?Ay9aiVfz2$N5frt%$?ssd2lFB+rZEICn**559?V(~rapjK9KiH=Fu(I)5&_KI z0H)W2x!QxN2w9gP-s_dyPcKg&9F8kRs;Y!p6_9PQHn|xjK12$F<_gIZjC6 zZ)Q)c^oOd{INOyP3#_mi^OvzZjSca(#y?}D?>g?_JUs%_-$Ws=u#C1Dz*HY+QmnvsY$j|Vidz)aC%N6|(D;nrUf^Mi`vGOfK zUVRqtKHHwpPtW`;n!-#i`HxB;5@u{=*Don$qb;=-Y+*v(5W{+wi8OKtGkN+@fcTV0 z*kiVnbJ$s1xfQp!$n6GElA=}D=J7|i1a)t=mTFq`Hv$i_U8lfr={$pGj^)gSwku5p zxmD>Ite(DAJ$tPd2k){om24Q#d!6zT?=&bpdacu5-;c?8MQVj@5w?MUKm&P|Zx8nq z%Di<(D9jxhqi$4Uz}k8^H=vTseBiMez(yiN0DsO09y4%=yse|{^wJH{2p^Q`DjP?G zcA56BHA0!9cms8~DZnuP0ea6S8BkvMJ@)gFhWlQa_bfc&ht2AF#CP<_5I#1STt6@L zXw+#@sJGBnu`jgPa1qQDu^_PUH}vv{iRT;eL-dJWUvcYzleCqlIinG1exEL3h!lnZKE(%y6tc&65Vz+0ppXKprh+&)(KUE?+qN|yP72>-ms3Tc3IW+N)9Uus8P_#_iKLg%m&0qw_WXQH}?`8V?h7Sy;KVteh&2`T{v&Y=E%|AxKhKL_~l|qDcSOGp+U&0GZVTEX|JNxJkDWbw#nJ5?kk~xB#}L2MMJzCae=n|{@UsVs3*eRlmj1RX6p2YV?SabNfb}U zTa$B344)3W650+PjeMgz-7?(!o@YxRZpxB#m+zx6rZZI_k_vQh zO>G|W`?7SP!R&(fI^j@zpu>>QE666!eK4&@i~sXk;}SRF`;&Y4gu6-2I1Qgh;|7!fu196lVJpinZs=F;mn-A zdD#E7!fDfV)ZbHvF1mm$e41n0r4*1IY!P%_=IcEBS{rU&o*P2-m!6;DK*%`x*8CFY zJ=c-GUY*>8`d^b=SCf2TsiJ~ppQd*^i199b=xKT#)nx-_9$nm@Dl3;xyLl4f!l(0> z0J_?{q>X&u?z8XPc`eb752thX77zPrj=f{KxWPHchvQbEyfT$oliXR8+%>qwzxvDP zr4lRo0#z1Ozqc%J`x;OLVAn7On^iaW% zhRra-gCo==->FINh$RQM_*Z_RhN=&1@u_YBitYc#dnne9 z1HJQCT-7PsPK`*7-uz$eY2D7niFQ{z-=Ml~$TKIzrIwgD& zmf=;bXpg%F8;hWsW!qveC{Ct@>mqv3wt9Q@f^p$NRXiY^`j%==eY-?t<`sncDR|QX zcgO&Wr}H+&?oy1dcD)icXq#TWP+yAeqcWIl^p)eZmNz4&PhN$#=sOs%_InVO3ff5| zPRnZb(4tOPuv=n)t62-ri1cF-t4GNdD<|??aVdC`R^P+BAL+-wd69k|=G#;HHbkT! zOSecr$To%Uv8Xl^Kr&)qcIn z_yp{hgIL3yYqgHHM3GBUbFSB}Y1_}2l4jI!Am4AW5GKJVmj4gpEW1l>n`;@^24v#c zVrTimO)Nszpx`E53U0EREsF|n@}31Z@%0z@W{MeT_-qV#amswbr5z<3*yc%u$W9F{6`zS=4$=iXkNhA}+M_CQv zQD6Th6r1(!;ywvHVXlL(z8;<6V3^9z`x|$i)%dX*ccIs~-H(~h=TYa?r)D+I zBt{%dKm?{$VRJmC&plF7s^o6X74bA~4hz2rw=7Xil6dm9;4s!zf8SRjfPARBMKWP9 zJF+KzTg6u2<@Ix`;$!vsTdp;>GaRkJ_;I)Gsxvj8`VfA@;^ogoT0eywEM7iUJGl?% zQCfEiSM`amO8VZ#Nv5UUF)_tXg@X+(-sWYFdIYZFLMjy641L5el5`A|(yy~4%%q^c zG7&jXt4To#5&PuiB1(I=rFa6;LPpK*H1n0E$`Zwanj84SW?Q)+WLBmavlAh1b91oq z{{kO!hU7uN8$u${9pS)BTlJh91+WzjU$Mw+nee}#B0AC7^b3kvhcfhUJJI|8Uybx- zVaZ#SFTVf_o5Q;HMb9@y8#=(+Dg);VZiXJk?s= z1L+GqX&Ya^7(dx{CH&(%JVv2Qwc)Rv>@f;x(f*(xe%O36sOl#c2|XWK^*;@)HXO>T zddp|Bs+J}_b^_#4xspHV^RE!JdxE!;IvvYsxntAIhjX1edk3~z+@N%u5v95+;&r3; z;2rx)k<#1p>a0ubkmbn8!wjVsoT7s;-Q}t`#)Lf$&*9rWlN5b0uMYO) zG)5;Z`f{XoEPPqrysjY5ji6(EHU$@0!6eKg-Y{%hlYBEam{KCGkL)Lb=6lj{FxjG# zR2$B#xJFN=IT_4L`pTZb(SGagS*U_TH~SnKFt6j;f!d8k2)dgewM=KWS1t&qmo-){ zn5x(OI)0#fv(T*s`S$NGeQ4ZW#s{K8&R~gwMFIJ4t%b2!?QtuGO1tzO)2cigh|;tD z;!3QzjP)KVH-4p`FsRz_D%*hvcb8Ny_s?=^0~IN-rA;VBd8=W0VXhRecWC|gU-lJq z6H|=@je3RKlC+ehJ|b59RV33#26inJbZxrTDheFfHM#Nqu1zwi+VBgu+fE&Uuxq_e znGnl+T~yPIkzMR<@zeXf*) z%Lw+V8Oo1W7RVjPdX6M6`18JE#^la?CwDT=&}i#^mXdI})!+n>zo6`|%Jhr+vt2u~ z1khG?96{5H09uqc-#ZRAth#(#r1g`g7|>Zn5Qjl$ve$ik-~L|W*a@-OY;D~Ew%mtD zkw$TF5tHVC@t#0)SU6a7c*UV)Y0Gv zl)WQB&+%4^&q|qsM(FY5YldCB!{_}mP!?QQ>4ei1?(#!}I!1zrre*Vxc#BDU#xTb| zaa^l9xGAkEV4loL`|#WLl^!ygN9;0S(k{1x9nb82(jMWe&*GWMf7mO}^iSFW#~iXZ zj_LC_W*Wo7ijLH-^VWNKttYKcr~Ye4KmFg9R#z75yEH#zR+mgP$(%W<|M-s|GO0iK zhb&b7OOtxGc+H;FU$t^k-WN!S+SxkUwc{EM?3aIiYX7xWIg~ugRA?Fvsy2Mcz21Nh(QD1> z6|+QWJS6;wm<5_~;^`*@C}rlVU~P)&Jg#+B*14p}CTt^;1eoatSQ4Rg2x%{iL-YO^ z-2hU8GyA!0`IR~OfA#nKiaSJrcDb8QH;DaA;|SEh%dHYXIcfVL^S^6KmVaPtmtn4h zigIxQ+hK5-Ak{KKjy4lytu4)!6lnEr%y1zI17vL2R^Z0w^lg{7fO8-*I|-iPBslms zBPB*OkKg-3&f6>g;cCJ1-|bB;7{M11;`;*s6-&C~!_S8vQ0Gv-Uce1A3Ob7(c@(R?dC+R=mD_ge}X#94POK)NC~G z0FLWK4tpkvS-d%N-dc()eC{YOW^tTY#Y86NK!pWCT%mEkTYkmr))o&_?7BJ8HUvdz^EM+jzjEN5dpeODHg_OS&85rViV z>uVzOE2c}qNfv)t#j->gDWd4~Z!!{XrBL-i{#0k52Qa^6ppmik5 zdXD6xp*wQxh6N5L=*y_G0i98qqx#ES;^4Qc%u&1OQ`GB|Rv_nZFt3p1Z~(FNFT5UT z^P~%_++CgiWkw=PkrdU9)%Zn#>%KL|}g))VYQ14tyDc{!kKuz*})oJ?=^dXiSRaUuN zRIDX%mx8Z7mh);&y6Qw4vXh2bVXmAQ<><9Emh%b`q__2u)dvbHI|iUiMLot}SlPTg zukrV>=Dadw#Dua5jcL|n$M0=DwpXV_=pk}dTg$*6D1@2gI5j56c}mE8W>+YVm4V@jYZuopWhx>s?@@eE`#KtB*wY{-`y10XlEewsf zvoxI(J98^dXuLU=COCvTkap+L9mcNzPw5O?DL^iLQEvC;JAA2L$6gftr0MT6YHTfX z$I9*CbgY3Z;ii^VoR=;;hFc|2g;@w9b3BI_{qhquL}Qmeq|4|6nRW64A+lJ*eL;Zj0t>Lsxc`Jm+=YAM zMB?tq(W{D}wFj+mH;gR5QGv~t+B*I6rMB!2GI4G+v|MK^^ewY35w$24PF&-yL|#Q* zs|H8?o~5YYzffHk^?R0`qRhLQF=imWdk7jHk6rqB=*k>xIWnF_r$=HP&xhG6xqs|a zTyEMnqJ8442W1YtC`w93sVU<;l!W9};2~-YQ|u>MU~A8HxMhgxxWFP@=ap4v?7?y) zH}5@D6v9VcXR-Xk-~DB7D01Dy5Wl9j8IDC-U3>k2L6`{In{eqpAKK_5*JvU}iqO(5 zeEW@Vy34h-L}9+H(IGvsF|f(D?V>oS(M@)IBfHV;Zpyp_Wy`xF1h1V8B?*|Hg9O`y1rl1e4jIY8tdI{J^I3k8tvDUz--X z-)owJy%>rr^w8h5(iPcFoBNSXyPexJnA*#lXqj*Z$!qbzH;aRn&SQSbv4POvuPn@7 z@-lS!(YboJ@gF4_>Cl=@7jr2uW(`j||1in~!G zyzE-XWC#30Om?R+nI|cO#%^(qwdtwImjuZT1OP!8?4-R1I=&)oqP26OwO9OQ^M&ZT zVx>ns^*(=<8h?%S_)D8#_sU;{VeH>z_@lQq=q4VA$1d&i`5inC5>g%>Re#euul^>V zuS$)tSetvA^BX^Re5F==7++;IWanFs(HYobK|}lj&6buK4QYSSYe>7#MfJu-K|_p- zG8!@@7iBeMni>*tkuSWV3ey?GMVl9uN?tF>62%CNI;9mqw$%x4#2+nO1r<8j~}Ys*_d|8e{)* zy`g!L@YkRJ8&;RUpl=YRv?ZgUifjn=eXJn*%QzAUGq1EL*aRm@8E0ikvLgKh_FHi_ zncc@n#M3_*&Mm>ti6fco?S%imYGCg3*KjyW?|oU5c3&!l9%;GRBNf2S_uzUqIYcCa zvaj{Nls=&^!DQ|eX8`wA;M6vo`7+wJpVzkbM_tJbrPsDGUdf>z_k|%1n3W+7;6fhU zg2x;jmY7$<^K)G9dYlin0>wPzs*Giq9;UJ zo;Fi}5%1&LYlKXuQSf@KVceZM%A6W^r(Mr8v#bI|{nQsLP}JAvFhUi|08gH_(isH{ z|0$zjg&744Z#Vs)Xsi}Sx$Qs9Drozqw?lVYs`#uQcv}Ev72HFlWp~BTNDH)#Au6k& z_$pPlO3`0tVO*s1JSBUuQJ`gc=`GpQ-2bIf;LaK7WQ1ea=2x9jaKMk8tpDl_NdGe> z{Y$-+7%7qK6d}f8R`)lGpz6zuBCSu7tXtY-p_S)GS|2np8R5`G&{5x-FglI|*2G?V z`+sOn^!IjvH8JNEM<}#&KTXo`*8v~1UCtJlqW-_IDqO?*tqM07Z@s*)tx{|D-H;gA znqX!85;Z781%ge2c(0i%(3T{^IP`avmUgMj{&YT$Qtpa(5geM?wE^i#!LAlDUs`T4$Yuj1~BNo9)mKH{S4|Rn105zy>47i zF?4S|Zf43;Z)J|i>^Fw^m(7v>-YR~0hB>nRMUjrD1r2Q9(1Ihw8rXNUB$E}g8uV3b zkj)eyS7Kx|Xy46~y*B8czHHt!Q8t8;|GDenCNn6qcynH><4v*!zJW~M+)vpCntd2^%0ibYA0BDFRbal1%d%_ogrXsgg9YaJF4Kt2|RGH+H3EX%yP!t09}2fmdl%O=z4 zn`5Qx5}j-_Bg?Y+mH{#R8H(#5%jPVv0sWTEn@Rzh1MRECAp2^#RUj)MP;LhsJ5S99 z-?D3He}+wQuaafgD7nA#zmu$~)MHm89$|NYRWrxH2Hh{UY=CKViGgYPxqnOZ5cbXI z0Q=wAH>*`mhJDj-LpE@v)qI8?VElZ;&dAZmn}=u7OSY%9m4x?cdy5knGCcPnL!Dp`1{mD{yn;>2$%ltQjph>4?JD zCPkuUUEEF|o!>i+V3@37MwfRdc&fas{rcQPUzJ-wREJkfY>4^VaS?w(jWrCLcFXZ5vgw)!H` zg}thdC0yNmzmZ=B!{c9~TesZz(YD$?wvi+@NwVMa6Rp@^Oq9Vdwgbk(aZz2_0-kz! znp$=nPhC94%NBieVr0xq%DnxXm9FfEtrQjdYG$FePiT`0`4d~oy`JC4l<)>!uU)My zbgA}LlHWX!(27DDixl>2YFIoSFIzx&%jjWUSvwh`1qyxGN3Iw3RtiR*avqjfZuh=JF7=zsw7mR!GL^nWeuManzRc?;ZYe z>^s4?Xg*!j`m$-))MkTREsC`;+&jGTFrqu1ON`-&W zu(hD_F4lZQmCMkSLrX;ob}?wR?w&qpkGLUz{{r$nMV{JcM0V{Y)>hrm&{J$=%nN#* zdVjlKQ=eu%*57$hmD8zR%jxNthj17jcc5dGvc6dQ&jrt%u0}`8dezXLiOG(t+=FTw z?m0hQP<>u{&H;i|i{DU--x5Eca1ThUdqwX;&(r$4Q<>jTlb%=OdicXG37($T)3e~b ztT%O1ykY(M>3B6eL^f0s{CLPFRj2<)O;Vvf6q+dOotRuxmHSEVT{=HqHuaoz+tCA> zMB`7`kkup@piYGUpekRlX56DEl8OpgU;f4Pm*_Km#0Cnx9ISv16hCu`3EkAk6{(eY zO)6P2kF;Ke1eEAoy=2#ohaX0^@Vq}hT0-d*Q52qT&(YCyTpH;`qw8H-ag$4nl2$y0 z=gK7|HywT$<0SOdmaZsuZ}(BwK@8db%f`5br%5(xTA@7a60}iyu?M56OtURCKmeFH#|qF>g|+yt1#xA$`d35>Is!*+nNl;e8Z^)rwB*B%5^h;LQ6}znC6^-lWePm7{pM zl6iYTe^e`k!&5$>k83o+MD)b-uMom6K!OyF{)Jb?27wiK{BsMGI(_V(B)aR%9BzfH$m0C2q!@fmN z+_2EZ<`}gFBB*^Au6vtb5y|8HBOq?k==rXo!o|0$z&dTW3NNzfgy!qwg)ZIbd={|T zQ6=+>v83>Tv-!p>6~)nKO+8kVT%%1m?pR?gX;;nxW0wV@65212!%}CSaM|sLq)t4J zzvZu9Q&YJ_BKR(gw83(C!=qKnc4B$5m#(23wGuz+oQ?HcHnZ7;-!E>-VdI5@Z9m0j z@aePnly^4XPxz``IEPW2Bx%COUgB)X#zrj0gOzfIm(oDW6+cd$y7J^ZXu#e4#Ud?# z<(g@!HY?$-ih|Y=%#i%&S`}+po0`+S`^lq+RVCN8-gEUQ@pd+`6{v}*Ou1FbE^Y8p zE87meVA=Jd)W~0ycQkHK|1bxib9$26wt~A9)VAdEvK{=S!c|ndY|)#;4lN%RId531 zc)S|1DkoKV;r{K~zf!&-QnLXU^0;J6*=}-_uZql>bpSctEAf+;sgYHw#W$!~YQVhI z!fW*m8dQg{IkEMv$c_I-HV{aANBx`?^4!>^?I>rA9bUv(+5zh&Ix+b+aVadbLg}ko z*H87eWtDX;uT|C3DC^Ctj(3mxOgC>Y0sE;o`=R=0z3N+Ej@)?T{_+|vwoh@qNLDJP z3x-m29l~6xZDnten%vOw&QZy(&vbvPi;{auAqJVM1MzvS4>d+x?};Rjq}bMnA~znw zFQcaV)92(62>L*GM8EZY&Y4uQql|&sTbJ5ao%UiSfjj6BveYIacApF0HLh)hzWbka z#E>&Cl0JH5uWW*Z!gUQsWnGc$Qg*UsPFbi>WTWGjOS`{VT)1oo?)Md&dE(YjKNQuv z2J`c^7_f>d`A;#di$l-;&Wl;QrlM~C*>2m5bysF>mxe`S%Wzf%Lv(3-`@u?@(>HW$zS_DZ3VEX2oWjOZ_?2B7V=?kC$P*bm)bM zR?=U+XyVdiAC9rRtfV=VfMT;k~2syR;qd&Af`$Nkk z|J%^&*M_$8`)+7SupaW;+i|Qvv}u26m3+FAGly1*onXTojf|nymp}6*duXZ9hL+#{ z0TgHxpo522U%ol8kbK*^0mJe8kwbg1AAl!hxfoi0`-fH)+)Sr}j?X*V4Q`f~ZeLJElI zX#$epj~w_X?(liqaxw7y_7A)&m`|sIj{mmw{XKoRF<=s%uU+Uy|M2M={htpt`jOTj z+vw(=;pXs2>t(!ajAL12Y?D-qjp%{szWuuy0}8MP^o{S>fR0fS64JEQA5b0(`~l_J zA5b3s0p-yR=#}4b14@GRi{IY2Kj9DPulxa3@(d+s4yY2}0|$c#R9~LrOV)tCF;aCP ziuvsyP=Wpf(7^+$FZ1n-r+s9h#LZ?1;9Xv^`t2VqWqy?g2c3HDNNbL8%fS_NPd(`- znrqqRMmwcLxDR@&EMFIC9p=7BJ#$}7>#Qmp7iqozO)`z1^rfu@pkB$0La6oetB*E~ zeT7pux>NDCy5yW+dfI4u@}BaIjRfynBRe6}jd?-kzgK>x5@#ln>2;M1yYRWk+P~oF z%tOB>qoA0-7zI@sMuDm0`(hTP!jJx2wz7R6?@Jd-`7Vmo6rpA7=)g3o*mp`|;QgCS zoW8O;!k3m!v6C4(Wq{Gb_A1ngY5m&wtr^<){A*47t}3e&ekQg)8@cg|R$N{aep*b0 z=WR-09&6PMwPtzv*r>5BHvB_=_A~)W{gI)HdGH7>8 zI8&u&4IxvXra!EaP0iG#uOPoP>F@9hcP6sc=!8<~vcz;%*>vp5=tM*S+OG?xxj;;_ zF0br1e&ZC)p(X`g;;BNs&apQwC879Ea|_&m`noYU*(s`MBCLJbWyadu!I@T-GjErg ze3;T)#JNROz+*dL#@Ae5;+Xn(--fBZOQ(*5?w!W9Qtjb}p4&zTEbCn)_1Vmnse&mZ z#qVQFS)Im=hUD+1YfwkMq^!Z|UZafO-Cyqs)yX#Si_7$De5!ilv`)WMj?h(n!*i%} zvUqJu*rVV}zKha2Anq|SlVRhF+|$Bk|wV>n#ewDPL5IQJM!zvs$$ z>KdBSnqP{+WdVyVz7Q5W^>6$wfBTx6YVf!_LQ$}T-p4}FuVby%HNLMR1M|e9++VM)$O^!(C`WAk-792qVHN# zvFxbAs?_r9cOP{g6+cv!x^=D|LH!A2g@N`&ZhS_Kf@yFd$ee&xP7s+-$g)ds7!l$I zEENaPIPzoF{qwo3F^-2l9x-sn1_SMozPF%0Qe4j_M zCjQ61{7?bh?~WSN*ox-f+?s~=nsn1@cr^~>Z9uy2#TnG4+GUq&`Y`x0mudtnqO5;DDL!{8Z#M7BsV|j0O}pescR?IQo{;coaR* z2r%*$jR(h4ZHC3>2{#LS#WSy$IGt6MIw398O>BMnnuxS%lftEaXVcH>hBa~t2ovgN zO?m<+(cH;bCWK+~4={Rpow^>-vT^K`_*EiqC(Jo|EPsY#HFcKWx&tpZ5`K)W2KQHW zx2ku?3FA4tD6p#2<;EKxZRynIftD|y3vT2rm5|plaJbF8vKwnr(?IXvO3aGz!&-AB zUdfbFXCcMp*qv%If>~A26<-vCDzBEHIv zhA5ca|Aj$icjN<-)p2-_xe$J4Y$XBXeNS-c3UMvA9a>z^erXrqM6+V1fU67NgqIzm zq>A(O(q=(f#oM}sHk*IVCv;+m$G@Ac{n7AK=X?CyO@c>turS5WC*kgj>=z!l%Q$y8@b5!R!yE3M_l` zI~35#M-?yHkEOrQC57(WyL|f}Wt?xHjN~4VrGLDqdBQDT-8WcP!YS9n+#LPB%aL}p z<@FGPi1BGDYob&Q-g{mOy2V}E=SxK1l=)D&O|PNt7tWnB@@KTap{3cq<;~T6Q_rE< zVm-`|6RDoLs&(P#b2KqsQyg#w!w#V*`g9?lfwB39<@iO+1W0YrLjG6`G-)hpj@kw( z2y_~+oQAv4W4H0y?B*5h`0bqZ$g#1UheU0gTnVM>+NMycbynI~uIkBYS90exGRwU7?G;8c&XfbQ)?rAz*+bK0JM{9~dq}bIrhj1ujfK@<0e!SW#_|d-DIpJk+<@Gh zM|zyCGBfgV{a-0Lh&MvwR1*xw$r&8aDgrFT3PnOe{aMP&;QZI9*?pgGF~VO0g4JO)5$ajMNAtZ#YLR%bp4>;dY}q&K?-wwpvpZu&f(Su&Ey zCO1+bO^^V&QGBhahmuvFl}s zHvCM6?NO=EfW9KFlZGP2`T@gUl((VTqqM3s78@<@}L#_BQ9ugXX#ExSB;M|FYu|udF;IRb0ehbVn(dszlS>JFre5ff*)< z%_1bs@}?u*d5retrm2MhGqXI)TeD`C`Qp2Vu2ey~S4o2tK}gJ^UkzkVcTWI*V{o57u?;{#8`UD4e#m8OUI4bTI4_lTQE(@VznZhc)>z>8&l`C~a zbF86LGeCt@y0$e0Ew915fS4= zcchrwGeV|_$k~zr9fv2@F| z^7~pImdDG8nnEtz0A*_{n?E0#Nr?zyu>lQZNO^*xRF4UFh1lS|l<%B=2ZFx@bsRS{ zpViyG_h1rh*La}9_gu}5D9lYwv?b`)goCVG?AIq1ST0-CXN36V)CsK*A2R$b9cB+LK*-&J+#8mZx>_}BOspBMVa$Enpke-;nt22o-!U5 zb~F`Qr`cLk`yid~=x%PW;H*i9(W-sm0Ac_|Ia|)%pLtNNxq|+wQDNG=jbG2pyNJi4LtSz&&z;U2w1Y=h!Q>cP zz>jkX{VZW#-dlOsNj-gFD`)RP1)e8p#YQqKWzK=l6DxvsK3WnFC6V5Fwt+RTQzK3j znc5_yL{|Jd_bWLXDOkl_wLfkoPt|=9d^|LSLY{6Lb|5>ge6hduv{B0+J0V|&6uZ0Qs zi6*tMIsarj(SYWp`@T)K)m5$DW&LxPkRk=>p9FuXcg=4;U>md}IC9Kcy{kmTd{W01 z-(uuCAkl7mAad2_ME*rbhdDw9SJ#eWT0~aB=@Bt`WSRU6+6V3yteam3N7~G`3c)Z& zSWzal2{OpABnv;=ucYV=h|l70en}gBPU^nm5|4M7J!|=5SFtmLvL7s&QL%0F+)t(K zx71afGqB=&Gb?5ir{cJ)n4dwTP+7h<(t4++;@N97SM6;co5iN0b6|%1&GRMc+C$bQ@qWyF(#D?G{$Ir%MKvotN81E zs!-~x9;I%H2C3syi*FqHH>R(dWeIH~`2rPdmXRdy=ozNzX|nIDlVgpBn`eyA4unV& zbA~;Mv1|9Fq*`uh30y89g{X?898`d)5bD`G8x_br$o=|H8b$7x)d)rdf==q24Uk zPS25HPUI=w-U`E$g}#fs$j5Y*$@j-}|}@Pz7S>66`Tx&hOY&zixiD_}=r>UlJPNmpA*y~YbYNuG~UWwGP)K4oDs#m|Z z*~BU3+-Y=^FF~zNVpJ7qGjG6vy8RI1 zcl{XsEL^~|1y6CSUp8698i-PbV3=9WemDeI0bzrFweT@E?K;{k*i5SmHk0_$+Cho4 zJL28_i9%OF7t?w3yLpX&)AqRw_LOgGyal-?*|j&h*2Mr+C-(%(`Hv1nka>>a;_vCj zo2}5#xhXi5I(6h{Iji64FN93f4QR0BzXFO8EKm0I+&9 z2KLb7%GCV%bH^Z)=9h`sTOW_y*h@0PO`C!cdJma8A8URQZ;(!Pr(3Srf8Oa3dtRpz z5NK#JKysMy^93O4fasPCCI~B23tOV6s=}6*=y@gtt5}u2N!M1!8(#iGYW_lXxA{Hf zUL|SJN?p1tY^KQ+*Uf$r2))ybAw=Lb`!JLUthX<)#K#qZ!_LhTfq1bYw~pS1VX$cf zOGVxVoaq8~b;@_19(5xksJ3Nm;BrHneG#6uijlz4@Ezw^k(eElZQB+^cOC-D@Q@)) z!P8lDLAi9o&iec17mF5N?J|gJF%D9G8=lO0e~(A|U8=KSD{tL;YTMf6G;b$Mk?e_8 zzS21gHc5z8ctBt}{eW7miM8Qx&rstKGBg{Do+e^&j3J9A1?d~;<2s#@A$XkQ#*%#5 zGskn#P!708{45d;K)Fpu3vEXE=cePAOA@WGZ-3aAM3f?7Lnc$a`IX?YnSkHu^&vY$ zVBfsw#B7&VWWW7e^g0kquQlF*c~s@hqgy17T8zFCJ8_dp@tnSDC3}49xX_Gtu~<%D zgCx`F8$OR@di?5(B$>X?^HTA|iqHpJVcZT)zzpA}*nyiofl10Et`DYNs1MhN?v!n2 z@Aho%WOeP)^2cU|+3dRg&cXihFUOi+Dy`-=*`&gm06O!ZOH7h2J6d zilY$Sy5IhuSaPRrxa7R1DPO%8oxW$!_VbuC3XhFxa3Lb?MG7D4-kh!=g@K5ML**Y$ zeyYkud7|H`|1F3BZSvn@8}J>=_NbaqX3^Ghej z(`{uDX9ylC`HfCcZofIVvJAX zL$tAcTJ-oi>6X%OtEEUfwW2y5f2fz}hzLZf`i@sBAW>P2F~%CtDrF>0nc*!4OPDb~ zj3F4K@$Fy-MH^sVjwCd(8pFtkJTpc_*? z5LvNx6Qe+cCYHZRuu&~FByopF!~0);?h(B$*4Wy15)SNFV96Yf1g{D*Uc@VsFTeN8 zAE%e#ZI1S9{mEH@m{}>FWMa2e0nI-a;7h|p4$7!;Nyny&-Fu5 z%*tYCj5akLMIuU^P2za2;_sd+sx_PmO8gv-CG*PS97^w@)ivqM>cz+P;^R2Y9E0GU zYJLJ-G#v1X6n!gdn~PopTCt>~hJnf@Vo*r|JA-C?e>yF6eBU1MeLZO&-?s;RKMfkz zQOdfu_Fg9oP>JI?gs2pi7O>3I($V!@hw&-IPDhz6qzXirfI|}P$c^y0-*jw z1wcH9skW$PYZINUDu2#RVn+*!&8rCT4n_;$r2HJ4$ntag+|@0Hts)y4Z?;{xS}3<= zevo$czY!URD{MKdk)!s{d06H5i-;bkqxPKbPbzpCmunu_$lOyK{>isJ(u`_#xP&94 zts+Uu_%R|$e;l1ntl^Gnxb-kzwY!e8rxmv?V-!!jwYBQz_Ij1Ubq|O`kgIcyq{S|YugQ#Ace+zhP$S?C`bKx zrFI^od1bxdc*hfX;^D%A3SZ#a>R^#{FcWnbv%m?uE5JeyX_YF~%yB(ME6MD=Mjcwp zNv*aDx#jlaQDxvn{VD>J8&$gy5dC*$b0$CO>T}VgDEg1Y($FG{?OS$r_j(ttIM#6L zss`jty5LTREwrS4`!Frxv~`sj>q=EI-s|FY_cxf&5(VuvqAQlZ^y^eu(5n|7=5&P& zzP5Pzw~THDC>eqqN&;8uIJhppH?W zwBd?Vl=J1UTa)Qd-KyTi>!OUJa5stT!YlYI9Ip#6v8NrM-~Jg@u*_wl(7KM^W4$al zTb5r0S<+q>=7oc4kW^)Qp0{c8PK{R`6Jt^MhrqC4WRAIlO%?W~_8$5L`h_U8F-Wbb zxYpqCUC{J!8@S__+EG&eKjz*AysF~r|4$$rqbBAA6O0NqZKFktiY->6P?M7A4hAnR zYGTo*4Q)YfOD$2V6~QEy?7i3A)~uOXvu4ejH5H_3d*E%unjx=DM-Z8k-26*ZBl0Sf z^gQ5&OBYn%p~Kv0T9?h!YereI2yNRf{A$Mcjv(d}9TrM9WLl0OQI`Hug))`|ZNJ0$ zO@AI(+dvzBq|T*WI9gk>V?61986{NNEzN}q!f_|0-(q<l>IRm|ppw>Qvm+LrKrmFdD)(j@M3P&%#52}*8m6YA zE`!G-tBeE%Yft5O*dguh7&a()h5F04Xhp)h@h7S#D?RbGxQ3)?{R(7*(Ss(O@dfTC-tRfJK|K*M|kUmPY(sU45A zh_Kg0-z^ERiy7FYK&}bihtpN@Oz+nOw$1MddS8V&NL_p988&oLyNr$0w0DjrJL)n8 zg3U1k@iJtAWiWxe4NiMH;`@qO0G$f!Cz*nBjw2F@=89NdiFTQZjBcml4k??C)P6IpO&)gbNFse} zP8q7qQ$_Oy$|j7w#>9}Tsodr3)BvU7*L^e;!Ihf#uwtREJ&Ks6EXmrQ;b91VLEXqp z4O)sP`fl0uJGHNDq$goHrj_HOJbn1lVtR%{%*^??{Vx%lC;Grf`nWiOo2_sou;`jV ztATGZ1xLCFJdNUd6L?|wL_3jvd)Iz$Pv4Ei^dqqn zIVq=Pe7pM9AgS_=EA z=`!QChvMT@)+ZV@l1<%6)h1R!S8u8yFk!gHPxt)zZ6_J~AOk@UHCp3oMw7;>s}h+= zyeqyEw9Z1IK&!aty$+?wryj5PoJtt4?L&JM^Uj$;G4(+)_UwDicF*dpODfsAWiu#?vUL?*SW6a~f&7(fIulLFJo+ z%DZQ*O9$+*L9G~Y9b<=yL$-TG>acY0R>GWE2`xbh?im|IS`+sgw%xOQjV%AoQP(xZ zADj?WaH|#Hdx#snYlvU%d^2_p+gHD=4F2B?+exnMLk!z?WCl07G((6{1U-ORfoZV9 zm`&Tua*bM<{lXQ4VB-P)jJu+!MV z>w6qb6L=^~o4{gYIIn@lMk_IrLI^D0OJA{_##gN!P=n|heyMH3>mLWFd3Kn^#!GG6 zc74qL;3AWA0*j58+P)hARmH$4r{ zcWGmEQNOrh#*%p#XX`M0jfrS5#eP&fr2}S~g6iN5&LBhv|MuP=_QR6+BY*Py?)3el zv&@7+sT{*qDob#9{~@(%zBMHNJ4y3&ctDH=_Wm3?+Ln3F)W~6=%CUvL&onJ)KrIe80mT~7the;B3 z_P?>6IZ#osv!s*l9CG3k;$c@OvpK#Vc3*)(_I-RA%~Tu}^3E#{%Fj{x(NUY{a`-@9 zQtf0s+n$T^6z)1>Y8%?I$b2gpTYOGD)T*qa@Tu#^vvk3#e)_wjY5JH;8SUAYdps-v7oBtBPmbM@cJs)t9NE;jHSj-W^4FH0nClE7 z8_RW8_gpQETm>Fix#xoD_*1nd=}@5)xMh)3NZIGm*qR*?5>nN*h$Qr}^rwc4X5}?4 z8b|<`s>w!`uym}=2or~mhp9{p(^99VMWfDzxm6meUEUy3P!hdVTV^bDndXCB%+k|Y zPhAk5dMbT3RMQd9bP`I2fdVzpiRSR$4TeRTMb-ee&x^Gvv2MgDBPb;} zffA}SK?q3p@2;~=9SnI+Ys$FoE|+qSjXYM&n+x7yn9((J3D9(qWY1vf!*?rq#qacP zhMBRytQ7>zN}3vEd)FV4?KLb5myN8sXAX_3Q^B&NX%@&2`C#ABC7OG zMTpjzEU5%rU4pm=l+AuEL4hhr1-4p& zuh;WPYC9*l@6twEbrv~^A=Uu#QtF&68cwqU8k8Y5Qq5F=(Kj3vFpC0q{f^vd92}f{ z*Yb63qJ^s{dx$oPQ{@aqi{6Ak1U*-@!S7ui-`gDs4Ju5c-?xSZY^A`knPaQH{{b!k z<;r>UGu>M|p*zIu@$TRrxNQ7lfQujCV$c7G;sF|i=ydID%FVXx=3mG z!+4+HgjB)=zVITOz<*Dy*j~4WHnVjbEz4lkmzJVkkp9)9e|x%3-+xf!Gf$V1I+(sI zc)f(lQsB9~2h;aFUW4iTVqV?!oqM`X-{S#js4Ads-pkD09x;}81cpKeK2~67D745i zhFF5%{ezHH63D@840zltn(u=whqQjIEo`xq>dyYtCvtAdpKEh_BvUpTZgyv83B_k} zs+|7*ak92z#Uly=z)pux$CJm~7C%PZa0-+^K;dU*kZXJ~r6nlu9M3x7J=TtU!FDn859;EC3!D0J2$0PUM#vVDANrOps&`N7Iy=k`_Fd<1Ow$f_&6j9h zcD`=WcmBUJ>W<=D=g^0jM1Pc1Qn|^GUU6XYjJDP%bnA#&ItiMG z1wJaLKzLY1m%yy43-C7pk@St3JJRx-ryqqQD2R9RQ>4pnPu08LBHrH=PPQ3$T#s03 zr+b6bX~|V%^qCv~L~bwxld00Makrrx^$Q-d5pDYzXua8fKqZM}Tb#7(3@|vSC@(J~ zsuP|PIM_S+S>7<0@RA$%vzB50(}b6@Gj-!X)8Ucc5hu$Z#(knb6Oh!KL_tGS{lJpL zZJD%01W^)to7C(CYxl@92-F~hcPfsLu@{R|N-T3FF4}-6S9PKsQj)1d(~o53)yMK= zgv)UXTSn*%6VncHX*D5U1loiXC zlmd=oU>q}ewV(4m#xX0+%8D@BPGQps%L>Ap6jmBm-e6?;H$w;Mt0jPAc%U-0Z!6=2 zwkloKxUZs8*;-O^e9t~TWke2=Q^3%6`FVC(<2XzMM_Bpmsy6OQ@1tj&H7!O;(x%0F zMta9dee?{P{!l%Gj`L}H#&24Jo)NO15ja-(bUmZLOB?SQX9S&TLW-AhEKE8Wqs4ZJ<4^BPrN#hG z%fs5TG&(UaG%ozlWv~>~Mx!_=x8L!DYfiKRU{zdoj-%n#^zeO$SFv4>W`?epgRyl| zl1zY&7iBR*v)LgaNTHn z@atK%Of3n2?1$fraCwZpJxuT;**PW1C*kbO^La$F2fDAL-B+6X+IOCX4RBuv^flM~ z2l$ou&eSbEOLPt+a_?_+Mwc_cArA7+%mN;%yWK$SOKJ5g5!S3KqV>8SGcGB89*UJz z!XVwX2@Sgcfand-#F4Zg5wr}R0VE+}t7Q_9{lz@R2{v!SuP-lPIT3gN@FfCuxqw8| zAcGVx(rPeg;@je?w#}cH$R^I;{pzkG<(yMcjw`?lm-d;A{SOiiXEP7;di1^&E0_Z71(0tQs)Vw*ua#gwtD61zcs7IpaoOdRkb!s;U4g%dGn}LY`kyiK&r~!wQ znyzO4dvRqINceye|ju6}+FNcXntTS&>SY8iRISB$+BCP)v+c+k8PQ zxHx}gWiC&dk$Ar!Ln@kp{ekda5o`u%#z)hmwvab2FWxJrXbpA1bho5D~rUGO=vB9Vdnk%_nakLSdX_(`-vUZ+vIH^&#SvLvJ# zxYnAkIdFl_1@hOTS;?rKyPq3}NvNh!lO#08BI6aY#y~ufGn|m9kJ6JCscD~0q9qs8 za^`TkrhS3F{jTo@eU}B_2Wy?mA!;223^&MK>o7ju7;$w!oH&{kx?1N!AVyDa?(5w= z8Qt@A&GUAg(o0aW1la}6bD7JI20d8oEG5k$TIaU}J3U@e!N)%C(bPJHO9N@&ge5y; z)xCLUnNc0hBSqpWYaisdlvN_`R)`nSSqtq%I!nipNN4r>Po(ol$A2=N?s{FebbbSf4XT6Ec|0)=LFY4LB{B+#=jcrDJ{W~hDhvid9~3qX zrt8TUi-HL~c~TDw&-gSH{`GO6OyP5h)1AWGfgHRi7kAIICxtt>%f5S0u5;NPq9?yi znnO@{qk@qe<(IIlD<6WyE6x6`?@lbGUeJjb_8@U{4-&V28WMj6Dj+RaRST>Dfq4bY)KqQ>KEnkys_ICHR!+mXbUu)dgbMC8I zUvs<8z3WD74&wgRt#+1ZL4<7Kcz5+NGzWV8889&uivvk>FL2Qam#qIvSZ<65Y@H3! z!p&&q-nU2FAZ7uXi8}ehV@;-CMSc?An|TH@z4kHQWZ5RLcw`{cYf=kj`UYY+nSOna z$@G>BawaAYsNb4zhl!OOpnv~38$2e-*)rMWuppI|! z6x%+?icuvPb#?dkM)94qK@klk6Y{|(w5JbW8cB3>C{ z?5?lM-`Jykcw3ryTPnQm!+plv#J~DhY|Y%=CW}|&ZKZ6Jt6vmFGD<2N3(Ye?VPw&* zb$Bv}oa0xnEsYi&D2~iAKw))bzoPu-s?rLp_x4*s{z(}{ABif?M=(l<(pt~h9UDII#@K{ znV3Xy&X%~;vV$HV)jS_uzF;4^I*T|{z>Zt7?5?a(_VP198j__i(@REZw4S;<>}8Jha>-5VQ4ic36OvJuk3syo*H6%y3j zD6>Ec(3|Cj`*ljxZ=FOwW2qkQu z%hGSQ1vD{KlkHH9(__4C2x^f112al2dkTbYdjsPR2>vWl%(EN{mRyQriygj78uk`4 z`7cB9nweZZdf-5tJ9Xk*lVll@Vq3Ai)^Va);JLg9bLTu>gSit&6*hMkF3X!ZEnR$` zVKyG1W_Jb3z1mT$nJw9)OIn`%OZi5At*vfVFn_wMc-sbdeZQ#iG`_{CMVnx2_O-U3 zlZ^uJY$6bhMv`TKXaTR$0MTi@2Z+k~RDkGkUNy-FD30J$Cc4@WlA@VsPctLetO5 ztB8Tb92{tpf!vNUopTDG%S9JEdmZ?LSnpS!0|UE-TeLzon_yJ1w54YcTV(sfS)KGO z<(1XxSKdqr@mSc!g9(~o!7UuWu6`rA>M?RDvdTG?XMmI`bhRN476DSmiRi}v22yp) z45>6B)l6P#-I0m~3n>duL~5AyCvp>Xt+vd|&~q53{FZwkeaV{CT&<+PVe83YP}=@F zw4Dpl7=$mAa-xmfe^_G`I7-W*YzT(}eEm$hXF4w@BzTDg6Kr@h^n)S46&MFouw7E? z`(_%X-N>}nNk1QwuDey4DYP-EPm{1^SfdUil?j$zJQta2%}Om$&nu#Et$&52EG*Uj zA&wYLzyo3VTVOPTi+Jp6M9i?%VmgYInbrG3p2Z6-cQu<#S6pdxtTeKQf0o+~mI!y{ zDeQ}CPO*D^v@yzo*6oGTZ6`UeBP+CrYrU*+d4nzt1yM0#9>&IToHm2V_~Q2~s~Es( z*K_6S5pR!yG;eCgEM@1vWajGThj5Wmd1NVW)W${g25JUrBoBO_5wqqsyCD>qZmyhQ zmsYM+=xXs>d>AojahPPz4$)6ZH7iYcO@VZHcco>g2sY|{&BLSG_{|*EhKC##OO@$s z<+>;HIi7YMAvHDvB2zmao%XEF;H^q&UUWh=J4C;+(Yk>{-7rd{JGvg*%q56N#Gtf8 ztfQ_?F05`t3VIW59Zlyobgoa6B|y^QTsk&IkUIj%8_3f)TqQ_N0NEi(sUSB7kf#LE zsa# zx|v=os|yRSIu1{YwU-bl!N#-d_+94$VVMy2)}MO8@sa-2F6=$UYkQWxJ`q6sg}p_* zmR61U$gxRVtQfHXLnJmpB^| z;(RR@C)e2E-w~Q(KAQ@jr#)ZrMSS}$lxAVPr$bLY#OhBf4Cgkd{ zJJn&Az4%na4oexZ%gQTUad9l)9P&jHa|iVf>y~XV+~V188DOKpc41;zAz}VG#rX8Y z!3mVh*CDJT;zATg2t?61#=e9#ogL0|fTQ%S^SbWS`H&-##JEha^%QAna3D_Kkj7Fh zdHKAY?@NwwRlL6yI?2olqfh;6Ygj$$!syc7ma41AxQ2`?p+l+#OaZf4a%F2BM|Ehy zqbUuzS1kUstm5Jw@qJg=PA`_EzH4r<=!^P_{%AaUOFX*uIxvBlaZGND$GbQl&tcK7 zQ*}MDxI7+xQjh5G_7#0-Ji6AY-I~}&N3i>m9FLY1i*^V~Y)pw!BBy)oJ_+$)JofNd z?7rwQJsxc#Eoqn@f(#eOV>fq?-6s`37mwXaY}q-KU`UZsyNPuzz0X{YmJcZ#YKtUy z$Ta)w?yJ;}oTit$FEl1}PwzbU<(4|H&{t0!b&{o>Xva|v@+E^f-$I!~hPiO(Z^%wd ze=Y_YPL2l2aVc!Ul$kxyg*$0f5bGrbpGxUHJJ|H81%db-?HXjI7UjJm^$3UooTPgTP#pJpF5ww1YfHXlnC z@BaX9y{WQg|*8DH8r<$|PaU^I7wX!s%piF*@@MxgJ8_r*Pn>4A6eV!n82yeCWP|VUiO_T|YOZ4u^xH@|k)1BVEYxA3r zyOBrzB$3`BQ&T5)$nF{T#=E3@hN(R=97=|g?c9w2aZX0<>Fm-rXv3T4E&v@jhM& zyHt;&yi|w$y8mnBTZDWg`irLFe)WfG88zA&Y_IKx@y|N@CcA5ggeo{dnOm~-uG0we zp+Wx7>(pd*!Zfyt2Kg|pDk6gZcbiiLd;k&|x4p?}0x@;8i7Y`h4N1EQ;NHB{03g3; z0Osd~0)Ug5oDC#BFeOjQ52{?A{`3$u^?XR18tLW29tQ1nbi_GGJ1(2Xp6~d2Lk*IpTTG88j0v);oTcWp@j{W zp(u3wK(YS#9wp+O{Sc$Gw?cbt@JcBS5_r$4MV2C@$SShC-ZV>iSM9Luo0j zCkX4cPGebmJt)+rJ`*t%+ClKzrfHy1HcY;kXy@|zO|z}LmF)(g_MPA4`kw(>4bb3X z{8PB+(Rx#_S0^5xkn6)uTV0%CZ^iTN=$UV-ar=aP9s4&|e|c~Dm0woQXzzREtj%X= znvk<}1VFklmKGoYIE*!k0FV>Gytl?i7lpdvsvYI-IWFwVz|o+&3*d5WP0SHr(uJlC zy(`d$-u}w^G;;L%dP+;W?Hw`4t8q9qbMzI*UU0nD>lt@m!8Z-&<(zG$f;BatZ zQ)<}kAeSWzm{TJCqz3IbT1ZWwA~u-{VgZ{B@tTD}3(zE9XAmdi9rM2N!xRAGhYAos zobxBR9e&`GmWKj+D*>B4>WVea*73^v~MY?Q{8}WeVn_Yq5>LddhJHp{dqb#lJ$CnlG6HL5t2v zD*iG(qV5^(NOD5v0~!d$cGX4>z@DHSqiGIv+y*zc4)9OL1z!Em7MbTP++~ji@7ZHs z@_GU1rt{G4wVKgnW2xBOByIY0Dm?C zEQTO(Y4Qv7^Hi7TZ#0eJBOkrnrsDG?=(CnXTO)9Bn2AIMG z(M{PNmNwE0c()@36SP^x0(Q|GW=|1U`@(iEd6h&HrS{b%8FII?@bNnAQ8R1y&|_49 zX>&GHe0Ketbl3qPx}iOV)`H7b}%-CpF;Hw0d|5J7bJM@NM zSGT(vI`O~uAo>zRimNi^;fyuXPga$|0!bpYG;jz})=9d()HUX4LR6a|?$4cO;7fFE zSI&<`7Y9e2K?ZeGn@rBj4aGJxd4qH>@svE{7SHUrtx*L!$W=~`amqY_JA3exW23LG zrGD|IWXn$smdeL$PvFrG0;+B5q}M!~!(9t*m-J}=nhkt4C2W#%8J&hW9NKMLE_Iuv z#Z2PKkia?>v})FSrgjV0%Q)pJQRg{6Gt(qcvsqrC2uCPFvm)4Lqm+c1Dfsj2aiHz~ zg}n;Y6q2i|q1r4^jf4R83XM8U*|n&UjcT0d^!6md>?4vp8cDt-0quq6YL(1UaTQ|K zVlu#CsaoSB$h*{vP`3$Q2prxOIMgUfpnD;3XjkCySfG1}WlO&!Tf)XnG3}D3+;yJLc3fGt3vjkmuTP>*2ngq z9k(f|+-v+bno@#|-eE_|7e4ynQL9R$7ai~?H@az}%}>U-;LD}a5!ZA1?^%lFnv4!4 zm2xQMV|}-(m;6J``iy>ds|EM)W6X^AwQrxt=JPYNp@_m?R`gcA*_eDqZExc@Pn|L| zuPK%%0}L<9R>W({6P6cr%n2jAp{1XvW@j5xxJ)>UWhwGY>I`fdpn)q*L zm%2WX%RaZwG50H8@0WCamT59#nt<#(GW#dB>man362uxotQ)rNdRkmDSWd$Z5X;Lo zI;7H&hAFd4w*ep(K%md(!tyEDS@otpAvD7M;R%+ifv#dsyzd}h0Nd~MSBA&8ka26 zJ1eT1vB#EOV&684)w_ps`j*4ECE?8_;b%(29J3mI!R{{~1rbFD?lTdx?2TgyiR6$) z4U=@8-=jS3a=s_jk&zd&xX-D2X|3+{$euc#H=Sh7o;npu7H9*nW!3RmWCy29f4NH{ zsSNo->9@V6*|Y12eU?%XP`A>I4^8KuS+_DUTC7{?EDmiar*5UQU@Wg$SzxAynKdh? zFg_w6$|*W*%d_&q8@qHQ0kZUt*y{Sj*fv`FT0yox?;s-uxk8X<1IS5&_=2noAX$QZ zMUbZgNIyZe0P`9GNC&mK0UMT(_xAwuB9QBkaH9BYh!^(8fw9ZBtWU#&6?@i_a51*5 z$Y2qjR_+%`U-{hjwAv@9f6k=DC&VN$U07Rl*T*k?j_z(|3+Mpy*H^Vg&is|)zCV4K zi>uQ<*2CrcJ6yN1?3x$3V20<))?|c8rP@;UO2m8NCb`FYo?jX^OTMxGNXtH9x0nNv zrNq*^tSvKYZX|>+YtM|DYu%U5BjX$ED)+^Hw7#@3qxHT{^|P$O>nluWl^J4nljS3= z;%3Ql$xzznt@MZ`lU#%&eA)|B)q$naltHXB@u1X9FkRVu|46NXQ<5)?q?pA~Y1nH| z0HtDt1gO=41}RqOZ3fzGAk_K{;Ou$n2o@}Sotp;o&0bD0$TD!s({EKM+i$Cbn{?9u zWPw?%Aj-Y(xsq%F}gNK-_DpV6bN)?%G-vE$r1WhHi@N6gr3>t8&ea6kOdP4X zRTK|z$(L zjjXzHD&liIhi%rb>k*5HjoP=A`{M&|KXif90Y<#LT*g8r`Y4?OpMri^Yx*|3mYoGY z6U)pdQ@TQ+p^Jk{%C)*;1hSOL?#0M<=A~E$zL6 z%T7plS_6DjQJ)-L=F2n0C7jRiv-=O~RwvC)MkT=V+fUw(Ie>L7~c=;+m4pw2ERHUBURBc%>gXct^iv3v_dS&R!MK zOLu~ZQHTQ}X|*(;+uXj`wx$$eone}bj;Eg`*eshr1HsN0#udKwtE zqrmLKgPL^)BYMr|=Cu~e>OjeBR(JBf>jB!m-l%D_c2ZKuxnsj=9d#$$ysS0O>9k?;Z#e+MuK8HhfYNu4KBa`o%rJoxUQ zVTcV$TNJ$2f*b!qip)99&6UJe6H!DsVrEt8sh!}c_X6>|d zoY7J1=H(ETxz&kOe>mC1$n|p8CfzVB(hrG-HGFcGKX5L`|Vxw|z@frt;mw z0YmW)y5s73!Xuvfr9wne?mLz!hR3LNx!ubDlHqEpQ&!JAR<(eaD9!hdPCH9zl|^s&(q@6G%E0h9`2n$AH_5*fI9&EFBkd?<+dYhp%51+~77&|UJm zCiX55ebFp*J1LuIi=z0QolX7}zIisO#jE63%+W7xwbd7seXEqNa|F>sJ7rN49_oir z_rs_8;cHs`@MQk4=6@3Z*R=7?|JD3YYD3$KvDjMv*YLj*yX8jyoA_@)SNvhWsRKC2 zmfZf>xXO1+q8wU_4o1{Z+d0o%rl2V;spLL1H>-uX0nQZIkY&%jb3`j9DCd2_It6n? zL0842+eMbNJ)`V&wH1hFQypuH8Qh$a0B!Ax$+aZlCdMcGwq95k@ zC7yhTg6|ODk?fl1V&hUD zDJVCk_G9Dj?6xx$tw$Se&sHBEfdi2bTo0SJO{2^PXx3)y)ZkraQTx$#iR!adD|3-A zAhPH#mZ%XqNf*i5P{#Hs7(HG6-!gfMOv2B`yZ+%SPUB*lbqr0MI>NM=f?Z} z!!HEUb_CJ(CHDI}6l&FUJtTA-Z5^GHH$(iT3)}ApnamiugkhGl$4z9SPI#?9bFCrH z*1J-<>U|}a;OZre8yBMdDqQd}7Cd67G4SXwm90N>je1g?n(uCPc+Ys2u*g)Mj1K6$ zjSvyU=4oSyc;VBQwmLfWPemM4j^;TbHo&(lI|89|S77{>jb#>Uv>P1oBekQ8Dpyx= zMsZhA_>5soDKOFV|4#`iI%i_uh^d@4U6ouE-n%Q}?g#OnTjRRl>CeZy-|7G|L=fwK zPXv%7fn?lv3A~iOz!fq5P>vZWoCCCQIXx5J^ss5* zITBX_xy#k=3_ zN){cq$Hs=bp&e(Z1!x(?bweXC|GtvQ_}___xx*5J%ew(Cf!BaD9emG>vSmRALBL>_ zfx1wt>q5U)R5yiy9PzDALG(Ra_8*WNoWkgN2izu>Zu&x7r?h=9B&v5$a~UT=-=fHn zdzNj-M=96%{*fewrU7#5<&w$UWiEO)h3)D($xO|*wZ8R&-% z3KV~}LmxUj6CGyP3RCITIktFZAhKnujM+dzbgDw>R0As>PBViv#vDK~%2BT_Km#rdIv8I2bq8%r`}*Mmav_ z9^M#eH9=7sf_7%j(}EGX6xC(?Mr|FtVu3lW?|w0J_X4A5s zGLm@l!<;UZ6SXP2ak0!+7B{h+{B7W$_K{TjRd^z|O-76IlKr_|tIxX#iFl{D0;HFy z{VH}&7erHTapM}2>O_a8!5rVSrhe8cwS0lqIIgKuLM; z>pI*=>Dhm2vC_G@?edq&m;Fy;R|L&}%IT;x=jY9!B?!FNjtBV|lxcrb@g%wqehM7g zN&h-g9u5w4T4wX}=EV{&Py!Mz44%TtkJf!to!0WO>>Gfx)(OpjT}6{Ed!<3P%>?lQ zg+QZ4smX1to}e+jD~nb@#F=kiwMhUuIc3@rB}RS^(N}XzS?7lkZucyZF|SQ< zuyYNv((nuDs6b*XL_d}iP>$PGi8MmyAlL@Nr1mTkD)aZ^wKV)jNw{fT_yzOm$rY4) zlu1dLGwh)=FL=(VJ^CAZqL4gRKc|rQE4XplhYiZs((o=KvcS|$*1G&|=w_ZFid1Jf zf^RI!%Vk2zafr;ZzAM{#%`MGusA3JMOBC(Yqt0Yq=#v#TznK^M+*8Vl8KJwD{hT$q ze)R!P&s1sl((R#v0;D9ovZT6wV4~}&swi79<#gp+=dQ=ha z;38l4!|<~+{P04p<5_BTIrVK!)h+frR5*foe+2ISfx!JRNF82My^{aE1FL>DwM{0VRSV~l&G!97f(Nm=K(hl%s!zsVf$ zWF*Hcv>J$}Io>Uv--D5WY!@SeGplsRNCKp$Jh5Mjy`k8P_;YDhZ(wF3D;ZVYot3=% z%>N5kGAm#u-*ct^hpeQ4>iy@e1SY^TC3Npoj<3NZ8Z^}Z1757R*nwv*@@sS|P0-|U!Gb(UJecA`QRp-Rp{<@vT&F*BoJ9-mzbG+C| z$IE1EA@BVajvp6=*A+#}(710biHzUeDYjD~GlJsqmSU7+M;AuFA!n@dz)9`Mr7c~b z{#-OL$k`1n8%m;6-k{kJ^TTfyg`Z|pSSOwvWR+w}gHoJjU`3JSOM z_g-A60{lqYI=7LOzKmcMg=5dOb#5mq{V#&CrCU$4v1fjqA-Ms)&rs-&A)8~o$|uoA4nyV9t%3lo|%2z zvE0&g>RW>_-iNe>kvVg;rCz-k(!AOq+w36;-3gR}3T#mVg(+aT+ zyqgK3U$SG${k#@ys@yAu($uW!KeEtJO-oLpW#oM?A^LYL`qI1^P*y2AmEzJ^iuxc$ zsR8VClb35Yl9^rsFvwxG#;jf4D$6Ezgf6?EBs2T&chwKl5Nxw#)snW^ZOUV9S*Bv9 zTX2spOV{xx*tS)sS7}kYZCp+{G}`VePuoE_g%qx6y^~J4yg(=-JImQX`B8<-D%`ho zPEcO6V+P)hK+F14xlTG*E<)GQU&&-=giOV+_Y=sr#EL!}oS41aPId^GtCu-Dw2MW6 z7CIz!*_=+A`rP>)gUB81%Tl(IlikM9sD3>X5G8PLIQQ=fRr|5Kk|)}ZU-=hY4#RXL&b0ffckKV3iSmg54M7@rJ=NyZg2%r%b7KLx*c3|>o#%51ft?Xn-5w{u6IWA5HM5|}kcDF{To<$Q{KS&n>S=$|2= zFNXdji`tE$gLxke9et+yeZbGV82GbqiY^$P_F~{m3880d?0fZkM^1Ol`>z&~z`XyI z5cNUcRg~J&MZYH&J;u3zVF1UuzlV*RO1KSJ#9Kux9fWy{6=ZLHgUtJ6-nj&)H(Kz) zm^Zb_^!{K`x-sv+8K@icUSObZ%=@>1AV;6f`?I)Jbjw+-zDli@k{20$ z*yE23YTH}Y#jouu5E7@c3V~;*E-_{eBf8Sn?}&Qi)@U(^RP#cdRqNBSY75Ft-|XV| z6H(W@cU8-Koc9>#h2NE>Z3W5?Hr*&NZ8obOeNB@coYZ!sj|^32$AOUj<|9FvgFXUc z4*GbtBa_U&?!4p&jhqiE${R1kl8f7JrgC;Da{0G71ms{JPL09D^&G4=4wK~MU_TZN z$t-F4j5ur$`MJ<{t}|;9@ArGu@}cx6+|y>+^6XRXOB1-Phfm4=?ccQM*Tk+NQ|3M5 z!U-$q%qjE3?xp>b>gQ69O?ZxqqN?{%yUX7_-PG~Bpv*Td%)#z*IeM=cEYpkd?WTgM z_wPTjMAZryy!Ov)7s2(5&OyM_0%mRUuF9UX07_tvwzw%kY`*U)fSb!C>*vH}{pK6R z`q%Ia>z@$z(m+G3zX}%hgdvgr;chXorpSm|N&6DVFM9A`@;;2Go4h|X#`jZV@;(Z{ z>izJ*{Rp+N@R+>+>g$>S?w}|Y@W%We^8Px4d&>Kbf^|&-rx=XjA2Zj0Xqje3@kuk8%1125_AI zXD>TWe=o2||E|jPmeYq9E>A*`6tfuAH@6>JxFR)(k;azF0nZ_hJdoF;I8LwAsw#`Pal?G!J{BRg!sQyO#AAV4UqE6Vs&PJHgsI5*P@g4&g@5)=DE zy(upxu-p0~GkvF{lB=V%QjS@@D6p*o0>EYfL3@ZX<2*)X+(Uj~NHWSDyiS7F93Za(sQvwa;I$@cW- zloc9$FT%aFrL4UV{8=!BvBZ-gILWWxg`H!m_FP!;N3x8kX%W@m`{_JmIxz*tI@`IC zFk2QdwUn5Ruy{it&nECS-xli<`jq#yNJ{M#DIVAag5gXB6FUqs*usU0L{i69R@<3Y zc2^|32gi1NK4<9j)Cq74ea+^JoJO&}gQdYFYDy00jEo=sdW?&utd>o`PmvX3TBCyO z;e1$D!A~f2PO_8|^~RU(oh_wAQDo_CX(fvCKgziCYPeQ-XKCd>zZS`QQ0(67#AQfH z;kN$X<-hBTLae0A=mOg4bj&|Sr(lUqC+JBnLSRcIVX(2r(!gY@Wi=S$jY(MDnJ+?P zUkuD#Qq<+mqxJ-PH$84+RwGr*jTqB3Za(-{Vx;VJDiDH)M@F~&Swnz4hqf)gwo8CA zLQsn2n(~^h!N6=Zk%#D6fSt=&4eby)@FhkTj3QgphSFbJq;aH+v4YBgKB%hq8A!Eq zAn_AEtZEzyY~WL!r9xXMihe<~bRy%Vs)QrajqeXCun(ot5UlUiFx|J6r7et26HSfhh|h%W$1*{T4LMxUJk^moQON z0{;F$i(u@`kLRIh#%=5QV#zxdrRw;+sqEdm;So(cqP}3s3F+a7XU!OPp|&icglYhC z>J1zSi+$Eu$%yE&T7aW)k%afepNuC;O<5NpmiBeOKPNdYf^(4Iwu_VgX3eWj$T`hJ ztBw{q*f*lQ7FykbhXZC~@$0No+3F+WZo{oOXA?wjXd)tS#?}HqxSvOx|@GY%(%r02Qd+KK)86)Y84!B(-@=gJxf3tt&=HSjoAX~sY6|98`PkPSdGG(@Jd$*pF-%|B_{tIZ8 zG0=Nl2g0aKf-w0Ff9CEE_(8-=p1(c~(}9{0Uoz*ZRR<>FLIA?|sVww(uaT*_w17DbpGL~u`wz(%r5u0z0O*_Q_~ z+%t%g>uOk*UgAPM_q?icmoCVaaeb|hxWo|u=mEKBaE{R%c!8~vfjnpMsx}W^m2L1k zl(Z>%ZD)K>D-2?Zwr-WMW?{diwqp&Bf-JRd|72T)q(5ux<5!Rp7zAg3#XeUlsk)^X5HYiwGtan~Cf zF3fBrgN0+k%k(I|htD7&;%)w$tq{?!Yr~IwNXov?LT?~p%PX}=1hNGZyJchBCD|B| zywo-kh@Kx$~hf8q;#u63Uy_V`ouxyF4`&=dN!f@Ci157@@1 zP{=G>^zC-o(fz`i8SOW$K&hvYR> zYAE}7mXD0!U2clBZjcs8W-dnt@0h3sS-DFmju0HboS8*$VAZ_}L81Z6mX&7R;;dXG zTwu9Yy_SCra|m;WG7>mCaknv&Ey!vbBEoTD+_BN*8MW78q81sQdiQpn6E-ux+5^*n zXxpw&&|tJwizZVHvd6O0Tl9>zUU=#=4F7xGM|5nzz5}Y8GzD*RDM~jfg?$7kTA#1_ zJ?axwAj2Zrv*sYqRyIkm@S!Bsk2!&~ie|B3x zLj?wFS|ylswe-f{xIyRT+~bDWf&ei33l88tF90@GFS+Nb!Sloe?t943g9K;37`&Xi z(}iR&bI5RhHuUd%702KxBmJ1Y;ALmI7Gxv*f!Dkw#fopWJy)Y&+g-IPQ17`vPO z%QW_EuwfXy*}rNBpEit3qk}iQaciRs7yFytxV7PgiR)%JZf&r!6TeyGHW!5@iw>FG@6=dVq3UWuN8(;2U()b##GiPd~%PWFB8kBP*JdO$m>03Vi z%aLgKHjf#v>HG5vc|mW-Dc}`-zNF7%|ZVXNF9u(xHg`F>H~C&WK@>hm-4 zPxGa6ygu!1$m$m6B)+!EIfHJjDW4zmH}6cg7|vmXgKgUyz(D9#;j z))Ibi$Y-e})a_y&qTjm3qFWU=23h33=wN)xcbm(XOVs1EXcdg|FG;{NhEq!)IAy=u z4X2Wg$tA}9WcRn4e|gOQBrf?O-0^9geXz(0C9@U?IsTZHQQN77z?p4#Vxs#-|JwI6 z?s%7h(KUuEJN?NAS zQ=<2t{mgq@6v33zz%)?PB2NHtCEID$Oj6fUR{jq`G;3%!0q|xVpeY5wuU?A9(7Xa5 zIS$a|0^n53Re7-b65twIN7IZpby;?BFf4ydM(t!x9HYPXkZmrs$|TnqSlFw0W-P|T z-nZT3JMK~G9uwW;yYBHl_xQehOmdIO?s2tyT;m?sy2lUP)hif z?lF}|#Jlkx*lvngn48Stx_^}dy#bE}%bNM&q`iKZZPoAcR{gGM<5$cM!*%l~JZg1? zR%=dlh`Yb|)gPSu3)aQ`uTOzQXp_68L2~Jtrm`zdanki3iDXpLEfs9EXR1?UsR}br zOUb)lo9GCvJ<=ii^i21jE#EI`px>NEah9%EdGMH?>6Rs=8vvFR$5jp8urzVV@!*&{ zke?@{I?Sa)W!^0nysKwfmjtQmJ0LowOfpjTBnp#B&xAR#gq?><2xsh>@TK{#-RhIf zj{G1c!ajQ@{6j2Z>Y)m8v>CnAG6(fc zdoyW!P=#5kXRON;N?5x#M$u)wG2;xAnqER|N?u0o6x2%9qqodAemg~KYL>OYWJ!T5crWXfmb^(!uvGdt5}osI+a(gr+Jlco+KQ8%8eZvPS@t zhEPFmBQFis=)a1WmCNe`L0M(I-{dl_;5FT48sgP*68v>=bfA>!GB+!Kcw{{|9{L&RJZ=Y}{$TtkrW#vx({f_x(m z(Kr{RFb)X?kkjLkoB%Q;4#^E5N5&yT1IUM$#p*shfV>umj0_-~zk(==T((knLap7$-T8-}MM5-$(zI2kW9?Mfsf>cNS1&;d0#`s3TFKdmI8eJY$L^ zUKhkVDev=wPReU0MNv&9QYS5p44~6z@#Tl#Y@18b&hs;;tA+{kcZgNEjI4q)SRA&B zk8DUmHCmY;|Hb4oVf$xQR`D7A?*8gL*{UrJ8n&_VAK(dgs>ED_YvBKBC=2 zv_j5<7FO>;<@*iU7lX>(mq5iXeo~mfHly}g7Ws=2+me=uhRgo~byl=-O>sS-q_$JI zhG>NX+-Hiq%gj~M4fRkqHxSzoe`L`L>*p=(7-VbU6$O9k7__{VpT#qt?if@O&LUP8 zCT&~<7tZ1|40?&t^GI9u>hdfeX7lA%&y~-i8ef-#J)w45=8~fy<`l^6ilbE0?AGIW zcuMN$H&?yNO@JuF*Cw~Gt#3uSSUqyU4TndP4&<$FP)~~LBpS`giWL)TR~P@40|(k~ z>N9BhID#tr47%(^f{ObL8o8CAQ~C@#1J^?B?3%|5zxUSt!MVx9n#Iq*UbjBY%eeDs zIx|anZ`1AW=87K(qjF2}kfFud>6+wO(K;HNb5NWWzx&X365N%?64+M~>fLwo?&oiy7i00i-F z$rpAtVMnoH!j68#1wO)NsKep_W@7Cp#ps<9$cIwzfVDFVvP1pos?gN3%p{2%b;_X!*zx-z*uTgu#twr zm5Vs*Tyhy`@51zA(Q7VwsiG@`#AB2=Q@Q&t(YH|SwI43My-!ptcajUaZp48DfUygP z38L@QQ(4Uovg({0>j!rPkbenc{h%g*Y!bx!!EXXc6OijiRgaztIlNnN0B-g%bMoeq zd*Y_!LcU80h6(Q`rYoM%t0q}j4C(esU;uTQHgx$%5qy^VLx zLtj(*XI76+w({vYrFp324pu(Zc17o&ro$<0ZusFbSmCo#!b`|sTdiKKKf&mxV=(El zu3A0AfH5q`mE_|;$JnOQwA zh%<>ehAZ(yyc?x?&*5FgFCTuV?btZlJYPkJpSh}mfN!pxJ-cg{0RLCh?YQ@DZ4cbQ zu1c5k0|jP_DKIBDtVDa^pSnuFblVR4nq2E9`7>XyG!5tYyiO|!Q}!QzkW&&~qn+e7 znEuy&c33-5GG^+yk`zc?I>mLf{&*P2eg?0TA}QDtK$*DC?HD*^A~JIW8pU<9CMask zI=6jbI|8T@*GUZ->;rNv7AF|oqjSWen#x9I7M6hF_q%Zia8tkG?k)`rZhi6 zP4J2H5B%l);@jit(-hjm`*(u(t!xxj@-7Ru)>7)jxuR?NiSQHi5?K=NUlQ(D5>74& z6OTnX=4H{lq@kqyA0hRqJ+(O3H(D}#YLTyRt%vp028W(nj_avKke*uh>Zw(%o?3Y8 zsT~kKwe_K=_B`~I(o|0^UiH*MR8K86_0+OaPc3%B15}e{)x=<0EGkS(94gx~ERD)M8#yC|RjVcYC&$-ACIHOFrJ zZhQ>kVDsFr9vD}@#T002spX=owHZ4Nwtq3_7-`e|@Zc@^ja9GXXMA_k^lw=VcPWEX zVZpVV<6C~^N_6>+&I2b;^ltWzw#}X>+3blb&7SDk?1?7Lp2xqEod06g-`fwfQl^!- zQj$`Cc$7&zDn&&^QwscWR-=+gpH9!=G&LW&!3QIDPUBEM^51c%%AQJ)#l#y|`qjHr zZJXxzu?+<`l8=8i=B?q@e*G{hN}n|AkwL|^PiEXPhg!x-S6bOJZt@0=-jbQGPvl`z z*>WLjG|^=gAjwu(2oL+~Cow{BGrPv#86KtKnl-i&K-d%uD_WDPz$rnXDx&XcL14&_ z%vnE811mgdjVe}@|C|%%?sj+=pUm+CdP?FBW%X`&^=3c(bWvnrQFue+>n9ZAinRJ4 z$tSN5KP8`5E%C}PNn%^2DBSWzU5ilLaLZR~8-99{W(F9wF;etr;n!VJBatqvZ$=(H zcGs6!3_D;&<;Q`v_TaZ;Z~ygK9Ir&OU;il%JEB+YFSMA2)gN)A%iGR2;qfz_`f=MB{PM6~BF-*{5|$alzdh+{$sA>kCVyA62Z#v0u_*rysE(tLIne6lw&Lj20jwVyD7AsfqiAJkd+Pbo zsb?k?p1i-1r3L0OMfopbCWDG6cB;_#}xRKwJ(g`c%b?KjX#OGEr9}C$4%buMpC;*QoSf)UX}|NxBhH#y742L zd4utyu?MP`-mL?LM@;=eVfE5*%46tks=gyyu#GkluL4=LeMvMct27zQn^4`e!}o7M zDPLZVBy`on-^E<0PYp5-k$>B0# z#>Pl8*U!GSEyrC&+kPZi?7EbO<{8KKmk!$>Rxgb@WG6agM+_VnO&f%_8n(~Z`IH)L zpM(1#I_q(D*L8K)i=wz@EX79&COnv^=$CDB*J)#$)TQ}PR=rkIiG@*S(MHhCsJ$Lc ztVhL0-roMxf6{~S+I%UQ*{+Q{EeOmc? zN%Y|_YHk1@e8RAwpR$YMQ=Tr$Z(*D?B)2ydMz7mfSiQI3^dBb_+&XUZtFGYPDmeVM z-A`^bEqp?QGFECd3AI}HQcEkJx+q$g)>Y~lN@YK$Td7}*P93!W-~|Tm=$G~AX+hZs zlBZu%6mE+*V9?!0$Zb))#|4CF!Dk}`dbT71rHw`iLuq4vr=!DPMFaV+Xi9Fs4?aCI zVLs}T7MYZgJAbBip4fKe?C@Tgb~NpngY)cgXN+ZE0Lx}|siVn=yz^*AKWtpvXZv}$ zDvc9(H!2(heCZ)iqzNo!A&iR&sUCWdVphHj7E(njx4r-1I?ejX<+J zaU&3u5uB61R>;V!`35~pBW2e_hM->J_>BO+_d)Z$c|U&Zm;guaq(9k>b~h!JL`S@< z{MlFJI20S|cArZ5STNIkb=R+4=<^F zUj%-q6C&oy#(sGISEpw%X?-<$96|84@$YofO3C@9m~N&PhPUjxUG^;Af~*xBhW`V< zl1GQ<k_OO9+#3?lAt$>{)iaKZuV!?aHZ9OLixaJheOIfUlvpW777Ye!rfDT$W zQu9#KxrkcEXUA{sEJ|*ZcNNY3Mfq#pR6mSHkDU3VqgM>VNByKY8}cjL{KMQR;2QDJmT^i;#)lFMk3xHS3a6k+fa4HTJP7q;q(^R zUA%>BIdDRUip0Zj=B*9Z6Y*}a@FK$3*82R48LzFqm^WTI{L;;zy8!QgWF&J%5f^< zb^`r~SFK0bdnU;4XNOAiEtjOsCAq&RN(%r)yg`{O2CXgbR3qgVciu9*J$ZKI(oQ=t zfQR8FT~)|hH*fd$G~#5;Y0CKfhHBE(ZkW0u;%y487{o?d#M{VA_|ne*Fqw8ddm=^kg~PXzXWFlc zVc}vZ`~Mh=?`#5#njKUj++;Ycc(}daF>Y84G%T{u*hrU()VeVjirj4kh}3G-p`H(L zU_5mt9CT%D&iy{S5|O*JM6yV&2530+*HnG=!n_?kH^b?Ef%_QlQ6hj!yiP19a|IsKd4DP^bL5}?ijA`uyfY4CKvoG z7JB%>Yw`_0d~>TGuG;E{FKvlYcWn&vLQxb2paHb9Xhkw?ZJh+OL4u7Dnww)&B* zZD=soNzf*4Y@oJjpgy&>csDH#Lso;sDgSge=B34LlFXIwmE>Dp+>spQC;@b4)BOlo zoXl5#%>7kEtBZFN0c8n=UqRs=F+O31r{OgCQm{_j*0b;jBi`ArI4#5vTHH)}`u|FC zYl}5opig+WU&ftMxQb}re@`}_j#OH+g0Q%;iARD-M--xb!Yi(4RYIP^`|tK)qk;#D1a(0-t%uzsLQMA9~^y{td<(GP+Z^r;IZ%jU-g53AH{?8gLw1L z+%3HZ{MkuYkBfQx;k%`hg}G?9W7D^IQ}V%Ns{S`g{!u(9Q+;DeOr|R4&B;{f@)oWY zlje@9c=*Y@IhpG77CwUTwZ_ApOeH4FFhZuvAUxuw^DCL^aGr6QYUE7GREiq$Iu@%K ziDnV6)!rqbMZ6Y!$K6kNnd*$n*~#5xs-Xtx5=gug07#~~+&$C(n{#oTnlYJbOc3@B zGC!zH^%Vk~(&}WjFLtNse?$Qe2XCBbbRvs5e( z!}j7nIY=KZ!-WnbwIfmt4$X4#f~U=776>U^uFm}?-Wt>p5^^G2f@B@8OjJW-f)%Nr+BzS<>HYSi^DQr@`>VeZk_5Gh5# zz^EkD!k8jy&?oJUCir9u1g6qsx;=Kv1IMuOYiNlD>CJu-1PPH#v zk02^{(s@e5t}8`q6&4qjO&(q=TR?;`lf@!l-nRqdzAAA3rLUSu5)AU{o7?)|QV#h{ z>{6enys3goxBSDLsW@9qHcQZSireVLSCtlolJuuL>|L;@w>lL&vrC zs~LC7ZH-!xg8OXiYZH7n2JF*O*2=iMdJ-@deWO=j8zSY-t~TX+``gu@q*IuxOoX}=SPa`gEoyM zh1Z|l7;c8w!UylXkIYb)mXt<{=lPMF7x>X}NJC^4xw3&&&3>ecEyNLdriI2;qU*wCA=>kzr#hvVLmS=(Gb;LvOGf4~mnUr0#Bix9DO z#=`X<7KYo+&#&7ki1`kGw>Z45_~aL~<3(X;WIKiZ2>I_1zS*ETFPf4%4$Lb%K`T_+ zL`eDn$J@KdM_pY1{|U)z)P!9sXsS?C4Q)`=sMsb2YgRU8(}o%?YSJQ28*1sNwx*Iu zsuba~NnyLJ(26ZuY_X*kTieo))DH?`!Y#pT@EWgR>$h$i6}-nQzvt`B>}G@5et*9| zetE#Y&-=V*&YW}R%$fU4?b~9m%dr)ye7yC^=}ix5q&xB$Bi#eJl>^MjaLVkj)AKJ| z!?B8-AD$dZ94evRGBRR&(Mdc19U7|nZ=1AX4om<0Yg>Kb6Un+}gzCygu4<+p9)a8OCv#GRJLOjc?%GXupMJJ#gVh)ven!r}j-IP(pjFY_SA;=lIVy+rbu3MVp@S!q_<|rMrnwoSFaNiDdOf zBMC^-g-^&NHI0;Ydw( zzV0n}0HQtGQLIy@ob~`3*gd9$<+!|Bsdvk8c88VI?bnj0wai%!vRN<0Nq1yP{X8sSSB}acg68{I*Ilbvgj?;GuJz3jyZ#vb{y38$9_#kQPR(TY}1^4WcMnb#U z{W-nt(TlhmtL%i2hG)P$tTI4+V~7)1cq@D`ocmYF^Mmi5!nW%{`(!2u?HOq)O?&seh zk#psU%bRPu!zE}z@kiAZprpX1d?82eG@A2@YZ77ZW)7E!yDh4M0$vIgZV9|Qak{n; z&Lw?I2KiK>N7-Y|a0!x~Rh&#c94O|dW zh8;G@^i;C&XtOBnq4E9SgC*=+*MZOMR)HBLZo?gQ#Ko9iK%jpF7vBg=#2f$vwNT(T z#j=A!X5Pn>%fV+omwq>KO9)l;BMWtrE@^mi9@b#P_+Ow5w73meIj5QA zQRkKGH!e+j`Kft^T+fi~L>MMJ(a0m1eKxpQ{X3N%SQzuprN$^MTy&3-R$c+j`T-eQ zf93$6h5kVaT-iZjBEn@D;>8Znx?V~&YRYy#a)mm~KZ$5Obrvlr@5&c&>Wm4HI9v;; z-^|ip-KN9U9Fz(JFfCJ7yGUY!=m!?f1_F_m^MCpUtp5@e({%qOg>O zmZu+(2@qpi3%>I;VQmT2J_`RcNk&t=U9AsCH7OotF=&adU@FtH(DGU)?kjYJKot$T z=zq$DMK5ZsNoUL1j9UEuS{4+CrpF(wO}LB6Y7=X0Nqiz#llbjrI1?Qm)P61iQ@C8| zO~&rjygxmlm+vlS_ANCBq1fOQOBE7l-qB&;WL;74FI$*OVtq>fh+TuZ)rGb3QaVii z)9El#$q`$5X#`xx-+Y0mG9oru7+kiAwE_V14vTlP2c?R164$MP_xP9zpS-@%(uh(w zcg4GCEOII$Y4pZBG3NAF zz(aR+8z2umO0&DV1vkZ;8V8L3NSjoL^g`@Rhwkb!_gRxMeD2eOzwYX>dQfELbhLJb zM`&rOLSwW&mlxM0SJ<1`x4#YTm?OndBdZy&BXXj{#1EWUBJnTC;mDBSUv|ZJN&L~H zcD+M})<##>BwMx(YWG6zoh9hZsdg8`fr&A%9H)pE=g?GEg}6bS!Vyj)G-k}VN95#g zVMIcFMIIQWP+<03?mgs^;0!jfUqC6juqWDN6+-QOgWO(b>$mPhQzFwpvOoilhtyzA z(byf*N=`6-3|i>URYxfH!~C3Jdq2yIx^vG~_&;f-(GQDrT94??4GXafM6_vv9l7@B1sQdcr+uV>VmvATf`Lwq~w@_E~UbhJCDEOysIAdKWQC_Qc3=Z?F+P+J$uYLYV^VO)j9MUr|37LCim^RY%LBi(b2 z${q!YKbAp$z^++bXkhzNT)3&Xj8kRa8hd?Vh792!7#5xt<2A_$X(;Q%8zy3RIBrjx zO3K^atFMp;=4{iLj?X&F(-si+9hPLMlsoGcmG~Bx#$;&xSu~mg-yY7-Frt_3J206~ z_+;8k)v$5~A>HY250XV$wJ`4(n7?gsdi=TR$;i`#R#|@F96&u~CQ;oS8$2Y~t{jjf za@kfecV28T&^iGp5C}C4Z1A2D1f76b42LD_Up|8Cmoo{*LHC>Nq-?3xPRt9-I@lU!^sT}Z6j z_;auBU(S{RVM3lYQ%G9 zl5TUs@>(zV!MuT#_^@V^EM?3@m_~#eE>yu#OAfA!SDCo`2tm*1(~zK+QzNPQw(Ku` zbS-Li1?>R0(O*WZOKwY5k-4q@B$!w#-xWX?X{dC5T2=Xv%0~v<#{qR$m#d14{ir#w zbymXiGLe+_(q(b$$5j?tDn0W)Eh4gvP8Y^3@7u|O4=nmRLc0>CtL=uI^U*KE5p^c{ zuX>>WpYTe?%i(283ym4p)Nzm1ofYQthl)!l4l0woWr>c}L{lLZ*TIh8^Cpg{Ei#IC z6o%4Y0EMi=$fAm&Z=Zy>?DyNxuuM?X3;(>dbPx1ZInO;~c%BbA*yVUZsaYqxT9lNF z(lxh88MBTzWlUS*Iu*J^a;<)SHQrQwfPOO`Z*KyT_ zO@X7K<+P6>S6Fy8#tSr>guBaEyQ?PNYqqKKQ|4kXB=6E0bL86wSHa=Hk<6>`WJl6a z3+De-McDosa)!2Qz1pgcYOBssTeVqj)wbG%yCa7|d)2?gccies`TZz;2739A==kEO z+NTwC6ly8Q(q}kUnbSIcdVF6rvDEDr%=nE5vKo_*ehp3M5jPUw;@hQ%P&MUFEoA3V zWMs?O*uU~(?-X1y+FC)v719*RqYUQ^ea0YsYg=~ zjZZAC^$f5N$9x_|+qql~-+2vxUw-$<NyQfVg<(%$mC3+;LH8brQ zd*_IG+;vbJgL3d^JsO)OG*jK;%lvCGEh!X$Nxq!QnZ zPK3hsl>TsZ-ld6Y^DC!?S`Lp-3n9BcXTCPh{j!fiCoLR}Cc@1SgmxH94j0F+o|x0Z z-l0&@`mc@187KnMu-2@&EFT8!!T3{RUa@Vjunv*~OA1Gj(0Pqud*_WsdGTrU6^9ZSM$6%-=W-w~KCc*2B?Nk#Jgsd0SH0v? z!oYMs69oe|-k@1iPJ1dYLxpx%aIuD-UCbYiBBs1Lp^6^)D)I$EsDc+_D+s4(-ohHy zpnF_@UL62k?S^qD#MH?i)zBtEuApBXx?YyA##@1Xn#D~ar)-@^59E}muF5BxMsKuj zqNa_&iwY2dPm2~3Y3{M)b$nX0Qj!Y7(ct2deD7bx4?I!3=Ja0$On|st8^!+914e^8~7dk zUVaj^Wk&T{U<})uwF4Dc{WD`AjE+wUmjxHcz(Y}H9h)|m>2eG-99rmSn=XgyuTa_|BNR3kDjK!O*sl@$NOc;FfxctVg{f)eW&Bz7%C8w3In@~L zEh?C^=8L_wvu#fTvl|D_1*QFm@C%upy>ALSs%KB-Y3HQv>fhMOrjpcN})|CQJA; zuj$+*QW$lOvOI&G*3n>!@-Gr`9qsNu5ZY{jY|9H?Cw=C2#;28_N_D2U^4T05QPYm1 z=%x!TZ$tu*W(Cq4vIVhxkVS|A%kbqE!O{$~k<_`)EUPFJW8cjL3YiIv`J78e!p4>T zh}e_KQyCn_R~AHgldIggKzJf8gpc11EkuG}^?taVUQW8DVptqw;rzHD-3rLa0P0bi>!y zD@U|Usg6Iw+}(mnnlQDEagk(Ug_|(#Wum2FhPVk8G5~G&F&92S;w%7(R6f`GK$vOQ zcwb}!$Eo+V#s(&YlT&lU!M|*ccX#bQF1LHv{z&|(>f~4USI7Gh^eLOI?Vm|asY*LN z5s8Pr=y}^UN~vM)AavGSGn7+hd$qI1PwXN_Xe^_hq0v}S*=sPP0pwRGYj3?8{Q5p{ zJAfIkp20}5w$#YlzOI>!=d`iK4vtxe$VGW%kB;J-)x}6Xx=)(Eimu@}p1@oXyb2Sd1s98t%?<7sA&zwUmyn;TW8nrfr;H zvYpQ0zcg;*_(=Vhr5&0W%YThl_1JLkHVx~{0D|dlYH1fl5+&i-d$|iP4O^>nv*?HI zx0)O5s^j;v``Ee*+Xo}@?g%@vG^u=AB)%_MSnj8(=yG|*MDE8f>NOb5=&x*|Za-771=aDMNc^#Z-_b-X%W9$x7n?iqqVYGP@rR@F!qUW{5hmj!@ppoM>9t|Q z++Dlg<~~V!cVrJU;ACGQf@!GM+3CD*QOhsnUi=B}409--Y9AgnL%$sX(O>YIKLNPy zp%R&Fe@J7AuR?Fe8-t>D71UU1k(^QxZPE?(%J|6p$fxaR975GP(&>rgBaflVI1F(I zHifmLGBKU9^h)?Uug{?gx#5E5=tFP497&d*9`1UtD88?2@VM}VZPnj-{*6zm%>6SQ zfBm)KiEjo+zZv{0o7-lcdDqXye*Kweo^N%_nSZ)co3q~5x&>s;e-~buR-T!H=QDFH z3=>DphG6GocF}ePW(Ir4xb47fzfyk3do}93gZbdx9lJi@nsTyC`crl>KOG!(sm?Z^ zwU4FxGbs0UW(yiwCCt5pmeUGfdq4WN$(`q5a1V)$ZzK_5Ch8mT20DCnMxfT=`kYf> z8vk!-^+^t&435$`2xb?e1Mw~i9UpCC=V0v{HVQ%K0sOOB=G(&9Ky~E@!43|39M0wATktz2ZHLnm=^?iPTLx0PFC2erpjIm{xXwPe z<@2gKDm8(&$3E}DS)7xcQcN*ACpigI#>zvr?_hcjwXe!wbjeVfsXZQRecTCN9lxhK zw`o9qNtcGObHR=_bYK)7${o<58m^+qS5&pk z`{tH04<>gonl(M!b0=R~`l7q>BS=IU=3uv!kfS9S&^Amw+g0f-mx9=pQ*t?orX99hsOq=J z+Si@dzGh9#PL@4zL9^VPeJSf1IA%KK5-b%s*aO?+h24?LCtC_FFFJFzH#<43URm^_ zTAb1NCU?$Me0{0HvXVFhtyRimK?|LV$M3I zf7J9c`&E0pOYO%Swj9<=Ba%Z;U~+cYS_LOFmNhZfRbVu%{(yPa98XYr)FfJ7A7m)# znL+eV4e@+9aWv<|XJ!=(N9=lA1&&5Qxt```vF$O()XFlnv>?RTG6%q%2XLsO}R#+~&8`BiPumd;J0IsLz&hbazabX;Dtoor(e z_(_|}^lLW1#jL)CuEHP!H-C{1;xtjv+jsJ=FTDKdyC2Eu^|cyHGEm0{5=CjwF*O7} zFAU0@j-Am*j6IfJpwkULP=!hvDz$LUn)tc=1mH2pFebtmCgKo~$yJmUwcmpNjRoYa)Y_tu zfqj=*NQyflX%lew*Btu|^+zxbkTlGcA=S1#GkDEU5ZARW6~TI=O0lelv6se3^2@o^ z*dIqp6d5Xxu|!?hImeXgKBhKDEE?Cpbiz!@wg&|dlw1}4?0 zdGae1l00X>id<$HK(ap9`xS+h-JN%z4J%JyB+_B=Dv%% z2W}wllbSv#MsYAM<;zKGc6}Ci_3>FlT1+6QBy>j^bNIxSV_`9Hgk~^p@d?v!#MUwt zh2xvOZwagyycbU@j|3{{L=L;@V zMo}CNmMJ@3PFM>&J40qt;s1Zll=_F2DN%GZBb_N~2U&(#UXmU7oq6&T;Raeg}Erj9*FZi?kk-ff-s zaqp+g<)ifhm3aE3-tzOYwKuK&w zuGt~+FA5xCLLh9xT-jZkYQembym7iDR57s2!|t02i4AHIRH*3Napl~Wo?O!c_IDwO z^lB0DZOjr}Iw7&AAjY)R<&%vV_=dn(TNSA95DILE8E4W2H-nOLn9D4(j_a4TM` zL;X2){0K(RkRU7k1%X&Mu|};b?L^=qLscby@Ot&XSif^Xy&7k$JTx%D57(qO@-4e2 zJ@2SYO*&ME)*JV2SVzz0#{sw7%$^xfg>hWZr`}-fGHZ*#@*FdydJQdn&EaUS84Gia zlq6*GkWhiSC}D1SFmVIrVxTOI_ciOBfuq38Ht%fVeT6-TNyRl%2<4|_awvF>p9LTl z(L7ExkH1n*z;sPe{BR#|@))1Ph@>1w;Bufo zN|an4rHW*Qu?j@*x^&OPcfZatM1zapr-e#rEz*&5_{mGW4;*Xp@mI1F)sa9mO6TI=o$?sMZRe53${^u2E?SJTr%wYQ%v@ zO;H%7SoVL5zf3xd6y=j zZ%0^R%yu)>=&TQFd4pMb7G0^rr+?DFQ_V~2_vs{^2i>AU*w=JfPO$o(;FosM#hab( zYpB1l6OSXuJ_FWO3n>@Wz6@O;!y0!!=Lq2hHU4J?<*Z=lOlx;Cw~h>2bjm&7*1q7C zS%R5rV@LHXnIv}@giwgF>u#*+|9Urh+M&tSi5yx6&g?Cs@jev}@$@{+6d1(Ug$g;@Zq6G_ zduhsLNE$P&z*s+uFnxr<)MtC=wqPy_ab13BX()J=cfa-HKA56{*)VQFixtqoHQ%!L zJ^~f}!C;wDJ+>h))X-kK$I_qGi{eyXU1Ee@YMh~eI&F4Vf$J^iF=(N!cw}{y@sNGQ zrYp;$x$M5Pt{3LBH3?C1uj!mD>@=WZh0g`j zP-@WDp_VLYTIarZx@`En-qamYZ4sy?*?A{jIl)+)44xa)2y9EYEJJBV{*wQBQN`ebDAgoQd7HH z+1+0WCX-W{oLFjQk$f#Wd4Y7ux&b=D7wu%50dr#1Y3Z7+=v$SRh9g0c9uma!BM5Z{ zooyzXFSL4@wMQ*lMYK}v(}K&YkC}G#oqY<9imMs(%uKhR)MhacN1FM&eEs}tD;o-I z4W%1l@tu^F?7KDIieW>I6XIMfeX1EEp3MhqGT-&Y&oTFU}679Y9=q8gxG3&-JvUGm(1 z*a*gIwDaK%04D28YM8)9p;D~YsxH?v{_NdPW4NhH&cvnW`GscVxCJHgmBM6n%&_eV z$;gO9<5M}4Y$D6?UPCQU`?)sMyDc+kGQyVBAOYs{{j7;YHqw8~f;;~iW^jz(q;zaN5Jd=?nhx!F! zlZ&)C&bCB+7n(1+AaR=tp39ZfGr3}m9BOUEQ$Ber4%!;? z8j*EY;PQn97@_Jm@&S%Mltr&#XL9YOl%-MC6>hC*t!7$lU12zDg>C;hr8`e+q6Q|3 zm>M3{?EL7iZUe{K@cA||F}00xqmup+2nC(VQ>*5m(4A)+KQeKGu@g`~D{ZY@_a9HO zh&GwS;nb3a(26!)D+{D_JxT>|tsDz0TY>2fF++VRIn#8lwBfO%%{i(;SR4O)CSMjm zFBY_aq2(%h4Dnkqm-j%cjig_Ax>cXmZF5H>Pv95q!$b+ybqZHLHwsH@9WO4W+D8X# zmBgKUaF(jy>_p$0wl8cfX5) zE90q4Rey3-P_`TU9~UgIwM8EZ=2@m8U||)@?LP5-ZxInP>&z<-uAdVLV-?TAgkJL0 zkkFQ6>3s}!H?WVv8E!*0Z3T?8|66uiN{1>A72W|L5-InIbTUsFWxdkJiZ!OYm;$d*sWQhBk#f-635S+s#%)kNRS!q!oKQ^8?uDo9-Ww32Ij zh`j}mGc`Ot+0vcaVo;^s1tnVPQ7pH}(w_81MykCsRT+B)lC`C?+3-^9#*C9KrE|37 zz~9L>l6l|Ejsq@usWDSc7 zjEzBcwT`~>W0eoL9;QJ3FN!#)zHkx-`?*h2Rl=l>>eqtGhl9!c`Rps5!1m|quYUZ> zqq7X98bcv);17J#jSnnrBG$4FVnOfZYeDl2+y-5q*a~jO!NgcK;R3lUVn?Yv44(*(l&Fow33|-3(>k4+nt(v% z!!1P;>X%CVGnTj}ZD<)3P^d!E-d58Z=EfqyhqHR%b5AshxaT>x4=GMK=Vyi8wxal^ zRo#E?*g!llr8iNZQ>ot?4;~zwTJX zpnse#BK5%CF*V5i?}BPXXS8o$=H5U*8j(`}c1=>*Ddt9Uv6`);~Ls|m?NJa@-B`PE-{ zY@0npRcM}mw-&yI#&1G8{J(h5Op9yJm4l+0t}KlW)+B)tM-b{OYee zHrt>%Mgum|Ce1raZ_TBeoGQYIUG!dJ_r|#H7e&4(0m4~`x?LgDNSx59GKu!}& zfusqx99VKrXEVTFe|FGj1h zUh9LJ_*;~K+IS%wv2HD`0~twtv#z@1`C$7Kqp1c?Ojh3?d;jd<^i<*;wfG7WKU0R% zge^=~e-Ili3NBv7;;7jBM+BE0ULasZ>*2AhSku<7O`kZf0>FLr3S;jdwxB4saV4?A zJZqQ{SAQyD_NeZK0gTQTa0oX|n1a)GP1sf06I^lg+^QMlT(5p(% z*|Uh61&K#iwa`#elVo}$Itt{m{}Wrqcs1=~c$)p%+|S%^$R@gNI_Q+0HqmV(b!5B^ z4xY*}5bR9QzQ|B@9S+LA;vdTl!zg10Q|^RaHksyfY~xZm%57C0QkdIXqeC|9>(($n z!9Md`bro20B~|odD}bv3FXBI+>vBS50yW|cbzSOG)1Rf_8+7E;@2VSBIKrL9hLE9j zI$vkY$JgxgT$(qQPJ1cS5jpujsW#xUUs_TN0nb%Z?WN^_F10nK^k1n7HyJMV#4}3M zzpQ%d-TmD$$)i6Q2r;>@eH@9{dmzMyQZA;m;8QLEJi@1358UQbZUme_3<8G$(-M_T4ckGl%L?GNPM1}HB``qXeFRSH@^xVGBwR}N5>005 z(y%9!ox^o$=%YXn)1_gT8;NXP8akaHL%KAy%a7r@v=220%5T^+jJRj^Gfzl<1WlXt zH(k*&tM0>Fczx^v9PRZ{jKk@1`X~WxcKYZgL|Pw@081ajrSeR2|FWa+z``^(opPoy zZJ@{RlkEgN+9x{*T(QaulTNyrT0?s+{roZPQ+2R3tRoV<;uivzdc|)5 z_T{q^u*50eb^x1CUsKuwT8bAgHCF;;mruhc9~U-T@rJ$v^f1L6cAt^RR=lB~@aQ4M z8+wcBWO(_s54YHd)*)pX_F9J>QkG$V4ERs(wd)d8jrcLs1YNkc`?_})~xl*M!K5pw5q zq$TPVqcYU10Lwk~HsDT2eWB1Ucgg|N)F%Opx^SZU5P7cW4Wj&bAV~;qk%;|q$gBcJoPD}zQ9u-q_N|v=dc#0!c(sRF1yiOP8Fc% zeIJ3-)L#b{b>T$)C{O*_hoN5LsrRu2$y470IK@*hW?faiqh12|X~%mnA=1cWZYS3ULPMSZrX zzVet1_0@n8PrVO#t)s46-6uNg%K_8WR{)E;aH9Sm`qp#XLr_1&Q*Rrap}r6>>Zxx4 z?sL>T0grdon*r0*TNE1V!inmyJoQUNeXXiv+50Cl)Efb7J@u8q?>OqK0i_WF*8!%f z&j1#6;Y7X4Q!fzpFM8?~B^l~f0zLIM;NoAoHXooC_d~rLFim|Da4p_QI3|2ke@EYX z{$Ur?&+xvk7@^bl4tRm5UN5wx-UxUSRG}UMOj92XtX2BLu{b}~4s|_iMSZ?6tAi(G zsLL`MJoO6Tg^qd^;AxKfJ_4tyzYZ)ja$b(;WovbLr-kQ4U?Y>%gYdT@NgYgiC#qM73)y@v->mQo0DWWK9mc zqZ*ZY3gO$LEv2=}zAuRlc?!4=Vt8~LjMjl1H82i9MZe1 zt;{cN<@9gQ!O92UbraxR)?C2KglaK-kj;O#H5->&82j+a^*q_UN?SG>wr1OC9PtPj|Cmi7QzXNkp5fN7Pj z0G7Q8Cp#N$S+hI!^aGie-qzslPr1aNa*4HJw?46jfST#BYy@K z0M{nh8;;@P)Xn6-o|n1A3Ub21U+<_6-u@q5XeE`@TybPAJzC6I6u zDejYt3#s$Gru21S8G~># zhC_#^xI1+_2z}Um9|iYi=sL?)$+DJ9`za$ByHT%SV+h<|<;OHDP!*-AlpSsL`671>dt`^_h$~oq$WdID^1FP8_wH zK2LaLUk5fV&U#>pBb+E#8eg}GbcVAF#2MdSx<{$X0sB-}R%B9L4Ys7z~zAHR965iRpCT=tI2+wNM};rjg0y>PpMwT5k+pA&W1~5OA@>7a~TE}0$%4C z*Z>@L40Hm@cnRDLm}a0wAuwX$WUJ?xh`UpVlUOv7Uz#Y(R0eFUoj`gDT}O3No4geF z54n0?d;w|%TxHVOroMtKiUJ|wto0071&$9nkQvVf80 z7FuLkqoF_du6`xo%WtysxEk<6{tp`stxe7@WuEhe)D(=xmp@h`dM!`rc4q zNJYWv+nyZ^x8$AAr+#(45sVcJ$-39Mb2_+KlQ7}f*@$_a63aV}UmN+ZA*c#Z1yw-W z@&JGBIn`k5j~%BPOf6RAgAJx)d3=`T#l>P%D^|4QTn!GIX8@lI-t)|{#Jf{J?Is-0 z39#M270qda^~8itfW&P=hjvqRWXsVBzp_o{AyiSYeT5Vq>l7k&B-t8a(cFYB>;o7p zwpVHvTE@lY!K~j{@33k6dYMHgwmVX{EDl)^Xk$J zp9@+H7tmJq42J-3hYg{lz`c&)IzZJ>U^PUWW;h>MK1Vp^&GBJfkbM&p4ycOGvvF7F*lONP+2#L`hCGv%wRKlkS!z^--A@3eh@D$K0t+=q@HJX!iw^^v!t6^o;Tak1* zLD7*eTT{ZyBCGF60j=k6uR8YIIhP;F_rmQtAOAKpOIq3gvJxXYsT7;(KLbK0lY+3f zB+Y{D_LfwJPc8V3dAoAJZxNcn;v#KH&jYIgJ{>!83?wIQFFwXkJm|~Ttyy2jW`DVb zFJ}7IcvINV3PVB|Cyh5@{+3O*0-1aV@vYP^v%d@$XMI`37sZWt(b_@UTtu#A?yiy} zMeh70)Ps>NXrMO2kr<(t!|cwC-?L~TVH3%d$pLrQM|U2rcIP6VK}_kX=dg^PdIA6C z^;AFsX?A)F0iH-S0&6rrt*33kYNZLMme@FHC3)L6LO2zGtK1@7OX-vh=F`IPO zVFNs9Y3kK1Idfi;++C!>UKO*6g-rP$p>kLlY=1?3Cr(Y9o}Fl-tXAhtWANe4ALEVb zOTUyQ{!BE%f_uwAnbcMmJhvh@J>IoWyvzu;ukn0i{acHmmFS2z|$rao^HSylS=bX6++?PMf_>5V485Y-^` zd}cFE05~T%X~RsJY}H$^y^?p6D`-dZipM#@43Eu#IRVG|THsIo){5#nK;PNaxOJMx z*}&paI3;<5c!6LY72#>5Be)S*ELcLov|DUTksYqk)UTBTEAK`^w3G6d$HK5P1I>5Bh zGk`U=C0y!71Qaz5tfzCU4mh1#^}y-eil*_b86&rrmX?E1WDU?Ow}x^_`DS0!>69v~ z(l66CxkTp>&x_CuI5KT>!1dnd0FQ%p5|OgfBFqMs13N|BTm6(>J?P6CrI-GasUGy@ zCw$5HiHI=8K5PUp>HUPzKNWGF*Kd4xza80hfYUF?cKRH#)lwvvuhYx=E3{S(*B7G9 zxhADXBdrCxXv=bCU{kD9k4(F?rHd7T8|Amvs?AC5TgOHwEwJy-Q&}^Y^A}#NaFD59 zZFPX-yxNukw>h;f2Rw;r%2>d(+9JTRJK-eRUh=`a47#^_Q$ghmHAR)v5199nU0<%d z)B32sWArH)VPnN)>-_|m7V_HvG2@l4n&VY_D8y?SlOCSea=`JP*Ezsz9k0!R6CAH4 zfN5S!fyJwE;$Z3!uW#zTNt`8bTStrxx956pU$}#MZINi^P32d0%oSp$;Mfc^A;6P7 zGg06^$4njIrxcNfEnu3Nd|+$X>Pa*9b`tWb+PJ`Ds7Ltklkfn$2c(An_ss}am8Nh! z>S^!esh;+rJ#Q_|QExY~zO=xetc2jHZA?7=Q%{>aby)Cd7wX&_Nqkz?an1jd<_5G* zwSCdfJ9uJbnOmS(>~%_4>zFH#{g6)e5LF;AUiDYwb{FUHedcyGs-MMWK za&B7eAV|TIkYJ z&gs+vk1S$*jTOJm`#EzaxcI+icXrQdBvINCrTH6~e0*@3P78=6CU#UAVnT4)`5hHMq*L~MN694V3pd;}=%GOlG0oMR_Ppwk7yL)Qn=k|z7`Q1}( zej?1Fctm_2Ojh^gP(s9~)^$(S!Zw1|yN6QcZKmEBjmW*at$V6wR>4)c5L4_Cvua%U zq4jW68+ivYQ6UVH4=FLIlV90?cTDjei9Ng?+Onv&nq9UcK#F;;T^VXvhXRYA3@`J0t9Dnr=yFi;`=8};r zE*xV$T%Wdeb`{V;GZ@Ss!-Nb23?^k5mdg_+RrwCPmpD4^4tAWB_SGb##kKLy}R45wjEQqpmnS+Qg+6fP5=^3RE!NB{BTG)-=5FpM7%9E4=T+fbx zEiCI*T<%Dt3bGATTrN0^t=Z>wWgmvR=*6}4AM8BTn)sVhS}GM)XrE`*b!4^>ja5JU z%}AazWh+9o)wvKYv~U%&T&=>5jkDW|Y&?#ACG$(mQw{5JemG27r;%h71MqqyLOX@$ zg`z_h4yYaipcduIyF#eFbhLspZs1nx?oM5FI~27TGTJmE+O?-3n%q#e@T!rU#g{9t z-@in=ncP@jO|Q0X5H{C^U8k_}#;gD4ymH@dblA>HjyPi^t@SrZH%bGhOrylb8docc z0)@gG=D?(#ZW&#h_7zmLqab(EdA9cb zHCTea)+8tG@SN{W-2&}!aRb>w>i)%=6}LO|1x3QRjM;#SDi z1jybsnyQwmO@i{Zd47 z(laG%_8sN3!y)W>0vY|V`>dS5vZ?D&Q{hOif9?!dEG2lxli z-V)%m9DB##+OAk}c1P8=klPg(u|85XO@)2mGTaKL^-nPcxv;o)W-J z_OM9UvPa0&Par!ydxSn%_UuE@?Ci1V$HL74*&`n+1`Bw4219^<_6$aWefHD=dil-q zlCaO7e7;DzFG{%|kv)y}ZPGIf|0gSZu9B9rv**e`3vrO_Ns+Q=Zy(?~&t4g(TIaH- z98kSFWZ5G&VQ;APJP$_Mqc6&qbHokL!<8N}dWh-C_X7UalP@?blRY6opFN#Q2J%+j zY~#hsI?vRA^gFEdDD1(q=R87YXOF_A=KtwK*|S=`D;QkM(=)gZaJ^?R1?;nDAE4wW zup)^;pFL}MRrXAmEq+AybV(7Eo}9b0vgc_<$j+XpZWZDn*|UU3oM&%2pbqsmwE}<3 zdmlh)2KE*Ln*IV!@1CJLtsR8wG<{HAutv=Ayp-g^n-$9)uI`+Q^085UCrHiV>CeNX7ef=_zbD(4rUxm#=!~yXL3U-S-H-uM97`S+TPTzKf)UA z@-RC$gB?FeI}vI-&rThnW~apE65u7?i2zbsq=qU$r-qsDm>MD=qy~ME_&16Hp5Ibh z2USA}!x>7TjHgex9B`9QcMh;uLo;C7y8vdXp_Erib}FeIObs_H&rw6gU$fM(#aP>$ zy5|oEQ$xWgGwg%_HS!=Xqrf*fHPiuO@lrz$pi{#IZ<`wOK}ZeyAn|`L26)a=S_f6b zp5t8tDV|;p`v5z09lGp}S14se@KHwEmiVIQDZgCb?AVGXZR!zW4YU~0IYOpqGd?#;4>^~T!X)TXruQ^S(7 z3_HsKb^5ccp$B-YQ$sIcK5T$p2q<=jTz5Md6?uITXN%#$+F+Zzi7iY(JpJ1i{?f1h z#}@wH)MgYba&O+u6ISM&nBlt_@Lu=^+X$#XbN;h=k@FWab&BFI+NPdS_O{ZYD+1-p0{lvBZ)JMmRB9g zV!s7-8zqF=ky4n3*QGGuJWo#g)9AHljLbgdp+hvm*N>Yv4F5gw;mT)Qw{ILfd)~;z zn44ZdePrH|iNMa=P8ylaui{u>>Y=DHy29tpdjG!3l5~BfPZ@V7Fh;iEE5_Mfdw$+L zQfxW))|b{An=X#Anb|PxwP6AL9n`+(wRe}8d%E?(NMd{ejEVe(2Pa>5F!Jr&mtZ*= zeOs8}DI|Rg_tEcp?0-%o1>LxTX77@E!<$x5x@?#frex~*Cfy<)%6~dTdxp}FGf20- z)PeqNgNY=dppmCbGGXh7!aC50&B=tV%7mRc6xM-0>?6HW&E8r%qyRE_;Y z;;gqGf3lF?+m~z!$cM&Qy4d_|3XinsYdock9YOw`aTnf;Gw+4z(UrRsCqMc8tw%)? zfyecz+3Nl%p><7P z`9Hib+BOGDALV>{3Y_y{?4{VM2d2q1h^WDtDtQ~8Q_KYc)cetz8Hb>6-a|H8voJkc zGg_lHq0}FL<6PySGR5`6Mc^=_iVx!XkaO`>fV80HnfCFpnogb1*MTLUkO-H$Wld%n zKqDuqhTo9_vj~3c447$PtbeyT+TJP;nL0CrSq*=}oS;}dPxAcrjmYq~2T&KY$-@`Z zmrXhTN&rn%PDdj|hQCL6QPv2l+V?Q=r@G2}t=*|l|5l?3C(lgCVZF5AoQ%U#l;Mub zBB~|+n)vcwDua9$WSD;Hy{b_ZId$nxPQ4pQ(5tr-P=^tS{XyWD9sA0iBj5_GmIN95 zf${sSA+a8WRICqD$`@eRd%<7sbzX4mpR>H+D)gZ8t*0@kNMV>uoP>N6GxCX^^Kgi= zy$?T_>308?B#`8}#L1PU@NZ(xS(z2af*L#aeOiRlE*xlvi;I_-&`+eSnl8sdzP@Q}LFU zO~q?Kh@?KG{zPY2`rc z->aF?I3!FLV*sZ;KD8#K5sIGkP>I=emmDe1{_zLIFLG&)H*Nxb4`He23*ZEO1 zs@}7nCnw&MKUoRAmC7R_($Uz>1CaCS+>sICwO=`{EJ0wemF0jRLo0~CP-@^W5!m{Y ziQf)FarGhfX=!xPHhG(m@!tj8Bu9eG%AS<2|N+ewa|d%2e!9W1H#OjXQ~!P$&kNxR2>=CAqv$S4=1?1%W4HzdzUcV1=41wWruf~O zo1DrGNvT#^0u+3azw4Kd<0Y7>=Xg2b9?!8xus`iM)(AG`!wM6i=jiZVAqG0-0OmkRi>4MTB8S1K6}C-BIW<(%%BQEG z06qt~7JYvzfEpbCuz!Chtq*Q+?6(ozv#$dEoM(RnuxGy$kbh#oSx@?FiNM$UP2nvd zL{cA8Pmza-lczr*_VX58v=J?Ri2Zu<9 zRswr5Rs(u5>HwV>kG)`G%m5)V^dWUVrimC^@B2?;RN$H=hGJ#J_~I}z6eL@W+o64c z7?$RrS2{5c7+L=(e4=(6LI+F)KIQmzBk1fAfPCujQUP~+1AkN{(nlqr+9K1I-DLWq z>3XUPS){a4*2Xg=wQMZSYPvE*r#8)5n9H5o?XdX_VhFQQ$?|;d7moEoJgm=w9P)g# zr9itD_&isVs{kz>+O-6>9I$q+d^28ENO{d&P`;B1s+`RiSX#SN=L#d++dR`_&dOje z@tBh`m}Zapcm{K&#~hl$w0q1ODE>~h1~*^hG5=6jz{Ro1MJr;{Jx>;*7%jEY3|R0Q zjhlw=l8UUYi58zg)2wjXGt|vjj5==4cjEfY5=hv@u%(&&Hh1?j*5_%B$W|w=KMdeMow@y#FcMXrM=fye_dQwW>|9RS` zZ!Y{K)S$Zm#;cDo?og(<)6V& zRJvuO;k#DnJa?>;UI;I$uQeB^MYMFpYns;IzZ&$Ndrp3ZCi43KDf~9|8rTCk5j267l4(GtdIc})zvW2^l%BKs zbs`9}h}_B8EvqwLNCkxv_nY7LVJ`kqm;t0duoNin8HAKw6^9e;+a(+;=1IOqV!Fby z-d+^;W}~s6l5};ZBniJ4yrZ#s3YrKfB0CBknYL^)dQtF3f*bA4?|F8=oFR~yv7;b- z(hB2*Z7}n*7i>-{Ng*iISs5}Gd$5=VX)7i-Nz2hK4jP%=2J86T>xqX?A?QDD>?L&GXAYHHT2_971tr zerd2H#qmmsF}3q4Myz=0;N-&nC@)=(RDznJq7qccXpCCwjm$sPFp$JT;bP8bx{gI4 z`!`x~YbuOwaAj)K5-U^586Shq(GMq9EH9u;v4dWj*#<$M#|r^fY=qtbT;}q)Q=rRZ zrLH_?!Kdt*H%YQy8nH~SBZe@ie@I82Nb8Ez1wPEkbeN1GtWp?d`{sHd<|kmd`1Rc6 zrtHGO4zazd2l-@5*Qr#JI*}i9<)a>zWHMhb3SMQw^SN&}YaN6>EFPj0$$`k$SW3=v zW;PMMDD1n-(+tk^4EBT3mqp7m+>Gvknf-~;*RldBKapQtxg~hb5i~Oxe7r;Xky!Cl zWrx(iGO=n=NbU}W&mj$;56ys;J|ETsHHEzID} z{JB`plu2QJ1s6_r&K6!sO%x`}7G6kQnGWM^;e}K|8slx@h18o!VYaZ!Y#|ySo6c3P zKzSkcSt4Z0<%e^%oa)-RP}b^2aeiwgt&NyfI`yUBf5E`4FuB4xDVvC16m%9roqXvU zuvVBX(|93ugD^v;@j@z|q3>-lV;U9NY3N01yt6b-(U}JOYtt0XG+szmWD^`_8dI_f z>O}-^fuNq@#PG_1VYOh#r#VfzHvSqd{>?2KgQBH>4&spgx6*`@V5$+SAQj%E;l%J= z(sy|C!qny>nNgH4-i+!1XLvJO0{p34%#4-;YBdLeMJ7{yM|hE2ds6Z;E|IhOY$6C# zFHE`(BQ}Km2i%)lH&^>$rxA>svBM`({F_!7zu~<0pRc&PMeD)Jj>$3ty@<%KK1Ae2 zFb5&hH))B8Ow1;t7ZGV7ik`2;(Wlds>Q~Q!+T8!3&5gKPx2C^D;P>~i-nVECzwyFS z=t?L~+gvtI1r`04Ls~U%h^6}ByQSwL!gtKM@Rg%Z8l{bvi4{guhlx8Vx-veaeXJIm zr#oI1Q1bav1*r0?Y-$tlE^D>FA;?N)=xCozn!t9>=k~t zG2#z=^5I)b$0~3Im`r=Z8Vy{lWBJH5Dhnk?FuOfzXtY^Tt|L)3)_p@IHkjACUHIe@ z#tmcdA0BM)gVmVRX|5zHMpa(W62NbGLF<9roS=<>UQp>ZBj{*eR35%D#Q1vCtB~`_ zR5LTX8H)YOdQUeK$122E!3>kmXH_`wP<8(fCZVF;MrsF0*d_cQ7azomtfBTcMO%^% z(kAwj>fnXhUeXHSo1COofbuv5-lqmMttVT1@H#ItFCnGP%hJMaUgOKqOXyc$#*2%< z{%*}6octaSjbwR4Wdt+0?8mr*@Mg6wH1yNUf*`+?nMtEhLfz+ZIJW7>YIz(U?D&c2 zvyZTz{XKwuG>a@Qp)={&F9B2+3id@f!~P>mg~7-TV$vtT7LfM$EJO6=0oWe;GO0cD z;ct9UfayP`I$Q@$DRKjhdQLh4zvIz^z@8JGIp#T$R2fdz^CC5!a!^k6C2}xM^x>qe z4~a#7s7ypvuOG)F;suIxC7N!VV|>(rTV3VdzHtw+VCSed6}-00<43mGro zI>7IFbPCvur{lZ4c&h<3;;rFDb|R!0mPT`RU8gYV6};vRF-WS*i5K3a3MD;bwW+l2(|jYs zO1^oSRs%MBnRLRKmuU~6mq~;&GOgf63|u8f($<-1Z&&pYK1tJGLlP)8Z#vfQpGO8{ z$5Cx?V4V5sI1*hiO6>EB$n&w-L33~i^)0oh1Y1H3FW7Rx%e`Pdz<+b4q8Ct(hrkN~ zGlI4Aq9HgTHRy8#X}bFJ4lC5VQ^m%`?o=IIXu=;S_)$YYJtgYey`i#PwHa8BaRZN> z)WiQxWc=J5<1$j(d<|G}zLux=J1SUt{3lqW_}e%sJ%T!0dmI|2igz&p*Fd`4` zp;4b!IpEKHT62K?LbGN-{z>f`qRgbF!!eYWkV@+WrKK+G=6yb`n^5)=#B= zLhf87O)}X=Bgdy50=$-xLPvpZIGQcYfIjUUz)aftyeMrUMe$~(M8`O1bMYTslWDw9 z>tdgl4npv0=^%s^KCLna+PqH70liMs2O(IUp_34lmXJzo@{m-_^)db}P4awgp_58S z3HX$Bl)!a9r2>YnPlP!H3;_l}1E!A>aLb|zu11fLstI>N`7Svf7WCsK!*{9Sqhg1@ z)TVnCG(CMueIeD0uwk2GBt|&z5JhsqwYgux^~?mniQoqYywwNPGZV0lfcCOkU2w5> z$%imA!05}1S35OqfPhy+C*aS$8U}&A!Zlv%6|MsZGMT%c7pXx=QM^ZKNne{!MSsFX zeOe2BS}PfR^=YjJ{Dn`e57?)*2hgXb0{}88sz2`S36l$KhlnkHZRVd#nPrbRyjCOabSti7nwF}5c zawhS;ocP32=If`Z#i6#b<}S6bzm}y$Q)oFdDMKb}6J3F}QV6uI_d1K)QOTqcz1VA>WgSf z_`m-MX&8{55^c(N&GF<4Yb@WPBsZ%(Yp$&vc2lEHdS6`!!N^h`{9o2;0$;+*q}l|V z%ffa*koJw0yS^lfs3OGOGK|#!qA;Qh5sq_m)a~td3_y5Eb^eY>>G%>;2Orbw08BR$ zv|Yd6%Lh0Ka!4&5nvn#0?sYSRAXLiFLb$ZBdcRm%wMhcm<{u~TM=c{!giR1&<}a*? z`(4?Tj)am`TYi+kN$*nY=A~vHjCaWdArYUCwCL6K4W?Mz_y{$GU|c5wcqyv@e@%R$ z+km}!E(G-EsRII>lz+d+q?`moCTb@KV2J062Q$&--bC+Lrt&2q9s;{JS^M~D9@ajF zDQg@Da@B%Sqa91VRQ1~&2sNj&5P=I zB5eWRylO&#YltUw6xge#4$!N{h7{y#s#QJY^Fe%FQ$UowkN^koiThU?)%h2_i3KRiGW+kzdZ`4-+FDSL6Wwg2~CoC;uXnpJ?_ zH1`qMndY<}GtJkf6pTq9l+t?fpi#KZw|LV$-ShBY;vo>Z(-wb)dEi7a%fa9>jR@B= z0}|38elNY=n&cO7p81?VW4lmUvPj2KI_~46=XDRDns~Kw#?I(B^0k78_*BRcu>Jra zA*B9<)*%AkZI%Ffx2ZIp+oZjK$(Rx~>^DVYv!lT1c}rV5Oa86nTnDeIzVYTb1*aY7 zdSLH33ri2?H#-U7{N~kC6|E2uVbmbMxlQmAmWX8>XCIifE&%_SmXOY9rz@e_Qgb3` z)Vx|`bJq)hAC$!a54c@3SrFWA85?CkrANLr%sap+8Id|#{*o1UP{`^EurK~A5w0BV-l0*%jXC^N z`yo4Nsj@@73tFS{yP}*|()y>bZ4GmmRwOZI#vfP$nf&Vh?!dFJJZdw!)g4bQxSG@g z6E57$B~_uK=Q_0&VOEb-iQx@eQ*(FclDwm<0g26fzLj@0XHSTJd+*>Lr8cVe z@xgPFg&|!;+_d644M|Y1J~lW#zO+XnI3DG()riaWkPqrM(q!ESVeaX=BN89~RrrvO zhHqwXvo6N`(z3*vH{HTorI&MAxA{%01dSOM!cfgcn;wQ^(x&FF%3~k>{YzN9=@gN_ zJ!kPa;KKX0&XQo-Sif+|&F{0L+U^qPShe)#`g>Y;vviER0@o(aI$g=_&5iBP4PNtC zSZ3|{aiH#ip&XMxe5VM8@8F&6lV-RzGPbG1#$j5{J1037zMeumq1vZlY*H0`z2W)# z8oYVF#=hbC@;uFizXSPtvUT^s@#iG-bKOW6+T7AuKY}~hmTsBjpUpgDUAf8devO1) zj$I`Jm#swvrl%vNqbV~>;Zw}(Xw7SW0pw2WRD-Tr?uv6KwNpOc!tos1@Xyf%o#ZHO zzQnB-S-T6HUfL)_K#h@s!PJ{An0~V3*Yw8-nXfC#h!QILJ^RXZ9Ec7l(E6%@!HeCt zmZW{Cw~&FH7lhRD4GM9E3-MhS)rENWpV=Xnv5uY*1<64oOSk4!Ta+;sjwsi1g#x!) zj9FYxe_pTN$2xLcgQUB?LV>03J6xT|>cG1FL&G^*2Cp+mn)QP&X6ppG*`;mzsn<_M zEk`adByqho>PI=M|BpHgvm+chFHhzce}FX|8we~`^Uwv?6LV8IMI{mticGH0wTxEj zJcOmi?tF*X4xTc{F8&V|w=!1wPBcN5L=&7(W&~5${Sjxp)btSV$qU4P?-syl1a!2e zZozc21PL+MjO<(>7aGBH4;(bi76`%rM-jWN8}8gXd$gYaBNg>&g(;=^{&A7BrMf|^3e_83*vOW z(ZP#-as{vO))aqs6!T*Q4_m7Xdxc2`O$ZFKY z-6&{OP;65R{wjL0B^5NQyL8dSMhiA5Ds9lxs+DSDsRfDMq_SOBxVO+!FSgX$UT(#f zTC^cT2tN}QHK^D~Ria{DL`y`fh-kjg*UY^4M-qP6-p?Oj9%SF=eP-s&nKNh3ocZ~- z=uSXyo(nL;Ei{9B?EZh=rhfDtdWxG0MKY zt2t!`j>-sp%Vd+0a(qVMQwoIq=BcKq%@(b36W_8uk?d(kPZZ2N0;fCp?AOwwqoesNVQPeIKO*2-9J;=NRGgih6;RK8ApkHaG zgASE2ojDOLhR1Ipf~GH#s5w9aVYYtHa(_JB2cs8|$$N$-zA4$d`UwEO@6ejM`igR6 z2nFce9%J3)oBF<^JaJD6lQX9P`LrQ1!y2oMO1S7sqxrNzs&rwa{^0^{+0e5zn2j+4S5g_LUh!8Et3uO*KZ}Raa=NRI=o3; zZFKPo=FRM|!}SuDv8c6sjYodWXEo3E1zyeNb9J|#BHzqz#d8sU?jp2O@wZPi4Vm;# zn4N&RMt5m8b9rWKg$2EW>^$P*?&Y={EvkP}evu@FEo2`FhT8Y7zo=uo zwtkays`55B;$6^h-x;>sU|JxY&Sr(OVFzJ!N3M>h+1Gz)(nImA>>etRzf+X=va(ff zx+(i>cFBFCqlW7v(eq~6Unja^e|CuhV{aLW3kz+fvb6t`;uzWsB9^wDF&M;MV*Z9b zSajQ_KR_kpzQ6s-^GWigJgAIyNN$&`aYY7slc4%kZa$qJ8q}K6Q=>)mjE>8n8gxal zQI40Ktde%){0SV?(l~1!hj$k7gFNfIa=z2853=GBRLLut-64c^P$p~ysV{uaYjenU zV&XrTkFDY-Oz>5`qUtEZPt*lW?X^psUO#5HU_J0td3^nSxs(j~=__oKlb)!A7176s z(`DP%5T9q_NB16CGdQ|;U=3#w&-OjUwG6dK-%(%{Aa8RAu62LkAAhNyU7|I+YaIdC zoQ|wHrN1xXVgw5R;}N4XI5|ZH>!mI`2K4uR*91pe^9%-2W5f5cbQK4BOv~LN2{;tn z(_dRC^&L5OWHqfYN^TTLC|iP?Xj{Q%qqG;}uYIBo^kOKsrvI_5itEEswlmjf>>|}2 z(i#JzDhl+dT58uK4{EBY{*^tKpa7!>#9eoD>~hoH{7DTJ^7+OO@NN{+?7C+f0nc%* zS+nac&NKqL-a0kA?wi&zwEFnD|Fsu~53BhWN#H$ArPJJ>yD z7g5Ws4aR)G=_VIq9O9rkZGakai>Gm=>~3exv8Q%B>qU7C@lr}R*J_R^BZcPmQz`VK z6#sy$OA;ggsS%eA1o14*=NChTdu6u7H`CBQhT>gnv>P=qw%;oXm=gje`-#6|ptUg5;YMf`GJ zwmY|Os(D^KQ0o%K`k3qh)8&Kpx_rRTkVt49D1O>?`GD%`!HQJA@t-bTX1jb4T2+uf zH&rTajID1UBu9PAt~N}T5N*0>C!d7x=dXVTo3s2mNSoCo;@e5DtDwMc`GykMUa1Z5 z(Qr;~tM8~~=jxEK;Yo*w9jh&XrwL7qW>+*5esCzZc^E$fxJv;40CjNKflC4F%1DW! z6`cGvteQKEu~=o~>y+1p9!mjIQGa$lFOXY+2jm!81o(MKM-msGDn7b+C&nHg%2Tm* zL{9$z=cU29fF2)$lP6^Gq4KBrFrjf}4a?@`XkM0g^b+CmP>=|#B|_~#wIXbLI4we* zh;y9R0iFq4aDKcvZ|5BrJ9tpxhV!Ms`UhHv;T$*>(BoWi@;b?=It(Sd{TSQdklOw# zrcJEJC)*O3mvX&8R>$ESKRPgW7Fod0XT*;Vwh^O|hsV!cVEqFNwCc8GJLkb0Rp=W0dpUxxjflI8EDik}sJt1Vu`EpW_T>w%ow+oPk0 zFU4HeTo(7eJ#R}ve>W0kmm1SWjPEt7m9x69QB!}Bc+E!cw_VmgoYiZ+4A;v@^HRQX zq-IRYc-e6Z=f+Ehh&h{ng&E)4-sYk0c3rL*Bkg261TbVuW1GWN-X%C5o@^_D^$+xb zG#CK%)K74-(uiuA$u8B1O~{6CSRtC1v3h~j9u}S*59(&aWI+8EseUVYCq@+ykB8yF z`UiS93H8q?320ZpWq_`JyA-2R^w?Zy*0*;iAExdk6bS2L@~s7afd+u}5Abz~lYp!bmj;1EDuWP$C9VdTu7L*Qfu z^0e#EsdMDQOPR%~yU}1hhNkC@20N4Ikk&gx{pThwEZijTHb$&XRxxGUHi#d(U5sN-BBY-G*e)k6#5bta*$hrj?M&SD;3J#-O8|46vZ zfg-X8*wurs9dq@tR54sV2u`j?YFYK5%@|C`8jEn_v;8C0)BziP&5hm86Qtu;(%+NR ztA>rL27{e<4FvD%4$$T6Qzoss+Z*54dNR&bbo8Aw+^B5EgJx9L05@WG0V?lGya;fz zLw5idB0FMq0?IW2oC|1YRi6L7ak1us&=i#d=x2WK3~YSPAsE<+GO!Dsft@G=yRZ)fJ2X0avB=gQ$kJZSSEQUNiTREu z^O$esx=jVGzH|Atn(R$(G0?67lZfQT3b)i06@Uht-y1gG?U6=+$Tdv`u!L%kiHN9ismziKyqY^|C^(9QMBRnlK&n^i7mxCM5 z)7p+DS3q`!iIh`whQS#_K?Le(BoF-q9A&_+3l&-h9H|~SRJ`B#1TOjNsb*Qt5{~fk zwaAUnf?i{~u|ySDVh0MZcsG~(u7+ynM9T~;auoHm%Nfj`L|NJ>?O-+Q+UV#}|0`LK zkKDM06}!v2BR4*-94x84m(4=ijn58;x?M9HWG-YOhcc#cCYCii+M1c^MgPV4=-U!o z3KF+;>r#Mn)2kb!k|_AHmL_#URHS+f6G&G_;>$Wr#~Z6@%h!wPczMx>Iy%(xMq(4& zic8AULrs2@p|TYR)P`eHN9sE%N5rwnRtg{J>eC z?%zow4cxP5tdG8b;jGVGz{L_2irWS}6bS&f1IoVutOK;x=gQw1>r)Rx)<*#{C(lj5 z`V1#h^KcRydjv+$*w-2A`OcsmbT|QM$sDPL%b8_8lM$)6L{*nAZ!LP8Q_&DtJqEmG<0!%0iCJ z3{36m$T&G7vbPZ_qX$V7Gj|g8?!lGj7FhARj;AvcJ3Gi0(A1?yeG@o4gTND_c-EC> z7_DO2Swlfg8U_3fE18lA$KHNyp)LdLAMMg|KshrGvUPekPfw}&1#fhB>!XtXRcT!F zR_yb6wJ~m>d;iXJmLu7mCe2z(6{}ZA;uF{G!TPV+!-YvS@HJ+CnBLFG%_)7l7Q^vn zlCtj4{dH5DlzOEmm=jm!>L4yxZL_~1x~89MD1ToKd8xzZP{^eeDum$DXaB;bCrpm-%jM6kA$nABeyGRaK%^1Y#@Iu=Zb-aS-1E__%ui)KI+{_Y}9+e{ZeqWr9THVS4Uza)_Ml>$@t)^ z3m2Zm=8|)ltMN2x?5dhzZ2b|t6hgx$|0rKS1^Nl-XF%zT@Ul90M@M{c%U4a>GkT;A z<$N3(_P~#p&}#Ht%F|1*ENq&GIUXD`Ks2-_KWUQae90 zKKPyRu%lu3G-C@_b^hVy0(0ulu3JUovtP*HTtN$Ew@K+*Hr&vFr%|xEwprH!LS4;z zDqx)jLJ@n(yj;@lvNPjMb~ah9dxXvenVTqKN$ zH$Ud$%uU6abmwu5tG6ak7Di*^=G89FO{q9jT%5gMBM$R`In7VGIFVGG$u7q?Upl8#^q8pV9s? zR@7JDw26M4<`dUv;1c6jw}ZURAk9{e5$3F%e5(f_V127{wuU4ae=N76b;~>VBYzcq zBt>=dC{3zLX|p6ej>tEjD*COD5^HqvI-7F?d(lA%K!2 zSjDch-~d3CO1iZP-D;BRHV=8oYTZ|b@w#5+r)XQ?RnJ?$Dpj0q&f~B-$7mxn#7^Um zvGXu{V8}6`owH}yT*YRc1$P5l26iSZm7SEK`8>nG&g9dQOFkHL8j|%NVrY5!{mbaQ zqZc0KuOAG1XzS{~^r6B_4f0c}@K)L&8fES!3mYMJAWT<=PQY_v$HvSZ`teRAQjqwzsXcg-BS zT!-PDoxf|%ubYlQA_3p2W((PbJoc9r_u!)wL;J?cEFm6Zh z&anNvUT1i!)-UjaC`+anG(Hl0<7<(--d=zlBe9jUwDuQ!q|Q9%Pcx5%zTZ+FYnWml ziAh4n8-$DpV(qytx$XF&v2bT3&R;`IUtx@S!%2lTo^|n{9j|@y#0yElr<=loR>VTi zjviHcdJBpiZfp&=$e>4OwDkASnFq8ZcWyk~qA^9K?cSM;*t}Fs^uo>s+ZxtA`lMgi zf96Fd?K-wbD=r_#i?v5`TO#nS-Lr|vKC)M-jB6i>4QNv;|GXCeqb*U$F!kGF_;8pO zF#dXT!F6~ed8D~-4Yw)N(lFNvyaYhLS>^bn#l^?N1vgV)((NE7O=!cjZE?o8#IMZBQ#en=;}P+yK19sij8&DkM5H^`hIY2~w+a%G)_Ubf6Z($eWL?1g z!^G82wME|IekM5Nfy_KcO|HiU$?ju?(wwY9>3NT?>m>Y;=3dO|d=Q zGfl^QTM-7*mB^$XlA55<9tkrftyXJmf1c3?M611284?UwrMB9=CRN%Zij``{{y7ZC zEt53m4%3v|BC$5pl-akP$JATZzId3xuHJ!%WwdisjlDVUv#9etebs0C+M&MxVy;US zbD>vEZGNYyuGLbmNk(Ie@?ihpEJP%pN9pTdo~lOL!(RF8|4KeR8}IOiZn7Yzny4&cxZ^#PqAE%r8d{sw_2BWJ1T?}=PLnE-{~*QyAKqe%M&?mL49Am z!GC23Fd`@lcVt)#|D2D#cAHVR&w1^3zh=79)UBsUv)79~)w74GUoXB9IMy*xxcDV; z@^zZ9sg@RICj;{`(-_QbFAbah)ZA@cA8{>xs8twEBa;@P=Vc|xs8CE;cAw#|{{js5 zt^=QuYC`4&QOi6cYS~0bEK|(!)6}ptIzrv(ZJKU|Om(v~>jOBizFINot~xZSgoHD{*>pR$yX&u4U4W~z*fbk}j@E`1 za17y`xPhX3@NZVSYHestg$XiY`napQR}&@|#w3gMtXV5o@rFbT+CNqFJXNn+O+|;b z!!+1KAmGYWzj+9}9yGr3vLvmPmvzu2mHSdzw4}0-P)s)(pKoNeCO2jP^{6kHSQ42?gEsO2C+>_)l`g7G1t`-nPmMs3oeW*Wbo5m9 z8(k@=pMTDg3>K(CPX!>UfS9RJD+5!}e36A$+D!He0H;~ zNt&TcG$EB(Hrt8C>+(!|gwSB^c~SlP;XNWLhxmLej%Ur{?CRH)+jJc|b<{U#L-e8+hQQjdm@(YXv#MFVT;9!LtiOAv@>7K-MT|L8R)yq}< zfxDM~rODLXEnzzWWVDbzxb)9?$ZH=5VM^`8MoBp)eY%xB{U5LFDMSA6G=%Yo)DR}8 z8bUue+_xTqT!lR!;2xTS$U(?3ktf?KwKB3{jiMvx@IFsQ!tCDxv@JeiIsoGkY5vGg zEY&-cK4Ep-crEFW*{KjJt+3`9>xUbIK9$^3`m|q<>-v;ToX2JQ8(USG{mtynqNk>E z3Yj?j%Q(bjqUZ;*E!zmUVzWx_#h>#~rr5F?fPc=7Hq7%V(09vKmfo1zKQ9WZ)khRI zvpBzDh%LeVk*3V1Hl$zbPE-1|#?kNs=6N23rVn1l0C(~zS9|kvA9X)f%3yhR_<;`Rkl$xIXu;8THzd=)dP~5Ruk~2xabM z%DuIr66k)5oCTOP$hkm_*a$8IGAox2At1YWVUUqnYx2$Wm={l&*QQ}aZ|)+s0C#05dK zvd~v^ zi|kkZe+s!Lw~wxFW-XIF#$?3p%z-USB(|w(&>xJx8TUB(0ZV_j>1G&2(-ox0xwU8R zcsP$#nXUNkHty7ia zISY1h6rC|E_s*%3PLe%VM!*O3&T(lEIj)yep!bjr8s-ih%jbbB)Mk0e(M_(lAcv$c z15~0z)~&P`TGUV_`+Xqo|CEHyh;5;VXtHNUUlO|dcG=?*ySt&Tt$_aQjcJFv(|BXCTi)Kh!6VqOab3U5>~Y)R5Ydv(jpDj%>5N(EIYD+%IXD|> z>(sP*CygEs-lvd;qhbZ(=o^{zAervM5~d4Vof|WNhC*vuaY{*FeMBOwe|E~!X`>jM z?p0Rb^3BjNH8#PmTF-@czt4{pJ8lo+98)V)Pi9*8JYB z*tOb0%E5=48vZf<{M19u>7U=vQ1iXhQUMxjmVB<~Q1b;k+de0bo`#i7u^ z?hRM`KlL_>yq=P$b*p+$2Pqu{eBWkClJs&jEU`X)fS*Dy!v|<{HPXw`Kh)`MtGad; z!}s?UmIY^0GFnMmrF$;{-jY${x&HcDJxWa3W*gzCkdsXg;~d-4BBo1>0OzIRl-W4h zJ;r$~*-KK9c*6GUZdSu6G>IXo8nW3+B+sVVPa)>Ta1m5}VN&iPbKR#Ktd<#3~j= z;^D<{_B1o~A6_J&=j@#Z=-LwJbmqS}oT3ijMK{%%S_HNcwU+_?wh^F zymkUV1wY0?(7JFyKNAd8cnUf9^e2uoI2&E;X;@^U7lm84&$Ub)V!nn)iK?%%Yu=>G>ui zVkHO>jYb@i6vz81T`E~uiiFqOT=G=0qb`TFxHNe(@wk(pplDK`oN;1An(Mi@3*Rjp|Kd6s5AV0>+kmCQ6cgPvu z8NeMX?YAzP^h{}KXPo0Vjn|G&Nz`_AxKO+j&G6CUgpv+6u?e<$ zrZz(L(1zCVZmS8q(S+5AQVv0Qw<;~dES3RGMo2zg;MQ=LP1V(Z<`4FlLgO~g&+L|W z8Sd&~R6He6%hFt1m(vsK6^xmyG3&aN5kk1w(HUJSsdXW>npkuOOglO5HgXKo52pK~ zBx;Z9kC!6SYy$y_k7pzwK)I9!FbitT!d59**hoHDrt~N3hG9+XQ*kDJmC`9{r581a zQ1-hT(m}$Ildmk-3t3`jw zw&;vn^3N%>INMTsS4XOWrKZ-iG-J7^8EW_YNo^Z_??A7n+mW2~L8ifIMOJ6v#gcrb z4+qwoUOEDCqa!^vVk{cbQ*-?F|1_Rj&sO*(*o<}pd$lxgw&=$y8j*jav1Ktd)wC(^ z5JCfOEESd{47KYK7HAE3s=bts@AS|4qE|U=aaAAu5)Cg^IWHO6bjlECPmoo~Q)*W= z@>)Ywr;Y{{7&JU2xDXH=KN=bYxRei z>trfo8-n&wO8l_?I(xrQLLS|H%0tEdxRsEBm`)SvoX1qwTL9Yubv{)Giva5Y?Y-0P zOCj2-t8<77)ES@KPw>tQ)tLnw?&B?Xr-9t5wtBs5nX>tA7votlIxs0-Qb+r*QMAJq zE#aa)=n-MB6YrS1MX?W8at%tk_EV{a>aoojVm>0GOK zGI=rZI?L5kK%Gk@@+3fU)uj6zIEu<83}AHN@)5F6omEtJLbg-#l`4?=41sP?P>8z& zX)UuLz3)Iei-K{wo{u}$J|hxmsW>(r>kwS~Vv548j$E3F5h{r}s1XGcd zyh7~6$8qntjzW&4q)XvQ{{WX6pzA_6MyBzC;OIn2r+X?O0_Rd02o%13jhT7C02R$H zNxDcaCa{RR0}WzcNf%G3tCIMiV=f~wxA|N|Qyo;swK3~VabwF~no0z4R|q#;Ft|wu zH|`29N2p&HFv$Anm4HhQq95kfE_1Y*Jiz?aon*|^Vwu&dsw zfUbIn0NU#P);CP`mVi+8DnOOEjY@3Nnce0$T=jkvj6&``#$3qdmC;^qq9gS=obpxc zQpt4vro=4{^1(aC0)St3=m>ECKbnSL3FyqFh}ecNJDbOw&Qf0~Zd7U+JmoCp_m2Ij z`!SU#-LgXcGj6m}oR`IPbZ!4g^rM2>zy6tfue?TRqK??$4y5w^*UXq5O8cjxKH8q< znHqG~O_%IV5<4oct{hNtjXEV4T$Cjt2J+(Zi3s1^NY!?Hp{?Nf3a1e())_*vWgF{6 zFt%``jvBC95#5_tyE>!drRHSJ<&q}eE}Lfwc}m-dM!%fnuMaASG)Y$co#?v&$BGfq zL%9;q>BMkArxTsTusZRz>x@op10kJIfNH*-nzz?344~eGxeSb+KMrJ-n2-KpAf*#6 z0qFwwNx_hA?VhCU+dw+5+5s;#}ug|QCsG20WB*}OxmY=)>K|y!cv~N zV_&o68*BuF2nLzUSjzbThc0CqTitO$}WwCKE(46l|%$FG6Mrwh<2&muspJjY#Ql;;5uQXU0JMShBk zG<}vx%|o5?6oFC5*rQFC9g458eYS0(<_lRy(oUI{l+&5q03C000nJ@{(kx)7 zLhXP~g_JI>LiN0d9R1BCP2bC-D+lfFfaH=9QQ?8jzyk3fjh=|Iof}`+1#<@PS_^DdToJtEoh? zZo*AKY(s?h6rl3zP95?WD4Gg121HMf=I;O9*S!mJ^{?xyBg13AJFl=8|4%1k{F)ql z@BcJjC@-Has8M=*@4o>th6)sErHI7dvh4msq+#^s1-kd&de7(k_FlN9z@IoCWwS!4 zCy5KRf~XS>1Tn=3LT|Dta(9)3qVpkFo5KeWW(s77Bg03d5XxL4TJg*VvZQAzadlEc z5hydRK+#q7^4M#Z?$*UlC_9W$EbH-s7s5K*XiL}Jd9~$zA&KG(4R48yRig_)MA!C1 zNb^M33dw-TUxA+It}K<>=68$o^CT4={mWxb58t0Qrk1yucwU19yiJk-odmwrcBEZ^ z7WWpl zwwnm9&^27am4OGkj#Kew5#}{@z*;gAx(zsCOWh9WHFZE!YI9|KJ#XUUc&}h?4D=;9 z_B;XE-q1R87r(jF1TP=Y*bZe-3%!WMJQc|~4@y$MP8tC;!KIp#nMyB8W#q;4h9mm4 z30$nM6O5s_9mO3~Oj9AdKQT=s%!#QEaGDcSBd`-w3!oE|2&KhT!<)G6qPo0JRqp}b zGs~PUrb-6NDKY6qNp9{T*HpZ>-?{Q&QIo~1+FkTL}hAAr9=zDkO9+6S@wx(((DKhUBsb(-{-UpcQMkQjk z^KVSoy*@VfdO7Z%#ufVFou4k5DLnImI97{vh-LzRRj&avD=~q;sx7Dnw;t-3VP3SA zOVo6&rT5h??m>K*eRA9QBZsp;xA}*;IsUuv5u;oT99ba6rqlK=hSHMdVyoJ5&$*@(}W?U`7jOL z!e;QY{rk*oz}w(b!<&vAsND?(YuK}wd&+gOma&U2w8Cj z$OD^^!J6LhJ3PfI-^+P3nczLmsxUtUqvx@itZu}ZP$7JncUMTGJv-(LfSOn`lv;UL z4YkWv51#;>xQn3ara}jlfKF0tJ4wpqQjqQLym7C_gb#_h^@fmt=mrICAl}DdKjx*X zRp=*$esWhB$BZBLCh42PFtUqfailohB<&%TF-vX zNGlJ7Mp6pU#|6IXNr#S4@3$ZWuVVFnUHTpA5uf)=>3xtK4MriG^D-)0YKJ^V7k`y8 zF6DZLa$UO-NnE>!@_ry4J_lf@fN$f6PS`4FLV#cCeNmBs#{tIX3)0+jFo3i=iTVal z^1eZJ?`aOjP^VR(@d)AF3q6% zIEL=}ZUH9)srE9qI-xok-1L`MOnu}N%k(=tZGDj7 z>;0|E_|f(L28}c*u8QOpH+bFJxjJAT94E78F4v8%Y}0iNu}50WV}7G~B$nzCZxFJT zY+y3HO%8e7_x#06j_V)Z#wWO*28x9@vL+ZRWu|x;O~ov(Y;?=PzI7*%Ag@86RpBst z-1iF-#K&)pJ$J@6+gO(^y@piZ@KSa5nd&9J*K|R9L3B@EO^EdlGo8<*ubGSI^pCF9 z(Lbv=f&w#K8CzCra-VY6XK@Yzozx*y<*A6-JlZ5R@3KumHzZ}>4T}#Yv7kz`a3S`qx2u< zs`M4yb#5hqv8C|Z+LAn)AXZ4+Dq?B{CNWFjg7V@^#4i2?mJ~P7^dhwu*~P=pA2O-; zBNXkbZ7gj!3$E0cBGL@< zU2T~?xT$(9n3Y|LRq0Ax5PNdi+E_93f<5yx>ozPu7m~VsmG3F1LkGKpo{&}nYk3Jq{&AZ|8 znpxt@U8lw3J@;%~OSeGbS+S&T#IcR1BU8KarV~^r%eG6YsPNMLtu6llzVwumdOIV$ zTRLE04l0F%^q8&Tq%?v~QjfUrkE7`620p}ZDDlmYjge|Io#Ztr7Rt~XW~ZN8$O=vS z&iOO2RD_;`^=e<~7j#vB#(Fb$UKbm?3*<~R)}-6A;%MuuJv>@q#u@2Y+Mbei*365T zXCi9)j~0Ly1bqIVX=|40E%VIRsvU=}{jV@R#|rfvx{U)CmbF6tJ|?u3`ceZS-lIJYGhZlt&8FT5q)#0BP4JSFj zmvp@mofy)K<;}1AMP8vpr+P5T?Ls6^*PC~kh2`I2c1b8*a&^*X>ZDC|@>_MjnZ3Eb zaM!CptEVCk+MECWD}D55!#>)Z>diG7)I8qx=8N{G0@S%}+C#r_P14<-2fOOWt%g6Ll;E|?W6@B%(6(6c^ zJoFBH2J!dP>-ICG4!r|E*OJ2b>*Wjl1<5NUL13?g1)MBw^T zHr+(EXR7vlqNVe>>!RV8)OuRO9VDT%?U-3EWvakH*zPm;@%W&GX-pOC=s*X1LAIle zZtov2Fu~_nyj1fm(tEum&Fb-*N68qnIXfB*^CrWal_3}Ky<{B_Mj-xsekV=xd~_Wo zvv7%M~}nh0l;!WlCZSN8e;o6fRk14-Ocd8gt`G zDLZLruYzl=o>}nUT+~OwKa*X)*WaUjJ%>!%A$ ztB;b(`#)$&uMYMh$1Nt?mndmxs-)A6tNibk^qBpZ^yk!7&yv2yU>KJstE7HPYIU@? z;jB*WZWB6o@s@bTE0rq;X?P3IA=T4e0Sd?qDp8o^8RV$%%YOdch@B;?|E zc{1%q##b}n6+e9R$F%v|S^f?9o?-fBtyHLhL1#@)Zez=!Z{e@~3t!>r*w4By4 zl(uWtdu!vz8|ruMRYAUgoNk!Wha}@aGTg@wGb`fzk9JrjW@5T%)Su?Wm=GHxS;to9 z%SOf?$uW=ldsN-AL>CY4TufRQ%SLf0RJ0`-1E&~~*y^UXOaF0Pa|=JKx~K_T!FRvi z-Mzf+`#X=bq3aZ?C^q!x?~*d!pbVMe%-Mg$n>evXM6slZfa1r_+}tEC>?F-@sY-(; zX*5j%vI_7cgPa63Sh8#g0NFX==Fw`L19+#c3oWZXT3TaYo6aCXbMc?-%+0bc0^$iH z0T-@`NHffjP|=yJRy=GFL`jVjS@Gi>Ewsb_*ve_%qqtwI4fAa(f0nW)pLo zCpda%S$b9!mfpiZNz?0s9)G>)ot8n*xUjc6dN1!Z#WI!HJK0X-+&A({J|VNZf5o=AZbS3j=l`t`eD|HA$=-iY z6lWp|>4Y2E+1|Kug=@u6Wx>@yxGFlUI z|00bGJ0$4uU?pkuv!G`U!Cat=5oBva9Z;Qt>Vafb$wEje^`$7adu=jJ?Jn0e*1Vkx zP`vlv;nWkDas`yhwW)X**Q!~2PlXC>?;SYwjQJeu{0U`1%!KD33Ac_ zqJK_b^v7h;kNXyn?4tyqPZP?{;g>tIWc1ATK4cV;yj#s=`w|$lo}l&x+hUm>-H5D5 z#XJn{_%#fUJiDObwAv450W{=;Aoer_Ej?>aMJp$H3?i^3 zvy4tzmB_ThU2xFz7*Ne0{*?@*xgNh6-Nu|gGr*RlhpsP~c@ASr4m0f|rMTZr_95&` z4leAtZ`~LBsN;)~-KP|H8P)x-NMk?Zz6%cipNe}(pBWsYxZnHx-tJY@KzDLG#ik=S zH@T}r4{|ooo*Opbg=(0h<{zJL9}VgswMyWYB)z%yzWdKF`qY1p;MeOv`~8dkr^Y9T z*njTdtlMwe<-NRUz3<=YD}5V|p^4J>dOc?6)u!+5yT^k-!oovqMKK{{$ za%k<=OW^jlmyX@6Ig#Dv~3p?(+{|kN8@u|q} zQ;Pd!s{8*?+}FXu|5I^)0>8a8I7D%8+UoU?t&qv=Ay1k9sd`AJCgy&vyxMKqn zq4?k{j@eQ`q?h>Yn>;`KF)J*Uv83kVIf;-f%r(k$KP3=V~|E zE#so14aCZ_Y0=5~h2=5#Vb0gs>qs{1JYM+XnFxf~$EnB}9E2O*@!uoAH$!XlxaL~^8&JC3u1@f25eraw|OSwur<-WKL0%xhU9EZlI@N$J;+&5G z2sdoIbDU9$VDmhssa_i&w|>w0^GwRxF9hSE4f*HWM75_z;_PzNNgpZ~tX$(#26Z zOpwKzS6fHy=e{tDaCMl5LWZ4jSpnKHzV?!Yrw#;hRq9UIWOvBssO2&=VZpT3bQpiNHNK9+20_ePY}nC)a1yK=4)0D3hqJ~+?M`OK~U%eKY_6_s|) z3=%Gt*I^CoNtVjKF)0%sn#D`VVaw3SG#IAz>Ttl1?BU9Lef_4 z1#G~K(h76=K)hHy!tU8Od+*Dr8(XdIfW@x1^Mg4#U$W=`puSQ`ZMP`0romAhKq#5I z7FvS-;Y$b_e>AtFT z{Y3lQF5P`LoodUbTjJ8`nM!xO(ov|K<{MqQ>%oZI`(E7Jz1`F9M$$Mjv;YorV%P(G z6X_^$4ih>~3`-T+ieVX`CkCNKxJFrKiDB24o?@s2lP!j)!DNYH0W&-jgPy74M3k;y zrWk%^)1}3*(52Hel`f!kSz@>rjJW+-2mNl}y0I7vPAE$OKjVaw1a`X71?YsbNRh2j z9su-&BDAu(P7GuT<6C@-UbzF-(hCG3c2p&Y4P=C5Ag}y0jRkyL5V{((R_O*EXC$v*Ay! zhdq%eC|J7Q-|!uM@S(nBh04f3j*Ybdf>8{$wuZm?@3|A>tD`r@bvbjrab1?!zB_Nd zab28`Q@t6-wP5pNPS$B|r=j}6;}Vtq;)M(Iw-j)E<=N6FW(HV!W9JyBQYH-8ynu*_ z@%`C#(2z?WTEt@ml<%5wZqBVFINNtyO>WK|{cb-Z`Z1rWdL_>s0U3CK7d&vB4GwU@ z`JG3xU!%0mKU;Ua$Cj8*(fK}+>h;m-^=Ibz8_uOf^i3)v{1v|O%?FPQIe#R`RADGS z+w@yOdcEKZ$s@=ugE={?BJHX&jNJD|MJ8m!Pk@1eJC9N>0?|TQ8L6R-20pDRZ^_t#M29tW= z;iUHecrZRi58`OH(KB-(R8VZqu(ynpTFzQ34y3dvcX_A?|D;GWu0`-2J9Bdxh*;ic z;Y-)g92lwIj3cgfjPB_A+{F0q(lxa^Z10{29ktSFD6ea!b%5IEFLWdDPi-r00X&jO zV5b7AmBxMNoN64m8W1|csDR|3o~MzbQ#sA|sgZi<(}hMuOzRZisgR}5^=QLY}u!;kjTV64{gX_2$Y z)Ha&W0!dLK(05X+1pJfM>arLjmnm|yu9Ph&*28R&>j6+al=$Dr+W<*EBRuF#36B_>oSpmN5cPEO%xP7||3iQ$+X z4v76WWtalo@6X0doeC(`B(lgkW=jAKv#|04EZP3|D3XY|al)u-%k5d=Z7?hR^r!cB z@3>w0=EI50Hvp(jhDLV4$J%@=0bRag+vS@FX!G5fytYTaJCiSwPdeY7$(u~RJCk|j zi!Nl>Ww3Oezu_O+Dgi&q@hN_~0Ds{48G0q2yX9v%po&D~PDQqrwhhp$G@(_>4dMa< zUhCSL40+{$N|k0iJm`oY#iQ%;-}5RSOnS~j=f&KV1(O%9JNM=<qkV&D%NLCR1}nGo`T7W z8ckMAFDbSY6`R;)lRZ&^6QB$e-|LRqku;M&#?-IR#jh~^U)LFyU2}87oir^wI6qO- zN++80^`q{~7@WuQn#vQQle$;wd|;{Hf0_THSiu^38}jnxOvL@c(#M1T%O1ZdR=$RX z)z|Z4XCCWDDuPS1-lxW0hh9g)PP-SKg=hpXS!V{gBiC)541sqw$e-|E*i zT0b^pw2lj6ChOK9de?=esk-@s(mgZ76x&V)r1D7Inj5Q89=YEqkN2U^d?5K`=CQ=g z2$b$|d010*^uLt4zlbB{j2gieV#jX5*nJh?C(KY)yUy1~sv6fx7nvS6iX!X-fs| zTBXbA47rcXrjzWfJF(EE(=(NBw9;i6t~eNRyS6Q3^tzZdP7F(x+=(Fx>_)F$fX5RF z8@EW2tr#8v^u!>v2;ZwLv&2xWEVCwfen*vLi($7aDN_uyuCZd!GgX}LDqWTsR@iiD zG0b-9^h~AuqS9rFp&pF5UD3LKLMtET zmo1fk;vh>ZbE%SSsk{OvWkaMK)2_2p(KA)LDy7Sk%I|Et^ayvlOQ&Zl-4LbAlFE0% zh}++7$WV@1q;X=H3ux{#L=D=2opQ7TIx*BKvK2!;peF{QMR$5%PA>T3{vmzg1J?0289H*6le3#X5It%z~ zmeaX_&T|zx$7u-Aa0(v}z>ihhiH^h12$SJ4Ka3c~@g;CHC}r>@9WLM4DU-<`=bd*r(_`Frw7=eslcWs~pD5*w^6YA!5NNw8m0LUD%PzP4n{#sR zv$+KTU2ZLkY;#)&SiqY`VM2@MAE4bdK)K!Tay!%IHreI2_`9jxmI8K?8$2umtRo=q z>+l=L>j4nvvL-ztJYIy46yZl5;pY&WLXLuPD1P3cCI5Yr8Du<0q~HokI+(s*X)096 zW)@GUU~>UqvzgZc)+s)he$n>p6&b>>k%67gX>nOj0s|FqOf$Cn?a1mkm@%^`Ml-&B zELJyY)huN+Ho_jpEZbOcN=ug@bAMpV-tKVe?wTWl(RI1oCooS%QU3XuE6PeS)uSkr zZnZ_3!qc-RfPc3|QD~h~*`iEVWU@J4MZqD?Xw+Bx=$f2C6tt<7m*#d73v(}p(DT`5L=Y+| zhnPvxLhBnF+c`G&3fMAXjRKmdy;&tvP4r0hxRNsJx{|wa0(t8@myKb5RL7F_6>S|! zp3uS$)#s0*!OasaZEE6=8H=5k{;{ zg%9p4yk>nmhkfv6_*;o;Qg2#ppn{m5_cxR?^8v2h;>rz9$4$y(AD7483$`8(t9Da^ zrW&gBQyKT&`|*PuieJEQ^sRo-8Ueaowa9#gUAthHSpu%hG%OI=S)@5AO3(x%@NU0`uXdJkwHau3*+@m z5;bEai~8Mlfd_m?GDpmn6YIdM(k|~5jcvT~!OjWmxbSMiX}T=x zBSCuw?Gp4ZKUJUTRnUYky?!8wYaF;Y%0J-+=<9N=r+B^yU6`OwpB8b$rS6@Yuvb5n zx9SrCNdVovHM;c|E4eMG>KT~eqo5P`t2%4P`LGH7_w}<)v{e48=arDPv8v5PMq4H< z+`Y(Dfh05Gf!!_kWg{`3DBXMK(Uf@L+zDo_XVY!Rs$Rb+)L96Dm6}br4vml3WxTQR zEXy&~b5XZcJ~m=4kFr?JbNi^zg7u3oIie7P;j6 zAa$3R0(Ape|Hm+KCB$kj#x4qTR};nxdspSG&j-n05l12a(?|$}XQ>Z$6WoB4c>`Mq zSO@6c)y}Ij5?YDxg>2L5gg2MDjEY@Gm8p!r=rX#%Wi&+tBAd}v!0UMjc()!8p?{HG3`F>03Ks(!AGdZ7#xxQSt=$KS5Ly(B zFZo#ku6tww6MsK85QQA7zR7Yu91z#j)bteKpW6;>Dxek&h^&m%fd%8bExUv_aXM6G z$WubE_ZlO)R=-34bn|`OT-1amH!<%4pNbh#+Cg9{s^7V^XUxf&F++;EOJX)20oR@_ zK=V_b))XhPsgIgI$?Jbm<$OCGFI8qn7}-dY@WMU*5D1$4(xv>RVTO>)QF1#+hk0gu z)Fs-ZnfG+O;K}&7=Oo0k#1HzZ`4Icg$8F3qPN-J!;ovdx0e=gYK2dwjnE2$i`+~!s z4@TGZW9208_Tw)q9k+I0ZEHC8d~n!C5B>eW$gCE;LR(+$|M9WZ>6rM$wfn+}Z}tn9 zzV5Hj1rsXWR69O|9l$#H@A(y6hiLuftUQOA;2j<;ZK*kR{+TrekUd2wqa`Br8=7zZ9>DXR@B22BPrOW4V`** zPY~ZPx-6deN_mW<&*9SNYkZ+t`;Mn1CgfF?yIm(~oT1kE&iJ24BOBYQ1ArQ&(R_0N z>j1M1bsk8q=qXV5RA2Ro?9a~RXZ~!>T2cpMEvYU*ZJK~oC!iq}&nv+cY~$4o1N5Y^ z4unY4X+&*qbY|_R%dA;@@?je3%{dsVv{_?+?dN6IRv5G9hLMZ`nEc3+&GU@e zih9qOwQ0G)^4bo#mNz4fV^YQ}0O*XF$XjD(#-Zz!o5~NPDH~NT%rqoXQT;wP>h_d1 z6TSs}DrQ8O%S_B}V$RHp`LoQJA;l~K)7zRURnO?8@x#sbCFHpM`%3KS|y$$1XtitwIkakK1gH!vWQOfbA5c zbTC@TD>h#|*#<`0Dnw)-gS?$({XVIMDHZ0jGy}sN1K(IG23drG_HxVMTg`eV@4sdr zC(sy=5u#B@nO@r5OGGd2?xj*M9qxtO8R5{qOwvozy-d+dmwTD2mp$%fnqD-U6QPyV ziAmn`-TN%wDRdVPNm{r2myJzalN&S(m&<=Z0gZmK=Do@=elkVF320c&P>O`RT|&Tp zfch6%ImG?b8gCgrvhZ4H^@D>A)GTL5<4RjyD^_X9ETf=`2%(1Q2tPy z8%Oe2)_QS7@;H%Ac9m`1Ay6@F#wGGF@?wv`!)4#r{3xi zoG_;t4Oo^|Q6Y~6spmz1*xPLm76hZCN^<-m%W^Qr#`%<}B>fcM4a;eKMu9Mowp`zu zw67cS4pr^L-smA{vVYD!RA$}ulCraEDaF4+5Cq&?h$NJQGwqLix?@E5GX?srf4vJLrG(xLI>m%u`Nb{)oQz#GD|L~ zLNiQdWrQqJ$ejvF>5NvymB4Dp@g~EXA!)@?xRTlM4=5}QotsTL&IQ=X&qLPZ)Bor^ zW1*bxyhZaWN8Lwe*46?nm{XudfIp+W(yI<&r$C*6PJ!kEX4lp{FsdzusJ3RH5y8Y) zx^*Q@Oefl^f(-Ddf#zi)X6JEPRYw~Xlw!zO{ZTTdtdlR3`>N=lCm9%o8<&k z2KXD7?KEI#+Uo$FX&(;gWotYA5nz<9LPUOpWI#c4nr)}QGZ_-*GBA#T5srbI7ONsx zlmu86v3*f&m+kZ)8gDy&g`_(DV)tS?{UPqfboxWxi|O=-yBE{xk904l(=T%`rqhqO z7t`rinwR>LI+#?aU*+D_>2E)g@5_4)-)sSY8|?YMEC2RlfxliZwuCr^6i$d!0hc=T zV&H2q0>oGfsB=qzlK``YI2nwzOCeI1yQrI{FB7YIsxwO6Mp(;AlzB?)e*&`UY(-n@ zqIC$Px@y+$CXu>97*ijwxH!v1ijcQ|$CG6UJkSgW)qOER(<04sbyk(lzyE04g_ca% zhpn)Cu|xi`ok5(S!(uyEzj;_g_YeH5TJG>JOZtp*sP2w5*j_v0zidzP73GGdIdWCU zH^$^7cm7sPtPL*jgsWg9U1830@kM8-Oz1??x+ztND0ZrDCePz|fKfC|v zLv9}^Ihdf2aG|`5=6-lgA#O5I+PQIXw8va&;@3b}fqL^S}q1eA;ow=#iRRWrfl20xPM!dCridWkE2MQ zdUp2L9=Q4ncvkiuRJ+SwF8Qf8pLW1Hz_{=3_s-Q3yXQeDF9nEV9+Gdu%;hxihDl+5 zL>}3>FCvaY7C%7lg_m@^SitRJb`#%Y@-Fb0n3&m+cj8&x|Fx^tH|n+}#ZcrN>7z3( zq>rQ(nC~~OlK8BKy~_1ixL*Z$o;!)HLg)m6D?|(6nIb}K0;~gk%zSQ95?cmFc1R(z zLl=l=(>C(|qEhTkuAo-z3hWmh=J!SkcP3x^jjgW*sG-Yi5n!cbp#%65l8|pFp!^KL zxqxcLroQI!A{h!PxwI%RDOdB?OkP`)7YHLQXqKue&Y33nt;xyczWoSmi``>)S=P?mqwV0)?I46d>iSm5#zzmob4jt*QFE+oy}X5bYc6~E-D0AQ{wm*PWTw>MII1t$qOR}icJS^l}=*L=*F$^4@7 z7xwU`s3WNCfDr^_f7VhEV6tt z;?s~V)S1ibzryHjwswS=gUUyg+jSZuHu{7aONw{+j9_AC&6>)KS$myE>vOtM2lzGQ zX4Dh-W~&=5fH<(y4b4m&-SB<3%e1i?5Yi6?sO}e0=S|EEZa2k^`M@x++#szIBJwH)_b*wCaxaeUxcKt-x|ndL1u zAOBg?FJ|X!tiAu?kp*V0i?73!nI&6RO;{)6aPygE)N}cEmX=tn7#cB4PAuE4uVZBl z97}6-liMd%^&=bKh!Zy#TWWl=`AoaB z;GcCj^go`MGfvuE9AEh7*+bcPJh5by)c+aU@TJ<%y85+#`qXZjJ^3>>apexZM#>Y7 zB@(1>q!A}pI#NCG8t9CzUT+S}C-UmJ4~f0Dv-@eUZIdRe;`KiXoJS*D@{<70NX&N* z@wNPS1(^l;;%l|<6fnArGdilF^Ngm#+!{{F_znZw9 zGqE0o>RZM|zJY|$VptI>@)ZfzEc71U3Xd`&f%^91pdsSxml5@oVi7FY8d9J@gbH_q z;ibO4(M8{35L#=R;9FIsc3$M$3NG#&OgZ}de)#N*=4S74Mk@wv)_SN}FC0$HfoCZL zbKT^CT;;KOt_?;}l-qG8nCr?DBaY!NNtv&_kFDNJq{CHSA000WqqstH)W3KX{=YMWXfEbu29L;&pDT2F#!vOv!BFe zideyutS$Tc4s2PdWU`!`Ny(Rgi3y`Q0*jlF!nMJ=#l3N#7jI(w4ct38FjvZ-^mHg==mOswFsbrKkFRjnrejV>k5{Qe$YS%=6!z2y+aKBNZO!xci zsn3>0-)3HKb0qd;D1J;R_U!7nP6;Loj)}gSJ8VD$Q5lW3a#Cx{Y!m2Sm1 zXwBVzp_b*;H~q6m(O0U(!4=dZGlKl&n2DbKmA>e$AL8ZEX&K{Fb3q7#XV zHBpMRp^C2_stF>s8ceW^!%(bf(Na%pJ?GHYR@zb<5JG?i;ya?$_^MG*2jc@DXh0tK z``df}|Cxkfz4u%`npyw-SZnRI*IsMC_baO9vf15J`Dv0QR+-hIy!M^4YTQw7>GQD5-TQE2G|Fpv zI|tu-V?V*SFzbTg*YLAK%BRs%TC++QUM_Al8mMlsUpc?-K?(XBR@>XnBR19VmL(oO z{;BP!(O_~ip48Tu4D|pro@7bbo)~HgCvMms<`~nhKS?3nRetprOZYtzj(yyuHeh5L zek_%0LX&`fsYa`xn2?y4)l2nksIvX257o00HN*GppJ3R`sfJhe(=3QNx$K^T^v_fAgzRWi`p`P%gE2O{;YV^S>k#gY2= zSd@7(KInI{!m5SXT8wpiM}1fNaUJNAZ>FtXy@{0}3k^SSkAwcI}j(q5N_%k@y6GdFQx0SVi|u{H}S`ockHWsxQ*%_ zp0MXOstth{fG+5c2kL?B+x8}+hR-CLM+ZfVXWF1#$4@+P1rdBS@IgOjE7-_oyKK)yMCc~B&e*NpOasL&6O@_cz7Ahg?aloeJk#BsB>Yx=( z4isjX?lgnnOIz3z5okH$Px-aOXXR}O{1xbgvqyAq2s{k*=68-bGZGK{77#Rl0F9U9 zUO&fNKgaF8Ic~B!>d3JnFrU9-bVFb+kl2l9pK|r8;mpMxV`RCyG3%i0NV8WMXV+pi zFZM7k^HKcNY!b5tgwu-!v38qydH=**m{7dF_M`f7hc2kertkO*q!49cXKa+|+Qu0} zHOpu#?)b~~LLzHy8=pQKN9|6q7HD;ItkD5XpW<^=^#U?g{SnrnqybU7D<$Ek6K0K1 zTmJfO<2l6%?q(H$MKep_)1U3x+m~ePq&<7PfAGI1`okB_PFvpaDqOR+B9f~g?jB_C zs88MoQL1Y4eZT%1FKeaIpDNMHBfk^FeA9)Kf_ny`@7-#e=`*Td6Plut>$LFdX%)k= z%j4e+H%|w^)Z`42#Sc}6S1oY?Wh!%9WFp^wv^?V zrcM`NaTKlY(swZD025!>oV1^oX2D~N?5D+_zkII!w8(N+EU=%Jm^DUau>;CtL&_+3 zS!{4wY*1M&y(~r%4~WFLlz(s}#xqre;zt&@Y98y>Q%$v*Zh%$24Gnk65t(+>aF8r>4D%97<-dBOX z-t)fj_ql=j-WP+I+`x423)7t&xP~uVh(Bm;1k*p=ejad!bkFqQjiyPTJWb;%&^|j! zWal*L!xD5&h>^oY<`iO4CQBHyXus3U8%Hjy9y|&(T7$U*QT61+YBZkx|{3{l~ z$eb3_nT-S|^dyh^#m>EDv9^>c{896n`wd+1l~HE(NBJZOQt-W+5QX)s+QLZnAYPDq zk6D)b9&VVQKpoci3=1}#BYPjXBVLm&^@tzYvF86l(WDPjwEFIJW}Gt3h~^%`Oot-8 zT9>~>tKVV?H?;Sx`mz5dE{4`z9ZRmzn#$lo$nzG%WPDI>$V_=P{@fC}#a7(~-?HzB z-O2*HcE`;q+>r5`Et*z>68qc+mBkxgPdkN)u2|_?Y3Ad6ePq1N$T5>a2Lng-04=s( zYPKKb)9mNgZrej}YI4i3O%Eaa;|;DuFbzEqgxbv)+C%rC9X*ROwTCiE0hx`O7#dT5 z8ha^UfgxP_8YVr~C>otNuQ71TAqklp39pvGREC?rwe?S=CIP5O-|nU7N#7Hn3*K?B ziNp|PcISjwb}(K1n7X3&4PIBR^fuZS%}Qec$F&7N(C_FrNt_8GQ{SA;4^6eDj1JmG ziyo7eYK<>N5N4BaX(*({=L29Zg6Ei|^#m*esUytPDmz*lI`w~ z^rc6TE=iD#UhdXo(Wc5KG^xhpnLPPezk`vFx(8+uVea4j9-Yg-8NeRV=117SZl)-(K1TGagF$_;-#T{xn9JhA7<1_3qglsY zX0U_V+#cXCvzwF|G%B{V__W|JE@6?rdx)()RaB%jeawcyd2{jN{41aHSxu(4qqN1@ zGB@Xaeehl}A9ys`lKt74MZ}r6)OCM@%u0D|eR=HJ@Ctc0IW+4pW`>u09?trc>ER~N z!=XVa$+T6*zwuI~{hqSgxHr#PRX%2%TQJ9Zr;6pqwFPr5w#W+S**sVHm~m~8x5>wZ zR~hFaCY(X_J?dB?{(*6cj`^WEXWc_HreR4tarc9h3B zWHZksHcGDPX08>nPhs13^0yrfde@~FzjoVlqoXsapuofHoKKvtumASGur0ZP4)1G< zzBYPa#Z`>2D$v(y-k0&L^Y}t% zrI#r>tDAT2KT1URC+A?A^qSi8S?6!iMf6m2PWCAq?Xns;8IR|NsWD=h$k|Ym>3%h^ z&^HV7=9m7x`PGihv~?gEwtLtgIm&k8+S<^puW!)(kD$)Y-4~O|xsH_CgP&*i?VGcX zwW%XIBQBi!n@ZYdu=_#D7I+G7XPgJ}^xm`{JFM23A{}|fbEZgeW{Ojir3m;p{CefE z5&-9OGp58(RLcC?FR+vSy3?-|xL`v(t zWOYV->}`*o_DM=FB_1ez=BSZ_1IY*169>gsH5Jv90BFAWkmFEsZY6L4CKJ4#FwrY?(N7^Z%1x zrZzffTu9gmUNb)Nr5Wc)z#MHDJ)<gwY z`CXz?^4qBI?(cv)3xpG&2I-m^-~5XBN{iRf16gBd!{+P_&Xs(7OGPmzhE7$f#;8;j z^19GyO7&e^s(ITQN&eLe_G(JOv`K+Ns$kkm{M8EfRNsRA8+^q(Y`HF`XN9cuBW6gWI)seQl*KkFgV%vx^P}jx z$ou8mXX?kD`vlSm&i^MFdJ#EEeG?M>C1skWkyME%srNVRPf{63%4U$Hx}aesr3RlO zDTSv>s?d{^TxmZ^f$=U6c^zj430-KViDFdTCy}38PHVZ zTa@!KO}afsQWxN~vlO64+@#?X)P3z0{o@tv;YEp7r>7v8?s6mzZ&`ZR>tC9BU89 zo(dPQy=_SM!(bZ4nXL&3!_QvB2C+BvwMEEG=Qp-hnKyP9lI_-G;=yS3nrL;`gm~zU z3u2+Q7_nFol0*jQOr_O#XGW?u8x+J*+4wmF9TlhbtO$}P>3>j+~wZ%@7=+!mI{sZ-El;5G{fK?V~=SxGF z!t~U+)>Nj@<{4BPjbWFDz48QG)PH_AX@hqr_{*~Z1so0}UB;$LkqqWil1Uxn=iJ9t zgA=*OEbwrvbz!Bkwf*Q?RTteZ&`EsnQk>G_wLd!d`>`FRuSS>_u z5DBd}9lMuq7=?Y6n02PGx(8Ohwl%dSv(Bg=HyLizY7eO&ce4Oab&p$UfP;AF#}=ga zAZ81vuRUrc0|vd!$&Ln97GIyNW2qpY^O%9_+m0H!A#eqMT}#Y<{UG%s%`xjh_nW2< z891MK=J&HV7nn(9GtZx!J}x3lBTvqlKO_m}Jb56S&_cTdQP=+mvil z;I$8oG?^V0I_AVCg*0DWVHjf)mz!2rEA#hV=7cg&F*Lwisq|CyXPW-7ls+jmlc86g zvh&X$g>|u1u-FW_G*83G_-!H0bVy5t^cCceIB<9*;(@m+`x+z){(0uv2m%6ST_(V828kpVnw%PzE+w~ykn#$~GbFXQkaCHN_QlD> zwJ>Z2ROe>B=IuDe1z5-bfUW$99qo#1(Jy=7?nLVLW~2_XDkPH-(GyyK+wThQEd|tsFQJWqbz}p42+-16X@Zj@K})!>>fd7p-1VT%qjOP7osCpp9eq#& zgjCwfz;?1G7FbRqiP^fs89E)GycbmLzg0?Irm@gK+yha&TJjO1Wc|(XIlEQ*Zd^m3 zY1?U>Wi-<%pRm~@T0Q9eL`K?qdIUR>wP`v#tIUQ6^ULm2WE@RIXdEx{OdyP9r@dzw zWIn$VS70`a(Z<%(P1vBWLS~e053ffOR$n8D=?s`PKQjsC;q}>i_C?gMF$p8Z+iEux z`B13Nmf21p5Him!n_){{g#dQZzZL?kXfE7f_)>|x(~EJFyTEHv5cw_vNdl0o!Kuwz zOhRhVZjqj!m{`K~2syT71T*_+E(#%RQb#6ycAD5E*nv`>gLrCOW738CXkA+5g`LOIl4R)o(0Nk^{Uo$nT zYbxwwzV;zavWcgd#EmvFhdlV48Y&QTDz@&~AdA{88)03RN|QxR5-!=@P{oL*u#I12 z>XKBLBx-ZqGN8L!=4%+PgE13JKJx@N(FlxLe-bYYwHV1D6NquGN5o)gw}GWbP)xuP zNb@8Rid25po3J-YrnE|RDs{jd^M!~iseQzhgFX{HHAF#Oa`;b44y!52Gfi^#*C7IP zt%u5IHb9s=SvYQ~hQ{QS>O%I#elH6tquP(?X@RhF($taRWSlBosZJ#vlp+wEy>L}H$Da>_AY)`j0PL7Vpt+(^D(E6*#f|$EwkF7 zTSsydnOUpMaDYY1%}0)Y*I;g4BSF>tzkxjNME zGUU6RoJf~{X0YaZo*UGyXCyx;zHt6i#GSryekVV*2LfyXs2NvQ{Tz;eeI!=;&nf4* zft}rYk#~<&o6%CD0)fOcc}|EC9@5B&7Pr)Xs6BC|#V^uR-;myYPiZW>9vNzqJtIV) zG_aigL9+(ka0DutJ)U_fdaiVba%&B!xz}FNh#2Hpowh>xK?Vu^20(zRFV0A9`pbslJCYjbew8{2GZXrZ5 z%YNdi^-s{0_>p7(fm**3Y&acjlcLtIpw0!H`pS4G@W12 zHeo;=S{;(T*rHtu=+G_$^w26;Xt#jG-u`!{L;FKQs9f+-6f9fd@V$RvY=U!HfCSZl z)356_y`HRgg1iXruoOZOwv|KnECMFT#3W(oRmALV^uNS zob%AO;UYelFGqX&)!poq&)+zpAcYB|P+SGx$K*;mn{MT}E|p4y-k`cU!^ zJestovi-EvQq$@~X?sAe-!!-nv!yr8>M~c;u)Fem%msr7kOhef|1PV2YFKwCiaC6qyvaX!}5o7VBNjC;w=1 za<9LHqRtqRRZLURQ<#Z-Y=pV7$*6DGbOm{Q4t1(7X8^MY$5h7ZcyJdTJi3!r4XrH( zRb@k~#uBc>Ij^AeP|W!WFuFRM35{a9zQyHy-yWi={Gq z@82z!4gC684#wxbz2gtV@%Q8ll6GzK18UkLf`nx(aEL`#DAwjfj9)X!Q<=TQq8&Ef zqLrOlGec-EC7I9`cAsNY6O%oQR5#)3CuJ)=;lswH<~zvjkE4pyx^s!t6wnlp8_|YI zuz(X6ucC6`t44pg1R%;XNJS*}l7D*OkvFl!O)=*#S>whStb3o`+D!4TmBTjWFEEk>GBo*(hPIji|yFXh=zfx5Hr>Ge<@H zj-ET|c$%GrrU|1#f1#9ggX{ED8p<#Ymr;5VDrSAwL}S<9N&fj-*){I-yxO|LB<;c3 zfo*_)1%b?i`qfor0aS+<&ni%jM`vOHw*Xr6fFl7;wt<*yCSP8vPUHLOZgPK>=7_^9 zWgm4Yza2B9J3y3!34ckcZHnxknXF^_gm_~tI5W>XsD}Ugb?J$-Fc*!H+6L{`=wjcyPp!X2KP^=Sy4C9#d6HH0HUfA zs-rW7ZG zg@B$66r3CkDQfVRM_dhl&sgYwH8_*rkZMplYz;QFHG(sx5|t#i60ZesZzVnRfASQ)54!Ejd8N&uYkB@hJ7XUIQGkmMd;`p8dD1PBP2hj1I2k7yw;AA`12;awfe4o>6 zJ{0dbj&N~Sq`qyaOo-MveU5)GEfB|jO-Q>KHu%RlhIu}|%Bzxr`yC~bPpMaFHLYGHljLJ1#FU1xtowiITOHz4krmMR*xtlcc1LDKE?lFheu&mRE-F+`tn9Tn#5K2ik<>quivu;%`I0F2P z)!hm}8nSdi^K?$68Gx1dv5ZHDY``6e>Oa*c<=eQtR2mE37bQ0gjbvNS?J$<`K zoK1@KggBlNjlGRywuSxqJ7z2F2#r;}OzijFC)3WaXAZ_tmVYkIn5G& zqTUfWS=Q=kR?_q+BW1Xwx<5u6zhVZ?& zUTp8P(yp=5^j7k=3tb|kShK+y1Z1>zv}$c-^mco=U5g^-jC5Vo)r<>;SOkhcuHDR* zA+uxbud6GNfEDJH3%Q`EzBMytZ(C&cd-?O2G#EDy4rn1`&$nAYU}mzJf5nI+;bT|c%k6y#J{Z{s86LGQ{(X!SOFtCmIxt{a%y|A^224$U3@rK$* znGob5GEq_EjZ95TyMKl0rd9xIc9_r-z&hmGdrL|wAzJ8CjP69q{{hYLG?Fw|n(F;9 zc`xUZ74ytwe!)?ArH{D?@NkQ{08p6CA@8#0uOb-L@73x(Ck68DiGUaf@o-iKAHqi}QMGg;Z;m6Bpv^=n$4Gll1FiXG$} zydGxeS4B++l{J zt&FQmTZq zPzF67_{ks5jU^cb$XqER`4Kf~thXjItk_-50mQ6QRT&-ct(CkIvyZ8vV$PLg!85u| z2M+D@hlh016{a)A7^!x{m!g=vUlfO@pzxW^n`AXNd9`2uZGgwS@)ur{mi9lk{6&DS z{9UAQ<^O{z{}uv_&)_%t(f7Z!l%*A@AVow${UQos@@Aw%lT{I)_>v-)R_Jw<0rD58 z~iXZKAtt};z+ zm8vWn*9(n)V{_F?fn8e*2PZeQO&Ps8omOYtve#esk=KA6A%wa0y7uq;r@}QgUX%8z z>>7}YjKn@v4o;=w)6Tri%BqPh&OWvPo@A}qQouUo5)a(6#0X^>0kUL@kR{t8QS-Z| z$}I9r^X($PAbV-~#a!;7X0_-)df%z;u?% zNXmdM9K7-nMX{2F>X_h$!Oonf8u5QUr&Rrn_&uEK>7`sDs}1$&LB?YDQh!0dRn+ej z5>bEJQTIuC&H>AP(f%y=43I{Kk{EjnQI78Lr_HWB(!NC3vOb@R}O63CboQLP57X! zc>|bmllMNbI{UVMAp174Wyin8aml~MvFqRB$W6iF7dh*Dw(VEm=u2@5V40KRBH)8; zm#GoZNwEUZO7ZH4j1(slAe4$oZoM>BR@y0~;9gDiWR@|=*mGK$vs3RRe~g%&sGjW= z)j%k$$Ob@h{8vU{B{l$xBn9xe@JqFMq7~GbT3=8lfaOk5Gl89;>HwXfiU6&kN`7Yq zHJSjSR7A1`+4nK^GC07Cmu0ldIEl_J18 zq#qBo{nm<}067&!$f=xliFI2;LBrm(ecV<-aLzlN_>$YozuBiy0C3CH66NrOuaDGX!q8xXRI3rjao8*gEM)X!1~o3-2QRY{97EJgWErjq7)o{ zk&mBXtwiT7z7)FvuXj?+|Cw*M3jm!IJ4j)rIQKV3iZ2i#l!{1Z_K}smlY;k^nR6|) zI^V%1$m+S4z7DQG3eON5ADN2cyswPHv$Ff3I3NXuU#dYDSV1-2>Ia*zDN znH9a>XT`rKRFF!@lkb3pWNA|g{gZ-tZtg1(@@+Dm{T8nl1|%dao=WKYR6@QSuZp^= zA+W}YhN9po&r$!s|nZ}$^kkX zJsr@Ro-MyJYF|Tunv5cnQ_;J9Je`S|b>6@8bkWuUJe|q=3|POKr`tb{JO3>X&(rN6 z$2loD{33@V)=E^~;Y)D};9X9Ni-5hM9H5h81)!DU1NRy!P9#7m6_GrukF3l%Ows-v zl-E0Oo{m=Md%E9|bzn~?%&90mOKjX!DvBvz8HHzK_d#)F3JSke`R7_ejhX8Uss!*J zC#adg-cSzE391Ot3aa)VBdE~?2&E#D+mU@A2P6aJdpafgYM$=vZ@cjvHZRpLTvE0_ z2Q(m|fA8r$Lb9}}gx;ed1ADpw3Hdg8zn;z`BrBdus6LgDFUOyacU41bZ%hYxFI9sf zC<3&8=%c%B9S~r~bo#~H{8%;1?{`4+Wu9(!tCpcs7UlY!Hk!%!32z-}|A&670u|4j zU5cgJPgoV$XhPWmHa#AgF_Vc$79(}qq?GYi*sRdm^_TI9AM?20hgyb7T)P*qkdyIV z@&p)T`v!_UWYW8=Ig4La z3?r56`7@%;+zg$_*xjMa!xMRDG8Ef1{qbDEn~Iolj?7-G3F>Ao4uOAnl60VIhrWh( z?8BYRNt#Qu%MBm8;6wWebBDS##8;ATGW-56%|6biDbp51B|0ykMSZ&jXwFAzow29( zx245nLp7P>V;^kY$p9uExacOkv}J^JG!^7=3=Xj0PKN{Brc|w+3Ofd)So#7X{_nW(8b>wg~_MSHX8^vVX4iJIoS;f zBVY=A;Tk!$P(dVdHaF;#BbZY+_wKaAlJ}7(rB05$&}QMB&xJ1xW)0aq{8@8-nkweu z-Dz)_iaGYDe=`*`l~X&amiJAC0WEvYRb6(KO~JOrLh3eeyQ{0qRd1%gxTB3CWU%=( zs}19l7D;ChM@C!4)4{{JC)Fg6-=c-=jL*%c2hOwo6Rve0p-MF~l$znnic7P9fihD# zYO0C{d2{EcofF{OCgiBPsb*7!SK5S;h?g=#N>|s^{Ur9NPJTuh$GL=FUC+(8D9g2f zG5cr}t7DdxyGgg3Tn}q>q1lNcQc3oKWuGd-vL@;esePTrEGy;$IWjvG!u^Cgfnx~2%j37 z&UY8z4~6PT8mYcc68zEL$FwGDv}Ci^=Nc7<^&QDgQFRNCDD z6L=r zrBxJy#7D^n7Y;s7jj{@6bxB5mE^`F!YHKpj2XJW1JRtOB$ym&4P_!IvV;E%rHVc>sQ&n5R{! zQQhoLy)HCuhVBpKnm4|-->B`t*M+9fKnrtD?Rnbl(BFRJ$$X7_IVL`GPJPpaUivvH zKM3AYOg$62EL4Z!gd%vmwm(PWrkJkba0p@>(dJ}}+iS7)CYGoP?;uNvOe&5P~a8m1?=H$|#>ow})I?%>1t z%!#)5e0&b(r$=HK+eKdP7DP0ko}U;yHL~WNjL7T_TK(h4+$c-Cr^-e@Z7VTrQ{w?S z#$ZojHrE;KNMaIoyJj<4*V(M=l+~07{O0%@wN#+@y0zE+3hrpR^vIvn&(PE1Z;Hu> zG9)8?nrFf%H|Z(ySM|#GOIWN)ym_8m)kM}#fXkYc?lon*B8fd zjl*Q#yac!UJ|TH+l~)`>jbyatt40E*(x{N#u0k4(gB`njF2AaOoC_ zi(vPq^|wjOC8h@1{fa z0IqozwUTDHsZcn2P^eO%YmVvxUtB?0V59j$rDeF=36F-Rn5RbC{5}A#{|u0sTP{xp zD6js!EHQbn+gygzEq#q@>t~REInG(sMpyvtRMV~;DJiFM8#?rajO4b2 zfh`4T=$QGzAOIdKndV~Vdoguh%ybu{L9xj*ml#=5mc28q`w-(EIn5S~ZOcFMC@zMi zcCF=%-r>B5lq_nLeAsA%&v_602G$c}`6b>%dHZ`0a^O7*h%w$H5|>>?Zr5#+$-gdC z(Z`3BruvX&8=Mb05gg<0tyk%CPJO_HdOk$+285!i)`8r{H;(f=s-Mbe`Zh_xbihp?9#B}*Tn@RJ{iYpb1v{3sFla=F<3SKP z&hf|u1UhaP|8hLh!8M^u9{Kr9%@^M;Yp`kj;2+TfwpjOrA&YkPB+9v<{c$BK#TVg( zI{AY^L&BdLB{g>?jc%(rblBmx3z20jo8dx5IKU$$d7CPJKJ@UiHE(B>B_2reI6B)h zrdKeU0+6(#EOW^PM3J6K3^^{O}p;`yY>bLBTaneF)`j9)0jH~)vrsP%P6_Z4Db zU>W9f?-#7Z#wk5eqOSq{(%pUV5BBlr`}lpAbl>z8{DQ&wGJ01vVvx;-bdQ!%l+zo~ zD>XUpE^D%0X+6eLJzD+mc_nSRl(&*+`beIs9vi4ipda5-I{4VLu6Zeo>N`I%daCtN zRN=xd&qsy+$JG6Grmk}qcgja`(?wh7Qw$2?lhl02ZdW@!KM|dwJ)n7Kai6;Q%Mfu&p=Mfa}P_?<_%R%&q542Cre~s-BC@C zAUgS&r4ftd=6!sXSU4E0mu9cN4V|&x^Yp$v`95pu0;6>n?0-SofZliI2BHeR?Bg`pz6N9oK)q6d`AjWvFH2~4-?PZAzNQ9#+OWdImto3BQGl^ZdIbV~5p4joluyz*Yu!D>{a%KDW<7=c? zZlt2Ty}m{fX7qxuDFpU?jVYPuYrbT>5?PZvUip^cCg;>sOsMB;erA15>UiZEf_w>h zex}0nB0U3m5zhtTdMm7lIO1BK6^ivq>kazs7)K`AiSC1Itgn(CmiOklS3hneah~At zG>F0TG{}m3jaaudo+e@x00V_(T4BaDSfzv@=KSR=$Gbt#6&k~sq0W8sAh6ge-(tLp=Ue;%&jZH&q>g#M z%euPEoEuNc;aNu^dIODl<~jr3W-x)B`*K6fQ5(#tXv+Ra zN_VbE9VuNmL-NQuwZ?>c-s`W{d)0)d*^$zNeADi^e2>9-G`&l0-}7K&?545O*tW19 zMJ1|4V@5lP<;GB$f9I5{rtabif&;>dydnK$$n6q={=+C7pp2`P=22wTs7(HhI_^Ww z8=*QXpHw^dhG=nb61?Z5FCSK2QD9`AL zX7mU0Z&8f3F{~KVR42z~dedOwOsc~Cpf`xR!VIGRT+_!9Z6mSoh>l>OGift_s@{-; zVd^gTzRDD5Cs>KiK>yGvPR$Cr4GRM8Aq~m$s;BNVns6O8sJXvwp6k=N%6dB6zdGNptl8l)5xnDRt{HAyVq9R>ZjGnPm^g|( zD;=SqOMU(S@q$fYTH5jd!3*Z^&kNEw()=}7k^C>*peiI<{6uihV7bCkA?FES+j^!( zRDtTty{$fD%ud#i59HVrW<}N~@b*v4Z||awz2cCl)ODLhq>fZ~M-#QYGW;jEsdX`U zN)y+nQ@!PhpRw3(=66|=%h;8C@tblOm4ROw^tx|Y_bld|`g8L=c^fLqq!#OUlb3yJ z*Y9#|hn+-Bf+?cmJ*z2r=V`X99_zF{b<)VBbB1SLt4l+Vi%A&&vii;CC(Uw=+1WTuuVtma)B&r-tYN*b8?} zkHWOj6Wh)D9XlP&`d#*zznUIJyIH>*cEpcOTh9Kv3BAv?}`H?Z#@MWHh|e;N&(1KICmh z7^^i)9Rjq2a2C@&&InuFW^5K&*)~AdC)I{DiMYv36w+=AnK7B<+-HC2O!sDzZdvCzRLYW!`+%vW_t(_bdI%C0|d7WjtZ zlY$=3kX+S)dCTu;#AYDw5JT-li&(V)lFDAh ztZsu@Q_ggkgtXBdL4D7ua|Wy)Ia2=gV9)nO$->TtNGA zs9yLu&0Zc(nyoD@TzDo6X>5(T(w87(u{D%ny0Sn>hyDGxAjN2C;c+q%c4CZZSu~?S zT*r;Ny(3g_ka4Q%*l1qOY*eC0ij^^2S;&AYk&Im)?)Kk8!m_Vf0GGkZ=tAtJ!P%28 zX0neZ2@3bn9_Mp40)iP+4^>D05SIAlYGH~d-C%X|&S!?OLtXh0sutImhm@r6-v4BQb$d zui&R@w_v8Q1b+&tN=P=+*T25s~UwB8l_&My`Hbk6^Ay`|ay0XI5@$V&)#^xS}jPC!<%t zqNUgK6AMp2XtQ~w**<+9KlOpde;gh^Au?m-@JRKh^29@jp7}m|jpBjRK3O?D%s7E< zT`MqOX{+-ye|)fc2f7?9tv8o1NX$D@$dDQhtg0b*%nx+Tt}+8BX?HT@wwS}*_WHHM z>h}z-IbJ4tgq;22+$H9`0+9+*VG4y4e!tY?ceA^ zUZJg*NTPVmMP;+s3g%hvgH%I$6ugg$O!L@5I-6i{VeTRuqU#swp%IXIsxAO9_c1<}ll(w%jCKbTq!Rn`&XfEW=8m!H^CUkfqA{uIdnFV> zLR)`Dr%Ym+KOZ15Z8!VvI?b+)53?C(QR0qLw5ri=Xe~?pO?vj2q-mF`qP+01jqZHU z_{5dGR5LZyqCZ{b)w{xpbM|U>sG&&mf|=3l$`TWJxIXXkvTAOw@xw>0n~)f>m&wWR zx`ZJfFe?o;rX(4$j!hd^>-6= zU1$kCvrTE#<^_z=B5dU;qkBUU&P$Aa&F;0b`>_(E$|7stV)3*sVs>e@DbaG-hRB*X zGt|18%4Tm^{R`$?*K8hKHhaAV-=x=cmy%M$>t(1_Ich*pQy~+k@Ueyu?c4bUt`Sj~ zZ>|EZD)&B~&M76An(_(NQ&-V29~x~Wgd${ZHffJ2vW;cU zxp5Mln+O#!-#=hF+k!ltODxX6_raNAa5fyGaghoD&cA;N&O`E3aN3ER-m!)4hLKYE=_z+4=-~JR^y?6P)hwA1`qXaC65(z*&WUUgxR>o0w@EwixD>H*FO%IYV8!KaZTkYTZANT73>8WI zWN)Hkx3Tey50#;@mJHMQa$-{27kI|9#Nw|xUy=8+E+AKD*ff28%39z3~lBais&YKMbR_9H_V49n|Ek?)ORV%32uHMVGI&6(%Mvzp7Rw<6eM{Yrb+Zy4t$vNFr7 zAIH{?^kap^sD|pjSAObWt7EbuvwqKDd%sm3TG7D~>Q>sEnRr^&b;3u(!{%nGvf15h z=q;>P$&8URFU(!Y8?}k7tJ2bVM0vJaePVQ3IKJ?%v@-{>lJe$+#6u&z1~}p!=X-J0 zN0>mY^NR?2d;Y}|bQXfndOBj{=ZSQC5m8PkQeA1fiW9TlVynuwNECtQ1Rs5W9==@tq~-`v+3dFe3~Q@I*N;EX4?k8!P`GI(e<>KwsVd_zb<=P}=4Fm7 z^&m_z(;$@@x$<7QJf&NxvB8MbF0nvyqB%hQ0Sknpij2(JVRlb(*CL27dWPDg{!-Aq?ocP zK2eG>eX`f@HYo04fhPJKHbTnrQmS*r9Uane-(tAnLpUFyGrsvMv`M-x%*!XC3rviAJ z=)jbSWU@T{1+E(?!THnJ>Alm-DCIUjGIz-BB+Js<&eL)s|H>01PC+l@dH0we2^FcX z%u=^(OO8eKZWaogAq;Px)J{9fwrNJFBgz0tAr~;F@M0Dy zW^NQM>@c1-*szd7nfZzx`kSR~$W;;as!|7rq+fS;Duq?8p?udDq??`(b}u&_B#lFB z4wpuE87$8!e@T-3?Zgk2UJtGLw&FW&yoWW@V95caQCfr9%p3(PQ!pQGGU1>nhOC3` z$YgH`*ww+v)m1(JiQ;vUfQ4p3)KgkKHMFbdKrps%eUN^SQ6T0m80xa$>>WzQ?cdAgpLl~b z6Ax7X#Zc_<`uZdnGwMy{G1FAqB@U_9 zlC+wcGE+5ab&j`qJ%=yi*%f<5C)DY}sWFnufKVcNnFigOkg(!K!?9 z=e*4#>dx&%2}1a86|j>McVYR0^Z$}gebY0mU|Gw%tK~NeOJr#x>ms^zd6Mc1i5Me2 z;$=dzBuGB;UM7jDBH0^i-!4l^66$iK^f5^7_c0=BToRM(GohiyPt^W%>o*`9RpW;_ z3|&Ve!V%iXv65zV+pPW(G)FxXNnA!}J?oW7^(~=JoSQev657Kyt&Q{pJ9XTGQJfz$ zVo%~0bx>2o@_1um^dV^O@YT|FO*QihZYL7|GjFUz6o}Wyv9nxj=Ov z)L-*ZpTMcRWbz=Pt_pN;B(D2}erS(OMZ1R-$>lEjZ}~9jH6@oaAID|OY#~w)rbuI7 z7TlOcj>guN$DWE*pBR~Ar_Cb4$h&2+_sc%t6hAC%E<~hMEps*o%{$Fu?leA0U9anoFL$GWb26SXx{Bti959 zeesL6O9?O=Lkf`d8Cq@3j~__EM)5?^{Ef_@(3>cvNvWZp@Ww@^hIxe}CoqQ{gtR_w z+TrV@KfA9IbycDW?D6`Y>9@`b>wy|+#pB^-LF0K1yEOJX9ll#HDUE%E&?Y3J+4u^t z2q%MWgo^N*RhUV7X0VH5ys2VPu1o0feeVqdflurRp1Y3y_#XH8&y zth4)GmtC8Q0(V`^75YPhcicpIRCDFk+>QJhLi;G1&UMswW*D;3>dvy@BTq)DIz(Wm z^z*2$*Hx<%5*a6+pU4_xYMm+MoQx+m)vfI*lit)+ek(42atrJqx#B_}uY#lURY4${tfF^Hx>u(lT=lR; zxQe=%HE0IIuM>~_i{P_nOzu8|9O{7be@>v<x%%EB2><;-35xB;KklyV*}rD0USM33%Q?ytmc2F6SIy- zRU_5UBIc)2e_4>wCuNB&99GU~Lw1+Q_J{$kHNdo6mdG8gGHm1j&G5^qv)s|z&zKYX zRDVZ5r5pq29Zyo7QtQpjl_jH}D&85K^B*`Z3HB3kRBadZrl2>F%-j0f##g2CIog$P z+g-uI+>lPGakP*>o5bStN{&RUj;%6V&%~u!Y^!`h>!?zj+&mR#(pKfMZ#h!FE(Nuk z1$`yScoMbRUY_2q8AtXXz7$P2s}dPc^3Zd!nWW?OH#330N9{YB{voq{-=(KibU}Q? zD;LB@ps0HzoTJH!#7ARUMt^|=dxhv(;+3TRD(prmLceab75sUHazUH-3N5 zg*IG0PyjfA8dGp3aFY$50(b$zgysO+3nD&^9yKz?(|QCj9d9D^JjruIFz1Z(gx%eQ zus3g^QmH&bd~T&{{qgQ)SgVc<}F}NO}@(vakqi zpAr=qn79TeSa$qgds(apO=v4mPnObqO#jeQG3cR0ABEW=tPM(LA87g%Qm;U&_JQs) z1X{S-nb;O9DH0z$rd&p%uygBk>|CRYXNbKciB}|_5$QOHq z|B%_kw-*H;oftZ6?!?e3W2z(}&5igDF418SLX$-Z3CG_!>ebfX6B= z!83s`uqf*QgF@M09y>BvdmsJOz43YjNjSR(aR-s)(ENR}DrB-khACvS3yJQN<}^Z- z_J%aek)9`V92Ee5!*Nsz>;UEW^x(xd$co;hJ}b z%-MT$aCOTpuQ_~OnX30j=Ik}SpGfe6p5(tk5Si0bJ9KsD56($Tez<4H-m+M0c=-|t z*-p}O=|XAjV~%S=a6aXj^NLZ8VA;A@MkpNHa8BZuaqJu3yD!D1Ds?}K*Y&0NGedEG zc)9emG@cQP#@>j%3o#HT3&>wSXG;zDtG<)`8yUm1_wJ>fx8|*oPSaU3YMpE%UH2%n zLd`=FF7S5*+GNM=EK8V#%>`smUIxkXIiCsZ=gIGb6>BvrF)2SirC_C@yjWX(TY4k^ZWOpA5yOaC&Ter6x~yzX9#hk<@(U;2j|`fbRV)}AV3F78=ngyBS7 z!AIik0BADyCA(QjO|c95kS!2d{%lCz1)Y>)Ke)>k`wynr=r}dDHTE(^W{{YXJj;-N zU-iIyz2u!uXrJnRdv(de2M4E1ZwattZz-V1UJ}?T&K5w&-gH3A-boR|UJU_aPZ7y;efCsi z%_Zl<-X@>D=bo|bRkFnF*wa&Le{t;90V@aW-2&*bHy7Bkr+0Tf_S%6Rd#!+uy$V3f z-okSYdlLx|dx}Ud>G7mz*^9#7D?WRtIQGV5`RtVd{=>011-OJ9ur~?NV{aO;V{ba3 z$KDcP$KFGLj=ds4%ifN2?7e6Nh&@Fl5A@lyx>pW+Z}{xp{j`-{KKnkL^a=nqvXYYN z<+c)X0FDLp*wYJijy=6V=dq_3Z5?}hyVkLn18CWsY}v~rKL`|w1NL?i?6H?guwyR=&|@zG?AR*> zbnJB~wy(Z8(_F4c}JNCMOOUMCxuL64P zC4n7#+W?tCd*xpxq6|lG4XYVk_-XhRB_8I}# zIQCkAOUMCxD*-+B+JPN=9e^HtnYliD8Gw$x12V6o9*t-SLV{b07V{ZYV$6hNN*wmVowptrJw9z(qw8VFI?ZsJ8bXl+v7fi>hJH8cakf`B_G6R zS&ZIbE(Htg)l=(|U2hb$$t8%PG(I+TZer}%0Xz0DlAu4CyZe%P=wp#l$KLOBZY_3a6(fS{Z`38wG&5;+Ix+28ilgOmRvU7w!40v{(ZwP#P5?fBI})9=~Wi=Q}Kf0H{5 zE3GLqIDnAw^8I$lm$39jq3mddp7f1m^1B~H_$W9gh7i9}TFzC`PH;tEYCka45aDoBQ&N#=Y=`MUtCj{Cf_o*yy~%r2 zqS?Fpbe|ar)gi9?NhcZZipK2dNP%+*OqC&FR)%9C>dWvNf$eNNbPQHFJ{3xaoA2K|NOg{0oQdR5W55H6_ zo?v~@I?ftj<*Q2vN;f{zUF5+_VSarn-ZnUX2AzvDw~sC*39I&WKEGx zCHeLzn_a2If1!LvHUUAgRHZr85I<&M**t2nID1saM?cv_q#?gV2<7nDePX0~Qiy%3 z3}s#LcL+AJi5$nW@ncGAW%K^~DhY@+U9$}q%ydm~{!O&|{^QTf8qL6KCGA{OIbG(G zo7n67TKP&9uHV2b58NptJ63dMIM)6`l?U&_vua}uFr26QE#2w^`WkC@W< z(?u=s^{bbN8{f-3RU3v}$v-1wm?^-(K*Q!F7^i5}?;znFj2} z-O~Zp4JF+59}8YysfOj%*3A+!9E~ z0(xX4z>aJMpva2%O5jn55^y4*I*ouifJzb%Ot#$Q5g=|9k-YO=L_?|`K3uu=-ry;Y zfdXLJbyAGb%&-eC1a=G*0lIQ;6D3pbU1LnSKXsH8kt}eOI?3QDbpd|cp-dYNC9EWr zb`k7R$|TrP$^mqgI+Vgty4O;AfdG|B5y?ll+A=kf!BJ`f9PKD|0n6q<=~Y0FQWDrv z+6L$ewFlS<^;1A6)TMw{sA0>%G6KYaB9f=VK>fILhMFq=x~4LqwdgRPn?}HhEdbO^dGE8Y3zdiId&S5+jx>$u!{pYaE$qz0ee`vJWe$B4@aYzP3!szV zbU>juZ@<>?A4M{ zt%-bymI8(Ga)Jm0C<5dc@CgT-m3?BghUe$g%qQi{=>m+i(g0a74j?4JF|_&vUYvceP8Td z1)j7yEwOilWgX2jW=ebwiS_%S$^;ud1wI>TBUx0oY-}U6j@+gKKIKCkDA1#)-zyx7 zPAbD|;D8re6diy*iWm403I!_bM7XepSmFw?5wW;JFvhlpxN4E=(D6^Ga{hsI`hD{) z%YReIC*A@$(Gp(@=o4SYhlndsSziQ&CEnqPU(!pQ5ws=#?ypja6RMmiIO0EY#20wX5@%w_65n=jO34XT&Tl*7*E-^r-|~r10leH2 zuK@IkPvk?y6(|%_eBu#D{9lOCm7FO@OZ>)E;)E*aqomXC2b*ol$BgocmjHg>5-$Su ziI3((#1*Kln?YeqKHU-jK`(J86fN=3?nx;*p~_k8i2uY9&p**8UI2K7C7uK56VKyA z#1$wMSBkg{eDg0I@hynam7M89OZ?_k;)E*aO48}~(>GmfJ;^7YR+N_Z1511xp+50X z`4DjhD(hBI*pe@G#INcl&NRLyzH4Dh$q7}?Gad1p9P!SRed1k!y5brG(gElbe}NAX zSD;W_=M(RA#NS1XuH;P8TjIB+5+_tS*OE@ZJKu2a{M$b97Qi1_;!6R2;>-9DaRn;t zhoG<}Ph&}5A=md3XA0gDACyX*P^BC1i2uwHUv#QZybrXOW zuo?oyha!aKU9hbNrGh)L!+9tjIGpBN4ufRO1-k!Cprc2T8Nsi z4Y23<0X@eLXdHjwjT7zk90B5`Lcd_2?67}B*k`wDe@e>Ul}j#;%ziKP1W{n6_BOkV z!fa#W^+=V`^NB3LMyRA5l}z2T=DDV1??-zA-&BZ{l}}e_?lFANIL+@C#1Tsz(=adb|F=ukUk8G75OA=UhI&5%OU-tL%M{a zoi~VE4SWcx z0+n@;kRC3ik2$1u4r$XXw)oR1heJ9Y@KB3%3ZRd4Dj!0sKq37TC|01wY0WPYKGN45(toPh#2oC97LM?d76A^kNDBacq#-_p zRDsGmSV%>^`E7@EwnMu7Wn28rqkN<}fQU_;rUCj$Gx!iv1q$h(L1FcDr$ai*A)V@w zCK;5t;%@^y%p&aq^pS4iLr4`Uq*X#H-D@7wVol78DmF1ehqN72>5z5+QWr)~0ez&c zdeC)BcPA;AwGmufkOHSC@j(nhx7!8 z^hXZq++%&D3jnELA*}=Skv8xlqzV+$%Y3AB9nww}o0uGjblNw4q|*U4ng;0?(${O&Iwm78q4(Vf^w)m0be54hCXpNAT0QyKv`4CbC3h7c%*y8s%q$fJ0S30DH z$NNZ&02%xWX#t>*H1vPid-wRLs;h7OBqxC&F+q)p7Ucl3nSo?-4@o4F$;>1fom@Koms40=aaA5kGQYL#IbUP zV(1Lokz$-6L=ONxGlqG>)!hTYWH>e~Uk1W%d1~#CPCeDY6E;rht&U95pcP87qnjwr@9G z>if!g?6`5p5o6fb#*V@1o3QQK7v+OH@;>B0_UYC*nLPB8Exv0d3q0m5x4pgT9N*_p zlWJksqk!Y)tr3eg^=tngYBu){#qLlHyqUvZ%NbZ7*>QT_rc+<<=dHnkA}D5C!;tVc z7JJvDfL2suF9nDLHa2+fZnbt@6Cr$*`-*&@#6Esj*rC{`4*AaN>7|ot5p<%w7baos z(4OdR>{H)S&}UsMPWz7bd?FWiIp>Gre3$-ZoDseGrQx3 zD8f`y^J+otQ*(jpO>A0+>HlK(?e~3htWS7<6SnuwzL(L&`NwA9We-`}jh!zI2K(0w%U$?cegDnXhuxcdr@V@7StBH!y- zzBisDE}@0cyEr=PlRG{~*X@t!7>>I6pT@4D@4$#S64Y~C{_agn*T(6mEjZkCzS)OA zg8XssZ~2uG$9(1;voK`L@E(mecJzkP;h`&WM%~DX?|aMaJAB*Q?Tf87-Nw$PxA%Mm z-~Uf$dLNzTJITA~yYGDFM`y)8eo+5n$0uPO{jBXBO6v381`qw-u(s!DKfdQg6wuG< zIX-K~zL~g24j*%Sj?cl60F59@hy)sOj8!Bv0_92X?qk>qkvk$6?mHYE!9_|?bn5FO zIzmK~T){P~4P1u6ne|w)?=JxosPo+7&aB?g38e)qi?GPUJ%^)5Wd*o!&i--wXV~{0 zjz2^gJ0T}gnGc+bT817x@L5qx?a<5i6?A%M;5={-Wt!>Rk3$z2C-Hq(`o4Oun51xL-lG@JSDpV} zexsl9!wJ3JuaUni4o)t;9T#mIeczd5AI~<24VYt}8Zi5^dp-qIbYnc9Zul z+aLSXDWCVgSs1>Ez3nv`$@{|0Id8=N$V*m${ zuM1FJTEB?uX759Fe+HDIy1zeyEm7a`Q^m21x^b)}a)zDGq$J|FF5?I(9tf)g5Uv;p z;T3*_YbXOhyBOw+Oh>j)oqktNalT)`s`aLspb9E1-mLW}jK* zUhu7`^2lF_pYuDPL!#8{l9*2~O!?KJ|-qkbX!b$_CSb&u+#m?MbPxDWk7CyyDr61hfIEzAEY~ z>Nyw4Exr#+yBZ!s=Y9df?W9OC*u~_l3WL3bJ$B`{U*kC7`7dn52*dR*U*jC;OL(Va zM!x~X&9DgGha+(VxE~CMj$Rc) z9Q3rr#=UKc{lVKf)@OK!b3cw`9r-#o@z7;Bg#|3Qj*~#Ftp{h%=ndi2AcPZ$Eu(OH z^TndT!iZSI{?@a2F|n%-juzOh7WntT0^bTO@W^F5I8}j|h#PC$2gLM-a3Utc3B;CB zIKBB+Mo@`SIMex3KK^Wdj9O~s-9N+`p=j~7I?{(PBI3o{@q#A58CZjhYY-S%i|)%r zH=FTyJE^#ci3Xl8|d*l2%j-9<47LH zg|sfc_q=~WqrtJO&b>TKuPnY-;hU27e*F!PUyX7zsNBBUbV!m)eO|_A?^hx|10(*9 zJs9}FMHbPyR1D&c9YayEKe`3$iN1xt9@K<%-j35(w9W8s`9t-Ka8p+5 z1?3fxQ()>Uk3yH3I|i)JSb;RQ5Fb3?QwlGqD;ox8JWb`r+K%ET#%I<*R(D3<>3gN8 zZ(djQ%%lA{3LTG0F5*@r4lMP2HqRJ#z<6{B^oT-f01*O60CWiq&b{2~+t>5yysn7w zqo>iPHE4e}NQS>^h*J2va5Er6xrC#|R6R}P(Vr}Vth3g$)<+)@7Py?94GP&JKzzDDL`U6ox{ax$^?^;@KA8F=NjlM%~{n z`oCLpUf;C9H`9lFVaCo`M&CI`pVT?MbGGjS-!#-Jk!saPOqz%nsq;KABn<>Gf#Q9eUz%kT8Y+adBVdO5lnkDQQz)O~}SByD>>dX~e z@)Z_XX4ytL`%$GxEL{0FFdU_CoHsfl+vPa@%RYN#6xdIWMme)MZm@vmGTlupsN^{) z*@D#*c*>IcvPJ(gb>mWsnQPR)c1FwsicyS6HYSfT_WmARdh-&UgvRk?Tycg13afCF_zKU!)LRcGDyZR}6L5a!G9=SSM6Z>AH7-du6=lGp`(k@qC} z;*BrSw`Q<`4fj0Rqr#qx6p;!=?m;9W%kC35d2y8tIc19c86we5v!qS=&ms@V^bt8e z;}X{Wwl4E+;IM7+G_uuUsByr-KOpaVTq4r3Uxw;@Gv=Ic(2)==$3-RUsVcINQ>uU> zZjd%ySX|SCYob;|%5W(Ww(sZwsvh5WfrudSGb%nvA+33-GrEfhZxbSCn-DpoVjvmL zM&ejKG~Lc=#+(;ow>>>b_tQYCK(JndigvU|NM5-^3M=l+jKMca$dMOFV~k`^K<;+6 zM0ergQl8&LpsK5#gGI_EXyV44m%X!}dswV| zo`}{~K1UAm!;Txds_hG*YX9mWRPC))pis4C)B@e(rK*ipweO~C`yyBIIH6xIMX6&| z?G%(R^wvUTfVOwa8oTHKsoK9N4py}(9tgktJryPp_RTyK;d`i~K=`i%R6DvR1p4YB zWD8ccpF&8ms{JIgqJ)P6O7M+S!cG1X{u3nxR=KZetg3AVuHMxGZ(ac2)N$}$>c@K- z@Q$k5XH&k;$dTRStJ<{rOVSsIAc+P3x*rah;0Lbb>{CCulJiG=P-0SY)Wi=2CjLoa z;;s0Ac0g%yImTjm`QYvUfhOYnELaoSAin*Yh+BM5sEO2x_>4du;+=h{s~EstMqE5R zgYRBICobN}bp&%~;;k5)aBaQQ?0b-pOoF5h5aj9r?y7!VjJLahjmFRpXg;LxAb51# zg@G&-$?s?BjJzI^<1K%nYDZp&J@Kz&uam!~t7l+5jVvKdm|3zRUN%axcjcl0{B5P4 z-g)#VbBsra>4L6Ai|=D&&zJKoVILchf*boV%j!tn0n+{fS6pzHdPF{r*lgU+bSuzd z2E7bog=WydJqC{Z9#IJ<88Levpr9xo6oDX`Ie$+<|LUVuQ4>y{+bGd}$cOtm@MosQ ziYCm03EmZfFPhzrVK|=M)fi=j(NI>^PcnW{;UyC3W5&*mc!=~lnk-*JNPmcu(V!G+ zP{--8wk6s$a3RHBOZDp6vts%3<==hcJA~DMejgMq-(mg#@tx9t1*|%u1JUfQ10}zQ zn!q#?Ev9Lz9@R-z3C5Wd{_s1LvLB_0hC!yA^{3G=n$Gb?jlyd*y~-Ae8e_Tb+qUb_ zBAOC0b(Fv$6-R027=1YKj>dzoXmuOu^F3Hhp~unh=zCfks9z?mz!r6nev)}Hnn;9+ zVNTyUWj)d8FUf9v2{gj~ZQV=T9>>J>jHetr3 zWPEC*WLk7SxH2H=PHvB*LKk3BwgJTubYV+=Ggdy|WlF zz~1@HR?NzKU{I2trd|3^wqWM3#KlLp9o<{oW&`RQ|*EpoEk(rAySxHCT+vywNQ;Uf9Bv3v7w zclh~d_nwQ?#RntaC2JY*NW9Y5?1zz)Zf))ujBEQd%83syXBJw}JI7y+0p*O@`ROen z4NN{5`2$p!@LscD-F(4zMX?VTVSd+<_s>TV*QVp-db*zWk`9u@qmhCe=<;^rt?jde zkU%K8Kv2qqaE$#jC+(M!t^1bG=n4`L(&~Go*!PMBm#%d|^EA_+Bs%q+gt*=z z{GgiC4$}G=c}?G>njWW`qPh)KU9YyiH)8eu%j$dG_ZR&6%Ho>A-V64U zGILN|00DjJEL_({*CDdL>wKS}rf}CKv}i+|7E=sOG^+PHWbDhO8e`9Anzj+?`+M*C zAR&o6ns}mou)Shi8yLbae)Bh^pitfgR4DceanDl&Z4)|an-G7tgZ2u=HX-dOglGk} z8LYln&Au19ZbC~~Z^^S0wWOvqz2n6&-ke_Y(mJy-KStiZrDGe@d0uZZ7->vnwgCfe zV$AS2r;=JrY}N~PVGhY%fgW^@P2qv+ca9d>5)7EqU> z>&DM*QKO5;kIs5pPBnMmfAM{z?a-%i-_u#e*r>v7mg^%o=P2G& z`lHx{H2My`I9=-aB8&^WoUd-q#L7``?C1@nv|ZjbGZE}bLMovyE3UQ%gOT3z0@)+VK<+3CvFkd#a#9Z)tPz_sL~7j#h6=tGmf-sO3?*jjPGq+U#})W=cptGxc~OS{;BrYgJ;x zs)WSURKTlM_=E9E9S_fFSZd0+c=X_c1YH8SFEK%%keF4Qnr6s^|4%UYAAkO_qW5o% zd+bX;JumsM-eLp$a+$ly?R7gE+&8+aTBtj84!yMrJ?*HWF`zhFTOAv6b-c~22V=%mq|~)Gx3wsaYEN@Ro7bhZI-1teTGd)z4ri;kiTI_&)!5v+K>_nM*YIJg)H>V^E~my9x-$a@I+XS9h6be?H3JT%wzauYsYQCFxxtC1T3TDtjOG?s6ODArLy-m=cEqMehYJNDG%jHFP+gMklzbj(^qEJKRkkV=Y>$#iAZ#6R6eYA_pTtQ5-yj z;%!AQcy!6xDZ149Mf&8ll=ei2_JtNzIGUWOyT^sm*Vg28)w-KpPJ?2vcPTCE_~b41 zc$-@c1!yXILd#&ldsS0gqedgT-&T7sX)Os;k}B{!~9lw?zL%La;~WaH#E7z{jZO^YH*EG?`s7L}G8trewaYbAD|`4g8< zA62I1b}PkODSjort)w?fVyUPotH_1mK}XiQT3t;w=mT$STMcBbiwdu4ZfqeAbh^=3 z6btHlThS$659P1$e<_V^9xri(r^Qv{u62W;uJ)D&ca7WIutCxBYUP1i)vi|1T`kuJ zhF84xjwU4ylycNHLN<6tF-Ve9-R2#yY!u{O?{YOMEe?092bH>^4K;B&uUFQB%hKJM ziM82=G%ljk3~BnsRDDBDGZ?N_2~1F%nqo+$!A@Dycpi5e2TvuggK+bVB6L)Hk`>YZ`JDT^hZ6@-P=+R!I}g&qooAI?c+4 z<~F6mVzk+=1_j(rYl#kC{BRPxooy}!^i^s=8;p!b#X)3fYpA6mT;1w+*149=pFh9J zL-^}ksuQor56Vu< ze?3&}dY8Md9{XiOem6f)#(xR1>Cj4K%(qgliRzkxm zr`IZ|H!GpjRAlhqO#Yj-(!RW+G@buu@ZT)tM5>jQ_6no5bY($Vsd*(7BKl`uY2>(p z=-zwid23mv$!JT>pkI_HNQvLM`4C-Yg`9&Z@c1&b#RhqX!u@IR(%qVGx0IBpRF)Om zd2Na%U2=kjYo1A@UillUYishZXDu zfjW8&9jaYT#GO;g&g;O{>7Z6rniSGf8m5LKfjDkV9WViVFeImlf@3fT)4|!?M$%x4 zh`>>N6yyc;W@V)+#y!gS`3z@JYG`^gjN2^Y2O4;R7#iCeyzZpxX6FVaJ*m~HKn2I# zIuVa1h%p;P$p8!)-ue&-zz;O=GAF{2IaLf<6Jf}j3I;A!f-um8oaCtiPhj4HU~AxW z!$gEYZ<3@6!axg4Pok0@l8AiWATVT%hhYj-BoqQeFdfu71kgaQOHOkn3z=>shEEcs zU(^1*8(Lg}Emj~3HMNLO;5A-VJ;EH&;=)V{)q&4E9$gyd&Du;uda_>NH??`2Yikuu zQyEGADg+@XIqJ!!GU$QcTnBBxR)OBt#N`3kTmtCN*R`J9;tfvd(XJ-&DIfPiIH?k( zHetPw=Fyy0ivCa3{^_*xP2t5l>Fa7U4Ah?w# z?_l}&zw>~B>jnQi4+uI0%q0I`ng`ZmmY-lE`2W#7K=RhVIwxxYL?B+R92k1t=}e zUMxLemC048GWf9<)0Wi5@aQz&rwLMl&~pw4sw)nmw?BIGbT! z@hXiD=* z4YwWo(HVsOEC~}l@g&lnkwV}p&VA%51(N9h86Vmh%Q%uRYF zDM`_523C*Got5a&S6VD)7?#XcCNP)Dh?R%QVj}xOMOA=pkjQ#hzTH}4vz9C`g$1Ju zXaupP%kwLZg%ZcTyUr|zNE-;B-Tw$UGb5O^JU(hf z5+zSjbB(?sKRzfiDI8jY61?$^qy|`gyowH{AAPPiYQ&h~L&jcJV6+#*o@6bt{=h=5 zRyUU_EyfB{aiyu!Y6d;bmQqVa(bZLEiwR9FTW&8Yv!wyxqry^%|3M+V^D${zWe3R$ zt=t}k_RPY8VpOuo0^3$E_Ve+smLc{8KtI?nELA0CW=n;oXt~W;vC?7%xlP3u)0IUP zMl-4ftCt=27b7-tjEXRYD)kO7GHRP)d0)?UXpux&>)HVOuoL5)9>H;>gVQbxnUlcU zT=bbR)LWYy3?-%#V~NRPDOqmgRfmDfRB6QjT>8Mo4hysxpeO~qW9uNBfro4+s4%Z) z73q0)OQpSJxyeZX%vYBZs4OWf1ARq6-e^c(S*fMUX0h8X6$M7ql@-QP@EoYNywXxt zX)#rmS6Ix{bkMk{w5+0}ikHIMqhNo742nt{iAabAr`u6SD{?Y%K^U~UAxrs&0W5lY z8cl*i7&Rh48FaZl8siJfsF3vaj&(4Ol3CadgF7(m(lH`n(BlErP1N>fO4&vL(8!(0ed&nVP6G%RAd5d;q!v12jq zThjUr2FeD$1t8|iT&i+Tdt#;|c}WiTPm=Wd!sfPCH*Cc<&92&7*!Ia@pG#vF1JGhO zrqHYQ7*n-3Kx10Khf)w2r6>gy$!FLMvZ-h4RAVkS#m>+pu&DsUHL)(YXL{UqjSd|s z=yg=p=y_EX*l~*kYC@m>^5|o8@XOxRwU!qW*qYZ^SU_Zt) zrp*F@h7PdEUn~U{jh4$lsbEt89f=jtItRAt&^UT{v$U2tQWvGBT&Lo2qy>B^)jY~y zST&ENPoimR{r3e?N$H_4y&k-e&07sIHp}qo&rKhrHFY%9xA-XpjGW#nHB`GGk*SmPpI<0LAyD4imB@j5UoI9Y6^B-4&#a6i!QV3N>8xCPL!hv<@NW=wBcggS{VJTK)IG&$A}dn_l10T&L9281ko} zlo|oge9`OM35NpK1^-gobY1NdjT|(uCuXB*uxaShGU-LHx1k!s*C54^f$-F_@PhXl$(X{By zL{Nh3)0r6Nw2KG+*AjsdpbZP!u;L8FnGWpi@;YUTtTZtaUo64Qh>=D! zBd?~kQr*%YC7CwC2luv^G@*KEPqq5uXsc`FuYRfsnqW2IRz)=4NIvrd$&d>tl6E}= z4)GnW3Lu11TDTk>JKvvaBh_Vap_W0yJ3~LZYbgejRJQ_59VF3z;KU0Z6ef75m}Jx-|Zqj$gDy$RBNFsCz`(mhUJr z$1GP{o4r`M`JK!rOy}RG83&{2x8U*v=9v&#gY%7*hZ7bzroEaF!xD$~boiEz*zVQ` zbO9-&!Q}<-2Z$WO8G_SOyZkG8OfjlA(u8!YGzB{o1tcsomYea}NL}XlH@iAtP%}PX zTmOmglg|q%b^raVDkbWMKjxp;(f#r-Z>z}f{yzuz-}|qxmSL4%MXohf5W}^=w@_VO z(JEP!HDEJZBy&`O@ni+!8xJ+KzEK^22pJrEwAFueQ(%tLGCQgN0l6@WphRP>k(!oB zWoW6DLZj72Yb~lECm+WT1-+HefLQmbO(QVs|MTph|Mu2<8{f{ObtCzV6_STk2|Bl` z6ifSD#o`7+@`;4S2-BXCi)(Llv*IBKKm*s|vCNc6XE#oReG2~~=v(t$qOBp-sfj33 zBn&X5IP#5rC%Nye$3%b$9qt=g?jR8!p*&T)>R|K$Z4HXa(L~lMkR8jhHWwU=csey$ zB_F2p=B6b0W41OpTBu8?mo%e|L9sT~fDJq@I7O@~wc2UfMy@Y}$c`p8I-20_#2vAS zl7V>x`iB>*{v22RsIKnL-Ij9Vt__yUMMPA$3iGk)54XnmjN&`KTkzX&mI=G$7n&ay z(rwn>Q@B4P)|Q4^kP*5^whnUv*%DQvCh3#8n1=?Jt*gx;rK{1=g4B4>BywHTTewpJ zn$$w=z`_%rQrzmr7jgbIs-o_*QQvA#AEQ1%K&7V`KVwt>U=~>j_QL`w$B~+;SKvJ= zR?WPL6Fa!-(o@I{733y+AhA6<%_C|pNz3x}$(wW!UOqf;nskaiuF_Gu97U5Ot(HvE zC6HsPBE&_KRx|iNW+WzX8wK2u+Q_%GxnUjJO9nGI7JzuXc9L}KI&1yDOPA*Tn!B5R zxy%cT4cN=?xiM;81EZ3uTJf~O*^94x$$Jp4G+vk_;O*qZCboMW`JiZK00qptjszoI z#N0IqAJVM{@6 zu}(-xv}Py@wHJ$A4}D^q9mkDTNl?%@IK@#Kg(pfteZdb-kHV2BkRupr3VcNp3=u&Q#^W7=+?W*HH`C?$5HF@Zh%RUo5Cm_97Ku`eE_ zS&GmJY8Oe8@@PJPS03#aVWr)U8x_tskTayMUXGS|YE-VMb2K(OQuDCn1x!;RHqQBX zMjoON3gRm_fa-ib=4U7AoOdf8D17h7%km#j%C6`+zO39*VIQ17Bfsru_YdtZwmxq= z@76zW`L=c0i7VQUZ{G0ja~~x;9#-B~o>$?r*B-9gX86I*{P?B6{`Q5uua_;~@$nUN zR=&7w`-3kpJXv?wvYL8V&06%b@UG=@l6C_~HVIP}Y;6XssVI;3&_Qx#h33Ge>RF{= zKX4PalEq_$?P&viYSn-WSA*GITZ@%x%B2eV>GJVUI+hc@;aMaz2(47XnVI%oxD>#& z06Y*4es^f3$%pJFEiJ&GI89fJF$=p5*Kwf}1y`QiFsTJ%A*eC0s~uKQ?SmFZs#%M) zQFR~|jSd7Q$g+chh3#}2Vx-YX)TAt~F_K?%GL~Bte(B+k%;yyDn+yU4P?>D4*io4T zmp+im>0NQQCp)?QK?mWI&Ryt}u@(?-Xi^ST*l{yq2cyn0ZVZNj*MZd+$CqKqO2%Rv z`0zFXK2Zy7^NdAD^>fxFJ2}QPBh^@B6az>qethq}r~Y>R>^G-wiEHjV)!JuvwM7$)##OR!ifg|pRYf#YF- zFWW@>veb(5@}MeDfI%7Gmn{JnZ1VUD)ryII7!q)jV=Aqf*q04;P+bTor^Cd)YzcIH z1hfp*3jYG-40;L-=8%*eyJ{Illwc_?F9=0Rjs3=j7pLUtb_SLN>|MdvG-NCI z%8A=6M(Zz-2@IM4V+>jUBMcUstt@nJ2Ce9l_@t^f2ffMt)o@nFv zvIz{K>2Rhmo91gv;{yE|l9J@phaCx5lD5RB1sW$qpFG&B;UaiLAfkljd_Q$eB~1REsByB4;cFV3 z*!T}_g%{=wc(tliIoHd?G;?y9&XJXvff*l$9hjB%P&QjzGx%>N|IOlu(j6#0K=&hn+jYc;yCUM{+muIQ(ZVYK(kqmw9;5n zYAr2-p|a7@ZV;AsD8k(N0LI7~oU3s;FN6LiPSLD|Jr1WM#Cnq)6!;>V??)n6t%0zw zY;A@X7r3G7Xu(M$Cto0?rE;}eUx$P>3jMZYspW81i{EzAiZXOuFG`~sRbS(7aeHp8 zxzQyW^zi``f6-w03*!4?6=tijQiV+_6g*JXQq|;Ij}suRv)bHazVeb9 zep=0UT3!EsyG;1|$oYZ~&Qsw9`EMTnuJVJ2^eSAOf9r{ZJD;7MFW^t}^MCfvm*sH} zR|?o$nU8wx`seghqMWV!^M6;jTUv@h(rHGYtMh}u`BjdLbRY3(c9E0Mul-KYJ9qfs zgZl?W`dKQ}zBPOrd|$=y8WHI=_`Lc(7HaV~tMNbnH{q)iHuLeMGg01OUZv-=WwF-c z>htnmSNq}XW%05|w@QUKt1xj4>`=eIixTOFr%erBq~?1_g=5Ppj}Uk?_@ieR^`)Pjn*v=Slw_>`4^qUt27o_PtBRr@?R3@1$grPJ=&GzsEu?-l)c3^>4zM zR8fv8MZgHOm#!7l!HkcM0r(B!r>T~<9a8IS6PI8Ux*ne7&e}v;8r5UVS$!A5?Ez*1 z+VD%SZ-g}kYe|o{1y)f#;Y}sHe#F2?h_Nuy5M#~bM~wF~5c7il_{fhTGto%~{=_tA z4lE1KY(pyf2RL9d;_noy%^l`-ny>k(r zR-*SM^-Y3uXO{OrqKD`dwH(kXu$;84dSQf7+LJJ+z-9@17|t#7#T@F9k*39qlLGMi zsBLQ!$8yI_pQEL3Pl9@Z6QKNn!Q|P{|D)yjPw`G#PI|gl4(*=8qQFn#jj2BHrh{L3 zTi`3-0GsQXbp~5gx@>#NeE#4YAQ+3`TW;>XN}$8b1ILp#yob0}4UY&I8huQ^Bf~ z#=!3|zyTHi}1eV6;))W;yaf9u>qtw@Zm3?8j_Ki32uTu*6Ii> zh%03^&D?NJLx;GY{Ii;H^2A-^F#rdrLtyrRicBFp`XddEqsJ{8g@e~n--F4`x85`A z>xlAtKjq1=ktRqFEa+8t6UKlC{$PB&12$0ZK;z*pU6L>4{hw{YPz(Qw8vnHluOjC> zJddmJ>;mzX}Y#XUMKNEZ03g_?<@)+wA3!1KHu3>}^goA}^^dV@h( zr{k`6^)$AesWkC`9R-?k+l2`dVnM~O=0N4ZZQ^6JeyCd0Iwy#w4qK{o07(d@89qAE@{p4RtDhv|GcU3I}r~O|Q{LWvO*o z?0|L`;vb#a#WIgSbMPBT$)qIm+2TyNt{QPg_@|}EIu`dW)JoSr*E|1vavxu3Y`$@S z{?Ko}dab0oTwUK-^N|J5oP2Fxwd?ag?)vV<-IwG3KRj=UbooEZhj%YesljUX`(_nx zRpF0S_?QZLCj88M_)k!UTWE>HpX9f~F27DXiN6^rp5MKe6;Wfu+b=s=zb3>}q8J_8B!?x&_=Qpe!d3ZPl!> zK)ZP+ae;y}c}`@2S%7=r3Bj>|?oy~Rz){$MI1!_TjR~abqi#bhQZ0e&Tr8=QE)9@l93km%>B1KNRhmEFha^aHa*qAT%}*$kT$u z1iFCo3oOA22op}ojtxYK=HM`F2;sDaN^FOYT9=)e#v93rm5IAjXm3LNrlo*1aLrdw z*z2sBiG`fj*0e-8#jZ+Bvyu*wz6#Uv=x25zRBrCjuP@S$Ua0$Z>b8vV!!YQUkPlP^ z_7X=QCx5lmrUrj2q767T+U()Jmx_@*I7L_irK1fd)R{X0V}gKpm>^ZA9tZx76;~>X z@P1bWXXzZ7G#8LlTPpb_@=i;1FByG-@boUBMTEZCVzaKoDIr=b2Is>C8`Rlj@^QI6 z20yT=NilhgJiv{sor*0Md%@`1GZ;UrHh#VUv8&QW07C6=3^sp)KB-=`JzZKhwjKX= zIm+Y(aRXb1*5W1P>c*+0udE~&d(+jGx&))WtOQ%kOR!0!n2clzG^Qt7VdYzum|jSp zy0k+$IzI%bFPJbrHge&PuSi8b z0?b`DiZr{jbmI?$5<643YoZA^xAP$@eR1I>tmm&yZaK_JYeqxguh z+*y=+{Od;}DwpF(N5ygz%;y$~$^j!96Rq&HNFXbt)x6w-5>l~0%NH67|4o30qk~SN zsghb9UZWeXYQ3%GsXJ!N7i%7I6i?H-YFcs52imQ07lCJvL6<#t)H~M+55RFoJ%)T0 zuFDe7nd4s!fA~I+W{`n@FeHDIJ%PDp|yQzh>0a+MTMAfWT%MX&Bq~l z1iZsL1`^z4G!>^8*{(L4;5SPT%&K%)yG&6^!Lq0h6$mA$6!>!$;h&`0k;rd}o&wd5 z&s9fkb_MK=D>(T=L{_gzf{Kj8H{6Am1{XGNX%Jve5v6i$+D}}*@bii3ZgugcGER+% zj?(4NvbAon=LQ2Dq}2Yy6+`ot zGFTxLctWJ4z?`Mp2KYJ2O6v-v*+OaN0|CtsTK{YKxI55)lUDuIlqPQ2O$Qvse6G+6j`W^l400fO^eD=dc5 z!?qqepohDcumI-XNbO21Zf(OcP_e~8F6{8k2kT-5jlm|;kUwh$wsOcNWU^|gX9a1F z^ZRe$-mnQANi=t#B>zQOq9!zwGa;>NQCF2nC?D&(b`og(KbLx$k;B{E=uv&T&?NP( zrWp%pIEETXqE41Cjg+Fa`b0%9+``BMP;t;9MVF&BLC;-ss;Ea$4R9�pSfjV-g?a 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

B; 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�VVL2BmwrteO2 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
X5N{ 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⩔qd(yN(V|Ao%%%Rf5uVGPSksFn8 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 z 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

$Ptgv}=4&R>(4*DypRtBim)BU1J|nNG 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%0DA2I14ZVpmHn7m;L^&DBo>7VhXsODcrIvn2WSa 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

t_8LJbhQx?^=gbImAScUS54^uBa_f+)* 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 BJ8C2`&5LB`o%3Uz@lXe@ExaD29FARj7nm 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

X=6SQS4xPp0B> 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� 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�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�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%0DxM0Q< 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%0D`4#rUngx9rXwWi#1oy6!U} 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%0D9jC83>~H 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

    L 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

    wQWh-jZDP^^FJ~B1j6>!@y6uEDO^JVw*{i$2 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 z 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 DY(I) +C USES UNROLLED LOOPS FOR INCREMENTS EQUAL ONE. +C JACK DONGARRA, LINPACK, 3/11/78. +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 + DTEMP = DX(IX) + DX(IX) = DY(IY) + DY(IY) = DTEMP + 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 + DTEMP = DX(I) + DX(I) = DY(I) + DY(I) = DTEMP + 30 CONTINUE + IF( N .LT. 3 ) RETURN + 40 MP1 = M + 1 + DO 50 I = MP1,N,3 + DTEMP = DX(I) + DX(I) = DY(I) + DY(I) = DTEMP + DTEMP = DX(I + 1) + DX(I + 1) = DY(I + 1) + DY(I + 1) = DTEMP + DTEMP = DX(I + 2) + DX(I + 2) = DY(I + 2) + DY(I + 2) = DTEMP + 50 CONTINUE + RETURN + END +C*MODULE BLAS1 *DECK IDAMAX + INTEGER FUNCTION IDAMAX(N,DX,INCX) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION DX(1) +C +C FINDS THE INDEX OF ELEMENT HAVING MAX. ABSOLUTE VALUE. +C JACK DONGARRA, LINPACK, 3/11/78. +C + IDAMAX = 0 + IF( N .LT. 1 ) RETURN + IDAMAX = 1 + IF(N.EQ.1)RETURN + IF(INCX.EQ.1)GO TO 20 +C +C CODE FOR INCREMENT NOT EQUAL TO 1 +C + IX = 1 + RMAX = ABS(DX(1)) + IX = IX + INCX + DO 10 I = 2,N + IF(ABS(DX(IX)).LE.RMAX) GO TO 5 + IDAMAX = I + RMAX = ABS(DX(IX)) + 5 IX = IX + INCX + 10 CONTINUE + RETURN +C +C CODE FOR INCREMENT EQUAL TO 1 +C + 20 RMAX = ABS(DX(1)) + DO 30 I = 2,N + IF(ABS(DX(I)).LE.RMAX) GO TO 30 + IDAMAX = I + RMAX = ABS(DX(I)) + 30 CONTINUE + RETURN + END +C*MODULE BLAS *DECK DGEMV + SUBROUTINE DGEMV(FORMA,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + CHARACTER*1 FORMA + DIMENSION A(LDA,*),X(*),Y(*) + PARAMETER (ZERO=0.0D+00, ONE=1.0D+00) +C +C CLONE OF -DGEMV- WRITTEN BY MIKE SCHMIDT +C + LOCY = 1 + IF(FORMA.EQ.'T') GO TO 200 +C +C Y = ALPHA * A * X + BETA * Y +C + IF(ALPHA.EQ.ONE .AND. BETA.EQ.ZERO) THEN + DO 110 I=1,M + Y(LOCY) = DDOT(N,A(I,1),LDA,X,INCX) + LOCY = LOCY+INCY + 110 CONTINUE + ELSE + DO 120 I=1,M + Y(LOCY) = ALPHA*DDOT(N,A(I,1),LDA,X,INCX) + BETA*Y(LOCY) + LOCY = LOCY+INCY + 120 CONTINUE + END IF + RETURN +C +C Y = ALPHA * A-TRANSPOSE * X + BETA * Y +C + 200 CONTINUE + IF(ALPHA.EQ.ONE .AND. BETA.EQ.ZERO) THEN + DO 210 I=1,N + Y(LOCY) = DDOT(M,A(1,I),1,X,INCX) + LOCY = LOCY+INCY + 210 CONTINUE + ELSE + DO 220 I=1,N + Y(LOCY) = ALPHA*DDOT(M,A(1,I),1,X,INCX) + BETA*Y(LOCY) + LOCY = LOCY+INCY + 220 CONTINUE + END IF + RETURN + END diff --git a/source/unres/src_Eshel/SRC-SURPLUS/check_sc_distr.f b/source/unres/src_Eshel/SRC-SURPLUS/check_sc_distr.f new file mode 100644 index 0000000..db2ed1b --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/check_sc_distr.f @@ -0,0 +1,43 @@ + subroutine check_sc_distr + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.TIME1' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + logical fail + double precision varia(maxvar) + double precision hrtime,mintime,sectime + parameter (MaxSample=10000000,delt=1.0D0/MaxSample) + dimension prob(0:72,0:90) + dV=2.0D0*5.0D0*deg2rad*deg2rad + print *,'dv=',dv + do 10 it=1,1 + if (it.eq.10) goto 10 + open (20,file=restyp(it)//'_distr.sdc',status='unknown') + call gen_side(it,90.0D0*deg2rad,al,om,fail) + close (20) + goto 10 + open (20,file=restyp(it)//'_distr1.sdc',status='unknown') + do i=0,90 + do j=0,72 + prob(j,i)=0.0D0 + enddo + enddo + do isample=1,MaxSample + call gen_side(it,90.0D0*deg2rad,al,om) + indal=rad2deg*al/2 + indom=(rad2deg*om+180.0D0)/5 + prob(indom,indal)=prob(indom,indal)+delt + enddo + do i=45,90 + do j=0,72 + write (20,'(2f10.3,1pd15.5)') 2*i+0.0D0,5*j-180.0D0, + & prob(j,i)/dV + enddo + enddo + 10 continue + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/compare_s1.F b/source/unres/src_Eshel/SRC-SURPLUS/compare_s1.F new file mode 100644 index 0000000..300e7ed --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/compare_s1.F @@ -0,0 +1,188 @@ + subroutine compare_s1(n_thr,num_thread_save,energyx,x, + & icomp,enetbss,coordss,rms_d,modif,iprint) +C This subroutine compares the new conformation, whose variables are in X +C with the previously accumulated conformations whose energies and variables +C are stored in ENETBSS and COORDSS, respectively. The meaning of other +C variables is as follows: +C +C N_THR - on input the previous # of accumulated confs, on output the current +C # of accumulated confs. +C N_REPEAT - an array that indicates how many times the structure has already +C been used to start the reversed-reversing procedure. Addition of +C a new structure replacement of a structure with a similar, but +C lower-energy structure resets the respective entry in N_REPEAT to zero +C I9 - output unit +C ENERGYX,X - the energy and variables of the new conformations. +C ICOMP - comparison result: +C 0 - the new structure is similar to one of the previous ones and does +C not have a remarkably lower energy and is therefore rejected; +C 1 - the new structure is different and is added to the set, because +C there is still room in the COORDSS and ENETBSS arrays; +C 2 - the new structure is different, but higher in energy than any +C previous one and is therefore rejected +C 3 - there is no more room in the COORDSS and ENETBSS arrays, but +C the new structure is lower in energy than at least the highest- +C energy previous structure and therefore replaces it. +C 9 - the new structure is similar to a number of previous structures, +C but has a remarkably lower energy than any of them; therefore +C replaces all these structures; +C MODIF - a logical variable that shows whether to include the new structure +C in the set of accumulated structures + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' +crc include 'COMMON.DEFORM' + include 'COMMON.IOUNITS' +#ifdef UNRES + include 'COMMON.CHAIN' +#endif + + dimension x(maxvar) + dimension x1(maxvar) + double precision przes(3),obrot(3,3) + integer list(max_thread) + logical non_conv,modif + double precision enetbss(max_threadss) + double precision coordss(maxvar,max_threadss) + + nlist=0 +#ifdef UNRES + call var_to_geom(nvar,x) + call chainbuild + do k=1,2*nres + do kk=1,3 + cref(kk,k)=c(kk,k) + enddo + enddo +#endif +c write(iout,*)'*ene=',energyx + j=0 + enex_jp=-1.0d+99 + do i=1,n_thr + do k=1,nvar + x1(k)=coordss(k,i) + enddo + if (iprint.gt.3) then + write (iout,*) 'Compare_ss, i=',i + write (iout,*) 'New structure Energy:',energyx + write (iout,'(10f8.3)') (rad2deg*x(k),k=1,nvar) + write (iout,*) 'Template structure Energy:',enetbss(i) + write (iout,'(10f8.3)') (rad2deg*x1(k),k=1,nvar) + endif + +#ifdef UNRES + call var_to_geom(nvar,x1) + call chainbuild +cd write(iout,*)'C and CREF' +cd write(iout,'(i5,3f10.5,5x,3f10.5)')(k,(c(j,k),j=1,3), +cd & (cref(j,k),j=1,3),k=1,nres) + call fitsq(roznica,c(1,1),cref(1,1),nres,przes,obrot,non_conv) + if (non_conv) then + print *,'Problems in FITSQ!!!' + print *,'X' + print '(10f8.3)',(x(k),k=1,nvar) + print *,'X1' + print '(10f8.3)',(x1(k),k=1,nvar) + print *,'C and CREF' + print '(i5,3f10.5,5x,3f10.5)',(k,(c(j,k),j=1,3), + & (cref(j,k),j=1,3),k=1,nres) + endif + roznica=dsqrt(dabs(roznica)) + iresult = 1 + if (roznica.lt.rms_d) iresult = 0 +#else + energyy=enetbss(i) + call cmprs(x,x1,roznica,energyx,energyy,iresult) +#endif + if (iprint.gt.1) write(iout,'(i5,f10.6,$)') i,roznica +c print '(i5,f8.3)',i,roznica + if(iresult.eq.0) then + nlist = nlist + 1 + list(nlist)=i + if (iprint.gt.1) write(iout,*) + if(energyx.ge.enetbss(i)) then + if (iprint.gt.1) + & write(iout,*)'s*>> structure rejected - same as nr ',i, + & ' RMS',roznica + minimize_s_flag=0 + icomp=0 + go to 1106 + endif + endif + if(energyx.lt.enetbss(i).and.enex_jp.lt.enetbss(i))then + j=i + enex_jp=enetbss(i) + endif + enddo + if (iprint.gt.1) write(iout,*) + if(nlist.gt.0) then + if (modif) then + if (iprint.gt.1) + & write(iout,'(a,i3,$)')'s*>> structure accepted1 - repl nr ', + & list(1) + else + if (iprint.gt.1) + & write(iout,'(a,i3)') + & 's*>> structure accepted1 - would repl nr ',list(1) + endif + icomp=9 + if (.not. modif) goto 1106 + j=list(1) + enetbss(j)=energyx + do i=1,nvar + coordss(i,j)=x(i) + enddo + do j=2,nlist + if (iprint.gt.1) write(iout,'(i3,$)')list(j) + do kk=list(j)+1,nlist + enetbss(kk-1)=enetbss(kk) + do i=1,nvar + coordss(i,kk-1)=coordss(i,kk) + enddo + enddo + enddo + if (iprint.gt.1) write(iout,*) + go to 1106 + endif + if(n_thr.lt.num_thread_save) then + icomp=1 + if (modif) then + if (iprint.gt.1) + & write(iout,*)'s*>> structure accepted - add with nr ',n_thr+1 + else + if (iprint.gt.1) + & write(iout,*)'s*>> structure accepted - would add with nr ', + & n_thr+1 + goto 1106 + endif + n_thr=n_thr+1 + enetbss(n_thr)=energyx + do i=1,nvar + coordss(i,n_thr)=x(i) + enddo + else + if(j.eq.0) then + if (iprint.gt.1) + & write(iout,*)'s*>> structure rejected - too high energy' + icomp=2 + go to 1106 + end if + icomp=3 + if (modif) then + if (iprint.gt.1) + & write(iout,*)'s*>> structure accepted - repl nr ',j + else + if (iprint.gt.1) + & write(iout,*)'s*>> structure accepted - would repl nr ',j + goto 1106 + endif + enetbss(j)=energyx + do i=1,nvar + coordss(i,j)=x(i) + enddo + end if + +1106 continue + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/eigen.f b/source/unres/src_Eshel/SRC-SURPLUS/eigen.f new file mode 100644 index 0000000..e4088ee --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/eigen.f @@ -0,0 +1,2351 @@ +C 10 AUG 94 - MWS - INCREASE NUMBER OF DAF RECORDS +C 31 MAR 94 - MWS - ADD A VARIABLE TO END OF MACHSW COMMON +C 26 JUN 93 - MWS - ETRED3: ADD RETURN FOR SPECIAL CASE N=1 +C 4 JAN 92 - TLW - MAKE WRITES PARALLEL;ADD COMMON PAR +C 30 AUG 91 - MWS - JACDIA: LIMIT ITERATIONS, USE EPSLON IN TEST. +C 14 JUL 91 - MWS - JACOBI DIAGONALIZATION ALLOWS FOR LDVEC.NE.N +C 29 JAN 91 - TLW - GLDIAG: CHANGED COMMON DIAGSW TO MACHSW +C 29 OCT 90 - STE - FIX JACDIA UNDEFINED VARIABLE BUG +C 14 SEP 90 - MK - NEW JACOBI DIAGONALIZATION (KDIAG=3) +C 27 MAR 88 - MWS - ALLOW FOR VECTOR ROUTINE IN GLDIAG +C 11 AUG 87 - MWS - SANITIZE CONSTANTS IN EQLRAT +C 15 FEB 87 - STE - FIX EINVIT SUB-MATRIX LOOP LIMIT +C SCRATCH ARRAYS ARE N*8 REAL AND N INTEGER +C 8 DEC 86 - STE - USE PERF INDEX FROM ESTPI1 TO JUDGE EINVIT FAILURE +C 30 NOV 86 - STE - DELETE LIGENB, MAKE EVVRSP DEFAULT +C (GIVEIS FAILS ON CRAY FOR BENCHMC AND BENCHCI) +C 7 JUL 86 - JAB - SANITIZE FLOATING POINT CONSTANTS +C 11 OCT 85 - STE - LIGENB,TQL2: USE DROT,DSWAP; TINVTB: SCALE VECTOR +C BEFORE NORMALIZING; GENERIC FUNCTIONS +C 24 FEB 84 - STE - INITIALIZE INDEX ARRAY FOR LIGENB IN GLDIAG +C 1 DEC 83 - STE - CHANGE MACHEP FROM 2**-54 TO 2**-50 +C 28 SEP 82 - MWS - CONVERT TO IBM +C +C*MODULE EIGEN *DECK EINVIT + SUBROUTINE EINVIT(NM,N,D,E,E2,M,W,IND,Z,IERR,RV1,RV2,RV3,RV4,RV6) +C* +C* AUTHORS- +C* THIS IS A MODIFICATION OF TINVIT FROM EISPACK EDITION 3 +C* DATED AUGUST 1983. +C* TINVIT IS A TRANSLATION OF THE INVERSE ITERATION TECHNIQUE +C* IN THE ALGOL PROCEDURE TRISTURM BY PETERS AND WILKINSON. +C* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971). +C* THIS VERSION IS BY S. T. ELBERT (AMES LABORATORY-USDOE) +C* +C* PURPOSE - +C* THIS ROUTINE FINDS THOSE EIGENVECTORS OF A TRIDIAGONAL +C* SYMMETRIC MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES. +C* +C* METHOD - +C* INVERSE ITERATION. +C* +C* ON ENTRY - +C* NM - INTEGER +C* MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL +C* ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE +C* DIMENSION STATEMENT. +C* N - INTEGER +C* D - W.P. REAL (N) +C* CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. +C* E - W.P. REAL (N) +C* CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX +C* IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY. +C* E2 - W.P. REAL (N) +C* CONTAINS THE SQUARES OF CORRESPONDING ELEMENTS OF E, +C* WITH ZEROS CORRESPONDING TO NEGLIGIBLE ELEMENTS OF E. +C* E(I) IS CONSIDERED NEGLIGIBLE IF IT IS NOT LARGER THAN +C* THE PRODUCT OF THE RELATIVE MACHINE PRECISION AND THE +C* SUM OF THE MAGNITUDES OF D(I) AND D(I-1). E2(1) MUST +C* CONTAIN 0.0 IF THE EIGENVALUES ARE IN ASCENDING ORDER, +C* OR 2.0 IF THE EIGENVALUES ARE IN DESCENDING ORDER. +C* IF TQLRAT, BISECT, TRIDIB, OR IMTQLV +C* HAS BEEN USED TO FIND THE EIGENVALUES, THEIR +C* OUTPUT E2 ARRAY IS EXACTLY WHAT IS EXPECTED HERE. +C* M - INTEGER +C* THE NUMBER OF SPECIFIED EIGENVECTORS. +C* W - W.P. REAL (M) +C* CONTAINS THE M EIGENVALUES IN ASCENDING +C* OR DESCENDING ORDER. +C* IND - INTEGER (M) +C* CONTAINS IN FIRST M POSITIONS THE SUBMATRIX INDICES +C* ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W -- +C* 1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX +C* FROM THE TOP, 2 FOR THOSE BELONGING TO THE SECOND +C* SUBMATRIX, ETC. +C* IERR - INTEGER (LOGICAL UNIT NUMBER) +C* LOGICAL UNIT FOR ERROR MESSAGES +C* +C* ON EXIT - +C* ALL INPUT ARRAYS ARE UNALTERED. +C* Z - W.P. REAL (NM,M) +C* CONTAINS THE ASSOCIATED SET OF ORTHONORMAL +C* EIGENVECTORS. ANY VECTOR WHICH WHICH FAILS TO CONVERGE +C* IS LEFT AS IS (BUT NORMALIZED) WHEN ITERATING STOPPED. +C* IERR - INTEGER +C* SET TO +C* ZERO FOR NORMAL RETURN, +C* -R IF THE EIGENVECTOR CORRESPONDING TO THE R-TH +C* EIGENVALUE FAILS TO CONVERGE IN 5 ITERATIONS. +C* (ONLY LAST FAILURE TO CONVERGE IS REPORTED) +C* +C* RV1, RV2, RV3, RV4, AND RV6 ARE TEMPORARY STORAGE ARRAYS. +C* +C* RV1 - W.P. REAL (N) +C* DIAGONAL ELEMENTS OF U FROM LU DECOMPOSITION +C* RV2 - W.P. REAL (N) +C* SUPER(1)-DIAGONAL ELEMENTS OF U FROM LU DECOMPOSITION +C* RV3 - W.P. REAL (N) +C* SUPER(2)-DIAGONAL ELEMENTS OF U FROM LU DECOMPOSITION +C* RV4 - W.P. REAL (N) +C* ELEMENTS DEFINING L IN LU DECOMPOSITION +C* RV6 - W.P. REAL (N) +C* APPROXIMATE EIGENVECTOR +C* +C* DIFFERENCES FROM EISPACK 3 - +C* EPS3 IS SCALED BY EPSCAL (ENHANCES CONVERGENCE, BUT +C* LOWERS ACCURACY)! +C* ONE MORE ITERATION (MINIMUM 2) IS PERFORMED AFTER CONVERGENCE +C* (ENHANCES ACCURACY)! +C* REPLACE LOOP WITH PYTHAG WITH SINGLE CALL TO DNRM2! +C* IF NOT CONVERGED, USE PERFORMANCE INDEX TO DECIDE ON ERROR +C* VALUE SETTING, BUT DO NOT STOP! +C* L.U. FOR ERROR MESSAGES PASSED THROUGH IERR +C* USE PARAMETER STATEMENTS AND GENERIC INTRINSIC FUNCTIONS +C* USE LEVEL 1 BLAS +C* USE IF-THEN-ELSE TO CLARIFY LOGIC +C* LOOP OVER SUBSPACES MADE INTO DO LOOP. +C* LOOP OVER INVERSE ITERATIONS MADE INTO DO LOOP +C* ZERO ONLY REQUIRED PORTIONS OF OUTPUT VECTOR +C* +C* NOTE - +C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO +C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB. +C* +C + LOGICAL CONVGD,GOPARR,DSKWRK,MASWRK +C + INTEGER GROUP,I,IERR,ITS,J,JJ,M,N,NM,P,Q,R,S,SUBMAT,TAG + INTEGER IND(M) +C + DOUBLE PRECISION D(N),E(N),E2(N),W(M),Z(NM,M) + DOUBLE PRECISION RV1(N),RV2(N),RV3(N),RV4(N),RV6(N) + DOUBLE PRECISION ANORM,EPS2,EPS3,EPS4,NORM,ORDER,RHO,U,UK,V + DOUBLE PRECISION X0,X1,XU + DOUBLE PRECISION EPSCAL,GRPTOL,HUNDRD,ONE,TEN,ZERO + DOUBLE PRECISION EPSLON, ESTPI1, DASUM, DDOT, DNRM2 +C + COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK +C + PARAMETER (ZERO = 0.0D+00, ONE = 1.0D+00, GRPTOL = 0.001D+00) + PARAMETER (EPSCAL = 0.5D+00, HUNDRD = 100.0D+00, TEN = 10.0D+00) +C + 001 FORMAT(' EIGENVECTOR ROUTINE EINVIT DID NOT CONVERGE FOR VECTOR' + * ,I5,'. NORM =',1P,E10.2,' PERFORMANCE INDEX =',E10.2/ + * ' (AN ERROR HALT WILL OCCUR IF THE PI IS GREATER THAN 100)') +C +C----------------------------------------------------------------------- +C + LUEMSG = IERR + IERR = 0 + X0 = ZERO + UK = ZERO + NORM = ZERO + EPS2 = ZERO + EPS3 = ZERO + EPS4 = ZERO + GROUP = 0 + TAG = 0 + ORDER = ONE - E2(1) + Q = 0 + DO 930 SUBMAT = 1, N + P = Q + 1 +C +C .......... ESTABLISH AND PROCESS NEXT SUBMATRIX .......... +C + DO 120 Q = P, N-1 + IF (E2(Q+1) .EQ. ZERO) GO TO 140 + 120 CONTINUE + Q = N +C +C .......... FIND VECTORS BY INVERSE ITERATION .......... +C + 140 CONTINUE + TAG = TAG + 1 + ANORM = ZERO + S = 0 +C + DO 920 R = 1, M + IF (IND(R) .NE. TAG) GO TO 920 + ITS = 1 + X1 = W(R) + IF (S .NE. 0) GO TO 510 +C +C .......... CHECK FOR ISOLATED ROOT .......... +C + XU = ONE + IF (P .EQ. Q) THEN + RV6(P) = ONE + CONVGD = .TRUE. + GO TO 860 +C + END IF + NORM = ABS(D(P)) + DO 500 I = P+1, Q + NORM = MAX( NORM, ABS(D(I)) + ABS(E(I)) ) + 500 CONTINUE +C +C .......... EPS2 IS THE CRITERION FOR GROUPING, +C EPS3 REPLACES ZERO PIVOTS AND EQUAL +C ROOTS ARE MODIFIED BY EPS3, +C EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW ......... +C + EPS2 = GRPTOL * NORM + EPS3 = EPSCAL * EPSLON(NORM) + UK = Q - P + 1 + EPS4 = UK * EPS3 + UK = EPS4 / SQRT(UK) + S = P + GROUP = 0 + GO TO 520 +C +C .......... LOOK FOR CLOSE OR COINCIDENT ROOTS .......... +C + 510 IF (ABS(X1-X0) .GE. EPS2) THEN +C +C ROOTS ARE SEPERATE +C + GROUP = 0 + ELSE +C +C ROOTS ARE CLOSE +C + GROUP = GROUP + 1 + IF (ORDER * (X1 - X0) .LE. EPS3) X1 = X0 + ORDER * EPS3 + END IF +C +C .......... ELIMINATION WITH INTERCHANGES AND +C INITIALIZATION OF VECTOR .......... +C + 520 CONTINUE +C + U = D(P) - X1 + V = E(P+1) + RV6(P) = UK + DO 550 I = P+1, Q + RV6(I) = UK + IF (ABS(E(I)) .GT. ABS(U)) THEN +C +C EXCHANGE ROWS BEFORE ELIMINATION +C +C *** WARNING -- A DIVIDE CHECK MAY OCCUR HERE IF +C E2 ARRAY HAS NOT BEEN SPECIFIED CORRECTLY ....... +C + XU = U / E(I) + RV4(I) = XU + RV1(I-1) = E(I) + RV2(I-1) = D(I) - X1 + RV3(I-1) = E(I+1) + U = V - XU * RV2(I-1) + V = -XU * RV3(I-1) +C + ELSE +C +C STRAIGHT ELIMINATION +C + XU = E(I) / U + RV4(I) = XU + RV1(I-1) = U + RV2(I-1) = V + RV3(I-1) = ZERO + U = D(I) - X1 - XU * V + V = E(I+1) + END IF + 550 CONTINUE +C + IF (ABS(U) .LE. EPS3) U = EPS3 + RV1(Q) = U + RV2(Q) = ZERO + RV3(Q) = ZERO +C +C DO INVERSE ITERATIONS +C + CONVGD = .FALSE. + DO 800 ITS = 1, 5 + IF (ITS .EQ. 1) GO TO 600 +C +C .......... FORWARD SUBSTITUTION .......... +C + IF (NORM .EQ. ZERO) THEN + RV6(S) = EPS4 + S = S + 1 + IF (S .GT. Q) S = P + ELSE + XU = EPS4 / NORM + CALL DSCAL (Q-P+1, XU, RV6(P), 1) + END IF +C +C ... ELIMINATION OPERATIONS ON NEXT VECTOR +C + DO 590 I = P+1, Q + U = RV6(I) +C +C IF RV1(I-1) .EQ. E(I), A ROW INTERCHANGE +C WAS PERFORMED EARLIER IN THE +C TRIANGULARIZATION PROCESS .......... +C + IF (RV1(I-1) .EQ. E(I)) THEN + U = RV6(I-1) + RV6(I-1) = RV6(I) + ELSE + U = RV6(I) + END IF + RV6(I) = U - RV4(I) * RV6(I-1) + 590 CONTINUE + 600 CONTINUE +C +C .......... BACK SUBSTITUTION +C + RV6(Q) = RV6(Q) / RV1(Q) + V = U + U = RV6(Q) + NORM = ABS(U) + DO 620 I = Q-1, P, -1 + RV6(I) = (RV6(I) - U * RV2(I) - V * RV3(I)) / RV1(I) + V = U + U = RV6(I) + NORM = NORM + ABS(U) + 620 CONTINUE + IF (GROUP .EQ. 0) GO TO 700 +C +C ....... ORTHOGONALIZE WITH RESPECT TO PREVIOUS +C MEMBERS OF GROUP .......... +C + J = R + DO 680 JJ = 1, GROUP + 630 J = J - 1 + IF (IND(J) .NE. TAG) GO TO 630 + CALL DAXPY(Q-P+1, -DDOT(Q-P+1,RV6(P),1,Z(P,J),1), + * Z(P,J),1,RV6(P),1) + 680 CONTINUE + NORM = DASUM(Q-P+1, RV6(P), 1) + 700 CONTINUE +C + IF (CONVGD) GO TO 840 + IF (NORM .GE. ONE) CONVGD = .TRUE. + 800 CONTINUE +C +C .......... NORMALIZE SO THAT SUM OF SQUARES IS +C 1 AND EXPAND TO FULL ORDER .......... +C + 840 CONTINUE +C + XU = ONE / DNRM2(Q-P+1,RV6(P),1) +C + 860 CONTINUE + DO 870 I = 1, P-1 + Z(I,R) = ZERO + 870 CONTINUE + DO 890 I = P,Q + Z(I,R) = RV6(I) * XU + 890 CONTINUE + DO 900 I = Q+1, N + Z(I,R) = ZERO + 900 CONTINUE +C + IF (.NOT.CONVGD) THEN + RHO = ESTPI1(Q-P+1,X1,D(P),E(P),Z(P,R),ANORM) + IF (RHO .GE. TEN .AND. LUEMSG .GT. 0 .AND. MASWRK) + * WRITE(LUEMSG,001) R,NORM,RHO +C +C *** SET ERROR -- NON-CONVERGED EIGENVECTOR .......... +C + IF (RHO .GT. HUNDRD) IERR = -R + END IF +C + X0 = X1 + 920 CONTINUE +C + IF (Q .EQ. N) GO TO 940 + 930 CONTINUE + 940 CONTINUE + RETURN + END +C*MODULE EIGEN *DECK ELAUM + SUBROUTINE ELAU(HINV,L,D,A,E) +C + DOUBLE PRECISION A(*) + DOUBLE PRECISION D(L) + DOUBLE PRECISION E(L) + DOUBLE PRECISION F + DOUBLE PRECISION G + DOUBLE PRECISION HALF + DOUBLE PRECISION HH + DOUBLE PRECISION HINV + DOUBLE PRECISION ZERO +C + PARAMETER (ZERO = 0.0D+00, HALF = 0.5D+00) +C + JL = L + E(1) = A(1) * D(1) + JK = 2 + DO 210 J = 2, JL + F = D(J) + G = ZERO + JM1 = J - 1 +C + DO 200 K = 1, JM1 + G = G + A(JK) * D(K) + E(K) = E(K) + A(JK) * F + JK = JK + 1 + 200 CONTINUE +C + E(J) = G + A(JK) * F + JK = JK + 1 + 210 CONTINUE +C +C .......... FORM P .......... +C + F = ZERO + DO 245 J = 1, L + E(J) = E(J) * HINV + F = F + E(J) * D(J) + 245 CONTINUE +C +C .......... FORM Q .......... +C + HH = F * HALF * HINV + DO 250 J = 1, L + 250 E(J) = E(J) - HH * D(J) +C + RETURN + END +C*MODULE EIGEN *DECK EPSLON + DOUBLE PRECISION FUNCTION EPSLON (X) +C* +C* AUTHORS - +C* THIS ROUTINE WAS TAKEN FROM EISPACK EDITION 3 DATED 4/6/83 +C* THIS VERSION IS BY S. T. ELBERT, AMES LABORATORY-USDOE NOV 1986 +C* +C* PURPOSE - +C* ESTIMATE UNIT ROUNDOFF IN QUANTITIES OF SIZE X. +C* +C* ON ENTRY - +C* X - WORKING PRECISION REAL +C* VALUES TO FIND EPSLON FOR +C* +C* ON EXIT - +C* EPSLON - WORKING PRECISION REAL +C* SMALLEST POSITIVE VALUE SUCH THAT X+EPSLON .NE. ZERO +C* +C* QUALIFICATIONS - +C* THIS ROUTINE SHOULD PERFORM PROPERLY ON ALL SYSTEMS +C* SATISFYING THE FOLLOWING TWO ASSUMPTIONS, +C* 1. THE BASE USED IN REPRESENTING FLOATING POINT +C* NUMBERS IS NOT A POWER OF THREE. +C* 2. THE QUANTITY A IN STATEMENT 10 IS REPRESENTED TO +C* THE ACCURACY USED IN FLOATING POINT VARIABLES +C* THAT ARE STORED IN MEMORY. +C* THE STATEMENT NUMBER 10 AND THE GO TO 10 ARE INTENDED TO +C* FORCE OPTIMIZING COMPILERS TO GENERATE CODE SATISFYING +C* ASSUMPTION 2. +C* UNDER THESE ASSUMPTIONS, IT SHOULD BE TRUE THAT, +C* A IS NOT EXACTLY EQUAL TO FOUR-THIRDS, +C* B HAS A ZERO FOR ITS LAST BIT OR DIGIT, +C* C IS NOT EXACTLY EQUAL TO ONE, +C* EPS MEASURES THE SEPARATION OF 1.0 FROM +C* THE NEXT LARGER FLOATING POINT NUMBER. +C* THE DEVELOPERS OF EISPACK WOULD APPRECIATE BEING INFORMED +C* ABOUT ANY SYSTEMS WHERE THESE ASSUMPTIONS DO NOT HOLD. +C* +C* DIFFERENCES FROM EISPACK 3 - +C* USE IS MADE OF PARAMETER STATEMENTS AND INTRINSIC FUNCTIONS +C* --NO EXECUTEABLE CODE CHANGES-- +C* +C* NOTE - +C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO +C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB. +C + DOUBLE PRECISION A,B,C,EPS,X + DOUBLE PRECISION ZERO, ONE, THREE, FOUR +C + PARAMETER (ZERO=0.0D+00, ONE=1.0D+00, THREE=3.0D+00, FOUR=4.0D+00) +C +C----------------------------------------------------------------------- +C + A = FOUR/THREE + 10 B = A - ONE + C = B + B + B + EPS = ABS(C - ONE) + IF (EPS .EQ. ZERO) GO TO 10 + EPSLON = EPS*ABS(X) + RETURN + END +C*MODULE EIGEN *DECK EQLRAT + SUBROUTINE EQLRAT(N,DIAG,E,E2IN,D,IND,IERR,E2) +C* +C* AUTHORS - +C* THIS IS A MODIFICATION OF ROUTINE EQLRAT FROM EISPACK EDITION 3 +C* DATED AUGUST 1983. +C* TQLRAT IS A TRANSLATION OF THE ALGOL PROCEDURE TQLRAT, +C* ALGORITHM 464, COMM. ACM 16, 689(1973) BY REINSCH. +C* THIS VERSION IS BY S. T. ELBERT (AMES LABORATORY-USDOE) +C* +C* PURPOSE - +C* THIS ROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC +C* TRIDIAGONAL MATRIX +C* +C* METHOD - +C* RATIONAL QL +C* +C* ON ENTRY - +C* N - INTEGER +C* THE ORDER OF THE MATRIX. +C* D - W.P. REAL (N) +C* CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. +C* E2 - W.P. REAL (N) +C* CONTAINS THE SQUARES OF THE SUBDIAGONAL ELEMENTS OF +C* THE INPUT MATRIX IN ITS LAST N-1 POSITIONS. +C* E2(1) IS ARBITRARY. +C* +C* ON EXIT - +C* D - W.P. REAL (N) +C* CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN +C* ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND +C* ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE +C* THE SMALLEST EIGENVALUES. +C* E2 - W.P. REAL (N) +C* DESTROYED. +C* IERR - INTEGER +C* SET TO +C* ZERO FOR NORMAL RETURN, +C* J IF THE J-TH EIGENVALUE HAS NOT BEEN +C* DETERMINED AFTER 30 ITERATIONS. +C* +C* DIFFERENCES FROM EISPACK 3 - +C* G=G+B INSTEAD OF IF(G.EQ.0) G=B ; B=B/4 +C* F77 BACKWARD LOOPS INSTEAD OF F66 CONSTRUCT +C* GENERIC INTRINSIC FUNCTIONS +C* ARRARY IND ADDED FOR USE BY EINVIT +C* +C* NOTE - +C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO +C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB. +C + INTEGER I,J,L,M,N,II,L1,IERR + INTEGER IND(N) +C + DOUBLE PRECISION D(N),E(N),E2(N),DIAG(N),E2IN(N) + DOUBLE PRECISION B,C,F,G,H,P,R,S,T,EPSLON + DOUBLE PRECISION SCALE,ZERO,ONE +C + PARAMETER (ZERO = 0.0D+00, SCALE= 1.0D+00/64.0D+00, ONE = 1.0D+00) +C +C----------------------------------------------------------------------- + IERR = 0 + D(1)=DIAG(1) + IND(1) = 1 + K = 0 + ITAG = 0 + IF (N .EQ. 1) GO TO 1001 +C + DO 100 I = 2, N + D(I)=DIAG(I) + 100 E2(I-1) = E2IN(I) +C + F = ZERO + T = ZERO + B = EPSLON(ONE) + C = B *B + B = B * SCALE + E2(N) = ZERO +C + DO 290 L = 1, N + H = ABS(D(L)) + ABS(E(L)) + IF (T .GE. H) GO TO 105 + T = H + B = EPSLON(T) + C = B * B + B = B * SCALE + 105 CONTINUE +C .......... LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT .......... + M = L - 1 + 110 M = M + 1 + IF (E2(M) .GT. C) GO TO 110 +C .......... E2(N) IS ALWAYS ZERO, SO THERE IS AN EXIT +C FROM THE LOOP .......... +C + IF (M .LE. K) GO TO 125 + IF (M .NE. N) E2IN(M+1) = ZERO + K = M + ITAG = ITAG + 1 + 125 CONTINUE + IF (M .EQ. L) GO TO 210 +C +C ITERATE +C + DO 205 J = 1, 30 +C .......... FORM SHIFT .......... + L1 = L + 1 + S = SQRT(E2(L)) + G = D(L) + P = (D(L1) - G) / (2.0D+00 * S) + R = SQRT(P*P+1.0D+00) + D(L) = S / (P + SIGN(R,P)) + H = G - D(L) +C + DO 140 I = L1, N + 140 D(I) = D(I) - H +C + F = F + H +C .......... RATIONAL QL TRANSFORMATION .......... + G = D(M) + B + H = G + S = ZERO + DO 200 I = M-1,L,-1 + P = G * H + R = P + E2(I) + E2(I+1) = S * R + S = E2(I) / R + D(I+1) = H + S * (H + D(I)) + G = D(I) - E2(I) / G + B + H = G * P / R + 200 CONTINUE +C + E2(L) = S * G + D(L) = H +C .......... GUARD AGAINST UNDERFLOW IN CONVERGENCE TEST + IF (H .EQ. ZERO) GO TO 210 + IF (ABS(E2(L)) .LE. ABS(C/H)) GO TO 210 + E2(L) = H * E2(L) + IF (E2(L) .EQ. ZERO) GO TO 210 + 205 CONTINUE +C .......... SET ERROR -- NO CONVERGENCE TO AN +C EIGENVALUE AFTER 30 ITERATIONS .......... + IERR = L + GO TO 1001 +C +C CONVERGED +C + 210 P = D(L) + F +C .......... ORDER EIGENVALUES .......... + I = 1 + IF (L .EQ. 1) GO TO 250 + IF (P .LT. D(1)) GO TO 230 + I = L +C .......... LOOP TO FIND ORDERED POSITION + 220 I = I - 1 + IF (P .LT. D(I)) GO TO 220 +C + I = I + 1 + IF (I .EQ. L) GO TO 250 + 230 CONTINUE + DO 240 II = L, I+1, -1 + D(II) = D(II-1) + IND(II) = IND(II-1) + 240 CONTINUE +C + 250 CONTINUE + D(I) = P + IND(I) = ITAG + 290 CONTINUE +C + 1001 RETURN + END +C*MODULE EIGEN *DECK ESTPI1 + DOUBLE PRECISION FUNCTION ESTPI1 (N,EVAL,D,E,X,ANORM) +C* +C* AUTHOR - +C* STEPHEN T. ELBERT (AMES LABORATORY-USDOE) DATE: 5 DEC 1986 +C* +C* PURPOSE - +C* EVALUATE SYMMETRIC TRIDIAGONAL MATRIX PERFORMANCE INDEX +C* * * * * * +C* FOR 1 EIGENVECTOR +C* * +C* +C* METHOD - +C* THIS ROUTINE FORMS THE 1-NORM OF THE RESIDUAL MATRIX A*X-X*EVAL +C* WHERE A IS A SYMMETRIC TRIDIAGONAL MATRIX STORED +C* IN THE DIAGONAL (D) AND SUB-DIAGONAL (E) VECTORS, EVAL IS THE +C* EIGENVALUE OF AN EIGENVECTOR OF A, NAMELY X. +C* THIS NORM IS SCALED BY MACHINE ACCURACY FOR THE PROBLEM SIZE. +C* ALL NORMS APPEARING IN THE COMMENTS BELOW ARE 1-NORMS. +C* +C* ON ENTRY - +C* N - INTEGER +C* THE ORDER OF THE MATRIX A. +C* EVAL - W.P. REAL +C* THE EIGENVALUE CORRESPONDING TO VECTOR X. +C* D - W.P. REAL (N) +C* THE DIAGONAL VECTOR OF A. +C* E - W.P. REAL (N) +C* THE SUB-DIAGONAL VECTOR OF A. +C* X - W.P. REAL (N) +C* AN EIGENVECTOR OF A. +C* ANORM - W.P. REAL +C* THE NORM OF A IF IT HAS BEEN PREVIOUSLY COMPUTED. +C* +C* ON EXIT - +C* ANORM - W.P. REAL +C* THE NORM OF A, COMPUTED IF INITIALLY ZERO. +C* ESTPI1 - W.P. REAL +C* !!A*X-X*EVAL!! / (EPSLON(10*N)*!!A!!*!!X!!); +C* WHERE EPSLON(X) IS THE SMALLEST NUMBER SUCH THAT +C* X + EPSLON(X) .NE. X +C* +C* ESTPI1 .LT. 1 == SATISFACTORY PERFORMANCE +C* .GE. 1 AND .LE. 100 == MARGINAL PERFORMANCE +C* .GT. 100 == POOR PERFORMANCE +C* (SEE LECT. NOTES IN COMP. SCI. VOL.6 PP 124-125) +C + DOUBLE PRECISION ANORM,EVAL,RNORM,SIZE,XNORM + DOUBLE PRECISION D(N), E(N), X(N) + DOUBLE PRECISION EPSLON, ONE, ZERO +C + PARAMETER (ZERO = 0.0D+00, ONE = 1.0D+00) +C +C----------------------------------------------------------------------- +C + ESTPI1 = ZERO + IF( N .LE. 1 ) RETURN + SIZE = 10 * N + IF (ANORM .EQ. ZERO) THEN +C +C COMPUTE NORM OF A +C + ANORM = MAX( ABS(D(1)) + ABS(E(2)) + * ,ABS(D(N)) + ABS(E(N))) + DO 110 I = 2, N-1 + ANORM = MAX( ANORM, ABS(E(I))+ABS(D(I))+ABS(E(I+1))) + 110 CONTINUE + IF(ANORM .EQ. ZERO) ANORM = ONE + END IF +C +C COMPUTE NORMS OF RESIDUAL AND EIGENVECTOR +C + XNORM = ABS(X(1)) + ABS(X(N)) + RNORM = ABS( (D(1)-EVAL)*X(1) + E(2)*X(2)) + * +ABS( (D(N)-EVAL)*X(N) + E(N)*X(N-1)) + DO 120 I = 2, N-1 + XNORM = XNORM + ABS(X(I)) + RNORM = RNORM + ABS(E(I)*X(I-1) + (D(I)-EVAL)*X(I) + * + E(I+1)*X(I+1)) + 120 CONTINUE +C + ESTPI1 = RNORM / (EPSLON(SIZE)*ANORM*XNORM) + RETURN + END +C*MODULE EIGEN *DECK ETRBK3 + SUBROUTINE ETRBK3(NM,N,NV,A,M,Z) +C* +C* AUTHORS- +C* THIS IS A MODIFICATION OF ROUTINE TRBAK3 FROM EISPACK EDITION 3 +C* DATED AUGUST 1983. +C* EISPACK TRBAK3 IS A TRANSLATION OF THE ALGOL PROCEDURE TRBAK3, +C* NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. +C* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). +C* THIS VERSION IS BY S. T. ELBERT (AMES LABORATORY-USDOE) +C* +C* PURPOSE - +C* THIS ROUTINE FORMS THE EIGENVECTORS OF A REAL SYMMETRIC +C* MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING +C* SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY ETRED3. +C* +C* METHOD - +C* THE CALCULATION IS CARRIED OUT BY FORMING THE MATRIX PRODUCT +C* Q*Z +C* WHERE Q IS A PRODUCT OF THE ORTHOGONAL SYMMETRIC MATRICES +C* Q = PROD(I)[1 - U(I)*.TRANSPOSE.U(I)*H(I)] +C* U IS THE AUGMENTED SUB-DIAGONAL ROWS OF A AND +C* Z IS THE SET OF EIGENVECTORS OF THE TRIDIAGONAL +C* MATRIX F WHICH WAS FORMED FROM THE ORIGINAL SYMMETRIC +C* MATRIX C BY THE SIMILARITY TRANSFORMATION +C* F = Q(TRANSPOSE) C Q +C* NOTE THAT ETRBK3 PRESERVES VECTOR EUCLIDEAN NORMS. +C* +C* +C* COMPLEXITY - +C* M*N**2 +C* +C* ON ENTRY- +C* NM - INTEGER +C* MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL +C* ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE +C* DIMENSION STATEMENT. +C* N - INTEGER +C* THE ORDER OF THE MATRIX A. +C* NV - INTEGER +C* MUST BE SET TO THE DIMENSION OF THE ARRAY A AS +C* DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT. +C* A - W.P. REAL (NV) +C* CONTAINS INFORMATION ABOUT THE ORTHOGONAL +C* TRANSFORMATIONS USED IN THE REDUCTION BY ETRED3 IN +C* ITS FIRST NV = N*(N+1)/2 POSITIONS. +C* M - INTEGER +C* THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. +C* Z - W.P REAL (NM,M) +C* CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED +C* IN ITS FIRST M COLUMNS. +C* +C* ON EXIT- +C* Z - W.P. REAL (NM,M) +C* CONTAINS THE TRANSFORMED EIGENVECTORS +C* IN ITS FIRST M COLUMNS. +C* +C* DIFFERENCES WITH EISPACK 3 - +C* THE TWO INNER LOOPS ARE REPLACED BY DDOT AND DAXPY. +C* MULTIPLICATION USED INSTEAD OF DIVISION TO FIND S. +C* OUTER LOOP RANGE CHANGED FROM 2,N TO 3,N. +C* ADDRESS POINTERS FOR A SIMPLIFIED. +C* +C* NOTE - +C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO +C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB. +C + INTEGER I,II,IM1,IZ,J,M,N,NM,NV +C + DOUBLE PRECISION A(NV),Z(NM,M) + DOUBLE PRECISION H,S,DDOT,ZERO +C + PARAMETER (ZERO = 0.0D+00) +C +C----------------------------------------------------------------------- +C + IF (M .EQ. 0) RETURN + IF (N .LE. 2) RETURN +C + II=3 + DO 140 I = 3, N + IZ=II+1 + II=II+I + H = A(II) + IF (H .EQ. ZERO) GO TO 140 + IM1 = I - 1 + DO 130 J = 1, M + S = -( DDOT(IM1,A(IZ),1,Z(1,J),1) * H) * H + CALL DAXPY(IM1,S,A(IZ),1,Z(1,J),1) + 130 CONTINUE + 140 CONTINUE + RETURN + END +C*MODULE EIGEN *DECK ETRED3 + SUBROUTINE ETRED3(N,NV,A,D,E,E2) +C* +C* AUTHORS - +C* THIS IS A MODIFICATION OF ROUTINE TRED3 FROM EISPACK EDITION 3 +C* DATED AUGUST 1983. +C* EISPACK TRED3 IS A TRANSLATION OF THE ALGOL PROCEDURE TRED3, +C* NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. +C* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). +C* THIS VERSION IS BY S. T. ELBERT, AMES LABORATORY-USDOE JUN 1986 +C* +C* PURPOSE - +C* THIS ROUTINE REDUCES A REAL SYMMETRIC (PACKED) MATRIX, STORED +C* AS A ONE-DIMENSIONAL ARRAY, TO A SYMMETRIC TRIDIAGONAL MATRIX +C* USING ORTHOGONAL SIMILARITY TRANSFORMATIONS, PRESERVING THE +C* INFORMATION ABOUT THE TRANSFORMATIONS IN A. +C* +C* METHOD - +C* THE TRIDIAGONAL REDUCTION IS PERFORMED IN THE FOLLOWING WAY. +C* STARTING WITH J=N, THE ELEMENTS IN THE J-TH ROW TO THE +C* LEFT OF THE DIAGONAL ARE FIRST SCALED, TO AVOID POSSIBLE +C* UNDERFLOW IN THE TRANSFORMATION THAT MIGHT RESULT IN SEVERE +C* DEPARTURE FROM ORTHOGONALITY. THE SUM OF SQUARES SIGMA OF +C* THESE SCALED ELEMENTS IS NEXT FORMED. THEN, A VECTOR U AND +C* A SCALAR +C* H = U(TRANSPOSE) * U / 2 +C* DEFINE A REFLECTION OPERATOR +C* P = I - U * U(TRANSPOSE) / H +C* WHICH IS ORTHOGONAL AND SYMMETRIC AND FOR WHICH THE +C* SIMILIARITY TRANSFORMATION PAP ELIMINATES THE ELEMENTS IN +C* THE J-TH ROW OF A TO THE LEFT OF THE SUBDIAGONAL AND THE +C* SYMMETRICAL ELEMENTS IN THE J-TH COLUMN. +C* +C* THE NON-ZERO COMPONENTS OF U ARE THE ELEMENTS OF THE J-TH +C* ROW TO THE LEFT OF THE DIAGONAL WITH THE LAST OF THEM +C* AUGMENTED BY THE SQUARE ROOT OF SIGMA PREFIXED BY THE SIGN +C* OF THE SUBDIAGONAL ELEMENT. BY STORING THE TRANSFORMED SUB- +C* DIAGONAL ELEMENT IN E(J) AND NOT OVERWRITING THE ROW +C* ELEMENTS ELIMINATED IN THE TRANSFORMATION, FULL INFORMATION +C* ABOUT P IS SAVE FOR LATER USE IN ETRBK3. +C* +C* THE TRANSFORMATION SETS E2(J) EQUAL TO SIGMA AND E(J) +C* EQUAL TO THE SQUARE ROOT OF SIGMA PREFIXED BY THE SIGN +C* OF THE REPLACED SUBDIAGONAL ELEMENT. +C* +C* THE ABOVE STEPS ARE REPEATED ON FURTHER ROWS OF THE +C* TRANSFORMED A IN REVERSE ORDER UNTIL A IS REDUCED TO TRI- +C* DIAGONAL FORM, THAT IS, REPEATED FOR J = N-1,N-2,...,3. +C* +C* COMPLEXITY - +C* 2/3 N**3 +C* +C* ON ENTRY- +C* N - INTEGER +C* THE ORDER OF THE MATRIX. +C* NV - INTEGER +C* MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A +C* AS DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT +C* A - W.P. REAL (NV) +C* CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC +C* INPUT MATRIX, STORED ROW-WISE AS A ONE-DIMENSIONAL +C* ARRAY, IN ITS FIRST N*(N+1)/2 POSITIONS. +C* +C* ON EXIT- +C* A - W.P. REAL (NV) +C* CONTAINS INFORMATION ABOUT THE ORTHOGONAL +C* TRANSFORMATIONS USED IN THE REDUCTION. +C* D - W.P. REAL (N) +C* CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL +C* MATRIX. +C* E - W.P. REAL (N) +C* CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL +C* MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO +C* E2 - W.P. REAL (N) +C* CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF +C* E. MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. +C* +C* DIFFERENCES FROM EISPACK 3 - +C* OUTER LOOP CHANGED FROM II=1,N TO I=N,3,-1 +C* PARAMETER STATEMENT AND GENERIC INTRINSIC FUNCTIONS USED +C* SCALE.NE.0 TEST NOW SPOTS TRI-DIAGONAL FORM +C* VALUES LESS THAN EPSLON CLEARED TO ZERO +C* USE BLAS(1) +C* U NOT COPIED TO D, LEFT IN A +C* E2 COMPUTED FROM E +C* INNER LOOPS SPLIT INTO ROUTINES ELAU AND FREDA +C* INVERSE OF H STORED INSTEAD OF H +C* +C* NOTE - +C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO +C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB. +C + INTEGER I,IIA,IZ0,L,N,NV +C + DOUBLE PRECISION A(NV),D(N),E(N),E2(N) + DOUBLE PRECISION AIIMAX,F,G,H,HROOT,SCALE,SCALEI + DOUBLE PRECISION DASUM, DNRM2 + DOUBLE PRECISION ONE, ZERO +C + PARAMETER (ZERO = 0.0D+00, ONE = 1.0D+00) +C +C----------------------------------------------------------------------- +C + IF (N .LE. 2) GO TO 310 + IZ0 = (N*N+N)/2 + AIIMAX = ABS(A(IZ0)) + DO 300 I = N, 3, -1 + L = I - 1 + IIA = IZ0 + IZ0 = IZ0 - I + AIIMAX = MAX(AIIMAX, ABS(A(IIA))) + SCALE = DASUM (L, A(IZ0+1), 1) + IF(SCALE .EQ. ABS(A(IIA-1)) .OR. AIIMAX+SCALE .EQ. AIIMAX) THEN +C +C THIS ROW IS ALREADY IN TRI-DIAGONAL FORM +C + D(I) = A(IIA) + IF (AIIMAX+D(I) .EQ. AIIMAX) D(I) = ZERO + E(I) = A(IIA-1) + IF (AIIMAX+E(I) .EQ. AIIMAX) E(I) = ZERO + E2(I) = E(I)*E(I) + A(IIA) = ZERO + GO TO 300 +C + END IF +C + SCALEI = ONE / SCALE + CALL DSCAL(L,SCALEI,A(IZ0+1),1) + HROOT = DNRM2(L,A(IZ0+1),1) +C + F = A(IZ0+L) + G = -SIGN(HROOT,F) + E(I) = SCALE * G + E2(I) = E(I)*E(I) + H = HROOT*HROOT - F * G + A(IZ0+L) = F - G + D(I) = A(IIA) + A(IIA) = ONE / SQRT(H) +C .......... FORM P THEN Q IN E(1:L) .......... + CALL ELAU(ONE/H,L,A(IZ0+1),A,E) +C .......... FORM REDUCED A .......... + CALL FREDA(L,A(IZ0+1),A,E) +C + 300 CONTINUE + 310 CONTINUE + E(1) = ZERO + E2(1)= ZERO + D(1) = A(1) + IF(N.EQ.1) RETURN +C + E(2) = A(2) + E2(2)= A(2)*A(2) + D(2) = A(3) + RETURN + END +C*MODULE EIGEN *DECK EVVRSP + SUBROUTINE EVVRSP(MSGFL,N,NVECT,LENA,NV,A,B,IND,ROOT, + * VECT,IORDER,IERR) +C* +C* AUTHOR: S. T. ELBERT, AMES LABORATORY-USDOE, JUNE 1985 +C* +C* PURPOSE - +C* FINDS (ALL) EIGENVALUES AND (SOME OR ALL) EIGENVECTORS +C* * * * +C* OF A REAL SYMMETRIC PACKED MATRIX. +C* * * * +C* +C* METHOD - +C* THE METHOD AS PRESENTED IN THIS ROUTINE CONSISTS OF FOUR STEPS: +C* FIRST, THE INPUT MATRIX IS REDUCED TO TRIDIAGONAL FORM BY THE +C* HOUSEHOLDER TECHNIQUE (ORTHOGONAL SIMILARITY TRANSFORMATIONS). +C* SECOND, THE ROOTS ARE LOCATED USING THE RATIONAL QL METHOD. +C* THIRD, THE VECTORS OF THE TRIDIAGONAL FORM ARE EVALUATED BY THE +C* INVERSE ITERATION TECHNIQUE. VECTORS FOR DEGENERATE OR NEAR- +C* DEGENERATE ROOTS ARE FORCED TO BE ORTHOGONAL. +C* FOURTH, THE TRIDIAGONAL VECTORS ARE ROTATED TO VECTORS OF THE +C* ORIGINAL ARRAY. +C* +C* THESE ROUTINES ARE MODIFICATIONS OF THE EISPACK 3 +C* ROUTINES TRED3, TQLRAT, TINVIT AND TRBAK3 +C* +C* FOR FURTHER DETAILS, SEE EISPACK USERS GUIDE, B. T. SMITH +C* ET AL, SPRINGER-VERLAG, LECTURE NOTES IN COMPUTER SCIENCE, +C* VOL. 6, 2-ND EDITION, 1976. ANOTHER GOOD REFERENCE IS +C* THE SYMMETRIC EIGENVALUE PROBLEM BY B. N. PARLETT +C* PUBLISHED BY PRENTICE-HALL, INC., ENGLEWOOD CLIFFS, N.J. (1980) +C* +C* ON ENTRY - +C* MSGFL - INTEGER (LOGICAL UNIT NO.) +C* FILE WHERE ERROR MESSAGES WILL BE PRINTED. +C* IF MSGFL IS 0, ERROR MESSAGES WILL BE PRINTED ON LU 6. +C* IF MSGFL IS NEGATIVE, NO ERROR MESSAGES PRINTED. +C* N - INTEGER +C* ORDER OF MATRIX A. +C* NVECT - INTEGER +C* NUMBER OF VECTORS DESIRED. 0 .LE. NVECT .LE. N. +C* LENA - INTEGER +C* DIMENSION OF A IN CALLING ROUTINE. MUST NOT BE LESS +C* THAN (N*N+N)/2. +C* NV - INTEGER +C* ROW DIMENSION OF VECT IN CALLING ROUTINE. N .LE. NV. +C* A - WORKING PRECISION REAL (LENA) +C* INPUT MATRIX, ROWS OF THE LOWER TRIANGLE PACKED INTO +C* LINEAR ARRAY OF DIMENSION N*(N+1)/2. THE PACKED ORDER +C* IS A(1,1), A(2,1), A(2,2), A(3,1), A(3,2), ... +C* B - WORKING PRECISION REAL (N,8) +C* SCRATCH ARRAY, 8*N ELEMENTS +C* IND - INTEGER (N) +C* SCRATCH ARRAY OF LENGTH N. +C* IORDER - INTEGER +C* ROOT ORDERING FLAG. +C* = 0, ROOTS WILL BE PUT IN ASCENDING ORDER. +C* = 2, ROOTS WILL BE PUT IN DESCENDING ORDER. +C* +C* ON EXIT - +C* A - DESTORYED. NOW HOLDS REFLECTION OPERATORS. +C* ROOT - WORKING PRECISION REAL (N) +C* ALL EIGENVALUES IN ASCENDING OR DESCENDING ORDER. +C* IF IORDER = 0, ROOT(1) .LE. ... .LE. ROOT(N) +C* IF IORDER = 2, ROOT(1) .GE. ... .GE. ROOT(N) +C* VECT - WORKING PRECISION REAL (NV,NVECT) +C* EIGENVECTORS FOR ROOT(1), ..., ROOT(NVECT). +C* IERR - INTEGER +C* = 0 IF NO ERROR DETECTED, +C* = K IF ITERATION FOR K-TH EIGENVALUE FAILED, +C* = -K IF ITERATION FOR K-TH EIGENVECTOR FAILED. +C* (FAILURES SHOULD BE VERY RARE. CONTACT C. MOLER.) +C* +C + LOGICAL GOPARR,DSKWRK,MASWRK +C + DOUBLE PRECISION A(LENA) + DOUBLE PRECISION B(N,8) + DOUBLE PRECISION ROOT(N) + DOUBLE PRECISION T + DOUBLE PRECISION VECT(NV,*) +C + INTEGER IND(N) +C + COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK +C + 900 FORMAT(26H0*** EVVRSP PARAMETERS ***/ + + 14H *** N = ,I8,4H ***/ + + 14H *** NVECT = ,I8,4H ***/ + + 14H *** LENA = ,I8,4H ***/ + + 14H *** NV = ,I8,4H ***/ + + 14H *** IORDER = ,I8,4H ***/ + + 14H *** IERR = ,I8,4H ***) + 901 FORMAT(37H VALUE OF LENA IS LESS THAN (N*N+N)/2) + 902 FORMAT(39H EQLRAT HAS FAILED TO CONVERGE FOR ROOT,I5) + 903 FORMAT(18H NV IS LESS THAN N) + 904 FORMAT(41H EINVIT HAS FAILED TO CONVERGE FOR VECTOR,I5) + 905 FORMAT(51H VALUE OF IORDER MUST BE 0 (SMALLEST ROOT FIRST) OR + * ,23H 2 (LARGEST ROOT FIRST)) + 906 FORMAT(' VALUE OF N IS LESS THAN OR EQUAL ZERO') +C +C----------------------------------------------------------------------- +C + LMSGFL=MSGFL + IF (MSGFL .EQ. 0) LMSGFL=6 + IERR = N - 1 + IF (N .LE. 0) GO TO 800 + IERR = N + 1 + IF ( (N*N+N)/2 .GT. LENA) GO TO 810 +C +C REDUCE REAL SYMMETRIC MATRIX A TO TRIDIAGONAL FORM +C + CALL ETRED3(N,LENA,A,B(1,1),B(1,2),B(1,3)) +C +C FIND ALL EIGENVALUES OF TRIDIAGONAL MATRIX +C + CALL EQLRAT(N,B(1,1),B(1,2),B(1,3),ROOT,IND,IERR,B(1,4)) + IF (IERR .NE. 0) GO TO 820 +C +C CHECK THE DESIRED ORDER OF THE EIGENVALUES +C + B(1,3) = IORDER + IF (IORDER .EQ. 0) GO TO 300 + IF (IORDER .NE. 2) GO TO 850 +C +C ORDER ROOTS IN DESCENDING ORDER (LARGEST FIRST)... +C TURN ROOT AND IND ARRAYS END FOR END +C + DO 210 I = 1, N/2 + J = N+1-I + T = ROOT(I) + ROOT(I) = ROOT(J) + ROOT(J) = T + L = IND(I) + IND(I) = IND(J) + IND(J) = L + 210 CONTINUE +C +C FIND I AND J MARKING THE START AND END OF A SEQUENCE +C OF DEGENERATE ROOTS +C + I=0 + 220 CONTINUE + I = I+1 + IF (I .GT. N) GO TO 300 + DO 230 J=I,N + IF (ROOT(J) .NE. ROOT(I)) GO TO 240 + 230 CONTINUE + J = N+1 + 240 CONTINUE + J = J-1 + IF (J .EQ. I) GO TO 220 +C +C TURN AROUND IND BETWEEN I AND J +C + JSV = J + KLIM = (J-I+1)/2 + DO 250 K=1,KLIM + L = IND(J) + IND(J) = IND(I) + IND(I) = L + I = I+1 + J = J-1 + 250 CONTINUE + I = JSV + GO TO 220 +C + 300 CONTINUE +C + IF (NVECT .LE. 0) RETURN + IF (NV .LT. N) GO TO 830 +C +C FIND EIGENVECTORS OF TRI-DIAGONAL MATRIX VIA INVERSE ITERATION +C + IERR = LMSGFL + CALL EINVIT(NV,N,B(1,1),B(1,2),B(1,3),NVECT,ROOT,IND, + + VECT,IERR,B(1,4),B(1,5),B(1,6),B(1,7),B(1,8)) + IF (IERR .NE. 0) GO TO 840 +C +C FIND EIGENVECTORS OF SYMMETRIC MATRIX VIA BACK TRANSFORMATION +C + 400 CONTINUE + CALL ETRBK3(NV,N,LENA,A,NVECT,VECT) + RETURN +C +C ERROR MESSAGE SECTION +C + 800 IF (LMSGFL .LT. 0) RETURN + IF (MASWRK) WRITE(LMSGFL,906) + GO TO 890 +C + 810 IF (LMSGFL .LT. 0) RETURN + IF (MASWRK) WRITE(LMSGFL,901) + GO TO 890 +C + 820 IF (LMSGFL .LT. 0) RETURN + IF (MASWRK) WRITE(LMSGFL,902) IERR + GO TO 890 +C + 830 IF (LMSGFL .LT. 0) RETURN + IF (MASWRK) WRITE(LMSGFL,903) + GO TO 890 +C + 840 CONTINUE + IF ((LMSGFL .GT. 0).AND.MASWRK) WRITE(LMSGFL,904) -IERR + GO TO 400 +C + 850 IERR=-1 + IF (LMSGFL .LT. 0) RETURN + IF (MASWRK) WRITE(LMSGFL,905) + GO TO 890 +C + 890 CONTINUE + IF (MASWRK) WRITE(LMSGFL,900) N,NVECT,LENA,NV,IORDER,IERR + RETURN + END +C*MODULE EIGEN *DECK FREDA + SUBROUTINE FREDA(L,D,A,E) +C + DOUBLE PRECISION A(*) + DOUBLE PRECISION D(L) + DOUBLE PRECISION E(L) + DOUBLE PRECISION F + DOUBLE PRECISION G +C + JK = 1 +C +C .......... FORM REDUCED A .......... +C + DO 280 J = 1, L + F = D(J) + G = E(J) +C + DO 260 K = 1, J + A(JK) = A(JK) - F * E(K) - G * D(K) + JK = JK + 1 + 260 CONTINUE +C + 280 CONTINUE + RETURN + END +C*MODULE EIGEN *DECK GIVEIS + SUBROUTINE GIVEIS(N,NVECT,NV,A,B,INDB,ROOT,VECT,IERR) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION A(*),B(N,8),INDB(N),ROOT(N),VECT(NV,NVECT) +C +C EISPACK-BASED SUBSTITUTE FOR QCPE ROUTINE GIVENS. +C FINDS ALL EIGENVALUES AND SOME EIGENVECTORS OF A REAL SYMMETRIC +C MATRIX. AUTHOR.. C. MOLER AND D. SPANGLER, N.R.C.C., 4/1/79. +C +C INPUT.. +C N = ORDER OF MATRIX . +C NVECT = NUMBER OF VECTORS DESIRED. 0 .LE. NVECT .LE. N . +C NV = LEADING DIMENSION OF VECT . +C A = INPUT MATRIX, COLUMNS OF THE UPPER TRIANGLE PACKED INTO +C LINEAR ARRAY OF DIMENSION N*(N+1)/2 . +C B = SCRATCH ARRAY, 8*N ELEMENTS (NOTE THIS IS MORE THAN +C PREVIOUS VERSIONS OF GIVENS.) +C IND = INDEX ARRAY OF N ELEMENTS +C +C OUTPUT.. +C A DESTROYED . +C ROOT = ALL EIGENVALUES, ROOT(1) .LE. ... .LE. ROOT(N) . +C (FOR OTHER ORDERINGS, SEE BELOW.) +C VECT = EIGENVECTORS FOR ROOT(1),..., ROOT(NVECT) . +C IERR = 0 IF NO ERROR DETECTED, +C = K IF ITERATION FOR K-TH EIGENVALUE FAILED, +C = -K IF ITERATION FOR K-TH EIGENVECTOR FAILED. +C (FAILURES SHOULD BE VERY RARE. CONTACT MOLER.) +C +C CALLS MODIFIED EISPACK ROUTINES TRED3B, IMTQLV, TINVTB, AND +C TRBK3B. THE ROUTINES TRED3B, TINVTB, AND TRBK3B. +C THE ORIGINAL EISPACK ROUTINES TRED3, TINVIT, AND TRBAK3 +C WERE MODIFIED BY THE INTRODUCTION OF TWO ROUTINES FROM THE +C BLAS LIBRARY - DDOT AND DAXPY. +C +C IF TINVIT FAILS TO CONVERGE, TQL2 IS CALLED +C +C SEE EISPACK USERS GUIDE, B. T. SMITH ET AL, SPRINGER-VERLAG +C LECTURE NOTES IN COMPUTER SCIENCE, VOL. 6, 2-ND EDITION, 1976 . +C NOTE THAT IMTQLV AND TINVTB HAVE INTERNAL MACHINE +C DEPENDENT CONSTANTS. +C + DATA ONE, ZERO /1.0D+00, 0.0D+00/ + CALL TRED3B(N,(N*N+N)/2,A,B(1,1),B(1,2),B(1,3)) + CALL IMTQLV(N,B(1,1),B(1,2),B(1,3),ROOT,INDB,IERR,B(1,4)) + IF (IERR .NE. 0) RETURN +C +C TO REORDER ROOTS... +C K = N/2 +C B(1,3) = 2.0D+00 +C DO 50 I = 1, K +C J = N+1-I +C T = ROOT(I) +C ROOT(I) = ROOT(J) +C ROOT(J) = T +C 50 CONTINUE +C + IF (NVECT .LE. 0) RETURN + CALL TINVTB(NV,N,B(1,1),B(1,2),B(1,3),NVECT,ROOT,INDB,VECT,IERR, + + B(1,4),B(1,5),B(1,6),B(1,7),B(1,8)) + IF (IERR .EQ. 0) GO TO 160 +C +C IF INVERSE ITERATION GIVES AN ERROR IN DETERMINING THE +C EIGENVECTORS, TRY THE QL ALGORITHM IF ALL THE EIGENVECTORS +C ARE DESIRED. +C + IF (NVECT .NE. N) RETURN + DO 120 I = 1, NVECT + DO 100 J = 1, N + VECT(I,J) = ZERO + 100 CONTINUE + VECT(I,I) = ONE + 120 CONTINUE + CALL TQL2 (NV,N,B(1,1),B(1,2),VECT,IERR) + DO 140 I = 1, NVECT + ROOT(I) = B(I,1) + 140 CONTINUE + IF (IERR .NE. 0) RETURN + 160 CALL TRBK3B(NV,N,(N*N+N)/2,A,NVECT,VECT) + RETURN + END +C*MODULE EIGEN *DECK GLDIAG + SUBROUTINE GLDIAG(LDVECT,NVECT,N,H,WRK,EIG,VECTOR,IERR,IWRK) +C + IMPLICIT DOUBLE PRECISION (A-H,O-Z) +C + LOGICAL GOPARR,DSKWRK,MASWRK +C + DIMENSION H(*),WRK(N,8),EIG(N),VECTOR(LDVECT,NVECT),IWRK(N) +C + COMMON /IOFILE/ IR,IW,IP,IJK,IPK,IDAF,NAV,IODA(400) + COMMON /MACHSW/ KDIAG,ICORFL,IXDR + COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK +C +C ----- GENERAL ROUTINE TO DIAGONALIZE A SYMMETRIC MATRIX ----- +C IF KDIAG = 0, USE A ROUTINE FROM THE VECTOR LIBRARY, +C IF AVAILABLE (SEE THE SUBROUTINE 'GLDIAG' +C IN VECTOR.SRC), OR EVVRSP OTHERWISE +C = 1, USE EVVRSP +C = 2, USE GIVEIS +C = 3, USE JACOBI +C +C N = DIMENSION (ORDER) OF MATRIX TO BE SOLVED +C LDVECT = LEADING DIMENSION OF VECTOR +C NVECT = NUMBER OF VECTORS DESIRED +C H = MATRIX TO BE DIAGONALIZED +C WRK = N*8 W.P. REAL WORDS OF SCRATCH SPACE +C EIG = EIGENVECTORS (OUTPUT) +C VECTOR = EIGENVECTORS (OUTPUT) +C IERR = ERROR FLAG (OUTPUT) +C IWRK = N INTEGER WORDS OF SCRATCH SPACE +C + IERR = 0 +C +C ----- USE STEVE ELBERT'S ROUTINE ----- +C + IF(KDIAG.LE.1 .OR. KDIAG.GT.3) THEN + LENH = (N*N+N)/2 + KORDER =0 + CALL EVVRSP(IW,N,NVECT,LENH,LDVECT,H,WRK,IWRK,EIG,VECTOR + * ,KORDER,IERR) + END IF +C +C ----- USE MODIFIED EISPAK ROUTINE ----- +C + IF(KDIAG.EQ.2) + * CALL GIVEIS(N,NVECT,LDVECT,H,WRK,IWRK,EIG,VECTOR,IERR) +C +C ----- USE JACOBI ROTATION ROUTINE ----- +C + IF(KDIAG.EQ.3) THEN + IF(NVECT.EQ.N) THEN + CALL JACDG(H,VECTOR,EIG,IWRK,WRK,LDVECT,N) + ELSE + IF (MASWRK) WRITE(IW,9000) N,NVECT,LDVECT + CALL ABRT + END IF + END IF + RETURN +C + 9000 FORMAT(1X,'IN -GLDIAG-, N,NVECT,LDVECT=',3I8/ + * 1X,'THE JACOBI CODE CANNOT COPE WITH N.NE.NVECT!'/ + * 1X,'SO THIS RUN DOES NOT PERMIT KDIAG=3.') + END +C*MODULE EIGEN *DECK IMTQLV + SUBROUTINE IMTQLV(N,D,E,E2,W,IND,IERR,RV1) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + INTEGER TAG + DOUBLE PRECISION MACHEP + DIMENSION D(N),E(N),E2(N),W(N),RV1(N),IND(N) +C +C THIS ROUTINE IS A VARIANT OF IMTQL1 WHICH IS A TRANSLATION OF +C ALGOL PROCEDURE IMTQL1, NUM. MATH. 12, 377-383(1968) BY MARTIN AND +C WILKINSON, AS MODIFIED IN NUM. MATH. 15, 450(1970) BY DUBRULLE. +C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 241-248(1971). +C +C THIS ROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC TRIDIAGONAL +C MATRIX BY THE IMPLICIT QL METHOD AND ASSOCIATES WITH THEM +C THEIR CORRESPONDING SUBMATRIX INDICES. +C +C ON INPUT- +C +C N IS THE ORDER OF THE MATRIX, +C +C D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX, +C +C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX +C IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY, +C +C E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. +C E2(1) IS ARBITRARY. +C +C ON OUTPUT- +C +C D AND E ARE UNALTERED, +C +C ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED +C AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE +C MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES. +C E2(1) IS ALSO SET TO ZERO, +C +C W CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN +C ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND +C ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE +C THE SMALLEST EIGENVALUES, +C +C IND CONTAINS THE SUBMATRIX INDICES ASSOCIATED WITH THE +C CORRESPONDING EIGENVALUES IN W -- 1 FOR EIGENVALUES +C BELONGING TO THE FIRST SUBMATRIX FROM THE TOP, +C 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC., +C +C IERR IS SET TO +C ZERO FOR NORMAL RETURN, +C J IF THE J-TH EIGENVALUE HAS NOT BEEN +C DETERMINED AFTER 30 ITERATIONS, +C +C RV1 IS A TEMPORARY STORAGE ARRAY. +C +C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, +C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY +C +C ------------------------------------------------------------------ +C +C ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING +C THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC. +C +C ********** + MACHEP = 2.0D+00**(-50) +C + IERR = 0 + K = 0 + TAG = 0 +C + DO 100 I = 1, N + W(I) = D(I) + IF (I .NE. 1) RV1(I-1) = E(I) + 100 CONTINUE +C + E2(1) = 0.0D+00 + RV1(N) = 0.0D+00 +C + DO 360 L = 1, N + J = 0 +C ********** LOOK FOR SMALL SUB-DIAGONAL ELEMENT ********** + 120 DO 140 M = L, N + IF (M .EQ. N) GO TO 160 + IF (ABS(RV1(M)) .LE. MACHEP * (ABS(W(M)) + ABS(W(M+1)))) GO TO + + 160 +C ********** GUARD AGAINST UNDERFLOWED ELEMENT OF E2 ********** + IF (E2(M+1) .EQ. 0.0D+00) GO TO 180 + 140 CONTINUE +C + 160 IF (M .LE. K) GO TO 200 + IF (M .NE. N) E2(M+1) = 0.0D+00 + 180 K = M + TAG = TAG + 1 + 200 P = W(L) + IF (M .EQ. L) GO TO 280 + IF (J .EQ. 30) GO TO 380 + J = J + 1 +C ********** FORM SHIFT ********** + G = (W(L+1) - P) / (2.0D+00 * RV1(L)) + R = SQRT(G*G+1.0D+00) + G = W(M) - P + RV1(L) / (G + SIGN(R,G)) + S = 1.0D+00 + C = 1.0D+00 + P = 0.0D+00 + MML = M - L +C ********** FOR I=M-1 STEP -1 UNTIL L DO -- ********** + DO 260 II = 1, MML + I = M - II + F = S * RV1(I) + B = C * RV1(I) + IF (ABS(F) .LT. ABS(G)) GO TO 220 + C = G / F + R = SQRT(C*C+1.0D+00) + RV1(I+1) = F * R + S = 1.0D+00 / R + C = C * S + GO TO 240 + 220 S = F / G + R = SQRT(S*S+1.0D+00) + RV1(I+1) = G * R + C = 1.0D+00 / R + S = S * C + 240 G = W(I+1) - P + R = (W(I) - G) * S + 2.0D+00 * C * B + P = S * R + W(I+1) = G + P + G = C * R - B + 260 CONTINUE +C + W(L) = W(L) - P + RV1(L) = G + RV1(M) = 0.0D+00 + GO TO 120 +C ********** ORDER EIGENVALUES ********** + 280 IF (L .EQ. 1) GO TO 320 +C ********** FOR I=L STEP -1 UNTIL 2 DO -- ********** + DO 300 II = 2, L + I = L + 2 - II + IF (P .GE. W(I-1)) GO TO 340 + W(I) = W(I-1) + IND(I) = IND(I-1) + 300 CONTINUE +C + 320 I = 1 + 340 W(I) = P + IND(I) = TAG + 360 CONTINUE +C + GO TO 400 +C ********** SET ERROR -- NO CONVERGENCE TO AN +C EIGENVALUE AFTER 30 ITERATIONS ********** + 380 IERR = L + 400 RETURN +C ********** LAST CARD OF IMTQLV ********** + END +C*MODULE EIGEN *DECK JACDG + SUBROUTINE JACDG(A,VEC,EIG,JBIG,BIG,LDVEC,N) +C + IMPLICIT DOUBLE PRECISION(A-H,O-Z) +C + DIMENSION A(*),VEC(LDVEC,N),EIG(N),JBIG(N),BIG(N) +C + PARAMETER (ONE=1.0D+00) +C +C ----- JACOBI DIAGONALIZATION OF SYMMETRIC MATRIX ----- +C SYMMETRIC MATRIX -A- OF DIMENSION -N- IS DESTROYED ON EXIT. +C ALL EIGENVECTORS ARE FOUND, SO -VEC- MUST BE SQUARE, +C UNLESS SOMEONE TAKES THE TROUBLE TO LOOK AT -NMAX- BELOW. +C -BIG- AND -JBIG- ARE SCRATCH WORK ARRAYS. +C + CALL VCLR(VEC,1,LDVEC*N) + DO 20 I = 1,N + VEC(I,I) = ONE + 20 CONTINUE +C + NB1 = N + NB2 = (NB1*NB1+NB1)/2 + NMIN = 1 + NMAX = NB1 +C + CALL JACDIA(A,VEC,NB1,NB2,LDVEC,NMIN,NMAX,BIG,JBIG) +C + DO 30 I=1,N + EIG(I) = A((I*I+I)/2) + 30 CONTINUE +C + CALL JACORD(VEC,EIG,NB1,LDVEC) + RETURN + END +C*MODULE EIGEN *DECK JACDIA + SUBROUTINE JACDIA(F,VEC,NB1,NB2,LDVEC,NMIN,NMAX,BIG,JBIG) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + LOGICAL GOPARR,DSKWRK,MASWRK + DIMENSION F(NB2),VEC(LDVEC,NB1),BIG(NB1),JBIG(NB1) +C + COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK +C + PARAMETER (ROOT2=0.707106781186548D+00 ) + PARAMETER (ZERO=0.0D+00, ONE=1.0D+00, D1050=1.05D+00, + * D1500=1.5D+00, D3875=3.875D+00, + * D0500=0.5D+00, D1375=1.375D+00, D0250=0.25D+00 ) + PARAMETER (C2=1.0D-12, C3=4.0D-16, + * C4=2.0D-16, C5=8.0D-09, C6=3.0D-06 ) +C +C F IS THE MATRIX TO BE DIAGONALIZED, F IS STORED TRIANGULAR +C VEC IS THE ARRAY OF EIGENVECTORS, DIMENSION NB1*NB1 +C BIG AND JBIG ARE TEMPORARY SCRATCH AREAS OF DIMENSION NB1 +C THE ROTATIONS AMONG THE FIRST NMIN BASIS FUNCTIONS ARE NOT +C ACCOUNTED FOR. +C THE ROTATIONS AMONG THE LAST NB1-NMAX BASIS FUNCTIONS ARE NOT +C ACCOUNTED FOR. +C + IEAA=0 + IEAB=0 + TT=ZERO + EPS = 64.0D+00*EPSLON(ONE) +C +C LOOP OVER COLUMNS (K) OF TRIANGULAR MATRIX TO DETERMINE +C LARGEST OFF-DIAGONAL ELEMENTS IN ROW(I). +C + DO 20 I=1,NB1 + BIG(I)=ZERO + JBIG(I)=0 + IF(I.LT.NMIN .OR. I.EQ.1) GO TO 20 + II = (I*I-I)/2 + J=MIN(I-1,NMAX) + DO 10 K=1,J + IF(ABS(BIG(I)).GE.ABS(F(II+K))) GO TO 10 + BIG(I)=F(II+K) + JBIG(I)=K + 10 CONTINUE + 20 CONTINUE +C +C ----- 2X2 JACOBI ITERATIONS BEGIN HERE ----- +C + MAXIT=MAX(NB2*20,500) + ITER=0 + 30 CONTINUE + ITER=ITER+1 +C +C FIND SMALLEST DIAGONAL ELEMENT +C + SD=D1050 + JJ=0 + DO 40 J=1,NB1 + JJ=JJ+J + SD= MIN(SD,ABS(F(JJ))) + 40 CONTINUE + TEST = MAX(EPS, C2*MAX(SD,C6)) +C +C FIND LARGEST OFF-DIAGONAL ELEMENT +C + T=ZERO + I1=MAX(2,NMIN) + IB = I1 + DO 50 I=I1,NB1 + IF(T.GE.ABS(BIG(I))) GO TO 50 + T= ABS(BIG(I)) + IB=I + 50 CONTINUE +C +C TEST FOR CONVERGENCE, THEN DETERMINE ROTATION. +C + IF(T.LT.TEST) RETURN +C ****** +C + IF(ITER.GT.MAXIT) THEN + IF (MASWRK) THEN + WRITE(6,*) 'JACOBI DIAGONALIZATION FAILS, DIMENSION=',NB1 + WRITE(6,9020) ITER,T,TEST,SD + ENDIF + CALL ABRT + STOP + END IF +C + IA=JBIG(IB) + IAA=IA*(IA-1)/2 + IBB=IB*(IB-1)/2 + DIF=F(IAA+IA)-F(IBB+IB) + IF(ABS(DIF).GT.C3*T) GO TO 70 + SX=ROOT2 + CX=ROOT2 + GO TO 110 + 70 T2X2=BIG(IB)/DIF + T2X25=T2X2*T2X2 + IF(T2X25 . GT . C4) GO TO 80 + CX=ONE + SX=T2X2 + GO TO 110 + 80 IF(T2X25 . GT . C5) GO TO 90 + SX=T2X2*(ONE-D1500*T2X25) + CX=ONE-D0500*T2X25 + GO TO 110 + 90 IF(T2X25 . GT . C6) GO TO 100 + CX=ONE+T2X25*(T2X25*D1375 - D0500) + SX= T2X2*(ONE + T2X25*(T2X25*D3875 - D1500)) + GO TO 110 + 100 T=D0250 / SQRT(D0250 + T2X25) + CX= SQRT(D0500 + T) + SX= SIGN( SQRT(D0500 - T),T2X2) + 110 IEAR=IAA+1 + IEBR=IBB+1 +C + DO 230 IR=1,NB1 + T=F(IEAR)*SX + F(IEAR)=F(IEAR)*CX+F(IEBR)*SX + F(IEBR)=T-F(IEBR)*CX + IF(IR-IA) 220,120,130 + 120 TT=F(IEBR) + IEAA=IEAR + IEAB=IEBR + F(IEBR)=BIG(IB) + IEAR=IEAR+IR-1 + IF(JBIG(IR)) 200,220,200 + 130 T=F(IEAR) + IT=IA + IEAR=IEAR+IR-1 + IF(IR-IB) 180,150,160 + 150 F(IEAA)=F(IEAA)*CX+F(IEAB)*SX + F(IEAB)=TT*CX+F(IEBR)*SX + F(IEBR)=TT*SX-F(IEBR)*CX + IEBR=IEBR+IR-1 + GO TO 200 + 160 IF( ABS(T) . GE . ABS(F(IEBR))) GO TO 170 + IF(IB.GT.NMAX) GO TO 170 + T=F(IEBR) + IT=IB + 170 IEBR=IEBR+IR-1 + 180 IF( ABS(T) . LT . ABS(BIG(IR))) GO TO 190 + BIG(IR) = T + JBIG(IR) = IT + GO TO 220 + 190 IF(IA . NE . JBIG(IR) . AND . IB . NE . JBIG(IR)) GO TO 220 + 200 KQ=IEAR-IR-IA+1 + BIG(IR)=ZERO + IR1=MIN(IR-1,NMAX) + DO 210 I=1,IR1 + K=KQ+I + IF(ABS(BIG(IR)) . GE . ABS(F(K))) GO TO 210 + BIG(IR) = F(K) + JBIG(IR)=I + 210 CONTINUE + 220 IEAR=IEAR+1 + 230 IEBR=IEBR+1 +C + DO 240 I=1,NB1 + T1=VEC(I,IA)*CX + VEC(I,IB)*SX + T2=VEC(I,IA)*SX - VEC(I,IB)*CX + VEC(I,IA)=T1 + VEC(I,IB)=T2 + 240 CONTINUE + GO TO 30 +C + 9020 FORMAT(1X,'ITER=',I6,' T,TEST,SD=',1P,3E20.10) + END +C*MODULE EIGEN *DECK JACORD + SUBROUTINE JACORD(VEC,EIG,N,LDVEC) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION VEC(LDVEC,N),EIG(N) +C +C ---- SORT EIGENDATA INTO ASCENDING ORDER ----- +C + DO 290 I = 1, N + JJ = I + DO 270 J = I, N + IF (EIG(J) .LT. EIG(JJ)) JJ = J + 270 CONTINUE + IF (JJ .EQ. I) GO TO 290 + T = EIG(JJ) + EIG(JJ) = EIG(I) + EIG(I) = T + DO 280 J = 1, N + T = VEC(J,JJ) + VEC(J,JJ) = VEC(J,I) + VEC(J,I) = T + 280 CONTINUE + 290 CONTINUE + RETURN + END +C*MODULE EIGEN *DECK TINVTB + SUBROUTINE TINVTB(NM,N,D,E,E2,M,W,IND,Z, + * IERR,RV1,RV2,RV3,RV4,RV6) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION D(N),E(N),E2(N),W(M),Z(NM,M), + * RV1(N),RV2(N),RV3(N),RV4(N),RV6(N),IND(M) + DOUBLE PRECISION MACHEP,NORM + INTEGER P,Q,R,S,TAG,GROUP +C ------------------------------------------------------------------ +C +C THIS ROUTINE IS A TRANSLATION OF THE INVERSE ITERATION TECH- +C NIQUE IN THE ALGOL PROCEDURE TRISTURM BY PETERS AND WILKINSON. +C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971). +C +C THIS ROUTINE FINDS THOSE EIGENVECTORS OF A TRIDIAGONAL +C SYMMETRIC MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES, +C USING INVERSE ITERATION. +C +C ON INPUT- +C +C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL +C ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE +C DIMENSION STATEMENT, +C +C N IS THE ORDER OF THE MATRIX, +C +C D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX, +C +C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX +C IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY, +C +C E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E, +C WITH ZEROS CORRESPONDING TO NEGLIGIBLE ELEMENTS OF E. +C E(I) IS CONSIDERED NEGLIGIBLE IF IT IS NOT LARGER THAN +C THE PRODUCT OF THE RELATIVE MACHINE PRECISION AND THE SUM +C OF THE MAGNITUDES OF D(I) AND D(I-1). E2(1) MUST CONTAIN +C 0.0 IF THE EIGENVALUES ARE IN ASCENDING ORDER, OR 2.0 +C IF THE EIGENVALUES ARE IN DESCENDING ORDER. IF BISECT, +C TRIDIB, OR IMTQLV HAS BEEN USED TO FIND THE EIGENVALUES, +C THEIR OUTPUT E2 ARRAY IS EXACTLY WHAT IS EXPECTED HERE, +C +C M IS THE NUMBER OF SPECIFIED EIGENVALUES, +C +C W CONTAINS THE M EIGENVALUES IN ASCENDING OR DESCENDING ORDER, +C +C IND CONTAINS IN ITS FIRST M POSITIONS THE SUBMATRIX INDICES +C ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W -- +C 1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX FROM +C THE TOP, 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC. +C +C ON OUTPUT- +C +C ALL INPUT ARRAYS ARE UNALTERED, +C +C Z CONTAINS THE ASSOCIATED SET OF ORTHONORMAL EIGENVECTORS. +C ANY VECTOR WHICH FAILS TO CONVERGE IS SET TO ZERO, +C +C IERR IS SET TO +C ZERO FOR NORMAL RETURN, +C -R IF THE EIGENVECTOR CORRESPONDING TO THE R-TH +C EIGENVALUE FAILS TO CONVERGE IN 5 ITERATIONS, +C +C RV1, RV2, RV3, RV4, AND RV6 ARE TEMPORARY STORAGE ARRAYS. +C +C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, +C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY +C +C ------------------------------------------------------------------ +C +C ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING +C THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC. +C +C ********** + MACHEP = 2.0D+00**(-50) +C + IERR = 0 + IF (M .EQ. 0) GO TO 680 + TAG = 0 + ORDER = 1.0D+00 - E2(1) + XU = 0.0D+00 + UK = 0.0D+00 + X0 = 0.0D+00 + U = 0.0D+00 + EPS2 = 0.0D+00 + EPS3 = 0.0D+00 + EPS4 = 0.0D+00 + GROUP = 0 + Q = 0 +C ********** ESTABLISH AND PROCESS NEXT SUBMATRIX ********** + 100 P = Q + 1 + IP = P + 1 +C + DO 120 Q = P, N + IF (Q .EQ. N) GO TO 140 + IF (E2(Q+1) .EQ. 0.0D+00) GO TO 140 + 120 CONTINUE +C ********** FIND VECTORS BY INVERSE ITERATION ********** + 140 TAG = TAG + 1 + IQMP = Q - P + 1 + S = 0 +C + DO 660 R = 1, M + IF (IND(R) .NE. TAG) GO TO 660 + ITS = 1 + X1 = W(R) + IF (S .NE. 0) GO TO 220 +C ********** CHECK FOR ISOLATED ROOT ********** + XU = 1.0D+00 + IF (P .NE. Q) GO TO 160 + RV6(P) = 1.0D+00 + GO TO 600 + 160 NORM = ABS(D(P)) +C + DO 180 I = IP, Q + 180 NORM = NORM + ABS(D(I)) + ABS(E(I)) +C ********** EPS2 IS THE CRITERION FOR GROUPING, +C EPS3 REPLACES ZERO PIVOTS AND EQUAL +C ROOTS ARE MODIFIED BY EPS3, +C EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW ********** + EPS2 = 1.0D-03 * NORM + EPS3 = MACHEP * NORM + UK = IQMP + EPS4 = UK * EPS3 + UK = EPS4 / SQRT(UK) + S = P + 200 GROUP = 0 + GO TO 240 +C ********** LOOK FOR CLOSE OR COINCIDENT ROOTS ********** + 220 IF (ABS(X1-X0) .GE. EPS2) GO TO 200 + GROUP = GROUP + 1 + IF (ORDER * (X1 - X0) .LE. 0.0D+00) X1 = X0 + ORDER * EPS3 +C ********** ELIMINATION WITH INTERCHANGES AND +C INITIALIZATION OF VECTOR ********** + 240 V = 0.0D+00 +C + DO 300 I = P, Q + RV6(I) = UK + IF (I .EQ. P) GO TO 280 + IF (ABS(E(I)) .LT. ABS(U)) GO TO 260 +C ********** WARNING -- A DIVIDE CHECK MAY OCCUR HERE IF +C E2 ARRAY HAS NOT BEEN SPECIFIED CORRECTLY ********** + XU = U / E(I) + RV4(I) = XU + RV1(I-1) = E(I) + RV2(I-1) = D(I) - X1 + RV3(I-1) = 0.0D+00 + IF (I .NE. Q) RV3(I-1) = E(I+1) + U = V - XU * RV2(I-1) + V = -XU * RV3(I-1) + GO TO 300 + 260 XU = E(I) / U + RV4(I) = XU + RV1(I-1) = U + RV2(I-1) = V + RV3(I-1) = 0.0D+00 + 280 U = D(I) - X1 - XU * V + IF (I .NE. Q) V = E(I+1) + 300 CONTINUE +C + IF (U .EQ. 0.0D+00) U = EPS3 + RV1(Q) = U + RV2(Q) = 0.0D+00 + RV3(Q) = 0.0D+00 +C ********** BACK SUBSTITUTION +C FOR I=Q STEP -1 UNTIL P DO -- ********** + 320 DO 340 II = P, Q + I = P + Q - II + RV6(I) = (RV6(I) - U * RV2(I) - V * RV3(I)) / RV1(I) + V = U + U = RV6(I) + 340 CONTINUE +C ********** ORTHOGONALIZE WITH RESPECT TO PREVIOUS +C MEMBERS OF GROUP ********** + IF (GROUP .EQ. 0) GO TO 400 + J = R +C + DO 380 JJ = 1, GROUP + 360 J = J - 1 + IF (IND(J) .NE. TAG) GO TO 360 + XU = DDOT(IQMP,RV6(P),1,Z(P,J),1) +C + CALL DAXPY(IQMP,-XU,Z(P,J),1,RV6(P),1) +C + 380 CONTINUE +C + 400 NORM = 0.0D+00 +C + DO 420 I = P, Q + 420 NORM = NORM + ABS(RV6(I)) +C + IF (NORM .GE. 1.0D+00) GO TO 560 +C ********** FORWARD SUBSTITUTION ********** + IF (ITS .EQ. 5) GO TO 540 + IF (NORM .NE. 0.0D+00) GO TO 440 + RV6(S) = EPS4 + S = S + 1 + IF (S .GT. Q) S = P + GO TO 480 + 440 XU = EPS4 / NORM +C + DO 460 I = P, Q + 460 RV6(I) = RV6(I) * XU +C ********** ELIMINATION OPERATIONS ON NEXT VECTOR +C ITERATE ********** + 480 DO 520 I = IP, Q + U = RV6(I) +C ********** IF RV1(I-1) .EQ. E(I), A ROW INTERCHANGE +C WAS PERFORMED EARLIER IN THE +C TRIANGULARIZATION PROCESS ********** + IF (RV1(I-1) .NE. E(I)) GO TO 500 + U = RV6(I-1) + RV6(I-1) = RV6(I) + 500 RV6(I) = U - RV4(I) * RV6(I-1) + 520 CONTINUE +C + ITS = ITS + 1 + GO TO 320 +C ********** SET ERROR -- NON-CONVERGED EIGENVECTOR ********** + 540 IERR = -R + XU = 0.0D+00 + GO TO 600 +C ********** NORMALIZE SO THAT SUM OF SQUARES IS +C 1 AND EXPAND TO FULL ORDER ********** + 560 U = 0.0D+00 +C + DO 580 I = P, Q + RV6(I) = RV6(I) / NORM + 580 U = U + RV6(I)**2 +C + XU = 1.0D+00 / SQRT(U) +C + 600 DO 620 I = 1, N + 620 Z(I,R) = 0.0D+00 +C + DO 640 I = P, Q + 640 Z(I,R) = RV6(I) * XU +C + X0 = X1 + 660 CONTINUE +C + IF (Q .LT. N) GO TO 100 + 680 RETURN +C ********** LAST CARD OF TINVIT ********** + END +C*MODULE EIGEN *DECK TQL2 +C +C ------------------------------------------------------------------ +C + SUBROUTINE TQL2(NM,N,D,E,Z,IERR) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DOUBLE PRECISION MACHEP + DIMENSION D(N),E(N),Z(NM,N) +C +C THIS ROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL2, +C NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, AND +C WILKINSON. +C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971). +C +C THIS ROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS +C OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE QL METHOD. +C THE EIGENVECTORS OF A FULL SYMMETRIC MATRIX CAN ALSO +C BE FOUND IF TRED2 HAS BEEN USED TO REDUCE THIS +C FULL MATRIX TO TRIDIAGONAL FORM. +C +C ON INPUT- +C +C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL +C ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE +C DIMENSION STATEMENT, +C +C N IS THE ORDER OF THE MATRIX, +C +C D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX, +C +C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX +C IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY, +C +C Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE +C REDUCTION BY TRED2, IF PERFORMED. IF THE EIGENVECTORS +C OF THE TRIDIAGONAL MATRIX ARE DESIRED, Z MUST CONTAIN +C THE IDENTITY MATRIX. +C +C ON OUTPUT- +C +C D CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN +C ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT BUT +C UNORDERED FOR INDICES 1,2,...,IERR-1, +C +C E HAS BEEN DESTROYED, +C +C Z CONTAINS ORTHONORMAL EIGENVECTORS OF THE SYMMETRIC +C TRIDIAGONAL (OR FULL) MATRIX. IF AN ERROR EXIT IS MADE, +C Z CONTAINS THE EIGENVECTORS ASSOCIATED WITH THE STORED +C EIGENVALUES, +C +C IERR IS SET TO +C ZERO FOR NORMAL RETURN, +C J IF THE J-TH EIGENVALUE HAS NOT BEEN +C DETERMINED AFTER 30 ITERATIONS. +C +C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, +C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY +C +C ------------------------------------------------------------------ +C +C ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING +C THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC. +C +C ********** + MACHEP = 2.0D+00**(-50) +C + IERR = 0 + IF (N .EQ. 1) GO TO 400 +C + DO 100 I = 2, N + 100 E(I-1) = E(I) +C + F = 0.0D+00 + B = 0.0D+00 + E(N) = 0.0D+00 +C + DO 300 L = 1, N + J = 0 + H = MACHEP * (ABS(D(L)) + ABS(E(L))) + IF (B .LT. H) B = H +C ********** LOOK FOR SMALL SUB-DIAGONAL ELEMENT ********** + DO 120 M = L, N + IF (ABS(E(M)) .LE. B) GO TO 140 +C ********** E(N) IS ALWAYS ZERO, SO THERE IS NO EXIT +C THROUGH THE BOTTOM OF THE LOOP ********** + 120 CONTINUE +C + 140 IF (M .EQ. L) GO TO 280 + 160 IF (J .EQ. 30) GO TO 380 + J = J + 1 +C ********** FORM SHIFT ********** + L1 = L + 1 + G = D(L) + P = (D(L1) - G) / (2.0D+00 * E(L)) + R = SQRT(P*P+1.0D+00) + D(L) = E(L) / (P + SIGN(R,P)) + H = G - D(L) +C + DO 180 I = L1, N + 180 D(I) = D(I) - H +C + F = F + H +C ********** QL TRANSFORMATION ********** + P = D(M) + C = 1.0D+00 + S = 0.0D+00 + MML = M - L +C ********** FOR I=M-1 STEP -1 UNTIL L DO -- ********** + DO 260 II = 1, MML + I = M - II + G = C * E(I) + H = C * P + IF (ABS(P) .LT. ABS(E(I))) GO TO 200 + C = E(I) / P + R = SQRT(C*C+1.0D+00) + E(I+1) = S * P * R + S = C / R + C = 1.0D+00 / R + GO TO 220 + 200 C = P / E(I) + R = SQRT(C*C+1.0D+00) + E(I+1) = S * E(I) * R + S = 1.0D+00 / R + C = C * S + 220 P = C * D(I) - S * G + D(I+1) = H + S * (C * G + S * D(I)) +C ********** FORM VECTOR ********** + CALL DROT(N,Z(1,I+1),1,Z(1,I),1,C,S) +C + 260 CONTINUE +C + E(L) = S * P + D(L) = C * P + IF (ABS(E(L)) .GT. B) GO TO 160 + 280 D(L) = D(L) + F + 300 CONTINUE +C ********** ORDER EIGENVALUES AND EIGENVECTORS ********** + DO 360 II = 2, N + I = II - 1 + K = I + P = D(I) +C + DO 320 J = II, N + IF (D(J) .GE. P) GO TO 320 + K = J + P = D(J) + 320 CONTINUE +C + IF (K .EQ. I) GO TO 360 + D(K) = D(I) + D(I) = P +C + CALL DSWAP(N,Z(1,I),1,Z(1,K),1) +C + 360 CONTINUE +C + GO TO 400 +C ********** SET ERROR -- NO CONVERGENCE TO AN +C EIGENVALUE AFTER 30 ITERATIONS ********** + 380 IERR = L + 400 RETURN +C ********** LAST CARD OF TQL2 ********** + END +C*MODULE EIGEN *DECK TRBK3B +C +C ------------------------------------------------------------------ +C + SUBROUTINE TRBK3B(NM,N,NV,A,M,Z) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION A(NV),Z(NM,M) +C +C THIS ROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRBAK3, +C NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. +C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). +C +C THIS ROUTINE FORMS THE EIGENVECTORS OF A REAL SYMMETRIC +C MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING +C SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY TRED3B. +C +C ON INPUT- +C +C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL +C ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE +C DIMENSION STATEMENT, +C +C N IS THE ORDER OF THE MATRIX, +C +C NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A +C AS DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT, +C +C A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANSFORMATIONS +C USED IN THE REDUCTION BY TRED3B IN ITS FIRST +C N*(N+1)/2 POSITIONS, +C +C M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED, +C +C Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED +C IN ITS FIRST M COLUMNS. +C +C ON OUTPUT- +C +C Z CONTAINS THE TRANSFORMED EIGENVECTORS +C IN ITS FIRST M COLUMNS. +C +C NOTE THAT TRBAK3 PRESERVES VECTOR EUCLIDEAN NORMS. +C +C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, +C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY +C +C ------------------------------------------------------------------ +C + IF (M .EQ. 0) GO TO 140 + IF (N .EQ. 1) GO TO 140 +C + DO 120 I = 2, N + L = I - 1 + IZ = (I * L) / 2 + IK = IZ + I + H = A(IK) + IF (H .EQ. 0.0D+00) GO TO 120 +C + DO 100 J = 1, M + S = -DDOT(L,A(IZ+1),1,Z(1,J),1) +C +C ********** DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ********** + S = (S / H) / H +C + CALL DAXPY(L,S,A(IZ+1),1,Z(1,J),1) +C + 100 CONTINUE +C + 120 CONTINUE +C + 140 RETURN +C ********** LAST CARD OF TRBAK3 ********** + END +C*MODULE EIGEN *DECK TRED3B +C +C ------------------------------------------------------------------ +C + SUBROUTINE TRED3B(N,NV,A,D,E,E2) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION A(NV),D(N),E(N),E2(N) +C +C THIS ROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED3, +C NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. +C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). +C +C THIS ROUTINE REDUCES A REAL SYMMETRIC MATRIX, STORED AS +C A ONE-DIMENSIONAL ARRAY, TO A SYMMETRIC TRIDIAGONAL MATRIX +C USING ORTHOGONAL SIMILARITY TRANSFORMATIONS. +C +C ON INPUT- +C +C N IS THE ORDER OF THE MATRIX, +C +C NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A +C AS DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT, +C +C A CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC +C INPUT MATRIX, STORED ROW-WISE AS A ONE-DIMENSIONAL +C ARRAY, IN ITS FIRST N*(N+1)/2 POSITIONS. +C +C ON OUTPUT- +C +C A CONTAINS INFORMATION ABOUT THE ORTHOGONAL +C TRANSFORMATIONS USED IN THE REDUCTION, +C +C D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX, +C +C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL +C MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO, +C +C E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. +C E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. +C +C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, +C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY +C +C ------------------------------------------------------------------ +C +C ********** FOR I=N STEP -1 UNTIL 1 DO -- ********** + DO 300 II = 1, N + I = N + 1 - II + L = I - 1 + IZ = (I * L) / 2 + H = 0.0D+00 + SCALE = 0.0D+00 + IF (L .LT. 1) GO TO 120 +C ********** SCALE ROW (ALGOL TOL THEN NOT NEEDED) ********** + DO 100 K = 1, L + IZ = IZ + 1 + D(K) = A(IZ) + SCALE = SCALE + ABS(D(K)) + 100 CONTINUE +C + IF (SCALE .NE. 0.0D+00) GO TO 140 + 120 E(I) = 0.0D+00 + E2(I) = 0.0D+00 + GO TO 280 +C + 140 DO 160 K = 1, L + D(K) = D(K) / SCALE + H = H + D(K) * D(K) + 160 CONTINUE +C + E2(I) = SCALE * SCALE * H + F = D(L) + G = -SIGN(SQRT(H),F) + E(I) = SCALE * G + H = H - F * G + D(L) = F - G + A(IZ) = SCALE * D(L) + IF (L .EQ. 1) GO TO 280 + F = 0.0D+00 +C + JK = 1 + DO 220 J = 1, L + JM1 = J - 1 + DT = D(J) + G = 0.0D+00 +C ********** FORM ELEMENT OF A*U ********** + IF (JM1 .EQ. 0) GO TO 200 + DO 180 K = 1, JM1 + E(K) = E(K) + DT * A(JK) + G = G + D(K) * A(JK) + JK = JK + 1 + 180 CONTINUE + 200 E(J) = G + A(JK) * DT + JK = JK + 1 +C ********** FORM ELEMENT OF P ********** + 220 CONTINUE + F = 0.0D+00 + DO 240 J = 1, L + E(J) = E(J) / H + F = F + E(J) * D(J) + 240 CONTINUE +C + HH = F / (H + H) + JK = 0 +C ********** FORM REDUCED A ********** + DO 260 J = 1, L + F = D(J) + G = E(J) - HH * F + E(J) = G +C + DO 260 K = 1, J + JK = JK + 1 + A(JK) = A(JK) - F * E(K) - G * D(K) + 260 CONTINUE +C + 280 D(I) = A(IZ+1) + A(IZ+1) = SCALE * SQRT(H) + 300 CONTINUE +C + RETURN +C ********** LAST CARD OF TRED3 ********** + END diff --git a/source/unres/src_Eshel/SRC-SURPLUS/energy_p_new-sep_barrier.F b/source/unres/src_Eshel/SRC-SURPLUS/energy_p_new-sep_barrier.F new file mode 100644 index 0000000..c89aee2 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/energy_p_new-sep_barrier.F @@ -0,0 +1,2322 @@ +C----------------------------------------------------------------------- + double precision function sscale(r) + double precision r,gamm + include "COMMON.SPLITELE" + if(r.lt.r_cut-rlamb) then + sscale=1.0d0 + else if(r.le.r_cut.and.r.ge.r_cut-rlamb) then + gamm=(r-(r_cut-rlamb))/rlamb + sscale=1.0d0+gamm*gamm*(2*gamm-3.0d0) + else + sscale=0d0 + endif + return + end +C----------------------------------------------------------------------- + subroutine elj_long(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJ potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (accur=1.0d-10) + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.TORSION' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) +c write(iout,*)'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) +cd write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint), +cd & 'iend=',iend(i,iint) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + rij=xj*xj+yj*yj+zj*zj + sss=sscale(dsqrt(rij)/sigma(itypi,itypj)) + if (sss.lt.1.0d0) then + rrij=1.0D0/rij + eps0ij=eps(itypi,itypj) + fac=rrij**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e1+e2 + evdw=evdw+(1.0d0-sss)*evdwij +C +C Calculate the components of the gradient in DC and X +C + fac=-rrij*(e1+evdwij)*(1.0d0-sss) + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + endif + enddo ! j + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc(j,i)=expon*gvdwc(j,i) + gvdwx(j,i)=expon*gvdwx(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time, the factor of EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end +C----------------------------------------------------------------------- + subroutine elj_short(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJ potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (accur=1.0d-10) + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.TORSION' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) +c write(iout,*)'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C Change 12/1/95 + num_conti=0 +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) +cd write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint), +cd & 'iend=',iend(i,iint) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi +C Change 12/1/95 to calculate four-body interactions + rij=xj*xj+yj*yj+zj*zj + sss=sscale(dsqrt(rij)/sigma(itypi,itypj)) + if (sss.gt.0.0d0) then + rrij=1.0D0/rij + eps0ij=eps(itypi,itypj) + fac=rrij**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e1+e2 + evdw=evdw+sss*evdwij +C +C Calculate the components of the gradient in DC and X +C + fac=-rrij*(e1+evdwij)*sss + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + endif + enddo ! j + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc(j,i)=expon*gvdwc(j,i) + gvdwx(j,i)=expon*gvdwx(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time, the factor of EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end +C----------------------------------------------------------------------------- + subroutine eljk_long(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJK potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + dimension gg(3) + logical scheck +c print *,'Entering ELJK nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + fac_augm=rrij**expon + e_augm=augm(itypi,itypj)*fac_augm + r_inv_ij=dsqrt(rrij) + rij=1.0D0/r_inv_ij + sss=sscale(rij/sigma(itypi,itypj)) + if (sss.lt.1.0d0) then + r_shift_inv=1.0D0/(rij+r0(itypi,itypj)-sigma(itypi,itypj)) + fac=r_shift_inv**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e_augm+e1+e2 +cd sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +cd epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),8(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & restyp(itypi),i,restyp(itypj),j,aa(itypi,itypj), +cd & bb(itypi,itypj),augm(itypi,itypj),epsi,sigm, +cd & sigma(itypi,itypj),1.0D0/dsqrt(rrij),evdwij, +cd & (c(k,i),k=1,3),(c(k,j),k=1,3) + evdw=evdw+(1.0d0-sss)*evdwij +C +C Calculate the components of the gradient in DC and X +C + fac=-2.0D0*rrij*e_augm-r_inv_ij*r_shift_inv*(e1+e1+e2) + fac=fac*(1.0d0-sss) + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + endif + enddo ! j + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc(j,i)=expon*gvdwc(j,i) + gvdwx(j,i)=expon*gvdwx(j,i) + enddo + enddo + return + end +C----------------------------------------------------------------------------- + subroutine eljk_short(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJK potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + dimension gg(3) + logical scheck +c print *,'Entering ELJK nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + fac_augm=rrij**expon + e_augm=augm(itypi,itypj)*fac_augm + r_inv_ij=dsqrt(rrij) + rij=1.0D0/r_inv_ij + sss=sscale(rij/sigma(itypi,itypj)) + if (sss.gt.0.0d0) then + r_shift_inv=1.0D0/(rij+r0(itypi,itypj)-sigma(itypi,itypj)) + fac=r_shift_inv**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e_augm+e1+e2 +cd sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +cd epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),8(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & restyp(itypi),i,restyp(itypj),j,aa(itypi,itypj), +cd & bb(itypi,itypj),augm(itypi,itypj),epsi,sigm, +cd & sigma(itypi,itypj),1.0D0/dsqrt(rrij),evdwij, +cd & (c(k,i),k=1,3),(c(k,j),k=1,3) + evdw=evdw+sss*evdwij +C +C Calculate the components of the gradient in DC and X +C + fac=-2.0D0*rrij*e_augm-r_inv_ij*r_shift_inv*(e1+e1+e2) + fac=fac*sss + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + endif + enddo ! j + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc(j,i)=expon*gvdwc(j,i) + gvdwx(j,i)=expon*gvdwx(j,i) + enddo + enddo + return + end +C----------------------------------------------------------------------------- + subroutine ebp_long(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Berne-Pechukas potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + common /srutu/ icall +c double precision rrsave(maxdim) + logical lprn + evdw=0.0D0 +c print *,'Entering EBP nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 +c if (icall.eq.0) then +c lprn=.true. +c else + lprn=.false. +c endif + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.lt.1.0d0) then + +C Calculate the angle-dependent terms of energy & contributions to derivatives. + call sc_angular +C Calculate whole angle-dependent part of epsilon and contributions +C to its derivatives + fac=(rrij*sigsq)**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt + evdwij=evdwij*eps2rt*eps3rt + evdw=evdw+evdwij*(1.0d0-sss) + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),15(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & epsi,sigm,chi1,chi2,chip1,chip2, +cd & eps1,eps2rt**2,eps3rt**2,1.0D0/dsqrt(sigsq), +cd & om1,om2,om12,1.0D0/dsqrt(rrij), +cd & evdwij + endif +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij) + sigder=fac/sigsq + fac=rrij*fac +C Calculate radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate the angular part of the gradient and sum add the contributions +C to the appropriate components of the Cartesian gradient. + call sc_grad_scale(1.0d0-sss) + endif + enddo ! j + enddo ! iint + enddo ! i +c stop + return + end +C----------------------------------------------------------------------------- + subroutine ebp_short(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Berne-Pechukas potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + common /srutu/ icall +c double precision rrsave(maxdim) + logical lprn + evdw=0.0D0 +c print *,'Entering EBP nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 +c if (icall.eq.0) then +c lprn=.true. +c else + lprn=.false. +c endif + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.gt.0.0d0) then + +C Calculate the angle-dependent terms of energy & contributions to derivatives. + call sc_angular +C Calculate whole angle-dependent part of epsilon and contributions +C to its derivatives + fac=(rrij*sigsq)**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt + evdwij=evdwij*eps2rt*eps3rt + evdw=evdw+evdwij*sss + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),15(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & epsi,sigm,chi1,chi2,chip1,chip2, +cd & eps1,eps2rt**2,eps3rt**2,1.0D0/dsqrt(sigsq), +cd & om1,om2,om12,1.0D0/dsqrt(rrij), +cd & evdwij + endif +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij) + sigder=fac/sigsq + fac=rrij*fac +C Calculate radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate the angular part of the gradient and sum add the contributions +C to the appropriate components of the Cartesian gradient. + call sc_grad_scale(sss) + endif + enddo ! j + enddo ! iint + enddo ! i +c stop + return + end +C----------------------------------------------------------------------------- + subroutine egb_long(evdw,evdw_p,evdw_m) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Gay-Berne potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + include 'COMMON.CONTROL' + logical lprn +ccccc energy_dec=.false. +c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + evdw_p=0.0D0 + evdw_m=0.0D0 + lprn=.false. +c if (icall.eq.0) lprn=.false. + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +c write (iout,*) "i",i,dsc_inv(itypi),dsci_inv,1.0d0/vbld(i+nres) +c write (iout,*) "dcnori",dxi*dxi+dyi*dyi+dzi*dzi +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) +c write (iout,*) "j",j,dsc_inv(itypj),dscj_inv, +c & 1.0d0/vbld(j+nres) +c write (iout,*) "i",i," j", j," itype",itype(i),itype(j) + sig0ij=sigma(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.lt.1.0d0) then + +C Calculate angle-dependent terms of energy and contributions to their +C derivatives. + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+sig0ij +c for diagnostics; uncomment +c rij_shift=1.2*sig0ij +C I hate to put IF's in the loops, but here don't have another choice!!!! + if (rij_shift.le.0.0D0) then + evdw=1.0D20 +cd write (iout,'(2(a3,i3,2x),17(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & rij_shift,1.0D0/rij,sig,sig0ij,sigsq,1-dsqrt(sigsq) + return + endif + sigder=-sig*sigsq +c--------------------------------------------------------------- + rij_shift=1.0D0/rij_shift + fac=rij_shift**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt +c write (iout,*) "sigsq",sigsq," sig",sig," eps2rt",eps2rt, +c & " eps3rt",eps3rt," eps1",eps1," e1",e1," e2",e2 + evdwij=evdwij*eps2rt*eps3rt +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + evdw_p=evdw_p+evdwij*(1.0d0-sss) + else + evdw_m=evdw_m+evdwij*(1.0d0-sss) + endif +#else + evdw=evdw+evdwij*(1.0d0-sss) +#endif + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) + write (iout,'(2(a3,i3,2x),17(0pf7.3))') + & restyp(itypi),i,restyp(itypj),j, + & epsi,sigm,chi1,chi2,chip1,chip2, + & eps1,eps2rt**2,eps3rt**2,sig,sig0ij, + & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, + & evdwij + endif + + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw',i,j,evdwij + +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij)*rij_shift + sigder=fac*sigder + fac=rij*fac +c fac=0.0d0 +C Calculate the radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate angular part of the gradient. +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + call sc_grad_scale_T(1.0d0-sss) + else + call sc_grad_scale(1.0d0-sss) + endif +#else + call sc_grad_scale(1.0d0-sss) +#endif + endif + enddo ! j + enddo ! iint + enddo ! i +c write (iout,*) "Number of loop steps in EGB:",ind +cccc energy_dec=.false. + return + end +C----------------------------------------------------------------------------- + subroutine egb_short(evdw,evdw_p,evdw_m) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Gay-Berne potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + include 'COMMON.CONTROL' + logical lprn + evdw=0.0D0 + evdw_p=0.0D0 + evdw_m=0.0D0 +ccccc energy_dec=.false. +c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + lprn=.false. +c if (icall.eq.0) lprn=.false. + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +c write (iout,*) "i",i,dsc_inv(itypi),dsci_inv,1.0d0/vbld(i+nres) +c write (iout,*) "dcnori",dxi*dxi+dyi*dyi+dzi*dzi +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) +c write (iout,*) "j",j,dsc_inv(itypj),dscj_inv, +c & 1.0d0/vbld(j+nres) +c write (iout,*) "i",i," j", j," itype",itype(i),itype(j) + sig0ij=sigma(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.gt.0.0d0) then + +C Calculate angle-dependent terms of energy and contributions to their +C derivatives. + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+sig0ij +c for diagnostics; uncomment +c rij_shift=1.2*sig0ij +C I hate to put IF's in the loops, but here don't have another choice!!!! + if (rij_shift.le.0.0D0) then + evdw=1.0D20 +cd write (iout,'(2(a3,i3,2x),17(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & rij_shift,1.0D0/rij,sig,sig0ij,sigsq,1-dsqrt(sigsq) + return + endif + sigder=-sig*sigsq +c--------------------------------------------------------------- + rij_shift=1.0D0/rij_shift + fac=rij_shift**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt +c write (iout,*) "sigsq",sigsq," sig",sig," eps2rt",eps2rt, +c & " eps3rt",eps3rt," eps1",eps1," e1",e1," e2",e2 + evdwij=evdwij*eps2rt*eps3rt +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + evdw_p=evdw_p+evdwij*sss + else + evdw_m=evdw_m+evdwij*sss + endif +#else + evdw=evdw+evdwij*sss +#endif + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) + write (iout,'(2(a3,i3,2x),17(0pf7.3))') + & restyp(itypi),i,restyp(itypj),j, + & epsi,sigm,chi1,chi2,chip1,chip2, + & eps1,eps2rt**2,eps3rt**2,sig,sig0ij, + & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, + & evdwij + endif + + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw',i,j,evdwij + +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij)*rij_shift + sigder=fac*sigder + fac=rij*fac +c fac=0.0d0 +C Calculate the radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate angular part of the gradient. +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + call sc_grad_scale_T(sss) + else + call sc_grad_scale(sss) + endif +#else + call sc_grad_scale(sss) +#endif + endif + enddo ! j + enddo ! iint + enddo ! i +c write (iout,*) "Number of loop steps in EGB:",ind +cccc energy_dec=.false. + return + end +C----------------------------------------------------------------------------- + subroutine egbv_long(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Gay-Berne-Vorobjev potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + common /srutu/ icall + logical lprn + evdw=0.0D0 +c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + lprn=.false. +c if (icall.eq.0) lprn=.true. + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) + sig0ij=sigma(itypi,itypj) + r0ij=r0(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.lt.1.0d0) then + +C Calculate angle-dependent terms of energy and contributions to their +C derivatives. + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+r0ij +C I hate to put IF's in the loops, but here don't have another choice!!!! + if (rij_shift.le.0.0D0) then + evdw=1.0D20 + return + endif + sigder=-sig*sigsq +c--------------------------------------------------------------- + rij_shift=1.0D0/rij_shift + fac=rij_shift**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt + fac_augm=rrij**expon + e_augm=augm(itypi,itypj)*fac_augm + evdwij=evdwij*eps2rt*eps3rt + evdw=evdw+(evdwij+e_augm)*(1.0d0-sss) + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) + write (iout,'(2(a3,i3,2x),17(0pf7.3))') + & restyp(itypi),i,restyp(itypj),j, + & epsi,sigm,sig,(augm(itypi,itypj)/epsi)**(1.0D0/12.0D0), + & chi1,chi2,chip1,chip2, + & eps1,eps2rt**2,eps3rt**2, + & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, + & evdwij+e_augm + endif +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij)*rij_shift + sigder=fac*sigder + fac=rij*fac-2*expon*rrij*e_augm +C Calculate the radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate angular part of the gradient. + call sc_grad_scale(1.0d0-sss) + endif + enddo ! j + enddo ! iint + enddo ! i + end +C----------------------------------------------------------------------------- + subroutine egbv_short(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Gay-Berne-Vorobjev potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + common /srutu/ icall + logical lprn + evdw=0.0D0 +c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + lprn=.false. +c if (icall.eq.0) lprn=.true. + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) + sig0ij=sigma(itypi,itypj) + r0ij=r0(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.gt.0.0d0) then + +C Calculate angle-dependent terms of energy and contributions to their +C derivatives. + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+r0ij +C I hate to put IF's in the loops, but here don't have another choice!!!! + if (rij_shift.le.0.0D0) then + evdw=1.0D20 + return + endif + sigder=-sig*sigsq +c--------------------------------------------------------------- + rij_shift=1.0D0/rij_shift + fac=rij_shift**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt + fac_augm=rrij**expon + e_augm=augm(itypi,itypj)*fac_augm + evdwij=evdwij*eps2rt*eps3rt + evdw=evdw+(evdwij+e_augm)*sss + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) + write (iout,'(2(a3,i3,2x),17(0pf7.3))') + & restyp(itypi),i,restyp(itypj),j, + & epsi,sigm,sig,(augm(itypi,itypj)/epsi)**(1.0D0/12.0D0), + & chi1,chi2,chip1,chip2, + & eps1,eps2rt**2,eps3rt**2, + & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, + & evdwij+e_augm + endif +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij)*rij_shift + sigder=fac*sigder + fac=rij*fac-2*expon*rrij*e_augm +C Calculate the radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate angular part of the gradient. + call sc_grad_scale(sss) + endif + enddo ! j + enddo ! iint + enddo ! i + end +C---------------------------------------------------------------------------- + subroutine sc_grad_scale(scalfac) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.CALC' + include 'COMMON.IOUNITS' + double precision dcosom1(3),dcosom2(3) + double precision scalfac + eom1=eps2der*eps2rt_om1-2.0D0*alf1*eps3der+sigder*sigsq_om1 + eom2=eps2der*eps2rt_om2+2.0D0*alf2*eps3der+sigder*sigsq_om2 + eom12=evdwij*eps1_om12+eps2der*eps2rt_om12 + & -2.0D0*alf12*eps3der+sigder*sigsq_om12 +c diagnostics only +c eom1=0.0d0 +c eom2=0.0d0 +c eom12=evdwij*eps1_om12 +c end diagnostics +c write (iout,*) "eps2der",eps2der," eps3der",eps3der, +c & " sigder",sigder +c write (iout,*) "eps1_om12",eps1_om12," eps2rt_om12",eps2rt_om12 +c write (iout,*) "eom1",eom1," eom2",eom2," eom12",eom12 + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,nres+i)-om1*erij(k)) + dcosom2(k)=rij*(dc_norm(k,nres+j)-om2*erij(k)) + enddo + do k=1,3 + gg(k)=(gg(k)+eom1*dcosom1(k)+eom2*dcosom2(k))*scalfac + enddo +c write (iout,*) "gg",(gg(k),k=1,3) + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv*scalfac + gvdwx(k,j)=gvdwx(k,j)+gg(k) + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv*scalfac +c write (iout,*)(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) +c & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv +c write (iout,*)(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) +c & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + enddo +C +C Calculate the components of the gradient in DC and X +C + do l=1,3 + gvdwc(l,i)=gvdwc(l,i)-gg(l) + gvdwc(l,j)=gvdwc(l,j)+gg(l) + enddo + return + end +C---------------------------------------------------------------------------- + subroutine sc_grad_scale_T(scalfac) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.CALC' + include 'COMMON.IOUNITS' + double precision dcosom1(3),dcosom2(3) + double precision scalfac + eom1=eps2der*eps2rt_om1-2.0D0*alf1*eps3der+sigder*sigsq_om1 + eom2=eps2der*eps2rt_om2+2.0D0*alf2*eps3der+sigder*sigsq_om2 + eom12=evdwij*eps1_om12+eps2der*eps2rt_om12 + & -2.0D0*alf12*eps3der+sigder*sigsq_om12 +c diagnostics only +c eom1=0.0d0 +c eom2=0.0d0 +c eom12=evdwij*eps1_om12 +c end diagnostics +c write (iout,*) "eps2der",eps2der," eps3der",eps3der, +c & " sigder",sigder +c write (iout,*) "eps1_om12",eps1_om12," eps2rt_om12",eps2rt_om12 +c write (iout,*) "eom1",eom1," eom2",eom2," eom12",eom12 + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,nres+i)-om1*erij(k)) + dcosom2(k)=rij*(dc_norm(k,nres+j)-om2*erij(k)) + enddo + do k=1,3 + gg(k)=(gg(k)+eom1*dcosom1(k)+eom2*dcosom2(k))*scalfac + enddo +c write (iout,*) "gg",(gg(k),k=1,3) + do k=1,3 + gvdwxT(k,i)=gvdwxT(k,i)-gg(k) + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv*scalfac + gvdwxT(k,j)=gvdwxT(k,j)+gg(k) + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv*scalfac +c write (iout,*)(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) +c & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv +c write (iout,*)(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) +c & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + enddo +C +C Calculate the components of the gradient in DC and X +C + do l=1,3 + gvdwcT(l,i)=gvdwcT(l,i)-gg(l) + gvdwcT(l,j)=gvdwcT(l,j)+gg(l) + enddo + return + end + +C-------------------------------------------------------------------------- + subroutine eelec_scale(ees,evdw1,eel_loc,eello_turn3,eello_turn4) +C +C This subroutine calculates the average interaction energy and its gradient +C in the virtual-bond vectors between non-adjacent peptide groups, based on +C the potential described in Liwo et al., Protein Sci., 1993, 2, 1715. +C The potential depends both on the distance of peptide-group centers and on +C the orientation of the CA-CA virtual bonds. +C + implicit real*8 (a-h,o-z) +#ifdef MPI + include 'mpif.h' +#endif + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.TIME1' + dimension ggg(3),gggp(3),gggm(3),erij(3),dcosb(3),dcosg(3), + & erder(3,3),uryg(3,3),urzg(3,3),vryg(3,3),vrzg(3,3) + double precision acipa(2,2),agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions +#ifdef MOMENT + double precision scal_el /1.0d0/ +#else + double precision scal_el /0.5d0/ +#endif +C 12/13/98 +C 13-go grudnia roku pamietnego... + double precision unmat(3,3) /1.0d0,0.0d0,0.0d0, + & 0.0d0,1.0d0,0.0d0, + & 0.0d0,0.0d0,1.0d0/ +cd write(iout,*) 'In EELEC' +cd do i=1,nloctyp +cd write(iout,*) 'Type',i +cd write(iout,*) 'B1',B1(:,i) +cd write(iout,*) 'B2',B2(:,i) +cd write(iout,*) 'CC',CC(:,:,i) +cd write(iout,*) 'DD',DD(:,:,i) +cd write(iout,*) 'EE',EE(:,:,i) +cd enddo +cd call check_vecgrad +cd stop + if (icheckgrad.eq.1) then + do i=1,nres-1 + fac=1.0d0/dsqrt(scalar(dc(1,i),dc(1,i))) + do k=1,3 + dc_norm(k,i)=dc(k,i)*fac + enddo +c write (iout,*) 'i',i,' fac',fac + enddo + endif + if (wel_loc.gt.0.0d0 .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 + & .or. wcorr6.gt.0.0d0 .or. wturn3.gt.0.0d0 .or. + & wturn4.gt.0.0d0 .or. wturn6.gt.0.0d0) then +c call vec_and_deriv +#ifdef TIMING + time01=MPI_Wtime() +#endif + call set_matrices +#ifdef TIMING + time_mat=time_mat+MPI_Wtime()-time01 +#endif + endif +cd do i=1,nres-1 +cd write (iout,*) 'i=',i +cd do k=1,3 +cd write (iout,'(i5,2f10.5)') k,uy(k,i),uz(k,i) +cd enddo +cd do k=1,3 +cd write (iout,'(f10.5,2x,3f10.5,2x,3f10.5)') +cd & uz(k,i),(uzgrad(k,l,1,i),l=1,3),(uzgrad(k,l,2,i),l=1,3) +cd enddo +cd enddo + t_eelecij=0.0d0 + ees=0.0D0 + evdw1=0.0D0 + eel_loc=0.0d0 + eello_turn3=0.0d0 + eello_turn4=0.0d0 + ind=0 + do i=1,nres + num_cont_hb(i)=0 + enddo +cd print '(a)','Enter EELEC' +cd write (iout,*) 'iatel_s=',iatel_s,' iatel_e=',iatel_e + do i=1,nres + gel_loc_loc(i)=0.0d0 + gcorr_loc(i)=0.0d0 + enddo +c +c +c 9/27/08 AL Split the interaction loop to ensure load balancing of turn terms +C +C Loop over i,i+2 and i,i+3 pairs of the peptide groups +C + do i=iturn3_start,iturn3_end + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=0 + call eelecij_scale(i,i+2,ees,evdw1,eel_loc) + if (wturn3.gt.0.0d0) call eturn3(i,eello_turn3) + num_cont_hb(i)=num_conti + enddo + do i=iturn4_start,iturn4_end + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=num_cont_hb(i) + call eelecij_scale(i,i+3,ees,evdw1,eel_loc) + if (wturn4.gt.0.0d0) call eturn4(i,eello_turn4) + num_cont_hb(i)=num_conti + enddo ! i +c +c Loop over all pairs of interacting peptide groups except i,i+2 and i,i+3 +c + do i=iatel_s,iatel_e + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi +c write (iout,*) 'i',i,' ielstart',ielstart(i),' ielend',ielend(i) + num_conti=num_cont_hb(i) + do j=ielstart(i),ielend(i) + call eelecij_scale(i,j,ees,evdw1,eel_loc) + enddo ! j + num_cont_hb(i)=num_conti + enddo ! i +c write (iout,*) "Number of loop steps in EELEC:",ind +cd do i=1,nres +cd write (iout,'(i3,3f10.5,5x,3f10.5)') +cd & i,(gel_loc(k,i),k=1,3),gel_loc_loc(i) +cd enddo +c 12/7/99 Adam eello_turn3 will be considered as a separate energy term +ccc eel_loc=eel_loc+eello_turn3 +cd print *,"Processor",fg_rank," t_eelecij",t_eelecij + return + end +C------------------------------------------------------------------------------- + subroutine eelecij_scale(i,j,ees,evdw1,eel_loc) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.TIME1' + dimension ggg(3),gggp(3),gggm(3),erij(3),dcosb(3),dcosg(3), + & erder(3,3),uryg(3,3),urzg(3,3),vryg(3,3),vrzg(3,3) + double precision acipa(2,2),agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions +#ifdef MOMENT + double precision scal_el /1.0d0/ +#else + double precision scal_el /0.5d0/ +#endif +C 12/13/98 +C 13-go grudnia roku pamietnego... + double precision unmat(3,3) /1.0d0,0.0d0,0.0d0, + & 0.0d0,1.0d0,0.0d0, + & 0.0d0,0.0d0,1.0d0/ +c time00=MPI_Wtime() +cd write (iout,*) "eelecij",i,j + ind=ind+1 + iteli=itel(i) + itelj=itel(j) + if (j.eq.i+2 .and. itelj.eq.2) iteli=2 + aaa=app(iteli,itelj) + bbb=bpp(iteli,itelj) + ael6i=ael6(iteli,itelj) + ael3i=ael3(iteli,itelj) + dxj=dc(1,j) + dyj=dc(2,j) + dzj=dc(3,j) + dx_normj=dc_norm(1,j) + dy_normj=dc_norm(2,j) + dz_normj=dc_norm(3,j) + xj=c(1,j)+0.5D0*dxj-xmedi + yj=c(2,j)+0.5D0*dyj-ymedi + zj=c(3,j)+0.5D0*dzj-zmedi + rij=xj*xj+yj*yj+zj*zj + rrmij=1.0D0/rij + rij=dsqrt(rij) + rmij=1.0D0/rij +c For extracting the short-range part of Evdwpp + sss=sscale(rij/rpp(iteli,itelj)) + + r3ij=rrmij*rmij + r6ij=r3ij*r3ij + cosa=dx_normi*dx_normj+dy_normi*dy_normj+dz_normi*dz_normj + cosb=(xj*dx_normi+yj*dy_normi+zj*dz_normi)*rmij + cosg=(xj*dx_normj+yj*dy_normj+zj*dz_normj)*rmij + fac=cosa-3.0D0*cosb*cosg + ev1=aaa*r6ij*r6ij +c 4/26/02 - AL scaling down 1,4 repulsive VDW interactions + if (j.eq.i+2) ev1=scal_el*ev1 + ev2=bbb*r6ij + fac3=ael6i*r6ij + fac4=ael3i*r3ij + evdwij=ev1+ev2 + el1=fac3*(4.0D0+fac*fac-3.0D0*(cosb*cosb+cosg*cosg)) + el2=fac4*fac + eesij=el1+el2 +C 12/26/95 - for the evaluation of multi-body H-bonding interactions + ees0ij=4.0D0+fac*fac-3.0D0*(cosb*cosb+cosg*cosg) + ees=ees+eesij + evdw1=evdw1+evdwij*(1.0d0-sss) +cd write(iout,'(2(2i3,2x),7(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & iteli,i,itelj,j,aaa,bbb,ael6i,ael3i, +cd & 1.0D0/dsqrt(rrmij),evdwij,eesij, +cd & xmedi,ymedi,zmedi,xj,yj,zj + + if (energy_dec) then + write (iout,'(a6,2i5,0pf7.3,f7.3)') 'evdw1',i,j,evdwij,sss + write (iout,'(a6,2i5,0pf7.3)') 'ees',i,j,eesij + endif + +C +C Calculate contributions to the Cartesian gradient. +C +#ifdef SPLITELE + facvdw=-6*rrmij*(ev1+evdwij)*(1.0d0-sss) + facel=-3*rrmij*(el1+eesij) + fac1=fac + erij(1)=xj*rmij + erij(2)=yj*rmij + erij(3)=zj*rmij +* +* Radial derivatives. First process both termini of the fragment (i,j) +* + ggg(1)=facel*xj + ggg(2)=facel*yj + ggg(3)=facel*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c gelc(k,j)=gelc(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gelc_long(k,j)=gelc_long(k,j)+ggg(k) + gelc_long(k,i)=gelc_long(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gvdwpp(k,i)=gvdwpp(k,i)+ghalf +c gvdwpp(k,j)=gvdwpp(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gvdwpp(l,k)=gvdwpp(l,k)+ggg(l) +cgrad enddo +cgrad enddo +#else + facvdw=ev1+evdwij*(1.0d0-sss) + facel=el1+eesij + fac1=fac + fac=-3*rrmij*(facvdw+facvdw+facel) + erij(1)=xj*rmij + erij(2)=yj*rmij + erij(3)=zj*rmij +* +* Radial derivatives. First process both termini of the fragment (i,j) +* + ggg(1)=fac*xj + ggg(2)=fac*yj + ggg(3)=fac*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c gelc(k,j)=gelc(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gelc_long(k,j)=gelc(k,j)+ggg(k) + gelc_long(k,i)=gelc(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj + do k=1,3 + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + enddo +#endif +* +* Angular part +* + ecosa=2.0D0*fac3*fac1+fac4 + fac4=-3.0D0*fac4 + fac3=-6.0D0*fac3 + ecosb=(fac3*(fac1*cosg+cosb)+cosg*fac4) + ecosg=(fac3*(fac1*cosb+cosg)+cosb*fac4) + do k=1,3 + dcosb(k)=rmij*(dc_norm(k,i)-erij(k)*cosb) + dcosg(k)=rmij*(dc_norm(k,j)-erij(k)*cosg) + enddo +cd print '(2i3,2(3(1pd14.5),3x))',i,j,(dcosb(k),k=1,3), +cd & (dcosg(k),k=1,3) + do k=1,3 + ggg(k)=ecosb*dcosb(k)+ecosg*dcosg(k) + enddo +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c & +(ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i)) +c & + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) +c gelc(k,j)=gelc(k,j)+ghalf +c & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) +c & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) +c enddo +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gelc(k,i)=gelc(k,i) + & +(ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gelc(k,j)=gelc(k,j) + & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gelc_long(k,j)=gelc_long(k,j)+ggg(k) + gelc_long(k,i)=gelc_long(k,i)-ggg(k) + enddo + IF (wel_loc.gt.0.0d0 .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 + & .or. wcorr6.gt.0.0d0 .or. wturn3.gt.0.0d0 + & .or. wturn4.gt.0.0d0 .or. wturn6.gt.0.0d0) THEN +C +C 9/25/99 Mixed third-order local-electrostatic terms. The local-interaction +C energy of a peptide unit is assumed in the form of a second-order +C Fourier series in the angles lambda1 and lambda2 (see Nishikawa et al. +C Macromolecules, 1974, 7, 797-806 for definition). This correlation terms +C are computed for EVERY pair of non-contiguous peptide groups. +C + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + kkk=0 + do k=1,2 + do l=1,2 + kkk=kkk+1 + muij(kkk)=mu(k,i)*mu(l,j) + enddo + enddo +cd write (iout,*) 'EELEC: i',i,' j',j +cd write (iout,*) 'j',j,' j1',j1,' j2',j2 +cd write(iout,*) 'muij',muij + ury=scalar(uy(1,i),erij) + urz=scalar(uz(1,i),erij) + vry=scalar(uy(1,j),erij) + vrz=scalar(uz(1,j),erij) + a22=scalar(uy(1,i),uy(1,j))-3*ury*vry + a23=scalar(uy(1,i),uz(1,j))-3*ury*vrz + a32=scalar(uz(1,i),uy(1,j))-3*urz*vry + a33=scalar(uz(1,i),uz(1,j))-3*urz*vrz + fac=dsqrt(-ael6i)*r3ij + a22=a22*fac + a23=a23*fac + a32=a32*fac + a33=a33*fac +cd write (iout,'(4i5,4f10.5)') +cd & i,itortyp(itype(i)),j,itortyp(itype(j)),a22,a23,a32,a33 +cd write (iout,'(6f10.5)') (muij(k),k=1,4),fac,eel_loc_ij +cd write (iout,'(2(3f10.5,5x)/2(3f10.5,5x))') uy(:,i),uz(:,i), +cd & uy(:,j),uz(:,j) +cd write (iout,'(4f10.5)') +cd & scalar(uy(1,i),uy(1,j)),scalar(uy(1,i),uz(1,j)), +cd & scalar(uz(1,i),uy(1,j)),scalar(uz(1,i),uz(1,j)) +cd write (iout,'(4f10.5)') ury,urz,vry,vrz +cd write (iout,'(9f10.5/)') +cd & fac22,a22,fac23,a23,fac32,a32,fac33,a33,eel_loc_ij +C Derivatives of the elements of A in virtual-bond vectors + call unormderiv(erij(1),unmat(1,1),rmij,erder(1,1)) + do k=1,3 + uryg(k,1)=scalar(erder(1,k),uy(1,i)) + uryg(k,2)=scalar(uygrad(1,k,1,i),erij(1)) + uryg(k,3)=scalar(uygrad(1,k,2,i),erij(1)) + urzg(k,1)=scalar(erder(1,k),uz(1,i)) + urzg(k,2)=scalar(uzgrad(1,k,1,i),erij(1)) + urzg(k,3)=scalar(uzgrad(1,k,2,i),erij(1)) + vryg(k,1)=scalar(erder(1,k),uy(1,j)) + vryg(k,2)=scalar(uygrad(1,k,1,j),erij(1)) + vryg(k,3)=scalar(uygrad(1,k,2,j),erij(1)) + vrzg(k,1)=scalar(erder(1,k),uz(1,j)) + vrzg(k,2)=scalar(uzgrad(1,k,1,j),erij(1)) + vrzg(k,3)=scalar(uzgrad(1,k,2,j),erij(1)) + enddo +C Compute radial contributions to the gradient + facr=-3.0d0*rrmij + a22der=a22*facr + a23der=a23*facr + a32der=a32*facr + a33der=a33*facr + agg(1,1)=a22der*xj + agg(2,1)=a22der*yj + agg(3,1)=a22der*zj + agg(1,2)=a23der*xj + agg(2,2)=a23der*yj + agg(3,2)=a23der*zj + agg(1,3)=a32der*xj + agg(2,3)=a32der*yj + agg(3,3)=a32der*zj + agg(1,4)=a33der*xj + agg(2,4)=a33der*yj + agg(3,4)=a33der*zj +C Add the contributions coming from er + fac3=-3.0d0*fac + do k=1,3 + agg(k,1)=agg(k,1)+fac3*(uryg(k,1)*vry+vryg(k,1)*ury) + agg(k,2)=agg(k,2)+fac3*(uryg(k,1)*vrz+vrzg(k,1)*ury) + agg(k,3)=agg(k,3)+fac3*(urzg(k,1)*vry+vryg(k,1)*urz) + agg(k,4)=agg(k,4)+fac3*(urzg(k,1)*vrz+vrzg(k,1)*urz) + enddo + do k=1,3 +C Derivatives in DC(i) +cgrad ghalf1=0.5d0*agg(k,1) +cgrad ghalf2=0.5d0*agg(k,2) +cgrad ghalf3=0.5d0*agg(k,3) +cgrad ghalf4=0.5d0*agg(k,4) + aggi(k,1)=fac*(scalar(uygrad(1,k,1,i),uy(1,j)) + & -3.0d0*uryg(k,2)*vry)!+ghalf1 + aggi(k,2)=fac*(scalar(uygrad(1,k,1,i),uz(1,j)) + & -3.0d0*uryg(k,2)*vrz)!+ghalf2 + aggi(k,3)=fac*(scalar(uzgrad(1,k,1,i),uy(1,j)) + & -3.0d0*urzg(k,2)*vry)!+ghalf3 + aggi(k,4)=fac*(scalar(uzgrad(1,k,1,i),uz(1,j)) + & -3.0d0*urzg(k,2)*vrz)!+ghalf4 +C Derivatives in DC(i+1) + aggi1(k,1)=fac*(scalar(uygrad(1,k,2,i),uy(1,j)) + & -3.0d0*uryg(k,3)*vry)!+agg(k,1) + aggi1(k,2)=fac*(scalar(uygrad(1,k,2,i),uz(1,j)) + & -3.0d0*uryg(k,3)*vrz)!+agg(k,2) + aggi1(k,3)=fac*(scalar(uzgrad(1,k,2,i),uy(1,j)) + & -3.0d0*urzg(k,3)*vry)!+agg(k,3) + aggi1(k,4)=fac*(scalar(uzgrad(1,k,2,i),uz(1,j)) + & -3.0d0*urzg(k,3)*vrz)!+agg(k,4) +C Derivatives in DC(j) + aggj(k,1)=fac*(scalar(uygrad(1,k,1,j),uy(1,i)) + & -3.0d0*vryg(k,2)*ury)!+ghalf1 + aggj(k,2)=fac*(scalar(uzgrad(1,k,1,j),uy(1,i)) + & -3.0d0*vrzg(k,2)*ury)!+ghalf2 + aggj(k,3)=fac*(scalar(uygrad(1,k,1,j),uz(1,i)) + & -3.0d0*vryg(k,2)*urz)!+ghalf3 + aggj(k,4)=fac*(scalar(uzgrad(1,k,1,j),uz(1,i)) + & -3.0d0*vrzg(k,2)*urz)!+ghalf4 +C Derivatives in DC(j+1) or DC(nres-1) + aggj1(k,1)=fac*(scalar(uygrad(1,k,2,j),uy(1,i)) + & -3.0d0*vryg(k,3)*ury) + aggj1(k,2)=fac*(scalar(uzgrad(1,k,2,j),uy(1,i)) + & -3.0d0*vrzg(k,3)*ury) + aggj1(k,3)=fac*(scalar(uygrad(1,k,2,j),uz(1,i)) + & -3.0d0*vryg(k,3)*urz) + aggj1(k,4)=fac*(scalar(uzgrad(1,k,2,j),uz(1,i)) + & -3.0d0*vrzg(k,3)*urz) +cgrad if (j.eq.nres-1 .and. i.lt.j-2) then +cgrad do l=1,4 +cgrad aggj1(k,l)=aggj1(k,l)+agg(k,l) +cgrad enddo +cgrad endif + enddo + acipa(1,1)=a22 + acipa(1,2)=a23 + acipa(2,1)=a32 + acipa(2,2)=a33 + a22=-a22 + a23=-a23 + do l=1,2 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + if (j.lt.nres-1) then + a22=-a22 + a32=-a32 + do l=1,3,2 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + else + a22=-a22 + a23=-a23 + a32=-a32 + a33=-a33 + do l=1,4 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + endif + ENDIF ! WCORR + IF (wel_loc.gt.0.0d0) THEN +C Contribution to the local-electrostatic energy coming from the i-j pair + eel_loc_ij=a22*muij(1)+a23*muij(2)+a32*muij(3) + & +a33*muij(4) +cd write (iout,*) 'i',i,' j',j,' eel_loc_ij',eel_loc_ij + + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'eelloc',i,j,eel_loc_ij + + eel_loc=eel_loc+eel_loc_ij +C Partial derivatives in virtual-bond dihedral angles gamma + if (i.gt.1) + & gel_loc_loc(i-1)=gel_loc_loc(i-1)+ + & a22*muder(1,i)*mu(1,j)+a23*muder(1,i)*mu(2,j) + & +a32*muder(2,i)*mu(1,j)+a33*muder(2,i)*mu(2,j) + gel_loc_loc(j-1)=gel_loc_loc(j-1)+ + & a22*mu(1,i)*muder(1,j)+a23*mu(1,i)*muder(2,j) + & +a32*mu(2,i)*muder(1,j)+a33*mu(2,i)*muder(2,j) +C Derivatives of eello in DC(i+1) thru DC(j-1) or DC(nres-2) + do l=1,3 + ggg(l)=agg(l,1)*muij(1)+ + & agg(l,2)*muij(2)+agg(l,3)*muij(3)+agg(l,4)*muij(4) + gel_loc_long(l,j)=gel_loc_long(l,j)+ggg(l) + gel_loc_long(l,i)=gel_loc_long(l,i)-ggg(l) +cgrad ghalf=0.5d0*ggg(l) +cgrad gel_loc(l,i)=gel_loc(l,i)+ghalf +cgrad gel_loc(l,j)=gel_loc(l,j)+ghalf + enddo +cgrad do k=i+1,j2 +cgrad do l=1,3 +cgrad gel_loc(l,k)=gel_loc(l,k)+ggg(l) +cgrad enddo +cgrad enddo +C Remaining derivatives of eello + do l=1,3 + gel_loc(l,i)=gel_loc(l,i)+aggi(l,1)*muij(1)+ + & aggi(l,2)*muij(2)+aggi(l,3)*muij(3)+aggi(l,4)*muij(4) + gel_loc(l,i+1)=gel_loc(l,i+1)+aggi1(l,1)*muij(1)+ + & aggi1(l,2)*muij(2)+aggi1(l,3)*muij(3)+aggi1(l,4)*muij(4) + gel_loc(l,j)=gel_loc(l,j)+aggj(l,1)*muij(1)+ + & aggj(l,2)*muij(2)+aggj(l,3)*muij(3)+aggj(l,4)*muij(4) + gel_loc(l,j1)=gel_loc(l,j1)+aggj1(l,1)*muij(1)+ + & aggj1(l,2)*muij(2)+aggj1(l,3)*muij(3)+aggj1(l,4)*muij(4) + enddo + ENDIF +C Change 12/26/95 to calculate four-body contributions to H-bonding energy +c if (j.gt.i+1 .and. num_conti.le.maxconts) then + if (wcorr+wcorr4+wcorr5+wcorr6.gt.0.0d0 + & .and. num_conti.le.maxconts) then +c write (iout,*) i,j," entered corr" +C +C Calculate the contact function. The ith column of the array JCONT will +C contain the numbers of atoms that make contacts with the atom I (of numbers +C greater than I). The arrays FACONT and GACONT will contain the values of +C the contact function and its derivative. +c r0ij=1.02D0*rpp(iteli,itelj) +c r0ij=1.11D0*rpp(iteli,itelj) + r0ij=2.20D0*rpp(iteli,itelj) +c r0ij=1.55D0*rpp(iteli,itelj) + call gcont(rij,r0ij,1.0D0,0.2d0*r0ij,fcont,fprimcont) + if (fcont.gt.0.0D0) then + num_conti=num_conti+1 + if (num_conti.gt.maxconts) then + write (iout,*) 'WARNING - max. # of contacts exceeded;', + & ' will skip next contacts for this conf.' + else + jcont_hb(num_conti,i)=j +cd write (iout,*) "i",i," j",j," num_conti",num_conti, +cd & " jcont_hb",jcont_hb(num_conti,i) + IF (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. + & wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0) THEN +C 9/30/99 (AL) - store components necessary to evaluate higher-order loc-el +C terms. + d_cont(num_conti,i)=rij +cd write (2,'(3e15.5)') rij,r0ij+0.2d0*r0ij,rij +C --- Electrostatic-interaction matrix --- + a_chuj(1,1,num_conti,i)=a22 + a_chuj(1,2,num_conti,i)=a23 + a_chuj(2,1,num_conti,i)=a32 + a_chuj(2,2,num_conti,i)=a33 +C --- Gradient of rij + do kkk=1,3 + grij_hb_cont(kkk,num_conti,i)=erij(kkk) + enddo + kkll=0 + do k=1,2 + do l=1,2 + kkll=kkll+1 + do m=1,3 + a_chuj_der(k,l,m,1,num_conti,i)=agg(m,kkll) + a_chuj_der(k,l,m,2,num_conti,i)=aggi(m,kkll) + a_chuj_der(k,l,m,3,num_conti,i)=aggi1(m,kkll) + a_chuj_der(k,l,m,4,num_conti,i)=aggj(m,kkll) + a_chuj_der(k,l,m,5,num_conti,i)=aggj1(m,kkll) + enddo + enddo + enddo + ENDIF + IF (wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) THEN +C Calculate contact energies + cosa4=4.0D0*cosa + wij=cosa-3.0D0*cosb*cosg + cosbg1=cosb+cosg + cosbg2=cosb-cosg +c fac3=dsqrt(-ael6i)/r0ij**3 + fac3=dsqrt(-ael6i)*r3ij +c ees0pij=dsqrt(4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1) + ees0tmp=4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1 + if (ees0tmp.gt.0) then + ees0pij=dsqrt(ees0tmp) + else + ees0pij=0 + endif +c ees0mij=dsqrt(4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2) + ees0tmp=4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2 + if (ees0tmp.gt.0) then + ees0mij=dsqrt(ees0tmp) + else + ees0mij=0 + endif +c ees0mij=0.0D0 + ees0p(num_conti,i)=0.5D0*fac3*(ees0pij+ees0mij) + ees0m(num_conti,i)=0.5D0*fac3*(ees0pij-ees0mij) +C Diagnostics. Comment out or remove after debugging! +c ees0p(num_conti,i)=0.5D0*fac3*ees0pij +c ees0m(num_conti,i)=0.5D0*fac3*ees0mij +c ees0m(num_conti,i)=0.0D0 +C End diagnostics. +c write (iout,*) 'i=',i,' j=',j,' rij=',rij,' r0ij=',r0ij, +c & ' ees0ij=',ees0p(num_conti,i),ees0m(num_conti,i),' fcont=',fcont +C Angular derivatives of the contact function + ees0pij1=fac3/ees0pij + ees0mij1=fac3/ees0mij + fac3p=-3.0D0*fac3*rrmij + ees0pijp=0.5D0*fac3p*(ees0pij+ees0mij) + ees0mijp=0.5D0*fac3p*(ees0pij-ees0mij) +c ees0mij1=0.0D0 + ecosa1= ees0pij1*( 1.0D0+0.5D0*wij) + ecosb1=-1.5D0*ees0pij1*(wij*cosg+cosbg1) + ecosg1=-1.5D0*ees0pij1*(wij*cosb+cosbg1) + ecosa2= ees0mij1*(-1.0D0+0.5D0*wij) + ecosb2=-1.5D0*ees0mij1*(wij*cosg+cosbg2) + ecosg2=-1.5D0*ees0mij1*(wij*cosb-cosbg2) + ecosap=ecosa1+ecosa2 + ecosbp=ecosb1+ecosb2 + ecosgp=ecosg1+ecosg2 + ecosam=ecosa1-ecosa2 + ecosbm=ecosb1-ecosb2 + ecosgm=ecosg1-ecosg2 +C Diagnostics +c ecosap=ecosa1 +c ecosbp=ecosb1 +c ecosgp=ecosg1 +c ecosam=0.0D0 +c ecosbm=0.0D0 +c ecosgm=0.0D0 +C End diagnostics + facont_hb(num_conti,i)=fcont + fprimcont=fprimcont/rij +cd facont_hb(num_conti,i)=1.0D0 +C Following line is for diagnostics. +cd fprimcont=0.0D0 + do k=1,3 + dcosb(k)=rmij*(dc_norm(k,i)-erij(k)*cosb) + dcosg(k)=rmij*(dc_norm(k,j)-erij(k)*cosg) + enddo + do k=1,3 + gggp(k)=ecosbp*dcosb(k)+ecosgp*dcosg(k) + gggm(k)=ecosbm*dcosb(k)+ecosgm*dcosg(k) + enddo + gggp(1)=gggp(1)+ees0pijp*xj + gggp(2)=gggp(2)+ees0pijp*yj + gggp(3)=gggp(3)+ees0pijp*zj + gggm(1)=gggm(1)+ees0mijp*xj + gggm(2)=gggm(2)+ees0mijp*yj + gggm(3)=gggm(3)+ees0mijp*zj +C Derivatives due to the contact function + gacont_hbr(1,num_conti,i)=fprimcont*xj + gacont_hbr(2,num_conti,i)=fprimcont*yj + gacont_hbr(3,num_conti,i)=fprimcont*zj + do k=1,3 +c +c 10/24/08 cgrad and ! comments indicate the parts of the code removed +c following the change of gradient-summation algorithm. +c +cgrad ghalfp=0.5D0*gggp(k) +cgrad ghalfm=0.5D0*gggm(k) + gacontp_hb1(k,num_conti,i)=!ghalfp + & +(ecosap*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosbp*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gacontp_hb2(k,num_conti,i)=!ghalfp + & +(ecosap*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosgp*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gacontp_hb3(k,num_conti,i)=gggp(k) + gacontm_hb1(k,num_conti,i)=!ghalfm + & +(ecosam*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosbm*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gacontm_hb2(k,num_conti,i)=!ghalfm + & +(ecosam*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosgm*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gacontm_hb3(k,num_conti,i)=gggm(k) + enddo + ENDIF ! wcorr + endif ! num_conti.le.maxconts + endif ! fcont.gt.0 + endif ! j.gt.i+1 + if (wturn3.gt.0.0d0 .or. wturn4.gt.0.0d0) then + do k=1,4 + do l=1,3 + ghalf=0.5d0*agg(l,k) + aggi(l,k)=aggi(l,k)+ghalf + aggi1(l,k)=aggi1(l,k)+agg(l,k) + aggj(l,k)=aggj(l,k)+ghalf + enddo + enddo + if (j.eq.nres-1 .and. i.lt.j-2) then + do k=1,4 + do l=1,3 + aggj1(l,k)=aggj1(l,k)+agg(l,k) + enddo + enddo + endif + endif +c t_eelecij=t_eelecij+MPI_Wtime()-time00 + return + end +C----------------------------------------------------------------------- + subroutine evdwpp_short(evdw1) +C +C Compute Evdwpp +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + dimension ggg(3) +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions +#ifdef MOMENT + double precision scal_el /1.0d0/ +#else + double precision scal_el /0.5d0/ +#endif + evdw1=0.0D0 +c write (iout,*) "iatel_s_vdw",iatel_s_vdw, +c & " iatel_e_vdw",iatel_e_vdw + call flush(iout) + do i=iatel_s_vdw,iatel_e_vdw + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=0 +c write (iout,*) 'i',i,' ielstart',ielstart_vdw(i), +c & ' ielend',ielend_vdw(i) + call flush(iout) + do j=ielstart_vdw(i),ielend_vdw(i) + ind=ind+1 + iteli=itel(i) + itelj=itel(j) + if (j.eq.i+2 .and. itelj.eq.2) iteli=2 + aaa=app(iteli,itelj) + bbb=bpp(iteli,itelj) + dxj=dc(1,j) + dyj=dc(2,j) + dzj=dc(3,j) + dx_normj=dc_norm(1,j) + dy_normj=dc_norm(2,j) + dz_normj=dc_norm(3,j) + xj=c(1,j)+0.5D0*dxj-xmedi + yj=c(2,j)+0.5D0*dyj-ymedi + zj=c(3,j)+0.5D0*dzj-zmedi + rij=xj*xj+yj*yj+zj*zj + rrmij=1.0D0/rij + rij=dsqrt(rij) + sss=sscale(rij/rpp(iteli,itelj)) + if (sss.gt.0.0d0) then + rmij=1.0D0/rij + r3ij=rrmij*rmij + r6ij=r3ij*r3ij + ev1=aaa*r6ij*r6ij +c 4/26/02 - AL scaling down 1,4 repulsive VDW interactions + if (j.eq.i+2) ev1=scal_el*ev1 + ev2=bbb*r6ij + evdwij=ev1+ev2 + if (energy_dec) then + write (iout,'(a6,2i5,0pf7.3,f7.3)') 'evdw1',i,j,evdwij,sss + endif + evdw1=evdw1+evdwij*sss +C +C Calculate contributions to the Cartesian gradient. +C + facvdw=-6*rrmij*(ev1+evdwij)*sss + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj + do k=1,3 + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + enddo + endif + enddo ! j + enddo ! i + return + end +C----------------------------------------------------------------------------- + subroutine escp_long(evdw2,evdw2_14) +C +C This subroutine calculates the excluded-volume interaction energy between +C peptide-group centers and side chains and its gradient in virtual-bond and +C side-chain vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 +cd print '(a)','Enter ESCP' +cd write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e + do i=iatscp_s,iatscp_e + iteli=itel(i) + xi=0.5D0*(c(1,i)+c(1,i+1)) + yi=0.5D0*(c(2,i)+c(2,i+1)) + zi=0.5D0*(c(3,i)+c(3,i+1)) + + do iint=1,nscp_gr(i) + + do j=iscpstart(i,iint),iscpend(i,iint) + itypj=itype(j) +C Uncomment following three lines for SC-p interactions +c xj=c(1,nres+j)-xi +c yj=c(2,nres+j)-yi +c zj=c(3,nres+j)-zi +C Uncomment following three lines for Ca-p interactions + xj=c(1,j)-xi + yj=c(2,j)-yi + zj=c(3,j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + + sss=sscale(1.0d0/(dsqrt(rrij)*rscp(itypj,iteli))) + + if (sss.lt.1.0d0) then + + fac=rrij**expon2 + e1=fac*fac*aad(itypj,iteli) + e2=fac*bad(itypj,iteli) + if (iabs(j-i) .le. 2) then + e1=scal14*e1 + e2=scal14*e2 + evdw2_14=evdw2_14+(e1+e2)*(1.0d0-sss) + endif + evdwij=e1+e2 + evdw2=evdw2+evdwij*(1.0d0-sss) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw2',i,j,evdwij +C +C Calculate contributions to the gradient in the virtual-bond and SC vectors. +C + fac=-(evdwij+e1)*rrij*(1.0d0-sss) + ggg(1)=xj*fac + ggg(2)=yj*fac + ggg(3)=zj*fac +C Uncomment following three lines for SC-p interactions +c do k=1,3 +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) +c enddo +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + endif + enddo + + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(j,i) + gvdwc_scpp(j,i)=expon*gvdwc_scpp(j,i) + gradx_scp(j,i)=expon*gradx_scp(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time the factor EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end +C----------------------------------------------------------------------------- + subroutine escp_short(evdw2,evdw2_14) +C +C This subroutine calculates the excluded-volume interaction energy between +C peptide-group centers and side chains and its gradient in virtual-bond and +C side-chain vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 +cd print '(a)','Enter ESCP' +cd write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e + do i=iatscp_s,iatscp_e + iteli=itel(i) + xi=0.5D0*(c(1,i)+c(1,i+1)) + yi=0.5D0*(c(2,i)+c(2,i+1)) + zi=0.5D0*(c(3,i)+c(3,i+1)) + + do iint=1,nscp_gr(i) + + do j=iscpstart(i,iint),iscpend(i,iint) + itypj=itype(j) +C Uncomment following three lines for SC-p interactions +c xj=c(1,nres+j)-xi +c yj=c(2,nres+j)-yi +c zj=c(3,nres+j)-zi +C Uncomment following three lines for Ca-p interactions + xj=c(1,j)-xi + yj=c(2,j)-yi + zj=c(3,j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + + sss=sscale(1.0d0/(dsqrt(rrij)*rscp(itypj,iteli))) + + if (sss.gt.0.0d0) then + + fac=rrij**expon2 + e1=fac*fac*aad(itypj,iteli) + e2=fac*bad(itypj,iteli) + if (iabs(j-i) .le. 2) then + e1=scal14*e1 + e2=scal14*e2 + evdw2_14=evdw2_14+(e1+e2)*sss + endif + evdwij=e1+e2 + evdw2=evdw2+evdwij*sss + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw2',i,j,evdwij +C +C Calculate contributions to the gradient in the virtual-bond and SC vectors. +C + fac=-(evdwij+e1)*rrij*sss + ggg(1)=xj*fac + ggg(2)=yj*fac + ggg(3)=zj*fac +C Uncomment following three lines for SC-p interactions +c do k=1,3 +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) +c enddo +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + endif + enddo + + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(j,i) + gvdwc_scpp(j,i)=expon*gvdwc_scpp(j,i) + gradx_scp(j,i)=expon*gradx_scp(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time the factor EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/energy_split-sep.F b/source/unres/src_Eshel/SRC-SURPLUS/energy_split-sep.F new file mode 100644 index 0000000..81e4d81 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/energy_split-sep.F @@ -0,0 +1,476 @@ + subroutine etotal_long(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +c +c Compute the long-range slow-varying contributions to the energy +c +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" + double precision weights_(n_ene) +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene) + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.MD' +c write(iout,'(a,i2)')'Calling etotal_long ipot=',ipot + if (modecalc.eq.12.or.modecalc.eq.14) then +#ifdef MPI +c if (fg_rank.eq.0) call int_from_cart1(.false.) +#else + call int_from_cart1(.false.) +#endif + endif +#ifdef MPI +c write(iout,*) "ETOTAL_LONG Processor",fg_rank, +c & " absolute rank",myrank," nfgtasks",nfgtasks + call flush(iout) + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (fg_rank.eq.0) then + call MPI_Bcast(3,1,MPI_INTEGER,king,FG_COMM,IERROR) +c write (iout,*) "Processor",myrank," BROADCAST iorder" +c call flush(iout) +C FG master sets up the WEIGHTS_ array which will be broadcast to the +C FG slaves as WEIGHTS array. + weights_(1)=wsc + weights_(2)=wscp + weights_(3)=welec + weights_(4)=wcorr + weights_(5)=wcorr5 + weights_(6)=wcorr6 + weights_(7)=wel_loc + weights_(8)=wturn3 + weights_(9)=wturn4 + weights_(10)=wturn6 + weights_(11)=wang + weights_(12)=wscloc + weights_(13)=wtor + weights_(14)=wtor_d + weights_(15)=wstrain + weights_(16)=wvdwpp + weights_(17)=wbond + weights_(18)=scal14 + weights_(21)=wsccor +C FG Master broadcasts the WEIGHTS_ array + call MPI_Bcast(weights_(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + else +C FG slaves receive the WEIGHTS array + call MPI_Bcast(weights(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + wsc=weights(1) + wscp=weights(2) + welec=weights(3) + wcorr=weights(4) + wcorr5=weights(5) + wcorr6=weights(6) + wel_loc=weights(7) + wturn3=weights(8) + wturn4=weights(9) + wturn6=weights(10) + wang=weights(11) + wscloc=weights(12) + wtor=weights(13) + wtor_d=weights(14) + wstrain=weights(15) + wvdwpp=weights(16) + wbond=weights(17) + scal14=weights(18) + wsccor=weights(21) + endif + call MPI_Bcast(dc(1,1),6*nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 + time_Bcastw=time_Bcastw+MPI_Wtime()-time00 +c call chainbuild_cart +c call int_from_cart1(.false.) + endif +c write (iout,*) 'Processor',myrank, +c & ' calling etotal_short ipot=',ipot +c call flush(iout) +c print *,'Processor',myrank,' nnt=',nnt,' nct=',nct +#endif +cd print *,'nnt=',nnt,' nct=',nct +C +C Compute the side-chain and electrostatic interaction energy +C + goto (101,102,103,104,105,106) ipot +C Lennard-Jones potential. + 101 call elj_long(evdw) +cd print '(a)','Exit ELJ' + goto 107 +C Lennard-Jones-Kihara potential (shifted). + 102 call eljk_long(evdw) + goto 107 +C Berne-Pechukas potential (dilated LJ, angular dependence). + 103 call ebp_long(evdw) + goto 107 +C Gay-Berne potential (shifted LJ, angular dependence). + 104 call egb_long(evdw,evdw_p,evdw_m) + goto 107 +C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence). + 105 call egbv_long(evdw) + goto 107 +C Soft-sphere potential + 106 call e_softsphere(evdw) +C +C Calculate electrostatic (H-bonding) energy of the main chain. +C + 107 continue + call vec_and_deriv + if (ipot.lt.6) then +#ifdef SPLITELE + if (welec.gt.0d0.or.wvdwpp.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#else + if (welec.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#endif + call eelec_scale(ees,evdw1,eel_loc,eello_turn3,eello_turn4) + else + ees=0 + evdw1=0 + eel_loc=0 + eello_turn3=0 + eello_turn4=0 + endif + else +c write (iout,*) "Soft-spheer ELEC potential" + call eelec_soft_sphere(ees,evdw1,eel_loc,eello_turn3, + & eello_turn4) + endif +C +C Calculate excluded-volume interaction energy between peptide groups +C and side chains. +C + if (ipot.lt.6) then + if(wscp.gt.0d0) then + call escp_long(evdw2,evdw2_14) + else + evdw2=0 + evdw2_14=0 + endif + else + call escp_soft_sphere(evdw2,evdw2_14) + endif +C +C 12/1/95 Multi-body terms +C + n_corr=0 + n_corr1=0 + if ((wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 + & .or. wturn6.gt.0.0d0) .and. ipot.lt.6) then + call multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr,n_corr1) +c write (2,*) 'n_corr=',n_corr,' n_corr1=',n_corr1, +c &" ecorr",ecorr," ecorr5",ecorr5," ecorr6",ecorr6," eturn6",eturn6 + else + ecorr=0.0d0 + ecorr5=0.0d0 + ecorr6=0.0d0 + eturn6=0.0d0 + endif + if ((wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) .and. ipot.lt.6) then + call multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) + endif +C +C If performing constraint dynamics, call the constraint energy +C after the equilibration time + if(usampl.and.totT.gt.eq_time) then + call EconstrQ + call Econstr_back + else + Uconst=0.0d0 + Uconst_back=0.0d0 + endif +C +C Sum the energies +C + do i=1,n_ene + energia(i)=0.0d0 + enddo + energia(1)=evdw +#ifdef SCP14 + energia(2)=evdw2-evdw2_14 + energia(18)=evdw2_14 +#else + energia(2)=evdw2 + energia(18)=0.0d0 +#endif +#ifdef SPLITELE + energia(3)=ees + energia(16)=evdw1 +#else + energia(3)=ees+evdw1 + energia(16)=0.0d0 +#endif + energia(4)=ecorr + energia(5)=ecorr5 + energia(6)=ecorr6 + energia(7)=eel_loc + energia(8)=eello_turn3 + energia(9)=eello_turn4 + energia(10)=eturn6 + energia(20)=Uconst+Uconst_back + energia(22)=evdw_p + energia(23)=evdw_m + call sum_energy(energia,.true.) +c write (iout,*) "Exit ETOTAL_LONG" + call flush(iout) + return + end +c------------------------------------------------------------------------------ + subroutine etotal_short(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +c +c Compute the short-range fast-varying contributions to the energy +c +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" + double precision weights_(n_ene) +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene) + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + +c write(iout,'(a,i2)')'Calling etotal_short ipot=',ipot +c call flush(iout) + if (modecalc.eq.12.or.modecalc.eq.14) then +#ifdef MPI + if (fg_rank.eq.0) call int_from_cart1(.false.) +#else + call int_from_cart1(.false.) +#endif + endif +#ifdef MPI +c write(iout,*) "ETOTAL_SHORT Processor",fg_rank, +c & " absolute rank",myrank," nfgtasks",nfgtasks +c call flush(iout) + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (fg_rank.eq.0) then + call MPI_Bcast(2,1,MPI_INTEGER,king,FG_COMM,IERROR) +c write (iout,*) "Processor",myrank," BROADCAST iorder" +c call flush(iout) +C FG master sets up the WEIGHTS_ array which will be broadcast to the +C FG slaves as WEIGHTS array. + weights_(1)=wsc + weights_(2)=wscp + weights_(3)=welec + weights_(4)=wcorr + weights_(5)=wcorr5 + weights_(6)=wcorr6 + weights_(7)=wel_loc + weights_(8)=wturn3 + weights_(9)=wturn4 + weights_(10)=wturn6 + weights_(11)=wang + weights_(12)=wscloc + weights_(13)=wtor + weights_(14)=wtor_d + weights_(15)=wstrain + weights_(16)=wvdwpp + weights_(17)=wbond + weights_(18)=scal14 + weights_(21)=wsccor +C FG Master broadcasts the WEIGHTS_ array + call MPI_Bcast(weights_(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + else +C FG slaves receive the WEIGHTS array + call MPI_Bcast(weights(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + wsc=weights(1) + wscp=weights(2) + welec=weights(3) + wcorr=weights(4) + wcorr5=weights(5) + wcorr6=weights(6) + wel_loc=weights(7) + wturn3=weights(8) + wturn4=weights(9) + wturn6=weights(10) + wang=weights(11) + wscloc=weights(12) + wtor=weights(13) + wtor_d=weights(14) + wstrain=weights(15) + wvdwpp=weights(16) + wbond=weights(17) + scal14=weights(18) + wsccor=weights(21) + endif +c write (iout,*),"Processor",myrank," BROADCAST weights" + call MPI_Bcast(c(1,1),maxres6,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST c" + call MPI_Bcast(dc(1,1),maxres6,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST dc" + call MPI_Bcast(dc_norm(1,1),maxres6,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST dc_norm" + call MPI_Bcast(theta(1),nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST theta" + call MPI_Bcast(phi(1),nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST phi" + call MPI_Bcast(alph(1),nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST alph" + call MPI_Bcast(omeg(1),nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST omeg" + call MPI_Bcast(vbld(1),2*nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST vbld" + call MPI_Bcast(vbld_inv(1),2*nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 +c write (iout,*) "Processor",myrank," BROADCAST vbld_inv" + endif +c write (iout,*) 'Processor',myrank, +c & ' calling etotal_short ipot=',ipot +c call flush(iout) +c print *,'Processor',myrank,' nnt=',nnt,' nct=',nct +#endif +c call int_from_cart1(.false.) +C +C Compute the side-chain and electrostatic interaction energy +C + goto (101,102,103,104,105,106) ipot +C Lennard-Jones potential. + 101 call elj_short(evdw) +cd print '(a)','Exit ELJ' + goto 107 +C Lennard-Jones-Kihara potential (shifted). + 102 call eljk_short(evdw) + goto 107 +C Berne-Pechukas potential (dilated LJ, angular dependence). + 103 call ebp_short(evdw) + goto 107 +C Gay-Berne potential (shifted LJ, angular dependence). + 104 call egb_short(evdw,evdw_p,evdw_m) + goto 107 +C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence). + 105 call egbv_short(evdw) + goto 107 +C Soft-sphere potential - already dealt with in the long-range part + 106 evdw=0.0d0 +c 106 call e_softsphere_short(evdw) +C +C Calculate electrostatic (H-bonding) energy of the main chain. +C + 107 continue +c +c Calculate the short-range part of Evdwpp +c + call evdwpp_short(evdw1) +c +c Calculate the short-range part of ESCp +c + if (ipot.lt.6) then + call escp_short(evdw2,evdw2_14) + endif +c +c Calculate the bond-stretching energy +c + call ebond(estr) +C +C Calculate the disulfide-bridge and other energy and the contributions +C from other distance constraints. + call edis(ehpb) +C +C Calculate the virtual-bond-angle energy. +C + call ebend(ebe) +C +C Calculate the SC local energy. +C + call vec_and_deriv + call esc(escloc) +C +C Calculate the virtual-bond torsional energy. +C + call etor(etors,edihcnstr) +C +C 6/23/01 Calculate double-torsional energy +C + call etor_d(etors_d) +C +C 21/5/07 Calculate local sicdechain correlation energy +C + if (wsccor.gt.0.0d0) then + call eback_sc_corr(esccor) + else + esccor=0.0d0 + endif +C +C Put energy components into an array +C + do i=1,n_ene + energia(i)=0.0d0 + enddo + energia(1)=evdw +#ifdef SCP14 + energia(2)=evdw2-evdw2_14 + energia(18)=evdw2_14 +#else + energia(2)=evdw2 + energia(18)=0.0d0 +#endif +#ifdef SPLITELE + energia(16)=evdw1 +#else + energia(3)=evdw1 +#endif + energia(11)=ebe + energia(12)=escloc + energia(13)=etors + energia(14)=etors_d + energia(15)=ehpb + energia(17)=estr + energia(19)=edihcnstr + energia(21)=esccor + energia(22)=evdw_p + energia(23)=evdw_m +c write (iout,*) "ETOTAL_SHORT before SUM_ENERGY" + call flush(iout) + call sum_energy(energia,.true.) +c write (iout,*) "Exit ETOTAL_SHORT" + call flush(iout) + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/entmcm.F b/source/unres/src_Eshel/SRC-SURPLUS/entmcm.F new file mode 100644 index 0000000..3c2dc5a --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/entmcm.F @@ -0,0 +1,684 @@ + subroutine entmcm +C Does modified entropic sampling in the space of minima. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.THREAD' + include 'COMMON.NAMES' + logical accepted,not_done,over,ovrtim,error,lprint + integer MoveType,nbond + integer conf_comp + double precision RandOrPert + double precision varia(maxvar),elowest,ehighest,eold + double precision przes(3),obr(3,3) + double precision varold(maxvar) + logical non_conv + double precision energia(0:n_ene),energia_ave(0:n_ene) +C +cd write (iout,*) 'print_mc=',print_mc + WhatsUp=0 + maxtrial_iter=50 +c--------------------------------------------------------------------------- +C Initialize counters. +c--------------------------------------------------------------------------- +C Total number of generated confs. + ngen=0 +C Total number of moves. In general this won't be equal to the number of +C attempted moves, because we may want to reject some "bad" confs just by +C overlap check. + nmove=0 +C Total number of shift (nbond_move(1)), spike, crankshaft, three-bond,... +C motions. + do i=1,nres + nbond_move(i)=0 + enddo +C Initialize total and accepted number of moves of various kind. + do i=0,MaxMoveType + moves(i)=0 + moves_acc(i)=0 + enddo +C Total number of energy evaluations. + neneval=0 + nfun=0 + indminn=-max_ene + indmaxx=max_ene + delte=0.5D0 + facee=1.0D0/(maxacc*delte) + conste=dlog(facee) +C Read entropy from previous simulations. + if (ent_read) then + read (ientin,*) indminn,indmaxx,emin,emax + print *,'indminn=',indminn,' indmaxx=',indmaxx,' emin=',emin, + & ' emax=',emax + do i=-max_ene,max_ene + entropy(i)=(emin+i*delte)*betbol + enddo + read (ientin,*) (ijunk,ejunk,entropy(i),i=indminn,indmaxx) + indmin=indminn + indmax=indmaxx + write (iout,*) 'indminn=',indminn,' indmaxx=',indmaxx, + & ' emin=',emin,' emax=',emax + write (iout,'(/a)') 'Initial entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + endif ! ent_read +C Read the pool of conformations + call read_pool +C---------------------------------------------------------------------------- +C Entropy-sampling simulations with continually updated entropy +C Loop thru simulations +C---------------------------------------------------------------------------- + DO ISWEEP=1,NSWEEP +C---------------------------------------------------------------------------- +C Take a conformation from the pool +C---------------------------------------------------------------------------- + if (npool.gt.0) then + ii=iran_num(1,npool) + do i=1,nvar + varia(i)=xpool(i,ii) + enddo + write (iout,*) 'Took conformation',ii,' from the pool energy=', + & epool(ii) + call var_to_geom(nvar,varia) +C Print internal coordinates of the initial conformation + call intout + else + call gen_rand_conf(1,*20) + endif +C---------------------------------------------------------------------------- +C Compute and print initial energies. +C---------------------------------------------------------------------------- + nsave=0 +#ifdef MPL + if (MyID.eq.MasterID) then + do i=1,nctasks + nsave_part(i)=0 + enddo + endif +#endif + Kwita=0 + WhatsUp=0 + write (iout,'(/80(1h*)/a,i2/80(1h*)/)') 'MCE iteration #',isweep + write (iout,'(/80(1h*)/a)') 'Initial energies:' + call chainbuild + call etotal(energia(0)) + etot = energia(0) + call enerprint(energia(0)) +C Minimize the energy of the first conformation. + if (minim) then + call geom_to_var(nvar,varia) + call minimize(etot,varia,iretcode,nfun) + call etotal(energia(0)) + etot = energia(0) + write (iout,'(/80(1h*)/a/80(1h*))') + & 'Results of the first energy minimization:' + call enerprint(energia(0)) + endif + if (refstr) then + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup,przes, + & obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order:',co + write (istat,'(i5,11(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene),etot,rms,frac,co + else + write (istat,'(i5,9(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif + close(istat) + neneval=neneval+nfun+1 + if (.not. ent_read) then +C Initialize the entropy array + do i=-max_ene,max_ene + emin=etot +C Uncomment the line below for actual entropic sampling (start with uniform +C energy distribution). +c entropy(i)=0.0D0 +C Uncomment the line below for multicanonical sampling (start with Boltzmann +C distribution). + entropy(i)=(emin+i*delte)*betbol + enddo + emax=10000000.0D0 + emin=etot + write (iout,'(/a)') 'Initial entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + endif ! ent_read +#ifdef MPL + call recv_stop_sig(Kwita) + if (whatsup.eq.1) then + call send_stop_sig(-2) + not_done=.false. + else if (whatsup.le.-2) then + not_done=.false. + else if (whatsup.eq.2) then + not_done=.false. + else + not_done=.true. + endif +#else + not_done = (iretcode.ne.11) +#endif + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Enter Monte Carlo procedure.' + close(igeom) + call briefout(0,etot) + do i=1,nvar + varold(i)=varia(i) + enddo + eold=etot + indeold=(eold-emin)/delte + deix=eold-(emin+indeold*delte) + dent=entropy(indeold+1)-entropy(indeold) +cd write (iout,*) 'indeold=',indeold,' deix=',deix,' dent=',dent +cd write (*,*) 'Processor',MyID,' indeold=',indeold,' deix=',deix, +cd & ' dent=',dent + sold=entropy(indeold)+(dent/delte)*deix + elowest=etot + write (iout,*) 'eold=',eold,' sold=',sold,' elowest=',etot + write (*,*) 'Processor',MyID,' eold=',eold,' sold=',sold, + & ' elowest=',etot + if (minim) call zapis(varia,etot) + nminima(1)=1.0D0 +C NACC is the counter for the accepted conformations of a given processor + nacc=0 +C NACC_TOT counts the total number of accepted conformations + nacc_tot=0 +#ifdef MPL + if (MyID.eq.MasterID) then + call receive_MCM_info + else + call send_MCM_info(2) + endif +#endif + do iene=indminn,indmaxx + nhist(iene)=0.0D0 + enddo + do i=2,maxsave + nminima(i)=0.0D0 + enddo +C Main loop. +c---------------------------------------------------------------------------- + elowest=1.0D10 + ehighest=-1.0D10 + it=0 + do while (not_done) + it=it+1 + if (print_mc.gt.0) write (iout,'(80(1h*)/20x,a,i7)') + & 'Beginning iteration #',it +C Initialize local counter. + ntrial=0 ! # of generated non-overlapping confs. + noverlap=0 ! # of overlapping confs. + accepted=.false. + do while (.not. accepted .and. WhatsUp.eq.0 .and. Kwita.eq.0) + ntrial=ntrial+1 +C Retrieve the angles of previously accepted conformation + do j=1,nvar + varia(j)=varold(j) + enddo +cd write (iout,'(a)') 'Old variables:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + call var_to_geom(nvar,varia) +C Rebuild the chain. + call chainbuild + MoveType=0 + nbond=0 + lprint=.true. +C Decide whether to generate a random conformation or perturb the old one + RandOrPert=ran_number(0.0D0,1.0D0) + if (RandOrPert.gt.RanFract) then + if (print_mc.gt.0) + & write (iout,'(a)') 'Perturbation-generated conformation.' + call perturb(error,lprint,MoveType,nbond,1.0D0) + if (error) goto 20 + if (MoveType.lt.1 .or. MoveType.gt.MaxMoveType) then + write (iout,'(/a,i7,a/)') 'Error - unknown MoveType=', + & MoveType,' returned from PERTURB.' + goto 20 + endif + call chainbuild + else + MoveType=0 + moves(0)=moves(0)+1 + nstart_grow=iran_num(3,nres) + if (print_mc.gt.0) + & write (iout,'(2a,i3)') 'Random-generated conformation', + & ' - chain regrown from residue',nstart_grow + call gen_rand_conf(nstart_grow,*30) + endif + call geom_to_var(nvar,varia) +cd write (iout,'(a)') 'New variables:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + ngen=ngen+1 + if (print_mc.gt.0) write (iout,'(a,i5,a,i10,a,i10)') + & 'Processor',MyId,' trial move',ntrial,' total generated:',ngen + if (print_mc.gt.0) write (*,'(a,i5,a,i10,a,i10)') + & 'Processor',MyId,' trial move',ntrial,' total generated:',ngen + call etotal(energia(0)) + etot = energia(0) +c call enerprint(energia(0)) +c write (iout,'(2(a,1pe14.5))') 'Etot=',Etot,' Elowest=',Elowest + if (etot-elowest.gt.overlap_cut) then + write (iout,'(a,i5,a,1pe14.5)') 'Iteration',it, + & ' Overlap detected in the current conf.; energy is',etot + neneval=neneval+1 + accepted=.false. + noverlap=noverlap+1 + if (noverlap.gt.maxoverlap) then + write (iout,'(a)') 'Too many overlapping confs.' + goto 20 + endif + else + if (minim) then + call minimize(etot,varia,iretcode,nfun) +cd write (iout,'(a)') 'Variables after minimization:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + call etotal(energia(0)) + etot = energia(0) + neneval=neneval+nfun+1 + endif + if (print_mc.gt.2) then + write (iout,'(a)') 'Total energies of trial conf:' + call enerprint(energia(0)) + else if (print_mc.eq.1) then + write (iout,'(a,i6,a,1pe16.6)') + & 'Trial conformation:',ngen,' energy:',etot + endif +C-------------------------------------------------------------------------- +C... Acceptance test +C-------------------------------------------------------------------------- + accepted=.false. + if (WhatsUp.eq.0) + & call accepting(etot,eold,scur,sold,varia,varold, + & accepted) + if (accepted) then + nacc=nacc+1 + nacc_tot=nacc_tot+1 + if (elowest.gt.etot) elowest=etot + if (ehighest.lt.etot) ehighest=etot + moves_acc(MoveType)=moves_acc(MoveType)+1 + if (MoveType.eq.1) then + nbond_acc(nbond)=nbond_acc(nbond)+1 + endif +C Check against conformation repetitions. + irep=conf_comp(varia,etot) +#if defined(AIX) || defined(PGI) + open (istat,file=statname,position='append') +#else + open (istat,file=statname,access='append') +#endif + if (refstr) then + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup, + & przes,obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + if (print_mc.gt.0) + & write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order:',co + if (print_stat) + & write (istat,'(i5,11(1pe14.5))') it, + & (energia(print_order(i)),i=1,nprint_ene),etot, + & rms,frac,co + elseif (print_stat) then + write (istat,'(i5,10(1pe14.5))') it, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif + close(istat) + if (print_mc.gt.1) + & call statprint(nacc,nfun,iretcode,etot,elowest) +C Print internal coordinates. + if (print_int) call briefout(nacc,etot) +#ifdef MPL + if (MyID.ne.MasterID) then + call recv_stop_sig(Kwita) +cd print *,'Processor:',MyID,' STOP=',Kwita + if (irep.eq.0) then + call send_MCM_info(2) + else + call send_MCM_info(1) + endif + endif +#endif +C Store the accepted conf. and its energy. + eold=etot + sold=scur + do i=1,nvar + varold(i)=varia(i) + enddo + if (irep.eq.0) then + irep=nsave+1 +cd write (iout,*) 'Accepted conformation:' +cd write (iout,*) (rad2deg*varia(i),i=1,nphi) + if (minim) call zapis(varia,etot) + do i=1,n_ene + ener(i,nsave)=energia(i) + enddo + ener(n_ene+1,nsave)=etot + ener(n_ene+2,nsave)=frac + endif + nminima(irep)=nminima(irep)+1.0D0 +c print *,'irep=',irep,' nminima=',nminima(irep) +#ifdef MPL + if (Kwita.eq.0) call recv_stop_sig(kwita) +#endif + endif ! accepted + endif ! overlap +#ifdef MPL + if (MyID.eq.MasterID) then + call receive_MCM_info + if (nacc_tot.ge.maxacc) accepted=.true. + endif +#endif + if (ntrial.gt.maxtrial_iter .and. npool.gt.0) then +C Take a conformation from the pool + ii=iran_num(1,npool) + do i=1,nvar + varia(i)=xpool(i,ii) + enddo + write (iout,*) 'Iteration',it,' max. # of trials exceeded.' + write (iout,*) + & 'Take conformation',ii,' from the pool energy=',epool(ii) + if (print_mc.gt.2) + & write (iout,'(10f8.3)') (rad2deg*varia(i),i=1,nvar) + ntrial=0 + endif ! (ntrial.gt.maxtrial_iter .and. npool.gt.0) + 30 continue + enddo ! accepted +#ifdef MPL + if (MyID.eq.MasterID) then + call receive_MCM_info + endif + if (Kwita.eq.0) call recv_stop_sig(kwita) +#endif + if (ovrtim()) WhatsUp=-1 +cd write (iout,*) 'WhatsUp=',WhatsUp,' Kwita=',Kwita + not_done = (nacc_tot.lt.maxacc) .and. (WhatsUp.eq.0) + & .and. (Kwita.eq.0) +cd write (iout,*) 'not_done=',not_done +#ifdef MPL + if (Kwita.lt.0) then + print *,'Processor',MyID, + & ' has received STOP signal =',Kwita,' in EntSamp.' +cd print *,'not_done=',not_done + if (Kwita.lt.-1) WhatsUp=Kwita + else if (nacc_tot.ge.maxacc) then + print *,'Processor',MyID,' calls send_stop_sig,', + & ' because a sufficient # of confs. have been collected.' +cd print *,'not_done=',not_done + call send_stop_sig(-1) + else if (WhatsUp.eq.-1) then + print *,'Processor',MyID, + & ' calls send_stop_sig because of timeout.' +cd print *,'not_done=',not_done + call send_stop_sig(-2) + endif +#endif + enddo ! not_done + +C----------------------------------------------------------------- +C... Construct energy histogram & update entropy +C----------------------------------------------------------------- + go to 21 + 20 WhatsUp=-3 +#ifdef MPL + write (iout,*) 'Processor',MyID, + & ' is broadcasting ERROR-STOP signal.' + write (*,*) 'Processor',MyID, + & ' is broadcasting ERROR-STOP signal.' + call send_stop_sig(-3) +#endif + 21 continue +#ifdef MPL + if (MyID.eq.MasterID) then +c call receive_MCM_results + call receive_energies +#endif + do i=1,nsave + if (esave(i).lt.elowest) elowest=esave(i) + if (esave(i).gt.ehighest) ehighest=esave(i) + enddo + write (iout,'(a,i10)') '# of accepted confs:',nacc_tot + write (iout,'(a,f10.5,a,f10.5)') 'Lowest energy:',elowest, + & ' Highest energy',ehighest + if (isweep.eq.1 .and. .not.ent_read) then + emin=elowest + emax=ehighest + write (iout,*) 'EMAX=',emax + indminn=0 + indmaxx=(ehighest-emin)/delte + indmin=indminn + indmax=indmaxx + do i=-max_ene,max_ene + entropy(i)=(emin+i*delte)*betbol + enddo + ent_read=.true. + else + indmin=(elowest-emin)/delte + indmax=(ehighest-emin)/delte + if (indmin.lt.indminn) indminn=indmin + if (indmax.gt.indmaxx) indmaxx=indmax + endif + write(iout,*)'indminn=',indminn,' indmaxx=',indmaxx +C Construct energy histogram + do i=1,nsave + inde=(esave(i)-emin)/delte + nhist(inde)=nhist(inde)+nminima(i) + enddo +C Update entropy (density of states) + do i=indmin,indmax + if (nhist(i).gt.0) then + entropy(i)=entropy(i)+dlog(nhist(i)+0.0D0) + endif + enddo +Cd do i=indmaxx+1 +Cd entropy(i)=1.0D+10 +Cd enddo + write (iout,'(/80(1h*)/a,i2/80(1h*)/)') + & 'End of macroiteration',isweep + write (iout,'(a,f10.5,a,f10.5)') 'Elowest=',elowest, + & ' Ehighest=',ehighest + write (iout,'(a)') 'Frequecies of minima' + do i=1,nsave + write (iout,'(i5,f5.0,f10.5)') i,nminima(i),esave(i) + enddo + write (iout,'(/a)') 'Energy histogram' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,nhist(i) + enddo + write (iout,'(/a)') 'Entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo +C----------------------------------------------------------------- +C... End of energy histogram construction +C----------------------------------------------------------------- +#ifdef MPL + entropy(-max_ene-4)=dfloat(indminn) + entropy(-max_ene-3)=dfloat(indmaxx) + entropy(-max_ene-2)=emin + entropy(-max_ene-1)=emax + call send_MCM_update +cd print *,entname,ientout + open (ientout,file=entname,status='unknown') + write (ientout,'(2i5,2e25.17)') indminn,indmaxx,emin,emax + do i=indminn,indmaxx + write (ientout,'(i5,f10.5,f20.15)') i,emin+i*delte,entropy(i) + enddo + close(ientout) + else + write (iout,'(a)') 'Frequecies of minima' + do i=1,nsave + write (iout,'(i5,f5.0,f10.5)') i,nminima(i),esave(i) + enddo +c call send_MCM_results + call send_energies + call receive_MCM_update + indminn=entropy(-max_ene-4) + indmaxx=entropy(-max_ene-3) + emin=entropy(-max_ene-2) + emax=entropy(-max_ene-1) + write (iout,*) 'Received from master:' + write (iout,*) 'indminn=',indminn,' indmaxx=',indmaxx, + & ' emin=',emin,' emax=',emax + write (iout,'(/a)') 'Entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + endif + if (WhatsUp.lt.-1) return +#else + if (ovrtim() .or. WhatsUp.lt.0) return +#endif + + write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:' + call statprint(nacc,nfun,iretcode,etot,elowest) + write (iout,'(a)') + & 'Statistics of multiple-bond motions. Total motions:' + write (iout,'(16i5)') (nbond_move(i),i=1,Nbm) + write (iout,'(a)') 'Accepted motions:' + write (iout,'(16i5)') (nbond_acc(i),i=1,Nbm) + write (iout,'(a,i10)') 'Number of chain regrowths:',nregrow + write (iout,'(a,i10)') 'Accepted chain regrowths:',nregrow_acc + +C--------------------------------------------------------------------------- + ENDDO ! ISWEEP +C--------------------------------------------------------------------------- + + runtime=tcpu() + + if (isweep.eq.nsweep .and. it.ge.maxacc) + &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.' + return + end +c------------------------------------------------------------------------------ + subroutine accepting(ecur,eold,scur,sold,x,xold,accepted) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.GEO' + double precision ecur,eold,xx,ran_number,bol + double precision x(maxvar),xold(maxvar) + double precision tole /1.0D-1/, tola /5.0D0/ + logical accepted +C Check if the conformation is similar. +cd write (iout,*) 'Enter ACCEPTING' +cd write (iout,*) 'Old PHI angles:' +cd write (iout,*) (rad2deg*xold(i),i=1,nphi) +cd write (iout,*) 'Current angles' +cd write (iout,*) (rad2deg*x(i),i=1,nphi) +cd ddif=dif_ang(nphi,x,xold) +cd write (iout,*) 'Angle norm:',ddif +cd write (iout,*) 'ecur=',ecur,' emax=',emax + if (ecur.gt.emax) then + accepted=.false. + if (print_mc.gt.0) + & write (iout,'(a)') 'Conformation rejected as too high in energy' + return + else if (dabs(ecur-eold).lt.tole .and. + & dif_ang(nphi,x,xold).lt.tola) then + accepted=.false. + if (print_mc.gt.0) + & write (iout,'(a)') 'Conformation rejected as too similar' + return + endif +C Else evaluate the entropy of the conf and compare it with that of the previous +C one. + indecur=(ecur-emin)/delte + if (iabs(indecur).gt.max_ene) then + write (iout,'(a,2i5)') + & 'Accepting: Index out of range:',indecur + scur=1000.0D0 + else if (indecur.eq.indmaxx) then + scur=entropy(indecur) + if (print_mc.gt.0) write (iout,*)'Energy boundary reached', + & indmaxx,indecur,entropy(indecur) + else + deix=ecur-(emin+indecur*delte) + dent=entropy(indecur+1)-entropy(indecur) + scur=entropy(indecur)+(dent/delte)*deix + endif +cd print *,'Processor',MyID,' ecur=',ecur,' indecur=',indecur, +cd & ' scur=',scur,' eold=',eold,' sold=',sold +cd print *,'deix=',deix,' dent=',dent,' delte=',delte + if (print_mc.gt.1) then + write(iout,*)'ecur=',ecur,' indecur=',indecur,' scur=',scur + write(iout,*)'eold=',eold,' sold=',sold + endif + if (scur.le.sold) then + accepted=.true. + else +C Else carry out acceptance test + xx=ran_number(0.0D0,1.0D0) + xxh=scur-sold + if (xxh.gt.50.0D0) then + bol=0.0D0 + else + bol=exp(-xxh) + endif + if (bol.gt.xx) then + accepted=.true. + if (print_mc.gt.0) write (iout,'(a)') + & 'Conformation accepted.' + else + accepted=.false. + if (print_mc.gt.0) write (iout,'(a)') + & 'Conformation rejected.' + endif + endif + return + end +c----------------------------------------------------------------------------- + subroutine read_pool + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.VAR' + double precision varia(maxvar) + print '(a)','Call READ_POOL' + do npool=1,max_pool + print *,'i=',i + read (intin,'(i5,f10.5)',end=10,err=10) iconf,epool(npool) + if (epool(npool).eq.0.0D0) goto 10 + call read_angles(intin,*10) + call geom_to_var(nvar,xpool(1,npool)) + enddo + goto 11 + 10 npool=npool-1 + 11 write (iout,'(a,i5)') 'Number of pool conformations:',npool + if (print_mc.gt.2) then + do i=1,npool + write (iout,'(a,i5,a,1pe14.5)') 'Pool conformation',i,' energy', + & epool(i) + write (iout,'(10f8.3)') (rad2deg*xpool(j,i),j=1,nvar) + enddo + endif ! (print_mc.gt.2) + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/gauss.f b/source/unres/src_Eshel/SRC-SURPLUS/gauss.f new file mode 100644 index 0000000..7ba6e1d --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/gauss.f @@ -0,0 +1,69 @@ + subroutine gauss(RO,AP,MT,M,N,*) +c +c CALCULATES (RO**(-1))*AP BY GAUSS ELIMINATION +c RO IS A SQUARE MATRIX +c THE CALCULATED PRODUCT IS STORED IN AP +c ABNORMAL EXIT IF RO IS SINGULAR +c + integer MT, M, N, M1,I,J,IM, + & I1,MI,MI1 + double precision RO(MT,M),AP(MT,N),X,RM,PR, + & Y + if(M.ne.1)goto 10 + X=RO(1,1) + if(dabs(X).le.1.0D-13) return 1 + X=1.0/X + do 16 I=1,N +16 AP(1,I)=AP(1,I)*X + return +10 continue + M1=M-1 + DO1 I=1,M1 + IM=I + RM=DABS(RO(I,I)) + I1=I+1 + do 2 J=I1,M + if(DABS(RO(J,I)).LE.RM) goto 2 + RM=DABS(RO(J,I)) + IM=J +2 continue + If(IM.eq.I)goto 17 + do 3 J=1,N + PR=AP(I,J) + AP(I,J)=AP(IM,J) +3 AP(IM,J)=PR + do 4 J=I,M + PR=RO(I,J) + RO(I,J)=RO(IM,J) +4 RO(IM,J)=PR +17 X=RO(I,I) + if(dabs(X).le.1.0E-13) return 1 + X=1.0/X + do 5 J=1,N +5 AP(I,J)=X*AP(I,J) + do 6 J=I1,M +6 RO(I,J)=X*RO(I,J) + do 7 J=I1,M + Y=RO(J,I) + do 8 K=1,N +8 AP(J,K)=AP(J,K)-Y*AP(I,K) + do 9 K=I1,M +9 RO(J,K)=RO(J,K)-Y*RO(I,K) +7 continue +1 continue + X=RO(M,M) + if(dabs(X).le.1.0E-13) return 1 + X=1.0/X + do 11 J=1,N +11 AP(M,J)=X*AP(M,J) + do 12 I=1,M1 + MI=M-I + MI1=MI+1 + do 14 J=1,N + X=AP(MI,J) + do 15 K=MI1,M +15 X=X-AP(K,J)*RO(MI,K) +14 AP(MI,J)=X +12 continue + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/kinetic_lesyng.f b/source/unres/src_Eshel/SRC-SURPLUS/kinetic_lesyng.f new file mode 100644 index 0000000..8535f5d --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/kinetic_lesyng.f @@ -0,0 +1,104 @@ + subroutine kinetic(KE_total) +c---------------------------------------------------------------- +c This subroutine calculates the total kinetic energy of the chain +c----------------------------------------------------------------- + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + double precision KE_total + + integer i,j,k + double precision KEt_p,KEt_sc,KEr_p,KEr_sc,incr(3), + & mag1,mag2,v(3) + + KEt_p=0.0d0 + KEt_sc=0.0d0 +c write (iout,*) "ISC",(isc(itype(i)),i=1,nres) +c The translational part for peptide virtual bonds + do j=1,3 + incr(j)=d_t(j,0) + enddo + do i=nnt,nct-1 +c write (iout,*) "Kinetic trp:",i,(incr(j),j=1,3) + do j=1,3 + v(j)=incr(j)+0.5d0*d_t(j,i) + enddo + vtot(i)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3) + KEt_p=KEt_p+(v(1)*v(1)+v(2)*v(2)+v(3)*v(3)) + do j=1,3 + incr(j)=incr(j)+d_t(j,i) + enddo + enddo +c write(iout,*) 'KEt_p', KEt_p +c The translational part for the side chain virtual bond +c Only now we can initialize incr with zeros. It must be equal +c to the velocities of the first Calpha. + do j=1,3 + incr(j)=d_t(j,0) + enddo + do i=nnt,nct + iti=itype(i) + if (itype(i).eq.10) then + do j=1,3 + v(j)=incr(j) + enddo + else + do j=1,3 + v(j)=incr(j)+d_t(j,nres+i) + enddo + endif +c write (iout,*) "Kinetic trsc:",i,(incr(j),j=1,3) +c write (iout,*) "i",i," msc",msc(iti)," v",(v(j),j=1,3) + KEt_sc=KEt_sc+msc(iti)*(v(1)*v(1)+v(2)*v(2)+v(3)*v(3)) + vtot(i+nres)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3) + do j=1,3 + incr(j)=incr(j)+d_t(j,i) + enddo + enddo +c goto 111 +c write(iout,*) 'KEt_sc', KEt_sc +c The part due to stretching and rotation of the peptide groups + KEr_p=0.0D0 + do i=nnt,nct-1 +c write (iout,*) "i",i +c write (iout,*) "i",i," mag1",mag1," mag2",mag2 + do j=1,3 + incr(j)=d_t(j,i) + enddo +c write (iout,*) "Kinetic rotp:",i,(incr(j),j=1,3) + KEr_p=KEr_p+(incr(1)*incr(1)+incr(2)*incr(2) + & +incr(3)*incr(3)) + enddo +c goto 111 +c write(iout,*) 'KEr_p', KEr_p +c The rotational part of the side chain virtual bond + KEr_sc=0.0D0 + do i=nnt,nct + iti=itype(i) + if (itype(i).ne.10) then + do j=1,3 + incr(j)=d_t(j,nres+i) + enddo +c write (iout,*) "Kinetic rotsc:",i,(incr(j),j=1,3) + KEr_sc=KEr_sc+Isc(iti)*(incr(1)*incr(1)+incr(2)*incr(2)+ + & incr(3)*incr(3)) + endif + enddo +c The total kinetic energy + 111 continue +c write(iout,*) 'KEr_sc', KEr_sc + KE_total=0.5d0*(mp*KEt_p+KEt_sc+0.25d0*Ip*KEr_p+KEr_sc) +c write (iout,*) "KE_total",KE_total + return + end + + + + diff --git a/source/unres/src_Eshel/SRC-SURPLUS/lagrangian_lesyng.F b/source/unres/src_Eshel/SRC-SURPLUS/lagrangian_lesyng.F new file mode 100644 index 0000000..8a9163a --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/lagrangian_lesyng.F @@ -0,0 +1,726 @@ + subroutine lagrangian +c------------------------------------------------------------------------- +c This subroutine contains the total lagrangain from which the accelerations +c are obtained. For numerical gradient checking, the derivetive of the +c lagrangian in the velocities and coordinates are calculated seperately +c------------------------------------------------------------------------- + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include 'COMMON.MUCA' + include 'COMMON.TIME1' + + integer i,j,ind + double precision zapas(MAXRES6),muca_factor + logical lprn /.false./ + common /cipiszcze/ itime + +#ifdef TIMING + time00=MPI_Wtime() +#endif + do j=1,3 + zapas(j)=-gcart(j,0) + enddo + ind=3 + if (lprn) then + write (iout,*) "Potential forces backbone" + endif + do i=nnt,nct-1 + if (lprn) write (iout,'(i5,3e15.5,5x,3e15.5)') + & i,(-gcart(j,i),j=1,3) + do j=1,3 + ind=ind+1 + zapas(ind)=-gcart(j,i) + enddo + enddo + if (lprn) write (iout,*) "Potential forces sidechain" + do i=nnt,nct + if (itype(i).ne.10) then + if (lprn) write (iout,'(i5,3e15.5,5x,3e15.5)') + & i,(-gcart(j,i),j=1,3) + do j=1,3 + ind=ind+1 + zapas(ind)=-gxcart(j,i) + enddo + endif + enddo + + call ginv_mult(zapas,d_a_work) + + do j=1,3 + d_a(j,0)=d_a_work(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + ind=ind+1 + d_a(j,i)=d_a_work(ind) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + ind=ind+1 + d_a(j,i+nres)=d_a_work(ind) + enddo + endif + enddo + + if(lmuca) then + imtime=imtime+1 + if(mucadyn.gt.0) call muca_update(potE) + factor=muca_factor(potE)*t_bath*Rb + +cd print *,'lmuca ',factor,potE + do j=1,3 + d_a(j,0)=d_a(j,0)*factor + enddo + do i=nnt,nct-1 + do j=1,3 + d_a(j,i)=d_a(j,i)*factor + enddo + enddo + do i=nnt,nct + do j=1,3 + d_a(j,i+nres)=d_a(j,i+nres)*factor + enddo + enddo + + endif + + if (lprn) then + write(iout,*) 'acceleration 3D' + write (iout,'(i3,3f10.5,3x,3f10.5)') 0,(d_a(j,0),j=1,3) + do i=nnt,nct-1 + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3) + enddo + do i=nnt,nct + write (iout,'(i3,3f10.5,3x,3f10.5)') + & i+nres,(d_a(j,i+nres),j=1,3) + enddo + endif +#ifdef TIMING + time_lagrangian=time_lagrangian+MPI_Wtime()-time00 +#endif + return + end +c------------------------------------------------------------------ + subroutine setup_MD_matrices + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer ierror +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + integer i,j + logical lprn /.false./ + logical osob + double precision dtdi,massvec(maxres2),Gcopy(maxres2,maxres2), + & Ghalf(mmaxres2),sqreig(maxres2), invsqreig(maxres2), Gcopytmp, + & Gsqrptmp, Gsqrmtmp, Gvec2tmp,Gvectmp(maxres2,maxres2) + double precision work(8*maxres6) + integer iwork(maxres6) + common /przechowalnia/ Gcopy,Ghalf,invsqreig,Gvectmp +c +c Set up the matrix of the (dC,dX)-->(C,X) transformation (A), the +c inertia matrix (Gmat) and the inverse of the inertia matrix (Ginv) +c +c Determine the number of degrees of freedom (dimen) and the number of +c sites (dimen1) + dimen=(nct-nnt+1)+nside + dimen1=(nct-nnt)+(nct-nnt+1) + dimen3=dimen*3 +#ifdef MPI + if (nfgtasks.gt.1) then + time00=MPI_Wtime() + call MPI_Bcast(5,1,MPI_INTEGER,king,FG_COMM,IERROR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 + call int_bounds(dimen,igmult_start,igmult_end) + igmult_start=igmult_start-1 + call MPI_Allgather(3*igmult_start,1,MPI_INTEGER, + & ng_start(0),1,MPI_INTEGER,FG_COMM,IERROR) + my_ng_count=igmult_end-igmult_start + call MPI_Allgather(3*my_ng_count,1,MPI_INTEGER,ng_counts(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + write (iout,*) 'Processor:',fg_rank,' CG group',kolor, + & ' absolute rank',myrank,' igmult_start',igmult_start, + & ' igmult_end',igmult_end,' count',my_ng_count + write (iout,*) "ng_start",(ng_start(i),i=0,nfgtasks-1) + write (iout,*) "ng_counts",(ng_counts(i),i=0,nfgtasks-1) + call flush(iout) + else +#endif + igmult_start=1 + igmult_end=dimen + my_ng_count=dimen +#ifdef MPI + endif +#endif +c write (iout,*) "dimen",dimen," dimen1",dimen1," dimen3",dimen3 +c Zeroing out A and fricmat + do i=1,dimen + do j=1,dimen + A(i,j)=0.0D0 + enddo + enddo +c Diagonal elements of the dC part of A and the respective friction coefficients + ind=1 + ind1=0 + do i=nnt,nct-1 + ind=ind+1 + ind1=ind1+1 + coeff=0.25d0*IP + massvec(ind1)=mp + Gmat(ind,ind)=coeff + A(ind1,ind)=0.5d0 + enddo + +c Off-diagonal elements of the dC part of A + k=3 + do i=1,nct-nnt + do j=1,i + A(i,j)=1.0d0 + enddo + enddo +c Diagonal elements of the dX part of A and the respective friction coefficients + m=nct-nnt + m1=nct-nnt+1 + ind=0 + ind1=0 + do i=nnt,nct + ind=ind+1 + ii = ind+m + iti=itype(i) + massvec(ii)=msc(iti) + if (iti.ne.10) then + ind1=ind1+1 + ii1= ind1+m1 + A(ii,ii1)=1.0d0 + Gmat(ii1,ii1)=ISC(iti) + endif + enddo +c Off-diagonal elements of the dX part of A + ind=0 + k=nct-nnt + do i=nnt,nct + iti=itype(i) + ind=ind+1 + do j=nnt,i + ii = ind + jj = j-nnt+1 + A(k+ii,jj)=1.0d0 + enddo + enddo + if (lprn) then + write (iout,*) + write (iout,*) "Vector massvec" + do i=1,dimen1 + write (iout,*) i,massvec(i) + enddo + write (iout,'(//a)') "A" + call matout(dimen,dimen1,maxres2,maxres2,A) + endif + +c Calculate the G matrix (store in Gmat) + do k=1,dimen + do i=1,dimen + dtdi=0.0d0 + do j=1,dimen1 + dtdi=dtdi+A(j,k)*A(j,i)*massvec(j) + enddo + Gmat(k,i)=Gmat(k,i)+dtdi + enddo + enddo + + if (lprn) then + write (iout,'(//a)') "Gmat" + call matout(dimen,dimen,maxres2,maxres2,Gmat) + endif + do i=1,dimen + do j=1,dimen + Ginv(i,j)=0.0d0 + Gcopy(i,j)=Gmat(i,j) + enddo + Ginv(i,i)=1.0d0 + enddo +c Invert the G matrix + call MATINVERT(dimen,maxres2,Gcopy,Ginv,osob) + if (lprn) then + write (iout,'(//a)') "Ginv" + call matout(dimen,dimen,maxres2,maxres2,Ginv) + endif +#ifdef MPI + if (nfgtasks.gt.1) then + myginv_ng_count=maxres2*my_ng_count + call MPI_Allgather(maxres2*igmult_start,1,MPI_INTEGER, + & nginv_start(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(myginv_ng_count,1,MPI_INTEGER, + & nginv_counts(0),1,MPI_INTEGER,FG_COMM,IERROR) + if (lprn .and. (me.eq.king .or. .not. out1file) ) then + write (iout,*) "nginv_start",(nginv_start(i),i=0,nfgtasks-1) + write (iout,*) "nginv_counts",(nginv_counts(i),i=0,nfgtasks-1) + call flush(iout) + endif +c call MPI_Scatterv(ginv(1,1),nginv_counts(0), +c & nginv_start(0),MPI_DOUBLE_PRECISION,ginv, +c & myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERR) +c call MPI_Barrier(FG_COMM,IERR) + time00=MPI_Wtime() + call MPI_Scatterv(ginv(1,1),nginv_counts(0), + & nginv_start(0),MPI_DOUBLE_PRECISION,gcopy(1,1), + & myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERR) +#ifdef TIMING + time_scatter_ginv=time_scatter_ginv+MPI_Wtime()-time00 +#endif + do i=1,dimen + do j=1,2*my_ng_count + ginv(j,i)=gcopy(i,j) + enddo + enddo +c write (iout,*) "Master's chunk of ginv" +c call MATOUT2(my_ng_count,dimen,maxres2,maxres2,ginv) + endif +#endif + if (osob) then + write (iout,*) "The G matrix is singular." + stop + endif +c Compute G**(-1/2) and G**(1/2) + ind=0 + do i=1,dimen + do j=1,i + ind=ind+1 + Ghalf(ind)=Gmat(i,j) + enddo + enddo + call gldiag(maxres2,dimen,dimen,Ghalf,work,Geigen,Gvec, + & ierr,iwork) + if (lprn) then + write (iout,'(//a)') + & "Eigenvectors and eigenvalues of the G matrix" + call eigout(dimen,dimen,maxres2,maxres2,Gvec,Geigen) + endif + + do i=1,dimen + sqreig(i)=dsqrt(Geigen(i)) + invsqreig(i)=1.d0/sqreig(i) + enddo + do i=1,dimen + do j=1,dimen + Gvectmp(i,j)=Gvec(j,i) + enddo + enddo + + do i=1,dimen + do j=1,dimen + Gsqrptmp=0.0d0 + Gsqrmtmp=0.0d0 + Gcopytmp=0.0d0 + do k=1,dimen +c Gvec2tmp=Gvec(i,k)*Gvec(j,k) + Gvec2tmp=Gvec(k,i)*Gvec(k,j) + Gsqrptmp=Gsqrptmp+Gvec2tmp*sqreig(k) + Gsqrmtmp=Gsqrmtmp+Gvec2tmp*invsqreig(k) + Gcopytmp=Gcopytmp+Gvec2tmp*Geigen(k) + enddo + Gsqrp(i,j)=Gsqrptmp + Gsqrm(i,j)=Gsqrmtmp + Gcopy(i,j)=Gcopytmp + enddo + enddo + + do i=1,dimen + do j=1,dimen + Gvec(i,j)=Gvectmp(j,i) + enddo + enddo + + if (lprn) then + write (iout,*) "Comparison of original and restored G" + do i=1,dimen + do j=1,dimen + write (iout,'(2i5,5f10.5)') i,j,Gmat(i,j),Gcopy(i,j), + & Gmat(i,j)-Gcopy(i,j),Gsqrp(i,j),Gsqrm(i,j) + enddo + enddo + endif + return + end +c------------------------------------------------------------------------------- + SUBROUTINE EIGOUT(NC,NR,LM2,LM3,A,B) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + double precision A(LM2,LM3),B(LM2) + KA=1 + KC=6 + 1 KB=MIN0(KC,NC) + WRITE(IOUT,600) (I,I=KA,KB) + WRITE(IOUT,601) (B(I),I=KA,KB) + WRITE(IOUT,602) + 2 N=0 + DO 3 I=1,NR + WRITE(IOUT,603) I,(A(I,J),J=KA,KB) + N=N+1 + IF(N.LT.10) GO TO 3 + WRITE(IOUT,602) + N=0 + 3 CONTINUE + 4 IF (KB.EQ.NC) RETURN + KA=KC+1 + KC=KC+6 + GO TO 1 + 600 FORMAT (// 9H ROOT NO.,I4,9I11) + 601 FORMAT (/5X,10(1PE11.4)) + 602 FORMAT (2H ) + 603 FORMAT (I5,10F11.5) + 604 FORMAT (1H1) + END +c------------------------------------------------------------------------------- + SUBROUTINE MATOUT(NC,NR,LM2,LM3,A) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + double precision A(LM2,LM3) + KA=1 + KC=6 + 1 KB=MIN0(KC,NC) + WRITE(IOUT,600) (I,I=KA,KB) + WRITE(IOUT,602) + 2 N=0 + DO 3 I=1,NR + WRITE(IOUT,603) I,(A(I,J),J=KA,KB) + N=N+1 + IF(N.LT.10) GO TO 3 + WRITE(IOUT,602) + N=0 + 3 CONTINUE + 4 IF (KB.EQ.NC) RETURN + KA=KC+1 + KC=KC+6 + GO TO 1 + 600 FORMAT (//5x,9I11) + 602 FORMAT (2H ) + 603 FORMAT (I5,10F11.3) + 604 FORMAT (1H1) + END +c------------------------------------------------------------------------------- + SUBROUTINE MATOUT1(NC,NR,LM2,LM3,A) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + double precision A(LM2,LM3) + KA=1 + KC=21 + 1 KB=MIN0(KC,NC) + WRITE(IOUT,600) (I,I=KA,KB) + WRITE(IOUT,602) + 2 N=0 + DO 3 I=1,NR + WRITE(IOUT,603) I,(A(I,J),J=KA,KB) + N=N+1 + IF(N.LT.3) GO TO 3 + WRITE(IOUT,602) + N=0 + 3 CONTINUE + 4 IF (KB.EQ.NC) RETURN + KA=KC+1 + KC=KC+21 + GO TO 1 + 600 FORMAT (//5x,7(3I5,2x)) + 602 FORMAT (2H ) + 603 FORMAT (I5,7(3F5.1,2x)) + 604 FORMAT (1H1) + END +c------------------------------------------------------------------------------- + SUBROUTINE MATOUT2(NC,NR,LM2,LM3,A) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + double precision A(LM2,LM3) + KA=1 + KC=12 + 1 KB=MIN0(KC,NC) + WRITE(IOUT,600) (I,I=KA,KB) + WRITE(IOUT,602) + 2 N=0 + DO 3 I=1,NR + WRITE(IOUT,603) I,(A(I,J),J=KA,KB) + N=N+1 + IF(N.LT.3) GO TO 3 + WRITE(IOUT,602) + N=0 + 3 CONTINUE + 4 IF (KB.EQ.NC) RETURN + KA=KC+1 + KC=KC+12 + GO TO 1 + 600 FORMAT (//5x,4(3I9,2x)) + 602 FORMAT (2H ) + 603 FORMAT (I5,4(3F9.3,2x)) + 604 FORMAT (1H1) + END +c--------------------------------------------------------------------------- + SUBROUTINE ginv_mult(z,d_a_tmp) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer ierr +#endif + include 'COMMON.SETUP' + include 'COMMON.TIME1' + include 'COMMON.MD' + double precision z(dimen3),d_a_tmp(dimen3),temp(maxres6),time00 + &time01 +#ifdef MPI + if (nfgtasks.gt.1) then + if (fg_rank.eq.0) then +c The matching BROADCAST for fg processors is called in ERGASTULUM + time00=MPI_Wtime() + call MPI_Bcast(4,1,MPI_INTEGER,king,FG_COMM,IERROR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 +c print *,"Processor",myrank," BROADCAST iorder in GINV_MULT" + endif +c write (2,*) "time00",time00 +c write (2,*) "Before Scatterv" +c call flush(2) +c write (2,*) "Whole z (for FG master)" +c do i=1,dimen +c write (2,*) i,z(i) +c enddo +c call MPI_Barrier(FG_COMM,IERROR) + time00=MPI_Wtime() + call MPI_Scatterv(z,ng_counts(0),ng_start(0), + & MPI_DOUBLE_PRECISION, + & z,3*my_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERR) +c write (2,*) "My chunk of z" +c do i=1,3*my_ng_count +c write (2,*) i,z(i) +c enddo +c write (2,*) "After SCATTERV" +c call flush(2) +c write (2,*) "MPI_Wtime",MPI_Wtime() + time_scatter=time_scatter+MPI_Wtime()-time00 +#ifdef TIMING + time_scatter_ginvmult=time_scatter_ginvmult+MPI_Wtime()-time00 +#endif +c write (2,*) "time_scatter",time_scatter +c write (2,*) "dimen",dimen," dimen3",dimen3," my_ng_count", +c & my_ng_count +c call flush(2) + time01=MPI_Wtime() + do k=0,2 + do i=1,dimen + ind=(i-1)*3+k+1 + temp(ind)=0.0d0 + do j=1,my_ng_count +c write (2,*) "k,i,j,ind",k,i,j,ind,(j-1)*3+k+1, +c & Ginv(i,j),z((j-1)*3+k+1), +c & Ginv(i,j)*z((j-1)*3+k+1) +c temp(ind)=temp(ind)+Ginv(i,j)*z((j-1)*3+k+1) + temp(ind)=temp(ind)+Ginv(j,i)*z((j-1)*3+k+1) + enddo + enddo + enddo + time_ginvmult=time_ginvmult+MPI_Wtime()-time01 +c write (2,*) "Before REDUCE" +c call flush(2) +c write (2,*) "z before reduce" +c do i=1,dimen +c write (2,*) i,temp(i) +c enddo + time00=MPI_Wtime() + call MPI_Reduce(temp(1),d_a_tmp(1),dimen3,MPI_DOUBLE_PRECISION, + & MPI_SUM,king,FG_COMM,IERR) + time_reduce=time_reduce+MPI_Wtime()-time00 +c write (2,*) "After REDUCE" +c call flush(2) + else +#endif +#ifdef TIMING + time01=MPI_Wtime() +#endif + do k=0,2 + do i=1,dimen + ind=(i-1)*3+k+1 + d_a_tmp(ind)=0.0d0 + do j=1,dimen +c write (2,*) "k,i,j,ind",k,i,j,ind,(j-1)*3+k+1 +c call flush(2) +c & Ginv(i,j),z((j-1)*3+k+1), +c & Ginv(i,j)*z((j-1)*3+k+1) + d_a_tmp(ind)=d_a_tmp(ind) + & +Ginv(j,i)*z((j-1)*3+k+1) +c d_a_tmp(ind)=d_a_tmp(ind) +c & +Ginv(i,j)*z((j-1)*3+k+1) + enddo + enddo + enddo +#ifdef TIMING + time_ginvmult=time_ginvmult+MPI_Wtime()-time01 +#endif +#ifdef MPI + endif +#endif + return + end +c--------------------------------------------------------------------------- +#ifdef GINV_MULT + SUBROUTINE ginv_mult_test(z,d_a_tmp) + include 'DIMENSIONS' + integer dimen +c include 'COMMON.MD' + double precision z(dimen),d_a_tmp(dimen) + double precision ztmp(dimen/3),dtmp(dimen/3) + +c do i=1,dimen +c d_a_tmp(i)=0.0d0 +c do j=1,dimen +c d_a_tmp(i)=d_a_tmp(i)+Ginv(i,j)*z(j) +c enddo +c enddo +c +c return + +!ibm* unroll(3) + do k=0,2 + do j=1,dimen/3 + ztmp(j)=z((j-1)*3+k+1) + enddo + + call alignx(16,ztmp(1)) + call alignx(16,dtmp(1)) + call alignx(16,Ginv(1,1)) + + do i=1,dimen/3 + dtmp(i)=0.0d0 + do j=1,dimen/3 + dtmp(i)=dtmp(i)+Ginv(i,j)*ztmp(j) + enddo + enddo + do i=1,dimen/3 + ind=(i-1)*3+k+1 + d_a_tmp(ind)=dtmp(i) + enddo + enddo + return + end +#endif +c--------------------------------------------------------------------------- + SUBROUTINE fricmat_mult(z,d_a_tmp) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer IERROR +#endif + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.SETUP' + include 'COMMON.TIME1' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + double precision z(dimen3),d_a_tmp(dimen3),temp(maxres6),time00 + &time01 +#ifdef MPI + if (nfgtasks.gt.1) then + if (fg_rank.eq.0) then +c The matching BROADCAST for fg processors is called in ERGASTULUM + time00=MPI_Wtime() + call MPI_Bcast(9,1,MPI_INTEGER,king,FG_COMM,IERROR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 +c print *,"Processor",myrank," BROADCAST iorder in FRICMAT_MULT" + endif +c call MPI_Barrier(FG_COMM,IERROR) + time00=MPI_Wtime() + call MPI_Scatterv(z,ng_counts(0),ng_start(0), + & MPI_DOUBLE_PRECISION, + & z,3*my_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERR) +c write (2,*) "My chunk of z" +c do i=1,3*my_ng_count +c write (2,*) i,z(i) +c enddo + time_scatter=time_scatter+MPI_Wtime()-time00 +#ifdef TIMING + time_scatter_fmatmult=time_scatter_fmatmult+MPI_Wtime()-time00 +#endif + time01=MPI_Wtime() + do k=0,2 + do i=1,dimen + ind=(i-1)*3+k+1 + temp(ind)=0.0d0 + do j=1,my_ng_count + temp(ind)=temp(ind)-fricmat(j,i)*z((j-1)*3+k+1) + enddo + enddo + enddo + time_fricmatmult=time_fricmatmult+MPI_Wtime()-time01 +c write (2,*) "Before REDUCE" +c write (2,*) "d_a_tmp before reduce" +c do i=1,dimen3 +c write (2,*) i,temp(i) +c enddo +c call flush(2) + time00=MPI_Wtime() + call MPI_Reduce(temp(1),d_a_tmp(1),dimen3,MPI_DOUBLE_PRECISION, + & MPI_SUM,king,FG_COMM,IERR) + time_reduce=time_reduce+MPI_Wtime()-time00 +c write (2,*) "After REDUCE" +c call flush(2) + else +#endif +#ifdef TIMING + time01=MPI_Wtime() +#endif + do k=0,2 + do i=1,dimen + ind=(i-1)*3+k+1 + d_a_tmp(ind)=0.0d0 + do j=1,dimen + d_a_tmp(ind)=d_a_tmp(ind) + & -fricmat(j,i)*z((j-1)*3+k+1) + enddo + enddo + enddo +#ifdef TIMING + time_fricmatmult=time_fricmatmult+MPI_Wtime()-time01 +#endif +#ifdef MPI + endif +#endif +c write (iout,*) "Vector d_a" +c do i=1,dimen3 +c write (2,*) i,d_a_tmp(i) +c enddo + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/mc.F b/source/unres/src_Eshel/SRC-SURPLUS/mc.F new file mode 100644 index 0000000..0f39d48 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/mc.F @@ -0,0 +1,819 @@ + subroutine monte_carlo +C Does Boltzmann and entropic sampling without energy minimization + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.THREAD' + include 'COMMON.NAMES' + logical accepted,not_done,over,ovrtim,error,lprint + integer MoveType,nbond,nbins + integer conf_comp + double precision RandOrPert + double precision varia(maxvar),elowest,elowest1, + & ehighest,ehighest1,eold + double precision przes(3),obr(3,3) + double precision varold(maxvar) + logical non_conv + integer moves1(-1:MaxMoveType+1,0:MaxProcs-1), + & moves_acc1(-1:MaxMoveType+1,0:MaxProcs-1) +#ifdef MPL + double precision etot_temp,etot_all(0:MaxProcs) + external d_vadd,d_vmin,d_vmax + double precision entropy1(-max_ene:max_ene), + & nhist1(-max_ene:max_ene) + integer nbond_move1(maxres*(MaxProcs+1)), + & nbond_acc1(maxres*(MaxProcs+1)),itemp(2) +#endif + double precision var_lowest(maxvar) + double precision energia(0:n_ene),energia_ave(0:n_ene) +C + write(iout,'(a,i8,2x,a,f10.5)') + & 'pool_read_freq=',pool_read_freq,' pool_fraction=',pool_fraction + open (istat,file=statname) + WhatsUp=0 + indminn=-max_ene + indmaxx=max_ene + facee=1.0D0/(maxacc*delte) +C Number of bins in energy histogram + nbins=e_up/delte-1 + write (iout,*) 'NBINS=',nbins + conste=dlog(facee) +C Read entropy from previous simulations. + if (ent_read) then + read (ientin,*) indminn,indmaxx,emin,emax + print *,'indminn=',indminn,' indmaxx=',indmaxx,' emin=',emin, + & ' emax=',emax + do i=-max_ene,max_ene + entropy(i)=0.0D0 + enddo + read (ientin,*) (ijunk,ejunk,entropy(i),i=indminn,indmaxx) + indmin=indminn + indmax=indmaxx + write (iout,*) 'indminn=',indminn,' indmaxx=',indmaxx, + & ' emin=',emin,' emax=',emax + write (iout,'(/a)') 'Initial entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + endif ! ent_read +C Read the pool of conformations + call read_pool + elowest=1.0D+10 + ehighest=-1.0D+10 +C---------------------------------------------------------------------------- +C Entropy-sampling simulations with continually updated entropy; +C set NSWEEP=1 for Boltzmann sampling. +C Loop thru simulations +C---------------------------------------------------------------------------- + DO ISWEEP=1,NSWEEP +C +C Initialize the IFINISH array. +C +#ifdef MPL + do i=1,nctasks + ifinish(i)=0 + enddo +#endif +c--------------------------------------------------------------------------- +C Initialize counters. +c--------------------------------------------------------------------------- +C Total number of generated confs. + ngen=0 +C Total number of moves. In general this won't be equal to the number of +C attempted moves, because we may want to reject some "bad" confs just by +C overlap check. + nmove=0 +C Total number of shift (nbond_move(1)), spike, crankshaft, three-bond,... +C motions. + do i=1,nres + nbond_move(i)=0 + nbond_acc(i)=0 + enddo +C Initialize total and accepted number of moves of various kind. + do i=-1,MaxMoveType + moves(i)=0 + moves_acc(i)=0 + enddo +C Total number of energy evaluations. + neneval=0 + nfun=0 +C---------------------------------------------------------------------------- +C Take a conformation from the pool +C---------------------------------------------------------------------------- + rewind(istat) + write (iout,*) 'emin=',emin,' emax=',emax + if (npool.gt.0) then + ii=iran_num(1,npool) + do i=1,nvar + varia(i)=xpool(i,ii) + enddo + write (iout,*) 'Took conformation',ii,' from the pool energy=', + & epool(ii) + call var_to_geom(nvar,varia) +C Print internal coordinates of the initial conformation + call intout + else if (isweep.gt.1) then + if (eold.lt.emax) then + do i=1,nvar + varia(i)=varold(i) + enddo + else + do i=1,nvar + varia(i)=var_lowest(i) + enddo + endif + call var_to_geom(nvar,varia) + endif +C---------------------------------------------------------------------------- +C Compute and print initial energies. +C---------------------------------------------------------------------------- + nsave=0 + Kwita=0 + WhatsUp=0 + write (iout,'(/80(1h*)/a,i2/80(1h*)/)') 'MCE iteration #',isweep + write (iout,'(/80(1h*)/a)') 'Initial energies:' + call chainbuild + call geom_to_var(nvar,varia) + call etotal(energia(0)) + etot = energia(0) + call enerprint(energia(0)) + if (refstr) then + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup,przes, + & obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order',co + write (istat,'(i10,16(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene), + & etot,rms,frac,co + else + write (istat,'(i10,14(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif +c close(istat) + neneval=neneval+1 + if (.not. ent_read) then +C Initialize the entropy array +#ifdef MPL +C Collect total energies from other processors. + etot_temp=etot + etot_all(0)=etot + call mp_gather(etot_temp,etot_all,8,MasterID,cgGroupID) + if (MyID.eq.MasterID) then +C Get the lowest and the highest energy. + print *,'MASTER: etot_temp: ',(etot_all(i),i=0,nprocs-1), + & ' emin=',emin,' emax=',emax + emin=1.0D10 + emax=-1.0D10 + do i=0,nprocs + if (emin.gt.etot_all(i)) emin=etot_all(i) + if (emax.lt.etot_all(i)) emax=etot_all(i) + enddo + emax=emin+e_up + endif ! MyID.eq.MasterID + etot_all(1)=emin + etot_all(2)=emax + print *,'Processor',MyID,' calls MP_BCAST to send/recv etot_all' + call mp_bcast(etot_all(1),16,MasterID,cgGroupID) + print *,'Processor',MyID,' MP_BCAST to send/recv etot_all ended' + if (MyID.ne.MasterID) then + print *,'Processor:',MyID,etot_all(1),etot_all(2), + & etot_all(1),etot_all(2) + emin=etot_all(1) + emax=etot_all(2) + endif ! MyID.ne.MasterID + write (iout,*) 'After MP_GATHER etot_temp=', + & etot_temp,' emin=',emin +#else + emin=etot + emax=emin+e_up + indminn=0 + indmin=0 +#endif + IF (MULTICAN) THEN +C Multicanonical sampling - start from Boltzmann distribution + do i=-max_ene,max_ene + entropy(i)=(emin+i*delte)*betbol + enddo + ELSE +C Entropic sampling - start from uniform distribution of the density of states + do i=-max_ene,max_ene + entropy(i)=0.0D0 + enddo + ENDIF ! MULTICAN + write (iout,'(/a)') 'Initial entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + if (isweep.eq.1) then + emax=emin+e_up + indminn=0 + indmin=0 + indmaxx=indminn+nbins + indmax=indmaxx + endif ! isweep.eq.1 + endif ! .not. ent_read +#ifdef MPL + call recv_stop_sig(Kwita) + if (whatsup.eq.1) then + call send_stop_sig(-2) + not_done=.false. + else if (whatsup.le.-2) then + not_done=.false. + else if (whatsup.eq.2) then + not_done=.false. + else + not_done=.true. + endif +#else + not_done=.true. +#endif + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Enter Monte Carlo procedure.' + close(igeom) + call briefout(0,etot) + do i=1,nvar + varold(i)=varia(i) + enddo + eold=etot + call entropia(eold,sold,indeold) +C NACC is the counter for the accepted conformations of a given processor + nacc=0 +C NACC_TOT counts the total number of accepted conformations + nacc_tot=0 +C Main loop. +c---------------------------------------------------------------------------- +C Zero out average energies + do i=0,n_ene + energia_ave(i)=0.0d0 + enddo +C Initialize energy histogram + do i=-max_ene,max_ene + nhist(i)=0.0D0 + enddo ! i +C Zero out iteration counter. + it=0 + do j=1,nvar + varold(j)=varia(j) + enddo +C Begin MC iteration loop. + do while (not_done) + it=it+1 +C Initialize local counter. + ntrial=0 ! # of generated non-overlapping confs. + noverlap=0 ! # of overlapping confs. + accepted=.false. + do while (.not. accepted .and. WhatsUp.eq.0 .and. Kwita.eq.0) + ntrial=ntrial+1 +C Retrieve the angles of previously accepted conformation + do j=1,nvar + varia(j)=varold(j) + enddo + call var_to_geom(nvar,varia) +C Rebuild the chain. + call chainbuild + MoveType=0 + nbond=0 + lprint=.true. +C Decide whether to take a conformation from the pool or generate/perturb one +C randomly + from_pool=ran_number(0.0D0,1.0D0) + if (npool.gt.0 .and. from_pool.lt.pool_fraction) then +C Throw a dice to choose the conformation from the pool + ii=iran_num(1,npool) + do i=1,nvar + varia(i)=xpool(i,ii) + enddo + call var_to_geom(nvar,varia) + call chainbuild +cd call intout +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a,i3,a,f10.5)') + & 'Try conformation',ii,' from the pool energy=',epool(ii) + MoveType=-1 + moves(-1)=moves(-1)+1 + else +C Decide whether to generate a random conformation or perturb the old one + RandOrPert=ran_number(0.0D0,1.0D0) + if (RandOrPert.gt.RanFract) then + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a)') 'Perturbation-generated conformation.' + call perturb(error,lprint,MoveType,nbond,0.1D0) + if (error) goto 20 + if (MoveType.lt.1 .or. MoveType.gt.MaxMoveType) then + write (iout,'(/a,i7,a/)') 'Error - unknown MoveType=', + & MoveType,' returned from PERTURB.' + goto 20 + endif + call chainbuild + else + MoveType=0 + moves(0)=moves(0)+1 + nstart_grow=iran_num(3,nres) + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(2a,i3)') 'Random-generated conformation', + & ' - chain regrown from residue',nstart_grow + call gen_rand_conf(nstart_grow,*30) + endif + call geom_to_var(nvar,varia) + endif ! pool +Cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + ngen=ngen+1 + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a,i5,a,i10,a,i10)') + & 'Processor',MyId,' trial move',ntrial,' total generated:',ngen + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (*,'(a,i5,a,i10,a,i10)') + & 'Processor',MyId,' trial move',ntrial,' total generated:',ngen + call etotal(energia(0)) + etot = energia(0) + neneval=neneval+1 +cd call enerprint(energia(0)) +cd write(iout,*)'it=',it,' etot=',etot + if (etot-elowest.gt.overlap_cut) then + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a,i5,a,1pe14.5)') 'Iteration',it, + & ' Overlap detected in the current conf.; energy is',etot + accepted=.false. + noverlap=noverlap+1 + if (noverlap.gt.maxoverlap) then + write (iout,'(a)') 'Too many overlapping confs.' + goto 20 + endif + else +C-------------------------------------------------------------------------- +C... Acceptance test +C-------------------------------------------------------------------------- + accepted=.false. + if (WhatsUp.eq.0) + & call accept_mc(it,etot,eold,scur,sold,varia,varold,accepted) + if (accepted) then + nacc=nacc+1 + nacc_tot=nacc_tot+1 + if (elowest.gt.etot) then + elowest=etot + do i=1,nvar + var_lowest(i)=varia(i) + enddo + endif + if (ehighest.lt.etot) ehighest=etot + moves_acc(MoveType)=moves_acc(MoveType)+1 + if (MoveType.eq.1) then + nbond_acc(nbond)=nbond_acc(nbond)+1 + endif +C Compare with reference structure. + if (refstr) then + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup), + & nsup,przes,obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + endif ! refstr +C +C Periodically save average energies and confs. +C + do i=0,n_ene + energia_ave(i)=energia_ave(i)+energia(i) + enddo + moves(MaxMoveType+1)=nmove + moves_acc(MaxMoveType+1)=nacc + IF ((it/save_frequency)*save_frequency.eq.it) THEN + do i=0,n_ene + energia_ave(i)=energia_ave(i)/save_frequency + enddo + etot_ave=energia_ave(0) +C#ifdef AIX +C open (istat,file=statname,position='append') +C#else +C open (istat,file=statname,access='append') +Cendif + if (print_mc.gt.0) + & write (iout,'(80(1h*)/20x,a,i20)') + & 'Iteration #',it + if (refstr .and. print_mc.gt.0) then + write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order:',co + endif + if (print_stat) then + if (refstr) then + write (istat,'(i10,10(1pe14.5))') it, + & (energia_ave(print_order(i)),i=1,nprint_ene), + & etot_ave,rms_ave,frac_ave + else + write (istat,'(i10,10(1pe14.5))') it, + & (energia_ave(print_order(i)),i=1,nprint_ene), + & etot_ave + endif + endif +c close(istat) + if (print_mc.gt.0) + & call statprint(nacc,nfun,iretcode,etot,elowest) +C Print internal coordinates. + if (print_int) call briefout(nacc,etot) + do i=0,n_ene + energia_ave(i)=0.0d0 + enddo + ENDIF ! ( (it/save_frequency)*save_frequency.eq.it) +C Update histogram + inde=icialosc((etot-emin)/delte) + nhist(inde)=nhist(inde)+1.0D0 +#ifdef MPL + if ( (it/message_frequency)*message_frequency.eq.it + & .and. (MyID.ne.MasterID) ) then + call recv_stop_sig(Kwita) + call send_MCM_info(message_frequency) + endif +#endif +C Store the accepted conf. and its energy. + eold=etot + sold=scur + do i=1,nvar + varold(i)=varia(i) + enddo +#ifdef MPL + if (Kwita.eq.0) call recv_stop_sig(kwita) +#endif + endif ! accepted + endif ! overlap +#ifdef MPL + if (MyID.eq.MasterID .and. + & (it/message_frequency)*message_frequency.eq.it) then + call receive_MC_info + if (nacc_tot.ge.maxacc) accepted=.true. + endif +#endif +C if ((ntrial.gt.maxtrial_iter +C & .or. (it/pool_read_freq)*pool_read_freq.eq.it) +C & .and. npool.gt.0) then +C Take a conformation from the pool +C ii=iran_num(1,npool) +C do i=1,nvar +C varold(i)=xpool(i,ii) +C enddo +C if (ntrial.gt.maxtrial_iter) +C & write (iout,*) 'Iteration',it,' max. # of trials exceeded.' +C write (iout,*) +C & 'Take conformation',ii,' from the pool energy=',epool(ii) +C if (print_mc.gt.2) +C & write (iout,'(10f8.3)') (rad2deg*varold(i),i=1,nvar) +C ntrial=0 +C eold=epool(ii) +C call entropia(eold,sold,indeold) +C accepted=.true. +C endif ! (ntrial.gt.maxtrial_iter .and. npool.gt.0) + 30 continue + enddo ! accepted +#ifdef MPL + if (MyID.eq.MasterID .and. + & (it/message_frequency)*message_frequency.eq.it) then + call receive_MC_info + endif + if (Kwita.eq.0) call recv_stop_sig(kwita) +#endif + if (ovrtim()) WhatsUp=-1 +cd write (iout,*) 'WhatsUp=',WhatsUp,' Kwita=',Kwita + not_done = (nacc_tot.lt.maxacc) .and. (WhatsUp.eq.0) + & .and. (Kwita.eq.0) +cd write (iout,*) 'not_done=',not_done +#ifdef MPL + if (Kwita.lt.0) then + print *,'Processor',MyID, + & ' has received STOP signal =',Kwita,' in EntSamp.' +cd print *,'not_done=',not_done + if (Kwita.lt.-1) WhatsUp=Kwita + if (MyID.ne.MasterID) call send_MCM_info(-1) + else if (nacc_tot.ge.maxacc) then + print *,'Processor',MyID,' calls send_stop_sig,', + & ' because a sufficient # of confs. have been collected.' +cd print *,'not_done=',not_done + call send_stop_sig(-1) + if (MyID.ne.MasterID) call send_MCM_info(-1) + else if (WhatsUp.eq.-1) then + print *,'Processor',MyID, + & ' calls send_stop_sig because of timeout.' +cd print *,'not_done=',not_done + call send_stop_sig(-2) + if (MyID.ne.MasterID) call send_MCM_info(-1) + endif +#endif + enddo ! not_done + +C----------------------------------------------------------------- +C... Construct energy histogram & update entropy +C----------------------------------------------------------------- + go to 21 + 20 WhatsUp=-3 +#ifdef MPL + write (iout,*) 'Processor',MyID, + & ' is broadcasting ERROR-STOP signal.' + write (*,*) 'Processor',MyID, + & ' is broadcasting ERROR-STOP signal.' + call send_stop_sig(-3) + if (MyID.ne.MasterID) call send_MCM_info(-1) +#endif + 21 continue + write (iout,'(/a)') 'Energy histogram' + do i=-100,100 + write (iout,'(i5,2f20.5)') i,emin+i*delte,nhist(i) + enddo +#ifdef MPL +C Wait until every processor has sent complete MC info. + if (MyID.eq.MasterID) then + not_done=.true. + do while (not_done) +C write (*,*) 'The IFINISH array:' +C write (*,*) (ifinish(i),i=1,nctasks) + not_done=.false. + do i=2,nctasks + not_done=not_done.or.(ifinish(i).ge.0) + enddo + if (not_done) call receive_MC_info + enddo + endif +C Make collective histogram from the work of all processors. + msglen=(2*max_ene+1)*8 + print *, + & 'Processor',MyID,' calls MP_REDUCE to send/receive histograms', + & ' msglen=',msglen + call mp_reduce(nhist,nhist1,msglen,MasterID,d_vadd, + & cgGroupID) + print *,'Processor',MyID,' MP_REDUCE accomplished for histogr.' + do i=-max_ene,max_ene + nhist(i)=nhist1(i) + enddo +C Collect min. and max. energy + print *, + &'Processor',MyID,' calls MP_REDUCE to send/receive energy borders' + call mp_reduce(elowest,elowest1,8,MasterID,d_vmin,cgGroupID) + call mp_reduce(ehighest,ehighest1,8,MasterID,d_vmax,cgGroupID) + print *,'Processor',MyID,' MP_REDUCE accomplished for energies.' + IF (MyID.eq.MasterID) THEN + elowest=elowest1 + ehighest=ehighest1 +#endif + write (iout,'(a,i10)') '# of accepted confs:',nacc_tot + write (iout,'(a,f10.5,a,f10.5)') 'Lowest energy:',elowest, + & ' Highest energy',ehighest + indmin=icialosc((elowest-emin)/delte) + imdmax=icialosc((ehighest-emin)/delte) + if (indmin.lt.indminn) then + emax=emin+indmin*delte+e_up + indmaxx=indmin+nbins + indminn=indmin + endif + if (.not.ent_read) ent_read=.true. + write(iout,*)'indminn=',indminn,' indmaxx=',indmaxx +C Update entropy (density of states) + do i=indmin,indmax + if (nhist(i).gt.0) then + entropy(i)=entropy(i)+dlog(nhist(i)+0.0D0) + endif + enddo + write (iout,'(/80(1h*)/a,i2/80(1h*)/)') + & 'End of macroiteration',isweep + write (iout,'(a,f10.5,a,f10.5)') 'Elowest=',elowest, + & ' Ehighest=',ehighest + write (iout,'(/a)') 'Energy histogram' + do i=indminn,indmaxx + write (iout,'(i5,2f20.5)') i,emin+i*delte,nhist(i) + enddo + write (iout,'(/a)') 'Entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f20.5)') i,emin+i*delte,entropy(i) + enddo +C----------------------------------------------------------------- +C... End of energy histogram construction +C----------------------------------------------------------------- +#ifdef MPL + ELSE + if (.not. ent_read) ent_read=.true. + ENDIF ! MyID .eq. MaterID + if (MyID.eq.MasterID) then + itemp(1)=indminn + itemp(2)=indmaxx + endif + print *,'before mp_bcast processor',MyID,' indminn=',indminn, + & ' indmaxx=',indmaxx,' itemp=',itemp(1),itemp(2) + call mp_bcast(itemp(1),8,MasterID,cgGroupID) + call mp_bcast(emax,8,MasterID,cgGroupID) + print *,'after mp_bcast processor',MyID,' indminn=',indminn, + & ' indmaxx=',indmaxx,' itemp=',itemp(1),itemp(2) + if (MyID .ne. MasterID) then + indminn=itemp(1) + indmaxx=itemp(2) + endif + msglen=(indmaxx-indminn+1)*8 + print *,'processor',MyID,' calling mp_bcast msglen=',msglen, + & ' indminn=',indminn,' indmaxx=',indmaxx,' isweep=',isweep + call mp_bcast(entropy(indminn),msglen,MasterID,cgGroupID) + IF(MyID.eq.MasterID .and. .not. ovrtim() .and. WhatsUp.ge.0)THEN + open (ientout,file=entname,status='unknown') + write (ientout,'(2i5,2e25.17)') indminn,indmaxx,emin,emax + do i=indminn,indmaxx + write (ientout,'(i5,f10.5,f20.15)') i,emin+i*delte,entropy(i) + enddo + close(ientout) + ELSE + write (iout,*) 'Received from master:' + write (iout,*) 'indminn=',indminn,' indmaxx=',indmaxx, + & ' emin=',emin,' emax=',emax + write (iout,'(/a)') 'Entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + ENDIF ! MyID.eq.MasterID + print *,'Processor',MyID,' calls MP_GATHER' + call mp_gather(nbond_move,nbond_move1,4*Nbm,MasterID, + & cgGroupID) + call mp_gather(nbond_acc,nbond_acc1,4*Nbm,MasterID, + & cgGroupID) + print *,'Processor',MyID,' MP_GATHER call accomplished' + if (MyID.eq.MasterID) then + + write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:' + call statprint(nacc_tot,nfun,iretcode,etot,elowest) + write (iout,'(a)') + & 'Statistics of multiple-bond motions. Total motions:' + write (iout,'(8i10)') (nbond_move(i),i=1,Nbm) + write (iout,'(a)') 'Accepted motions:' + write (iout,'(8i10)') (nbond_acc(i),i=1,Nbm) + + write (iout,'(a)') + & 'Statistics of multi-bond moves of respective processors:' + do iproc=1,Nprocs-1 + do i=1,Nbm + ind=iproc*nbm+i + nbond_move(i)=nbond_move(i)+nbond_move1(ind) + nbond_acc(i)=nbond_acc(i)+nbond_acc1(ind) + enddo + enddo + do iproc=0,NProcs-1 + write (iout,*) 'Processor',iproc,' nbond_move:', + & (nbond_move1(iproc*nbm+i),i=1,Nbm), + & ' nbond_acc:',(nbond_acc1(iproc*nbm+i),i=1,Nbm) + enddo + endif + call mp_gather(moves,moves1,4*(MaxMoveType+3),MasterID, + & cgGroupID) + call mp_gather(moves_acc,moves_acc1,4*(MaxMoveType+3), + & MasterID,cgGroupID) + if (MyID.eq.MasterID) then + do iproc=1,Nprocs-1 + do i=-1,MaxMoveType+1 + moves(i)=moves(i)+moves1(i,iproc) + moves_acc(i)=moves_acc(i)+moves_acc1(i,iproc) + enddo + enddo + nmove=0 + do i=0,MaxMoveType+1 + nmove=nmove+moves(i) + enddo + do iproc=0,NProcs-1 + write (iout,*) 'Processor',iproc,' moves', + & (moves1(i,iproc),i=0,MaxMoveType+1), + & ' moves_acc:',(moves_acc1(i,iproc),i=0,MaxMoveType+1) + enddo + endif +#else + open (ientout,file=entname,status='unknown') + write (ientout,'(2i5,2e25.17)') indminn,indmaxx,emin,emax + do i=indminn,indmaxx + write (ientout,'(i5,f10.5,f20.15)') i,emin+i*delte,entropy(i) + enddo + close(ientout) +#endif + write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:' + call statprint(nacc_tot,nfun,iretcode,etot,elowest) + write (iout,'(a)') + & 'Statistics of multiple-bond motions. Total motions:' + write (iout,'(8i10)') (nbond_move(i),i=1,Nbm) + write (iout,'(a)') 'Accepted motions:' + write (iout,'(8i10)') (nbond_acc(i),i=1,Nbm) + if (ovrtim() .or. WhatsUp.lt.0) return + +C--------------------------------------------------------------------------- + ENDDO ! ISWEEP +C--------------------------------------------------------------------------- + + runtime=tcpu() + + if (isweep.eq.nsweep .and. it.ge.maxacc) + &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.' + return + end +c------------------------------------------------------------------------------ + subroutine accept_mc(it,ecur,eold,scur,sold,x,xold,accepted) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.GEO' + double precision ecur,eold,xx,ran_number,bol + double precision x(maxvar),xold(maxvar) + logical accepted +C Check if the conformation is similar. +cd write (iout,*) 'Enter ACCEPTING' +cd write (iout,*) 'Old PHI angles:' +cd write (iout,*) (rad2deg*xold(i),i=1,nphi) +cd write (iout,*) 'Current angles' +cd write (iout,*) (rad2deg*x(i),i=1,nphi) +cd ddif=dif_ang(nphi,x,xold) +cd write (iout,*) 'Angle norm:',ddif +cd write (iout,*) 'ecur=',ecur,' emax=',emax + if (ecur.gt.emax) then + accepted=.false. + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a)') 'Conformation rejected as too high in energy' + return + endif +C Else evaluate the entropy of the conf and compare it with that of the previous +C one. + call entropia(ecur,scur,indecur) +cd print *,'Processor',MyID,' ecur=',ecur,' indecur=',indecur, +cd & ' scur=',scur,' eold=',eold,' sold=',sold +cd print *,'deix=',deix,' dent=',dent,' delte=',delte + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) then + write(iout,*)'it=',it,'ecur=',ecur,' indecur=',indecur, + & ' scur=',scur + write(iout,*)'eold=',eold,' sold=',sold + endif + if (scur.le.sold) then + accepted=.true. + else +C Else carry out acceptance test + xx=ran_number(0.0D0,1.0D0) + xxh=scur-sold + if (xxh.gt.50.0D0) then + bol=0.0D0 + else + bol=exp(-xxh) + endif + if (bol.gt.xx) then + accepted=.true. + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a)') 'Conformation accepted.' + else + accepted=.false. + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a)') 'Conformation rejected.' + endif + endif + return + end +c-------------------------------------------------------------------------- + integer function icialosc(x) + double precision x + if (x.lt.0.0D0) then + icialosc=dint(x)-1 + else + icialosc=dint(x) + endif + return + end +c-------------------------------------------------------------------------- + subroutine entropia(ecur,scur,indecur) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.IOUNITS' + double precision ecur,scur + integer indecur + indecur=icialosc((ecur-emin)/delte) + if (iabs(indecur).gt.max_ene) then + if ((it/print_freq)*it.eq.it) write (iout,'(a,2i5)') + & 'Accepting: Index out of range:',indecur + scur=1000.0D0 + else if (indecur.ge.indmaxx) then + scur=entropy(indecur) + if (print_mc.gt.0 .and. (it/print_freq)*it.eq.it) + & write (iout,*)'Energy boundary reached', + & indmaxx,indecur,entropy(indecur) + else + deix=ecur-(emin+indecur*delte) + dent=entropy(indecur+1)-entropy(indecur) + scur=entropy(indecur)+(dent/delte)*deix + endif + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/mcm.F b/source/unres/src_Eshel/SRC-SURPLUS/mcm.F new file mode 100644 index 0000000..d9ca9ad --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/mcm.F @@ -0,0 +1,1481 @@ + subroutine mcm_setup + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.MCM' + include 'COMMON.CONTROL' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.VAR' +C +C Set up variables used in MC/MCM. +C + write (iout,'(80(1h*)/20x,a/80(1h*))') 'MCM control parameters:' + write (iout,'(5(a,i7))') 'Maxacc:',maxacc,' MaxTrial:',MaxTrial, + & ' MaxRepm:',MaxRepm,' MaxGen:',MaxGen,' MaxOverlap:',MaxOverlap + write (iout,'(4(a,f8.1)/2(a,i3))') + & 'Tmin:',Tmin,' Tmax:',Tmax,' TstepH:',TstepH, + & ' TstepC:',TstepC,'NstepH:',NstepH,' NstepC:',NstepC + if (nwindow.gt.0) then + write (iout,'(a)') 'Perturbation windows:' + do i=1,nwindow + i1=winstart(i) + i2=winend(i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(a,i3,a,i3,a,i3)') restyp(it1),i1,restyp(it2),i2, + & ' length',winlen(i) + enddo + endif +C Rbolt=8.3143D-3*2.388459D-01 kcal/(mol*K) + RBol=1.9858D-3 +C Number of "end bonds". + koniecl=0 +c koniecl=nphi + print *,'koniecl=',koniecl + write (iout,'(a)') 'Probabilities of move types:' + write (*,'(a)') 'Probabilities of move types:' + do i=1,MaxMoveType + write (iout,'(a,f10.5)') MovTypID(i), + & sumpro_type(i)-sumpro_type(i-1) + write (*,'(a,f10.5)') MovTypID(i), + & sumpro_type(i)-sumpro_type(i-1) + enddo + write (iout,*) +C Maximum length of N-bond segment to be moved +c nbm=nres-1-(2*koniecl-1) + if (nwindow.gt.0) then + maxwinlen=winlen(1) + do i=2,nwindow + if (winlen(i).gt.maxwinlen) maxwinlen=winlen(i) + enddo + nbm=min0(maxwinlen,6) + write (iout,'(a,i3,a,i3)') 'Nbm=',Nbm,' Maxwinlen=',Maxwinlen + else + nbm=min0(6,nres-2) + endif + sumpro_bond(0)=0.0D0 + sumpro_bond(1)=0.0D0 + do i=2,nbm + sumpro_bond(i)=sumpro_bond(i-1)+1.0D0/dfloat(i) + enddo + write (iout,'(a)') 'The SumPro_Bond array:' + write (iout,'(8f10.5)') (sumpro_bond(i),i=1,nbm) + write (*,'(a)') 'The SumPro_Bond array:' + write (*,'(8f10.5)') (sumpro_bond(i),i=1,nbm) +C Maximum number of side chains moved simultaneously +c print *,'nnt=',nnt,' nct=',nct + ngly=0 + do i=nnt,nct + if (itype(i).eq.10) ngly=ngly+1 + enddo + mmm=nct-nnt-ngly+1 + if (mmm.gt.0) then + MaxSideMove=min0((nct-nnt+1)/2,mmm) + endif +c print *,'MaxSideMove=',MaxSideMove +C Max. number of generated confs (not used at present). + maxgen=10000 +C Set initial temperature + Tcur=Tmin + betbol=1.0D0/(Rbol*Tcur) + write (iout,'(a,f8.1,a,f10.5)') 'Initial temperature:',Tcur, + & ' BetBol:',betbol + write (iout,*) 'RanFract=',ranfract + return + end +c------------------------------------------------------------------------------ +#ifndef MPI + subroutine do_mcm(i_orig) +C Monte-Carlo-with-Minimization calculations - serial code. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.MCM' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.CACHE' +crc include 'COMMON.DEFORM' +crc include 'COMMON.DEFORM1' + include 'COMMON.NAMES' + logical accepted,over,ovrtim,error,lprint,not_done,my_conf, + & enelower,non_conv + integer MoveType,nbond,conf_comp + integer ifeed(max_cache) + double precision varia(maxvar),varold(maxvar),elowest,eold, + & przes(3),obr(3,3) + double precision energia(0:n_ene) + double precision coord1(maxres,3) + +C--------------------------------------------------------------------------- +C Initialize counters. +C--------------------------------------------------------------------------- +C Total number of generated confs. + ngen=0 +C Total number of moves. In general this won't be equal to the number of +C attempted moves, because we may want to reject some "bad" confs just by +C overlap check. + nmove=0 +C Total number of temperature jumps. + ntherm=0 +C Total number of shift (nbond_move(1)), spike, crankshaft, three-bond,... +C motions. + ncache=0 + do i=1,nres + nbond_move(i)=0 + enddo +C Initialize total and accepted number of moves of various kind. + do i=0,MaxMoveType + moves(i)=0 + moves_acc(i)=0 + enddo +C Total number of energy evaluations. + neneval=0 + nfun=0 + nsave=0 + + write (iout,*) 'RanFract=',RanFract + + WhatsUp=0 + Kwita=0 + +c---------------------------------------------------------------------------- +C Compute and print initial energies. +c---------------------------------------------------------------------------- + call intout + write (iout,'(/80(1h*)/a)') 'Initial energies:' + call chainbuild + nf=0 + + call etotal(energia(0)) + etot = energia(0) +C Minimize the energy of the first conformation. + if (minim) then + call geom_to_var(nvar,varia) +! write (iout,*) 'The VARIA array' +! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar) + call minimize(etot,varia,iretcode,nfun) + call var_to_geom(nvar,varia) + call chainbuild + write (iout,*) 'etot from MINIMIZE:',etot +! write (iout,*) 'Tha VARIA array' +! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar) + + call etotal(energia(0)) + etot=energia(0) + call enerprint(energia(0)) + endif + if (refstr) then + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup,przes, + & obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order:',co + if (print_stat) + & write (istat,'(i5,17(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene), + & etot,rms,frac,co + else + if (print_stat) write (istat,'(i5,16(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif + if (print_stat) close(istat) + neneval=neneval+nfun+1 + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Enter Monte Carlo procedure.' + if (print_int) then + close(igeom) + call briefout(0,etot) + endif + eold=etot + do i=1,nvar + varold(i)=varia(i) + enddo + elowest=etot + call zapis(varia,etot) + nacc=0 ! total # of accepted confs of the current processor. + nacc_tot=0 ! total # of accepted confs of all processors. + + not_done = (iretcode.ne.11) + +C---------------------------------------------------------------------------- +C Main loop. +c---------------------------------------------------------------------------- + it=0 + nout=0 + do while (not_done) + it=it+1 + write (iout,'(80(1h*)/20x,a,i7)') + & 'Beginning iteration #',it +C Initialize local counter. + ntrial=0 ! # of generated non-overlapping confs. + accepted=.false. + do while (.not. accepted) + +C Retrieve the angles of previously accepted conformation + noverlap=0 ! # of overlapping confs. + do j=1,nvar + varia(j)=varold(j) + enddo + call var_to_geom(nvar,varia) +C Rebuild the chain. + call chainbuild +C Heat up the system, if necessary. + call heat(over) +C If temperature cannot be further increased, stop. + if (over) goto 20 + MoveType=0 + nbond=0 + lprint=.true. +cd write (iout,'(a)') 'Old variables:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) +C Decide whether to generate a random conformation or perturb the old one + RandOrPert=ran_number(0.0D0,1.0D0) + if (RandOrPert.gt.RanFract) then + if (print_mc.gt.0) + & write (iout,'(a)') 'Perturbation-generated conformation.' + call perturb(error,lprint,MoveType,nbond,1.0D0) + if (error) goto 20 + if (MoveType.lt.1 .or. MoveType.gt.MaxMoveType) then + write (iout,'(/a,i7,a/)') 'Error - unknown MoveType=', + & MoveType,' returned from PERTURB.' + goto 20 + endif + call chainbuild + else + MoveType=0 + moves(0)=moves(0)+1 + nstart_grow=iran_num(3,nres) + if (print_mc.gt.0) + & write (iout,'(2a,i3)') 'Random-generated conformation', + & ' - chain regrown from residue',nstart_grow + call gen_rand_conf(nstart_grow,*30) + endif + call geom_to_var(nvar,varia) +cd write (iout,'(a)') 'New variables:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + ngen=ngen+1 + + call etotal(energia(0)) + etot=energia(0) +c call enerprint(energia(0)) +c write (iout,'(2(a,1pe14.5))') 'Etot=',Etot,' Elowest=',Elowest + if (etot-elowest.gt.overlap_cut) then + if(iprint.gt.1.or.etot.lt.1d20) + & write (iout,'(a,1pe14.5)') + & 'Overlap detected in the current conf.; energy is',etot + neneval=neneval+1 + accepted=.false. + noverlap=noverlap+1 + if (noverlap.gt.maxoverlap) then + write (iout,'(a)') 'Too many overlapping confs.' + goto 20 + endif + else + if (minim) then + call minimize(etot,varia,iretcode,nfun) +cd write (iout,*) 'etot from MINIMIZE:',etot +cd write (iout,'(a)') 'Variables after minimization:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + + call etotal(energia(0)) + etot = energia(0) + neneval=neneval+nfun+2 + endif +c call enerprint(energia(0)) + write (iout,'(a,i6,a,1pe16.6)') 'Conformation:',ngen, + & ' energy:',etot +C-------------------------------------------------------------------------- +C... Do Metropolis test +C-------------------------------------------------------------------------- + accepted=.false. + my_conf=.false. + + if (WhatsUp.eq.0 .and. Kwita.eq.0) then + call metropolis(nvar,varia,varold,etot,eold,accepted, + & my_conf,EneLower) + endif + write (iout,*) 'My_Conf=',My_Conf,' EneLower=',EneLower + if (accepted) then + + nacc=nacc+1 + nacc_tot=nacc_tot+1 + if (elowest.gt.etot) elowest=etot + moves_acc(MoveType)=moves_acc(MoveType)+1 + if (MoveType.eq.1) then + nbond_acc(nbond)=nbond_acc(nbond)+1 + endif +C Check against conformation repetitions. + irepet=conf_comp(varia,etot) + if (print_stat) then +#if defined(AIX) || defined(PGI) + open (istat,file=statname,position='append') +#else + open (istat,file=statname,access='append') +#endif + endif + call statprint(nacc,nfun,iretcode,etot,elowest) + if (refstr) then + call var_to_geom(nvar,varia) + call chainbuild + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup), + & nsup,przes,obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + write (iout,'(a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order',co + endif ! refstr + if (My_Conf) then + nout=nout+1 + write (iout,*) 'Writing new conformation',nout + if (refstr) then + write (istat,'(i5,16(1pe14.5))') nout, + & (energia(print_order(i)),i=1,nprint_ene), + & etot,rms,frac + else + if (print_stat) + & write (istat,'(i5,17(1pe14.5))') nout, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif ! refstr + if (print_stat) close(istat) +C Print internal coordinates. + if (print_int) call briefout(nout,etot) +C Accumulate the newly accepted conf in the coord1 array, if it is different +C from all confs that are already there. + call compare_s1(n_thr,max_thread2,etot,varia,ii, + & enetb1,coord1,rms_deform,.true.,iprint) + write (iout,*) 'After compare_ss: n_thr=',n_thr + if (ii.eq.1 .or. ii.eq.3) then + write (iout,'(8f10.4)') + & (rad2deg*coord1(i,n_thr),i=1,nvar) + endif + else + write (iout,*) 'Conformation from cache, not written.' + endif ! My_Conf + + if (nrepm.gt.maxrepm) then + write (iout,'(a)') 'Too many conformation repetitions.' + goto 20 + endif +C Store the accepted conf. and its energy. + eold=etot + do i=1,nvar + varold(i)=varia(i) + enddo + if (irepet.eq.0) call zapis(varia,etot) +C Lower the temperature, if necessary. + call cool + + else + + ntrial=ntrial+1 + endif ! accepted + endif ! overlap + + 30 continue + enddo ! accepted +C Check for time limit. + if (ovrtim()) WhatsUp=-1 + not_done = (nacc_tot.lt.maxacc) .and. (WhatsUp.eq.0) + & .and. (Kwita.eq.0) + + enddo ! not_done + goto 21 + 20 WhatsUp=-3 + + 21 continue + runtime=tcpu() + write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:' + call statprint(nacc,nfun,iretcode,etot,elowest) + write (iout,'(a)') + & 'Statistics of multiple-bond motions. Total motions:' + write (iout,'(16i5)') (nbond_move(i),i=1,Nbm) + write (iout,'(a)') 'Accepted motions:' + write (iout,'(16i5)') (nbond_acc(i),i=1,Nbm) + if (it.ge.maxacc) + &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.' + + return + end +#endif +#ifdef MPI +c------------------------------------------------------------------------------ + subroutine do_mcm(i_orig) +C Monte-Carlo-with-Minimization calculations - parallel code. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.MCM' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.INFO' + include 'COMMON.CACHE' +crc include 'COMMON.DEFORM' +crc include 'COMMON.DEFORM1' +crc include 'COMMON.DEFORM2' + include 'COMMON.MINIM' + include 'COMMON.NAMES' + logical accepted,over,ovrtim,error,lprint,not_done,similar, + & enelower,non_conv,flag,finish + integer MoveType,nbond,conf_comp + double precision varia(maxvar),varold(maxvar),elowest,eold, + & x1(maxvar), varold1(maxvar), przes(3),obr(3,3) + integer iparentx(max_threadss2) + integer iparentx1(max_threadss2) + integer imtasks(150),imtasks_n + double precision energia(0:n_ene) + + print *,'Master entered DO_MCM' + nodenum = nprocs + + finish=.false. + imtasks_n=0 + do i=1,nodenum-1 + imtasks(i)=0 + enddo +C--------------------------------------------------------------------------- +C Initialize counters. +C--------------------------------------------------------------------------- +C Total number of generated confs. + ngen=0 +C Total number of moves. In general this won`t be equal to the number of +C attempted moves, because we may want to reject some "bad" confs just by +C overlap check. + nmove=0 +C Total number of temperature jumps. + ntherm=0 +C Total number of shift (nbond_move(1)), spike, crankshaft, three-bond,... +C motions. + ncache=0 + do i=1,nres + nbond_move(i)=0 + enddo +C Initialize total and accepted number of moves of various kind. + do i=0,MaxMoveType + moves(i)=0 + moves_acc(i)=0 + enddo +C Total number of energy evaluations. + neneval=0 + nfun=0 + nsave=0 +c write (iout,*) 'RanFract=',RanFract + WhatsUp=0 + Kwita=0 +c---------------------------------------------------------------------------- +C Compute and print initial energies. +c---------------------------------------------------------------------------- + call intout + write (iout,'(/80(1h*)/a)') 'Initial energies:' + call chainbuild + nf=0 + call etotal(energia(0)) + etot = energia(0) + call enerprint(energia(0)) +C Request energy computation from slave processors. + call geom_to_var(nvar,varia) +! write (iout,*) 'The VARIA array' +! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar) + call minimize(etot,varia,iretcode,nfun) + call var_to_geom(nvar,varia) + call chainbuild + write (iout,*) 'etot from MINIMIZE:',etot +! write (iout,*) 'Tha VARIA array' +! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar) + neneval=0 + eneglobal=1.0d99 + if (print_mc .gt. 0) write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Enter Monte Carlo procedure.' + if (print_mc .gt. 0) write (iout,'(i5,1pe14.5)' ) i_orig,etot + eold=etot + do i=1,nvar + varold(i)=varia(i) + enddo + elowest=etot + call zapis(varia,etot) +c diagnostics + call var_to_geom(nvar,varia) + call chainbuild + call etotal(energia(0)) + if (print_mc.gt.0) write (iout,*) 'Initial energy:',etot +c end diagnostics + nacc=0 ! total # of accepted confs of the current processor. + nacc_tot=0 ! total # of accepted confs of all processors. + not_done=.true. +C---------------------------------------------------------------------------- +C Main loop. +c---------------------------------------------------------------------------- + it=0 + nout=0 + LOOP1:do while (not_done) + it=it+1 + if (print_mc.gt.0) write (iout,'(80(1h*)/20x,a,i7)') + & 'Beginning iteration #',it +C Initialize local counter. + ntrial=0 ! # of generated non-overlapping confs. + noverlap=0 ! # of overlapping confs. + accepted=.false. + LOOP2:do while (.not. accepted) + + LOOP3:do while (imtasks_n.lt.nodenum-1.and..not.finish) + do i=1,nodenum-1 + if(imtasks(i).eq.0) then + is=i + exit + endif + enddo +C Retrieve the angles of previously accepted conformation + do j=1,nvar + varia(j)=varold(j) + enddo + call var_to_geom(nvar,varia) +C Rebuild the chain. + call chainbuild +C Heat up the system, if necessary. + call heat(over) +C If temperature cannot be further increased, stop. + if (over) then + finish=.true. + endif + MoveType=0 + nbond=0 +c write (iout,'(a)') 'Old variables:' +c write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) +C Decide whether to generate a random conformation or perturb the old one + RandOrPert=ran_number(0.0D0,1.0D0) + if (RandOrPert.gt.RanFract) then + if (print_mc.gt.0) + & write (iout,'(a)') 'Perturbation-generated conformation.' + call perturb(error,lprint,MoveType,nbond,1.0D0) +c print *,'after perturb',error,finish + if (error) finish = .true. + if (MoveType.lt.1 .or. MoveType.gt.MaxMoveType) then + write (iout,'(/a,i7,a/)') 'Error - unknown MoveType=', + & MoveType,' returned from PERTURB.' + finish=.true. + write (*,'(/a,i7,a/)') 'Error - unknown MoveType=', + & MoveType,' returned from PERTURB.' + endif + call chainbuild + else + MoveType=0 + moves(0)=moves(0)+1 + nstart_grow=iran_num(3,nres) + if (print_mc.gt.0) + & write (iout,'(2a,i3)') 'Random-generated conformation', + & ' - chain regrown from residue',nstart_grow + call gen_rand_conf(nstart_grow,*30) + endif + call geom_to_var(nvar,varia) + ngen=ngen+1 +c print *,'finish=',finish + if (etot-elowest.gt.overlap_cut) then + if (print_mc.gt.1) write (iout,'(a,1pe14.5)') + & 'Overlap detected in the current conf.; energy is',etot + if(iprint.gt.1.or.etot.lt.1d19) print *, + & 'Overlap detected in the current conf.; energy is',etot + neneval=neneval+1 + accepted=.false. + noverlap=noverlap+1 + if (noverlap.gt.maxoverlap) then + write (iout,*) 'Too many overlapping confs.', + & ' etot, elowest, overlap_cut', etot, elowest, overlap_cut + finish=.true. + endif + else if (.not. finish) then +C Distribute tasks to processors +c print *,'Master sending order' + call MPI_SEND(12, 1, MPI_INTEGER, is, tag, + & CG_COMM, ierr) +c write (iout,*) '12: tag=',tag +c print *,'Master sent order to processor',is + call MPI_SEND(it, 1, MPI_INTEGER, is, tag, + & CG_COMM, ierr) +c write (iout,*) 'it: tag=',tag + call MPI_SEND(eold, 1, MPI_DOUBLE_PRECISION, is, tag, + & CG_COMM, ierr) +c write (iout,*) 'eold: tag=',tag + call MPI_SEND(varia(1), nvar, MPI_DOUBLE_PRECISION, + & is, tag, + & CG_COMM, ierr) +c write (iout,*) 'varia: tag=',tag + call MPI_SEND(varold(1), nvar, MPI_DOUBLE_PRECISION, + & is, tag, + & CG_COMM, ierr) +c write (iout,*) 'varold: tag=',tag +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif + imtasks(is)=1 + imtasks_n=imtasks_n+1 +C End distribution + endif ! overlap + enddo LOOP3 + + flag = .false. + LOOP_RECV:do while(.not.flag) + do is=1, nodenum-1 + call MPI_IPROBE(is,tag,CG_COMM,flag,status,ierr) + if(flag) then + call MPI_RECV(iitt, 1, MPI_INTEGER, is, tag, + & CG_COMM, status, ierr) + call MPI_RECV(eold1, 1, MPI_DOUBLE_PRECISION, is, tag, + & CG_COMM, status, ierr) + call MPI_RECV(etot, 1, MPI_DOUBLE_PRECISION, is, tag, + & CG_COMM, status, ierr) + call MPI_RECV(varia(1), nvar, MPI_DOUBLE_PRECISION,is,tag, + & CG_COMM, status, ierr) + call MPI_RECV(varold1(1), nvar, MPI_DOUBLE_PRECISION, is, + & tag, CG_COMM, status, ierr) + call MPI_RECV(ii_grnum_d, 1, MPI_INTEGER, is, tag, + & CG_COMM, status, ierr) + call MPI_RECV(ii_ennum_d, 1, MPI_INTEGER, is, tag, + & CG_COMM, status, ierr) + call MPI_RECV(ii_hesnum_d, 1, MPI_INTEGER, is, tag, + & CG_COMM, status, ierr) + i_grnum_d=i_grnum_d+ii_grnum_d + i_ennum_d=i_ennum_d+ii_ennum_d + neneval = neneval+ii_ennum_d + i_hesnum_d=i_hesnum_d+ii_hesnum_d + i_minimiz=i_minimiz+1 + imtasks(is)=0 + imtasks_n=imtasks_n-1 + exit + endif + enddo + enddo LOOP_RECV + + if(print_mc.gt.0) write (iout,'(a,i6,a,i6,a,i6,a,1pe16.6)') + & 'From Worker #',is,' iitt',iitt, + & ' Conformation:',ngen,' energy:',etot +C-------------------------------------------------------------------------- +C... Do Metropolis test +C-------------------------------------------------------------------------- + call metropolis(nvar,varia,varold1,etot,eold1,accepted, + & similar,EneLower) + if(iitt.ne.it.and..not.similar) then + call metropolis(nvar,varia,varold,etot,eold,accepted, + & similar,EneLower) + accepted=enelower + endif + if(etot.lt.eneglobal)eneglobal=etot +c if(mod(it,100).eq.0) + write(iout,*)'CHUJOJEB ',neneval,eneglobal + if (accepted) then +C Write the accepted conformation. + nout=nout+1 + if (refstr) then + call var_to_geom(nvar,varia) + call chainbuild + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup), + & nsup,przes,obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order:',co + endif ! refstr + if (print_mc.gt.0) + & write (iout,*) 'Writing new conformation',nout + if (print_stat) then + call var_to_geom(nvar,varia) +#if defined(AIX) || defined(PGI) + open (istat,file=statname,position='append') +#else + open (istat,file=statname,access='append') +#endif + if (refstr) then + write (istat,'(i5,16(1pe14.5))') nout, + & (energia(print_order(i)),i=1,nprint_ene), + & etot,rms,frac + else + write (istat,'(i5,16(1pe14.5))') nout, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif ! refstr + close(istat) + endif ! print_stat +C Print internal coordinates. + if (print_int) call briefout(nout,etot) + nacc=nacc+1 + nacc_tot=nacc_tot+1 + if (elowest.gt.etot) elowest=etot + moves_acc(MoveType)=moves_acc(MoveType)+1 + if (MoveType.eq.1) then + nbond_acc(nbond)=nbond_acc(nbond)+1 + endif +C Check against conformation repetitions. + irepet=conf_comp(varia,etot) + if (nrepm.gt.maxrepm) then + if (print_mc.gt.0) + & write (iout,'(a)') 'Too many conformation repetitions.' + finish=.true. + endif +C Store the accepted conf. and its energy. + eold=etot + do i=1,nvar + varold(i)=varia(i) + enddo + if (irepet.eq.0) call zapis(varia,etot) +C Lower the temperature, if necessary. + call cool + else + ntrial=ntrial+1 + endif ! accepted + 30 continue + if(finish.and.imtasks_n.eq.0)exit LOOP2 + enddo LOOP2 ! accepted +C Check for time limit. + not_done = (it.lt.max_mcm_it) .and. (nacc_tot.lt.maxacc) + if(.not.not_done .or. finish) then + if(imtasks_n.gt.0) then + not_done=.true. + else + not_done=.false. + endif + finish=.true. + endif + enddo LOOP1 ! not_done + runtime=tcpu() + if (print_mc.gt.0) then + write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:' + call statprint(nacc,nfun,iretcode,etot,elowest) + write (iout,'(a)') + & 'Statistics of multiple-bond motions. Total motions:' + write (iout,'(16i5)') (nbond_move(i),i=1,Nbm) + write (iout,'(a)') 'Accepted motions:' + write (iout,'(16i5)') (nbond_acc(i),i=1,Nbm) + if (it.ge.maxacc) + &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.' + endif +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif + do is=1,nodenum-1 + call MPI_SEND(999, 1, MPI_INTEGER, is, tag, + & CG_COMM, ierr) + enddo + return + end +c------------------------------------------------------------------------------ + subroutine execute_slave(nodeinfo,iprint) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.TIME1' + include 'COMMON.IOUNITS' +crc include 'COMMON.DEFORM' +crc include 'COMMON.DEFORM1' +crc include 'COMMON.DEFORM2' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.INFO' + include 'COMMON.MINIM' + character*10 nodeinfo + double precision x(maxvar),x1(maxvar) + nodeinfo='chujwdupe' +c print *,'Processor:',MyID,' Entering execute_slave' + tag=0 +c call MPI_SEND(nodeinfo, 10, MPI_CHARACTER, 0, tag, +c & CG_COMM, ierr) + +1001 call MPI_RECV(i_switch, 1, MPI_INTEGER, 0, tag, + & CG_COMM, status, ierr) +c write(iout,*)'12: tag=',tag + if(iprint.ge.2)print *, MyID,' recv order ',i_switch + if (i_switch.eq.12) then + i_grnum_d=0 + i_ennum_d=0 + i_hesnum_d=0 + call MPI_RECV(iitt, 1, MPI_INTEGER, 0, tag, + & CG_COMM, status, ierr) +c write(iout,*)'12: tag=',tag + call MPI_RECV(ener, 1, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, status, ierr) +c write(iout,*)'ener: tag=',tag + call MPI_RECV(x(1), nvar, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, status, ierr) +c write(iout,*)'x: tag=',tag + call MPI_RECV(x1(1), nvar, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, status, ierr) +c write(iout,*)'x1: tag=',tag +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif +c print *,'calling minimize' + call minimize(energyx,x,iretcode,nfun) + if(iprint.gt.0) + & write(iout,100)'minimized energy = ',energyx, + & ' # funeval:',nfun,' iret ',iretcode + write(*,100)'minimized energy = ',energyx, + & ' # funeval:',nfun,' iret ',iretcode + 100 format(a20,f10.5,a12,i5,a6,i2) + if(iretcode.eq.10) then + do iminrep=2,3 + if(iprint.gt.1) + & write(iout,*)' ... not converged - trying again ',iminrep + call minimize(energyx,x,iretcode,nfun) + if(iprint.gt.1) + & write(iout,*)'minimized energy = ',energyx, + & ' # funeval:',nfun,' iret ',iretcode + if(iretcode.ne.10)go to 812 + enddo + if(iretcode.eq.10) then + if(iprint.gt.1) + & write(iout,*)' ... not converged again - giving up' + go to 812 + endif + endif +812 continue +c print *,'Sending results' + call MPI_SEND(iitt, 1, MPI_INTEGER, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(ener, 1, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(energyx, 1, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(x(1), nvar, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(x1(1), nvar, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(i_grnum_d, 1, MPI_INTEGER, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(nfun, 1, MPI_INTEGER, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(i_hesnum_d, 1, MPI_INTEGER, 0, tag, + & CG_COMM, ierr) +c print *,'End sending' + go to 1001 + endif + + return + end +#endif +c------------------------------------------------------------------------------ + subroutine statprint(it,nfun,iretcode,etot,elowest) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include 'COMMON.MCM' + if (minim) then + write (iout, + & '(80(1h*)/a,i5,a,1pe14.5,a,1pe14.5/a,i3,a,i10,a,i5,a,i5)') + & 'Finished iteration #',it,' energy is',etot, + & ' lowest energy:',elowest, + & 'SUMSL return code:',iretcode, + & ' # of energy evaluations:',neneval, + & '# of temperature jumps:',ntherm, + & ' # of minima repetitions:',nrepm + else + write (iout,'(80(1h*)/a,i8,a,1pe14.5,a,1pe14.5)') + & 'Finished iteration #',it,' energy is',etot, + & ' lowest energy:',elowest + endif + write (iout,'(/4a)') + & 'Kind of move ',' total',' accepted', + & ' fraction' + write (iout,'(58(1h-))') + do i=-1,MaxMoveType + if (moves(i).eq.0) then + fr_mov_i=0.0d0 + else + fr_mov_i=dfloat(moves_acc(i))/dfloat(moves(i)) + endif + write(iout,'(a,2i15,f10.5)')MovTypID(i),moves(i),moves_acc(i), + & fr_mov_i + enddo + write (iout,'(a,2i15,f10.5)') 'total ',nmove,nacc_tot, + & dfloat(nacc_tot)/dfloat(nmove) + write (iout,'(58(1h-))') + write (iout,'(a,1pe12.4)') 'Elapsed time:',tcpu() + return + end +c------------------------------------------------------------------------------ + subroutine heat(over) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + logical over +C Check if there`s a need to increase temperature. + if (ntrial.gt.maxtrial) then + if (NstepH.gt.0) then + if (dabs(Tcur-TMax).lt.1.0D-7) then + if (print_mc.gt.0) + & write (iout,'(/80(1h*)/a,f8.3,a/80(1h*))') + & 'Upper limit of temperature reached. Terminating.' + over=.true. + Tcur=Tmin + else + Tcur=Tcur*TstepH + if (Tcur.gt.Tmax) Tcur=Tmax + betbol=1.0D0/(Rbol*Tcur) + if (print_mc.gt.0) + & write (iout,'(/80(1h*)/a,f8.3,a,f10.5/80(1h*))') + & 'System heated up to ',Tcur,' K; BetBol:',betbol + ntherm=ntherm+1 + ntrial=0 + over=.false. + endif + else + if (print_mc.gt.0) + & write (iout,'(a)') + & 'Maximum number of trials in a single MCM iteration exceeded.' + over=.true. + Tcur=Tmin + endif + else + over=.false. + endif + return + end +c------------------------------------------------------------------------------ + subroutine cool + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + if (nstepC.gt.0 .and. dabs(Tcur-Tmin).gt.1.0D-7) then + Tcur=Tcur/TstepC + if (Tcur.lt.Tmin) Tcur=Tmin + betbol=1.0D0/(Rbol*Tcur) + if (print_mc.gt.0) + & write (iout,'(/80(1h*)/a,f8.3,a,f10.5/80(1h*))') + & 'System cooled down up to ',Tcur,' K; BetBol:',betbol + endif + return + end +C--------------------------------------------------------------------------- + subroutine zapis(varia,etot) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MP + include 'mpif.h' + include 'COMMON.INFO' +#endif + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + integer itemp(maxsave) + double precision varia(maxvar) + logical lprint + lprint=.false. + if (lprint) then + write (iout,'(a,i5,a,i5)') 'Enter ZAPIS NSave=',Nsave, + & ' MaxSave=',MaxSave + write (iout,'(a)') 'Current energy and conformation:' + write (iout,'(1pe14.5)') etot + write (iout,'(10f8.3)') (rad2deg*varia(i),i=1,nvar) + endif +C Shift the contents of the esave and varsave arrays if filled up. + call add2cache(maxvar,maxsave,nsave,nvar,MyID,itemp, + & etot,varia,esave,varsave) + if (lprint) then + write (iout,'(a)') 'Energies and the VarSave array.' + do i=1,nsave + write (iout,'(i5,1pe14.5)') i,esave(i) + write (iout,'(10f8.3)') (rad2deg*varsave(j,i),j=1,nvar) + enddo + endif + return + end +C--------------------------------------------------------------------------- + subroutine perturb(error,lprint,MoveType,nbond,max_phi) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (MMaxSideMove=100) + include 'COMMON.MCM' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' +crc include 'COMMON.DEFORM1' + logical error,lprint,fail + integer MoveType,nbond,end_select,ind_side(MMaxSideMove) + double precision max_phi + double precision psi,gen_psi + external iran_num + integer iran_num + integer ifour + data ifour /4/ + error=.false. + lprint=.false. +C Perturb the conformation according to a randomly selected move. + call SelectMove(MoveType) +c write (iout,*) 'MoveType=',MoveType + itrial=0 + goto (100,200,300,400,500) MoveType +C------------------------------------------------------------------------------ +C Backbone N-bond move. +C Select the number of bonds (length of the segment to perturb). + 100 continue + if (itrial.gt.1000) then + write (iout,'(a)') 'Too many attempts at multiple-bond move.' + error=.true. + return + endif + bond_prob=ran_number(0.0D0,sumpro_bond(nbm)) +c print *,'sumpro_bond(nbm)=',sumpro_bond(nbm), +c & ' Bond_prob=',Bond_Prob + do i=1,nbm-1 +c print *,i,Bond_Prob,sumpro_bond(i),sumpro_bond(i+1) + if (bond_prob.ge.sumpro_bond(i) .and. + & bond_prob.le.sumpro_bond(i+1)) then + nbond=i+1 + goto 10 + endif + enddo + write (iout,'(2a)') 'In PERTURB: Error - number of bonds', + & ' to move out of range.' + error=.true. + return + 10 continue + if (nwindow.gt.0) then +C Select the first residue to perturb + iwindow=iran_num(1,nwindow) + print *,'iwindow=',iwindow + iiwin=1 + do while (winlen(iwindow).lt.nbond) + iwindow=iran_num(1,nwindow) + iiwin=iiwin+1 + if (iiwin.gt.1000) then + write (iout,'(a)') 'Cannot select moveable residues.' + error=.true. + return + endif + enddo + nstart=iran_num(winstart(iwindow),winend(iwindow)) + else + nstart = iran_num(koniecl+2,nres-nbond-koniecl) +cd print *,'nres=',nres,' nbond=',nbond,' koniecl=',koniecl, +cd & ' nstart=',nstart + endif + psi = gen_psi() + if (psi.eq.0.0) then + error=.true. + return + endif + if (print_mc.gt.1) write (iout,'(a,i4,a,i4,a,f8.3)') + & 'PERTURB: nbond=',nbond,' nstart=',nstart,' psi=',psi*rad2deg +cd print *,'nstart=',nstart + call bond_move(nbond,nstart,psi,.false.,error) + if (error) then + write (iout,'(2a)') + & 'Could not define reference system in bond_move, ', + & 'choosing ahother segment.' + itrial=itrial+1 + goto 100 + endif + nbond_move(nbond)=nbond_move(nbond)+1 + moves(1)=moves(1)+1 + nmove=nmove+1 + return +C------------------------------------------------------------------------------ +C Backbone endmove. Perturb a SINGLE angle of a residue close to the end of +C the chain. + 200 continue + lprint=.true. +c end_select=iran_num(1,2*koniecl) +c if (end_select.gt.koniecl) then +c end_select=nphi-(end_select-koniecl) +c else +c end_select=koniecl+3 +c endif +c if (nwindow.gt.0) then +c iwin=iran_num(1,nwindow) +c i1=max0(4,winstart(iwin)) +c i2=min0(winend(imin)+2,nres) +c end_select=iran_num(i1,i2) +c else +c iselect = iran_num(1,nmov_var) +c jj = 0 +c do i=1,nphi +c if (isearch_tab(i).eq.1) jj = jj+1 +c if (jj.eq.iselect) then +c end_select=i+3 +c exit +c endif +c enddo +c endif + end_select = iran_num(4,nres) + psi=max_phi*gen_psi() + if (psi.eq.0.0D0) then + error=.true. + return + endif + phi(end_select)=pinorm(phi(end_select)+psi) + if (print_mc.gt.1) write (iout,'(a,i4,a,f8.3,a,f8.3)') + & 'End angle',end_select,' moved by ',psi*rad2deg,' new angle:', + & phi(end_select)*rad2deg +c if (end_select.gt.3) +c & theta(end_select-1)=gen_theta(itype(end_select-2), +c & phi(end_select-1),phi(end_select)) +c if (end_select.lt.nres) +c & theta(end_select)=gen_theta(itype(end_select-1), +c & phi(end_select),phi(end_select+1)) +cd print *,'nres=',nres,' end_select=',end_select +cd print *,'theta',end_select-1,theta(end_select-1) +cd print *,'theta',end_select,theta(end_select) + moves(2)=moves(2)+1 + nmove=nmove+1 + lprint=.false. + return +C------------------------------------------------------------------------------ +C Side chain move. +C Select the number of SCs to perturb. + 300 isctry=0 + 301 nside_move=iran_num(1,MaxSideMove) +c print *,'nside_move=',nside_move,' MaxSideMove',MaxSideMove +C Select the indices. + do i=1,nside_move + icount=0 + 111 inds=iran_num(nnt,nct) + icount=icount+1 + if (icount.gt.1000) then + write (iout,'(a)')'Error - cannot select side chains to move.' + error=.true. + return + endif + if (itype(inds).eq.10) goto 111 + do j=1,i-1 + if (inds.eq.ind_side(j)) goto 111 + enddo + do j=1,i-1 + if (inds.lt.ind_side(j)) then + indx=j + goto 112 + endif + enddo + indx=i + 112 do j=i,indx+1,-1 + ind_side(j)=ind_side(j-1) + enddo + 113 ind_side(indx)=inds + enddo +C Carry out perturbation. + do i=1,nside_move + ii=ind_side(i) + iti=itype(ii) + call gen_side(iti,theta(ii+1),alph(ii),omeg(ii),fail) + if (fail) then + isctry=isctry+1 + if (isctry.gt.1000) then + write (iout,'(a)') 'Too many errors in SC generation.' + error=.true. + return + endif + goto 301 + endif + if (print_mc.gt.1) write (iout,'(2a,i4,a,2f8.3)') + & 'Side chain ',restyp(iti),ii,' moved to ', + & alph(ii)*rad2deg,omeg(ii)*rad2deg + enddo + moves(3)=moves(3)+1 + nmove=nmove+1 + return +C------------------------------------------------------------------------------ +C THETA move + 400 end_select=iran_num(3,nres) + theta_new=gen_theta(itype(end_select),phi(end_select), + & phi(end_select+1)) + if (print_mc.gt.1) write (iout,'(a,i3,a,f8.3,a,f8.3)') + & 'Theta ',end_select,' moved from',theta(end_select)*rad2deg, + & ' to ',theta_new*rad2deg + theta(end_select)=theta_new + moves(4)=moves(4)+1 + nmove=nmove+1 + return +C------------------------------------------------------------------------------ +C Error returned from SelectMove. + 500 error=.true. + return + end +C------------------------------------------------------------------------------ + subroutine SelectMove(MoveType) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + what_move=ran_number(0.0D0,sumpro_type(MaxMoveType)) + do i=1,MaxMoveType + if (what_move.ge.sumpro_type(i-1).and. + & what_move.lt.sumpro_type(i)) then + MoveType=i + return + endif + enddo + write (iout,'(a)') + & 'Fatal error in SelectMoveType: cannot select move.' + MoveType=MaxMoveType+1 + return + end +c---------------------------------------------------------------------------- + double precision function gen_psi() + implicit none + integer i + double precision x,ran_number + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + x=0.0D0 + do i=1,100 + x=ran_number(-pi,pi) + if (dabs(x).gt.angmin) then + gen_psi=x + return + endif + enddo + write (iout,'(a)')'From Gen_Psi: Cannot generate angle increment.' + gen_psi=0.0D0 + return + end +c---------------------------------------------------------------------------- + subroutine metropolis(n,xcur,xold,ecur,eold,accepted,similar, + & enelower) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.GEO' +crc include 'COMMON.DEFORM' + double precision ecur,eold,xx,ran_number,bol + double precision xcur(n),xold(n) + double precision ecut1 ,ecut2 ,tola + logical accepted,similar,not_done,enelower + logical lprn + data ecut1 /-1.0D-5/,ecut2 /5.0D-3/,tola/5.0D0/ +! ecut1=-5*enedif +! ecut2=50*enedif +! tola=5.0d0 +C Set lprn=.true. for debugging. + lprn=.false. + if (lprn) + &write(iout,*)'enedif',enedif,' ecut1',ecut1,' ecut2',ecut2 + similar=.false. + enelower=.false. + accepted=.false. +C Check if the conformation is similar. + difene=ecur-eold + reldife=difene/dmax1(dabs(eold),dabs(ecur),1.0D0) + if (lprn) then + write (iout,*) 'Metropolis' + write(iout,*)'ecur,eold,difene,reldife',ecur,eold,difene,reldife + endif +C If energy went down remarkably, we accept the new conformation +C unconditionally. +cjp if (reldife.lt.ecut1) then + if (difene.lt.ecut1) then + accepted=.true. + EneLower=.true. + if (lprn) write (iout,'(a)') + & 'Conformation accepted, because energy has lowered remarkably.' +! elseif (reldife.lt.ecut2 .and. dif_ang(nphi,xcur,xold).lt.tola) +cjp elseif (reldife.lt.ecut2) + elseif (difene.lt.ecut2) + & then +C Reject the conf. if energy has changed insignificantly and there is not +C much change in conformation. + if (lprn) + & write (iout,'(2a)') 'Conformation rejected, because it is', + & ' similar to the preceding one.' + accepted=.false. + similar=.true. + else +C Else carry out Metropolis test. + EneLower=.false. + xx=ran_number(0.0D0,1.0D0) + xxh=betbol*difene + if (lprn) + & write (iout,*) 'betbol=',betbol,' difene=',difene,' xxh=',xxh + if (xxh.gt.50.0D0) then + bol=0.0D0 + else + bol=exp(-xxh) + endif + if (lprn) write (iout,*) 'bol=',bol,' xx=',xx + if (bol.gt.xx) then + accepted=.true. + if (lprn) write (iout,'(a)') + & 'Conformation accepted, because it passed Metropolis test.' + else + accepted=.false. + if (lprn) write (iout,'(a)') + & 'Conformation rejected, because it did not pass Metropolis test.' + endif + endif +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif + return + end +c------------------------------------------------------------------------------ + integer function conf_comp(x,ene) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + double precision etol , angtol + double precision x(maxvar) + double precision dif_ang,difa + data etol /0.1D0/, angtol /20.0D0/ + do ii=nsave,1,-1 +c write (iout,*) 'ii=',ii,'ene=',ene,esave(ii),dabs(ene-esave(ii)) + if (dabs(ene-esave(ii)).lt.etol) then + difa=dif_ang(nphi,x,varsave(1,ii)) +c do i=1,nphi +c write(iout,'(i3,3f8.3)')i,rad2deg*x(i), +c & rad2deg*varsave(i,ii) +c enddo +c write(iout,*) 'ii=',ii,' difa=',difa,' angtol=',angtol + if (difa.le.angtol) then + if (print_mc.gt.0) then + write (iout,'(a,i5,2(a,1pe15.4))') + & 'Current conformation matches #',ii, + & ' in the store array ene=',ene,' esave=',esave(ii) +c write (*,'(a,i5,a)') 'Current conformation matches #',ii, +c & ' in the store array.' + endif ! print_mc.gt.0 + if (print_mc.gt.1) then + do i=1,nphi + write(iout,'(i3,3f8.3)')i,rad2deg*x(i), + & rad2deg*varsave(i,ii) + enddo + endif ! print_mc.gt.1 + nrepm=nrepm+1 + conf_comp=ii + return + endif + endif + enddo + conf_comp=0 + return + end +C---------------------------------------------------------------------------- + double precision function dif_ang(n,x,y) + implicit none + integer i,n + double precision x(n),y(n) + double precision w,wa,dif,difa + double precision pinorm + include 'COMMON.GEO' + wa=0.0D0 + difa=0.0D0 + do i=1,n + dif=dabs(pinorm(y(i)-x(i))) + if (dabs(dif-dwapi).lt.dif) dif=dabs(dif-dwapi) + w=1.0D0-(2.0D0*(i-1)/(n-1)-1.0D0)**2+1.0D0/n + wa=wa+w + difa=difa+dif*dif*w + enddo + dif_ang=rad2deg*dsqrt(difa/wa) + return + end +c-------------------------------------------------------------------------- + subroutine add2cache(n1,n2,ncache,nvar,SourceID,CachSrc, + & ecur,xcur,ecache,xcache) + implicit none + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + integer n1,n2,ncache,nvar,SourceID,CachSrc(n2) + integer i,ii,j + double precision ecur,xcur(nvar),ecache(n2),xcache(n1,n2) +cd write (iout,*) 'Enter ADD2CACHE ncache=',ncache ,' ecur',ecur +cd write (iout,'(10f8.3)') (rad2deg*xcur(i),i=1,nvar) +cd write (iout,*) 'Old CACHE array:' +cd do i=1,ncache +cd write (iout,*) 'i=',i,' ecache=',ecache(i),' CachSrc',CachSrc(i) +cd write (iout,'(10f8.3)') (rad2deg*xcache(j,i),j=1,nvar) +cd enddo + + i=ncache + do while (i.gt.0 .and. ecur.lt.ecache(i)) + i=i-1 + enddo + i=i+1 +cd write (iout,*) 'i=',i,' ncache=',ncache + if (ncache.eq.n2) then + write (iout,*) 'Cache dimension exceeded',ncache,n2 + write (iout,*) 'Highest-energy conformation will be removed.' + ncache=ncache-1 + endif + do ii=ncache,i,-1 + ecache(ii+1)=ecache(ii) + CachSrc(ii+1)=CachSrc(ii) + do j=1,nvar + xcache(j,ii+1)=xcache(j,ii) + enddo + enddo + ecache(i)=ecur + CachSrc(i)=SourceID + do j=1,nvar + xcache(j,i)=xcur(j) + enddo + ncache=ncache+1 +cd write (iout,*) 'New CACHE array:' +cd do i=1,ncache +cd write (iout,*) 'i=',i,' ecache=',ecache(i),' CachSrc',CachSrc(i) +cd write (iout,'(10f8.3)') (rad2deg*xcache(j,i),j=1,nvar) +cd enddo + return + end +c-------------------------------------------------------------------------- + subroutine rm_from_cache(i,n1,n2,ncache,nvar,CachSrc,ecache, + & xcache) + implicit none + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + integer n1,n2,ncache,nvar,CachSrc(n2) + integer i,ii,j + double precision ecache(n2),xcache(n1,n2) + +cd write (iout,*) 'Enter RM_FROM_CACHE' +cd write (iout,*) 'Old CACHE array:' +cd do ii=1,ncache +cd write (iout,*)'i=',ii,' ecache=',ecache(ii),' CachSrc',CachSrc(ii) +cd write (iout,'(10f8.3)') (rad2deg*xcache(j,ii),j=1,nvar) +cd enddo + + do ii=i+1,ncache + ecache(ii-1)=ecache(ii) + CachSrc(ii-1)=CachSrc(ii) + do j=1,nvar + xcache(j,ii-1)=xcache(j,ii) + enddo + enddo + ncache=ncache-1 +cd write (iout,*) 'New CACHE array:' +cd do i=1,ncache +cd write (iout,*) 'i=',i,' ecache=',ecache(i),' CachSrc',CachSrc(i) +cd write (iout,'(10f8.3)') (rad2deg*xcache(j,i),j=1,nvar) +cd enddo + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/minim_mcmf.F b/source/unres/src_Eshel/SRC-SURPLUS/minim_mcmf.F new file mode 100644 index 0000000..beb3d4c --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/minim_mcmf.F @@ -0,0 +1,121 @@ +#ifdef MPI + subroutine minim_mcmf + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.MINIM' + include 'mpif.h' + external func,gradient,fdum + real ran1,ran2,ran3 + include 'COMMON.SETUP' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + dimension muster(mpi_status_size) + dimension var(maxvar),erg(mxch*(mxch+1)/2+1) + double precision d(maxvar),v(1:lv+1),garbage(maxvar) + dimension indx(6) + dimension iv(liv) + dimension idum(1),rdum(1) + double precision przes(3),obrot(3,3) + logical non_conv + data rad /1.745329252d-2/ + common /przechowalnia/ v + + ichuj=0 + 10 continue + ichuj = ichuj + 1 + call mpi_recv(indx,6,mpi_integer,king,idint,CG_COMM, + * muster,ierr) + if (indx(1).eq.0) return +c print *, 'worker ',me,' received order ',n,ichuj + call mpi_recv(var,nvar,mpi_double_precision, + * king,idreal,CG_COMM,muster,ierr) + call mpi_recv(ene0,1,mpi_double_precision, + * king,idreal,CG_COMM,muster,ierr) +c print *, 'worker ',me,' var read ' + + + call deflt(2,iv,liv,lv,v) +* 12 means fresh start, dont call deflt + iv(1)=12 +* max num of fun calls + if (maxfun.eq.0) maxfun=500 + iv(17)=maxfun +* max num of iterations + if (maxmin.eq.0) maxmin=1000 + iv(18)=maxmin +* controls output + iv(19)=2 +* selects output unit +c iv(21)=iout + iv(21)=0 +* 1 means to print out result + iv(22)=0 +* 1 means to print out summary stats + iv(23)=0 +* 1 means to print initial x and d + iv(24)=0 +* min val for v(radfac) default is 0.1 + v(24)=0.1D0 +* max val for v(radfac) default is 4.0 + v(25)=2.0D0 +* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +* the sumsl default is 0.1 + v(26)=0.1D0 +* false conv if (act fnctn decrease) .lt. v(34) +* the sumsl default is 100*machep + v(34)=v(34)/100.0D0 +* absolute convergence + if (tolf.eq.0.0D0) tolf=1.0D-4 + v(31)=tolf +* relative convergence + if (rtolf.eq.0.0D0) rtolf=1.0D-4 + v(32)=rtolf +* controls initial step size + v(35)=1.0D-1 +* large vals of d correspond to small components of step + do i=1,nphi + d(i)=1.0D-1 + enddo + do i=nphi+1,nvar + d(i)=1.0D-1 + enddo +c minimize energy + + call func(nvar,var,nf,eee,idum,rdum,fdum) + if(eee.gt.1.0d18) then +c print *,'MINIM_JLEE: ',me,' CHUJ NASTAPIL' +c print *,' energy before SUMSL =',eee +c print *,' aborting local minimization' + iv(1)=-1 + v(10)=eee + nf=1 + go to 201 + endif + + call sumsl(nvar,d,var,func,gradient,iv,liv,lv,v,idum,rdum,fdum) +c find which conformation was returned from sumsl + nf=iv(7)+1 + 201 continue +c total # of ftn evaluations (for iwf=0, it includes all minimizations). + indx(4)=nf + indx(5)=iv(1) + eee=v(10) + + call mpi_send(indx,6,mpi_integer,king,idint,CG_COMM, + * ierr) +c print '(a5,i3,15f10.5)', 'ENEX0',indx(1),v(10) + call mpi_send(var,nvar,mpi_double_precision, + * king,idreal,CG_COMM,ierr) + call mpi_send(eee,1,mpi_double_precision,king,idreal, + * CG_COMM,ierr) + call mpi_send(ene0,1,mpi_double_precision,king,idreal, + * CG_COMM,ierr) + go to 10 + + return + end +#endif diff --git a/source/unres/src_Eshel/SRC-SURPLUS/moments.f b/source/unres/src_Eshel/SRC-SURPLUS/moments.f new file mode 100644 index 0000000..5adbf21 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/moments.f @@ -0,0 +1,328 @@ + subroutine inertia_tensor +c Calculating the intertia tensor for the entire protein in order to +c remove the perpendicular components of velocity matrix which cause +c the molecule to rotate. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + + double precision Im(3,3),Imcp(3,3),cm(3),pr(3),M_SC, + & eigvec(3,3),Id(3,3),eigval(3),L(3),vp(3),vrot(3), + & vpp(3,0:MAXRES),vs_p(3),pr1(3,3), + & pr2(3,3),pp(3),incr(3),v(3),mag,mag2 + common /gucio/ cm + integer iti,inres + do i=1,3 + do j=1,3 + Im(i,j)=0.0d0 + pr1(i,j)=0.0d0 + pr2(i,j)=0.0d0 + enddo + L(i)=0.0d0 + cm(i)=0.0d0 + vrot(i)=0.0d0 + enddo +c calculating the center of the mass of the protein + do i=nnt,nct-1 + do j=1,3 + cm(j)=cm(j)+c(j,i)+0.5d0*dc(j,i) + enddo + enddo + do j=1,3 + cm(j)=mp*cm(j) + enddo + M_SC=0.0d0 + do i=nnt,nct + iti=itype(i) + M_SC=M_SC+msc(iti) + inres=i+nres + do j=1,3 + cm(j)=cm(j)+msc(iti)*c(j,inres) + enddo + enddo + do j=1,3 + cm(j)=cm(j)/(M_SC+(nct-nnt)*mp) + enddo + + do i=nnt,nct-1 + do j=1,3 + pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j) + enddo + Im(1,1)=Im(1,1)+mp*(pr(2)*pr(2)+pr(3)*pr(3)) + Im(1,2)=Im(1,2)-mp*pr(1)*pr(2) + Im(1,3)=Im(1,3)-mp*pr(1)*pr(3) + Im(2,3)=Im(2,3)-mp*pr(2)*pr(3) + Im(2,2)=Im(2,2)+mp*(pr(3)*pr(3)+pr(1)*pr(1)) + Im(3,3)=Im(3,3)+mp*(pr(1)*pr(1)+pr(2)*pr(2)) + enddo + + do i=nnt,nct + iti=itype(i) + inres=i+nres + do j=1,3 + pr(j)=c(j,inres)-cm(j) + enddo + Im(1,1)=Im(1,1)+msc(iti)*(pr(2)*pr(2)+pr(3)*pr(3)) + Im(1,2)=Im(1,2)-msc(iti)*pr(1)*pr(2) + Im(1,3)=Im(1,3)-msc(iti)*pr(1)*pr(3) + Im(2,3)=Im(2,3)-msc(iti)*pr(2)*pr(3) + Im(2,2)=Im(2,2)+msc(iti)*(pr(3)*pr(3)+pr(1)*pr(1)) + Im(3,3)=Im(3,3)+msc(iti)*(pr(1)*pr(1)+pr(2)*pr(2)) + enddo + + do i=nnt,nct-1 + Im(1,1)=Im(1,1)+Ip*(1-dc_norm(1,i)*dc_norm(1,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + Im(1,2)=Im(1,2)+Ip*(-dc_norm(1,i)*dc_norm(2,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + Im(1,3)=Im(1,3)+Ip*(-dc_norm(1,i)*dc_norm(3,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + Im(2,3)=Im(2,3)+Ip*(-dc_norm(2,i)*dc_norm(3,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + Im(2,2)=Im(2,2)+Ip*(1-dc_norm(2,i)*dc_norm(2,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + Im(3,3)=Im(3,3)+Ip*(1-dc_norm(3,i)*dc_norm(3,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + enddo + + + do i=nnt,nct + if (itype(i).ne.10) then + iti=itype(i) + inres=i+nres + Im(1,1)=Im(1,1)+Isc(iti)*(1-dc_norm(1,inres)* + & dc_norm(1,inres))*vbld(inres)*vbld(inres) + Im(1,2)=Im(1,2)-Isc(iti)*(dc_norm(1,inres)* + & dc_norm(2,inres))*vbld(inres)*vbld(inres) + Im(1,3)=Im(1,3)-Isc(iti)*(dc_norm(1,inres)* + & dc_norm(3,inres))*vbld(inres)*vbld(inres) + Im(2,3)=Im(2,3)-Isc(iti)*(dc_norm(2,inres)* + & dc_norm(3,inres))*vbld(inres)*vbld(inres) + Im(2,2)=Im(2,2)+Isc(iti)*(1-dc_norm(2,inres)* + & dc_norm(2,inres))*vbld(inres)*vbld(inres) + Im(3,3)=Im(3,3)+Isc(iti)*(1-dc_norm(3,inres)* + & dc_norm(3,inres))*vbld(inres)*vbld(inres) + endif + enddo + + call angmom(cm,L) +c write(iout,*) "The angular momentum before adjustment:" +c write(iout,*) (L(j),j=1,3) + + Im(2,1)=Im(1,2) + Im(3,1)=Im(1,3) + Im(3,2)=Im(2,3) + +c Copying the Im matrix for the djacob subroutine + do i=1,3 + do j=1,3 + Imcp(i,j)=Im(i,j) + Id(i,j)=0.0d0 + enddo + enddo + +c Finding the eigenvectors and eignvalues of the inertia tensor + call djacob(3,3,10000,1.0d-10,Imcp,eigvec,eigval) +c write (iout,*) "Eigenvalues & Eigenvectors" +c write (iout,'(5x,3f10.5)') (eigval(i),i=1,3) +c write (iout,*) +c do i=1,3 +c write (iout,'(i5,3f10.5)') i,(eigvec(i,j),j=1,3) +c enddo +c Constructing the diagonalized matrix + do i=1,3 + if (dabs(eigval(i)).gt.1.0d-15) then + Id(i,i)=1.0d0/eigval(i) + else + Id(i,i)=0.0d0 + endif + enddo + do i=1,3 + do j=1,3 + Imcp(i,j)=eigvec(j,i) + enddo + enddo + do i=1,3 + do j=1,3 + do k=1,3 + pr1(i,j)=pr1(i,j)+Id(i,k)*Imcp(k,j) + enddo + enddo + enddo + do i=1,3 + do j=1,3 + do k=1,3 + pr2(i,j)=pr2(i,j)+eigvec(i,k)*pr1(k,j) + enddo + enddo + enddo +c Calculating the total rotational velocity of the molecule + do i=1,3 + do j=1,3 + vrot(i)=vrot(i)+pr2(i,j)*L(j) + enddo + enddo +c Resetting the velocities + do i=nnt,nct-1 + call vecpr(vrot(1),dc(1,i),vp) + do j=1,3 + d_t(j,i)=d_t(j,i)-vp(j) + enddo + enddo + do i=nnt,nct + if(itype(i).ne.10) then + inres=i+nres + call vecpr(vrot(1),dc(1,inres),vp) + do j=1,3 + d_t(j,inres)=d_t(j,inres)-vp(j) + enddo + endif + enddo + call angmom(cm,L) +c write(iout,*) "The angular momentum after adjustment:" +c write(iout,*) (L(j),j=1,3) + return + end +c---------------------------------------------------------------------------- + subroutine angmom(cm,L) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + + double precision L(3),cm(3),pr(3),vp(3),vrot(3),incr(3),v(3), + & pp(3) + integer iti,inres +c Calculate the angular momentum + do j=1,3 + L(j)=0.0d0 + enddo + do j=1,3 + incr(j)=d_t(j,0) + enddo + do i=nnt,nct-1 + do j=1,3 + pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j) + enddo + do j=1,3 + v(j)=incr(j)+0.5d0*d_t(j,i) + enddo + do j=1,3 + incr(j)=incr(j)+d_t(j,i) + enddo + call vecpr(pr(1),v(1),vp) + do j=1,3 + L(j)=L(j)+mp*vp(j) + enddo + do j=1,3 + pr(j)=0.5d0*dc(j,i) + pp(j)=0.5d0*d_t(j,i) + enddo + call vecpr(pr(1),pp(1),vp) + do j=1,3 + L(j)=L(j)+Ip*vp(j) + enddo + enddo + do j=1,3 + incr(j)=d_t(j,0) + enddo + do i=nnt,nct + iti=itype(i) + inres=i+nres + do j=1,3 + pr(j)=c(j,inres)-cm(j) + enddo + if (itype(i).ne.10) then + do j=1,3 + v(j)=incr(j)+d_t(j,inres) + enddo + else + do j=1,3 + v(j)=incr(j) + enddo + endif + call vecpr(pr(1),v(1),vp) +c write (iout,*) "i",i," iti",iti," pr",(pr(j),j=1,3), +c & " v",(v(j),j=1,3)," vp",(vp(j),j=1,3) + do j=1,3 + L(j)=L(j)+msc(iti)*vp(j) + enddo +c write (iout,*) "L",(l(j),j=1,3) + if (itype(i).ne.10) then + do j=1,3 + v(j)=incr(j)+d_t(j,inres) + enddo + call vecpr(dc(1,inres),d_t(1,inres),vp) + do j=1,3 + L(j)=L(j)+Isc(iti)*vp(j) + enddo + endif + do j=1,3 + incr(j)=incr(j)+d_t(j,i) + enddo + enddo + return + end +c------------------------------------------------------------------------------ + subroutine vcm_vel(vcm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + double precision vcm(3),vv(3),summas,amas + do j=1,3 + vcm(j)=0.0d0 + vv(j)=d_t(j,0) + enddo + summas=0.0d0 + do i=nnt,nct + if (i.lt.nct) then + summas=summas+mp + do j=1,3 + vcm(j)=vcm(j)+mp*(vv(j)+0.5d0*d_t(j,i)) + enddo + endif + amas=msc(itype(i)) + summas=summas+amas + if (itype(i).ne.10) then + do j=1,3 + vcm(j)=vcm(j)+amas*(vv(j)+d_t(j,i+nres)) + enddo + else + do j=1,3 + vcm(j)=vcm(j)+amas*vv(j) + enddo + endif + do j=1,3 + vv(j)=vv(j)+d_t(j,i) + enddo + enddo +c write (iout,*) "vcm",(vcm(j),j=1,3)," summas",summas + do j=1,3 + vcm(j)=vcm(j)/summas + enddo + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/muca_md.f b/source/unres/src_Eshel/SRC-SURPLUS/muca_md.f new file mode 100644 index 0000000..c10a6a7 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/muca_md.f @@ -0,0 +1,334 @@ + subroutine muca_delta(remd_t_bath,remd_ene,i,iex,delta) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + include 'COMMON.MD' + double precision remd_t_bath(maxprocs) + double precision remd_ene(maxprocs) + double precision muca_ene + double precision betai,betaiex,delta + + betai=1.0/(Rb*remd_t_bath(i)) + betaiex=1.0/(Rb*remd_t_bath(iex)) + + delta=betai*(muca_ene(remd_ene(iex),i,remd_t_bath)- + & muca_ene(remd_ene(i),i,remd_t_bath)) + & -betaiex*(muca_ene(remd_ene(iex),iex,remd_t_bath)- + & muca_ene(remd_ene(i),iex,remd_t_bath)) + + return + end + + double precision function muca_ene(energy,i,remd_t_bath) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + include 'COMMON.MD' + double precision y,yp,energy + double precision remd_t_bath(maxprocs) + integer i + + if (energy.lt.elowi(i)) then + call splint(emuca,nemuca,nemuca2,nmuca,elowi(i),y,yp) + muca_ene=remd_t_bath(i)*Rb*(yp*(energy-elowi(i))+y) + elseif (energy.gt.ehighi(i)) then + call splint(emuca,nemuca,nemuca2,nmuca,ehighi(i),y,yp) + muca_ene=remd_t_bath(i)*Rb*(yp*(energy-ehighi(i))+y) + else + call splint(emuca,nemuca,nemuca2,nmuca,energy,y,yp) + muca_ene=remd_t_bath(i)*Rb*y + endif + return + end + + subroutine read_muca + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + include 'COMMON.CONTROL' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision yp1,ypn,yp,x,muca_factor,y,muca_ene + imtime=0 + do i=1,4*maxres + hist(i)=0 + enddo + if (modecalc.eq.14.and..not.remd_tlist) then + print *,"MUCAREMD works only with TLIST" + stop + endif + open(89,file='muca.input') + read(89,*) + read(89,*) + if (modecalc.eq.14) then + read(89,*) (elowi(i),ehighi(i),i=1,nrep) + if (remd_mlist) then + k=0 + do i=1,nrep + do j=1,remd_m(i) + i2rep(k)=i + k=k+1 + enddo + enddo + elow=elowi(i2rep(me)) + ehigh=ehighi(i2rep(me)) + elowi(me+1)=elow + ehighi(me+1)=ehigh + else + elow=elowi(me+1) + ehigh=ehighi(me+1) + endif + else + read(89,*) elow,ehigh + elowi(1)=elow + ehighi(1)=ehigh + endif + i=0 + do while(.true.) + i=i+1 + read(89,*,end=100) emuca(i),nemuca(i) +cd nemuca(i)=nemuca(i)*remd_t(me+1)*Rb + enddo + 100 continue + nmuca=i-1 + hbin=emuca(nmuca)-emuca(nmuca-1) + write (iout,*) 'hbin',hbin + write (iout,*) me,'elow,ehigh',elow,ehigh + yp1=0 + ypn=0 + call spline(emuca,nemuca,nmuca,yp1,ypn,nemuca2) + factor_min=0.0d0 + factor_min=muca_factor(ehigh) + call print_muca + return + end + + + subroutine print_muca + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + include 'COMMON.CONTROL' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision yp1,ypn,yp,x,muca_factor,y,muca_ene + double precision dummy(maxprocs) + + if (remd_mlist) then + k=0 + do i=1,nrep + do j=1,remd_m(i) + i2rep(k)=i + k=k+1 + enddo + enddo + endif + + do i=1,nmuca +c print *,'nemuca ',emuca(i),nemuca(i) + do j=0,4 + x=emuca(i)+hbin/5*j + if (modecalc.eq.14) then + if (remd_mlist) then + yp=muca_factor(x)*remd_t(i2rep(me))*Rb + dummy(me+1)=remd_t(i2rep(me)) + y=muca_ene(x,me+1,dummy) + else + yp=muca_factor(x)*remd_t(me+1)*Rb + y=muca_ene(x,me+1,remd_t) + endif + write (iout,'(i4,i12,a12,2f15.5,a10,f15.5)') me,imtime, + & 'muca factor ',x,yp,' muca ene',y + else + yp=muca_factor(x)*t_bath*Rb + dummy(1)=t_bath + y=muca_ene(x,1,dummy) + write (iout,'(i4,i12,a12,2f15.5,a10,f15.5)') me,imtime, + & 'muca factor ',x,yp,' muca ene',y + endif + enddo + enddo + if(mucadyn.gt.0) then + do i=1,nmuca + write(iout,'(a13,i8,2f12.5)') 'nemuca after ', + & imtime,emuca(i),nemuca(i) + enddo + endif + return + end + + subroutine muca_update(energy) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + include 'COMMON.CONTROL' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energy + double precision yp1,ypn + integer k + logical lnotend + + k=int((energy-emuca(1))/hbin)+1 + + IF(muca_smooth.eq.1.or.muca_smooth.eq.3) THEN + if(energy.ge.ehigh) + & write (iout,*) 'MUCA reject',energy,emuca(k) + if(energy.ge.ehigh.and.(energy-ehigh).lt.hbin) then + write (iout,*) 'MUCA ehigh',energy,emuca(k) + do i=k,nmuca + hist(i)=hist(i)+1 + enddo + endif + if(k.gt.0.and.energy.lt.ehigh) hist(k)=hist(k)+1 + ELSE + if(k.gt.0.and.k.lt.4*maxres) hist(k)=hist(k)+1 + ENDIF + if(mod(imtime,mucadyn).eq.0) then + + do i=1,nmuca + IF(muca_smooth.eq.2.or.muca_smooth.eq.3) THEN + nemuca(i)=nemuca(i)+dlog(hist(i)+1) + ELSE + if (hist(i).gt.0) hist(i)=dlog(hist(i)) + nemuca(i)=nemuca(i)+hist(i) + ENDIF + hist(i)=0 + write(iout,'(a24,i8,2f12.5)')'nemuca before smoothing ', + & imtime,emuca(i),nemuca(i) + enddo + + + lnotend=.true. + ismooth=0 + ist=2 + ien=nmuca-1 + IF(muca_smooth.eq.1.or.muca_smooth.eq.3) THEN +c lnotend=.false. +c do i=1,nmuca-1 +c do j=i+1,nmuca +c if(nemuca(j).lt.nemuca(i)) lnotend=.true. +c enddo +c enddo + do while(lnotend) + ismooth=ismooth+1 + write (iout,*) 'MUCA update smoothing',ist,ien + do i=ist,ien + nemuca(i)=(nemuca(i-1)+nemuca(i)+nemuca(i+1))/3 + enddo + lnotend=.false. + ist=0 + ien=0 + do i=1,nmuca-1 + do j=i+1,nmuca + if(nemuca(j).lt.nemuca(i)) then + lnotend=.true. + if(ist.eq.0) ist=i-1 + if(ien.lt.j+1) ien=j+1 + endif + enddo + enddo + enddo + ENDIF + + write (iout,*) 'MUCA update ',imtime,' smooth= ',ismooth + yp1=0 + ypn=0 + call spline(emuca,nemuca,nmuca,yp1,ypn,nemuca2) + call print_muca + + endif + return + end + + double precision function muca_factor(energy) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + double precision y,yp,energy + + if (energy.lt.elow) then + call splint(emuca,nemuca,nemuca2,nmuca,elow,y,yp) + elseif (energy.gt.ehigh) then + call splint(emuca,nemuca,nemuca2,nmuca,ehigh,y,yp) + else + call splint(emuca,nemuca,nemuca2,nmuca,energy,y,yp) + endif + + if(yp.ge.factor_min) then + muca_factor=yp + else + muca_factor=factor_min + endif +cd print *,'energy, muca_factor',energy,muca_factor + return + end + + + SUBROUTINE spline(x,y,n,yp1,ypn,y2) + INTEGER n,NMAX + REAL*8 yp1,ypn,x(n),y(n),y2(n) + PARAMETER (NMAX=500) + INTEGER i,k + REAL*8 p,qn,sig,un,u(NMAX) + if (yp1.gt..99e30) then + y2(1)=0. + u(1)=0. + else + y2(1)=-0.5 + u(1)=(3./(x(2)-x(1)))*((y(2)-y(1))/(x(2)-x(1))-yp1) + endif + do i=2,n-1 + sig=(x(i)-x(i-1))/(x(i+1)-x(i-1)) + p=sig*y2(i-1)+2. + y2(i)=(sig-1.)/p + u(i)=(6.*((y(i+1)-y(i))/(x(i+1)-x(i))-(y(i)-y(i-1)) + * /(x(i)-x(i-1)))/(x(i+1)-x(i-1))-sig*u(i-1))/p + enddo + if (ypn.gt..99e30) then + qn=0. + un=0. + else + qn=0.5 + un=(3./(x(n)-x(n-1)))*(ypn-(y(n)-y(n-1))/(x(n)-x(n-1))) + endif + y2(n)=(un-qn*u(n-1))/(qn*y2(n-1)+1.) + do k=n-1,1,-1 + y2(k)=y2(k)*y2(k+1)+u(k) + enddo + return + END + + + SUBROUTINE splint(xa,ya,y2a,n,x,y,yp) + INTEGER n + REAL*8 x,y,xa(n),y2a(n),ya(n),yp + INTEGER k,khi,klo + REAL*8 a,b,h + klo=1 + khi=n + 1 if (khi-klo.gt.1) then + k=(khi+klo)/2 + if (xa(k).gt.x) then + khi=k + else + klo=k + endif + goto 1 + endif + h=xa(khi)-xa(klo) + if (h.eq.0.) pause 'bad xa input in splint' + a=(xa(khi)-x)/h + b=(x-xa(klo))/h + y=a*ya(klo)+b*ya(khi)+ + * ((a**3-a)*y2a(klo)+(b**3-b)*y2a(khi))*(h**2)/6. + yp=-ya(klo)/h+ya(khi)/h-3*(a**2)*y2a(klo)*h/6. + + +(3*(b**2)-1)*y2a(khi)*h/6. + return + END diff --git a/source/unres/src_Eshel/SRC-SURPLUS/prng_32.F b/source/unres/src_Eshel/SRC-SURPLUS/prng_32.F new file mode 100644 index 0000000..9448f31 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/prng_32.F @@ -0,0 +1,1077 @@ +#if defined(AIX) || defined(AMD64) + real*8 function prng_next(mel) + implicit none + integer me,mel +c +c Calling sequence: +c = prng_next ( ) +c = vprng ( , , ) +c +c This code is based on a sequential algorithm provided by Mal Kalos. +c This version uses a single 64-bit word to store the initial seeds +c and additive constants. +c A 64-bit floating point number is returned. +c +c The array "iparam" is full-word aligned, being padded by zeros to +c let each generator be on a subpage boundary. +c That is, rows 1 and 2 in a given column of the array are for real, +c rows 3-16 are bogus. +c +c July 12, 1993: double the number of sequences. We should have been +c using two packets per seed, rather than four +c October 31, 1993: merge the two arrays of seeds and constants, +c and switch to 64-bit arithmetic. +c June 1994: port to RS6K. Internal state is kept as 2 64-bit integers +c The ishft function is defined only on 32-bit integers, so we will +c shift numbers by dividing by 2**11 and then adding on 2**53-1. +c +c November 1994: ishift now works on 64-bit numbers (though it gives a +c warning). Thus we go back to using it. John Zollweg also added the +c vprng() routine to return vectors of real*8 random numbers. +c + real*8 recip53 + parameter ( recip53 = 2.0D0**(-53) ) + integer*8 two + parameter ( two = 2**11) + integer*8 m,ishift +c parameter ( m = 34522712143931 ) ! 11**13 +c parameter ( ishift = 9007199254740991 ) ! 2**53-1 + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + integer*8 next + +crc g77 doesn't support integer*8 constants + m = dint(34522712143931.0d0) + ishift = dint(9007199254740991.0d0) + if(mel.gt.nmax) then + me=mod(mel,nmax) + else + me=mel + endif +c RS6K porting note: ishift now takes 64-bit integers , with a warning + if ( 0.le.me .and. me.le.nmax ) then + next = iparam(1,me)*m + iparam(2,me) + iparam(1,me) = next + prng_next = recip53 * ishft( next, -11 ) + else + prng_next=-1.0D0 + endif + + end +c +c vprng(me, rn, num) Get a vector of random numbers +c + subroutine vprng(me,rn,num) + real*8 recip53, rn(1) + parameter ( recip53 = 2.0D0**(-53) ) + integer*8 m,iparam +c parameter ( m = 34522712143931 ) ! 11**13 + integer nmax, num, me + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + integer*8 next + +crc g77 doesn't support integer*8 constants + m = dint(34522712143931.0d0) + + if ( 0.le.me .and. me.le.nmax ) then + do 1 i=1,num + next = iparam(1,me)*m + iparam(2,me) + iparam(1,me) = next + rn(i) = recip53 * ishft( next, -11 ) + 1 continue + else + rn(1)=-1.0D0 + endif + return + end + +c +c prng_chkpnt Get the current state of a generator +c +c Calling sequence: +c logical prng_chkpnt, status +c status = prng_chkpnt (me, iseed) where +c +c me is the particular generator whose state is being gotten +c seed is an 4-element integer array where the "l"-values will be saved +c + logical function prng_chkpnt (me, iseed) + implicit none + integer me + integer*8 iseed + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + if (me .lt. 0 .or. me .gt. nmax) then + prng_chkpnt=.false. + else + prng_chkpnt=.true. + iseed=iparam(1,me) + endif + end +c +c prng_restart Restart generator from a saved state +c +c Calling sequence: +c logical prng_restart, status +c status = prng_restart (me, iseed) where +c +c me is the particular generator being restarted +c iseed is a 8-byte integer containing the "l"-values +c + logical function prng_restart (mel, iseed) + implicit none + integer me,mel + integer*8 iseed + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + if(mel.gt.nmax) then + me=mod(mel,nmax) + else + me=mel + endif + if (me .lt. 0 .or. me .gt. nmax) then + prng_restart=.false. + return + else + prng_restart=.true. + iparam(1,me)=iseed + endif + end + + block data prngblk + parameter(nmax=1021) + integer*8 iparam + common/ksrprng/iparam(2,0:nmax) + data (iparam(1,i),iparam(2,i),i= 0, 29) / + + 11848219, 11848219, 11848237, 11848237, 11848241, 11848241, + + 11848247, 11848247, 11848253, 11848253, 11848271, 11848271, + + 11848297, 11848297, 11848313, 11848313, 11848339, 11848339, + + 11848351, 11848351, 11848357, 11848357, 11848363, 11848363, + + 11848367, 11848367, 11848373, 11848373, 11848379, 11848379, + + 11848393, 11848393, 11848433, 11848433, 11848451, 11848451, + + 11848469, 11848469, 11848477, 11848477, 11848489, 11848489, + + 11848493, 11848493, 11848513, 11848513, 11848523, 11848523, + + 11848531, 11848531, 11848537, 11848537, 11848553, 11848553, + + 11848589, 11848589, 11848591, 11848591, 11848601, 11848601 / + data (iparam(1,i),iparam(2,i),i= 30, 59) / + + 11848619, 11848619, 11848637, 11848637, 11848663, 11848663, + + 11848673, 11848673, 11848679, 11848679, 11848691, 11848691, + + 11848699, 11848699, 11848709, 11848709, 11848717, 11848717, + + 11848721, 11848721, 11848729, 11848729, 11848741, 11848741, + + 11848751, 11848751, 11848757, 11848757, 11848787, 11848787, + + 11848801, 11848801, 11848829, 11848829, 11848853, 11848853, + + 11848861, 11848861, 11848867, 11848867, 11848873, 11848873, + + 11848891, 11848891, 11848909, 11848909, 11848919, 11848919, + + 11848931, 11848931, 11848937, 11848937, 11848961, 11848961, + + 11848981, 11848981, 11849021, 11849021, 11849039, 11849039 / + data (iparam(1,i),iparam(2,i),i= 60, 89) / + + 11849053, 11849053, 11849059, 11849059, 11849069, 11849069, + + 11849077, 11849077, 11849087, 11849087, 11849093, 11849093, + + 11849107, 11849107, 11849111, 11849111, 11849129, 11849129, + + 11849137, 11849137, 11849177, 11849177, 11849183, 11849183, + + 11849203, 11849203, 11849231, 11849231, 11849237, 11849237, + + 11849239, 11849239, 11849249, 11849249, 11849251, 11849251, + + 11849269, 11849269, 11849273, 11849273, 11849291, 11849291, + + 11849297, 11849297, 11849309, 11849309, 11849339, 11849339, + + 11849359, 11849359, 11849363, 11849363, 11849399, 11849399, + + 11849401, 11849401, 11849413, 11849413, 11849417, 11849417 / + data (iparam(1,i),iparam(2,i),i= 90, 119) / + + 11849437, 11849437, 11849443, 11849443, 11849473, 11849473, + + 11849491, 11849491, 11849503, 11849503, 11849507, 11849507, + + 11849557, 11849557, 11849567, 11849567, 11849569, 11849569, + + 11849573, 11849573, 11849587, 11849587, 11849599, 11849599, + + 11849633, 11849633, 11849641, 11849641, 11849653, 11849653, + + 11849659, 11849659, 11849671, 11849671, 11849683, 11849683, + + 11849689, 11849689, 11849693, 11849693, 11849699, 11849699, + + 11849701, 11849701, 11849707, 11849707, 11849713, 11849713, + + 11849723, 11849723, 11849741, 11849741, 11849743, 11849743, + + 11849759, 11849759, 11849767, 11849767, 11849771, 11849771 / + data (iparam(1,i),iparam(2,i),i= 120, 149) / + + 11849791, 11849791, 11849801, 11849801, 11849809, 11849809, + + 11849813, 11849813, 11849869, 11849869, 11849881, 11849881, + + 11849891, 11849891, 11849909, 11849909, 11849923, 11849923, + + 11849933, 11849933, 11849947, 11849947, 11849987, 11849987, + + 11850001, 11850001, 11850011, 11850011, 11850019, 11850019, + + 11850023, 11850023, 11850031, 11850031, 11850049, 11850049, + + 11850061, 11850061, 11850073, 11850073, 11850077, 11850077, + + 11850103, 11850103, 11850109, 11850109, 11850121, 11850121, + + 11850127, 11850127, 11850133, 11850133, 11850149, 11850149, + + 11850161, 11850161, 11850169, 11850169, 11850191, 11850191 / + data (iparam(1,i),iparam(2,i),i= 150, 179) / + + 11850233, 11850233, 11850247, 11850247, 11850259, 11850259, + + 11850269, 11850269, 11850283, 11850283, 11850301, 11850301, + + 11850341, 11850341, 11850347, 11850347, 11850367, 11850367, + + 11850373, 11850373, 11850379, 11850379, 11850389, 11850389, + + 11850407, 11850407, 11850427, 11850427, 11850437, 11850437, + + 11850469, 11850469, 11850481, 11850481, 11850511, 11850511, + + 11850529, 11850529, 11850541, 11850541, 11850557, 11850557, + + 11850607, 11850607, 11850611, 11850611, 11850667, 11850667, + + 11850677, 11850677, 11850679, 11850679, 11850701, 11850701, + + 11850731, 11850731, 11850739, 11850739, 11850749, 11850749 / + data (iparam(1,i),iparam(2,i),i= 180, 209) / + + 11850791, 11850791, 11850803, 11850803, 11850829, 11850829, + + 11850833, 11850833, 11850859, 11850859, 11850877, 11850877, + + 11850899, 11850899, 11850907, 11850907, 11850913, 11850913, + + 11850919, 11850919, 11850931, 11850931, 11850941, 11850941, + + 11850947, 11850947, 11850953, 11850953, 11850961, 11850961, + + 11850983, 11850983, 11850991, 11850991, 11850997, 11850997, + + 11851031, 11851031, 11851033, 11851033, 11851051, 11851051, + + 11851061, 11851061, 11851067, 11851067, 11851093, 11851093, + + 11851109, 11851109, 11851123, 11851123, 11851127, 11851127, + + 11851139, 11851139, 11851157, 11851157, 11851163, 11851163 / + data (iparam(1,i),iparam(2,i),i= 210, 239) / + + 11851181, 11851181, 11851201, 11851201, 11851219, 11851219, + + 11851291, 11851291, 11851303, 11851303, 11851309, 11851309, + + 11851313, 11851313, 11851319, 11851319, 11851349, 11851349, + + 11851351, 11851351, 11851361, 11851361, 11851373, 11851373, + + 11851403, 11851403, 11851409, 11851409, 11851423, 11851423, + + 11851447, 11851447, 11851451, 11851451, 11851481, 11851481, + + 11851493, 11851493, 11851519, 11851519, 11851523, 11851523, + + 11851529, 11851529, 11851547, 11851547, 11851549, 11851549, + + 11851559, 11851559, 11851577, 11851577, 11851589, 11851589, + + 11851591, 11851591, 11851597, 11851597, 11851603, 11851603 / + data (iparam(1,i),iparam(2,i),i= 240, 269) / + + 11851607, 11851607, 11851613, 11851613, 11851621, 11851621, + + 11851627, 11851627, 11851639, 11851639, 11851673, 11851673, + + 11851681, 11851681, 11851727, 11851727, 11851753, 11851753, + + 11851759, 11851759, 11851787, 11851787, 11851793, 11851793, + + 11851799, 11851799, 11851813, 11851813, 11851841, 11851841, + + 11851859, 11851859, 11851867, 11851867, 11851891, 11851891, + + 11851909, 11851909, 11851919, 11851919, 11851927, 11851927, + + 11851933, 11851933, 11851949, 11851949, 11851967, 11851967, + + 11851997, 11851997, 11852017, 11852017, 11852051, 11852051, + + 11852053, 11852053, 11852059, 11852059, 11852083, 11852083 / + data (iparam(1,i),iparam(2,i),i= 270, 299) / + + 11852089, 11852089, 11852129, 11852129, 11852147, 11852147, + + 11852149, 11852149, 11852161, 11852161, 11852171, 11852171, + + 11852177, 11852177, 11852209, 11852209, 11852221, 11852221, + + 11852237, 11852237, 11852251, 11852251, 11852263, 11852263, + + 11852273, 11852273, 11852279, 11852279, 11852287, 11852287, + + 11852293, 11852293, 11852297, 11852297, 11852303, 11852303, + + 11852311, 11852311, 11852327, 11852327, 11852339, 11852339, + + 11852341, 11852341, 11852359, 11852359, 11852369, 11852369, + + 11852437, 11852437, 11852453, 11852453, 11852459, 11852459, + + 11852473, 11852473, 11852513, 11852513, 11852531, 11852531 / + data (iparam(1,i),iparam(2,i),i= 300, 329) / + + 11852537, 11852537, 11852539, 11852539, 11852557, 11852557, + + 11852573, 11852573, 11852579, 11852579, 11852591, 11852591, + + 11852609, 11852609, 11852611, 11852611, 11852623, 11852623, + + 11852641, 11852641, 11852647, 11852647, 11852657, 11852657, + + 11852663, 11852663, 11852717, 11852717, 11852719, 11852719, + + 11852741, 11852741, 11852759, 11852759, 11852767, 11852767, + + 11852773, 11852773, 11852803, 11852803, 11852807, 11852807, + + 11852809, 11852809, 11852831, 11852831, 11852833, 11852833, + + 11852837, 11852837, 11852857, 11852857, 11852873, 11852873, + + 11852879, 11852879, 11852891, 11852891, 11852917, 11852917 / + data (iparam(1,i),iparam(2,i),i= 330, 359) / + + 11852921, 11852921, 11852957, 11852957, 11852959, 11852959, + + 11852969, 11852969, 11852983, 11852983, 11852989, 11852989, + + 11853001, 11853001, 11853013, 11853013, 11853019, 11853019, + + 11853031, 11853031, 11853089, 11853089, 11853133, 11853133, + + 11853157, 11853157, 11853161, 11853161, 11853181, 11853181, + + 11853203, 11853203, 11853217, 11853217, 11853221, 11853221, + + 11853227, 11853227, 11853241, 11853241, 11853307, 11853307, + + 11853319, 11853319, 11853323, 11853323, 11853329, 11853329, + + 11853367, 11853367, 11853383, 11853383, 11853419, 11853419, + + 11853421, 11853421, 11853427, 11853427, 11853449, 11853449 / + data (iparam(1,i),iparam(2,i),i= 360, 389) / + + 11853451, 11853451, 11853463, 11853463, 11853529, 11853529, + + 11853557, 11853557, 11853571, 11853571, 11853601, 11853601, + + 11853613, 11853613, 11853617, 11853617, 11853629, 11853629, + + 11853649, 11853649, 11853659, 11853659, 11853679, 11853679, + + 11853689, 11853689, 11853719, 11853719, 11853731, 11853731, + + 11853757, 11853757, 11853761, 11853761, 11853773, 11853773, + + 11853791, 11853791, 11853817, 11853817, 11853839, 11853839, + + 11853847, 11853847, 11853857, 11853857, 11853869, 11853869, + + 11853883, 11853883, 11853887, 11853887, 11853889, 11853889, + + 11853893, 11853893, 11853899, 11853899, 11853911, 11853911 / + data (iparam(1,i),iparam(2,i),i= 390, 419) / + + 11853931, 11853931, 11853943, 11853943, 11853979, 11853979, + + 11853991, 11853991, 11854001, 11854001, 11854009, 11854009, + + 11854019, 11854019, 11854057, 11854057, 11854061, 11854061, + + 11854147, 11854147, 11854159, 11854159, 11854163, 11854163, + + 11854169, 11854169, 11854211, 11854211, 11854247, 11854247, + + 11854261, 11854261, 11854267, 11854267, 11854279, 11854279, + + 11854303, 11854303, 11854327, 11854327, 11854331, 11854331, + + 11854333, 11854333, 11854363, 11854363, 11854379, 11854379, + + 11854399, 11854399, 11854411, 11854411, 11854429, 11854429, + + 11854433, 11854433, 11854439, 11854439, 11854441, 11854441 / + data (iparam(1,i),iparam(2,i),i= 420, 449) / + + 11854463, 11854463, 11854477, 11854477, 11854489, 11854489, + + 11854517, 11854517, 11854519, 11854519, 11854523, 11854523, + + 11854529, 11854529, 11854567, 11854567, 11854571, 11854571, + + 11854573, 11854573, 11854603, 11854603, 11854607, 11854607, + + 11854681, 11854681, 11854691, 11854691, 11854709, 11854709, + + 11854723, 11854723, 11854757, 11854757, 11854783, 11854783, + + 11854793, 11854793, 11854813, 11854813, 11854847, 11854847, + + 11854853, 11854853, 11854873, 11854873, 11854877, 11854877, + + 11854883, 11854883, 11854891, 11854891, 11854897, 11854897, + + 11854901, 11854901, 11854919, 11854919, 11854937, 11854937 / + data (iparam(1,i),iparam(2,i),i= 450, 479) / + + 11854961, 11854961, 11854963, 11854963, 11854979, 11854979, + + 11855003, 11855003, 11855017, 11855017, 11855023, 11855023, + + 11855029, 11855029, 11855033, 11855033, 11855111, 11855111, + + 11855141, 11855141, 11855147, 11855147, 11855149, 11855149, + + 11855159, 11855159, 11855177, 11855177, 11855203, 11855203, + + 11855213, 11855213, 11855219, 11855219, 11855231, 11855231, + + 11855267, 11855267, 11855269, 11855269, 11855303, 11855303, + + 11855309, 11855309, 11855321, 11855321, 11855329, 11855329, + + 11855339, 11855339, 11855351, 11855351, 11855353, 11855353, + + 11855357, 11855357, 11855359, 11855359, 11855381, 11855381 / + data (iparam(1,i),iparam(2,i),i= 480, 509) / + + 11855383, 11855383, 11855387, 11855387, 11855399, 11855399, + + 11855407, 11855407, 11855413, 11855413, 11855489, 11855489, + + 11855491, 11855491, 11855507, 11855507, 11855521, 11855521, + + 11855531, 11855531, 11855549, 11855549, 11855551, 11855551, + + 11855567, 11855567, 11855581, 11855581, 11855587, 11855587, + + 11855593, 11855593, 11855633, 11855633, 11855653, 11855653, + + 11855663, 11855663, 11855687, 11855687, 11855689, 11855689, + + 11855699, 11855699, 11855713, 11855713, 11855731, 11855731, + + 11855737, 11855737, 11855743, 11855743, 11855747, 11855747, + + 11855759, 11855759, 11855773, 11855773, 11855801, 11855801 / + data (iparam(1,i),iparam(2,i),i= 510, 539) / + + 11855807, 11855807, 11855813, 11855813, 11855827, 11855827, + + 11855839, 11855839, 11855869, 11855869, 11855881, 11855881, + + 11855903, 11855903, 11855911, 11855911, 11855933, 11855933, + + 11855959, 11855959, 11855989, 11855989, 11855993, 11855993, + + 11855999, 11855999, 11856001, 11856001, 11856023, 11856023, + + 11856049, 11856049, 11856071, 11856071, 11856101, 11856101, + + 11856107, 11856107, 11856113, 11856113, 11856139, 11856139, + + 11856151, 11856151, 11856161, 11856161, 11856179, 11856179, + + 11856193, 11856193, 11856199, 11856199, 11856223, 11856223, + + 11856239, 11856239, 11856263, 11856263, 11856269, 11856269 / + data (iparam(1,i),iparam(2,i),i= 540, 569) / + + 11856281, 11856281, 11856287, 11856287, 11856307, 11856307, + + 11856311, 11856311, 11856329, 11856329, 11856343, 11856343, + + 11856359, 11856359, 11856371, 11856371, 11856373, 11856373, + + 11856409, 11856409, 11856419, 11856419, 11856461, 11856461, + + 11856469, 11856469, 11856473, 11856473, 11856479, 11856479, + + 11856511, 11856511, 11856517, 11856517, 11856541, 11856541, + + 11856547, 11856547, 11856553, 11856553, 11856583, 11856583, + + 11856629, 11856629, 11856641, 11856641, 11856653, 11856653, + + 11856659, 11856659, 11856673, 11856673, 11856697, 11856697, + + 11856709, 11856709, 11856727, 11856727, 11856731, 11856731 / + data (iparam(1,i),iparam(2,i),i= 570, 599) / + + 11856763, 11856763, 11856809, 11856809, 11856811, 11856811, + + 11856821, 11856821, 11856841, 11856841, 11856857, 11856857, + + 11856877, 11856877, 11856883, 11856883, 11856899, 11856899, + + 11856919, 11856919, 11856947, 11856947, 11856953, 11856953, + + 11856979, 11856979, 11857003, 11857003, 11857033, 11857033, + + 11857037, 11857037, 11857039, 11857039, 11857049, 11857049, + + 11857061, 11857061, 11857067, 11857067, 11857073, 11857073, + + 11857081, 11857081, 11857091, 11857091, 11857093, 11857093, + + 11857099, 11857099, 11857123, 11857123, 11857127, 11857127, + + 11857147, 11857147, 11857151, 11857151, 11857193, 11857193 / + data (iparam(1,i),iparam(2,i),i= 600, 629) / + + 11857217, 11857217, 11857229, 11857229, 11857243, 11857243, + + 11857249, 11857249, 11857267, 11857267, 11857277, 11857277, + + 11857291, 11857291, 11857303, 11857303, 11857309, 11857309, + + 11857327, 11857327, 11857331, 11857331, 11857333, 11857333, + + 11857361, 11857361, 11857367, 11857367, 11857369, 11857369, + + 11857393, 11857393, 11857399, 11857399, 11857409, 11857409, + + 11857421, 11857421, 11857423, 11857423, 11857451, 11857451, + + 11857453, 11857453, 11857457, 11857457, 11857477, 11857477, + + 11857481, 11857481, 11857493, 11857493, 11857499, 11857499, + + 11857519, 11857519, 11857523, 11857523, 11857529, 11857529 / + data (iparam(1,i),iparam(2,i),i= 630, 659) / + + 11857543, 11857543, 11857561, 11857561, 11857589, 11857589, + + 11857591, 11857591, 11857613, 11857613, 11857621, 11857621, + + 11857661, 11857661, 11857667, 11857667, 11857693, 11857693, + + 11857697, 11857697, 11857709, 11857709, 11857711, 11857711, + + 11857751, 11857751, 11857753, 11857753, 11857759, 11857759, + + 11857763, 11857763, 11857777, 11857777, 11857787, 11857787, + + 11857793, 11857793, 11857801, 11857801, 11857817, 11857817, + + 11857819, 11857819, 11857831, 11857831, 11857837, 11857837, + + 11857873, 11857873, 11857877, 11857877, 11857883, 11857883, + + 11857889, 11857889, 11857907, 11857907, 11857913, 11857913 / + data (iparam(1,i),iparam(2,i),i= 660, 689) / + + 11857931, 11857931, 11857969, 11857969, 11857991, 11857991, + + 11857999, 11857999, 11858009, 11858009, 11858017, 11858017, + + 11858023, 11858023, 11858029, 11858029, 11858039, 11858039, + + 11858051, 11858051, 11858057, 11858057, 11858059, 11858059, + + 11858101, 11858101, 11858111, 11858111, 11858131, 11858131, + + 11858149, 11858149, 11858159, 11858159, 11858177, 11858177, + + 11858191, 11858191, 11858201, 11858201, 11858227, 11858227, + + 11858243, 11858243, 11858267, 11858267, 11858269, 11858269, + + 11858279, 11858279, 11858281, 11858281, 11858291, 11858291, + + 11858311, 11858311, 11858323, 11858323, 11858359, 11858359 / + data (iparam(1,i),iparam(2,i),i= 690, 719) / + + 11858377, 11858377, 11858381, 11858381, 11858387, 11858387, + + 11858423, 11858423, 11858443, 11858443, 11858447, 11858447, + + 11858479, 11858479, 11858533, 11858533, 11858543, 11858543, + + 11858551, 11858551, 11858557, 11858557, 11858569, 11858569, + + 11858573, 11858573, 11858579, 11858579, 11858597, 11858597, + + 11858599, 11858599, 11858629, 11858629, 11858657, 11858657, + + 11858659, 11858659, 11858683, 11858683, 11858701, 11858701, + + 11858719, 11858719, 11858723, 11858723, 11858729, 11858729, + + 11858747, 11858747, 11858779, 11858779, 11858783, 11858783, + + 11858801, 11858801, 11858807, 11858807, 11858813, 11858813 / + data (iparam(1,i),iparam(2,i),i= 720, 749) / + + 11858839, 11858839, 11858851, 11858851, 11858893, 11858893, + + 11858897, 11858897, 11858921, 11858921, 11858947, 11858947, + + 11858953, 11858953, 11858969, 11858969, 11858971, 11858971, + + 11858989, 11858989, 11859017, 11859017, 11859031, 11859031, + + 11859049, 11859049, 11859061, 11859061, 11859073, 11859073, + + 11859077, 11859077, 11859079, 11859079, 11859083, 11859083, + + 11859101, 11859101, 11859109, 11859109, 11859137, 11859137, + + 11859139, 11859139, 11859151, 11859151, 11859157, 11859157, + + 11859163, 11859163, 11859167, 11859167, 11859179, 11859179, + + 11859187, 11859187, 11859229, 11859229, 11859233, 11859233 / + data (iparam(1,i),iparam(2,i),i= 750, 779) / + + 11859241, 11859241, 11859247, 11859247, 11859269, 11859269, + + 11859293, 11859293, 11859307, 11859307, 11859311, 11859311, + + 11859349, 11859349, 11859359, 11859359, 11859371, 11859371, + + 11859377, 11859377, 11859383, 11859383, 11859427, 11859427, + + 11859433, 11859433, 11859451, 11859451, 11859457, 11859457, + + 11859461, 11859461, 11859473, 11859473, 11859481, 11859481, + + 11859487, 11859487, 11859493, 11859493, 11859503, 11859503, + + 11859509, 11859509, 11859539, 11859539, 11859541, 11859541, + + 11859563, 11859563, 11859569, 11859569, 11859571, 11859571, + + 11859583, 11859583, 11859599, 11859599, 11859611, 11859611 / + data (iparam(1,i),iparam(2,i),i= 780, 809) / + + 11859643, 11859643, 11859707, 11859707, 11859713, 11859713, + + 11859719, 11859719, 11859739, 11859739, 11859751, 11859751, + + 11859791, 11859791, 11859817, 11859817, 11859821, 11859821, + + 11859833, 11859833, 11859847, 11859847, 11859853, 11859853, + + 11859877, 11859877, 11859889, 11859889, 11859893, 11859893, + + 11859901, 11859901, 11859907, 11859907, 11859917, 11859917, + + 11859923, 11859923, 11859929, 11859929, 11859961, 11859961, + + 11859979, 11859979, 11859989, 11859989, 11859997, 11859997, + + 11860021, 11860021, 11860031, 11860031, 11860039, 11860039, + + 11860049, 11860049, 11860081, 11860081, 11860087, 11860087 / + data (iparam(1,i),iparam(2,i),i= 810, 839) / + + 11860097, 11860097, 11860103, 11860103, 11860109, 11860109, + + 11860117, 11860117, 11860133, 11860133, 11860151, 11860151, + + 11860171, 11860171, 11860207, 11860207, 11860223, 11860223, + + 11860231, 11860231, 11860243, 11860243, 11860267, 11860267, + + 11860301, 11860301, 11860307, 11860307, 11860327, 11860327, + + 11860379, 11860379, 11860397, 11860397, 11860411, 11860411, + + 11860469, 11860469, 11860477, 11860477, 11860483, 11860483, + + 11860487, 11860487, 11860489, 11860489, 11860493, 11860493, + + 11860517, 11860517, 11860547, 11860547, 11860567, 11860567, + + 11860573, 11860573, 11860613, 11860613, 11860619, 11860619 / + data (iparam(1,i),iparam(2,i),i= 840, 869) / + + 11860627, 11860627, 11860637, 11860637, 11860643, 11860643, + + 11860649, 11860649, 11860661, 11860661, 11860669, 11860669, + + 11860687, 11860687, 11860691, 11860691, 11860697, 11860697, + + 11860699, 11860699, 11860703, 11860703, 11860727, 11860727, + + 11860741, 11860741, 11860753, 11860753, 11860777, 11860777, + + 11860787, 11860787, 11860789, 11860789, 11860811, 11860811, + + 11860837, 11860837, 11860859, 11860859, 11860867, 11860867, + + 11860889, 11860889, 11860897, 11860897, 11860963, 11860963, + + 11860969, 11860969, 11860973, 11860973, 11860993, 11860993, + + 11861011, 11861011, 11861033, 11861033, 11861071, 11861071 / + data (iparam(1,i),iparam(2,i),i= 870, 899) / + + 11861081, 11861081, 11861089, 11861089, 11861093, 11861093, + + 11861099, 11861099, 11861107, 11861107, 11861131, 11861131, + + 11861141, 11861141, 11861159, 11861159, 11861167, 11861167, + + 11861191, 11861191, 11861197, 11861197, 11861207, 11861207, + + 11861219, 11861219, 11861221, 11861221, 11861231, 11861231, + + 11861237, 11861237, 11861273, 11861273, 11861293, 11861293, + + 11861299, 11861299, 11861303, 11861303, 11861327, 11861327, + + 11861351, 11861351, 11861357, 11861357, 11861363, 11861363, + + 11861371, 11861371, 11861401, 11861401, 11861407, 11861407, + + 11861411, 11861411, 11861413, 11861413, 11861429, 11861429 / + data (iparam(1,i),iparam(2,i),i= 900, 929) / + + 11861441, 11861441, 11861467, 11861467, 11861527, 11861527, + + 11861539, 11861539, 11861543, 11861543, 11861557, 11861557, + + 11861569, 11861569, 11861573, 11861573, 11861579, 11861579, + + 11861581, 11861581, 11861599, 11861599, 11861611, 11861611, + + 11861617, 11861617, 11861627, 11861627, 11861639, 11861639, + + 11861651, 11861651, 11861659, 11861659, 11861671, 11861671, + + 11861683, 11861683, 11861687, 11861687, 11861693, 11861693, + + 11861701, 11861701, 11861711, 11861711, 11861713, 11861713, + + 11861749, 11861749, 11861791, 11861791, 11861803, 11861803, + + 11861819, 11861819, 11861827, 11861827, 11861849, 11861849 / + data (iparam(1,i),iparam(2,i),i= 930, 959) / + + 11861873, 11861873, 11861879, 11861879, 11861887, 11861887, + + 11861911, 11861911, 11861917, 11861917, 11861921, 11861921, + + 11861923, 11861923, 11861953, 11861953, 11861959, 11861959, + + 11861987, 11861987, 11862007, 11862007, 11862013, 11862013, + + 11862029, 11862029, 11862031, 11862031, 11862049, 11862049, + + 11862077, 11862077, 11862083, 11862083, 11862157, 11862157, + + 11862167, 11862167, 11862199, 11862199, 11862203, 11862203, + + 11862217, 11862217, 11862223, 11862223, 11862229, 11862229, + + 11862233, 11862233, 11862239, 11862239, 11862241, 11862241, + + 11862259, 11862259, 11862269, 11862269, 11862271, 11862271 / + data (iparam(1,i),iparam(2,i),i= 960, 989) / + + 11862293, 11862293, 11862307, 11862307, 11862313, 11862313, + + 11862317, 11862317, 11862343, 11862343, 11862353, 11862353, + + 11862373, 11862373, 11862391, 11862391, 11862439, 11862439, + + 11862469, 11862469, 11862493, 11862493, 11862527, 11862527, + + 11862547, 11862547, 11862563, 11862563, 11862569, 11862569, + + 11862577, 11862577, 11862581, 11862581, 11862611, 11862611, + + 11862623, 11862623, 11862661, 11862661, 11862673, 11862673, + + 11862679, 11862679, 11862701, 11862701, 11862703, 11862703, + + 11862713, 11862713, 11862761, 11862761, 11862791, 11862791, + + 11862803, 11862803, 11862839, 11862839, 11862841, 11862841 / + data (iparam(1,i),iparam(2,i),i= 990,1019) / + + 11862857, 11862857, 11862869, 11862869, 11862881, 11862881, + + 11862911, 11862911, 11862919, 11862919, 11862959, 11862959, + + 11862979, 11862979, 11862989, 11862989, 11862997, 11862997, + + 11863021, 11863021, 11863031, 11863031, 11863037, 11863037, + + 11863039, 11863039, 11863057, 11863057, 11863067, 11863067, + + 11863073, 11863073, 11863099, 11863099, 11863109, 11863109, + + 11863121, 11863121, 11863123, 11863123, 11863133, 11863133, + + 11863151, 11863151, 11863153, 11863153, 11863171, 11863171, + + 11863183, 11863183, 11863207, 11863207, 11863213, 11863213, + + 11863237, 11863237, 11863249, 11863249, 11863253, 11863253 / + data (iparam(1,i),iparam(2,i),i=1020,1021) / + + 11863259, 11863259, 11863279, 11863279 / + end +#else + real function prng_next(me) +crc logical prng_restart, prng_chkpnt +c +c Calling sequence: +c = prng_next ( ) +c +c This code is based on a sequential algorithm provided by Mal Kalos. +c This version uses 4 16-bit packets, and uses a block data common +c area for the initial seeds and constants. A 64-bit floating point +c number is returned. +c +c The arrays "l" and "n" are full-word aligned, being padded by zeros +c That is, rows 1-4 in a given column are for real, rows 5-16 are bogus +c +c July 12, 1993: double the number of sequences. We should have been +c using two packets per seed, rather than four +c + real tpm12 + integer iseed(4) + parameter(tpm12 = 1.d0/65536.d0) + parameter(nmax=1021) +c external prngblk + common/ksrprng/l(16,0:nmax),n(16,0:nmax) +c*ksr*subpage /ksrprng/ + data m1,m2,m3,m4 / 0, 8037, 61950, 30779/ + if (me .lt. 0 .or. me .gt. nmax) then + prng_next=-1.0 + return + endif + l1=l(1,me) + l2=l(2,me) + l3=l(3,me) + l4=l(4,me) + i1=l1*m4+l2*m3+l3*m2+l4*m1 + n(1,me) + i2=l2*m4+l3*m3+l4*m2 + n(2,me) + i3=l3*m4+l4*m3 + n(3,me) + i4=l4*m4 + n(4,me) + l4=and(i4,65535) + i3=i3+ishft(i4,-16) + l3=and(i3,65535) + i2=i2+ishft(i3,-16) + l2=and(i2,65535) + l1=and(i1+ishft(i2,-16),65535) + prng_next=tpm12*(l1+tpm12*(l2+tpm12*(l3+tpm12*l4))) + l(1,me)=l1 + l(2,me)=l2 + l(3,me)=l3 + l(4,me)=l4 + return + end +c +c prng_chkpnt Get the current state of a generator +c +c Calling sequence: +c logical prng_chkpnt, status +c status = prng_chkpnt (me, iseed) where +c +c me is the particular generator whose state is being gotten +c seed is an 4-element integer array where the "l"-values will be saved +c +crc entry prng_chkpnt (me, iseed) + logical function prng_chkpnt (me, iseed) + integer iseed(4) + parameter(nmax=1021) + common/ksrprng/l(16,0:nmax),n(16,0:nmax) + if (me .lt. 0 .or. me .gt. nmax) then + prng_chkpnt=.false. + else + prng_chkpnt=.true. + iseed(1)=l(1,me) + iseed(2)=l(2,me) + iseed(3)=l(3,me) + iseed(4)=l(4,me) + endif + return + end +c +c prng_restart Restart generator from a saved state +c +c Calling sequence: +c logical prng_restart, status +c status = prng_restart (me, iseed) where +c +c me is the particular generator being restarted +c seed is an 4-element integer array containing the "l"-values +c +crc entry prng_restart (me, iseed) + logical function prng_restart (me, iseed) + integer iseed(4) + parameter(nmax=1021) + common/ksrprng/l(16,0:nmax),n(16,0:nmax) + if (me .lt. 0 .or. me .gt. nmax) then + prng_restart=.false. + return + else + prng_restart=.true. + l(1,me)=iseed(1) + l(2,me)=iseed(2) + l(3,me)=iseed(3) + l(4,me)=iseed(4) + endif + return + end + + block data prngblk +c +c Sequence of prime numbers represented as pairs of 16-bit integers +c modulo 2**16, obtained from Mal Kalos August 28, 1992. Only 98 +c continuation cards are allowed by ksr Fortran, so several DATA +c statements are used to initialize 1022 generators. +c +c @cornell university, 1992 +c + parameter(nmax=1021,nmax1=2*nmax+2) + common/ksrprng/l(16,0:nmax),n(16,0:nmax) +c*ksr*subpage /ksrprng/ + +c High order quads in arrays "l" and "n" are initialized to zero : rows 1-2 +c Rows 5-16 remain uninitialized. They are just pads, never used. + DATA ((l(i,j),i=1,2),j=0,nmax)/nmax1*0.0/ + DATA ((n(i,j),i=1,2),j=0,nmax)/nmax1*0.0/ + +c The rest of array "l" and "n" are initialized to a 20-bit seed + DATA ((l(i,j),i=3,4),j=0,489)/ + .180, 51739,180, 51757,180, 51761,180, 51767,180,51773, + .180, 51791,180, 51817,180, 51833,180, 51859,180, 51871, + .180, 51877,180, 51883,180, 51887,180, 51893,180, 51899, + .180, 51913,180, 51953,180, 51971,180, 51989,180, 51997, + .180, 52009,180, 52013,180, 52033,180, 52043,180, 52051, + .180, 52057,180, 52073,180, 52109,180, 52111,180, 52121, + .180, 52139,180, 52157,180, 52183,180, 52193,180, 52199, + .180, 52211,180, 52219,180, 52229,180, 52237,180, 52241, + .180, 52249,180, 52261,180, 52271,180, 52277,180, 52307, + .180, 52321,180, 52349,180, 52373,180, 52381,180, 52387, + .180, 52393,180, 52411,180, 52429,180, 52439,180, 52451, + .180, 52457,180, 52481,180, 52501,180, 52541,180, 52559, + .180, 52573,180, 52579,180, 52589,180, 52597,180, 52607, + .180, 52613,180, 52627,180, 52631,180, 52649,180, 52657, + .180, 52697,180, 52703,180, 52723,180, 52751,180, 52757, + .180, 52759,180, 52769,180, 52771,180, 52789,180, 52793, + .180, 52811,180, 52817,180, 52829,180, 52859,180, 52879, + .180, 52883,180, 52919,180, 52921,180, 52933,180, 52937, + .180, 52957,180, 52963,180, 52993,180, 53011,180, 53023, + .180, 53027,180, 53077,180, 53087,180, 53089,180, 53093, + .180, 53107,180, 53119,180, 53153,180, 53161,180, 53173, + .180, 53179,180, 53191,180, 53203,180, 53209,180, 53213, + .180, 53219,180, 53221,180, 53227,180, 53233,180, 53243, + .180, 53261,180, 53263,180, 53279,180, 53287,180, 53291, + .180, 53311,180, 53321,180, 53329,180, 53333,180, 53389, + .180, 53401,180, 53411,180, 53429,180, 53443,180, 53453, + .180, 53467,180, 53507,180, 53521,180, 53531,180, 53539, + .180, 53543,180, 53551,180, 53569,180, 53581,180, 53593, + .180, 53597,180, 53623,180, 53629,180, 53641,180, 53647, + .180, 53653,180, 53669,180, 53681,180, 53689,180, 53711, + .180, 53753,180, 53767,180, 53779,180, 53789,180, 53803, + .180, 53821,180, 53861,180, 53867,180, 53887,180, 53893, + .180, 53899,180, 53909,180, 53927,180, 53947,180, 53957, + .180, 53989,180, 54001,180, 54031,180, 54049,180, 54061, + .180, 54077,180, 54127,180, 54131,180, 54187,180, 54197, + .180, 54199,180, 54221,180, 54251,180, 54259,180, 54269, + .180, 54311,180, 54323,180, 54349,180, 54353,180, 54379, + .180, 54397,180, 54419,180, 54427,180, 54433,180, 54439, + .180, 54451,180, 54461,180, 54467,180, 54473,180, 54481, + .180, 54503,180, 54511,180, 54517,180, 54551,180, 54553, + .180, 54571,180, 54581,180, 54587,180, 54613,180, 54629, + .180, 54643,180, 54647,180, 54659,180, 54677,180, 54683, + .180, 54701,180, 54721,180, 54739,180, 54811,180, 54823, + .180, 54829,180, 54833,180, 54839,180, 54869,180, 54871, + .180, 54881,180, 54893,180, 54923,180, 54929,180, 54943, + .180, 54967,180, 54971,180, 55001,180, 55013,180, 55039, + .180, 55043,180, 55049,180, 55067,180, 55069,180, 55079, + .180, 55097,180, 55109,180, 55111,180, 55117,180, 55123, + .180, 55127,180, 55133,180, 55141,180, 55147,180, 55159, + .180, 55193,180, 55201,180, 55247,180, 55273,180, 55279, + .180, 55307,180, 55313,180, 55319,180, 55333,180, 55361, + .180, 55379,180, 55387,180, 55411,180, 55429,180, 55439, + .180, 55447,180, 55453,180, 55469,180, 55487,180, 55517, + .180, 55537,180, 55571,180, 55573,180, 55579,180, 55603, + .180, 55609,180, 55649,180, 55667,180, 55669,180, 55681, + .180, 55691,180, 55697,180, 55729,180, 55741,180, 55757, + .180, 55771,180, 55783,180, 55793,180, 55799,180, 55807, + .180, 55813,180, 55817,180, 55823,180, 55831,180, 55847, + .180, 55859,180, 55861,180, 55879,180, 55889,180, 55957, + .180, 55973,180, 55979,180, 55993,180, 56033,180, 56051, + .180, 56057,180, 56059,180, 56077,180, 56093,180, 56099, + .180, 56111,180, 56129,180, 56131,180, 56143,180, 56161, + .180, 56167,180, 56177,180, 56183,180, 56237,180, 56239, + .180, 56261,180, 56279,180, 56287,180, 56293,180, 56323, + .180, 56327,180, 56329,180, 56351,180, 56353,180, 56357, + .180, 56377,180, 56393,180, 56399,180, 56411,180, 56437, + .180, 56441,180, 56477,180, 56479,180, 56489,180, 56503, + .180, 56509,180, 56521,180, 56533,180, 56539,180, 56551, + .180, 56609,180, 56653,180, 56677,180, 56681,180, 56701, + .180, 56723,180, 56737,180, 56741,180, 56747,180, 56761, + .180, 56827,180, 56839,180, 56843,180, 56849,180, 56887, + .180, 56903,180, 56939,180, 56941,180, 56947,180, 56969, + .180, 56971,180, 56983,180, 57049,180, 57077,180, 57091, + .180, 57121,180, 57133,180, 57137,180, 57149,180, 57169, + .180, 57179,180, 57199,180, 57209,180, 57239,180, 57251, + .180, 57277,180, 57281,180, 57293,180, 57311,180, 57337, + .180, 57359,180, 57367,180, 57377,180, 57389,180, 57403, + .180, 57407,180, 57409,180, 57413,180, 57419,180, 57431, + .180, 57451,180, 57463,180, 57499,180, 57511,180, 57521, + .180, 57529,180, 57539,180, 57577,180, 57581,180, 57667, + .180, 57679,180, 57683,180, 57689,180, 57731,180, 57767, + .180, 57781,180, 57787,180, 57799,180, 57823,180, 57847, + .180, 57851,180, 57853,180, 57883,180, 57899,180, 57919, + .180, 57931,180, 57949,180, 57953,180, 57959,180, 57961, + .180, 57983,180, 57997,180, 58009,180, 58037,180, 58039, + .180, 58043,180, 58049,180, 58087,180, 58091,180, 58093, + .180, 58123,180, 58127,180, 58201,180, 58211,180, 58229, + .180, 58243,180, 58277,180, 58303,180, 58313,180, 58333, + .180, 58367,180, 58373,180, 58393,180, 58397,180, 58403, + .180, 58411,180, 58417,180, 58421,180, 58439,180, 58457, + .180, 58481,180, 58483,180, 58499,180, 58523,180, 58537, + .180, 58543,180, 58549,180, 58553,180, 58631,180, 58661, + .180, 58667,180, 58669,180, 58679,180, 58697,180, 58723, + .180, 58733,180, 58739,180, 58751,180, 58787,180, 58789, + .180, 58823,180, 58829,180, 58841,180, 58849,180, 58859, + .180, 58871,180, 58873,180, 58877,180, 58879,180, 58901, + .180, 58903,180, 58907,180, 58919,180, 58927,180, 58933, + .180, 59009,180, 59011,180, 59027,180, 59041,180, 59051/ + DATA ((l(i,j),i=3,4),j=490,979)/ + .180, 59069,180, 59071,180, 59087,180, 59101,180, 59107, + .180, 59113,180, 59153,180, 59173,180, 59183,180, 59207, + .180, 59209,180, 59219,180, 59233,180, 59251,180, 59257, + .180, 59263,180, 59267,180, 59279,180, 59293,180, 59321, + .180, 59327,180, 59333,180, 59347,180, 59359,180, 59389, + .180, 59401,180, 59423,180, 59431,180, 59453,180, 59479, + .180, 59509,180, 59513,180, 59519,180, 59521,180, 59543, + .180, 59569,180, 59591,180, 59621,180, 59627,180, 59633, + .180, 59659,180, 59671,180, 59681,180, 59699,180, 59713, + .180, 59719,180, 59743,180, 59759,180, 59783,180, 59789, + .180, 59801,180, 59807,180, 59827,180, 59831,180, 59849, + .180, 59863,180, 59879,180, 59891,180, 59893,180, 59929, + .180, 59939,180, 59981,180, 59989,180, 59993,180, 59999, + .180, 60031,180, 60037,180, 60061,180, 60067,180, 60073, + .180, 60103,180, 60149,180, 60161,180, 60173,180, 60179, + .180, 60193,180, 60217,180, 60229,180, 60247,180, 60251, + .180, 60283,180, 60329,180, 60331,180, 60341,180, 60361, + .180, 60377,180, 60397,180, 60403,180, 60419,180, 60439, + .180, 60467,180, 60473,180, 60499,180, 60523,180, 60553, + .180, 60557,180, 60559,180, 60569,180, 60581,180, 60587, + .180, 60593,180, 60601,180, 60611,180, 60613,180, 60619, + .180, 60643,180, 60647,180, 60667,180, 60671,180, 60713, + .180, 60737,180, 60749,180, 60763,180, 60769,180, 60787, + .180, 60797,180, 60811,180, 60823,180, 60829,180, 60847, + .180, 60851,180, 60853,180, 60881,180, 60887,180, 60889, + .180, 60913,180, 60919,180, 60929,180, 60941,180, 60943, + .180, 60971,180, 60973,180, 60977,180, 60997,180, 61001, + .180, 61013,180, 61019,180, 61039,180, 61043,180, 61049, + .180, 61063,180, 61081,180, 61109,180, 61111,180, 61133, + .180, 61141,180, 61181,180, 61187,180, 61213,180, 61217, + .180, 61229,180, 61231,180, 61271,180, 61273,180, 61279, + .180, 61283,180, 61297,180, 61307,180, 61313,180, 61321, + .180, 61337,180, 61339,180, 61351,180, 61357,180, 61393, + .180, 61397,180, 61403,180, 61409,180, 61427,180, 61433, + .180, 61451,180, 61489,180, 61511,180, 61519,180, 61529, + .180, 61537,180, 61543,180, 61549,180, 61559,180, 61571, + .180, 61577,180, 61579,180, 61621,180, 61631,180, 61651, + .180, 61669,180, 61679,180, 61697,180, 61711,180, 61721, + .180, 61747,180, 61763,180, 61787,180, 61789,180, 61799, + .180, 61801,180, 61811,180, 61831,180, 61843,180, 61879, + .180, 61897,180, 61901,180, 61907,180, 61943,180, 61963, + .180, 61967,180, 61999,180, 62053,180, 62063,180, 62071, + .180, 62077,180, 62089,180, 62093,180, 62099,180, 62117, + .180, 62119,180, 62149,180, 62177,180, 62179,180, 62203, + .180, 62221,180, 62239,180, 62243,180, 62249,180, 62267, + .180, 62299,180, 62303,180, 62321,180, 62327,180, 62333, + .180, 62359,180, 62371,180, 62413,180, 62417,180, 62441, + .180, 62467,180, 62473,180, 62489,180, 62491,180, 62509, + .180, 62537,180, 62551,180, 62569,180, 62581,180, 62593, + .180, 62597,180, 62599,180, 62603,180, 62621,180, 62629, + .180, 62657,180, 62659,180, 62671,180, 62677,180, 62683, + .180, 62687,180, 62699,180, 62707,180, 62749,180, 62753, + .180, 62761,180, 62767,180, 62789,180, 62813,180, 62827, + .180, 62831,180, 62869,180, 62879,180, 62891,180, 62897, + .180, 62903,180, 62947,180, 62953,180, 62971,180, 62977, + .180, 62981,180, 62993,180, 63001,180, 63007,180, 63013, + .180, 63023,180, 63029,180, 63059,180, 63061,180, 63083, + .180, 63089,180, 63091,180, 63103,180, 63119,180, 63131, + .180, 63163,180, 63227,180, 63233,180, 63239,180, 63259, + .180, 63271,180, 63311,180, 63337,180, 63341,180, 63353, + .180, 63367,180, 63373,180, 63397,180, 63409,180, 63413, + .180, 63421,180, 63427,180, 63437,180, 63443,180, 63449, + .180, 63481,180, 63499,180, 63509,180, 63517,180, 63541, + .180, 63551,180, 63559,180, 63569,180, 63601,180, 63607, + .180, 63617,180, 63623,180, 63629,180, 63637,180, 63653, + .180, 63671,180, 63691,180, 63727,180, 63743,180, 63751, + .180, 63763,180, 63787,180, 63821,180, 63827,180, 63847, + .180, 63899,180, 63917,180, 63931,180, 63989,180, 63997, + .180, 64003,180, 64007,180, 64009,180, 64013,180, 64037, + .180, 64067,180, 64087,180, 64093,180, 64133,180, 64139, + .180, 64147,180, 64157,180, 64163,180, 64169,180, 64181, + .180, 64189,180, 64207,180, 64211,180, 64217,180, 64219, + .180, 64223,180, 64247,180, 64261,180, 64273,180, 64297, + .180, 64307,180, 64309,180, 64331,180, 64357,180, 64379, + .180, 64387,180, 64409,180, 64417,180, 64483,180, 64489, + .180, 64493,180, 64513,180, 64531,180, 64553,180, 64591, + .180, 64601,180, 64609,180, 64613,180, 64619,180, 64627, + .180, 64651,180, 64661,180, 64679,180, 64687,180, 64711, + .180, 64717,180, 64727,180, 64739,180, 64741,180, 64751, + .180, 64757,180, 64793,180, 64813,180, 64819,180, 64823, + .180, 64847,180, 64871,180, 64877,180, 64883,180, 64891, + .180, 64921,180, 64927,180, 64931,180, 64933,180, 64949, + .180, 64961,180, 64987,180, 65047,180, 65059,180, 65063, + .180, 65077,180, 65089,180, 65093,180, 65099,180, 65101, + .180, 65119,180, 65131,180, 65137,180, 65147,180, 65159, + .180, 65171,180, 65179,180, 65191,180, 65203,180, 65207, + .180, 65213,180, 65221,180, 65231,180, 65233,180, 65269, + .180, 65311,180, 65323,180, 65339,180, 65347,180, 65369, + .180, 65393,180, 65399,180, 65407,180, 65431,180, 65437, + .180, 65441,180, 65443,180, 65473,180, 65479,180, 65507, + .180, 65527,180, 65533,181, 13,181, 15,181, 33, + .181, 61,181, 67,181, 141,181, 151,181, 183, + .181, 187,181, 201,181, 207,181, 213,181, 217, + .181, 223,181, 225,181, 243,181, 253,181, 255, + .181, 277,181, 291,181, 297,181, 301,181, 327, + .181, 337,181, 357,181, 375,181, 423,181, 453, + .181, 477,181, 511,181, 531,181, 547,181, 553, + .181, 561,181, 565,181, 595,181, 607,181, 645/ + DATA ((l(i,j),i=3,4),j=980,nmax)/ + .181, 657,181, 663,181, 685,181, 687,181, 697, + .181, 745,181, 775,181, 787,181, 823,181, 825, + .181, 841,181, 853,181, 865,181, 895,181, 903, + .181, 943,181, 963,181, 973,181, 981,181, 1005, + .181,1015,181,1021,181,1023,181,1041,181,1051, + .181, 1057,181, 1083,181, 1093,181, 1105,181, 1107, + .181, 1117,181, 1135,181, 1137,181, 1155,181, 1167, + .181, 1191,181, 1197,181, 1221,181, 1233,181, 1237, + .181, 1243,181, 1263/ + DATA ((n(i,j),i=3,4),j=0,489)/ + .180, 51739,180, 51757,180, 51761,180, 51767,180, 51773, + .180, 51791,180, 51817,180, 51833,180, 51859,180, 51871, + .180, 51877,180, 51883,180, 51887,180, 51893,180, 51899, + .180, 51913,180, 51953,180, 51971,180, 51989,180, 51997, + .180, 52009,180, 52013,180, 52033,180, 52043,180, 52051, + .180, 52057,180, 52073,180, 52109,180, 52111,180, 52121, + .180, 52139,180, 52157,180, 52183,180, 52193,180, 52199, + .180, 52211,180, 52219,180, 52229,180, 52237,180, 52241, + .180, 52249,180, 52261,180, 52271,180, 52277,180, 52307, + .180, 52321,180, 52349,180, 52373,180, 52381,180, 52387, + .180, 52393,180, 52411,180, 52429,180, 52439,180, 52451, + .180, 52457,180, 52481,180, 52501,180, 52541,180, 52559, + .180, 52573,180, 52579,180, 52589,180, 52597,180, 52607, + .180, 52613,180, 52627,180, 52631,180, 52649,180, 52657, + .180, 52697,180, 52703,180, 52723,180, 52751,180, 52757, + .180, 52759,180, 52769,180, 52771,180, 52789,180, 52793, + .180, 52811,180, 52817,180, 52829,180, 52859,180, 52879, + .180, 52883,180, 52919,180, 52921,180, 52933,180, 52937, + .180, 52957,180, 52963,180, 52993,180, 53011,180, 53023, + .180, 53027,180, 53077,180, 53087,180, 53089,180, 53093, + .180, 53107,180, 53119,180, 53153,180, 53161,180, 53173, + .180, 53179,180, 53191,180, 53203,180, 53209,180, 53213, + .180, 53219,180, 53221,180, 53227,180, 53233,180, 53243, + .180, 53261,180, 53263,180, 53279,180, 53287,180, 53291, + .180, 53311,180, 53321,180, 53329,180, 53333,180, 53389, + .180, 53401,180, 53411,180, 53429,180, 53443,180, 53453, + .180, 53467,180, 53507,180, 53521,180, 53531,180, 53539, + .180, 53543,180, 53551,180, 53569,180, 53581,180, 53593, + .180, 53597,180, 53623,180, 53629,180, 53641,180, 53647, + .180, 53653,180, 53669,180, 53681,180, 53689,180, 53711, + .180, 53753,180, 53767,180, 53779,180, 53789,180, 53803, + .180, 53821,180, 53861,180, 53867,180, 53887,180, 53893, + .180, 53899,180, 53909,180, 53927,180, 53947,180, 53957, + .180, 53989,180, 54001,180, 54031,180, 54049,180, 54061, + .180, 54077,180, 54127,180, 54131,180, 54187,180, 54197, + .180, 54199,180, 54221,180, 54251,180, 54259,180, 54269, + .180, 54311,180, 54323,180, 54349,180, 54353,180, 54379, + .180, 54397,180, 54419,180, 54427,180, 54433,180, 54439, + .180, 54451,180, 54461,180, 54467,180, 54473,180, 54481, + .180, 54503,180, 54511,180, 54517,180, 54551,180, 54553, + .180, 54571,180, 54581,180, 54587,180, 54613,180, 54629, + .180, 54643,180, 54647,180, 54659,180, 54677,180, 54683, + .180, 54701,180, 54721,180, 54739,180, 54811,180, 54823, + .180, 54829,180, 54833,180, 54839,180, 54869,180, 54871, + .180, 54881,180, 54893,180, 54923,180, 54929,180, 54943, + .180, 54967,180, 54971,180, 55001,180, 55013,180, 55039, + .180, 55043,180, 55049,180, 55067,180, 55069,180, 55079, + .180, 55097,180, 55109,180, 55111,180, 55117,180, 55123, + .180, 55127,180, 55133,180, 55141,180, 55147,180, 55159, + .180, 55193,180, 55201,180, 55247,180, 55273,180, 55279, + .180, 55307,180, 55313,180, 55319,180, 55333,180, 55361, + .180, 55379,180, 55387,180, 55411,180, 55429,180, 55439, + .180, 55447,180, 55453,180, 55469,180, 55487,180, 55517, + .180, 55537,180, 55571,180, 55573,180, 55579,180, 55603, + .180, 55609,180, 55649,180, 55667,180, 55669,180, 55681, + .180, 55691,180, 55697,180, 55729,180, 55741,180, 55757, + .180, 55771,180, 55783,180, 55793,180, 55799,180, 55807, + .180, 55813,180, 55817,180, 55823,180, 55831,180, 55847, + .180, 55859,180, 55861,180, 55879,180, 55889,180, 55957, + .180, 55973,180, 55979,180, 55993,180, 56033,180, 56051, + .180, 56057,180, 56059,180, 56077,180, 56093,180, 56099, + .180, 56111,180, 56129,180, 56131,180, 56143,180, 56161, + .180, 56167,180, 56177,180, 56183,180, 56237,180, 56239, + .180, 56261,180, 56279,180, 56287,180, 56293,180, 56323, + .180, 56327,180, 56329,180, 56351,180, 56353,180, 56357, + .180, 56377,180, 56393,180, 56399,180, 56411,180, 56437, + .180, 56441,180, 56477,180, 56479,180, 56489,180, 56503, + .180, 56509,180, 56521,180, 56533,180, 56539,180, 56551, + .180, 56609,180, 56653,180, 56677,180, 56681,180, 56701, + .180, 56723,180, 56737,180, 56741,180, 56747,180, 56761, + .180, 56827,180, 56839,180, 56843,180, 56849,180, 56887, + .180, 56903,180, 56939,180, 56941,180, 56947,180, 56969, + .180, 56971,180, 56983,180, 57049,180, 57077,180, 57091, + .180, 57121,180, 57133,180, 57137,180, 57149,180, 57169, + .180, 57179,180, 57199,180, 57209,180, 57239,180, 57251, + .180, 57277,180, 57281,180, 57293,180, 57311,180, 57337, + .180, 57359,180, 57367,180, 57377,180, 57389,180, 57403, + .180, 57407,180, 57409,180, 57413,180, 57419,180, 57431, + .180, 57451,180, 57463,180, 57499,180, 57511,180, 57521, + .180, 57529,180, 57539,180, 57577,180, 57581,180, 57667, + .180, 57679,180, 57683,180, 57689,180, 57731,180, 57767, + .180, 57781,180, 57787,180, 57799,180, 57823,180, 57847, + .180, 57851,180, 57853,180, 57883,180, 57899,180, 57919, + .180, 57931,180, 57949,180, 57953,180, 57959,180, 57961, + .180, 57983,180, 57997,180, 58009,180, 58037,180, 58039, + .180, 58043,180, 58049,180, 58087,180, 58091,180, 58093, + .180, 58123,180, 58127,180, 58201,180, 58211,180, 58229, + .180, 58243,180, 58277,180, 58303,180, 58313,180, 58333, + .180, 58367,180, 58373,180, 58393,180, 58397,180, 58403, + .180, 58411,180, 58417,180, 58421,180, 58439,180, 58457, + .180, 58481,180, 58483,180, 58499,180, 58523,180, 58537, + .180, 58543,180, 58549,180, 58553,180, 58631,180, 58661, + .180, 58667,180, 58669,180, 58679,180, 58697,180, 58723, + .180, 58733,180, 58739,180, 58751,180, 58787,180, 58789, + .180, 58823,180, 58829,180, 58841,180, 58849,180, 58859, + .180, 58871,180, 58873,180, 58877,180, 58879,180, 58901, + .180, 58903,180, 58907,180, 58919,180, 58927,180, 58933, + .180, 59009,180, 59011,180, 59027,180, 59041,180, 59051/ + DATA ((n(i,j),i=3,4),j=490,979)/ + .180, 59069,180, 59071,180, 59087,180, 59101,180, 59107, + .180, 59113,180, 59153,180, 59173,180, 59183,180, 59207, + .180, 59209,180, 59219,180, 59233,180, 59251,180, 59257, + .180, 59263,180, 59267,180, 59279,180, 59293,180, 59321, + .180, 59327,180, 59333,180, 59347,180, 59359,180, 59389, + .180, 59401,180, 59423,180, 59431,180, 59453,180, 59479, + .180, 59509,180, 59513,180, 59519,180, 59521,180, 59543, + .180, 59569,180, 59591,180, 59621,180, 59627,180, 59633, + .180, 59659,180, 59671,180, 59681,180, 59699,180, 59713, + .180, 59719,180, 59743,180, 59759,180, 59783,180, 59789, + .180, 59801,180, 59807,180, 59827,180, 59831,180, 59849, + .180, 59863,180, 59879,180, 59891,180, 59893,180, 59929, + .180, 59939,180, 59981,180, 59989,180, 59993,180, 59999, + .180, 60031,180, 60037,180, 60061,180, 60067,180, 60073, + .180, 60103,180, 60149,180, 60161,180, 60173,180, 60179, + .180, 60193,180, 60217,180, 60229,180, 60247,180, 60251, + .180, 60283,180, 60329,180, 60331,180, 60341,180, 60361, + .180, 60377,180, 60397,180, 60403,180, 60419,180, 60439, + .180, 60467,180, 60473,180, 60499,180, 60523,180, 60553, + .180, 60557,180, 60559,180, 60569,180, 60581,180, 60587, + .180, 60593,180, 60601,180, 60611,180, 60613,180, 60619, + .180, 60643,180, 60647,180, 60667,180, 60671,180, 60713, + .180, 60737,180, 60749,180, 60763,180, 60769,180, 60787, + .180, 60797,180, 60811,180, 60823,180, 60829,180, 60847, + .180, 60851,180, 60853,180, 60881,180, 60887,180, 60889, + .180, 60913,180, 60919,180, 60929,180, 60941,180, 60943, + .180, 60971,180, 60973,180, 60977,180, 60997,180, 61001, + .180, 61013,180, 61019,180, 61039,180, 61043,180, 61049, + .180, 61063,180, 61081,180, 61109,180, 61111,180, 61133, + .180, 61141,180, 61181,180, 61187,180, 61213,180, 61217, + .180, 61229,180, 61231,180, 61271,180, 61273,180, 61279, + .180, 61283,180, 61297,180, 61307,180, 61313,180, 61321, + .180, 61337,180, 61339,180, 61351,180, 61357,180, 61393, + .180, 61397,180, 61403,180, 61409,180, 61427,180, 61433, + .180, 61451,180, 61489,180, 61511,180, 61519,180, 61529, + .180, 61537,180, 61543,180, 61549,180, 61559,180, 61571, + .180, 61577,180, 61579,180, 61621,180, 61631,180, 61651, + .180, 61669,180, 61679,180, 61697,180, 61711,180, 61721, + .180, 61747,180, 61763,180, 61787,180, 61789,180, 61799, + .180, 61801,180, 61811,180, 61831,180, 61843,180, 61879, + .180, 61897,180, 61901,180, 61907,180, 61943,180, 61963, + .180, 61967,180, 61999,180, 62053,180, 62063,180, 62071, + .180, 62077,180, 62089,180, 62093,180, 62099,180, 62117, + .180, 62119,180, 62149,180, 62177,180, 62179,180, 62203, + .180, 62221,180, 62239,180, 62243,180, 62249,180, 62267, + .180, 62299,180, 62303,180, 62321,180, 62327,180, 62333, + .180, 62359,180, 62371,180, 62413,180, 62417,180, 62441, + .180, 62467,180, 62473,180, 62489,180, 62491,180, 62509, + .180, 62537,180, 62551,180, 62569,180, 62581,180, 62593, + .180, 62597,180, 62599,180, 62603,180, 62621,180, 62629, + .180, 62657,180, 62659,180, 62671,180, 62677,180, 62683, + .180, 62687,180, 62699,180, 62707,180, 62749,180, 62753, + .180, 62761,180, 62767,180, 62789,180, 62813,180, 62827, + .180, 62831,180, 62869,180, 62879,180, 62891,180, 62897, + .180, 62903,180, 62947,180, 62953,180, 62971,180, 62977, + .180, 62981,180, 62993,180, 63001,180, 63007,180, 63013, + .180, 63023,180, 63029,180, 63059,180, 63061,180, 63083, + .180, 63089,180, 63091,180, 63103,180, 63119,180, 63131, + .180, 63163,180, 63227,180, 63233,180, 63239,180, 63259, + .180, 63271,180, 63311,180, 63337,180, 63341,180, 63353, + .180, 63367,180, 63373,180, 63397,180, 63409,180, 63413, + .180, 63421,180, 63427,180, 63437,180, 63443,180, 63449, + .180, 63481,180, 63499,180, 63509,180, 63517,180, 63541, + .180, 63551,180, 63559,180, 63569,180, 63601,180, 63607, + .180, 63617,180, 63623,180, 63629,180, 63637,180, 63653, + .180, 63671,180, 63691,180, 63727,180, 63743,180, 63751, + .180, 63763,180, 63787,180, 63821,180, 63827,180, 63847, + .180, 63899,180, 63917,180, 63931,180, 63989,180, 63997, + .180, 64003,180, 64007,180, 64009,180, 64013,180, 64037, + .180, 64067,180, 64087,180, 64093,180, 64133,180, 64139, + .180, 64147,180, 64157,180, 64163,180, 64169,180, 64181, + .180, 64189,180, 64207,180, 64211,180, 64217,180, 64219, + .180, 64223,180, 64247,180, 64261,180, 64273,180, 64297, + .180, 64307,180, 64309,180, 64331,180, 64357,180, 64379, + .180, 64387,180, 64409,180, 64417,180, 64483,180, 64489, + .180, 64493,180, 64513,180, 64531,180, 64553,180, 64591, + .180, 64601,180, 64609,180, 64613,180, 64619,180, 64627, + .180, 64651,180, 64661,180, 64679,180, 64687,180, 64711, + .180, 64717,180, 64727,180, 64739,180, 64741,180, 64751, + .180, 64757,180, 64793,180, 64813,180, 64819,180, 64823, + .180, 64847,180, 64871,180, 64877,180, 64883,180, 64891, + .180, 64921,180, 64927,180, 64931,180, 64933,180, 64949, + .180, 64961,180, 64987,180, 65047,180, 65059,180, 65063, + .180, 65077,180, 65089,180, 65093,180, 65099,180, 65101, + .180, 65119,180, 65131,180, 65137,180, 65147,180, 65159, + .180, 65171,180, 65179,180, 65191,180, 65203,180, 65207, + .180, 65213,180, 65221,180, 65231,180, 65233,180, 65269, + .180, 65311,180, 65323,180, 65339,180, 65347,180, 65369, + .180, 65393,180, 65399,180, 65407,180, 65431,180, 65437, + .180, 65441,180, 65443,180, 65473,180, 65479,180, 65507, + .180, 65527,180, 65533,181, 13,181, 15,181, 33, + .181, 61,181, 67,181, 141,181, 151,181, 183, + .181, 187,181, 201,181, 207,181, 213,181, 217, + .181, 223,181, 225,181, 243,181, 253,181, 255, + .181, 277,181, 291,181, 297,181, 301,181, 327, + .181, 337,181, 357,181, 375,181, 423,181, 453, + .181, 477,181, 511,181, 531,181, 547,181, 553, + .181, 561,181, 565,181, 595,181, 607,181, 645/ + DATA ((n(i,j),i=3,4),j=980,nmax)/ + .181, 657,181, 663,181, 685,181, 687,181, 697, + .181, 745,181, 775,181, 787,181, 823,181, 825, + .181, 841,181, 853,181, 865,181, 895,181, 903, + .181, 943,181, 963,181, 973,181, 981,181, 1005, + .181, 1015,181, 1021,181, 1023,181, 1041,181, 1051, + .181, 1057,181, 1083,181, 1093,181, 1105,181, 1107, + .181, 1117,181, 1135,181, 1137,181, 1155,181, 1167, + .181, 1191,181, 1197,181, 1221,181, 1233,181, 1237, + .181, 1243,181, 1263/ + end +#endif diff --git a/source/unres/src_Eshel/SRC-SURPLUS/q_measure.F b/source/unres/src_Eshel/SRC-SURPLUS/q_measure.F new file mode 100644 index 0000000..417cf35 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/q_measure.F @@ -0,0 +1,487 @@ + double precision function qwolynes(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + integer i,j,jl,k,l,il,kl,nl,np,ip,kp,seg1,seg2,seg3,seg4, + & secseg + integer nsep /3/ + double precision dist,qm + double precision qq,qqij,qqijCM,dij,d0ij,dijCM,d0ijCM + logical lprn /.false./ + logical flag + double precision sigm,x + sigm(x)=0.25d0*x + qq = 0.0d0 + nl=0 + if(flag) then + do il=seg1+nsep,seg2 + do jl=seg1,il-nsep + nl=nl+1 + d0ij=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij=dist(il,jl) + qqij = dexp(-0.5d0*((dij-d0ij)/(sigm(d0ij)))**2) + if (itype(il).ne.10 .or. itype(jl).ne.10) then + nl=nl+1 + d0ijCM=dsqrt( + & (cref(1,jl+nres)-cref(1,il+nres))**2+ + & (cref(2,jl+nres)-cref(2,il+nres))**2+ + & (cref(3,jl+nres)-cref(3,il+nres))**2) + dijCM=dist(il+nres,jl+nres) + qqijCM = dexp(-0.5d0*((dijCM-d0ijCM)/(sigm(d0ijCM)))**2) + endif + qq = qq+qqij+qqijCM + enddo + enddo + qq = qq/nl + else + do il=seg1,seg2 + if((seg3-il).lt.3) then + secseg=il+3 + else + secseg=seg3 + endif + do jl=secseg,seg4 + nl=nl+1 + d0ij=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij=dist(il,jl) + qqij = dexp(-0.5d0*((dij-d0ij)/(sigm(d0ij)))**2) + if (itype(il).ne.10 .or. itype(jl).ne.10) then + nl=nl+1 + d0ijCM=dsqrt( + & (cref(1,jl+nres)-cref(1,il+nres))**2+ + & (cref(2,jl+nres)-cref(2,il+nres))**2+ + & (cref(3,jl+nres)-cref(3,il+nres))**2) + dijCM=dist(il+nres,jl+nres) + qqijCM = dexp(-0.5d0*((dijCM-d0ijCM)/(sigm(d0ijCM)))**2) + endif + qq = qq+qqij+qqijCM + enddo + enddo + qq = qq/nl + endif + qwolynes=1.0d0-qq + return + end +c------------------------------------------------------------------- + subroutine qwolynes_prim(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.MD' + integer i,j,jl,k,l,il,nl,seg1,seg2,seg3,seg4, + & secseg + integer nsep /3/ + double precision dist + double precision dij,d0ij,dijCM,d0ijCM + logical lprn /.false./ + logical flag + double precision sigm,x,sim,dd0,fac,ddqij + sigm(x)=0.25d0*x + + do i=0,nres + do j=1,3 + dqwol(j,i)=0.0d0 + dxqwol(j,i)=0.0d0 + enddo + enddo + nl=0 + if(flag) then + do il=seg1+nsep,seg2 + do jl=seg1,il-nsep + nl=nl+1 + d0ij=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij=dist(il,jl) + sim = 1.0d0/sigm(d0ij) + sim = sim*sim + dd0 = dij-d0ij + fac = dd0*sim/dij*dexp(-0.5d0*dd0*dd0*sim) + do k=1,3 + ddqij = (c(k,il)-c(k,jl))*fac + dqwol(k,il)=dqwol(k,il)+ddqij + dqwol(k,jl)=dqwol(k,jl)-ddqij + enddo + + if (itype(il).ne.10 .or. itype(jl).ne.10) then + nl=nl+1 + d0ijCM=dsqrt( + & (cref(1,jl+nres)-cref(1,il+nres))**2+ + & (cref(2,jl+nres)-cref(2,il+nres))**2+ + & (cref(3,jl+nres)-cref(3,il+nres))**2) + dijCM=dist(il+nres,jl+nres) + sim = 1.0d0/sigm(d0ijCM) + sim = sim*sim + dd0=dijCM-d0ijCM + fac=dd0*sim/dijCM*dexp(-0.5d0*dd0*dd0*sim) + do k=1,3 + ddqij = (c(k,il+nres)-c(k,jl+nres))*fac + dxqwol(k,il)=dxqwol(k,il)+ddqij + dxqwol(k,jl)=dxqwol(k,jl)-ddqij + enddo + endif + enddo + enddo + else + do il=seg1,seg2 + if((seg3-il).lt.3) then + secseg=il+3 + else + secseg=seg3 + endif + do jl=secseg,seg4 + nl=nl+1 + d0ij=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij=dist(il,jl) + sim = 1.0d0/sigm(d0ij) + sim = sim*sim + dd0 = dij-d0ij + fac = dd0*sim/dij*dexp(-0.5d0*dd0*dd0*sim) + do k=1,3 + ddqij = (c(k,il)-c(k,jl))*fac + dqwol(k,il)=dqwol(k,il)+ddqij + dqwol(k,jl)=dqwol(k,jl)-ddqij + enddo + if (itype(il).ne.10 .or. itype(jl).ne.10) then + nl=nl+1 + d0ijCM=dsqrt( + & (cref(1,jl+nres)-cref(1,il+nres))**2+ + & (cref(2,jl+nres)-cref(2,il+nres))**2+ + & (cref(3,jl+nres)-cref(3,il+nres))**2) + dijCM=dist(il+nres,jl+nres) + sim = 1.0d0/sigm(d0ijCM) + sim=sim*sim + dd0 = dijCM-d0ijCM + fac = dd0*sim/dijCM*dexp(-0.5d0*dd0*dd0*sim) + do k=1,3 + ddqij = (c(k,il+nres)-c(k,jl+nres))*fac + dxqwol(k,il)=dxqwol(k,il)+ddqij + dxqwol(k,jl)=dxqwol(k,jl)-ddqij + enddo + endif + enddo + enddo + endif + do i=0,nres + do j=1,3 + dqwol(j,i)=dqwol(j,i)/nl + dxqwol(j,i)=dxqwol(j,i)/nl + enddo + enddo + return + end +c------------------------------------------------------------------- + subroutine qwol_num(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + integer seg1,seg2,seg3,seg4 + logical flag + double precision qwolan(3,0:maxres),cdummy(3,0:maxres2), + & qwolxan(3,0:maxres),q1,q2 + double precision delta /1.0d-10/ + do i=0,nres + do j=1,3 + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + cdummy(j,i)=c(j,i) + c(j,i)=c(j,i)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolan(j,i)=(q2-q1)/delta + c(j,i)=cdummy(j,i) + enddo + enddo + do i=0,nres + do j=1,3 + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + cdummy(j,i+nres)=c(j,i+nres) + c(j,i+nres)=c(j,i+nres)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolxan(j,i)=(q2-q1)/delta + c(j,i+nres)=cdummy(j,i+nres) + enddo + enddo +c write(iout,*) "Numerical Q carteisan gradients backbone: " +c do i=0,nct +c write(iout,'(i5,3e15.5)') i, (qwolan(j,i),j=1,3) +c enddo +c write(iout,*) "Numerical Q carteisan gradients side-chain: " +c do i=0,nct +c write(iout,'(i5,3e15.5)') i, (qwolxan(j,i),j=1,3) +c enddo + return + end +c------------------------------------------------------------------------ + subroutine EconstrQ +c MD with umbrella_sampling using Wolyne's distance measure as a constraint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2,hm1,hm2,hmnum + double precision ucdelan,dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES), + & duconst(3,0:MAXRES),duxconst(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ + do i=0,nres + do j=1,3 + duconst(j,i)=0.0d0 + dudconst(j,i)=0.0d0 + duxconst(j,i)=0.0d0 + dudxconst(j,i)=0.0d0 + enddo + enddo + Uconst=0.0d0 + do i=1,nfrag + qfrag(i)=qwolynes(ifrag(1,i,iset),ifrag(2,i,iset),.true. + & ,idummy,idummy) + Uconst=Uconst+wfrag(i,iset)*harmonic(qfrag(i),qinfrag(i,iset)) +c Calculating the derivatives of Constraint energy with respect to Q + Ucdfrag=wfrag(i,iset)*harmonicprim(qfrag(i), + & qinfrag(i,iset)) +c hm1=harmonic(qfrag(i,iset),qinfrag(i,iset)) +c hm2=harmonic(qfrag(i,iset)+delta,qinfrag(i,iset)) +c hmnum=(hm2-hm1)/delta +c write(iout,*) "harmonicprim frag",harmonicprim(qfrag(i,iset), +c & qinfrag(i,iset)) +c write(iout,*) "harmonicnum frag", hmnum +c Calculating the derivatives of Q with respect to cartesian coordinates + call qwolynes_prim(ifrag(1,i,iset),ifrag(2,i,iset),.true. + & ,idummy,idummy) +c write(iout,*) "dqwol " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dqwol(j,ii),j=1,3) +c enddo +c write(iout,*) "dxqwol " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dxqwol(j,ii),j=1,3) +c enddo +c Calculating numerical gradients of dU/dQi and dQi/dxi +c call qwol_num(ifrag(1,i,iset),ifrag(2,i,iset),.true. +c & ,idummy,idummy) +c The gradients of Uconst in Cs + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdfrag*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdfrag*dxqwol(j,ii) + enddo + enddo + enddo + do i=1,npair + kstart=ifrag(1,ipair(1,i,iset),iset) + kend=ifrag(2,ipair(1,i,iset),iset) + lstart=ifrag(1,ipair(2,i,iset),iset) + lend=ifrag(2,ipair(2,i,iset),iset) + qpair(i)=qwolynes(kstart,kend,.false.,lstart,lend) + Uconst=Uconst+wpair(i,iset)*harmonic(qpair(i),qinpair(i,iset)) +c Calculating dU/dQ + Ucdpair=wpair(i,iset)*harmonicprim(qpair(i),qinpair(i,iset)) +c hm1=harmonic(qpair(i),qinpair(i,iset)) +c hm2=harmonic(qpair(i)+delta,qinpair(i,iset)) +c hmnum=(hm2-hm1)/delta +c write(iout,*) "harmonicprim pair ",harmonicprim(qpair(i), +c & qinpair(i,iset)) +c write(iout,*) "harmonicnum pair ", hmnum +c Calculating dQ/dXi + call qwolynes_prim(kstart,kend,.false. + & ,lstart,lend) +c write(iout,*) "dqwol " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dqwol(j,ii),j=1,3) +c enddo +c write(iout,*) "dxqwol " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dxqwol(j,ii),j=1,3) +c enddo +c Calculating numerical gradients +c call qwol_num(kstart,kend,.false. +c & ,lstart,lend) +c The gradients of Uconst in Cs + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdpair*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdpair*dxqwol(j,ii) + enddo + enddo + enddo +c write(iout,*) "Uconst inside subroutine ", Uconst +c Transforming the gradients from Cs to dCs for the backbone + do i=0,nres + do j=i+1,nres + do k=1,3 + dudconst(k,i)=dudconst(k,i)+duconst(k,j)+duxconst(k,j) + enddo + enddo + enddo +c Transforming the gradients from Cs to dCs for the side chains + do i=1,nres + do j=1,3 + dudxconst(j,i)=duxconst(j,i) + enddo + enddo +c write(iout,*) "dU/ddc backbone " +c do ii=0,nres +c write(iout,'(i5,3e15.5)') ii, (dudconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/ddX side chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(duxconst(j,ii),j=1,3) +c enddo +c Calculating numerical gradients of dUconst/ddc and dUconst/ddx +c call dEconstrQ_num + return + end +c----------------------------------------------------------------------- + subroutine dEconstrQ_num +c Calculating numerical dUconst/ddc and dUconst/ddx + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2 + double precision dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ +c For the backbone + do i=0,nres-1 + do j=1,3 + dUcartan(j,i)=0.0d0 + cdummy(j,i)=dc(j,i) + dc(j,i)=dc(j,i)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset),.true. + & ,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)*harmonic(qfrag(ii), + & qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)*harmonic(qpair(ii), + & qinpair(ii,iset)) + enddo + dc(j,i)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset),.true. + & ,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)*harmonic(qfrag(ii), + & qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)*harmonic(qpair(ii), + & qinpair(ii,iset)) + enddo + ducartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo +c Calculating numerical gradients for dU/ddx + do i=0,nres-1 + duxcartan(j,i)=0.0d0 + do j=1,3 + cdummy(j,i)=dc(j,i+nres) + dc(j,i+nres)=dc(j,i+nres)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset),.true. + & ,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)*harmonic(qfrag(ii), + & qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)*harmonic(qpair(ii), + & qinpair(ii,iset)) + enddo + dc(j,i+nres)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset), + & ifrag(2,ii,iset),.true.,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)*harmonic(qfrag(ii), + & qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)*harmonic(qpair(ii), + & qinpair(ii,iset)) + enddo + duxcartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo + write(iout,*) "Numerical dUconst/ddc backbone " + do ii=0,nres + write(iout,'(i5,3e15.5)') ii,(dUcartan(j,ii),j=1,3) + enddo +c write(iout,*) "Numerical dUconst/ddx side-chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dUxcartan(j,ii),j=1,3) +c enddo + return + end +c--------------------------------------------------------------------------- diff --git a/source/unres/src_Eshel/SRC-SURPLUS/q_measure1.F b/source/unres/src_Eshel/SRC-SURPLUS/q_measure1.F new file mode 100644 index 0000000..9c1546d --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/q_measure1.F @@ -0,0 +1,470 @@ + double precision function qwolynes(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.MD' + integer i,j,jl,k,l,il,kl,nl,np,seg1,seg2,seg3,seg4,secseg + integer nsep /3/ + double precision dist,qm + double precision qq,qqij,qqijCM,dij,d0ij,dijCM,d0ijCM + logical lprn /.false./ + logical flag + qq = 0.0d0 + nl=0 + do i=0,nres + do j=1,3 + dqwol(j,i)=0.0d0 + dxqwol(j,i)=0.0d0 + enddo + enddo + if (lprn) then + write (iout,*) "seg1",seg1," seg2",seg2," seg3",seg3," seg4",seg4, + & " flag",flag + call flush(iout) + endif + if (flag) then + do il=seg1+nsep,seg2 + do jl=seg1,il-nsep + nl=nl+1 + if (itype(il).ne.10) then + ilnres=il+nres + else + ilnres=il + endif + if (itype(jl).ne.10) then + jlnres=jl+nres + else + jlnres=jl + endif + qqijCM = qcontrib(il,jl,ilnres,jlnres) + qq = qq+qqijCM + if (lprn) then + write (iout,*) "qqijCM",qqijCM + call flush(iout) + endif + enddo + enddo + if (lprn) then + write (iout,*) "nl",nl," qq",qq + call flush(iout) + endif + else + do il=seg1,seg2 + if((seg3-il).lt.3) then + secseg=il+3 + else + secseg=seg3 + endif + do jl=secseg,seg4 + nl=nl+1 + if (itype(il).ne.10) then + ilnres=il+nres + else + ilnres=il + endif + if (itype(jl).ne.10) then + jlnres=jl+nres + else + jlnres=jl + endif + qqijCM = qcontrib(il,jl,ilnres,jlnres) + qq = qq+qqijCM + if (lprn) then + write (iout,*) "qqijCM",qqijCM + call flush(iout) + endif + enddo + enddo + endif + qq = qq/nl + qwolynes=1.0d0-qq + do i=0,nres + do j=1,3 + dqwol(j,i)=dqwol(j,i)/nl + dxqwol(j,i)=dxqwol(j,i)/nl + enddo + enddo + return + end +c------------------------------------------------------------------- + subroutine qwol_num(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.MD' + integer seg1,seg2,seg3,seg4 + logical flag + double precision qwolan(3,0:maxres),cdummy(3,0:maxres2), + & qwolxan(3,0:maxres),q1,q2 + double precision delta /1.0d-7/ + write (iout,*) "seg1",seg1," seg2",seg2," seg3",seg3," seg4",seg4 + write(iout,*) "dQ/dc backbone " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (dqwol(j,i),j=1,3) + enddo + write(iout,*) "dQ/dX side chain " + do i=1,nres + write(iout,'(i5,3e15.5)') i,(dxqwol(j,i),j=1,3) + enddo + do i=1,nres + do j=1,3 + cdummy(j,i)=c(j,i) + c(j,i)=c(j,i)-delta + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + c(j,i)=cdummy(j,i)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolan(j,i)=0.5d0*(q2-q1)/delta + c(j,i)=cdummy(j,i) +c write (iout,*) "i",i," j",j," q1",q1," a2",q2 + enddo + enddo + do i=1,nres + do j=1,3 + cdummy(j,i+nres)=c(j,i+nres) + c(j,i+nres)=c(j,i+nres)-delta + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + c(j,i+nres)=cdummy(j,i+nres)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolxan(j,i)=0.5d0*(q2-q1)/delta + c(j,i+nres)=cdummy(j,i+nres) + enddo + enddo + write(iout,*) "Numerical Q cartesian gradients backbone: " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (qwolan(j,i),j=1,3) + enddo + write(iout,*) "Numerical Q cartesian gradients side-chain: " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (qwolxan(j,i),j=1,3) + enddo + return + end +c------------------------------------------------------------------------ + subroutine EconstrQ +c MD with umbrella_sampling using Wolyne's distance measure as a constraint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2,hm1,hm2,hmnum + double precision ucdelan,dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES), + & duconst(3,0:MAXRES),duxconst(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ + do i=0,nres + do j=1,3 + duconst(j,i)=0.0d0 + dudconst(j,i)=0.0d0 + duxconst(j,i)=0.0d0 + dudxconst(j,i)=0.0d0 + enddo + enddo + Uconst=0.0d0 + do i=1,nfrag + qfrag(i)=qwolynes(ifrag(1,i,iset),ifrag(2,i,iset),.true. + & ,idummy,idummy) + Uconst=Uconst+wfrag(i,iset)*harmonic(qfrag(i),qinfrag(i,iset)) +c Calculating the derivatives of Constraint energy with respect to Q + Ucdfrag=wfrag(i,iset)*harmonicprim(qfrag(i),qinfrag(i,iset)) +c Calculating the derivatives of Q with respect to cartesian coordinates + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdfrag*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdfrag*dxqwol(j,ii) + enddo + enddo +c write (iout,*) "Calling qwol_num" +c call qwol_num(ifrag(1,i),ifrag(2,i),.true.,idummy,idummy) + enddo + do i=1,npair + kstart=ifrag(1,ipair(1,i,iset),iset) + kend=ifrag(2,ipair(1,i,iset),iset) + lstart=ifrag(1,ipair(2,i,iset),iset) + lend=ifrag(2,ipair(2,i,iset),iset) + qpair(i)=qwolynes(kstart,kend,.false.,lstart,lend) + Uconst=Uconst+wpair(i,iset)*harmonic(qpair(i),qinpair(i,iset)) +c Calculating dU/dQ + Ucdpair=wpair(i,iset)*harmonicprim(qpair(i),qinpair(i,iset)) +c Calculating dQ/dXi + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdpair*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdpair*dxqwol(j,ii) + enddo + enddo + enddo +c write(iout,*) "Uconst inside subroutine ", Uconst +c Transforming the gradients from Cs to dCs for the backbone + do i=0,nres + do j=i+1,nres + do k=1,3 + dudconst(k,i)=dudconst(k,i)+duconst(k,j)+duxconst(k,j) + enddo + enddo + enddo +c Transforming the gradients from Cs to dCs for the side chains + do i=1,nres + do j=1,3 + dudxconst(j,i)=duxconst(j,i) + enddo + enddo +c write(iout,*) "dU/dc backbone " +c do ii=0,nres +c write(iout,'(i5,3e15.5)') ii, (duconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/dX side chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(duxconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/ddc backbone " +c do ii=0,nres +c write(iout,'(i5,3e15.5)') ii, (dudconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/ddX side chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dudxconst(j,ii),j=1,3) +c enddo +c Calculating numerical gradients of dUconst/ddc and dUconst/ddx +c call dEconstrQ_num + return + end +c----------------------------------------------------------------------- + subroutine dEconstrQ_num +c Calculating numerical dUconst/ddc and dUconst/ddx + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2 + double precision dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ +c For the backbone + do i=0,nres-1 + do j=1,3 + dUcartan(j,i)=0.0d0 + cdummy(j,i)=dc(j,i) + dc(j,i)=dc(j,i)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)*harmonic(qfrag(ii), + & qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + dc(j,i)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + ducartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo +c Calculating numerical gradients for dU/ddx + do i=0,nres-1 + do j=1,3 + duxcartan(j,i)=0.0d0 + enddo + do j=1,3 + cdummy(j,i)=dc(j,i+nres) + dc(j,i+nres)=dc(j,i+nres)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + dc(j,i+nres)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + duxcartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo + write(iout,*) "Numerical dUconst/ddc backbone " + do ii=0,nres + write(iout,'(i5,3e15.5)') ii,(dUcartan(j,ii),j=1,3) + enddo + write(iout,*) "Numerical dUconst/ddx side-chain " + do ii=1,nres + write(iout,'(i5,3e15.5)') ii,(dUxcartan(j,ii),j=1,3) + enddo + return + end +c--------------------------------------------------------------------------- + double precision function qcontrib(il,jl,il1,jl1) + implicit none + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.MD' + integer i,j,k,il,jl,il1,jl1,nd + double precision dist + external dist + double precision dij1,dij2,dij3,dij4,d0ij1,d0ij2,d0ij3,d0ij4,fac, + & fac1,ddave,ssij,ddqij + logical lprn /.false./ + d0ij1=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij1=dist(il,jl) + ddave=(dij1-d0ij1)**2 + nd=1 + if (jl1.ne.jl) then + d0ij2=dsqrt((cref(1,jl1)-cref(1,il))**2+ + & (cref(2,jl1)-cref(2,il))**2+ + & (cref(3,jl1)-cref(3,il))**2) + dij2=dist(il,jl1) + ddave=ddave+(dij2-d0ij2)**2 + nd=nd+1 + endif + if (il1.ne.il) then + d0ij3=dsqrt((cref(1,jl)-cref(1,il1))**2+ + & (cref(2,jl)-cref(2,il1))**2+ + & (cref(3,jl)-cref(3,il1))**2) + dij3=dist(il1,jl) + ddave=ddave+(dij3-d0ij3)**2 + nd=nd+1 + endif + if (il1.ne.il .and. jl1.ne.jl) then + d0ij4=dsqrt((cref(1,jl1)-cref(1,il1))**2+ + & (cref(2,jl1)-cref(2,il1))**2+ + & (cref(3,jl1)-cref(3,il1))**2) + dij4=dist(il1,jl1) + ddave=ddave+(dij4-d0ij4)**2 + nd=nd+1 + endif + ddave=ddave/nd + if (lprn) then + write (iout,*) "il",il," jl",jl, + & " itype",itype(il),itype(jl)," nd",nd + write (iout,*)"d0ij",d0ij1,d0ij2,d0ij3,d0ij4, + & " dij",dij1,dij2,dij3,dij4," ddave",ddave + call flush(iout) + endif +c ssij = (0.25d0*d0ij1)**2 + if (il.ne.il1 .and. jl.ne.jl1) then + ssij = 16.0d0/(d0ij1*d0ij4) + else + ssij = 16.0d0/(d0ij1*d0ij1) + endif + qcontrib = dexp(-0.5d0*ddave*ssij) +c Compute gradient + fac1 = qcontrib*ssij/nd + fac = fac1*(dij1-d0ij1)/dij1 + do k=1,3 + ddqij = (c(k,il)-c(k,jl))*fac + dqwol(k,il)=dqwol(k,il)+ddqij + dqwol(k,jl)=dqwol(k,jl)-ddqij + enddo + if (jl1.ne.jl) then + fac = fac1*(dij2-d0ij2)/dij2 + do k=1,3 + ddqij = (c(k,il)-c(k,jl1))*fac + dqwol(k,il)=dqwol(k,il)+ddqij + dxqwol(k,jl)=dxqwol(k,jl)-ddqij + enddo + endif + if (il1.ne.il) then + fac = fac1*(dij3-d0ij3)/dij3 + do k=1,3 + ddqij = (c(k,il1)-c(k,jl))*fac + dxqwol(k,il)=dxqwol(k,il)+ddqij + dqwol(k,jl)=dqwol(k,jl)-ddqij + enddo + endif + if (il1.ne.il .and. jl1.ne.jl) then + fac = fac1*(dij4-d0ij4)/dij4 + do k=1,3 + ddqij = (c(k,il1)-c(k,jl1))*fac + dxqwol(k,il)=dxqwol(k,il)+ddqij + dxqwol(k,jl)=dxqwol(k,jl)-ddqij + enddo + endif + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/q_measure3.F b/source/unres/src_Eshel/SRC-SURPLUS/q_measure3.F new file mode 100644 index 0000000..f0a030e --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/q_measure3.F @@ -0,0 +1,529 @@ + double precision function qwolynes(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.MD' + integer i,j,jl,k,l,il,kl,nl,np,seg1,seg2,seg3,seg4,secseg + integer nsep /3/ + double precision dist,qm + double precision qq,qqij,qqijCM,dij,d0ij,dijCM,d0ijCM + logical lprn /.false./ + logical flag + qq = 0.0d0 + nl=0 + do i=0,nres + do j=1,3 + dqwol(j,i)=0.0d0 + dxqwol(j,i)=0.0d0 + enddo + enddo + if (lprn) then + write (iout,*) "seg1",seg1," seg2",seg2," seg3",seg3," seg4",seg4, + & " flag",flag + call flush(iout) + endif + if (flag) then + do il=seg1+nsep,seg2 + do jl=seg1,il-nsep + nl=nl+1 + if (itype(il).ne.10) then + ilnres=il+nres + else + ilnres=il + endif + if (itype(jl).ne.10) then + jlnres=jl+nres + else + jlnres=jl + endif + qqijCM = qcontrib(il,jl,ilnres,jlnres) + qq = qq+qqijCM + if (lprn) then + write (iout,*) "qqijCM",qqijCM + call flush(iout) + endif + enddo + enddo + if (lprn) then + write (iout,*) "nl",nl," qq",qq + call flush(iout) + endif + else + do il=seg1,seg2 + if((seg3-il).lt.3) then + secseg=il+3 + else + secseg=seg3 + endif + do jl=secseg,seg4 + nl=nl+1 + if (itype(il).ne.10) then + ilnres=il+nres + else + ilnres=il + endif + if (itype(jl).ne.10) then + jlnres=jl+nres + else + jlnres=jl + endif + qqijCM = qcontrib(il,jl,ilnres,jlnres) + qq = qq+qqijCM + if (lprn) then + write (iout,*) "qqijCM",qqijCM + call flush(iout) + endif + enddo + enddo + endif + qq = qq/nl + qwolynes=1.0d0-qq + do i=0,nres + do j=1,3 + dqwol(j,i)=dqwol(j,i)/nl + dxqwol(j,i)=dxqwol(j,i)/nl + enddo + enddo + return + end +c------------------------------------------------------------------- + subroutine qwol_num(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.MD' + integer seg1,seg2,seg3,seg4 + logical flag + double precision qwolan(3,0:maxres),cdummy(3,0:maxres2), + & qwolxan(3,0:maxres),q1,q2 + double precision delta /1.0d-7/ + write (iout,*) "seg1",seg1," seg2",seg2," seg3",seg3," seg4",seg4 + write(iout,*) "dQ/dc backbone " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (dqwol(j,i),j=1,3) + enddo + write(iout,*) "dQ/dX side chain " + do i=1,nres + write(iout,'(i5,3e15.5)') i,(dxqwol(j,i),j=1,3) + enddo + do i=1,nres + do j=1,3 + cdummy(j,i)=c(j,i) + c(j,i)=c(j,i)-delta + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + c(j,i)=cdummy(j,i)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolan(j,i)=0.5d0*(q2-q1)/delta + c(j,i)=cdummy(j,i) +c write (iout,*) "i",i," j",j," q1",q1," a2",q2 + enddo + enddo + do i=1,nres + do j=1,3 + cdummy(j,i+nres)=c(j,i+nres) + c(j,i+nres)=c(j,i+nres)-delta + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + c(j,i+nres)=cdummy(j,i+nres)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolxan(j,i)=0.5d0*(q2-q1)/delta + c(j,i+nres)=cdummy(j,i+nres) + enddo + enddo + write(iout,*) "Numerical Q cartesian gradients backbone: " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (qwolan(j,i),j=1,3) + enddo + write(iout,*) "Numerical Q cartesian gradients side-chain: " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (qwolxan(j,i),j=1,3) + enddo + return + end +c------------------------------------------------------------------------ + subroutine EconstrQ +c MD with umbrella_sampling using Wolyne's distance measure as a constraint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2,hm1,hm2,hmnum + double precision ucdelan,dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES), + & duconst(3,0:MAXRES),duxconst(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ + do i=0,nres + do j=1,3 + duconst(j,i)=0.0d0 + dudconst(j,i)=0.0d0 + duxconst(j,i)=0.0d0 + dudxconst(j,i)=0.0d0 + enddo + enddo + Uconst=0.0d0 + do i=1,nfrag + qfrag(i)=qwolynes(ifrag(1,i,iset),ifrag(2,i,iset),.true. + & ,idummy,idummy) + Uconst=Uconst+wfrag(i,iset)*harmonic(qfrag(i),qinfrag(i,iset)) +c Calculating the derivatives of Constraint energy with respect to Q + Ucdfrag=wfrag(i,iset)*harmonicprim(qfrag(i),qinfrag(i,iset)) +c Calculating the derivatives of Q with respect to cartesian coordinates + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdfrag*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdfrag*dxqwol(j,ii) + enddo + enddo +c write (iout,*) "Calling qwol_num" +c call qwol_num(ifrag(1,i,iset),ifrag(2,i,iset),.true.,idummy,idummy) + enddo +c stop + do i=1,npair + kstart=ifrag(1,ipair(1,i,iset),iset) + kend=ifrag(2,ipair(1,i,iset),iset) + lstart=ifrag(1,ipair(2,i,iset),iset) + lend=ifrag(2,ipair(2,i,iset),iset) + qpair(i)=qwolynes(kstart,kend,.false.,lstart,lend) + Uconst=Uconst+wpair(i,iset)*harmonic(qpair(i),qinpair(i,iset)) +c Calculating dU/dQ + Ucdpair=wpair(i,iset)*harmonicprim(qpair(i),qinpair(i,iset)) +c Calculating dQ/dXi + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdpair*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdpair*dxqwol(j,ii) + enddo + enddo + enddo +c write(iout,*) "Uconst inside subroutine ", Uconst +c Transforming the gradients from Cs to dCs for the backbone + do i=0,nres + do j=i+1,nres + do k=1,3 + dudconst(k,i)=dudconst(k,i)+duconst(k,j)+duxconst(k,j) + enddo + enddo + enddo +c Transforming the gradients from Cs to dCs for the side chains + do i=1,nres + do j=1,3 + dudxconst(j,i)=duxconst(j,i) + enddo + enddo +c write(iout,*) "dU/dc backbone " +c do ii=0,nres +c write(iout,'(i5,3e15.5)') ii, (duconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/dX side chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(duxconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/ddc backbone " +c do ii=0,nres +c write(iout,'(i5,3e15.5)') ii, (dudconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/ddX side chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dudxconst(j,ii),j=1,3) +c enddo +c Calculating numerical gradients of dUconst/ddc and dUconst/ddx +c call dEconstrQ_num + return + end +c----------------------------------------------------------------------- + subroutine dEconstrQ_num +c Calculating numerical dUconst/ddc and dUconst/ddx + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2 + double precision dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ +c For the backbone + do i=0,nres-1 + do j=1,3 + dUcartan(j,i)=0.0d0 + cdummy(j,i)=dc(j,i) + dc(j,i)=dc(j,i)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + dc(j,i)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + ducartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo +c Calculating numerical gradients for dU/ddx + do i=0,nres-1 + do j=1,3 + duxcartan(j,i)=0.0d0 + enddo + do j=1,3 + cdummy(j,i)=dc(j,i+nres) + dc(j,i+nres)=dc(j,i+nres)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + dc(j,i+nres)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + duxcartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo + write(iout,*) "Numerical dUconst/ddc backbone " + do ii=0,nres + write(iout,'(i5,3e15.5)') ii,(dUcartan(j,ii),j=1,3) + enddo + write(iout,*) "Numerical dUconst/ddx side-chain " + do ii=1,nres + write(iout,'(i5,3e15.5)') ii,(dUxcartan(j,ii),j=1,3) + enddo + return + end +c--------------------------------------------------------------------------- + double precision function qcontrib(il,jl,il1,jl1) + implicit none + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.LOCAL' + integer i,j,k,il,jl,il1,jl1,nd,itl,jtl + double precision dist + external dist + double precision dij,dij1,d0ij,d0ij1,om1,om2,om12,om10,om20,om120 + & ,fac,fac1,ddave,ssij,ddqij,d0ii1,d0jj1,rij,eom1,eom2,eom12 + double precision u(3),v(3),er(3),er0(3),dcosom1(3),dcosom2(3), + & aux1,aux2 + double precision scalar + external scalar + logical lprn /.false./ + if (lprn) write (iout,*) "il",il," jl",jl," il1",il1," jl1",jl1 + d0ij=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij=dist(il,jl) + dij1=dist(il1,jl1) + do i=1,3 + er(i)=(c(i,jl1)-c(i,il1))/dij1 + enddo + do i=1,3 + er0(i)=cref(i,jl1)-cref(i,il1) + enddo + d0ij1=dsqrt(scalar(er0,er0)) + do i=1,3 + er0(i)=er0(i)/d0ij1 + enddo + if (il.ne.il1 .or. jl.ne.jl1) then + ddave=0.5d0*((dij-d0ij)**2+(dij1-d0ij1)**2) + nd=2 + else + ddave=(dij-d0ij)**2 + nd=1 + endif + if (il.ne.il1) then + do i=1,3 + u(i)=cref(i,il1)-cref(i,il) + enddo + d0ii1=dsqrt(scalar(u,u)) + do i=1,3 + u(i)=u(i)/d0ii1 + enddo + if (lprn) then + write (iout,*) "u",(u(i),i=1,3) + write (iout,*) "er0",(er0(i),i=1,3) + om10=scalar(er0,u) + om1=scalar(er,dc_norm(1,il1)) + write (iout,*) "om10",om10," om1",om1 + endif + else + om1=0.0d0 + om10=0.0d0 + endif + if (jl.ne.jl1) then + do i=1,3 + v(i)=cref(i,jl1)-cref(i,jl) + enddo + d0jj1=dsqrt(scalar(v,v)) + do i=1,3 + v(i)=v(i)/d0jj1 + enddo + if (lprn) then + write (iout,*) "v",(v(i),i=1,3) + write (iout,*) "er0",(er0(i),i=1,3) + om20=scalar(er,v) + om2=scalar(er,dc_norm(1,jl1)) + write (iout,*) "om20",om20," om2",om2 + endif + else + om2=0.0d0 + om20=0.0d0 + endif + if (il.ne.il1 .and. jl.ne.jl1) then + om120=scalar(u,v) + om12=scalar(dc_norm(1,il1),dc_norm(1,jl1)) + else + om12=0.0d0 + om120=0.0d0 + endif + if (lprn) then + write (iout,*) "il",il," jl",jl,itype(il),itype(jl) + write (iout,*)"d0ij",d0ij," om10",om10," om20",om20, + & " om120",om120, + & " dij",dij," om1",om1," om2",om2," om12",om12 + call flush(iout) + endif + ssij = 16.0d0/(d0ij*d0ij) + qcontrib = dexp(-0.5d0*(ddave*ssij+((om1-om10)**2 + & +(om2-om20)**2+(om12-om120)**2))) + if (lprn) write (iout,*) "ssij",ssij," qcontrib",qcontrib +c qcontrib = dexp(-0.5d0*(ddave*ssij)+(om1-om10)**2+(om2-om20)**2) +c qcontrib = dexp(-0.5d0*(ddave*ssij)) +c Compute gradient - radial component + fac1 = qcontrib*ssij/nd + fac = fac1*(dij-d0ij)/dij + do k=1,3 + ddqij = (c(k,il)-c(k,jl))*fac + dqwol(k,il)=dqwol(k,il)+ddqij + dqwol(k,jl)=dqwol(k,jl)-ddqij + enddo + if (il1.ne.il .or. jl1.ne.jl) then + fac = fac1*(dij1-d0ij1)/dij1 + do k=1,3 + ddqij = (c(k,il1)-c(k,jl1))*fac + if (il1.ne.il) then + dxqwol(k,il)=dxqwol(k,il)+ddqij + else + dqwol(k,il)=dqwol(k,il)+ddqij + endif + if (jl1.ne.jl) then + dxqwol(k,jl)=dxqwol(k,jl)-ddqij + else + dqwol(k,jl)=dqwol(k,jl)-ddqij + endif + enddo + endif +c return +c Orientational contributions + rij=1.0d0/dij1 + eom1=qcontrib*(om1-om10) + eom2=qcontrib*(om2-om20) + eom12=qcontrib*(om12-om120) + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,il1)-om1*er(k)) + dcosom2(k)=rij*(dc_norm(k,jl1)-om2*er(k)) + enddo + do k=1,3 + ddqij=eom1*dcosom1(k)+eom2*dcosom2(k) + aux1=(eom12*(dc_norm(k,jl1)-om12*dc_norm(k,il1)) + & +eom1*(er(k)-om1*dc_norm(k,il1)))*vbld_inv(il1) + aux2=(eom12*(dc_norm(k,il1)-om12*dc_norm(k,jl1)) + & +eom2*(er(k)-om2*dc_norm(k,jl1)))*vbld_inv(jl1) + dqwol(k,il)=dqwol(k,il)-ddqij-aux1 + dqwol(k,jl)=dqwol(k,jl)+ddqij-aux2 + dxqwol(k,il)=dxqwol(k,il)-ddqij+aux1 +c & +(eom12*(dc_norm(k,jl1)-om12*dc_norm(k,il1)) +c & +eom1*(er(k)-om1*dc_norm(k,il1)))*vbld_inv(il1) + dxqwol(k,jl)=dxqwol(k,jl)+ddqij+aux2 +c & +(eom12*(dc_norm(k,il1)-om12*dc_norm(k,jl1)) +c & +eom2*(er(k)-om2*dc_norm(k,jl1)))*vbld_inv(jl1) + enddo + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/rattle.F b/source/unres/src_Eshel/SRC-SURPLUS/rattle.F new file mode 100644 index 0000000..a2e5034 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/rattle.F @@ -0,0 +1,706 @@ + subroutine rattle1 +c RATTLE algorithm for velocity Verlet - step 1, UNRES +c AL 9/24/04 + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision gginv(maxres2,maxres2), + & gdc(3,MAXRES2,MAXRES2),dC_uncor(3,MAXRES2), + & Cmat(MAXRES2,MAXRES2),x(MAXRES2),xcorr(3,MAXRES2) + common /przechowalnia/ GGinv,gdc,Cmat,nbond + integer max_rattle /5/ + logical lprn /.false./, lprn1 /.false./,not_done + double precision tol_rattle /1.0d-5/ + if (lprn) write (iout,*) "RATTLE1" + nbond=nct-nnt + do i=nnt,nct + if (itype(i).ne.10) nbond=nbond+1 + enddo +c Make a folded form of the Ginv-matrix + ind=0 + ii=0 + do i=nnt,nct-1 + ii=ii+1 + do j=1,3 + ind=ind+1 + ind1=0 + jj=0 + do k=nnt,nct-1 + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1) + enddo + endif + enddo + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ii=ii+1 + do j=1,3 + ind=ind+1 + ind1=0 + jj=0 + do k=nnt,nct-1 + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1) + enddo + endif + enddo + enddo + endif + enddo + if (lprn1) then + write (iout,*) "Matrix GGinv" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv) + endif + not_done=.true. + iter=0 + do while (not_done) + iter=iter+1 + if (iter.gt.max_rattle) then + write (iout,*) "Error - too many iterations in RATTLE." + stop + endif +c Calculate the matrix C = GG**(-1) dC_old o dC + ind1=0 + do i=nnt,nct-1 + ind1=ind1+1 + do j=1,3 + dC_uncor(j,ind1)=dC(j,i) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind1=ind1+1 + do j=1,3 + dC_uncor(j,ind1)=dC(j,i+nres) + enddo + endif + enddo + do i=1,nbond + ind=0 + do k=nnt,nct-1 + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres) + enddo + endif + enddo + enddo +c Calculate deviations from standard virtual-bond lengths + ind=0 + do i=nnt,nct-1 + ind=ind+1 + x(ind)=vbld(i+1)**2-vbl**2 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i))**2 + endif + enddo + if (lprn) then + write (iout,*) "Coordinates and violations" + do i=1,nbond + write(iout,'(i5,3f10.5,5x,e15.5)') + & i,(dC_uncor(j,i),j=1,3),x(i) + enddo + write (iout,*) "Velocities and violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i+nres,ind,(d_t_new(j,i+nres),j=1,3), + & scalar(d_t_new(1,i+nres),dC_old(1,i+nres)) + endif + enddo +c write (iout,*) "gdc" +c do i=1,nbond +c write (iout,*) "i",i +c do j=1,nbond +c write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3) +c enddo +c enddo + endif + xmax=dabs(x(1)) + do i=2,nbond + if (dabs(x(i)).gt.xmax) then + xmax=dabs(x(i)) + endif + enddo + if (xmax.lt.tol_rattle) then + not_done=.false. + goto 100 + endif +c Calculate the matrix of the system of equations + do i=1,nbond + do j=1,nbond + Cmat(i,j)=0.0d0 + do k=1,3 + Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix Cmat" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat) + endif + call gauss(Cmat,X,MAXRES2,nbond,1,*10) +c Add constraint term to positions + ind=0 + do i=nnt,nct-1 + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + xx=0.5d0*xx + dC(j,i)=dC(j,i)-xx + d_t_new(j,i)=d_t_new(j,i)-xx/d_time + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + xx=0.5d0*xx + dC(j,i+nres)=dC(j,i+nres)-xx + d_t_new(j,i+nres)=d_t_new(j,i+nres)-xx/d_time + enddo + endif + enddo +c Rebuild the chain using the new coordinates + call chainbuild_cart + if (lprn) then + write (iout,*) "New coordinates, Lagrange multipliers,", + & " and differences between actual and standard bond lengths" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + xx=vbld(i+1)**2-vbl**2 + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i),j=1,3),x(ind),xx + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + xx=vbld(i+nres)**2-vbldsc0(1,itype(i))**2 + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i+nres),j=1,3),x(ind),xx + endif + enddo + write (iout,*) "Velocities and violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i+nres,ind,(d_t_new(j,i+nres),j=1,3), + & scalar(d_t_new(1,i+nres),dC_old(1,i+nres)) + endif + enddo + endif + enddo + 100 continue + return + 10 write (iout,*) "Error - singularity in solving the system", + & " of equations for Lagrange multipliers." + stop + end +c------------------------------------------------------------------------------ + subroutine rattle2 +c RATTLE algorithm for velocity Verlet - step 2, UNRES +c AL 9/24/04 + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision gginv(maxres2,maxres2), + & gdc(3,MAXRES2,MAXRES2),dC_uncor(3,MAXRES2), + & Cmat(MAXRES2,MAXRES2),x(MAXRES2) + common /przechowalnia/ GGinv,gdc,Cmat,nbond + integer max_rattle /5/ + logical lprn /.false./, lprn1 /.false./,not_done + double precision tol_rattle /1.0d-5/ + if (lprn) write (iout,*) "RATTLE2" + if (lprn) write (iout,*) "Velocity correction" +c Calculate the matrix G dC + do i=1,nbond + ind=0 + do k=nnt,nct-1 + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC(j,k) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC(j,k+nres) + enddo + endif + enddo + enddo +c if (lprn) then +c write (iout,*) "gdc" +c do i=1,nbond +c write (iout,*) "i",i +c do j=1,nbond +c write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3) +c enddo +c enddo +c endif +c Calculate the matrix of the system of equations + ind=0 + do i=nnt,nct-1 + ind=ind+1 + do j=1,nbond + Cmat(ind,j)=0.0d0 + do k=1,3 + Cmat(ind,j)=Cmat(ind,j)+dC(k,i)*gdc(k,ind,j) + enddo + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + do j=1,nbond + Cmat(ind,j)=0.0d0 + do k=1,3 + Cmat(ind,j)=Cmat(ind,j)+dC(k,i+nres)*gdc(k,ind,j) + enddo + enddo + endif + enddo +c Calculate the scalar product dC o d_t_new + ind=0 + do i=nnt,nct-1 + ind=ind+1 + x(ind)=scalar(d_t(1,i),dC(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + x(ind)=scalar(d_t(1,i+nres),dC(1,i+nres)) + endif + enddo + if (lprn) then + write (iout,*) "Velocities and violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i,ind,(d_t(j,i),j=1,3),x(ind) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind) + endif + enddo + endif + xmax=dabs(x(1)) + do i=2,nbond + if (dabs(x(i)).gt.xmax) then + xmax=dabs(x(i)) + endif + enddo + if (xmax.lt.tol_rattle) then + not_done=.false. + goto 100 + endif + if (lprn1) then + write (iout,*) "Matrix Cmat" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat) + endif + call gauss(Cmat,X,MAXRES2,nbond,1,*10) +c Add constraint term to velocities + ind=0 + do i=nnt,nct-1 + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + d_t(j,i)=d_t(j,i)-xx + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + d_t(j,i+nres)=d_t(j,i+nres)-xx + enddo + endif + enddo + if (lprn) then + write (iout,*) + & "New velocities, Lagrange multipliers violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + if (lprn) write (iout,'(2i5,3f10.5,5x,2e15.5)') + & i,ind,(d_t(j,i),j=1,3),x(ind),scalar(d_t(1,i),dC(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,2e15.5)') + & i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind), + & scalar(d_t(1,i+nres),dC(1,i+nres)) + endif + enddo + endif + 100 continue + return + 10 write (iout,*) "Error - singularity in solving the system", + & " of equations for Lagrange multipliers." + stop + end +c------------------------------------------------------------------------------ + subroutine rattle_brown +c RATTLE/LINCS algorithm for Brownian dynamics, UNRES +c AL 9/24/04 + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision gginv(maxres2,maxres2), + & gdc(3,MAXRES2,MAXRES2),dC_uncor(3,MAXRES2), + & Cmat(MAXRES2,MAXRES2),x(MAXRES2) + common /przechowalnia/ GGinv,gdc,Cmat,nbond + integer max_rattle /5/ + logical lprn /.true./, lprn1 /.true./,not_done + double precision tol_rattle /1.0d-5/ + if (lprn) write (iout,*) "RATTLE_BROWN" + nbond=nct-nnt + do i=nnt,nct + if (itype(i).ne.10) nbond=nbond+1 + enddo +c Make a folded form of the Ginv-matrix + ind=0 + ii=0 + do i=nnt,nct-1 + ii=ii+1 + do j=1,3 + ind=ind+1 + ind1=0 + jj=0 + do k=nnt,nct-1 + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1) + enddo + endif + enddo + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ii=ii+1 + do j=1,3 + ind=ind+1 + ind1=0 + jj=0 + do k=nnt,nct-1 + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1)GGinv(ii,jj)=fricmat(ind,ind1) + enddo + endif + enddo + enddo + endif + enddo + if (lprn1) then + write (iout,*) "Matrix GGinv" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv) + endif + not_done=.true. + iter=0 + do while (not_done) + iter=iter+1 + if (iter.gt.max_rattle) then + write (iout,*) "Error - too many iterations in RATTLE." + stop + endif +c Calculate the matrix C = GG**(-1) dC_old o dC + ind1=0 + do i=nnt,nct-1 + ind1=ind1+1 + do j=1,3 + dC_uncor(j,ind1)=dC(j,i) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind1=ind1+1 + do j=1,3 + dC_uncor(j,ind1)=dC(j,i+nres) + enddo + endif + enddo + do i=1,nbond + ind=0 + do k=nnt,nct-1 + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres) + enddo + endif + enddo + enddo +c Calculate deviations from standard virtual-bond lengths + ind=0 + do i=nnt,nct-1 + ind=ind+1 + x(ind)=vbld(i+1)**2-vbl**2 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i))**2 + endif + enddo + if (lprn) then + write (iout,*) "Coordinates and violations" + do i=1,nbond + write(iout,'(i5,3f10.5,5x,e15.5)') + & i,(dC_uncor(j,i),j=1,3),x(i) + enddo + write (iout,*) "Velocities and violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i,ind,(d_t(j,i),j=1,3),scalar(d_t(1,i),dC_old(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i+nres,ind,(d_t(j,i+nres),j=1,3), + & scalar(d_t(1,i+nres),dC_old(1,i+nres)) + endif + enddo + write (iout,*) "gdc" + do i=1,nbond + write (iout,*) "i",i + do j=1,nbond + write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3) + enddo + enddo + endif + xmax=dabs(x(1)) + do i=2,nbond + if (dabs(x(i)).gt.xmax) then + xmax=dabs(x(i)) + endif + enddo + if (xmax.lt.tol_rattle) then + not_done=.false. + goto 100 + endif +c Calculate the matrix of the system of equations + do i=1,nbond + do j=1,nbond + Cmat(i,j)=0.0d0 + do k=1,3 + Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix Cmat" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat) + endif + call gauss(Cmat,X,MAXRES2,nbond,1,*10) +c Add constraint term to positions + ind=0 + do i=nnt,nct-1 + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + xx=-0.5d0*xx + d_t(j,i)=d_t(j,i)+xx/d_time + dC(j,i)=dC(j,i)+xx + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + xx=-0.5d0*xx + d_t(j,i+nres)=d_t(j,i+nres)+xx/d_time + dC(j,i+nres)=dC(j,i+nres)+xx + enddo + endif + enddo +c Rebuild the chain using the new coordinates + call chainbuild_cart + if (lprn) then + write (iout,*) "New coordinates, Lagrange multipliers,", + & " and differences between actual and standard bond lengths" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + xx=vbld(i+1)**2-vbl**2 + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i),j=1,3),x(ind),xx + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + xx=vbld(i+nres)**2-vbldsc0(1,itype(i))**2 + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i+nres),j=1,3),x(ind),xx + endif + enddo + write (iout,*) "Velocities and violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i+nres,ind,(d_t_new(j,i+nres),j=1,3), + & scalar(d_t_new(1,i+nres),dC_old(1,i+nres)) + endif + enddo + endif + enddo + 100 continue + return + 10 write (iout,*) "Error - singularity in solving the system", + & " of equations for Lagrange multipliers." + stop + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/sort.f b/source/unres/src_Eshel/SRC-SURPLUS/sort.f new file mode 100644 index 0000000..46b43d9 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/sort.f @@ -0,0 +1,589 @@ +c +c +c ################################################### +c ## COPYRIGHT (C) 1990 by Jay William Ponder ## +c ## All Rights Reserved ## +c ################################################### +c +c ######################################################### +c ## ## +c ## subroutine sort -- heapsort of an integer array ## +c ## ## +c ######################################################### +c +c +c "sort" takes an input list of integers and sorts it +c into ascending order using the Heapsort algorithm +c +c + subroutine sort (n,list) + implicit none + integer i,j,k,n + integer index,lists + integer list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end +c +c +c ############################################################## +c ## ## +c ## subroutine sort2 -- heapsort of real array with keys ## +c ## ## +c ############################################################## +c +c +c "sort2" takes an input list of reals and sorts it +c into ascending order using the Heapsort algorithm; +c it also returns a key into the original ordering +c +c + subroutine sort2 (n,list,key) + implicit none + integer i,j,k,n + integer index,keys + integer key(*) + real*8 lists + real*8 list(*) +c +c +c initialize index into the original ordering +c + do i = 1, n + key(i) = i + end do +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + keys = key(k) + else + lists = list(index) + keys = key(index) + list(index) = list(1) + key(index) = key(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + key(1) = keys + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + key(i) = key(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + key(i) = keys + end do + return + end +c +c +c ################################################################# +c ## ## +c ## subroutine sort3 -- heapsort of integer array with keys ## +c ## ## +c ################################################################# +c +c +c "sort3" takes an input list of integers and sorts it +c into ascending order using the Heapsort algorithm; +c it also returns a key into the original ordering +c +c + subroutine sort3 (n,list,key) + implicit none + integer i,j,k,n + integer index + integer lists + integer keys + integer list(*) + integer key(*) +c +c +c initialize index into the original ordering +c + do i = 1, n + key(i) = i + end do +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + keys = key(k) + else + lists = list(index) + keys = key(index) + list(index) = list(1) + key(index) = key(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + key(1) = keys + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + key(i) = key(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + key(i) = keys + end do + return + end +c +c +c ################################################################# +c ## ## +c ## subroutine sort4 -- heapsort of integer absolute values ## +c ## ## +c ################################################################# +c +c +c "sort4" takes an input list of integers and sorts it into +c ascending absolute value using the Heapsort algorithm +c +c + subroutine sort4 (n,list) + implicit none + integer i,j,k,n + integer index + integer lists + integer list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (abs(list(j)) .lt. abs(list(j+1))) j = j + 1 + end if + if (abs(lists) .lt. abs(list(j))) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end +c +c +c ################################################################ +c ## ## +c ## subroutine sort5 -- heapsort of integer array modulo m ## +c ## ## +c ################################################################ +c +c +c "sort5" takes an input list of integers and sorts it +c into ascending order based on each value modulo "m" +c +c + subroutine sort5 (n,list,m) + implicit none + integer i,j,k,m,n + integer index,smod + integer jmod,j1mod + integer lists + integer list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + jmod = mod(list(j),m) + j1mod = mod(list(j+1),m) + if (jmod .lt. j1mod) then + j = j + 1 + else if (jmod.eq.j1mod .and. list(j).lt.list(j+1)) then + j = j + 1 + end if + end if + smod = mod(lists,m) + jmod = mod(list(j),m) + if (smod .lt. jmod) then + list(i) = list(j) + i = j + j = j + j + else if (smod.eq.jmod .and. lists.lt.list(j)) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end +c +c +c ############################################################# +c ## ## +c ## subroutine sort6 -- heapsort of a text string array ## +c ## ## +c ############################################################# +c +c +c "sort6" takes an input list of character strings and sorts +c it into alphabetical order using the Heapsort algorithm +c +c + subroutine sort6 (n,list) + implicit none + integer i,j,k,n + integer index + character*256 lists + character*(*) list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end +c +c +c ################################################################ +c ## ## +c ## subroutine sort7 -- heapsort of text strings with keys ## +c ## ## +c ################################################################ +c +c +c "sort7" takes an input list of character strings and sorts it +c into alphabetical order using the Heapsort algorithm; it also +c returns a key into the original ordering +c +c + subroutine sort7 (n,list,key) + implicit none + integer i,j,k,n + integer index + integer keys + integer key(*) + character*256 lists + character*(*) list(*) +c +c +c initialize index into the original ordering +c + do i = 1, n + key(i) = i + end do +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + keys = key(k) + else + lists = list(index) + keys = key(index) + list(index) = list(1) + key(index) = key(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + key(1) = keys + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + key(i) = key(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + key(i) = keys + end do + return + end +c +c +c ######################################################### +c ## ## +c ## subroutine sort8 -- heapsort to unique integers ## +c ## ## +c ######################################################### +c +c +c "sort8" takes an input list of integers and sorts it into +c ascending order using the Heapsort algorithm, duplicate +c values are removed from the final sorted list +c +c + subroutine sort8 (n,list) + implicit none + integer i,j,k,n + integer index + integer lists + integer list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists +c +c remove duplicate values from final list +c + j = 1 + do i = 2, n + if (list(i-1) .ne. list(i)) then + j = j + 1 + list(j) = list(i) + end if + end do + if (j .lt. n) n = j + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end +c +c +c ############################################################# +c ## ## +c ## subroutine sort9 -- heapsort to unique text strings ## +c ## ## +c ############################################################# +c +c +c "sort9" takes an input list of character strings and sorts +c it into alphabetical order using the Heapsort algorithm, +c duplicate values are removed from the final sorted list +c +c + subroutine sort9 (n,list) + implicit none + integer i,j,k,n + integer index + character*256 lists + character*(*) list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists +c +c remove duplicate values from final list +c + j = 1 + do i = 2, n + if (list(i-1) .ne. list(i)) then + j = j + 1 + list(j) = list(i) + end if + end do + if (j .lt. n) n = j + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/stochfric.F b/source/unres/src_Eshel/SRC-SURPLUS/stochfric.F new file mode 100644 index 0000000..74eda61 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/stochfric.F @@ -0,0 +1,626 @@ + subroutine friction_force + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.IOUNITS' + double precision gamvec(MAXRES6) + common /syfek/ gamvec + double precision vv(3),vvtot(3,maxres),v_work(MAXRES6), + & ginvfric(maxres2,maxres2) + common /przechowalnia/ ginvfric + + logical lprn /.false./, checkmode /.false./ + + do i=0,MAXRES2 + do j=1,3 + friction(j,i)=0.0d0 + enddo + enddo + + do j=1,3 + d_t_work(j)=d_t(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + d_t_work(ind+j)=d_t(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + d_t_work(ind+j)=d_t(j,i+nres) + enddo + ind=ind+3 + endif + enddo + + call fricmat_mult(d_t_work,fric_work) + + if (.not.checkmode) return + + if (lprn) then + write (iout,*) "d_t_work and fric_work" + do i=1,3*dimen + write (iout,'(i3,2e15.5)') i,d_t_work(i),fric_work(i) + enddo + endif + do j=1,3 + friction(j,0)=fric_work(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + friction(j,i)=fric_work(ind+j) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + friction(j,i+nres)=fric_work(ind+j) + enddo + ind=ind+3 + endif + enddo + if (lprn) then + write(iout,*) "Friction backbone" + do i=0,nct-1 + write(iout,'(i5,3e15.5,5x,3e15.5)') + & i,(friction(j,i),j=1,3),(d_t(j,i),j=1,3) + enddo + write(iout,*) "Friction side chain" + do i=nnt,nct + write(iout,'(i5,3e15.5,5x,3e15.5)') + & i,(friction(j,i+nres),j=1,3),(d_t(j,i+nres),j=1,3) + enddo + endif + if (lprn) then + do j=1,3 + vv(j)=d_t(j,0) + enddo + do i=nnt,nct + do j=1,3 + vvtot(j,i)=vv(j)+0.5d0*d_t(j,i) + vvtot(j,i+nres)=vv(j)+d_t(j,i+nres) + vv(j)=vv(j)+d_t(j,i) + enddo + enddo + write (iout,*) "vvtot backbone and sidechain" + do i=nnt,nct + write (iout,'(i5,3e15.5,5x,3e15.5)') i,(vvtot(j,i),j=1,3), + & (vvtot(j,i+nres),j=1,3) + enddo + ind=0 + do i=nnt,nct-1 + do j=1,3 + v_work(ind+j)=vvtot(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + do j=1,3 + v_work(ind+j)=vvtot(j,i+nres) + enddo + ind=ind+3 + enddo + write (iout,*) "v_work gamvec and site-based friction forces" + do i=1,dimen1 + write (iout,'(i5,3e15.5)') i,v_work(i),gamvec(i), + & gamvec(i)*v_work(i) + enddo +c do i=1,dimen +c fric_work1(i)=0.0d0 +c do j=1,dimen1 +c fric_work1(i)=fric_work1(i)-A(j,i)*gamvec(j)*v_work(j) +c enddo +c enddo +c write (iout,*) "fric_work and fric_work1" +c do i=1,dimen +c write (iout,'(i5,2e15.5)') i,fric_work(i),fric_work1(i) +c enddo + do i=1,dimen + do j=1,dimen + ginvfric(i,j)=0.0d0 + do k=1,dimen + ginvfric(i,j)=ginvfric(i,j)+ginv(i,k)*fricmat(k,j) + enddo + enddo + enddo + write (iout,*) "ginvfric" + do i=1,dimen + write (iout,'(i5,100f8.3)') i,(ginvfric(i,j),j=1,dimen) + enddo + write (iout,*) "symmetry check" + do i=1,dimen + do j=1,i-1 + write (iout,*) i,j,ginvfric(i,j)-ginvfric(j,i) + enddo + enddo + endif + return + end +c----------------------------------------------------- + subroutine stochastic_force(stochforcvec) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.TIME1' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.IOUNITS' + + double precision x,sig,lowb,highb, + & ff(3),force(3,0:MAXRES2),zeta2,lowb2, + & highb2,sig2,forcvec(MAXRES6),stochforcvec(MAXRES6) + logical lprn /.false./ + do i=0,MAXRES2 + do j=1,3 + stochforc(j,i)=0.0d0 + enddo + enddo + x=0.0d0 + +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +c Compute the stochastic forces acting on bodies. Store in force. + do i=nnt,nct-1 + sig=stdforcp(i) + lowb=-5*sig + highb=5*sig + do j=1,3 + force(j,i)=anorm_distr(x,sig,lowb,highb) + enddo + enddo + do i=nnt,nct + sig2=stdforcsc(i) + lowb2=-5*sig2 + highb2=5*sig2 + do j=1,3 + force(j,i+nres)=anorm_distr(x,sig2,lowb2,highb2) + enddo + enddo +#ifdef MPI + time_fsample=time_fsample+MPI_Wtime()-time00 +#else + time_fsample=time_fsample+tcpu()-time00 +#endif +c Compute the stochastic forces acting on virtual-bond vectors. + do j=1,3 + ff(j)=0.0d0 + enddo + do i=nct-1,nnt,-1 + do j=1,3 + stochforc(j,i)=ff(j)+0.5d0*force(j,i) + enddo + do j=1,3 + ff(j)=ff(j)+force(j,i) + enddo + if (itype(i+1).ne.21) then + do j=1,3 + stochforc(j,i)=stochforc(j,i)+force(j,i+nres+1) + ff(j)=ff(j)+force(j,i+nres+1) + enddo + endif + enddo + do j=1,3 + stochforc(j,0)=ff(j)+force(j,nnt+nres) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + stochforc(j,i+nres)=force(j,i+nres) + enddo + endif + enddo + + do j=1,3 + stochforcvec(j)=stochforc(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + stochforcvec(ind+j)=stochforc(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + stochforcvec(ind+j)=stochforc(j,i+nres) + enddo + ind=ind+3 + endif + enddo + if (lprn) then + write (iout,*) "stochforcvec" + do i=1,3*dimen + write(iout,'(i5,e15.5)') i,stochforcvec(i) + enddo + write(iout,*) "Stochastic forces backbone" + do i=0,nct-1 + write(iout,'(i5,3e15.5)') i,(stochforc(j,i),j=1,3) + enddo + write(iout,*) "Stochastic forces side chain" + do i=nnt,nct + write(iout,'(i5,3e15.5)') + & i,(stochforc(j,i+nres),j=1,3) + enddo + endif + + if (lprn) then + + ind=0 + do i=nnt,nct-1 + write (iout,*) i,ind + do j=1,3 + forcvec(ind+j)=force(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + write (iout,*) i,ind + do j=1,3 + forcvec(j+ind)=force(j,i+nres) + enddo + ind=ind+3 + enddo + + write (iout,*) "forcvec" + ind=0 + do i=nnt,nct-1 + do j=1,3 + write (iout,'(2i3,2f10.5)') i,j,force(j,i), + & forcvec(ind+j) + enddo + ind=ind+3 + enddo + do i=nnt,nct + do j=1,3 + write (iout,'(2i3,2f10.5)') i,j,force(j,i+nres), + & forcvec(ind+j) + enddo + ind=ind+3 + enddo + + endif + + return + end +c------------------------------------------------------------------ + subroutine setup_fricmat + implicit real*8 (a-h,o-z) +#ifdef MPI + include 'mpif.h' +#endif + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.SETUP' + include 'COMMON.TIME1' +c integer licznik /0/ +c save licznik +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.IOUNITS' + integer IERROR + integer i,j,ind,ind1,m + logical lprn /.false./ + double precision dtdi,gamvec(MAXRES2), + & ginvfric(maxres2,maxres2),Ghalf(mmaxres2),fcopy(maxres2,maxres2) + common /syfek/ gamvec + double precision work(8*maxres2) + integer iwork(maxres2) + common /przechowalnia/ ginvfric,Ghalf,fcopy +#ifdef MPI + if (fg_rank.ne.king) goto 10 +#endif +c Zeroing out fricmat + do i=1,dimen + do j=1,dimen + fricmat(i,j)=0.0d0 + enddo + enddo +c Load the friction coefficients corresponding to peptide groups + ind1=0 + do i=nnt,nct-1 + ind1=ind1+1 + gamvec(ind1)=gamp + enddo +c Load the friction coefficients corresponding to side chains + m=nct-nnt + ind=0 + do i=nnt,nct + ind=ind+1 + ii = ind+m + iti=itype(i) + gamvec(ii)=gamsc(iti) + enddo + if (surfarea) call sdarea(gamvec) +c if (lprn) then +c write (iout,*) "Matrix A and vector gamma" +c do i=1,dimen1 +c write (iout,'(i2,$)') i +c do j=1,dimen +c write (iout,'(f4.1,$)') A(i,j) +c enddo +c write (iout,'(f8.3)') gamvec(i) +c enddo +c endif + if (lprn) then + write (iout,*) "Vector gamvec" + do i=1,dimen1 + write (iout,'(i5,f10.5)') i, gamvec(i) + enddo + endif + +c The friction matrix + do k=1,dimen + do i=1,dimen + dtdi=0.0d0 + do j=1,dimen1 + dtdi=dtdi+A(j,k)*A(j,i)*gamvec(j) + enddo + fricmat(k,i)=dtdi + enddo + enddo + + if (lprn) then + write (iout,'(//a)') "Matrix fricmat" + call matout2(dimen,dimen,maxres2,maxres2,fricmat) + endif + if (lang.eq.2 .or. lang.eq.3) then +c Mass-scale the friction matrix if non-direct integration will be performed + do i=1,dimen + do j=1,dimen + Ginvfric(i,j)=0.0d0 + do k=1,dimen + do l=1,dimen + Ginvfric(i,j)=Ginvfric(i,j)+ + & Gsqrm(i,k)*Gsqrm(l,j)*fricmat(k,l) + enddo + enddo + enddo + enddo +c Diagonalize the friction matrix + ind=0 + do i=1,dimen + do j=1,i + ind=ind+1 + Ghalf(ind)=Ginvfric(i,j) + enddo + enddo + call gldiag(maxres2,dimen,dimen,Ghalf,work,fricgam,fricvec, + & ierr,iwork) + if (lprn) then + write (iout,'(//2a)') "Eigenvectors and eigenvalues of the", + & " mass-scaled friction matrix" + call eigout(dimen,dimen,maxres2,maxres2,fricvec,fricgam) + endif +c Precompute matrices for tinker stochastic integrator +#ifndef LANG0 + do i=1,dimen + do j=1,dimen + mt1(i,j)=0.0d0 + mt2(i,j)=0.0d0 + do k=1,dimen + mt1(i,j)=mt1(i,j)+fricvec(k,i)*gsqrm(k,j) + mt2(i,j)=mt2(i,j)+fricvec(k,i)*gsqrp(k,j) + enddo + mt3(j,i)=mt1(i,j) + enddo + enddo +#endif + else if (lang.eq.4) then +c Diagonalize the friction matrix + ind=0 + do i=1,dimen + do j=1,i + ind=ind+1 + Ghalf(ind)=fricmat(i,j) + enddo + enddo + call gldiag(maxres2,dimen,dimen,Ghalf,work,fricgam,fricvec, + & ierr,iwork) + if (lprn) then + write (iout,'(//2a)') "Eigenvectors and eigenvalues of the", + & " friction matrix" + call eigout(dimen,dimen,maxres2,maxres2,fricvec,fricgam) + endif +c Determine the number of zero eigenvalues of the friction matrix + nzero=max0(dimen-dimen1,0) +c do while (fricgam(nzero+1).le.1.0d-5 .and. nzero.lt.dimen) +c nzero=nzero+1 +c enddo + write (iout,*) "Number of zero eigenvalues:",nzero + do i=1,dimen + do j=1,dimen + fricmat(i,j)=0.0d0 + do k=nzero+1,dimen + fricmat(i,j)=fricmat(i,j) + & +fricvec(i,k)*fricvec(j,k)/fricgam(k) + enddo + enddo + enddo + if (lprn) then + write (iout,'(//a)') "Generalized inverse of fricmat" + call matout(dimen,dimen,maxres6,maxres6,fricmat) + endif + endif +#ifdef MPI + 10 continue + if (nfgtasks.gt.1) then + if (fg_rank.eq.0) then +c The matching BROADCAST for fg processors is called in ERGASTULUM +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif + call MPI_Bcast(10,1,MPI_INTEGER,king,FG_COMM,IERROR) +#ifdef MPI + time_Bcast=time_Bcast+MPI_Wtime()-time00 +#else + time_Bcast=time_Bcast+tcpu()-time00 +#endif +c print *,"Processor",myrank, +c & " BROADCAST iorder in SETUP_FRICMAT" + endif +c licznik=licznik+1 +c write (iout,*) "setup_fricmat licznik",licznik +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +c Scatter the friction matrix + call MPI_Scatterv(fricmat(1,1),nginv_counts(0), + & nginv_start(0),MPI_DOUBLE_PRECISION,fcopy(1,1), + & myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) +#ifdef TIMING +#ifdef MPI + time_scatter=time_scatter+MPI_Wtime()-time00 + time_scatter_fmat=time_scatter_fmat+MPI_Wtime()-time00 +#else + time_scatter=time_scatter+tcpu()-time00 + time_scatter_fmat=time_scatter_fmat+tcpu()-time00 +#endif +#endif + do i=1,dimen + do j=1,2*my_ng_count + fricmat(j,i)=fcopy(i,j) + enddo + enddo +c write (iout,*) "My chunk of fricmat" +c call MATOUT2(my_ng_count,dimen,maxres2,maxres2,fcopy) + endif +#endif + return + end +c------------------------------------------------------------------------------- + subroutine sdarea(gamvec) +c +c Scale the friction coefficients according to solvent accessible surface areas +c Code adapted from TINKER +c AL 9/3/04 +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision radius(maxres2),gamvec(maxres2) + parameter (twosix=1.122462048309372981d0) + logical lprn /.false./ +c +c determine new friction coefficients every few SD steps +c +c set the atomic radii to estimates of sigma values +c +c print *,"Entered sdarea" + probe = 0.0d0 + + do i=1,2*nres + radius(i)=0.0d0 + enddo +c Load peptide group radii + do i=nnt,nct-1 + radius(i)=pstok + enddo +c Load side chain radii + do i=nnt,nct + iti=itype(i) + radius(i+nres)=restok(iti) + enddo +c do i=1,2*nres +c write (iout,*) "i",i," radius",radius(i) +c enddo + do i = 1, 2*nres + radius(i) = radius(i) / twosix + if (radius(i) .ne. 0.0d0) radius(i) = radius(i) + probe + end do +c +c scale atomic friction coefficients by accessible area +c + if (lprn) write (iout,*) + & "Original gammas, surface areas, scaling factors, new gammas, ", + & "std's of stochastic forces" + ind=0 + do i=nnt,nct-1 + if (radius(i).gt.0.0d0) then + call surfatom (i,area,radius) + ratio = dmax1(area/(4.0d0*pi*radius(i)**2),1.0d-1) + if (lprn) write (iout,'(i5,3f10.5,$)') + & i,gamvec(ind+1),area,ratio + do j=1,3 + ind=ind+1 + gamvec(ind) = ratio * gamvec(ind) + enddo + stdforcp(i)=stdfp*dsqrt(gamvec(ind)) + if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcp(i) + endif + enddo + do i=nnt,nct + if (radius(i+nres).gt.0.0d0) then + call surfatom (i+nres,area,radius) + ratio = dmax1(area/(4.0d0*pi*radius(i+nres)**2),1.0d-1) + if (lprn) write (iout,'(i5,3f10.5,$)') + & i,gamvec(ind+1),area,ratio + do j=1,3 + ind=ind+1 + gamvec(ind) = ratio * gamvec(ind) + enddo + stdforcsc(i)=stdfsc(itype(i))*dsqrt(gamvec(ind)) + if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcsc(i) + endif + enddo + + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/surfatom.f b/source/unres/src_Eshel/SRC-SURPLUS/surfatom.f new file mode 100644 index 0000000..9974842 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/surfatom.f @@ -0,0 +1,494 @@ +c +c +c ################################################### +c ## COPYRIGHT (C) 1996 by Jay William Ponder ## +c ## All Rights Reserved ## +c ################################################### +c +c ################################################################ +c ## ## +c ## subroutine surfatom -- exposed surface area of an atom ## +c ## ## +c ################################################################ +c +c +c "surfatom" performs an analytical computation of the surface +c area of a specified atom; a simplified version of "surface" +c +c literature references: +c +c T. J. Richmond, "Solvent Accessible Surface Area and +c Excluded Volume in Proteins", Journal of Molecular Biology, +c 178, 63-89 (1984) +c +c L. Wesson and D. Eisenberg, "Atomic Solvation Parameters +c Applied to Molecular Dynamics of Proteins in Solution", +c Protein Science, 1, 227-235 (1992) +c +c variables and parameters: +c +c ir number of atom for which area is desired +c area accessible surface area of the atom +c radius radii of each of the individual atoms +c +c + subroutine surfatom (ir,area,radius) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'sizes.i' + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + integer nres,nsup,nstart_sup + double precision c,dc,dc_old,d_c_work,xloc,xrot,dc_norm + common /chain/ c(3,maxres2+2),dc(3,0:maxres2),dc_old(3,0:maxres2), + & xloc(3,maxres),xrot(3,maxres),dc_norm(3,0:maxres2), + & dc_work(MAXRES6),nres,nres0 + integer maxarc + parameter (maxarc=300) + integer i,j,k,m + integer ii,ib,jb + integer io,ir + integer mi,ni,narc + integer key(maxarc) + integer intag(maxarc) + integer intag1(maxarc) + real*8 area,arcsum + real*8 arclen,exang + real*8 delta,delta2 + real*8 eps,rmove + real*8 xr,yr,zr + real*8 rr,rrsq + real*8 rplus,rminus + real*8 axx,axy,axz + real*8 ayx,ayy + real*8 azx,azy,azz + real*8 uxj,uyj,uzj + real*8 tx,ty,tz + real*8 txb,tyb,td + real*8 tr2,tr,txr,tyr + real*8 tk1,tk2 + real*8 thec,the,t,tb + real*8 txk,tyk,tzk + real*8 t1,ti,tf,tt + real*8 txj,tyj,tzj + real*8 ccsq,cc,xysq + real*8 bsqk,bk,cosine + real*8 dsqj,gi,pix2 + real*8 therk,dk,gk + real*8 risqk,rik + real*8 radius(maxatm) + real*8 ri(maxarc),risq(maxarc) + real*8 ux(maxarc),uy(maxarc),uz(maxarc) + real*8 xc(maxarc),yc(maxarc),zc(maxarc) + real*8 xc1(maxarc),yc1(maxarc),zc1(maxarc) + real*8 dsq(maxarc),bsq(maxarc) + real*8 dsq1(maxarc),bsq1(maxarc) + real*8 arci(maxarc),arcf(maxarc) + real*8 ex(maxarc),lt(maxarc),gr(maxarc) + real*8 b(maxarc),b1(maxarc),bg(maxarc) + real*8 kent(maxarc),kout(maxarc) + real*8 ther(maxarc) + logical moved,top + logical omit(maxarc) +c +c +c zero out the surface area for the sphere of interest +c + area = 0.0d0 +c write (2,*) "ir",ir," radius",radius(ir) + if (radius(ir) .eq. 0.0d0) return +c +c set the overlap significance and connectivity shift +c + pix2 = 2.0d0 * pi + delta = 1.0d-8 + delta2 = delta * delta + eps = 1.0d-8 + moved = .false. + rmove = 1.0d-8 +c +c store coordinates and radius of the sphere of interest +c + xr = c(1,ir) + yr = c(2,ir) + zr = c(3,ir) + rr = radius(ir) + rrsq = rr * rr +c +c initialize values of some counters and summations +c + 10 continue + io = 0 + jb = 0 + ib = 0 + arclen = 0.0d0 + exang = 0.0d0 +c +c test each sphere to see if it overlaps the sphere of interest +c + do i = 1, 2*nres + if (i.eq.ir .or. radius(i).eq.0.0d0) goto 30 + rplus = rr + radius(i) + tx = c(1,i) - xr + if (abs(tx) .ge. rplus) goto 30 + ty = c(2,i) - yr + if (abs(ty) .ge. rplus) goto 30 + tz = c(3,i) - zr + if (abs(tz) .ge. rplus) goto 30 +c +c check for sphere overlap by testing distance against radii +c + xysq = tx*tx + ty*ty + if (xysq .lt. delta2) then + tx = delta + ty = 0.0d0 + xysq = delta2 + end if + ccsq = xysq + tz*tz + cc = sqrt(ccsq) + if (rplus-cc .le. delta) goto 30 + rminus = rr - radius(i) +c +c check to see if sphere of interest is completely buried +c + if (cc-abs(rminus) .le. delta) then + if (rminus .le. 0.0d0) goto 170 + goto 30 + end if +c +c check for too many overlaps with sphere of interest +c + if (io .ge. maxarc) then + write (iout,20) + 20 format (/,' SURFATOM -- Increase the Value of MAXARC') + stop + end if +c +c get overlap between current sphere and sphere of interest +c + io = io + 1 + xc1(io) = tx + yc1(io) = ty + zc1(io) = tz + dsq1(io) = xysq + bsq1(io) = ccsq + b1(io) = cc + gr(io) = (ccsq+rplus*rminus) / (2.0d0*rr*b1(io)) + intag1(io) = i + omit(io) = .false. + 30 continue + end do +c +c case where no other spheres overlap the sphere of interest +c + if (io .eq. 0) then + area = 4.0d0 * pi * rrsq + return + end if +c +c case where only one sphere overlaps the sphere of interest +c + if (io .eq. 1) then + area = pix2 * (1.0d0 + gr(1)) + area = mod(area,4.0d0*pi) * rrsq + return + end if +c +c case where many spheres intersect the sphere of interest; +c sort the intersecting spheres by their degree of overlap +c + call sort2 (io,gr,key) + do i = 1, io + k = key(i) + intag(i) = intag1(k) + xc(i) = xc1(k) + yc(i) = yc1(k) + zc(i) = zc1(k) + dsq(i) = dsq1(k) + b(i) = b1(k) + bsq(i) = bsq1(k) + end do +c +c get radius of each overlap circle on surface of the sphere +c + do i = 1, io + gi = gr(i) * rr + bg(i) = b(i) * gi + risq(i) = rrsq - gi*gi + ri(i) = sqrt(risq(i)) + ther(i) = 0.5d0*pi - asin(min(1.0d0,max(-1.0d0,gr(i)))) + end do +c +c find boundary of inaccessible area on sphere of interest +c + do k = 1, io-1 + if (.not. omit(k)) then + txk = xc(k) + tyk = yc(k) + tzk = zc(k) + bk = b(k) + therk = ther(k) +c +c check to see if J circle is intersecting K circle; +c get distance between circle centers and sum of radii +c + do j = k+1, io + if (omit(j)) goto 60 + cc = (txk*xc(j)+tyk*yc(j)+tzk*zc(j))/(bk*b(j)) + cc = acos(min(1.0d0,max(-1.0d0,cc))) + td = therk + ther(j) +c +c check to see if circles enclose separate regions +c + if (cc .ge. td) goto 60 +c +c check for circle J completely inside circle K +c + if (cc+ther(j) .lt. therk) goto 40 +c +c check for circles that are essentially parallel +c + if (cc .gt. delta) goto 50 + 40 continue + omit(j) = .true. + goto 60 +c +c check to see if sphere of interest is completely buried +c + 50 continue + if (pix2-cc .le. td) goto 170 + 60 continue + end do + end if + end do +c +c find T value of circle intersections +c + do k = 1, io + if (omit(k)) goto 110 + omit(k) = .true. + narc = 0 + top = .false. + txk = xc(k) + tyk = yc(k) + tzk = zc(k) + dk = sqrt(dsq(k)) + bsqk = bsq(k) + bk = b(k) + gk = gr(k) * rr + risqk = risq(k) + rik = ri(k) + therk = ther(k) +c +c rotation matrix elements +c + t1 = tzk / (bk*dk) + axx = txk * t1 + axy = tyk * t1 + axz = dk / bk + ayx = tyk / dk + ayy = txk / dk + azx = txk / bk + azy = tyk / bk + azz = tzk / bk + do j = 1, io + if (.not. omit(j)) then + txj = xc(j) + tyj = yc(j) + tzj = zc(j) +c +c rotate spheres so K vector colinear with z-axis +c + uxj = txj*axx + tyj*axy - tzj*axz + uyj = tyj*ayy - txj*ayx + uzj = txj*azx + tyj*azy + tzj*azz + cosine = min(1.0d0,max(-1.0d0,uzj/b(j))) + if (acos(cosine) .lt. therk+ther(j)) then + dsqj = uxj*uxj + uyj*uyj + tb = uzj*gk - bg(j) + txb = uxj * tb + tyb = uyj * tb + td = rik * dsqj + tr2 = risqk*dsqj - tb*tb + tr2 = max(eps,tr2) + tr = sqrt(tr2) + txr = uxj * tr + tyr = uyj * tr +c +c get T values of intersection for K circle +c + tb = (txb+tyr) / td + tb = min(1.0d0,max(-1.0d0,tb)) + tk1 = acos(tb) + if (tyb-txr .lt. 0.0d0) tk1 = pix2 - tk1 + tb = (txb-tyr) / td + tb = min(1.0d0,max(-1.0d0,tb)) + tk2 = acos(tb) + if (tyb+txr .lt. 0.0d0) tk2 = pix2 - tk2 + thec = (rrsq*uzj-gk*bg(j)) / (rik*ri(j)*b(j)) + if (abs(thec) .lt. 1.0d0) then + the = -acos(thec) + else if (thec .ge. 1.0d0) then + the = 0.0d0 + else if (thec .le. -1.0d0) then + the = -pi + end if +c +c see if "tk1" is entry or exit point; check t=0 point; +c "ti" is exit point, "tf" is entry point +c + cosine = min(1.0d0,max(-1.0d0, + & (uzj*gk-uxj*rik)/(b(j)*rr))) + if ((acos(cosine)-ther(j))*(tk2-tk1) .le. 0.0d0) then + ti = tk2 + tf = tk1 + else + ti = tk2 + tf = tk1 + end if + narc = narc + 1 + if (narc .ge. maxarc) then + write (iout,70) + 70 format (/,' SURFATOM -- Increase the Value', + & ' of MAXARC') + stop + end if + if (tf .le. ti) then + arcf(narc) = tf + arci(narc) = 0.0d0 + tf = pix2 + lt(narc) = j + ex(narc) = the + top = .true. + narc = narc + 1 + end if + arcf(narc) = tf + arci(narc) = ti + lt(narc) = j + ex(narc) = the + ux(j) = uxj + uy(j) = uyj + uz(j) = uzj + end if + end if + end do + omit(k) = .false. +c +c special case; K circle without intersections +c + if (narc .le. 0) goto 90 +c +c general case; sum up arclength and set connectivity code +c + call sort2 (narc,arci,key) + arcsum = arci(1) + mi = key(1) + t = arcf(mi) + ni = mi + if (narc .gt. 1) then + do j = 2, narc + m = key(j) + if (t .lt. arci(j)) then + arcsum = arcsum + arci(j) - t + exang = exang + ex(ni) + jb = jb + 1 + if (jb .ge. maxarc) then + write (iout,80) + 80 format (/,' SURFATOM -- Increase the Value', + & ' of MAXARC') + stop + end if + i = lt(ni) + kent(jb) = maxarc*i + k + i = lt(m) + kout(jb) = maxarc*k + i + end if + tt = arcf(m) + if (tt .ge. t) then + t = tt + ni = m + end if + end do + end if + arcsum = arcsum + pix2 - t + if (.not. top) then + exang = exang + ex(ni) + jb = jb + 1 + i = lt(ni) + kent(jb) = maxarc*i + k + i = lt(mi) + kout(jb) = maxarc*k + i + end if + goto 100 + 90 continue + arcsum = pix2 + ib = ib + 1 + 100 continue + arclen = arclen + gr(k)*arcsum + 110 continue + end do + if (arclen .eq. 0.0d0) goto 170 + if (jb .eq. 0) goto 150 +c +c find number of independent boundaries and check connectivity +c + j = 0 + do k = 1, jb + if (kout(k) .ne. 0) then + i = k + 120 continue + m = kout(i) + kout(i) = 0 + j = j + 1 + do ii = 1, jb + if (m .eq. kent(ii)) then + if (ii .eq. k) then + ib = ib + 1 + if (j .eq. jb) goto 150 + goto 130 + end if + i = ii + goto 120 + end if + end do + 130 continue + end if + end do + ib = ib + 1 +c +c attempt to fix connectivity error by moving atom slightly +c + if (moved) then + write (iout,140) ir + 140 format (/,' SURFATOM -- Connectivity Error at Atom',i6) + else + moved = .true. + xr = xr + rmove + yr = yr + rmove + zr = zr + rmove + goto 10 + end if +c +c compute the exposed surface area for the sphere of interest +c + 150 continue + area = ib*pix2 + exang + arclen + area = mod(area,4.0d0*pi) * rrsq +c +c attempt to fix negative area by moving atom slightly +c + if (area .lt. 0.0d0) then + if (moved) then + write (iout,160) ir + 160 format (/,' SURFATOM -- Negative Area at Atom',i6) + else + moved = .true. + xr = xr + rmove + yr = yr + rmove + zr = zr + rmove + goto 10 + end if + end if + 170 continue + return + end diff --git a/source/unres/src_Eshel/SRC-SURPLUS/test.F b/source/unres/src_Eshel/SRC-SURPLUS/test.F new file mode 100644 index 0000000..0140ee5 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/test.F @@ -0,0 +1,863 @@ + subroutine test + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.DISTFIT' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.FFIELD' + include 'COMMON.MINIM' + include 'COMMON.CHAIN' + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision var(maxvar),var1(maxvar) + integer j1,j2 + logical debug,accepted + debug=.true. + + + call geom_to_var(nvar,var1) + call chainbuild + call etotal(energy(0)) + etot=energy(0) + call rmsd(rms) + write(iout,*) 'etot=',0,etot,rms + call secondary2(.false.) + + call write_pdb(0,'first structure',etot) + + j1=13 + j2=21 + da=180.0*deg2rad + + + + temp=3000.0d0 + betbol=1.0D0/(1.9858D-3*temp) + jr=iran_num(j1,j2) + d=ran_number(-pi,pi) +c phi(jr)=pinorm(phi(jr)+d) + call chainbuild + call etotal(energy(0)) + etot0=energy(0) + call rmsd(rms) + write(iout,*) 'etot=',1,etot0,rms + call write_pdb(1,'perturb structure',etot0) + + do i=2,500,2 + jr=iran_num(j1,j2) + d=ran_number(-da,da) + phiold=phi(jr) + phi(jr)=pinorm(phi(jr)+d) + call chainbuild + call etotal(energy(0)) + etot=energy(0) + + if (etot.lt.etot0) then + accepted=.true. + else + accepted=.false. + xxr=ran_number(0.0D0,1.0D0) + xxh=betbol*(etot-etot0) + if (xxh.lt.50.0D0) then + xxh=dexp(-xxh) + if (xxh.gt.xxr) accepted=.true. + endif + endif + accepted=.true. +c print *,etot0,etot,accepted + if (accepted) then + etot0=etot + call rmsd(rms) + write(iout,*) 'etot=',i,etot,rms + call write_pdb(i,'MC structure',etot) +c minimize +c call geom_to_var(nvar,var1) + call sc_move(2,nres-1,1,10d0,nft_sc,etot) + call geom_to_var(nvar,var) + call minimize(etot,var,iretcode,nfun) + write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun + call var_to_geom(nvar,var) + call chainbuild + call rmsd(rms) + write(iout,*) 'etot mcm=',i,etot,rms + call write_pdb(i+1,'MCM structure',etot) + call var_to_geom(nvar,var1) +c -------- + else + phi(jr)=phiold + endif + enddo + +c minimize +c call sc_move(2,nres-1,1,10d0,nft_sc,etot) +c call geom_to_var(nvar,var) +c +c call chainbuild +c call write_pdb(998 ,'sc min',etot) +c +c call minimize(etot,var,iretcode,nfun) +c write(iout,*)'------------------------------------------------' +c write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun +c +c call var_to_geom(nvar,var) +c call chainbuild +c call write_pdb(999,'full min',etot) + + + return + end + + + + + subroutine test_local + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision varia(maxvar) +c + call chainbuild +c call geom_to_var(nvar,varia) + call write_pdb(1,'first structure',0d0) + + call etotal(energy(0)) + etot=energy(0) + write(iout,*) nnt,nct,etot + + write(iout,*) 'calling sc_move' + call sc_move(nnt,nct,5,10d0,nft_sc,etot) + write(iout,*) nft_sc,etot + call write_pdb(2,'second structure',etot) + + write(iout,*) 'calling local_move' + call local_move_init(.false.) + call local_move(24,29,20d0,50d0) + call chainbuild + call write_pdb(3,'third structure',etot) + + write(iout,*) 'calling sc_move' + call sc_move(24,29,5,10d0,nft_sc,etot) + write(iout,*) nft_sc,etot + call write_pdb(2,'last structure',etot) + + + return + end + + subroutine test_sc + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision varia(maxvar) +c + call chainbuild +c call geom_to_var(nvar,varia) + call write_pdb(1,'first structure',0d0) + + call etotal(energy(0)) + etot=energy(0) + write(iout,*) nnt,nct,etot + + write(iout,*) 'calling sc_move' + + call sc_move(nnt,nct,5,10d0,nft_sc,etot) + write(iout,*) nft_sc,etot + call write_pdb(2,'second structure',etot) + + write(iout,*) 'calling sc_move 2nd time' + + call sc_move(nnt,nct,5,1d0,nft_sc,etot) + write(iout,*) nft_sc,etot + call write_pdb(3,'last structure',etot) + return + end +c-------------------------------------------------------- + subroutine bgrow(bstrand,nbstrand,in,ind,new) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + integer bstrand(maxres/3,6) + + ishift=iabs(bstrand(in,ind+4)-new) + + print *,'bgrow',bstrand(in,ind+4),new,ishift + + bstrand(in,ind)=new + + if(ind.eq.1)then + bstrand(nbstrand,5)=bstrand(nbstrand,1) + do i=1,nbstrand-1 + IF (bstrand(nbstrand,3).eq.bstrand(i,3)) THEN + if (bstrand(i,5).lt.bstrand(i,6)) then + bstrand(i,5)=bstrand(i,5)-ishift + else + bstrand(i,5)=bstrand(i,5)+ishift + endif + ENDIF + enddo + else + bstrand(nbstrand,6)=bstrand(nbstrand,2) + do i=1,nbstrand-1 + IF (bstrand(nbstrand,3).eq.bstrand(i,3)) THEN + if (bstrand(i,6).lt.bstrand(i,5)) then + bstrand(i,6)=bstrand(i,6)-ishift + else + bstrand(i,6)=bstrand(i,6)+ishift + endif + ENDIF + enddo + endif + + + return + end + + +c------------------------------------------------- + + subroutine secondary(lprint) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.DISTFIT' + + integer ncont,icont(2,maxres*maxres/2),isec(maxres,3) + logical lprint,not_done + real dcont(maxres*maxres/2),d + real rcomp /7.0/ + real rbeta /5.2/ + real ralfa /5.2/ + real r310 /6.6/ + double precision xpi(3),xpj(3) + + + + call chainbuild +cd call write_pdb(99,'sec structure',0d0) + ncont=0 + nbfrag=0 + nhfrag=0 + do i=1,nres + isec(i,1)=0 + isec(i,2)=0 + isec(i,3)=0 + enddo + + do i=2,nres-3 + do k=1,3 + xpi(k)=0.5d0*(c(k,i-1)+c(k,i)) + enddo + do j=i+2,nres + do k=1,3 + xpj(k)=0.5d0*(c(k,j-1)+c(k,j)) + enddo +cd d = (c(1,i)-c(1,j))*(c(1,i)-c(1,j)) + +cd & (c(2,i)-c(2,j))*(c(2,i)-c(2,j)) + +cd & (c(3,i)-c(3,j))*(c(3,i)-c(3,j)) +cd print *,'CA',i,j,d + d = (xpi(1)-xpj(1))*(xpi(1)-xpj(1)) + + & (xpi(2)-xpj(2))*(xpi(2)-xpj(2)) + + & (xpi(3)-xpj(3))*(xpi(3)-xpj(3)) + if ( d.lt.rcomp*rcomp) then + ncont=ncont+1 + icont(1,ncont)=i + icont(2,ncont)=j + dcont(ncont)=sqrt(d) + endif + enddo + enddo + if (lprint) then + write (iout,*) + write (iout,'(a)') '#PP contact map distances:' + do i=1,ncont + write (iout,'(3i4,f10.5)') + & i,icont(1,i),icont(2,i),dcont(i) + enddo + endif + +c finding parallel beta +cd write (iout,*) '------- looking for parallel beta -----------' + nbeta=0 + nstrand=0 + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if(dcont(i).le.rbeta .and. j1-i1.gt.4 .and. + & isec(i1,1).le.1.and.isec(j1,1).le.1.and. + & (isec(i1,2).ne.isec(j1,2).or.isec(i1,2)*isec(j1,2).eq.0).and. + & (isec(i1,3).ne.isec(j1,3).or.isec(i1,3)*isec(j1,3).eq.0).and. + & (isec(i1,2).ne.isec(j1,3).or.isec(i1,2)*isec(j1,3).eq.0).and. + & (isec(i1,3).ne.isec(j1,2).or.isec(i1,3)*isec(j1,2).eq.0) + & ) then + ii1=i1 + jj1=j1 +cd write (iout,*) i1,j1,dcont(i) + not_done=.true. + do while (not_done) + i1=i1+1 + j1=j1+1 + do j=1,ncont + if (i1.eq.icont(1,j) .and. j1.eq.icont(2,j) + & .and. dcont(j).le.rbeta .and. + & isec(i1,1).le.1.and.isec(j1,1).le.1.and. + & (isec(i1,2).ne.isec(j1,2).or.isec(i1,2)*isec(j1,2).eq.0).and. + & (isec(i1,3).ne.isec(j1,3).or.isec(i1,3)*isec(j1,3).eq.0).and. + & (isec(i1,2).ne.isec(j1,3).or.isec(i1,2)*isec(j1,3).eq.0).and. + & (isec(i1,3).ne.isec(j1,2).or.isec(i1,3)*isec(j1,2).eq.0) + & ) goto 5 + enddo + not_done=.false. + 5 continue +cd write (iout,*) i1,j1,dcont(j),not_done + enddo + j1=j1-1 + i1=i1-1 + if (i1-ii1.gt.1) then + ii1=max0(ii1-1,1) + jj1=max0(jj1-1,1) + nbeta=nbeta+1 + if(lprint)write(iout,*)'parallel beta',nbeta,ii1,i1,jj1,j1 + + nbfrag=nbfrag+1 + bfrag(1,nbfrag)=ii1 + bfrag(2,nbfrag)=i1 + bfrag(3,nbfrag)=jj1 + bfrag(4,nbfrag)=j1 + + do ij=ii1,i1 + isec(ij,1)=isec(ij,1)+1 + isec(ij,1+isec(ij,1))=nbeta + enddo + do ij=jj1,j1 + isec(ij,1)=isec(ij,1)+1 + isec(ij,1+isec(ij,1))=nbeta + enddo + + if(lprint) then + nstrand=nstrand+1 + if (nbeta.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-1,"..",i1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-1,"..",i1-1,"'" + endif + nstrand=nstrand+1 + if (nbeta.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",jj1-1,"..",j1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",jj1-1,"..",j1-1,"'" + endif + write(12,'(a8,4i4)') + & "SetNeigh",ii1-1,i1-1,jj1-1,j1-1 + endif + endif + endif + enddo + +c finding antiparallel beta +cd write (iout,*) '--------- looking for antiparallel beta ---------' + + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if (dcont(i).le.rbeta.and. + & isec(i1,1).le.1.and.isec(j1,1).le.1.and. + & (isec(i1,2).ne.isec(j1,2).or.isec(i1,2)*isec(j1,2).eq.0).and. + & (isec(i1,3).ne.isec(j1,3).or.isec(i1,3)*isec(j1,3).eq.0).and. + & (isec(i1,2).ne.isec(j1,3).or.isec(i1,2)*isec(j1,3).eq.0).and. + & (isec(i1,3).ne.isec(j1,2).or.isec(i1,3)*isec(j1,2).eq.0) + & ) then + ii1=i1 + jj1=j1 +cd write (iout,*) i1,j1,dcont(i) + + not_done=.true. + do while (not_done) + i1=i1+1 + j1=j1-1 + do j=1,ncont + if (i1.eq.icont(1,j).and.j1.eq.icont(2,j) .and. + & isec(i1,1).le.1.and.isec(j1,1).le.1.and. + & (isec(i1,2).ne.isec(j1,2).or.isec(i1,2)*isec(j1,2).eq.0).and. + & (isec(i1,3).ne.isec(j1,3).or.isec(i1,3)*isec(j1,3).eq.0).and. + & (isec(i1,2).ne.isec(j1,3).or.isec(i1,2)*isec(j1,3).eq.0).and. + & (isec(i1,3).ne.isec(j1,2).or.isec(i1,3)*isec(j1,2).eq.0) + & .and. dcont(j).le.rbeta ) goto 6 + enddo + not_done=.false. + 6 continue +cd write (iout,*) i1,j1,dcont(j),not_done + enddo + i1=i1-1 + j1=j1+1 + if (i1-ii1.gt.1) then + if(lprint)write (iout,*)'antiparallel beta', + & nbeta,ii1-1,i1,jj1,j1-1 + + nbfrag=nbfrag+1 + bfrag(1,nbfrag)=max0(ii1-1,1) + bfrag(2,nbfrag)=i1 + bfrag(3,nbfrag)=jj1 + bfrag(4,nbfrag)=max0(j1-1,1) + + nbeta=nbeta+1 + iii1=max0(ii1-1,1) + do ij=iii1,i1 + isec(ij,1)=isec(ij,1)+1 + isec(ij,1+isec(ij,1))=nbeta + enddo + jjj1=max0(j1-1,1) + do ij=jjj1,jj1 + isec(ij,1)=isec(ij,1)+1 + isec(ij,1+isec(ij,1))=nbeta + enddo + + + if (lprint) then + nstrand=nstrand+1 + if (nstrand.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-2,"..",i1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-2,"..",i1-1,"'" + endif + nstrand=nstrand+1 + if (nstrand.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",j1-2,"..",jj1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",j1-2,"..",jj1-1,"'" + endif + write(12,'(a8,4i4)') + & "SetNeigh",ii1-2,i1-1,jj1-1,j1-2 + endif + endif + endif + enddo + + if (nstrand.gt.0.and.lprint) then + write(12,'(a27,$)') "DefPropRes 'sheet' 'strand1" + do i=2,nstrand + if (i.le.9) then + write(12,'(a9,i1,$)') " | strand",i + else + write(12,'(a9,i2,$)') " | strand",i + endif + enddo + write(12,'(a1)') "'" + endif + + +c finding alpha or 310 helix + + nhelix=0 + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if (j1.eq.i1+3.and.dcont(i).le.r310 + & .or.j1.eq.i1+4.and.dcont(i).le.ralfa ) then +cd if (j1.eq.i1+3) write (iout,*) "found 1-4 ",i1,j1,dcont(i) +cd if (j1.eq.i1+4) write (iout,*) "found 1-5 ",i1,j1,dcont(i) + ii1=i1 + jj1=j1 + if (isec(ii1,1).eq.0) then + not_done=.true. + else + not_done=.false. + endif + do while (not_done) + i1=i1+1 + j1=j1+1 + do j=1,ncont + if (i1.eq.icont(1,j) .and. j1.eq.icont(2,j)) goto 10 + enddo + not_done=.false. + 10 continue +cd write (iout,*) i1,j1,not_done + enddo + j1=j1-1 + if (j1-ii1.gt.4) then + nhelix=nhelix+1 +cd write (iout,*)'helix',nhelix,ii1,j1 + + nhfrag=nhfrag+1 + hfrag(1,nhfrag)=ii1 + hfrag(2,nhfrag)=max0(j1-1,1) + + do ij=ii1,j1 + isec(ij,1)=-1 + enddo + if (lprint) then + write (iout,'(a6,i3,2i4)') "Helix",nhelix,ii1-1,j1-2 + if (nhelix.le.9) then + write(12,'(a17,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'helix",nhelix, + & "' 'num = ",ii1-1,"..",j1-2,"'" + else + write(12,'(a17,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'helix",nhelix, + & "' 'num = ",ii1-1,"..",j1-2,"'" + endif + endif + endif + endif + enddo + + if (nhelix.gt.0.and.lprint) then + write(12,'(a26,$)') "DefPropRes 'helix' 'helix1" + do i=2,nhelix + if (nhelix.le.9) then + write(12,'(a8,i1,$)') " | helix",i + else + write(12,'(a8,i2,$)') " | helix",i + endif + enddo + write(12,'(a1)') "'" + endif + + if (lprint) then + write(12,'(a37)') "DefPropRes 'coil' '! (helix | sheet)'" + write(12,'(a20)') "XMacStand ribbon.mac" + endif + + + return + end +c---------------------------------------------------------------------------- + + subroutine write_pdb(npdb,titelloc,ee) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + character*50 titelloc1 + character*(*) titelloc + character*3 zahl + character*5 liczba5 + double precision ee + integer npdb,ilen + external ilen + + titelloc1=titelloc + lenpre=ilen(prefix) + if (npdb.lt.1000) then + call numstr(npdb,zahl) + open(ipdb,file=prefix(:lenpre)//'@@'//zahl//'.pdb') + else + if (npdb.lt.10000) then + write(liczba5,'(i1,i4)') 0,npdb + else + write(liczba5,'(i5)') npdb + endif + open(ipdb,file=prefix(:lenpre)//'@@'//liczba5//'.pdb') + endif + call pdbout(ee,titelloc1,ipdb) + close(ipdb) + return + end + +c-------------------------------------------------------- + subroutine softreg + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + include 'COMMON.FFIELD' + include 'COMMON.MINIM' + include 'COMMON.INTERACT' +c + include 'COMMON.DISTFIT' + integer iff(maxres) + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision var(maxvar) + integer ieval +c + logical debug,ltest,fail + character*50 linia +c + linia='test' + debug=.true. + in_pdb=0 + + + +c------------------------ +c +c freeze sec.elements +c + do i=1,nres + mask_phi(i)=1 + mask_theta(i)=1 + mask_side(i)=1 + iff(i)=0 + enddo + + do j=1,nbfrag + do i=bfrag(1,j),bfrag(2,j) + mask_phi(i)=0 + mask_theta(i)=0 + iff(i)=1 + enddo + if (bfrag(3,j).le.bfrag(4,j)) then + do i=bfrag(3,j),bfrag(4,j) + mask_phi(i)=0 + mask_theta(i)=0 + iff(i)=1 + enddo + else + do i=bfrag(4,j),bfrag(3,j) + mask_phi(i)=0 + mask_theta(i)=0 + iff(i)=1 + enddo + endif + enddo + do j=1,nhfrag + do i=hfrag(1,j),hfrag(2,j) + mask_phi(i)=0 + mask_theta(i)=0 + iff(i)=1 + enddo + enddo + mask_r=.true. + + + + nhpb0=nhpb +c +c store dist. constrains +c + do i=1,nres-3 + do j=i+3,nres + if ( iff(i).eq.1.and.iff(j).eq.1 ) then + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=0.1 + dhpb(nhpb)=DIST(i,j) + endif + enddo + enddo + call hpb_partition + + if (debug) then + call chainbuild + call write_pdb(100+in_pdb,'input reg. structure',0d0) + endif + + + ipot0=ipot + maxmin0=maxmin + maxfun0=maxfun + wstrain0=wstrain + wang0=wang +c +c run soft pot. optimization +c + ipot=6 + wang=3.0 + maxmin=2000 + maxfun=4000 + call geom_to_var(nvar,var) +#ifdef MPI + time0=MPI_WTIME() +#else + time0=tcpu() +#endif + call minimize(etot,var,iretcode,nfun) + + write(iout,*)'SUMSL return code is',iretcode,' eval SOFT',nfun +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + write (iout,'(a,f6.2,f8.2,a)')' Time for soft min.',time1-time0, + & nfun/(time1-time0),' SOFT eval/s' + if (debug) then + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(300+in_pdb,'soft structure',etot) + endif +c +c run full UNRES optimization with constrains and frozen 2D +c the same variables as soft pot. optimizatio +c + ipot=ipot0 + wang=wang0 + maxmin=maxmin0 + maxfun=maxfun0 +#ifdef MPI + time0=MPI_WTIME() +#else + time0=tcpu() +#endif + call minimize(etot,var,iretcode,nfun) + write(iout,*)'SUMSL MASK DIST return code is',iretcode, + & ' eval ',nfun + ieval=nfun +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + write (iout,'(a,f6.2,f8.2,a)') + & ' Time for mask dist min.',time1-time0, + & nfun/(time1-time0),' eval/s' + if (debug) then + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(400+in_pdb,'mask & dist',etot) + endif +c +c switch off constrains and +c run full UNRES optimization with frozen 2D +c + +c +c reset constrains +c + nhpb_c=nhpb + nhpb=nhpb0 + link_start=1 + link_end=nhpb + wstrain=wstrain0 + +#ifdef MPI + time0=MPI_WTIME() +#else + time0=tcpu() +#endif + call minimize(etot,var,iretcode,nfun) + write(iout,*)'SUMSL MASK return code is',iretcode,' eval ',nfun + ieval=ieval+nfun +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + write (iout,'(a,f6.2,f8.2,a)')' Time for mask min.',time1-time0, + & nfun/(time1-time0),' eval/s' + + + if (debug) then + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(500+in_pdb,'mask 2d frozen',etot) + endif + + mask_r=.false. + + +c +c run full UNRES optimization with constrains and NO frozen 2D +c + + nhpb=nhpb_c + link_start=1 + link_end=nhpb + maxfun=maxfun0/5 + + do ico=1,5 + + wstrain=wstrain0/ico +#ifdef MPI + time0=MPI_WTIME() +#else + time0=tcpu() +#endif + call minimize(etot,var,iretcode,nfun) + write(iout,'(a10,f6.3,a14,i3,a6,i5)') + & ' SUMSL DIST',wstrain,' return code is',iretcode, + & ' eval ',nfun + ieval=nfun +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + write (iout,'(a,f6.2,f8.2,a)') + & ' Time for dist min.',time1-time0, + & nfun/(time1-time0),' eval/s' + if (debug) then + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(600+in_pdb+ico,'dist cons',etot) + endif + + enddo +c + nhpb=nhpb0 + link_start=1 + link_end=nhpb + wstrain=wstrain0 + maxfun=maxfun0 + + +c + if (minim) then +#ifdef MPI + time0=MPI_WTIME() +#else + time0=tcpu() +#endif + call minimize(etot,var,iretcode,nfun) + write(iout,*)'------------------------------------------------' + write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun, + & '+ DIST eval',ieval +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + write (iout,'(a,f6.2,f8.2,a)')' Time for full min.',time1-time0, + & nfun/(time1-time0),' eval/s' + + + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(999,'full min',etot) + endif + + return + end + + diff --git a/source/unres/src_Eshel/SRC-SURPLUS/thread.F b/source/unres/src_Eshel/SRC-SURPLUS/thread.F new file mode 100644 index 0000000..9f169a0 --- /dev/null +++ b/source/unres/src_Eshel/SRC-SURPLUS/thread.F @@ -0,0 +1,549 @@ + subroutine thread_seq +C Thread the sequence through a database of known structures + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.DBASE' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.THREAD' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.CONTACTS' + include 'COMMON.MCM' + include 'COMMON.NAMES' +#ifdef MPI + include 'COMMON.INFO' + integer ThreadId,ThreadType,Kwita +#endif + double precision varia(maxvar) + double precision przes(3),obr(3,3) + double precision time_for_thread + logical found_pattern,non_conv + character*32 head_pdb + double precision energia(0:n_ene) + n_ene_comp=nprint_ene +C +C Body +C +#ifdef MPI + if (me.eq.king) then + do i=1,nctasks + nsave_part(i)=0 + enddo + endif + nacc_tot=0 +#endif + Kwita=0 + close(igeom) + close(ipdb) + close(istat) + do i=1,maxthread + do j=1,14 + ener0(j,i)=0.0D0 + ener(j,i)=0.0D0 + enddo + enddo + nres0=nct-nnt+1 + ave_time_for_thread=0.0D0 + max_time_for_thread=0.0D0 +cd print *,'nthread=',nthread,' nseq=',nseq,' nres0=',nres0 + nthread=nexcl+nthread + do ithread=1,nthread + found_pattern=.false. + itrial=0 + do while (.not.found_pattern) + itrial=itrial+1 + if (itrial.gt.1000) then + write (iout,'(/a/)') 'Too many attempts to find pattern.' + nthread=ithread-1 +#ifdef MPI + call recv_stop_sig(Kwita) + call send_stop_sig(-3) +#endif + goto 777 + endif +C Find long enough chain in the database + ii=iran_num(1,nseq) + nres_t=nres_base(1,ii) +C Select the starting position to thread. + print *,'nseq',nseq,' ii=',ii,' nres_t=', + & nres_t,' nres0=',nres0 + if (nres_t.ge.nres0) then + ist=iran_num(0,nres_t-nres0) +#ifdef MPI + if (Kwita.eq.0) call recv_stop_sig(Kwita) + if (Kwita.lt.0) then + write (iout,*) 'Stop signal received. Terminating.' + write (*,*) 'Stop signal received. Terminating.' + nthread=ithread-1 + write (*,*) 'ithread=',ithread,' nthread=',nthread + goto 777 + endif + call pattern_receive +#endif + do i=1,nexcl + if (iexam(1,i).eq.ii .and. iexam(2,i).eq.ist) goto 10 + enddo + found_pattern=.true. + endif +C If this point is reached, the pattern has not yet been examined. + 10 continue +c print *,'found_pattern:',found_pattern + enddo + nexcl=nexcl+1 + iexam(1,nexcl)=ii + iexam(2,nexcl)=ist +#ifdef MPI + if (Kwita.eq.0) call recv_stop_sig(Kwita) + if (Kwita.lt.0) then + write (iout,*) 'Stop signal received. Terminating.' + nthread=ithread-1 + write (*,*) 'ithread=',ithread,' nthread=',nthread + goto 777 + endif + call pattern_send +#endif + ipatt(1,ithread)=ii + ipatt(2,ithread)=ist +#ifdef MPI + write (iout,'(/80(1h*)/a,i4,a,i5,2a,i3,a,i3,a,i3/)') + & 'Processor:',me,' Attempt:',ithread, + & ' pattern: ',str_nam(ii),nres_base(2,ii),':',nres_base(3,ii), + & ' start at res.',ist+1 + write (*,'(a,i4,a,i5,2a,i3,a,i3,a,i3)') 'Processor:',me, + & ' Attempt:',ithread, + & ' pattern: ',str_nam(ii),nres_base(2,ii),':',nres_base(3,ii), + & ' start at res.',ist+1 +#else + write (iout,'(/80(1h*)/a,i5,2a,i3,a,i3,a,i3/)') + & 'Attempt:',ithread, + & ' pattern: ',str_nam(ii),nres_base(2,ii),':',nres_base(3,ii), + & ' start at res.',ist+1 + write (*,'(a,i5,2a,i3,a,i3,a,i3)') + & 'Attempt:',ithread, + & ' pattern: ',str_nam(ii),nres_base(2,ii),':',nres_base(3,ii), + & ' start at res.',ist+1 +#endif + ipattern=ii +C Copy coordinates from the database. + ist=ist-(nnt-1) + do i=nnt,nct + do j=1,3 + c(j,i)=cart_base(j,i+ist,ii) +c cref(j,i)=c(j,i) + enddo +cd write (iout,'(a,i4,3f10.5)') restyp(itype(i)),i,(c(j,i),j=1,3) + enddo +cd call fitsq(rms,c(1,nnt),cref(1,nnt),nct-nnt+1,przes,obr, +cd non_conv) +cd write (iout,'(a,f10.5)') +cd & 'Initial RMS deviation from reference structure:',rms + if (itype(nres).eq.21) then + do j=1,3 + dcj=c(j,nres-2)-c(j,nres-3) + c(j,nres)=c(j,nres-1)+dcj + c(j,2*nres)=c(j,nres) + enddo + endif + if (itype(1).eq.21) then + do j=1,3 + dcj=c(j,4)-c(j,3) + c(j,1)=c(j,2)-dcj + c(j,nres+1)=c(j,1) + enddo + endif + call int_from_cart(.false.,.false.) +cd print *,'Exit INT_FROM_CART.' +cd print *,'nhpb=',nhpb + do i=nss+1,nhpb + ii=ihpb(i) + jj=jhpb(i) + dhpb(i)=dist(ii,jj) +c write (iout,'(2i5,2f10.5)') ihpb(i),jhpb(i),dhpb(i),forcon(i) + enddo +c stop 'End generate' +C Generate SC conformations. + call sc_conf +c call intout +#ifdef MPI +cd print *,'Processor:',me,': exit GEN_SIDE.' +#else +cd print *,'Exit GEN_SIDE.' +#endif +C Calculate initial energy. + call chainbuild + call etotal(energia(0)) + etot=energia(0) + do i=1,n_ene_comp + ener0(i,ithread)=energia(i) + enddo + ener0(n_ene_comp+1,ithread)=energia(0) + if (refstr) then + call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + ener0(n_ene_comp+3,ithread)=contact_fract(ncont,ncont_ref, + & icont,icont_ref) + ener0(n_ene_comp+2,ithread)=rms + ener0(n_ene_comp+4,ithread)=frac + ener0(n_ene_comp+5,ithread)=frac_nn + endif + ener0(n_ene_comp+3,ithread)=0.0d0 +C Minimize energy. +#ifdef MPI + print*,'Processor:',me,' ithread=',ithread,' Start REGULARIZE.' +#else + print*,'ithread=',ithread,' Start REGULARIZE.' +#endif + curr_tim=tcpu() + call regularize(nct-nnt+1,etot,rms, + & cart_base(1,ist+nnt,ipattern),iretcode) + curr_tim1=tcpu() + time_for_thread=curr_tim1-curr_tim + ave_time_for_thread= + & ((ithread-1)*ave_time_for_thread+time_for_thread)/ithread + if (time_for_thread.gt.max_time_for_thread) + & max_time_for_thread=time_for_thread +#ifdef MPI + print *,'Processor',me,': Exit REGULARIZE.' + if (WhatsUp.eq.2) then + write (iout,*) + & 'Sufficient number of confs. collected. Terminating.' + nthread=ithread-1 + goto 777 + else if (WhatsUp.eq.-1) then + nthread=ithread-1 + write (iout,*) 'Time up in REGULARIZE. Call SEND_STOP_SIG.' + if (Kwita.eq.0) call recv_stop_sig(Kwita) + call send_stop_sig(-2) + goto 777 + else if (WhatsUp.eq.-2) then + nthread=ithread-1 + write (iout,*) 'Timeup signal received. Terminating.' + goto 777 + else if (WhatsUp.eq.-3) then + nthread=ithread-1 + write (iout,*) 'Error stop signal received. Terminating.' + goto 777 + endif +#else + print *,'Exit REGULARIZE.' + if (iretcode.eq.11) then + write (iout,'(/a/)') + &'******* Allocated time exceeded in SUMSL. The program will stop.' + nthread=ithread-1 + goto 777 + endif +#endif + head_pdb=titel(:24)//':'//str_nam(ipattern) + if (outpdb) call pdbout(etot,head_pdb,ipdb) + if (outmol2) call mol2out(etot,head_pdb) +c call intout + call briefout(ithread,etot) + link_end0=link_end + link_end=min0(link_end,nss) + write (iout,*) 'link_end=',link_end,' link_end0=',link_end0, + & ' nss=',nss + call etotal(energia(0)) +c call enerprint(energia(0)) + link_end=link_end0 +cd call chainbuild +cd call fitsq(rms,c(1,nnt),cref(1,nnt),nct-nnt+1,przes,obr,non_conv) +cd write (iout,'(a,f10.5)') +cd & 'RMS deviation from reference structure:',dsqrt(rms) + do i=1,n_ene_comp + ener(i,ithread)=energia(i) + enddo + ener(n_ene_comp+1,ithread)=energia(0) + ener(n_ene_comp+3,ithread)=rms + if (refstr) then + call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + ener(n_ene_comp+2,ithread)=rms + ener(n_ene_comp+4,ithread)=frac + ener(n_ene_comp+5,ithread)=frac_nn + endif + call write_stat_thread(ithread,ipattern,ist) +c write (istat,'(i4,2x,a8,i4,11(1pe14.5),2(0pf8.3),f8.5)') +c & ithread,str_nam(ipattern),ist+1,(ener(k,ithread),k=1,11), +c & (ener(k,ithread),k=12,14) +#ifdef MPI + if (me.eq.king) then + nacc_tot=nacc_tot+1 + call pattern_receive + call receive_MCM_info + if (nacc_tot.ge.nthread) then + write (iout,*) + & 'Sufficient number of conformations collected nacc_tot=', + & nacc_tot,'. Stopping other processors and terminating.' + write (*,*) + & 'Sufficient number of conformations collected nacc_tot=', + & nacc_tot,'. Stopping other processors and terminating.' + call recv_stop_sig(Kwita) + if (Kwita.eq.0) call send_stop_sig(-1) + nthread=ithread + goto 777 + endif + else + call send_MCM_info(2) + endif +#endif + if (timlim-curr_tim1-safety .lt. max_time_for_thread) then + write (iout,'(/2a)') + & '********** There would be not enough time for another thread. ', + & 'The program will stop.' + write (*,'(/2a)') + & '********** There would be not enough time for another thread. ', + & 'The program will stop.' + write (iout,'(a,1pe14.4/)') + & 'Elapsed time for last threading step: ',time_for_thread + nthread=ithread +#ifdef MPI + call recv_stop_sig(Kwita) + call send_stop_sig(-2) +#endif + goto 777 + else + curr_tim=curr_tim1 + write (iout,'(a,1pe14.4)') + & 'Elapsed time for this threading step: ',time_for_thread + endif +#ifdef MPI + if (Kwita.eq.0) call recv_stop_sig(Kwita) + if (Kwita.lt.0) then + write (iout,*) 'Stop signal received. Terminating.' + write (*,*) 'Stop signal received. Terminating.' + nthread=ithread + write (*,*) 'nthread=',nthread,' ithread=',ithread + goto 777 + endif +#endif + enddo +#ifdef MPI + call send_stop_sig(-1) +#endif + 777 continue +#ifdef MPI +C Any messages left for me? + call pattern_receive + if (Kwita.eq.0) call recv_stop_sig(Kwita) +#endif + call write_thread_summary +#ifdef MPI + if (king.eq.king) then + Kwita=1 + do while (Kwita.ne.0 .or. nacc_tot.ne.0) + Kwita=0 + nacc_tot=0 + call recv_stop_sig(Kwita) + call receive_MCM_info + enddo + do iproc=1,nprocs-1 + call receive_thread_results(iproc) + enddo + call write_thread_summary + else + call send_thread_results + endif +#endif + return + end +c-------------------------------------------------------------------------- + subroutine write_thread_summary +C Thread the sequence through a database of known structures + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.DBASE' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.THREAD' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' +#ifdef MPI + include 'COMMON.INFO' +#endif + dimension ip(maxthread) + double precision energia(0:n_ene) + write (iout,'(30x,a/)') + & ' *********** Summary threading statistics ************' + write (iout,'(a)') 'Initial energies:' + write (iout,'(a4,2x,a12,14a14,3a8)') + & 'No','seq',(ename(print_order(i)),i=1,nprint_ene),'ETOT', + & 'RMSnat','NatCONT','NNCONT','RMS' +C Energy sort patterns + do i=1,nthread + ip(i)=i + enddo + do i=1,nthread-1 + enet=ener(n_ene-1,ip(i)) + jj=i + do j=i+1,nthread + if (ener(n_ene-1,ip(j)).lt.enet) then + jj=j + enet=ener(n_ene-1,ip(j)) + endif + enddo + if (jj.ne.i) then + ipj=ip(jj) + ip(jj)=ip(i) + ip(i)=ipj + endif + enddo + do ik=1,nthread + i=ip(ik) + ii=ipatt(1,i) + ist=nres_base(2,ii)+ipatt(2,i) + do kk=1,n_ene_comp + energia(i)=ener0(kk,i) + enddo + etot=ener0(n_ene_comp+1,i) + rmsnat=ener0(n_ene_comp+2,i) + rms=ener0(n_ene_comp+3,i) + frac=ener0(n_ene_comp+4,i) + frac_nn=ener0(n_ene_comp+5,i) + + if (refstr) then + write (iout,'(i4,2x,a8,i4,14(1pe14.5),0pf8.3,f8.5,f8.5,f8.3)') + & i,str_nam(ii),ist+1, + & (energia(print_order(kk)),kk=1,nprint_ene), + & etot,rmsnat,frac,frac_nn,rms + else + write (iout,'(i4,2x,a8,i4,14(1pe14.5),0pf8.3)') + & i,str_nam(ii),ist+1, + & (energia(print_order(kk)),kk=1,nprint_ene),etot + endif + enddo + write (iout,'(//a)') 'Final energies:' + write (iout,'(a4,2x,a12,17a14,3a8)') + & 'No','seq',(ename(print_order(kk)),kk=1,nprint_ene),'ETOT', + & 'RMSnat','NatCONT','NNCONT','RMS' + do ik=1,nthread + i=ip(ik) + ii=ipatt(1,i) + ist=nres_base(2,ii)+ipatt(2,i) + do kk=1,n_ene_comp + energia(kk)=ener(kk,ik) + enddo + etot=ener(n_ene_comp+1,i) + rmsnat=ener(n_ene_comp+2,i) + rms=ener(n_ene_comp+3,i) + frac=ener(n_ene_comp+4,i) + frac_nn=ener(n_ene_comp+5,i) + write (iout,'(i4,2x,a8,i4,14(1pe14.5),0pf8.3,f8.5,f8.5,f8.3)') + & i,str_nam(ii),ist+1, + & (energia(print_order(kk)),kk=1,nprint_ene), + & etot,rmsnat,frac,frac_nn,rms + enddo + write (iout,'(/a/)') 'IEXAM array:' + write (iout,'(i5)') nexcl + do i=1,nexcl + write (iout,'(2i5)') iexam(1,i),iexam(2,i) + enddo + write (iout,'(/a,1pe14.4/a,1pe14.4/)') + & 'Max. time for threading step ',max_time_for_thread, + & 'Average time for threading step: ',ave_time_for_thread + return + end +c---------------------------------------------------------------------------- + subroutine sc_conf +C Sample (hopefully) optimal SC orientations given backcone conformation. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DBASE' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.THREAD' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + double precision varia(maxvar) + common /srutu/ icall + double precision energia(0:n_ene) + logical glycine,fail + maxsample=10 + link_end0=link_end + link_end=min0(link_end,nss) + do i=nnt,nct + if (itype(i).ne.10) then +cd print *,'i=',i,' itype=',itype(i),' theta=',theta(i+1) + call gen_side(itype(i),theta(i+1),alph(i),omeg(i),fail) + endif + enddo + call chainbuild + call etotal(energia(0)) + do isample=1,maxsample +C Choose a non-glycine side chain. + glycine=.true. + do while(glycine) + ind_sc=iran_num(nnt,nct) + glycine=(itype(ind_sc).eq.10) + enddo + alph0=alph(ind_sc) + omeg0=omeg(ind_sc) + call gen_side(itype(ind_sc),theta(ind_sc+1),alph(ind_sc), + & omeg(ind_sc),fail) + call chainbuild + call etotal(energia(0)) +cd write (iout,'(a,i5,a,i4,2(a,f8.3),2(a,1pe14.5))') +cd & 'Step:',isample,' SC',ind_sc,' alpha',alph(ind_sc)*rad2deg, +cd & ' omega',omeg(ind_sc)*rad2deg,' old energy',e0,' new energy',e1 + e1=0.0d0 + if (e0.le.e1) then + alph(ind_sc)=alph0 + omeg(ind_sc)=omeg0 + else + e0=e1 + endif + enddo + link_end=link_end0 + return + end +c--------------------------------------------------------------------------- + subroutine write_stat_thread(ithread,ipattern,ist) + implicit real*8 (a-h,o-z) + include "DIMENSIONS" + include "COMMON.CONTROL" + include "COMMON.IOUNITS" + include "COMMON.THREAD" + include "COMMON.FFIELD" + include "COMMON.DBASE" + include "COMMON.NAMES" + double precision energia(0:n_ene) + +#if defined(AIX) || defined(PGI) + open(istat,file=statname,position='append') +#else + open(istat,file=statname,access='append') +#endif + do i=1,n_ene_comp + energia(i)=ener(i,ithread) + enddo + etot=ener(n_ene_comp+1,ithread) + rmsnat=ener(n_ene_comp+2,ithread) + rms=ener(n_ene_comp+3,ithread) + frac=ener(n_ene_comp+4,ithread) + frac_nn=ener(n_ene_comp+5,ithread) + write (istat,'(i4,2x,a8,i4,14(1pe14.5),0pf8.3,f8.5,f8.5,f8.3)') + & ithread,str_nam(ipattern),ist+1, + & (energia(print_order(i)),i=1,nprint_ene), + & etot,rmsnat,frac,frac_nn,rms + close (istat) + return + end diff --git a/source/unres/src_Eshel/arcos.f b/source/unres/src_Eshel/arcos.f new file mode 100644 index 0000000..f054118 --- /dev/null +++ b/source/unres/src_Eshel/arcos.f @@ -0,0 +1,9 @@ + FUNCTION ARCOS(X) + implicit real*8 (a-h,o-z) + include 'COMMON.GEO' + IF (DABS(X).LT.1.0D0) GOTO 1 + ARCOS=PIPOL*(1.0d0-DSIGN(1.0D0,X)) + RETURN + 1 ARCOS=DACOS(X) + RETURN + END diff --git a/source/unres/src_Eshel/bond_move.f b/source/unres/src_Eshel/bond_move.f new file mode 100644 index 0000000..4843f60 --- /dev/null +++ b/source/unres/src_Eshel/bond_move.f @@ -0,0 +1,124 @@ + subroutine bond_move(nbond,nstart,psi,lprint,error) +C Move NBOND fragment starting from the CA(nstart) by angle PSI. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer nbond,nstart + double precision psi + logical fail,error,lprint + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.MCM' + dimension x(3),e(3,3),e1(3),e2(3),e3(3),rot(3,3),trans(3,3) + error=.false. + nend=nstart+nbond + if (print_mc.gt.2) then + write (iout,*) 'nstart=',nstart,' nend=',nend,' nbond=',nbond + write (iout,*) 'psi=',psi + write (iout,'(a)') 'Original coordinates of the fragment' + do i=nstart,nend + write (iout,'(i5,3f10.5)') i,(c(j,i),j=1,3) + enddo + endif + if (nstart.lt.1 .or. nend .gt.nres .or. nbond.lt.2 .or. + & nbond.ge.nres-1) then + write (iout,'(a)') 'Bad data in BOND_MOVE.' + error=.true. + return + endif +C Generate the reference system. + i2=nend + i3=nstart + i4=nstart+1 + call refsys(i2,i3,i4,e1,e2,e3,error) +C Return, if couldn't define the reference system. + if (error) return +C Compute the transformation matrix. + cospsi=dcos(psi) + sinpsi=dsin(psi) + rot(1,1)=1.0D0 + rot(1,2)=0.0D0 + rot(1,3)=0.0D0 + rot(2,1)=0.0D0 + rot(2,2)=cospsi + rot(2,3)=-sinpsi + rot(3,1)=0.0D0 + rot(3,2)=sinpsi + rot(3,3)=cospsi + do i=1,3 + e(1,i)=e1(i) + e(2,i)=e2(i) + e(3,i)=e3(i) + enddo + + if (print_mc.gt.2) then + write (iout,'(a)') 'Reference system and matrix r:' + do i=1,3 + write(iout,'(i5,2(3f10.5,5x))')i,(e(i,j),j=1,3),(rot(i,j),j=1,3) + enddo + endif + + call matmult(rot,e,trans) + do i=1,3 + do j=1,3 + e(i,1)=e1(i) + e(i,2)=e2(i) + e(i,3)=e3(i) + enddo + enddo + call matmult(e,trans,trans) + + if (lprint) then + write (iout,'(a)') 'The trans matrix:' + do i=1,3 + write (iout,'(i5,3f10.5)') i,(trans(i,j),j=1,3) + enddo + endif + + do i=nstart,nend + do j=1,3 + rij=c(j,nstart) + do k=1,3 + rij=rij+trans(j,k)*(c(k,i)-c(k,nstart)) + enddo + x(j)=rij + enddo + do j=1,3 + c(j,i)=x(j) + enddo + enddo + + if (lprint) then + write (iout,'(a)') 'Rotated coordinates of the fragment' + do i=nstart,nend + write (iout,'(i5,3f10.5)') i,(c(j,i),j=1,3) + enddo + endif + +c call int_from_cart(.false.,lprint) + if (nstart.gt.1) then + theta(nstart+1)=alpha(nstart-1,nstart,nstart+1) + phi(nstart+2)=beta(nstart-1,nstart,nstart+1,nstart+2) + if (nstart.gt.2) phi(nstart+1)= + & beta(nstart-2,nstart-1,nstart,nstart+1) + endif + if (nend.lt.nres) then + theta(nend+1)=alpha(nend-1,nend,nend+1) + phi(nend+1)=beta(nend-2,nend-1,nend,nend+1) + if (nend.lt.nres-1) phi(nend+2)= + & beta(nend-1,nend,nend+1,nend+2) + endif + if (print_mc.gt.2) then + write (iout,'(/a,i3,a,i3,a/)') + & 'Moved internal coordinates of the ',nstart,'-',nend, + & ' fragment:' + do i=nstart+1,nstart+2 + write (iout,'(i5,2f10.5)') i,rad2deg*theta(i),rad2deg*phi(i) + enddo + do i=nend+1,nend+2 + write (iout,'(i5,2f10.5)') i,rad2deg*theta(i),rad2deg*phi(i) + enddo + endif + return + end diff --git a/source/unres/src_Eshel/cartder.F b/source/unres/src_Eshel/cartder.F new file mode 100644 index 0000000..e2e8c1a --- /dev/null +++ b/source/unres/src_Eshel/cartder.F @@ -0,0 +1,314 @@ + subroutine cartder +*********************************************************************** +* This subroutine calculates the derivatives of the consecutive virtual +* bond vectors and the SC vectors in the virtual-bond angles theta and +* virtual-torsional angles phi, as well as the derivatives of SC vectors +* in the angles alpha and omega, describing the location of a side chain +* in its local coordinate system. +* +* The derivatives are stored in the following arrays: +* +* DDCDV - the derivatives of virtual-bond vectors DC in theta and phi. +* The structure is as follows: +* +* dDC(x,2)/dT(3),...,dDC(z,2)/dT(3),0, 0, 0 +* dDC(x,3)/dT(4),...,dDC(z,3)/dT(4),dDC(x,3)/dP(4),dDC(y,4)/dP(4),dDC(z,4)/dP(4) +* . . . . . . . . . . . . . . . . . . +* dDC(x,N-1)/dT(4),...,dDC(z,N-1)/dT(4),dDC(x,N-1)/dP(4),dDC(y,N-1)/dP(4),dDC(z,N-1)/dP(4) +* . +* . +* . +* dDC(x,N-1)/dT(N),...,dDC(z,N-1)/dT(N),dDC(x,N-1)/dP(N),dDC(y,N-1)/dP(N),dDC(z,N-1)/dP(N) +* +* DXDV - the derivatives of the side-chain vectors in theta and phi. +* The structure is same as above. +* +* DCDS - the derivatives of the side chain vectors in the local spherical +* andgles alph and omega: +* +* dX(x,2)/dA(2),dX(y,2)/dA(2),dX(z,2)/dA(2),dX(x,2)/dO(2),dX(y,2)/dO(2),dX(z,2)/dO(2) +* dX(x,3)/dA(3),dX(y,3)/dA(3),dX(z,3)/dA(3),dX(x,3)/dO(3),dX(y,3)/dO(3),dX(z,3)/dO(3) +* . +* . +* . +* dX(x,N-1)/dA(N-1),dX(y,N-1)/dA(N-1),dX(z,N-1)/dA(N-1),dX(x,N-1)/dO(N-1),dX(y,N-1)/dO(N-1),dX(z,N-1)/dO(N-1) +* +* Version of March '95, based on an early version of November '91. +* +*********************************************************************** + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + dimension drt(3,3,maxres),rdt(3,3,maxres),dp(3,3),temp(3,3), + & fromto(3,3,maxdim),prordt(3,3,maxres),prodrt(3,3,maxres) + dimension xx(3),xx1(3) +c common /przechowalnia/ fromto +* get the position of the jth ijth fragment of the chain coordinate system +* in the fromto array. + indmat(i,j)=((2*(nres-2)-i)*(i-1))/2+j-1 +* +* calculate the derivatives of transformation matrix elements in theta +* + do i=1,nres-2 + rdt(1,1,i)=-rt(1,2,i) + rdt(1,2,i)= rt(1,1,i) + rdt(1,3,i)= 0.0d0 + rdt(2,1,i)=-rt(2,2,i) + rdt(2,2,i)= rt(2,1,i) + rdt(2,3,i)= 0.0d0 + rdt(3,1,i)=-rt(3,2,i) + rdt(3,2,i)= rt(3,1,i) + rdt(3,3,i)= 0.0d0 + enddo +* +* derivatives in phi +* + do i=2,nres-2 + drt(1,1,i)= 0.0d0 + drt(1,2,i)= 0.0d0 + drt(1,3,i)= 0.0d0 + drt(2,1,i)= rt(3,1,i) + drt(2,2,i)= rt(3,2,i) + drt(2,3,i)= rt(3,3,i) + drt(3,1,i)=-rt(2,1,i) + drt(3,2,i)=-rt(2,2,i) + drt(3,3,i)=-rt(2,3,i) + enddo +* +* generate the matrix products of type r(i)t(i)...r(j)t(j) +* + do i=2,nres-2 + ind=indmat(i,i+1) + do k=1,3 + do l=1,3 + temp(k,l)=rt(k,l,i) + enddo + enddo + do k=1,3 + do l=1,3 + fromto(k,l,ind)=temp(k,l) + enddo + enddo + do j=i+1,nres-2 + ind=indmat(i,j+1) + do k=1,3 + do l=1,3 + dpkl=0.0d0 + do m=1,3 + dpkl=dpkl+temp(k,m)*rt(m,l,j) + enddo + dp(k,l)=dpkl + fromto(k,l,ind)=dpkl + enddo + enddo + do k=1,3 + do l=1,3 + temp(k,l)=dp(k,l) + enddo + enddo + enddo + enddo +* +* Calculate derivatives. +* + ind1=0 + do i=1,nres-2 + ind1=ind1+1 +* +* Derivatives of DC(i+1) in theta(i+2) +* + do j=1,3 + do k=1,2 + dpjk=0.0D0 + do l=1,3 + dpjk=dpjk+prod(j,l,i)*rdt(l,k,i) + enddo + dp(j,k)=dpjk + prordt(j,k,i)=dp(j,k) + enddo + dp(j,3)=0.0D0 + dcdv(j,ind1)=vbld(i+1)*dp(j,1) + enddo +* +* Derivatives of SC(i+1) in theta(i+2) +* + xx1(1)=-0.5D0*xloc(2,i+1) + xx1(2)= 0.5D0*xloc(1,i+1) + do j=1,3 + xj=0.0D0 + do k=1,2 + xj=xj+r(j,k,i)*xx1(k) + enddo + xx(j)=xj + enddo + do j=1,3 + rj=0.0D0 + do k=1,3 + rj=rj+prod(j,k,i)*xx(k) + enddo + dxdv(j,ind1)=rj + enddo +* +* Derivatives of SC(i+1) in theta(i+3). The have to be handled differently +* than the other off-diagonal derivatives. +* + do j=1,3 + dxoiij=0.0D0 + do k=1,3 + dxoiij=dxoiij+dp(j,k)*xrot(k,i+2) + enddo + dxdv(j,ind1+1)=dxoiij + enddo +cd print *,ind1+1,(dxdv(j,ind1+1),j=1,3) +* +* Derivatives of DC(i+1) in phi(i+2) +* + do j=1,3 + do k=1,3 + dpjk=0.0 + do l=2,3 + dpjk=dpjk+prod(j,l,i)*drt(l,k,i) + enddo + dp(j,k)=dpjk + prodrt(j,k,i)=dp(j,k) + enddo + dcdv(j+3,ind1)=vbld(i+1)*dp(j,1) + enddo +* +* Derivatives of SC(i+1) in phi(i+2) +* + xx(1)= 0.0D0 + xx(3)= xloc(2,i+1)*r(2,2,i)+xloc(3,i+1)*r(2,3,i) + xx(2)=-xloc(2,i+1)*r(3,2,i)-xloc(3,i+1)*r(3,3,i) + do j=1,3 + rj=0.0D0 + do k=2,3 + rj=rj+prod(j,k,i)*xx(k) + enddo + dxdv(j+3,ind1)=-rj + enddo +* +* Derivatives of SC(i+1) in phi(i+3). +* + do j=1,3 + dxoiij=0.0D0 + do k=1,3 + dxoiij=dxoiij+dp(j,k)*xrot(k,i+2) + enddo + dxdv(j+3,ind1+1)=dxoiij + enddo +* +* Calculate the derivatives of DC(i+1) and SC(i+1) in theta(i+3) thru +* theta(nres) and phi(i+3) thru phi(nres). +* + do j=i+1,nres-2 + ind1=ind1+1 + ind=indmat(i+1,j+1) +cd print *,'i=',i,' j=',j,' ind=',ind,' ind1=',ind1 + do k=1,3 + do l=1,3 + tempkl=0.0D0 + do m=1,2 + tempkl=tempkl+prordt(k,m,i)*fromto(m,l,ind) + enddo + temp(k,l)=tempkl + enddo + enddo +cd print '(9f8.3)',((fromto(k,l,ind),l=1,3),k=1,3) +cd print '(9f8.3)',((prod(k,l,i),l=1,3),k=1,3) +cd print '(9f8.3)',((temp(k,l),l=1,3),k=1,3) +* Derivatives of virtual-bond vectors in theta + do k=1,3 + dcdv(k,ind1)=vbld(i+1)*temp(k,1) + enddo +cd print '(3f8.3)',(dcdv(k,ind1),k=1,3) +* Derivatives of SC vectors in theta + do k=1,3 + dxoijk=0.0D0 + do l=1,3 + dxoijk=dxoijk+temp(k,l)*xrot(l,j+2) + enddo + dxdv(k,ind1+1)=dxoijk + enddo +* +*--- Calculate the derivatives in phi +* + do k=1,3 + do l=1,3 + tempkl=0.0D0 + do m=1,3 + tempkl=tempkl+prodrt(k,m,i)*fromto(m,l,ind) + enddo + temp(k,l)=tempkl + enddo + enddo + do k=1,3 + dcdv(k+3,ind1)=vbld(i+1)*temp(k,1) + enddo + do k=1,3 + dxoijk=0.0D0 + do l=1,3 + dxoijk=dxoijk+temp(k,l)*xrot(l,j+2) + enddo + dxdv(k+3,ind1+1)=dxoijk + enddo + enddo + enddo +* +* Derivatives in alpha and omega: +* + do i=2,nres-1 +c dsci=dsc(itype(i)) + dsci=vbld(i+nres) +#ifdef OSF + alphi=alph(i) + omegi=omeg(i) + if(alphi.ne.alphi) alphi=100.0 + if(omegi.ne.omegi) omegi=-100.0 +#else + alphi=alph(i) + omegi=omeg(i) +#endif +cd print *,'i=',i,' dsci=',dsci,' alphi=',alphi,' omegi=',omegi + cosalphi=dcos(alphi) + sinalphi=dsin(alphi) + cosomegi=dcos(omegi) + sinomegi=dsin(omegi) + temp(1,1)=-dsci*sinalphi + temp(2,1)= dsci*cosalphi*cosomegi + temp(3,1)=-dsci*cosalphi*sinomegi + temp(1,2)=0.0D0 + temp(2,2)=-dsci*sinalphi*sinomegi + temp(3,2)=-dsci*sinalphi*cosomegi + theta2=pi-0.5D0*theta(i+1) + cost2=dcos(theta2) + sint2=dsin(theta2) + jjj=0 +cd print *,((temp(l,k),l=1,3),k=1,2) + do j=1,2 + xp=temp(1,j) + yp=temp(2,j) + xxp= xp*cost2+yp*sint2 + yyp=-xp*sint2+yp*cost2 + zzp=temp(3,j) + xx(1)=xxp + xx(2)=yyp*r(2,2,i-1)+zzp*r(2,3,i-1) + xx(3)=yyp*r(3,2,i-1)+zzp*r(3,3,i-1) + do k=1,3 + dj=0.0D0 + do l=1,3 + dj=dj+prod(k,l,i-1)*xx(l) + enddo + dxds(jjj+k,i)=dj + enddo + jjj=jjj+3 + enddo + enddo + return + end + diff --git a/source/unres/src_Eshel/cartprint.f b/source/unres/src_Eshel/cartprint.f new file mode 100644 index 0000000..d79409e --- /dev/null +++ b/source/unres/src_Eshel/cartprint.f @@ -0,0 +1,19 @@ + subroutine cartprint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + write (iout,100) + do i=1,nres + write (iout,110) restyp(itype(i)),i,c(1,i),c(2,i), + & c(3,i),c(1,nres+i),c(2,nres+i),c(3,nres+i) + enddo + 100 format (//' alpha-carbon coordinates ', + & ' centroid coordinates'/ + 1 ' ', 6X,'X',11X,'Y',11X,'Z', + & 10X,'X',11X,'Y',11X,'Z') + 110 format (a,'(',i3,')',6f12.5) + return + end diff --git a/source/unres/src_Eshel/chainbuild.F b/source/unres/src_Eshel/chainbuild.F new file mode 100644 index 0000000..45a1a53 --- /dev/null +++ b/source/unres/src_Eshel/chainbuild.F @@ -0,0 +1,274 @@ + subroutine chainbuild +C +C Build the virtual polypeptide chain. Side-chain centroids are moveable. +C As of 2/17/95. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + logical lprn +C Set lprn=.true. for debugging + lprn = .false. +C +C Define the origin and orientation of the coordinate system and locate the +C first three CA's and SC(2). +C + call orig_frame +* +* Build the alpha-carbon chain. +* + do i=4,nres + call locate_next_res(i) + enddo +C +C First and last SC must coincide with the corresponding CA. +C + do j=1,3 + dc(j,nres+1)=0.0D0 + dc_norm(j,nres+1)=0.0D0 + dc(j,nres+nres)=0.0D0 + dc_norm(j,nres+nres)=0.0D0 + c(j,nres+1)=c(j,1) + c(j,nres+nres)=c(j,nres) + enddo +* +* Temporary diagnosis +* + if (lprn) then + + call cartprint + write (iout,'(/a)') 'Recalculated internal coordinates' + do i=2,nres-1 + do j=1,3 + c(j,maxres2)=0.5D0*(c(j,i-1)+c(j,i+1)) + enddo + be=0.0D0 + if (i.gt.3) be=rad2deg*beta(i-3,i-2,i-1,i) + be1=rad2deg*beta(nres+i,i,maxres2,i+1) + alfai=0.0D0 + if (i.gt.2) alfai=rad2deg*alpha(i-2,i-1,i) + write (iout,1212) restyp(itype(i)),i,dist(i-1,i), + & alfai,be,dist(nres+i,i),rad2deg*alpha(nres+i,i,maxres2),be1 + enddo + 1212 format (a3,'(',i3,')',2(f10.5,2f10.2)) + + endif + + return + end +c------------------------------------------------------------------------- + subroutine orig_frame +C +C Define the origin and orientation of the coordinate system and locate +C the first three atoms. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.VAR' + cost=dcos(theta(3)) + sint=dsin(theta(3)) + t(1,1,1)=-cost + t(1,2,1)=-sint + t(1,3,1)= 0.0D0 + t(2,1,1)=-sint + t(2,2,1)= cost + t(2,3,1)= 0.0D0 + t(3,1,1)= 0.0D0 + t(3,2,1)= 0.0D0 + t(3,3,1)= 1.0D0 + r(1,1,1)= 1.0D0 + r(1,2,1)= 0.0D0 + r(1,3,1)= 0.0D0 + r(2,1,1)= 0.0D0 + r(2,2,1)= 1.0D0 + r(2,3,1)= 0.0D0 + r(3,1,1)= 0.0D0 + r(3,2,1)= 0.0D0 + r(3,3,1)= 1.0D0 + do i=1,3 + do j=1,3 + rt(i,j,1)=t(i,j,1) + enddo + enddo + do i=1,3 + do j=1,3 + prod(i,j,1)=0.0D0 + prod(i,j,2)=t(i,j,1) + enddo + prod(i,i,1)=1.0D0 + enddo + c(1,1)=0.0D0 + c(2,1)=0.0D0 + c(3,1)=0.0D0 + c(1,2)=vbld(2) + c(2,2)=0.0D0 + c(3,2)=0.0D0 + dc(1,0)=0.0d0 + dc(2,0)=0.0D0 + dc(3,0)=0.0D0 + dc(1,1)=vbld(2) + dc(2,1)=0.0D0 + dc(3,1)=0.0D0 + dc_norm(1,0)=0.0D0 + dc_norm(2,0)=0.0D0 + dc_norm(3,0)=0.0D0 + dc_norm(1,1)=1.0D0 + dc_norm(2,1)=0.0D0 + dc_norm(3,1)=0.0D0 + do j=1,3 + dc_norm(j,2)=prod(j,1,2) + dc(j,2)=vbld(3)*prod(j,1,2) + c(j,3)=c(j,2)+dc(j,2) + enddo + call locate_side_chain(2) + return + end +c----------------------------------------------------------------------------- + subroutine locate_next_res(i) +C +C Locate CA(i) and SC(i-1) +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' +C +C Define the rotation matrices corresponding to CA(i) +C +#ifdef OSF + theti=theta(i) + if (theti.ne.theti) theti=100.0 + phii=phi(i) + if (phii.ne.phii) phii=180.0 +#else + theti=theta(i) + phii=phi(i) +#endif + cost=dcos(theti) + sint=dsin(theti) + cosphi=dcos(phii) + sinphi=dsin(phii) +* Define the matrices of the rotation about the virtual-bond valence angles +* theta, T(i,j,k), virtual-bond dihedral angles gamma (miscalled PHI in this +* program), R(i,j,k), and, the cumulative matrices of rotation RT + t(1,1,i-2)=-cost + t(1,2,i-2)=-sint + t(1,3,i-2)= 0.0D0 + t(2,1,i-2)=-sint + t(2,2,i-2)= cost + t(2,3,i-2)= 0.0D0 + t(3,1,i-2)= 0.0D0 + t(3,2,i-2)= 0.0D0 + t(3,3,i-2)= 1.0D0 + r(1,1,i-2)= 1.0D0 + r(1,2,i-2)= 0.0D0 + r(1,3,i-2)= 0.0D0 + r(2,1,i-2)= 0.0D0 + r(2,2,i-2)=-cosphi + r(2,3,i-2)= sinphi + r(3,1,i-2)= 0.0D0 + r(3,2,i-2)= sinphi + r(3,3,i-2)= cosphi + rt(1,1,i-2)=-cost + rt(1,2,i-2)=-sint + rt(1,3,i-2)=0.0D0 + rt(2,1,i-2)=sint*cosphi + rt(2,2,i-2)=-cost*cosphi + rt(2,3,i-2)=sinphi + rt(3,1,i-2)=-sint*sinphi + rt(3,2,i-2)=cost*sinphi + rt(3,3,i-2)=cosphi + call matmult(prod(1,1,i-2),rt(1,1,i-2),prod(1,1,i-1)) + do j=1,3 + dc_norm(j,i-1)=prod(j,1,i-1) + dc(j,i-1)=vbld(i)*prod(j,1,i-1) + c(j,i)=c(j,i-1)+dc(j,i-1) + enddo +cd print '(2i3,2(3f10.5,5x))', i-1,i,(dc(j,i-1),j=1,3),(c(j,i),j=1,3) +C +C Now calculate the coordinates of SC(i-1) +C + call locate_side_chain(i-1) + return + end +c----------------------------------------------------------------------------- + subroutine locate_side_chain(i) +C +C Locate the side-chain centroid i, 1 < i < NRES. Put in C(*,NRES+i). +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + dimension xx(3) + +c dsci=dsc(itype(i)) +c dsci_inv=dsc_inv(itype(i)) + dsci=vbld(i+nres) + dsci_inv=vbld_inv(i+nres) +#ifdef OSF + alphi=alph(i) + omegi=omeg(i) + if (alphi.ne.alphi) alphi=100.0 + if (omegi.ne.omegi) omegi=-100.0 +#else + alphi=alph(i) + omegi=omeg(i) +#endif + cosalphi=dcos(alphi) + sinalphi=dsin(alphi) + cosomegi=dcos(omegi) + sinomegi=dsin(omegi) + xp= dsci*cosalphi + yp= dsci*sinalphi*cosomegi + zp=-dsci*sinalphi*sinomegi +* Now we have to rotate the coordinate system by 180-theta(i)/2 so as to get its +* X-axis aligned with the vector DC(*,i) + theta2=pi-0.5D0*theta(i+1) + cost2=dcos(theta2) + sint2=dsin(theta2) + xx(1)= xp*cost2+yp*sint2 + xx(2)=-xp*sint2+yp*cost2 + xx(3)= zp +cd print '(a3,i3,3f10.5,5x,3f10.5)',restyp(itype(i)),i, +cd & xp,yp,zp,(xx(k),k=1,3) + do j=1,3 + xloc(j,i)=xx(j) + enddo +* Bring the SC vectors to the common coordinate system. + xx(1)=xloc(1,i) + xx(2)=xloc(2,i)*r(2,2,i-1)+xloc(3,i)*r(2,3,i-1) + xx(3)=xloc(2,i)*r(3,2,i-1)+xloc(3,i)*r(3,3,i-1) + do j=1,3 + xrot(j,i)=xx(j) + enddo + do j=1,3 + rj=0.0D0 + do k=1,3 + rj=rj+prod(j,k,i-1)*xx(k) + enddo + dc(j,nres+i)=rj + dc_norm(j,nres+i)=rj*dsci_inv + c(j,nres+i)=c(j,i)+rj + enddo + return + end diff --git a/source/unres/src_Eshel/change.awk b/source/unres/src_Eshel/change.awk new file mode 100644 index 0000000..d192a6e --- /dev/null +++ b/source/unres/src_Eshel/change.awk @@ -0,0 +1,11 @@ +{ + if($0==" include 'COMMON.LANGEVIN'") { + print "#ifndef LANG0" + print " include 'COMMON.LANGEVIN'" + print "#else" + print " include 'COMMON.LANGEVIN.lang0'" + print "#endif" + }else{ + print $0 + } +} diff --git a/source/unres/src_Eshel/check_bond.f b/source/unres/src_Eshel/check_bond.f new file mode 100644 index 0000000..c8a4ad1 --- /dev/null +++ b/source/unres/src_Eshel/check_bond.f @@ -0,0 +1,20 @@ + subroutine check_bond +C Subroutine is checking if the fitted function which describs sc_rot_pot +C is correct, printing, alpha,beta, energy, data - for some known theta. +C theta angle is read from the input file. Sc_rot_pot are printed +C for the second residue in sequance. + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.CHAIN' + double precision energia(0:n_ene) + it=itype(2) + do i=1,101 + vbld(nres+2)=0.5d0+0.05d0*(i-1) + call chainbuild + call etotal(energia) + write (2,*) vbld(nres+2),energia(17) + enddo + return + end diff --git a/source/unres/src_Eshel/checkder_p.F b/source/unres/src_Eshel/checkder_p.F new file mode 100644 index 0000000..3f83b5f --- /dev/null +++ b/source/unres/src_Eshel/checkder_p.F @@ -0,0 +1,618 @@ + subroutine check_cartgrad +C Check the gradient of Cartesian coordinates in internal coordinates. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.DERIV' + include 'COMMON.SCCOR' + dimension temp(6,maxres),xx(3),gg(3) + indmat(i,j)=((2*(nres-2)-i)*(i-1))/2+j-1 +* +* Check the gradient of the virtual-bond and SC vectors in the internal +* coordinates. +* + aincr=1.0d-7 + aincr2=5.0d-8 + call cartder + write (iout,'(a)') '**************** dx/dalpha' + write (iout,'(a)') + do i=2,nres-1 + alphi=alph(i) + alph(i)=alph(i)+aincr + do k=1,3 + temp(k,i)=dc(k,nres+i) + enddo + call chainbuild + do k=1,3 + gg(k)=(dc(k,nres+i)-temp(k,i))/aincr + xx(k)=dabs((gg(k)-dxds(k,i))/(aincr*dabs(dxds(k,i))+aincr)) + enddo + write (iout,'(i4,3e15.6/4x,3e15.6,3f9.3)') + & i,(gg(k),k=1,3),(dxds(k,i),k=1,3),(xx(k),k=1,3) + write (iout,'(a)') + alph(i)=alphi + call chainbuild + enddo + write (iout,'(a)') + write (iout,'(a)') '**************** dx/domega' + write (iout,'(a)') + do i=2,nres-1 + omegi=omeg(i) + omeg(i)=omeg(i)+aincr + do k=1,3 + temp(k,i)=dc(k,nres+i) + enddo + call chainbuild + do k=1,3 + gg(k)=(dc(k,nres+i)-temp(k,i))/aincr + xx(k)=dabs((gg(k)-dxds(k+3,i))/ + & (aincr*dabs(dxds(k+3,i))+aincr)) + enddo + write (iout,'(i4,3e15.6/4x,3e15.6,3f9.3)') + & i,(gg(k),k=1,3),(dxds(k+3,i),k=1,3),(xx(k),k=1,3) + write (iout,'(a)') + omeg(i)=omegi + call chainbuild + enddo + write (iout,'(a)') + write (iout,'(a)') '**************** dx/dtheta' + write (iout,'(a)') + do i=3,nres + theti=theta(i) + theta(i)=theta(i)+aincr + do j=i-1,nres-1 + do k=1,3 + temp(k,j)=dc(k,nres+j) + enddo + enddo + call chainbuild + do j=i-1,nres-1 + ii = indmat(i-2,j) +c print *,'i=',i-2,' j=',j-1,' ii=',ii + do k=1,3 + gg(k)=(dc(k,nres+j)-temp(k,j))/aincr + xx(k)=dabs((gg(k)-dxdv(k,ii))/ + & (aincr*dabs(dxdv(k,ii))+aincr)) + enddo + write (iout,'(2i4,3e14.6/8x,3e14.6,3f9.3)') + & i,j,(gg(k),k=1,3),(dxdv(k,ii),k=1,3),(xx(k),k=1,3) + write(iout,'(a)') + enddo + write (iout,'(a)') + theta(i)=theti + call chainbuild + enddo + write (iout,'(a)') '***************** dx/dphi' + write (iout,'(a)') + do i=4,nres + phi(i)=phi(i)+aincr + do j=i-1,nres-1 + do k=1,3 + temp(k,j)=dc(k,nres+j) + enddo + enddo + call chainbuild + do j=i-1,nres-1 + ii = indmat(i-2,j) +c print *,'ii=',ii + do k=1,3 + gg(k)=(dc(k,nres+j)-temp(k,j))/aincr + xx(k)=dabs((gg(k)-dxdv(k+3,ii))/ + & (aincr*dabs(dxdv(k+3,ii))+aincr)) + enddo + write (iout,'(2i4,3e14.6/8x,3e14.6,3f9.3)') + & i,j,(gg(k),k=1,3),(dxdv(k+3,ii),k=1,3),(xx(k),k=1,3) + write(iout,'(a)') + enddo + phi(i)=phi(i)-aincr + call chainbuild + enddo + write (iout,'(a)') '****************** ddc/dtheta' + do i=1,nres-2 + thet=theta(i+2) + theta(i+2)=thet+aincr + do j=i,nres + do k=1,3 + temp(k,j)=dc(k,j) + enddo + enddo + call chainbuild + do j=i+1,nres-1 + ii = indmat(i,j) +c print *,'ii=',ii + do k=1,3 + gg(k)=(dc(k,j)-temp(k,j))/aincr + xx(k)=dabs((gg(k)-dcdv(k,ii))/ + & (aincr*dabs(dcdv(k,ii))+aincr)) + enddo + write (iout,'(2i4,3e14.6/8x,3e14.6,3f9.3)') + & i,j,(gg(k),k=1,3),(dcdv(k,ii),k=1,3),(xx(k),k=1,3) + write (iout,'(a)') + enddo + do j=1,nres + do k=1,3 + dc(k,j)=temp(k,j) + enddo + enddo + theta(i+2)=thet + enddo + write (iout,'(a)') '******************* ddc/dphi' + do i=1,nres-3 + phii=phi(i+3) + phi(i+3)=phii+aincr + do j=1,nres + do k=1,3 + temp(k,j)=dc(k,j) + enddo + enddo + call chainbuild + do j=i+2,nres-1 + ii = indmat(i+1,j) +c print *,'ii=',ii + do k=1,3 + gg(k)=(dc(k,j)-temp(k,j))/aincr + xx(k)=dabs((gg(k)-dcdv(k+3,ii))/ + & (aincr*dabs(dcdv(k+3,ii))+aincr)) + enddo + write (iout,'(2i4,3e14.6/8x,3e14.6,3f9.3)') + & i,j,(gg(k),k=1,3),(dcdv(k+3,ii),k=1,3),(xx(k),k=1,3) + write (iout,'(a)') + enddo + do j=1,nres + do k=1,3 + dc(k,j)=temp(k,j) + enddo + enddo + phi(i+3)=phii + enddo + return + end +C---------------------------------------------------------------------------- + subroutine check_ecart +C Check the gradient of the energy in Cartesian coordinates. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CONTACTS' + include 'COMMON.SCCOR' + common /srutu/ icall + dimension ggg(6),cc(3),xx(3),ddc(3),ddx(3),x(maxvar),g(maxvar) + dimension grad_s(6,maxres) + double precision energia(0:n_ene),energia1(0:n_ene) + integer uiparm(1) + double precision urparm(1) + external fdum + icg=1 + nf=0 + nfl=0 + call zerograd + aincr=1.0D-7 + print '(a)','CG processor',me,' calling CHECK_CART.' + nf=0 + icall=0 + call geom_to_var(nvar,x) + call etotal(energia(0)) + etot=energia(0) + call enerprint(energia(0)) + call gradient(nvar,x,nf,g,uiparm,urparm,fdum) + icall =1 + do i=1,nres + write (iout,'(i5,3f10.5)') i,(gradxorr(j,i),j=1,3) + enddo + do i=1,nres + do j=1,3 + grad_s(j,i)=gradc(j,i,icg) + grad_s(j+3,i)=gradx(j,i,icg) + enddo + enddo + call flush(iout) + write (iout,'(/a/)') 'Gradient in virtual-bond and SC vectors' + do i=1,nres + do j=1,3 + xx(j)=c(j,i+nres) + ddc(j)=dc(j,i) + ddx(j)=dc(j,i+nres) + enddo + do j=1,3 + dc(j,i)=dc(j,i)+aincr + do k=i+1,nres + c(j,k)=c(j,k)+aincr + c(j,k+nres)=c(j,k+nres)+aincr + enddo + call etotal(energia1(0)) + etot1=energia1(0) + ggg(j)=(etot1-etot)/aincr + dc(j,i)=ddc(j) + do k=i+1,nres + c(j,k)=c(j,k)-aincr + c(j,k+nres)=c(j,k+nres)-aincr + enddo + enddo + do j=1,3 + c(j,i+nres)=c(j,i+nres)+aincr + dc(j,i+nres)=dc(j,i+nres)+aincr + call etotal(energia1(0)) + etot1=energia1(0) + ggg(j+3)=(etot1-etot)/aincr + c(j,i+nres)=xx(j) + dc(j,i+nres)=ddx(j) + enddo + write (iout,'(i3,6(1pe12.5)/3x,6(1pe12.5)/)') + & i,(ggg(k),k=1,6),(grad_s(k,i),k=1,6) + enddo + return + end +c---------------------------------------------------------------------------- + subroutine check_ecartint +C Check the gradient of the energy in Cartesian coordinates. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CONTACTS' + include 'COMMON.MD' + include 'COMMON.LOCAL' + include 'COMMON.SPLITELE' + include 'COMMON.SCCOR' + common /srutu/ icall + dimension ggg(6),ggg1(6),cc(3),xx(3),ddc(3),ddx(3),x(maxvar), + & g(maxvar) + dimension dcnorm_safe(3),dxnorm_safe(3) + dimension grad_s(6,0:maxres),grad_s1(6,0:maxres) + double precision phi_temp(maxres),theta_temp(maxres), + & alph_temp(maxres),omeg_temp(maxres) + double precision energia(0:n_ene),energia1(0:n_ene) + integer uiparm(1) + double precision urparm(1) + external fdum + r_cut=2.0d0 + rlambd=0.3d0 + icg=1 + nf=0 + nfl=0 + call intout +c call intcartderiv +c call checkintcartgrad + call zerograd + aincr=1.0D-5 + write(iout,*) 'Calling CHECK_ECARTINT.' + nf=0 + icall=0 + call geom_to_var(nvar,x) + call etotal(energia(0)) +c do i=1,nres +c write (iout,*) "atu?", gloc_sc(1,i,icg),gloc(i,icg) +c enddo + etot=energia(0) + call enerprint(energia(0)) + call flush(iout) + write (iout,*) "enter cartgrad" +c do i=1,nres +c write (iout,*) gloc_sc(1,i,icg) +c enddo + call flush(iout) + call cartgrad + write (iout,*) "exit cartgrad" + call flush(iout) + icall =1 + do i=1,nres + write (iout,'(i5,3f10.5)') i,(gradxorr(j,i),j=1,3) + enddo + do j=1,3 + grad_s(j,0)=gcart(j,0) + enddo + do i=1,nres + do j=1,3 + grad_s(j,i)=gcart(j,i) + grad_s(j+3,i)=gxcart(j,i) + enddo + enddo + write (iout,'(/a/)') 'Gradient in virtual-bond and SC vectors' + do i=0,nres + do j=1,3 + xx(j)=c(j,i+nres) + ddc(j)=dc(j,i) + ddx(j)=dc(j,i+nres) + do k=1,3 + dcnorm_safe(k)=dc_norm(k,i) + dxnorm_safe(k)=dc_norm(k,i+nres) + enddo + enddo + do j=1,3 + dc(j,i)=ddc(j)+aincr + call chainbuild_cart +#ifdef MPI +c Broadcast the order to compute internal coordinates to the slaves. +c if (nfgtasks.gt.1) +c & call MPI_Bcast(6,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif +c call int_from_cart1(.false.) + call etotal(energia1(0)) + etot1=energia1(0) +!- end split gradient +c write(iout,'(2i5,2(a,f15.10))')i,j," etot",etot," etot1",etot1 + dc(j,i)=ddc(j)-aincr + call chainbuild_cart +c call int_from_cart1(.false.) + call etotal(energia1(0)) + etot2=energia1(0) + ggg(j)=(etot1-etot2)/(2*aincr) +c write(iout,'(2i5,2(a,f15.10))')i,j," etot",etot," etot2",etot2 + dc(j,i)=ddc(j) + call chainbuild_cart + enddo + do j=1,3 + dc(j,i+nres)=ddx(j)+aincr + call chainbuild_cart +c write (iout,*) "i",i," j",j," dxnorm+ and dxnorm" +c write (iout,'(3f15.10)') (dc_norm(k,i+nres),k=1,3) +c write (iout,'(3f15.10)') (dxnorm_safe(k),k=1,3) +c write (iout,*) "dxnormnorm",dsqrt( +c & dc_norm(1,i+nres)**2+dc_norm(2,i+nres)**2+dc_norm(3,i+nres)**2) +c write (iout,*) "dxnormnormsafe",dsqrt( +c & dxnorm_safe(1)**2+dxnorm_safe(2)**2+dxnorm_safe(3)**2) +c write (iout,*) + call etotal(energia1(0)) + etot1=energia1(0) +!- end split gradient +c write(iout,'(2i5,2(a,f15.10))')i,j," etot",etot," etot1",etot1 + dc(j,i+nres)=ddx(j)-aincr + call chainbuild_cart +c write (iout,*) "i",i," j",j," dxnorm- and dxnorm" +c write (iout,'(3f15.10)') (dc_norm(k,i+nres),k=1,3) +c write (iout,'(3f15.10)') (dxnorm_safe(k),k=1,3) +c write (iout,*) +c write (iout,*) "dxnormnorm",dsqrt( +c & dc_norm(1,i+nres)**2+dc_norm(2,i+nres)**2+dc_norm(3,i+nres)**2) +c write (iout,*) "dxnormnormsafe",dsqrt( +c & dxnorm_safe(1)**2+dxnorm_safe(2)**2+dxnorm_safe(3)**2) + call etotal(energia1(0)) + etot2=energia1(0) + ggg(j+3)=(etot1-etot2)/(2*aincr) +c write(iout,'(2i5,2(a,f15.10))')i,j," etot",etot," etot2",etot2 + dc(j,i+nres)=ddx(j) + call chainbuild_cart + enddo + write (iout,'(i3,6(1pe12.5)/3x,6(1pe12.5)/3x,6(1pe12.5)/)') + & i,(ggg(k),k=1,6),(grad_s(k,i),k=1,6),(ggg(k)/grad_s(k,i),k=1,6) + if (split_ene) then + write (iout,'(i3,6(1pe12.5)/3x,6(1pe12.5)/3x,6(1pe12.5)/)') + & i,(ggg1(k),k=1,6),(grad_s1(k,i),k=1,6),(ggg1(k)/grad_s1(k,i), + & k=1,6) + write (iout,'(i3,6(1pe12.5)/3x,6(1pe12.5)/3x,6(1pe12.5)/)') + & i,(ggg(k)+ggg1(k),k=1,6),(grad_s(k,i)+grad_s1(k,i),k=1,6), + & ((ggg(k)+ggg1(k))/(grad_s(k,i)+grad_s1(k,i)),k=1,6) + endif + enddo + return + end +c------------------------------------------------------------------------- + subroutine int_from_cart1(lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer ierror +#endif + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.SETUP' + include 'COMMON.TIME1' + logical lprn + if (lprn) write (iout,'(/a)') 'Recalculated internal coordinates' +#ifdef TIMING + time01=MPI_Wtime() +#endif +#if defined(PARINT) && defined(MPI) + do i=iint_start,iint_end+1 +#else + do i=2,nres +#endif + dnorm1=dist(i-1,i) + dnorm2=dist(i,i+1) + do j=1,3 + c(j,maxres2)=0.5D0*(2*c(j,i)+(c(j,i-1)-c(j,i))/dnorm1 + & +(c(j,i+1)-c(j,i))/dnorm2) + enddo + be=0.0D0 + if (i.gt.2) then + if (i.le.nres) phi(i+1)=beta(i-2,i-1,i,i+1) + if ((itype(i).ne.10).and.(itype(i-1).ne.10)) then + tauangle(3,i+1)=beta(i+nres-1,i-1,i,i+nres) + endif + if (itype(i-1).ne.10) then + tauangle(1,i+1)=beta(i-1+nres,i-1,i,i+1) + omicron(1,i)=alpha(i-2,i-1,i-1+nres) + omicron(2,i)=alpha(i-1+nres,i-1,i) + endif + if (itype(i).ne.10) then + tauangle(2,i+1)=beta(i-2,i-1,i,i+nres) + endif + endif + omeg(i)=beta(nres+i,i,maxres2,i+1) + alph(i)=alpha(nres+i,i,maxres2) + theta(i+1)=alpha(i-1,i,i+1) + vbld(i)=dist(i-1,i) + vbld_inv(i)=1.0d0/vbld(i) + vbld(nres+i)=dist(nres+i,i) + if (itype(i).ne.10) then + vbld_inv(nres+i)=1.0d0/vbld(nres+i) + else + vbld_inv(nres+i)=0.0d0 + endif + enddo + +#if defined(PARINT) && defined(MPI) + if (nfgtasks1.gt.1) then +cd write(iout,*) "iint_start",iint_start," iint_count", +cd & (iint_count(i),i=0,nfgtasks-1)," iint_displ", +cd & (iint_displ(i),i=0,nfgtasks-1) +cd write (iout,*) "Gather vbld backbone" +cd call flush(iout) + time00=MPI_Wtime() + call MPI_Allgatherv(vbld(iint_start),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,vbld(1),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather vbld_inv" +cd call flush(iout) + call MPI_Allgatherv(vbld_inv(iint_start),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,vbld_inv(1),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather vbld side chain" +cd call flush(iout) + call MPI_Allgatherv(vbld(iint_start+nres),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,vbld(nres+1),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather vbld_inv side chain" +cd call flush(iout) + call MPI_Allgatherv(vbld_inv(iint_start+nres), + & iint_count(fg_rank1),MPI_DOUBLE_PRECISION,vbld_inv(nres+1), + & iint_count(0),iint_displ(0),MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather theta" +cd call flush(iout) + call MPI_Allgatherv(theta(iint_start+1),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,theta(2),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather phi" +cd call flush(iout) + call MPI_Allgatherv(phi(iint_start+1),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,phi(2),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +#ifdef CRYST_SC +cd write (iout,*) "Gather alph" +cd call flush(iout) + call MPI_Allgatherv(alph(iint_start),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,alph(1),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather omeg" +cd call flush(iout) + call MPI_Allgatherv(omeg(iint_start),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,omeg(1),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +#endif + time_gather=time_gather+MPI_Wtime()-time00 + endif +#endif + do i=1,nres-1 + do j=1,3 + dc_norm(j,i)=dc(j,i)*vbld_inv(i+1) + enddo + enddo + do i=2,nres-1 + do j=1,3 + dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres) + enddo + enddo + if (lprn) then + do i=2,nres + write (iout,1212) restyp(itype(i)),i,vbld(i), + &rad2deg*theta(i),rad2deg*phi(i),vbld(nres+i), + &rad2deg*alph(i),rad2deg*omeg(i) + enddo + endif + 1212 format (a3,'(',i3,')',2(f15.10,2f10.2)) +#ifdef TIMING + time_intfcart=time_intfcart+MPI_Wtime()-time01 +#endif + return + end +c---------------------------------------------------------------------------- + subroutine check_eint +C Check the gradient of energy in internal coordinates. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.GEO' + common /srutu/ icall + dimension x(maxvar),gana(maxvar),gg(maxvar) + integer uiparm(1) + double precision urparm(1) + double precision energia(0:n_ene),energia1(0:n_ene), + & energia2(0:n_ene) + character*6 key + external fdum + call zerograd + aincr=1.0D-7 + print '(a)','Calling CHECK_INT.' + nf=0 + nfl=0 + icg=1 + call geom_to_var(nvar,x) + call var_to_geom(nvar,x) + call chainbuild + icall=1 + print *,'ICG=',ICG + call etotal(energia(0)) + etot = energia(0) + call enerprint(energia(0)) + print *,'ICG=',ICG +#ifdef MPL + if (MyID.ne.BossID) then + call mp_bcast(x(1),8*(nvar+3),BossID,fgGroupID) + nf=x(nvar+1) + nfl=x(nvar+2) + icg=x(nvar+3) + endif +#endif + nf=1 + nfl=3 +cd write (iout,'(10f8.3)') (rad2deg*x(i),i=1,nvar) + call gradient(nvar,x,nf,gana,uiparm,urparm,fdum) +cd write (iout,'(i3,1pe14.4)') (i,gana(i),i=1,nvar) + icall=1 + do i=1,nvar + xi=x(i) + x(i)=xi-0.5D0*aincr + call var_to_geom(nvar,x) + call chainbuild + call etotal(energia1(0)) + etot1=energia1(0) + x(i)=xi+0.5D0*aincr + call var_to_geom(nvar,x) + call chainbuild + call etotal(energia2(0)) + etot2=energia2(0) + gg(i)=(etot2-etot1)/aincr + write (iout,*) i,etot1,etot2 + x(i)=xi + enddo + write (iout,'(/2a)')' Variable Numerical Analytical', + & ' RelDiff*100% ' + do i=1,nvar + if (i.le.nphi) then + ii=i + key = ' phi' + else if (i.le.nphi+ntheta) then + ii=i-nphi + key=' theta' + else if (i.le.nphi+ntheta+nside) then + ii=i-(nphi+ntheta) + key=' alpha' + else + ii=i-(nphi+ntheta+nside) + key=' omega' + endif + write (iout,'(i3,a,i3,3(1pd16.6))') + & i,key,ii,gg(i),gana(i), + & 100.0D0*dabs(gg(i)-gana(i))/(dabs(gana(i))+aincr) + enddo + return + end diff --git a/source/unres/src_Eshel/compinfo.c b/source/unres/src_Eshel/compinfo.c new file mode 100644 index 0000000..e28f686 --- /dev/null +++ b/source/unres/src_Eshel/compinfo.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include + +main() +{ +FILE *in, *in1, *out; +int i,j,k,iv1,iv2,iv3; +char *p1,buf[500],buf1[500],buf2[100],buf3[100]; +struct utsname Name; +time_t Tp; + +in=fopen("cinfo.f","r"); +out=fopen("cinfo.f.new","w"); +if (fgets(buf,498,in) != NULL) + fprintf(out,"C DO NOT EDIT THIS FILE - IT HAS BEEN GENERATED BY COMPINFO.C\n"); +if (fgets(buf,498,in) != NULL) + sscanf(&buf[1],"%d %d %d",&iv1,&iv2,&iv3); +iv3++; +fprintf(out,"C %d %d %d\n",iv1,iv2,iv3); +fprintf(out," subroutine cinfo\n"); +fprintf(out," include 'COMMON.IOUNITS'\n"); +fprintf(out," write(iout,*)'++++ Compile info ++++'\n"); +fprintf(out," write(iout,*)'Version %d.%-d build %d'\n",iv1,iv2,iv3); +uname(&Name); +time(&Tp); +system("whoami > tmptmp"); +in1=fopen("tmptmp","r"); +if (fscanf(in1,"%s",buf1) != EOF) +{ +p1=ctime(&Tp); +p1[strlen(p1)-1]='\0'; +fprintf(out," write(iout,*)'compiled %s'\n",p1); +fprintf(out," write(iout,*)'compiled by %s@%s'\n",buf1,Name.nodename); +fprintf(out," write(iout,*)'OS name: %s '\n",Name.sysname); +fprintf(out," write(iout,*)'OS release: %s '\n",Name.release); +fprintf(out," write(iout,*)'OS version:',\n"); +fprintf(out," & ' %s '\n",Name.version); +fprintf(out," write(iout,*)'flags:'\n"); +} +system("rm tmptmp"); +fclose(in1); +in1=fopen("Makefile","r"); +while(fgets(buf,498,in1) != NULL) + { + if((p1=strchr(buf,'=')) != NULL && buf[0] != '#') + { + buf[strlen(buf)-1]='\0'; + if(strlen(buf) > 49) + { + buf[47]='\0'; + strcat(buf,"..."); + } + else + { + while(buf[strlen(buf)-1]=='\\') + { + strcat(buf,"\\"); + fprintf(out," write(iout,*)'%s'\n",buf); + if (fgets(buf,498,in1) != NULL) + buf[strlen(buf)-1]='\0'; + if(strlen(buf) > 49) + { + buf[47]='\0'; + strcat(buf,"..."); + } + } + } + + fprintf(out," write(iout,*)'%s'\n",buf); + } + } +fprintf(out," write(iout,*)'++++ End of compile info ++++'\n"); +fprintf(out," return\n"); +fprintf(out," end\n"); +fclose(out); +fclose(in1); +fclose(in); +system("mv cinfo.f.new cinfo.f"); +} diff --git a/source/unres/src_Eshel/contact.f b/source/unres/src_Eshel/contact.f new file mode 100644 index 0000000..a244d86 --- /dev/null +++ b/source/unres/src_Eshel/contact.f @@ -0,0 +1,195 @@ + subroutine contact(lprint,ncont,icont,co) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + real*8 facont /1.569D0/ ! facont = (2/(1-sqrt(1-1/4)))**(1/6) + integer ncont,icont(2,maxcont) + logical lprint + ncont=0 + kkk=3 + do i=nnt+kkk,nct + iti=itype(i) + do j=nnt,i-kkk + itj=itype(j) + if (ipot.ne.4) then +c rcomp=sigmaii(iti,itj)+1.0D0 + rcomp=facont*sigmaii(iti,itj) + else +c rcomp=sigma(iti,itj)+1.0D0 + rcomp=facont*sigma(iti,itj) + endif +c rcomp=6.5D0 +c print *,'rcomp=',rcomp,' dist=',dist(nres+i,nres+j) + if (dist(nres+i,nres+j).lt.rcomp) then + ncont=ncont+1 + icont(1,ncont)=i + icont(2,ncont)=j + endif + enddo + enddo + if (lprint) then + write (iout,'(a)') 'Contact map:' + do i=1,ncont + i1=icont(1,i) + i2=icont(2,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4)') + & i,restyp(it1),i1,restyp(it2),i2 + enddo + endif + co = 0.0d0 + do i=1,ncont + co = co + dfloat(iabs(icont(1,i)-icont(2,i))) + enddo + co = co / (nres*ncont) + return + end +c---------------------------------------------------------------------------- + double precision function contact_fract(ncont,ncont_ref, + & icont,icont_ref) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + integer ncont,ncont_ref,icont(2,maxcont),icont_ref(2,maxcont) + nmatch=0 +c print *,'ncont=',ncont,' ncont_ref=',ncont_ref +c write (iout,'(20i4)') (icont_ref(1,i),i=1,ncont_ref) +c write (iout,'(20i4)') (icont_ref(2,i),i=1,ncont_ref) +c write (iout,'(20i4)') (icont(1,i),i=1,ncont) +c write (iout,'(20i4)') (icont(2,i),i=1,ncont) + do i=1,ncont + do j=1,ncont_ref + if (icont(1,i).eq.icont_ref(1,j) .and. + & icont(2,i).eq.icont_ref(2,j)) nmatch=nmatch+1 + enddo + enddo +c print *,' nmatch=',nmatch +c contact_fract=dfloat(nmatch)/dfloat(max0(ncont,ncont_ref)) + contact_fract=dfloat(nmatch)/dfloat(ncont_ref) + return + end +c---------------------------------------------------------------------------- + double precision function contact_fract_nn(ncont,ncont_ref, + & icont,icont_ref) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + integer ncont,ncont_ref,icont(2,maxcont),icont_ref(2,maxcont) + nmatch=0 +c print *,'ncont=',ncont,' ncont_ref=',ncont_ref +c write (iout,'(20i4)') (icont_ref(1,i),i=1,ncont_ref) +c write (iout,'(20i4)') (icont_ref(2,i),i=1,ncont_ref) +c write (iout,'(20i4)') (icont(1,i),i=1,ncont) +c write (iout,'(20i4)') (icont(2,i),i=1,ncont) + do i=1,ncont + do j=1,ncont_ref + if (icont(1,i).eq.icont_ref(1,j) .and. + & icont(2,i).eq.icont_ref(2,j)) nmatch=nmatch+1 + enddo + enddo +c print *,' nmatch=',nmatch +c contact_fract=dfloat(nmatch)/dfloat(max0(ncont,ncont_ref)) + contact_fract_nn=dfloat(ncont-nmatch)/dfloat(ncont) + return + end +c---------------------------------------------------------------------------- + subroutine hairpin(lprint,nharp,iharp) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + integer ncont,icont(2,maxcont) + integer nharp,iharp(4,maxres/3) + logical lprint,not_done + real*8 rcomp /6.0d0/ + ncont=0 + kkk=0 +c print *,'nnt=',nnt,' nct=',nct + do i=nnt,nct-3 + do k=1,3 + c(k,2*nres+1)=0.5d0*(c(k,i)+c(k,i+1)) + enddo + do j=i+2,nct-1 + do k=1,3 + c(k,2*nres+2)=0.5d0*(c(k,j)+c(k,j+1)) + enddo + if (dist(2*nres+1,2*nres+2).lt.rcomp) then + ncont=ncont+1 + icont(1,ncont)=i + icont(2,ncont)=j + endif + enddo + enddo + if (lprint) then + write (iout,'(a)') 'PP contact map:' + do i=1,ncont + i1=icont(1,i) + i2=icont(2,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4)') + & i,restyp(it1),i1,restyp(it2),i2 + enddo + endif +c finding hairpins + nharp=0 + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if (j1.eq.i1+2 .and. i1.gt.nnt .and. j1.lt.nct) then +c write (iout,*) "found turn at ",i1,j1 + ii1=i1 + jj1=j1 + not_done=.true. + do while (not_done) + i1=i1-1 + j1=j1+1 + do j=1,ncont + if (i1.eq.icont(1,j) .and. j1.eq.icont(2,j)) goto 10 + enddo + not_done=.false. + 10 continue +c write (iout,*) i1,j1,not_done + enddo + i1=i1+1 + j1=j1-1 + if (j1-i1.gt.4) then + nharp=nharp+1 + iharp(1,nharp)=i1 + iharp(2,nharp)=j1 + iharp(3,nharp)=ii1 + iharp(4,nharp)=jj1 +c write (iout,*)'nharp',nharp,' iharp',(iharp(k,nharp),k=1,4) + endif + endif + enddo +c do i=1,nharp +c write (iout,*)'i',i,' iharp',(iharp(k,i),k=1,4) +c enddo + if (lprint) then + write (iout,*) "Hairpins:" + do i=1,nharp + i1=iharp(1,i) + j1=iharp(2,i) + ii1=iharp(3,i) + jj1=iharp(4,i) + write (iout,*) + write (iout,'(20(a,i3,1x))') (restyp(itype(k)),k,k=i1,ii1) + write (iout,'(20(a,i3,1x))') (restyp(itype(k)),k,k=j1,jj1,-1) +c do k=jj1,j1,-1 +c write (iout,'(a,i3,$)') restyp(itype(k)),k +c enddo + enddo + endif + return + end +c---------------------------------------------------------------------------- + diff --git a/source/unres/src_Eshel/convert.f b/source/unres/src_Eshel/convert.f new file mode 100644 index 0000000..dc0cccd --- /dev/null +++ b/source/unres/src_Eshel/convert.f @@ -0,0 +1,196 @@ + subroutine geom_to_var(n,x) +C +C Transfer the geometry parameters to the variable array. +C The positions of variables are as follows: +C 1. Virtual-bond torsional angles: 1 thru nres-3 +C 2. Virtual-bond valence angles: nres-2 thru 2*nres-5 +C 3. The polar angles alpha of local SC orientation: 2*nres-4 thru +C 2*nres-4+nside +C 4. The torsional angles omega of SC orientation: 2*nres-4+nside+1 +C thru 2*nre-4+2*nside +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + double precision x(n) +cd print *,'nres',nres,' nphi',nphi,' ntheta',ntheta,' nvar',nvar + do i=4,nres + x(i-3)=phi(i) +cd print *,i,i-3,phi(i) + enddo + if (n.eq.nphi) return + do i=3,nres + x(i-2+nphi)=theta(i) +cd print *,i,i-2+nphi,theta(i) + enddo + if (n.eq.nphi+ntheta) return + do i=2,nres-1 + if (ialph(i,1).gt.0) then + x(ialph(i,1))=alph(i) + x(ialph(i,1)+nside)=omeg(i) +cd print *,i,ialph(i,1),ialph(i,1)+nside,alph(i),omeg(i) + endif + enddo + return + end +C-------------------------------------------------------------------- + subroutine var_to_geom(n,x) +C +C Update geometry parameters according to the variable array. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + dimension x(n) + logical change,reduce + change=reduce(x) + if (n.gt.nphi+ntheta) then + do i=1,nside + ii=ialph(i,2) + alph(ii)=x(nphi+ntheta+i) + omeg(ii)=pinorm(x(nphi+ntheta+nside+i)) + enddo + endif + do i=4,nres + phi(i)=x(i-3) + enddo + if (n.eq.nphi) return + do i=3,nres + theta(i)=x(i-2+nphi) + if (theta(i).eq.pi) theta(i)=0.99d0*pi + x(i-2+nphi)=theta(i) + enddo + return + end +c------------------------------------------------------------------------- + logical function convert_side(alphi,omegi) + implicit none + double precision alphi,omegi + double precision pinorm + include 'COMMON.GEO' + convert_side=.false. +C Apply periodicity restrictions. + if (alphi.gt.pi) then + alphi=dwapi-alphi + omegi=pinorm(omegi+pi) + convert_side=.true. + endif + return + end +c------------------------------------------------------------------------- + logical function reduce(x) +C +C Apply periodic restrictions to variables. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + logical zm,zmiana,convert_side + dimension x(nvar) + zmiana=.false. + do i=4,nres + x(i-3)=pinorm(x(i-3)) + enddo + if (nvar.gt.nphi+ntheta) then + do i=1,nside + ii=nphi+ntheta+i + iii=ii+nside + x(ii)=thetnorm(x(ii)) + x(iii)=pinorm(x(iii)) +C Apply periodic restrictions. + zm=convert_side(x(ii),x(iii)) + zmiana=zmiana.or.zm + enddo + endif + if (nvar.eq.nphi) return + do i=3,nres + ii=i-2+nphi + iii=i-3 + x(ii)=dmod(x(ii),dwapi) +C Apply periodic restrictions. + if (x(ii).gt.pi) then + zmiana=.true. + x(ii)=dwapi-x(ii) + if (iii.gt.0) x(iii)=pinorm(x(iii)+pi) + if (i.lt.nres) x(iii+1)=pinorm(x(iii+1)+pi) + ii=ialph(i-1,1) + if (ii.gt.0) then + x(ii)=dmod(pi-x(ii),dwapi) + x(ii+nside)=pinorm(-x(ii+nside)) + zm=convert_side(x(ii),x(ii+nside)) + endif + else if (x(ii).lt.-pi) then + zmiana=.true. + x(ii)=dwapi+x(ii) + ii=ialph(i-1,1) + if (ii.gt.0) then + x(ii)=dmod(pi-x(ii),dwapi) + x(ii+nside)=pinorm(-pi-x(ii+nside)) + zm=convert_side(x(ii),x(ii+nside)) + endif + else if (x(ii).lt.0.0d0) then + zmiana=.true. + x(ii)=-x(ii) + if (iii.gt.0) x(iii)=pinorm(x(iii)+pi) + if (i.lt.nres) x(iii+1)=pinorm(x(iii+1)+pi) + ii=ialph(i-1,1) + if (ii.gt.0) then + x(ii+nside)=pinorm(-x(ii+nside)) + zm=convert_side(x(ii),x(ii+nside)) + endif + endif + enddo + reduce=zmiana + return + end +c-------------------------------------------------------------------------- + double precision function thetnorm(x) +C This function puts x within [0,2Pi]. + implicit none + double precision x,xx + include 'COMMON.GEO' + xx=dmod(x,dwapi) + if (xx.lt.0.0d0) xx=xx+dwapi + if (xx.gt.0.9999d0*pi) xx=0.9999d0*pi + thetnorm=xx + return + end +C-------------------------------------------------------------------- + subroutine var_to_geom_restr(n,xx) +C +C Update geometry parameters according to the variable array. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + dimension x(maxvar),xx(maxvar) + logical change,reduce + + call xx2x(x,xx) + change=reduce(x) + do i=1,nside + ii=ialph(i,2) + alph(ii)=x(nphi+ntheta+i) + omeg(ii)=pinorm(x(nphi+ntheta+nside+i)) + enddo + do i=4,nres + phi(i)=x(i-3) + enddo + do i=3,nres + theta(i)=x(i-2+nphi) + if (theta(i).eq.pi) theta(i)=0.99d0*pi + x(i-2+nphi)=theta(i) + enddo + return + end +c------------------------------------------------------------------------- diff --git a/source/unres/src_Eshel/cored.f b/source/unres/src_Eshel/cored.f new file mode 100644 index 0000000..1cf25e5 --- /dev/null +++ b/source/unres/src_Eshel/cored.f @@ -0,0 +1,3151 @@ + subroutine assst(iv, liv, lv, v) +c +c *** assess candidate step (***sol version 2.3) *** +c + integer liv, l + integer iv(liv) + double precision v(lv) +c +c *** purpose *** +c +c this subroutine is called by an unconstrained minimization +c routine to assess the next candidate step. it may recommend one +c of several courses of action, such as accepting the step, recom- +c puting it using the same or a new quadratic model, or halting due +c to convergence or false convergence. see the return code listing +c below. +c +c-------------------------- parameter usage -------------------------- +c +c iv (i/o) integer parameter and scratch vector -- see description +c below of iv values referenced. +c liv (in) length of iv array. +c lv (in) length of v array. +c v (i/o) real parameter and scratch vector -- see description +c below of v values referenced. +c +c *** iv values referenced *** +c +c iv(irc) (i/o) on input for the first step tried in a new iteration, +c iv(irc) should be set to 3 or 4 (the value to which it is +c set when step is definitely to be accepted). on input +c after step has been recomputed, iv(irc) should be +c unchanged since the previous return of assst. +c on output, iv(irc) is a return code having one of the +c following values... +c 1 = switch models or try smaller step. +c 2 = switch models or accept step. +c 3 = accept step and determine v(radfac) by gradient +c tests. +c 4 = accept step, v(radfac) has been determined. +c 5 = recompute step (using the same model). +c 6 = recompute step with radius = v(lmaxs) but do not +c evaulate the objective function. +c 7 = x-convergence (see v(xctol)). +c 8 = relative function convergence (see v(rfctol)). +c 9 = both x- and relative function convergence. +c 10 = absolute function convergence (see v(afctol)). +c 11 = singular convergence (see v(lmaxs)). +c 12 = false convergence (see v(xftol)). +c 13 = iv(irc) was out of range on input. +c return code i has precdence over i+1 for i = 9, 10, 11. +c iv(mlstgd) (i/o) saved value of iv(model). +c iv(model) (i/o) on input, iv(model) should be an integer identifying +c the current quadratic model of the objective function. +c if a previous step yielded a better function reduction, +c then iv(model) will be set to iv(mlstgd) on output. +c iv(nfcall) (in) invocation count for the objective function. +c iv(nfgcal) (i/o) value of iv(nfcall) at step that gave the biggest +c function reduction this iteration. iv(nfgcal) remains +c unchanged until a function reduction is obtained. +c iv(radinc) (i/o) the number of radius increases (or minus the number +c of decreases) so far this iteration. +c iv(restor) (out) set to 1 if v(f) has been restored and x should be +c restored to its initial value, to 2 if x should be saved, +c to 3 if x should be restored from the saved value, and to +c 0 otherwise. +c iv(stage) (i/o) count of the number of models tried so far in the +c current iteration. +c iv(stglim) (in) maximum number of models to consider. +c iv(switch) (out) set to 0 unless a new model is being tried and it +c gives a smaller function value than the previous model, +c in which case assst sets iv(switch) = 1. +c iv(toobig) (in) is nonzero if step was too big (e.g. if it caused +c overflow). +c iv(xirc) (i/o) value that iv(irc) would have in the absence of +c convergence, false convergence, and oversized steps. +c +c *** v values referenced *** +c +c v(afctol) (in) absolute function convergence tolerance. if the +c absolute value of the current function value v(f) is less +c than v(afctol), then assst returns with iv(irc) = 10. +c v(decfac) (in) factor by which to decrease radius when iv(toobig) is +c nonzero. +c v(dstnrm) (in) the 2-norm of d*step. +c v(dstsav) (i/o) value of v(dstnrm) on saved step. +c v(dst0) (in) the 2-norm of d times the newton step (when defined, +c i.e., for v(nreduc) .ge. 0). +c v(f) (i/o) on both input and output, v(f) is the objective func- +c tion value at x. if x is restored to a previous value, +c then v(f) is restored to the corresponding value. +c v(fdif) (out) the function reduction v(f0) - v(f) (for the output +c value of v(f) if an earlier step gave a bigger function +c decrease, and for the input value of v(f) otherwise). +c v(flstgd) (i/o) saved value of v(f). +c v(f0) (in) objective function value at start of iteration. +c v(gtslst) (i/o) value of v(gtstep) on saved step. +c v(gtstep) (in) inner product between step and gradient. +c v(incfac) (in) minimum factor by which to increase radius. +c v(lmaxs) (in) maximum reasonable step size (and initial step bound). +c if the actual function decrease is no more than twice +c what was predicted, if a return with iv(irc) = 7, 8, 9, +c or 10 does not occur, if v(dstnrm) .gt. v(lmaxs), and if +c v(preduc) .le. v(sctol) * abs(v(f0)), then assst re- +c turns with iv(irc) = 11. if so doing appears worthwhile, +c then assst repeats this test with v(preduc) computed for +c a step of length v(lmaxs) (by a return with iv(irc) = 6). +c v(nreduc) (i/o) function reduction predicted by quadratic model for +c newton step. if assst is called with iv(irc) = 6, i.e., +c if v(preduc) has been computed with radius = v(lmaxs) for +c use in the singular convervence test, then v(nreduc) is +c set to -v(preduc) before the latter is restored. +c v(plstgd) (i/o) value of v(preduc) on saved step. +c v(preduc) (i/o) function reduction predicted by quadratic model for +c current step. +c v(radfac) (out) factor to be used in determining the new radius, +c which should be v(radfac)*dst, where dst is either the +c output value of v(dstnrm) or the 2-norm of +c diag(newd)*step for the output value of step and the +c updated version, newd, of the scale vector d. for +c iv(irc) = 3, v(radfac) = 1.0 is returned. +c v(rdfcmn) (in) minimum value for v(radfac) in terms of the input +c value of v(dstnrm) -- suggested value = 0.1. +c v(rdfcmx) (in) maximum value for v(radfac) -- suggested value = 4.0. +c v(reldx) (in) scaled relative change in x caused by step, computed +c (e.g.) by function reldst as +c max (d(i)*abs(x(i)-x0(i)), 1 .le. i .le. p) / +c max (d(i)*(abs(x(i))+abs(x0(i))), 1 .le. i .le. p). +c v(rfctol) (in) relative function convergence tolerance. if the +c actual function reduction is at most twice what was pre- +c dicted and v(nreduc) .le. v(rfctol)*abs(v(f0)), then +c assst returns with iv(irc) = 8 or 9. +c v(stppar) (in) marquardt parameter -- 0 means full newton step. +c v(tuner1) (in) tuning constant used to decide if the function +c reduction was much less than expected. suggested +c value = 0.1. +c v(tuner2) (in) tuning constant used to decide if the function +c reduction was large enough to accept step. suggested +c value = 10**-4. +c v(tuner3) (in) tuning constant used to decide if the radius +c should be increased. suggested value = 0.75. +c v(xctol) (in) x-convergence criterion. if step is a newton step +c (v(stppar) = 0) having v(reldx) .le. v(xctol) and giving +c at most twice the predicted function decrease, then +c assst returns iv(irc) = 7 or 9. +c v(xftol) (in) false convergence tolerance. if step gave no or only +c a small function decrease and v(reldx) .le. v(xftol), +c then assst returns with iv(irc) = 12. +c +c------------------------------- notes ------------------------------- +c +c *** application and usage restrictions *** +c +c this routine is called as part of the nl2sol (nonlinear +c least-squares) package. it may be used in any unconstrained +c minimization solver that uses dogleg, goldfeld-quandt-trotter, +c or levenberg-marquardt steps. +c +c *** algorithm notes *** +c +c see (1) for further discussion of the assessing and model +c switching strategies. while nl2sol considers only two models, +c assst is designed to handle any number of models. +c +c *** usage notes *** +c +c on the first call of an iteration, only the i/o variables +c step, x, iv(irc), iv(model), v(f), v(dstnrm), v(gtstep), and +c v(preduc) need have been initialized. between calls, no i/o +c values execpt step, x, iv(model), v(f) and the stopping toler- +c ances should be changed. +c after a return for convergence or false convergence, one can +c change the stopping tolerances and call assst again, in which +c case the stopping tests will be repeated. +c +c *** references *** +c +c (1) dennis, j.e., jr., gay, d.m., and welsch, r.e. (1981), +c an adaptive nonlinear least-squares algorithm, +c acm trans. math. software, vol. 7, no. 3. +c +c (2) powell, m.j.d. (1970) a fortran subroutine for solving +c systems of nonlinear algebraic equations, in numerical +c methods for nonlinear algebraic equations, edited by +c p. rabinowitz, gordon and breach, london. +c +c *** history *** +c +c john dennis designed much of this routine, starting with +c ideas in (2). roy welsch suggested the model switching strategy. +c david gay and stephen peters cast this subroutine into a more +c portable form (winter 1977), and david gay cast it into its +c present form (fall 1978). +c +c *** general *** +c +c this subroutine was written in connection with research +c supported by the national science foundation under grants +c mcs-7600324, dcr75-10143, 76-14311dss, mcs76-11989, and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** no external functions and subroutines *** +c +c *** intrinsic functions *** +c/+ + double precision dabs, dmax1 +c/ +c *** no common blocks *** +c +c-------------------------- local variables -------------------------- +c + logical goodx + integer i, nfc + double precision emax, emaxs, gts, rfac1, xmax + double precision half, one, onep2, two, zero +c +c *** subscripts for iv and v *** +c + integer afctol, decfac, dstnrm, dstsav, dst0, f, fdif, flstgd, f0, + 1 gtslst, gtstep, incfac, irc, lmaxs, mlstgd, model, nfcall, + 2 nfgcal, nreduc, plstgd, preduc, radfac, radinc, rdfcmn, + 3 rdfcmx, reldx, restor, rfctol, sctol, stage, stglim, + 4 stppar, switch, toobig, tuner1, tuner2, tuner3, xctol, + 5 xftol, xirc +c +c *** data initializations *** +c +c/6 +c data half/0.5d+0/, one/1.d+0/, onep2/1.2d+0/, two/2.d+0/, +c 1 zero/0.d+0/ +c/7 + parameter (half=0.5d+0, one=1.d+0, onep2=1.2d+0, two=2.d+0, + 1 zero=0.d+0) +c/ +c +c/6 +c data irc/29/, mlstgd/32/, model/5/, nfcall/6/, nfgcal/7/, +c 1 radinc/8/, restor/9/, stage/10/, stglim/11/, switch/12/, +c 2 toobig/2/, xirc/13/ +c/7 + parameter (irc=29, mlstgd=32, model=5, nfcall=6, nfgcal=7, + 1 radinc=8, restor=9, stage=10, stglim=11, switch=12, + 2 toobig=2, xirc=13) +c/ +c/6 +c data afctol/31/, decfac/22/, dstnrm/2/, dst0/3/, dstsav/18/, +c 1 f/10/, fdif/11/, flstgd/12/, f0/13/, gtslst/14/, gtstep/4/, +c 2 incfac/23/, lmaxs/36/, nreduc/6/, plstgd/15/, preduc/7/, +c 3 radfac/16/, rdfcmn/24/, rdfcmx/25/, reldx/17/, rfctol/32/, +c 4 sctol/37/, stppar/5/, tuner1/26/, tuner2/27/, tuner3/28/, +c 5 xctol/33/, xftol/34/ +c/7 + parameter (afctol=31, decfac=22, dstnrm=2, dst0=3, dstsav=18, + 1 f=10, fdif=11, flstgd=12, f0=13, gtslst=14, gtstep=4, + 2 incfac=23, lmaxs=36, nreduc=6, plstgd=15, preduc=7, + 3 radfac=16, rdfcmn=24, rdfcmx=25, reldx=17, rfctol=32, + 4 sctol=37, stppar=5, tuner1=26, tuner2=27, tuner3=28, + 5 xctol=33, xftol=34) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + nfc = iv(nfcall) + iv(switch) = 0 + iv(restor) = 0 + rfac1 = one + goodx = .true. + i = iv(irc) + if (i .ge. 1 .and. i .le. 12) + 1 go to (20,30,10,10,40,280,220,220,220,220,220,170), i + iv(irc) = 13 + go to 999 +c +c *** initialize for new iteration *** +c + 10 iv(stage) = 1 + iv(radinc) = 0 + v(flstgd) = v(f0) + if (iv(toobig) .eq. 0) go to 110 + iv(stage) = -1 + iv(xirc) = i + go to 60 +c +c *** step was recomputed with new model or smaller radius *** +c *** first decide which *** +c + 20 if (iv(model) .ne. iv(mlstgd)) go to 30 +c *** old model retained, smaller radius tried *** +c *** do not consider any more new models this iteration *** + iv(stage) = iv(stglim) + iv(radinc) = -1 + go to 110 +c +c *** a new model is being tried. decide whether to keep it. *** +c + 30 iv(stage) = iv(stage) + 1 +c +c *** now we add the possibiltiy that step was recomputed with *** +c *** the same model, perhaps because of an oversized step. *** +c + 40 if (iv(stage) .gt. 0) go to 50 +c +c *** step was recomputed because it was too big. *** +c + if (iv(toobig) .ne. 0) go to 60 +c +c *** restore iv(stage) and pick up where we left off. *** +c + iv(stage) = -iv(stage) + i = iv(xirc) + go to (20, 30, 110, 110, 70), i +c + 50 if (iv(toobig) .eq. 0) go to 70 +c +c *** handle oversize step *** +c + if (iv(radinc) .gt. 0) go to 80 + iv(stage) = -iv(stage) + iv(xirc) = iv(irc) +c + 60 v(radfac) = v(decfac) + iv(radinc) = iv(radinc) - 1 + iv(irc) = 5 + iv(restor) = 1 + go to 999 +c + 70 if (v(f) .lt. v(flstgd)) go to 110 +c +c *** the new step is a loser. restore old model. *** +c + if (iv(model) .eq. iv(mlstgd)) go to 80 + iv(model) = iv(mlstgd) + iv(switch) = 1 +c +c *** restore step, etc. only if a previous step decreased v(f). +c + 80 if (v(flstgd) .ge. v(f0)) go to 110 + iv(restor) = 1 + v(f) = v(flstgd) + v(preduc) = v(plstgd) + v(gtstep) = v(gtslst) + if (iv(switch) .eq. 0) rfac1 = v(dstnrm) / v(dstsav) + v(dstnrm) = v(dstsav) + nfc = iv(nfgcal) + goodx = .false. +c + 110 v(fdif) = v(f0) - v(f) + if (v(fdif) .gt. v(tuner2) * v(preduc)) go to 140 + if(iv(radinc).gt.0) go to 140 +c +c *** no (or only a trivial) function decrease +c *** -- so try new model or smaller radius +c + if (v(f) .lt. v(f0)) go to 120 + iv(mlstgd) = iv(model) + v(flstgd) = v(f) + v(f) = v(f0) + iv(restor) = 1 + go to 130 + 120 iv(nfgcal) = nfc + 130 iv(irc) = 1 + if (iv(stage) .lt. iv(stglim)) go to 160 + iv(irc) = 5 + iv(radinc) = iv(radinc) - 1 + go to 160 +c +c *** nontrivial function decrease achieved *** +c + 140 iv(nfgcal) = nfc + rfac1 = one + v(dstsav) = v(dstnrm) + if (v(fdif) .gt. v(preduc)*v(tuner1)) go to 190 +c +c *** decrease was much less than predicted -- either change models +c *** or accept step with decreased radius. +c + if (iv(stage) .ge. iv(stglim)) go to 150 +c *** consider switching models *** + iv(irc) = 2 + go to 160 +c +c *** accept step with decreased radius *** +c + 150 iv(irc) = 4 +c +c *** set v(radfac) to fletcher*s decrease factor *** +c + 160 iv(xirc) = iv(irc) + emax = v(gtstep) + v(fdif) + v(radfac) = half * rfac1 + if (emax .lt. v(gtstep)) v(radfac) = rfac1 * dmax1(v(rdfcmn), + 1 half * v(gtstep)/emax) +c +c *** do false convergence test *** +c + 170 if (v(reldx) .le. v(xftol)) go to 180 + iv(irc) = iv(xirc) + if (v(f) .lt. v(f0)) go to 200 + go to 230 +c + 180 iv(irc) = 12 + go to 240 +c +c *** handle good function decrease *** +c + 190 if (v(fdif) .lt. (-v(tuner3) * v(gtstep))) go to 210 +c +c *** increasing radius looks worthwhile. see if we just +c *** recomputed step with a decreased radius or restored step +c *** after recomputing it with a larger radius. +c + if (iv(radinc) .lt. 0) go to 210 + if (iv(restor) .eq. 1) go to 210 +c +c *** we did not. try a longer step unless this was a newton +c *** step. +c + v(radfac) = v(rdfcmx) + gts = v(gtstep) + if (v(fdif) .lt. (half/v(radfac) - one) * gts) + 1 v(radfac) = dmax1(v(incfac), half*gts/(gts + v(fdif))) + iv(irc) = 4 + if (v(stppar) .eq. zero) go to 230 + if (v(dst0) .ge. zero .and. (v(dst0) .lt. two*v(dstnrm) + 1 .or. v(nreduc) .lt. onep2*v(fdif))) go to 230 +c *** step was not a newton step. recompute it with +c *** a larger radius. + iv(irc) = 5 + iv(radinc) = iv(radinc) + 1 +c +c *** save values corresponding to good step *** +c + 200 v(flstgd) = v(f) + iv(mlstgd) = iv(model) + if (iv(restor) .ne. 1) iv(restor) = 2 + v(dstsav) = v(dstnrm) + iv(nfgcal) = nfc + v(plstgd) = v(preduc) + v(gtslst) = v(gtstep) + go to 230 +c +c *** accept step with radius unchanged *** +c + 210 v(radfac) = one + iv(irc) = 3 + go to 230 +c +c *** come here for a restart after convergence *** +c + 220 iv(irc) = iv(xirc) + if (v(dstsav) .ge. zero) go to 240 + iv(irc) = 12 + go to 240 +c +c *** perform convergence tests *** +c + 230 iv(xirc) = iv(irc) + 240 if (iv(restor) .eq. 1 .and. v(flstgd) .lt. v(f0)) iv(restor) = 3 + if (half * v(fdif) .gt. v(preduc)) go to 999 + emax = v(rfctol) * dabs(v(f0)) + emaxs = v(sctol) * dabs(v(f0)) + if (v(dstnrm) .gt. v(lmaxs) .and. v(preduc) .le. emaxs) + 1 iv(irc) = 11 + if (v(dst0) .lt. zero) go to 250 + i = 0 + if ((v(nreduc) .gt. zero .and. v(nreduc) .le. emax) .or. + 1 (v(nreduc) .eq. zero. and. v(preduc) .eq. zero)) i = 2 + if (v(stppar) .eq. zero .and. v(reldx) .le. v(xctol) + 1 .and. goodx) i = i + 1 + if (i .gt. 0) iv(irc) = i + 6 +c +c *** consider recomputing step of length v(lmaxs) for singular +c *** convergence test. +c + 250 if (iv(irc) .gt. 5 .and. iv(irc) .ne. 12) go to 999 + if (v(dstnrm) .gt. v(lmaxs)) go to 260 + if (v(preduc) .ge. emaxs) go to 999 + if (v(dst0) .le. zero) go to 270 + if (half * v(dst0) .le. v(lmaxs)) go to 999 + go to 270 + 260 if (half * v(dstnrm) .le. v(lmaxs)) go to 999 + xmax = v(lmaxs) / v(dstnrm) + if (xmax * (two - xmax) * v(preduc) .ge. emaxs) go to 999 + 270 if (v(nreduc) .lt. zero) go to 290 +c +c *** recompute v(preduc) for use in singular convergence test *** +c + v(gtslst) = v(gtstep) + v(dstsav) = v(dstnrm) + if (iv(irc) .eq. 12) v(dstsav) = -v(dstsav) + v(plstgd) = v(preduc) + i = iv(restor) + iv(restor) = 2 + if (i .eq. 3) iv(restor) = 0 + iv(irc) = 6 + go to 999 +c +c *** perform singular convergence test with recomputed v(preduc) *** +c + 280 v(gtstep) = v(gtslst) + v(dstnrm) = dabs(v(dstsav)) + iv(irc) = iv(xirc) + if (v(dstsav) .le. zero) iv(irc) = 12 + v(nreduc) = -v(preduc) + v(preduc) = v(plstgd) + iv(restor) = 3 + 290 if (-v(nreduc) .le. v(sctol) * dabs(v(f0))) iv(irc) = 11 +c + 999 return +c +c *** last card of assst follows *** + end + subroutine deflt(alg, iv, liv, lv, v) +c +c *** supply ***sol (version 2.3) default values to iv and v *** +c +c *** alg = 1 means regression constants. +c *** alg = 2 means general unconstrained optimization constants. +c + integer liv, l + integer alg, iv(liv) + double precision v(lv) +c + external imdcon, vdflt + integer imdcon +c imdcon... returns machine-dependent integer constants. +c vdflt.... provides default values to v. +c + integer miv, m + integer miniv(2), minv(2) +c +c *** subscripts for iv *** +c + integer algsav, covprt, covreq, dtype, hc, ierr, inith, inits, + 1 ipivot, ivneed, lastiv, lastv, lmat, mxfcal, mxiter, + 2 nfcov, ngcov, nvdflt, outlev, parprt, parsav, perm, + 3 prunit, qrtyp, rdreq, rmat, solprt, statpr, vneed, + 4 vsave, x0prt +c +c *** iv subscript values *** +c +c/6 +c data algsav/51/, covprt/14/, covreq/15/, dtype/16/, hc/71/, +c 1 ierr/75/, inith/25/, inits/25/, ipivot/76/, ivneed/3/, +c 2 lastiv/44/, lastv/45/, lmat/42/, mxfcal/17/, mxiter/18/, +c 3 nfcov/52/, ngcov/53/, nvdflt/50/, outlev/19/, parprt/20/, +c 4 parsav/49/, perm/58/, prunit/21/, qrtyp/80/, rdreq/57/, +c 5 rmat/78/, solprt/22/, statpr/23/, vneed/4/, vsave/60/, +c 6 x0prt/24/ +c/7 + parameter (algsav=51, covprt=14, covreq=15, dtype=16, hc=71, + 1 ierr=75, inith=25, inits=25, ipivot=76, ivneed=3, + 2 lastiv=44, lastv=45, lmat=42, mxfcal=17, mxiter=18, + 3 nfcov=52, ngcov=53, nvdflt=50, outlev=19, parprt=20, + 4 parsav=49, perm=58, prunit=21, qrtyp=80, rdreq=57, + 5 rmat=78, solprt=22, statpr=23, vneed=4, vsave=60, + 6 x0prt=24) +c/ + data miniv(1)/80/, miniv(2)/59/, minv(1)/98/, minv(2)/71/ +c +c------------------------------- body -------------------------------- +c + if (alg .lt. 1 .or. alg .gt. 2) go to 40 + miv = miniv(alg) + if (liv .lt. miv) go to 20 + mv = minv(alg) + if (lv .lt. mv) go to 30 + call vdflt(alg, lv, v) + iv(1) = 12 + iv(algsav) = alg + iv(ivneed) = 0 + iv(lastiv) = miv + iv(lastv) = mv + iv(lmat) = mv + 1 + iv(mxfcal) = 200 + iv(mxiter) = 150 + iv(outlev) = 1 + iv(parprt) = 1 + iv(perm) = miv + 1 + iv(prunit) = imdcon(1) + iv(solprt) = 1 + iv(statpr) = 1 + iv(vneed) = 0 + iv(x0prt) = 1 +c + if (alg .ge. 2) go to 10 +c +c *** regression values +c + iv(covprt) = 3 + iv(covreq) = 1 + iv(dtype) = 1 + iv(hc) = 0 + iv(ierr) = 0 + iv(inits) = 0 + iv(ipivot) = 0 + iv(nvdflt) = 32 + iv(parsav) = 67 + iv(qrtyp) = 1 + iv(rdreq) = 3 + iv(rmat) = 0 + iv(vsave) = 58 + go to 999 +c +c *** general optimization values +c + 10 iv(dtype) = 0 + iv(inith) = 1 + iv(nfcov) = 0 + iv(ngcov) = 0 + iv(nvdflt) = 25 + iv(parsav) = 47 + go to 999 +c + 20 iv(1) = 15 + go to 999 +c + 30 iv(1) = 16 + go to 999 +c + 40 iv(1) = 67 +c + 999 return +c *** last card of deflt follows *** + end + double precision function dotprd(p, x, y) +c +c *** return the inner product of the p-vectors x and y. *** +c + integer p + double precision x(p), y(p) +c + integer i + double precision one, sqteta, t, zero +c/+ + double precision dmax1, dabs +c/ + external rmdcon + double precision rmdcon +c +c *** rmdcon(2) returns a machine-dependent constant, sqteta, which +c *** is slightly larger than the smallest positive number that +c *** can be squared without underflowing. +c +c/6 +c data one/1.d+0/, sqteta/0.d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, zero=0.d+0) + data sqteta/0.d+0/ +c/ +c + dotprd = zero + if (p .le. 0) go to 999 +crc if (sqteta .eq. zero) sqteta = rmdcon(2) + do 20 i = 1, p +crc t = dmax1(dabs(x(i)), dabs(y(i))) +crc if (t .gt. one) go to 10 +crc if (t .lt. sqteta) go to 20 +crc t = (x(i)/sqteta)*y(i) +crc if (dabs(t) .lt. sqteta) go to 20 + 10 dotprd = dotprd + x(i)*y(i) + 20 continue +c + 999 return +c *** last card of dotprd follows *** + end + subroutine itsum(d, g, iv, liv, lv, p, v, x) +c +c *** print iteration summary for ***sol (version 2.3) *** +c +c *** parameter declarations *** +c + integer liv, lv, p + integer iv(liv) + double precision d(p), g(p), v(lv), x(p) +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer alg, i, iv1, m, nf, ng, ol, pu +c/6 +c real model1(6), model2(6) +c/7 + character*4 model1(6), model2(6) +c/ + double precision nreldf, oldf, preldf, reldf, zero +c +c *** intrinsic functions *** +c/+ + integer iabs + double precision dabs, dmax1 +c/ +c *** no external functions or subroutines *** +c +c *** subscripts for iv and v *** +c + integer algsav, dstnrm, f, fdif, f0, needhd, nfcall, nfcov, ngcov, + 1 ngcall, niter, nreduc, outlev, preduc, prntit, prunit, + 2 reldx, solprt, statpr, stppar, sused, x0prt +c +c *** iv subscript values *** +c +c/6 +c data algsav/51/, needhd/36/, nfcall/6/, nfcov/52/, ngcall/30/, +c 1 ngcov/53/, niter/31/, outlev/19/, prntit/39/, prunit/21/, +c 2 solprt/22/, statpr/23/, sused/64/, x0prt/24/ +c/7 + parameter (algsav=51, needhd=36, nfcall=6, nfcov=52, ngcall=30, + 1 ngcov=53, niter=31, outlev=19, prntit=39, prunit=21, + 2 solprt=22, statpr=23, sused=64, x0prt=24) +c/ +c +c *** v subscript values *** +c +c/6 +c data dstnrm/2/, f/10/, f0/13/, fdif/11/, nreduc/6/, preduc/7/, +c 1 reldx/17/, stppar/5/ +c/7 + parameter (dstnrm=2, f=10, f0=13, fdif=11, nreduc=6, preduc=7, + 1 reldx=17, stppar=5) +c/ +c +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c/6 +c data model1(1)/4h /, model1(2)/4h /, model1(3)/4h /, +c 1 model1(4)/4h /, model1(5)/4h g /, model1(6)/4h s /, +c 2 model2(1)/4h g /, model2(2)/4h s /, model2(3)/4hg-s /, +c 3 model2(4)/4hs-g /, model2(5)/4h-s-g/, model2(6)/4h-g-s/ +c/7 + data model1/' ',' ',' ',' ',' g ',' s '/, + 1 model2/' g ',' s ','g-s ','s-g ','-s-g','-g-s'/ +c/ +c +c------------------------------- body -------------------------------- +c + pu = iv(prunit) + if (pu .eq. 0) go to 999 + iv1 = iv(1) + if (iv1 .gt. 62) iv1 = iv1 - 51 + ol = iv(outlev) + alg = iv(algsav) + if (iv1 .lt. 2 .or. iv1 .gt. 15) go to 370 + if (iv1 .ge. 12) go to 120 + if (iv1 .eq. 2 .and. iv(niter) .eq. 0) go to 390 + if (ol .eq. 0) go to 120 + if (iv1 .ge. 10 .and. iv(prntit) .eq. 0) go to 120 + if (iv1 .gt. 2) go to 10 + iv(prntit) = iv(prntit) + 1 + if (iv(prntit) .lt. iabs(ol)) go to 999 + 10 nf = iv(nfcall) - iabs(iv(nfcov)) + iv(prntit) = 0 + reldf = zero + preldf = zero + oldf = dmax1(dabs(v(f0)), dabs(v(f))) + if (oldf .le. zero) go to 20 + reldf = v(fdif) / oldf + preldf = v(preduc) / oldf + 20 if (ol .gt. 0) go to 60 +c +c *** print short summary line *** +c + if (iv(needhd) .eq. 1 .and. alg .eq. 1) write(pu,30) + 30 format(/10h it nf,6x,1hf,7x,5hreldf,3x,6hpreldf,3x,5hreldx, + 1 2x,13hmodel stppar) + if (iv(needhd) .eq. 1 .and. alg .eq. 2) write(pu,40) + 40 format(/11h it nf,7x,1hf,8x,5hreldf,4x,6hpreldf,4x,5hreldx, + 1 3x,6hstppar) + iv(needhd) = 0 + if (alg .eq. 2) go to 50 + m = iv(sused) + write(pu,100) iv(niter), nf, v(f), reldf, preldf, v(reldx), + 1 model1(m), model2(m), v(stppar) + go to 120 +c + 50 write(pu,110) iv(niter), nf, v(f), reldf, preldf, v(reldx), + 1 v(stppar) + go to 120 +c +c *** print long summary line *** +c + 60 if (iv(needhd) .eq. 1 .and. alg .eq. 1) write(pu,70) + 70 format(/11h it nf,6x,1hf,7x,5hreldf,3x,6hpreldf,3x,5hreldx, + 1 2x,13hmodel stppar,2x,6hd*step,2x,7hnpreldf) + if (iv(needhd) .eq. 1 .and. alg .eq. 2) write(pu,80) + 80 format(/11h it nf,7x,1hf,8x,5hreldf,4x,6hpreldf,4x,5hreldx, + 1 3x,6hstppar,3x,6hd*step,3x,7hnpreldf) + iv(needhd) = 0 + nreldf = zero + if (oldf .gt. zero) nreldf = v(nreduc) / oldf + if (alg .eq. 2) go to 90 + m = iv(sused) + write(pu,100) iv(niter), nf, v(f), reldf, preldf, v(reldx), + 1 model1(m), model2(m), v(stppar), v(dstnrm), nreldf + go to 120 +c + 90 write(pu,110) iv(niter), nf, v(f), reldf, preldf, + 1 v(reldx), v(stppar), v(dstnrm), nreldf + 100 format(i6,i5,d10.3,2d9.2,d8.1,a3,a4,2d8.1,d9.2) + 110 format(i6,i5,d11.3,2d10.2,3d9.1,d10.2) +c + 120 if (iv(statpr) .lt. 0) go to 430 + go to (999, 999, 130, 150, 170, 190, 210, 230, 250, 270, 290, 310, + 1 330, 350, 520), iv1 +c + 130 write(pu,140) + 140 format(/26h ***** x-convergence *****) + go to 430 +c + 150 write(pu,160) + 160 format(/42h ***** relative function convergence *****) + go to 430 +c + 170 write(pu,180) + 180 format(/49h ***** x- and relative function convergence *****) + go to 430 +c + 190 write(pu,200) + 200 format(/42h ***** absolute function convergence *****) + go to 430 +c + 210 write(pu,220) + 220 format(/33h ***** singular convergence *****) + go to 430 +c + 230 write(pu,240) + 240 format(/30h ***** false convergence *****) + go to 430 +c + 250 write(pu,260) + 260 format(/38h ***** function evaluation limit *****) + go to 430 +c + 270 write(pu,280) + 280 format(/28h ***** iteration limit *****) + go to 430 +c + 290 write(pu,300) + 300 format(/18h ***** stopx *****) + go to 430 +c + 310 write(pu,320) + 320 format(/44h ***** initial f(x) cannot be computed *****) +c + go to 390 +c + 330 write(pu,340) + 340 format(/37h ***** bad parameters to assess *****) + go to 999 +c + 350 write(pu,360) + 360 format(/43h ***** gradient could not be computed *****) + if (iv(niter) .gt. 0) go to 480 + go to 390 +c + 370 write(pu,380) iv(1) + 380 format(/14h ***** iv(1) =,i5,6h *****) + go to 999 +c +c *** initial call on itsum *** +c + 390 if (iv(x0prt) .ne. 0) write(pu,400) (i, x(i), d(i), i = 1, p) + 400 format(/23h i initial x(i),8x,4hd(i)//(1x,i5,d17.6,d14.3)) +c *** the following are to avoid undefined variables when the +c *** function evaluation limit is 1... + v(dstnrm) = zero + v(fdif) = zero + v(nreduc) = zero + v(preduc) = zero + v(reldx) = zero + if (iv1 .ge. 12) go to 999 + iv(needhd) = 0 + iv(prntit) = 0 + if (ol .eq. 0) go to 999 + if (ol .lt. 0 .and. alg .eq. 1) write(pu,30) + if (ol .lt. 0 .and. alg .eq. 2) write(pu,40) + if (ol .gt. 0 .and. alg .eq. 1) write(pu,70) + if (ol .gt. 0 .and. alg .eq. 2) write(pu,80) + if (alg .eq. 1) write(pu,410) v(f) + if (alg .eq. 2) write(pu,420) v(f) + 410 format(/11h 0 1,d10.3) +c365 format(/11h 0 1,e11.3) + 420 format(/11h 0 1,d11.3) + go to 999 +c +c *** print various information requested on solution *** +c + 430 iv(needhd) = 1 + if (iv(statpr) .eq. 0) go to 480 + oldf = dmax1(dabs(v(f0)), dabs(v(f))) + preldf = zero + nreldf = zero + if (oldf .le. zero) go to 440 + preldf = v(preduc) / oldf + nreldf = v(nreduc) / oldf + 440 nf = iv(nfcall) - iv(nfcov) + ng = iv(ngcall) - iv(ngcov) + write(pu,450) v(f), v(reldx), nf, ng, preldf, nreldf + 450 format(/9h function,d17.6,8h reldx,d17.3/12h func. evals, + 1 i8,9x,11hgrad. evals,i8/7h preldf,d16.3,6x,7hnpreldf,d15.3) +c + if (iv(nfcov) .gt. 0) write(pu,460) iv(nfcov) + 460 format(/1x,i4,50h extra func. evals for covariance and diagnost + 1ics.) + if (iv(ngcov) .gt. 0) write(pu,470) iv(ngcov) + 470 format(1x,i4,50h extra grad. evals for covariance and diagnosti + 1cs.) +c + 480 if (iv(solprt) .eq. 0) go to 999 + iv(needhd) = 1 + write(pu,490) + 490 format(/22h i final x(i),8x,4hd(i),10x,4hg(i)/) + do 500 i = 1, p + write(pu,510) i, x(i), d(i), g(i) + 500 continue + 510 format(1x,i5,d16.6,2d14.3) + go to 999 +c + 520 write(pu,530) + 530 format(/24h inconsistent dimensions) + 999 return +c *** last card of itsum follows *** + end + subroutine litvmu(n, x, l, y) +c +c *** solve (l**t)*x = y, where l is an n x n lower triangular +c *** matrix stored compactly by rows. x and y may occupy the same +c *** storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) + integer i, ii, ij, im1, i0, j, np1 + double precision xi, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + do 10 i = 1, n + 10 x(i) = y(i) + np1 = n + 1 + i0 = n*(n+1)/2 + do 30 ii = 1, n + i = np1 - ii + xi = x(i)/l(i0) + x(i) = xi + if (i .le. 1) go to 999 + i0 = i0 - i + if (xi .eq. zero) go to 30 + im1 = i - 1 + do 20 j = 1, im1 + ij = i0 + j + x(j) = x(j) - xi*l(ij) + 20 continue + 30 continue + 999 return +c *** last card of litvmu follows *** + end + subroutine livmul(n, x, l, y) +c +c *** solve l*x = y, where l is an n x n lower triangular +c *** matrix stored compactly by rows. x and y may occupy the same +c *** storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) + external dotprd + double precision dotprd + integer i, j, k + double precision t, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + do 10 k = 1, n + if (y(k) .ne. zero) go to 20 + x(k) = zero + 10 continue + go to 999 + 20 j = k*(k+1)/2 + x(k) = y(k) / l(j) + if (k .ge. n) go to 999 + k = k + 1 + do 30 i = k, n + t = dotprd(i-1, l(j+1), x) + j = j + i + x(i) = (y(i) - t)/l(j) + 30 continue + 999 return +c *** last card of livmul follows *** + end + subroutine parck(alg, d, iv, liv, lv, n, v) +c +c *** check ***sol (version 2.3) parameters, print changed values *** +c +c *** alg = 1 for regression, alg = 2 for general unconstrained opt. +c + integer alg, liv, lv, n + integer iv(liv) + double precision d(n), v(lv) +c + external rmdcon, vcopy, vdflt + double precision rmdcon +c rmdcon -- returns machine-dependent constants. +c vcopy -- copies one vector to another. +c vdflt -- supplies default parameter values to v alone. +c/+ + integer max0 +c/ +c +c *** local variables *** +c + integer i, ii, iv1, j, k, l, m, miv1, miv2, ndfalt, parsv1, pu + integer ijmp, jlim(2), miniv(2), ndflt(2) +c/6 +c integer varnm(2), sh(2) +c real cngd(3), dflt(3), vn(2,34), which(3) +c/7 + character*1 varnm(2), sh(2) + character*4 cngd(3), dflt(3), vn(2,34), which(3) +c/ + double precision big, machep, tiny, vk, vm(34), vx(34), zero +c +c *** iv and v subscripts *** +c + integer algsav, dinit, dtype, dtype0, epslon, inits, ivneed, + 1 lastiv, lastv, lmat, nextiv, nextv, nvdflt, oldn, + 2 parprt, parsav, perm, prunit, vneed +c +c +c/6 +c data algsav/51/, dinit/38/, dtype/16/, dtype0/54/, epslon/19/, +c 1 inits/25/, ivneed/3/, lastiv/44/, lastv/45/, lmat/42/, +c 2 nextiv/46/, nextv/47/, nvdflt/50/, oldn/38/, parprt/20/, +c 3 parsav/49/, perm/58/, prunit/21/, vneed/4/ +c/7 + parameter (algsav=51, dinit=38, dtype=16, dtype0=54, epslon=19, + 1 inits=25, ivneed=3, lastiv=44, lastv=45, lmat=42, + 2 nextiv=46, nextv=47, nvdflt=50, oldn=38, parprt=20, + 3 parsav=49, perm=58, prunit=21, vneed=4) + save big, machep, tiny +c/ +c + data big/0.d+0/, machep/-1.d+0/, tiny/1.d+0/, zero/0.d+0/ +c/6 +c data vn(1,1),vn(2,1)/4hepsl,4hon../ +c data vn(1,2),vn(2,2)/4hphmn,4hfc../ +c data vn(1,3),vn(2,3)/4hphmx,4hfc../ +c data vn(1,4),vn(2,4)/4hdecf,4hac../ +c data vn(1,5),vn(2,5)/4hincf,4hac../ +c data vn(1,6),vn(2,6)/4hrdfc,4hmn../ +c data vn(1,7),vn(2,7)/4hrdfc,4hmx../ +c data vn(1,8),vn(2,8)/4htune,4hr1../ +c data vn(1,9),vn(2,9)/4htune,4hr2../ +c data vn(1,10),vn(2,10)/4htune,4hr3../ +c data vn(1,11),vn(2,11)/4htune,4hr4../ +c data vn(1,12),vn(2,12)/4htune,4hr5../ +c data vn(1,13),vn(2,13)/4hafct,4hol../ +c data vn(1,14),vn(2,14)/4hrfct,4hol../ +c data vn(1,15),vn(2,15)/4hxcto,4hl.../ +c data vn(1,16),vn(2,16)/4hxfto,4hl.../ +c data vn(1,17),vn(2,17)/4hlmax,4h0.../ +c data vn(1,18),vn(2,18)/4hlmax,4hs.../ +c data vn(1,19),vn(2,19)/4hscto,4hl.../ +c data vn(1,20),vn(2,20)/4hdini,4ht.../ +c data vn(1,21),vn(2,21)/4hdtin,4hit../ +c data vn(1,22),vn(2,22)/4hd0in,4hit../ +c data vn(1,23),vn(2,23)/4hdfac,4h..../ +c data vn(1,24),vn(2,24)/4hdltf,4hdc../ +c data vn(1,25),vn(2,25)/4hdltf,4hdj../ +c data vn(1,26),vn(2,26)/4hdelt,4ha0../ +c data vn(1,27),vn(2,27)/4hfuzz,4h..../ +c data vn(1,28),vn(2,28)/4hrlim,4hit../ +c data vn(1,29),vn(2,29)/4hcosm,4hin../ +c data vn(1,30),vn(2,30)/4hhube,4hrc../ +c data vn(1,31),vn(2,31)/4hrspt,4hol../ +c data vn(1,32),vn(2,32)/4hsigm,4hin../ +c data vn(1,33),vn(2,33)/4heta0,4h..../ +c data vn(1,34),vn(2,34)/4hbias,4h..../ +c/7 + data vn(1,1),vn(2,1)/'epsl','on..'/ + data vn(1,2),vn(2,2)/'phmn','fc..'/ + data vn(1,3),vn(2,3)/'phmx','fc..'/ + data vn(1,4),vn(2,4)/'decf','ac..'/ + data vn(1,5),vn(2,5)/'incf','ac..'/ + data vn(1,6),vn(2,6)/'rdfc','mn..'/ + data vn(1,7),vn(2,7)/'rdfc','mx..'/ + data vn(1,8),vn(2,8)/'tune','r1..'/ + data vn(1,9),vn(2,9)/'tune','r2..'/ + data vn(1,10),vn(2,10)/'tune','r3..'/ + data vn(1,11),vn(2,11)/'tune','r4..'/ + data vn(1,12),vn(2,12)/'tune','r5..'/ + data vn(1,13),vn(2,13)/'afct','ol..'/ + data vn(1,14),vn(2,14)/'rfct','ol..'/ + data vn(1,15),vn(2,15)/'xcto','l...'/ + data vn(1,16),vn(2,16)/'xfto','l...'/ + data vn(1,17),vn(2,17)/'lmax','0...'/ + data vn(1,18),vn(2,18)/'lmax','s...'/ + data vn(1,19),vn(2,19)/'scto','l...'/ + data vn(1,20),vn(2,20)/'dini','t...'/ + data vn(1,21),vn(2,21)/'dtin','it..'/ + data vn(1,22),vn(2,22)/'d0in','it..'/ + data vn(1,23),vn(2,23)/'dfac','....'/ + data vn(1,24),vn(2,24)/'dltf','dc..'/ + data vn(1,25),vn(2,25)/'dltf','dj..'/ + data vn(1,26),vn(2,26)/'delt','a0..'/ + data vn(1,27),vn(2,27)/'fuzz','....'/ + data vn(1,28),vn(2,28)/'rlim','it..'/ + data vn(1,29),vn(2,29)/'cosm','in..'/ + data vn(1,30),vn(2,30)/'hube','rc..'/ + data vn(1,31),vn(2,31)/'rspt','ol..'/ + data vn(1,32),vn(2,32)/'sigm','in..'/ + data vn(1,33),vn(2,33)/'eta0','....'/ + data vn(1,34),vn(2,34)/'bias','....'/ +c/ +c + data vm(1)/1.0d-3/, vm(2)/-0.99d+0/, vm(3)/1.0d-3/, vm(4)/1.0d-2/, + 1 vm(5)/1.2d+0/, vm(6)/1.d-2/, vm(7)/1.2d+0/, vm(8)/0.d+0/, + 2 vm(9)/0.d+0/, vm(10)/1.d-3/, vm(11)/-1.d+0/, vm(13)/0.d+0/, + 3 vm(15)/0.d+0/, vm(16)/0.d+0/, vm(19)/0.d+0/, vm(20)/-10.d+0/, + 4 vm(21)/0.d+0/, vm(22)/0.d+0/, vm(23)/0.d+0/, vm(27)/1.01d+0/, + 5 vm(28)/1.d+10/, vm(30)/0.d+0/, vm(31)/0.d+0/, vm(32)/0.d+0/, + 6 vm(34)/0.d+0/ + data vx(1)/0.9d+0/, vx(2)/-1.d-3/, vx(3)/1.d+1/, vx(4)/0.8d+0/, + 1 vx(5)/1.d+2/, vx(6)/0.8d+0/, vx(7)/1.d+2/, vx(8)/0.5d+0/, + 2 vx(9)/0.5d+0/, vx(10)/1.d+0/, vx(11)/1.d+0/, vx(14)/0.1d+0/, + 3 vx(15)/1.d+0/, vx(16)/1.d+0/, vx(19)/1.d+0/, vx(23)/1.d+0/, + 4 vx(24)/1.d+0/, vx(25)/1.d+0/, vx(26)/1.d+0/, vx(27)/1.d+10/, + 5 vx(29)/1.d+0/, vx(31)/1.d+0/, vx(32)/1.d+0/, vx(33)/1.d+0/, + 6 vx(34)/1.d+0/ +c +c/6 +c data varnm(1)/1hp/, varnm(2)/1hn/, sh(1)/1hs/, sh(2)/1hh/ +c data cngd(1),cngd(2),cngd(3)/4h---c,4hhang,4hed v/, +c 1 dflt(1),dflt(2),dflt(3)/4hnond,4hefau,4hlt v/ +c/7 + data varnm(1)/'p'/, varnm(2)/'n'/, sh(1)/'s'/, sh(2)/'h'/ + data cngd(1),cngd(2),cngd(3)/'---c','hang','ed v'/, + 1 dflt(1),dflt(2),dflt(3)/'nond','efau','lt v'/ +c/ + data ijmp/33/, jlim(1)/0/, jlim(2)/24/, ndflt(1)/32/, ndflt(2)/25/ + data miniv(1)/80/, miniv(2)/59/ +c +c............................... body ................................ +c + pu = 0 + if (prunit .le. liv) pu = iv(prunit) + if (alg .lt. 1 .or. alg .gt. 2) go to 340 + if (iv(1) .eq. 0) call deflt(alg, iv, liv, lv, v) + iv1 = iv(1) + if (iv1 .ne. 13 .and. iv1 .ne. 12) go to 10 + miv1 = miniv(alg) + if (perm .le. liv) miv1 = max0(miv1, iv(perm) - 1) + if (ivneed .le. liv) miv2 = miv1 + max0(iv(ivneed), 0) + if (lastiv .le. liv) iv(lastiv) = miv2 + if (liv .lt. miv1) go to 300 + iv(ivneed) = 0 + iv(lastv) = max0(iv(vneed), 0) + iv(lmat) - 1 + iv(vneed) = 0 + if (liv .lt. miv2) go to 300 + if (lv .lt. iv(lastv)) go to 320 + 10 if (alg .eq. iv(algsav)) go to 30 + if (pu .ne. 0) write(pu,20) alg, iv(algsav) + 20 format(/39h the first parameter to deflt should be,i3, + 1 12h rather than,i3) + iv(1) = 82 + go to 999 + 30 if (iv1 .lt. 12 .or. iv1 .gt. 14) go to 60 + if (n .ge. 1) go to 50 + iv(1) = 81 + if (pu .eq. 0) go to 999 + write(pu,40) varnm(alg), n + 40 format(/8h /// bad,a1,2h =,i5) + go to 999 + 50 if (iv1 .ne. 14) iv(nextiv) = iv(perm) + if (iv1 .ne. 14) iv(nextv) = iv(lmat) + if (iv1 .eq. 13) go to 999 + k = iv(parsav) - epslon + call vdflt(alg, lv-k, v(k+1)) + iv(dtype0) = 2 - alg + iv(oldn) = n + which(1) = dflt(1) + which(2) = dflt(2) + which(3) = dflt(3) + go to 110 + 60 if (n .eq. iv(oldn)) go to 80 + iv(1) = 17 + if (pu .eq. 0) go to 999 + write(pu,70) varnm(alg), iv(oldn), n + 70 format(/5h /// ,1a1,14h changed from ,i5,4h to ,i5) + go to 999 +c + 80 if (iv1 .le. 11 .and. iv1 .ge. 1) go to 100 + iv(1) = 80 + if (pu .ne. 0) write(pu,90) iv1 + 90 format(/13h /// iv(1) =,i5,28h should be between 0 and 14.) + go to 999 +c + 100 which(1) = cngd(1) + which(2) = cngd(2) + which(3) = cngd(3) +c + 110 if (iv1 .eq. 14) iv1 = 12 + if (big .gt. tiny) go to 120 + tiny = rmdcon(1) + machep = rmdcon(3) + big = rmdcon(6) + vm(12) = machep + vx(12) = big + vx(13) = big + vm(14) = machep + vm(17) = tiny + vx(17) = big + vm(18) = tiny + vx(18) = big + vx(20) = big + vx(21) = big + vx(22) = big + vm(24) = machep + vm(25) = machep + vm(26) = machep + vx(28) = rmdcon(5) + vm(29) = machep + vx(30) = big + vm(33) = machep + 120 m = 0 + i = 1 + j = jlim(alg) + k = epslon + ndfalt = ndflt(alg) + do 150 l = 1, ndfalt + vk = v(k) + if (vk .ge. vm(i) .and. vk .le. vx(i)) go to 140 + m = k + if (pu .ne. 0) write(pu,130) vn(1,i), vn(2,i), k, vk, + 1 vm(i), vx(i) + 130 format(/6h /// ,2a4,5h.. v(,i2,3h) =,d11.3,7h should, + 1 11h be between,d11.3,4h and,d11.3) + 140 k = k + 1 + i = i + 1 + if (i .eq. j) i = ijmp + 150 continue +c + if (iv(nvdflt) .eq. ndfalt) go to 170 + iv(1) = 51 + if (pu .eq. 0) go to 999 + write(pu,160) iv(nvdflt), ndfalt + 160 format(/13h iv(nvdflt) =,i5,13h rather than ,i5) + go to 999 + 170 if ((iv(dtype) .gt. 0 .or. v(dinit) .gt. zero) .and. iv1 .eq. 12) + 1 go to 200 + do 190 i = 1, n + if (d(i) .gt. zero) go to 190 + m = 18 + if (pu .ne. 0) write(pu,180) i, d(i) + 180 format(/8h /// d(,i3,3h) =,d11.3,19h should be positive) + 190 continue + 200 if (m .eq. 0) go to 210 + iv(1) = m + go to 999 +c + 210 if (pu .eq. 0 .or. iv(parprt) .eq. 0) go to 999 + if (iv1 .ne. 12 .or. iv(inits) .eq. alg-1) go to 230 + m = 1 + write(pu,220) sh(alg), iv(inits) + 220 format(/22h nondefault values..../5h init,a1,14h..... iv(25) =, + 1 i3) + 230 if (iv(dtype) .eq. iv(dtype0)) go to 250 + if (m .eq. 0) write(pu,260) which + m = 1 + write(pu,240) iv(dtype) + 240 format(20h dtype..... iv(16) =,i3) + 250 i = 1 + j = jlim(alg) + k = epslon + l = iv(parsav) + ndfalt = ndflt(alg) + do 290 ii = 1, ndfalt + if (v(k) .eq. v(l)) go to 280 + if (m .eq. 0) write(pu,260) which + 260 format(/1h ,3a4,9halues..../) + m = 1 + write(pu,270) vn(1,i), vn(2,i), k, v(k) + 270 format(1x,2a4,5h.. v(,i2,3h) =,d15.7) + 280 k = k + 1 + l = l + 1 + i = i + 1 + if (i .eq. j) i = ijmp + 290 continue +c + iv(dtype0) = iv(dtype) + parsv1 = iv(parsav) + call vcopy(iv(nvdflt), v(parsv1), v(epslon)) + go to 999 +c + 300 iv(1) = 15 + if (pu .eq. 0) go to 999 + write(pu,310) liv, miv2 + 310 format(/10h /// liv =,i5,17h must be at least,i5) + if (liv .lt. miv1) go to 999 + if (lv .lt. iv(lastv)) go to 320 + go to 999 +c + 320 iv(1) = 16 + if (pu .eq. 0) go to 999 + write(pu,330) lv, iv(lastv) + 330 format(/9h /// lv =,i5,17h must be at least,i5) + go to 999 +c + 340 iv(1) = 67 + if (pu .eq. 0) go to 999 + write(pu,350) alg + 350 format(/10h /// alg =,i5,15h must be 1 or 2) +c + 999 return +c *** last card of parck follows *** + end + double precision function reldst(p, d, x, x0) +c +c *** compute and return relative difference between x and x0 *** +c *** nl2sol version 2.2 *** +c + integer p + double precision d(p), x(p), x0(p) +c/+ + double precision dabs +c/ + integer i + double precision emax, t, xmax, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + emax = zero + xmax = zero + do 10 i = 1, p + t = dabs(d(i) * (x(i) - x0(i))) + if (emax .lt. t) emax = t + t = d(i) * (dabs(x(i)) + dabs(x0(i))) + if (xmax .lt. t) xmax = t + 10 continue + reldst = zero + if (xmax .gt. zero) reldst = emax / xmax + 999 return +c *** last card of reldst follows *** + end +c logical function stopx(idummy) +c *****parameters... +c integer idummy +c +c .................................................................. +c +c *****purpose... +c this function may serve as the stopx (asynchronous interruption) +c function for the nl2sol (nonlinear least-squares) package at +c those installations which do not wish to implement a +c dynamic stopx. +c +c *****algorithm notes... +c at installations where the nl2sol system is used +c interactively, this dummy stopx should be replaced by a +c function that returns .true. if and only if the interrupt +c (break) key has been pressed since the last call on stopx. +c +c .................................................................. +c +c stopx = .false. +c return +c end + subroutine vaxpy(p, w, a, x, y) +c +c *** set w = a*x + y -- w, x, y = p-vectors, a = scalar *** +c + integer p + double precision a, w(p), x(p), y(p) +c + integer i +c + do 10 i = 1, p + 10 w(i) = a*x(i) + y(i) + return + end + subroutine vcopy(p, y, x) +c +c *** set y = x, where x and y are p-vectors *** +c + integer p + double precision x(p), y(p) +c + integer i +c + do 10 i = 1, p + 10 y(i) = x(i) + return + end + subroutine vdflt(alg, lv, v) +c +c *** supply ***sol (version 2.3) default values to v *** +c +c *** alg = 1 means regression constants. +c *** alg = 2 means general unconstrained optimization constants. +c + integer alg, l + double precision v(lv) +c/+ + double precision dmax1 +c/ + external rmdcon + double precision rmdcon +c rmdcon... returns machine-dependent constants +c + double precision machep, mepcrt, one, sqteps, three +c +c *** subscripts for v *** +c + integer afctol, bias, cosmin, decfac, delta0, dfac, dinit, dltfdc, + 1 dltfdj, dtinit, d0init, epslon, eta0, fuzz, huberc, + 2 incfac, lmax0, lmaxs, phmnfc, phmxfc, rdfcmn, rdfcmx, + 3 rfctol, rlimit, rsptol, sctol, sigmin, tuner1, tuner2, + 4 tuner3, tuner4, tuner5, xctol, xftol +c +c/6 +c data one/1.d+0/, three/3.d+0/ +c/7 + parameter (one=1.d+0, three=3.d+0) +c/ +c +c *** v subscript values *** +c +c/6 +c data afctol/31/, bias/43/, cosmin/47/, decfac/22/, delta0/44/, +c 1 dfac/41/, dinit/38/, dltfdc/42/, dltfdj/43/, dtinit/39/, +c 2 d0init/40/, epslon/19/, eta0/42/, fuzz/45/, huberc/48/, +c 3 incfac/23/, lmax0/35/, lmaxs/36/, phmnfc/20/, phmxfc/21/, +c 4 rdfcmn/24/, rdfcmx/25/, rfctol/32/, rlimit/46/, rsptol/49/, +c 5 sctol/37/, sigmin/50/, tuner1/26/, tuner2/27/, tuner3/28/, +c 6 tuner4/29/, tuner5/30/, xctol/33/, xftol/34/ +c/7 + parameter (afctol=31, bias=43, cosmin=47, decfac=22, delta0=44, + 1 dfac=41, dinit=38, dltfdc=42, dltfdj=43, dtinit=39, + 2 d0init=40, epslon=19, eta0=42, fuzz=45, huberc=48, + 3 incfac=23, lmax0=35, lmaxs=36, phmnfc=20, phmxfc=21, + 4 rdfcmn=24, rdfcmx=25, rfctol=32, rlimit=46, rsptol=49, + 5 sctol=37, sigmin=50, tuner1=26, tuner2=27, tuner3=28, + 6 tuner4=29, tuner5=30, xctol=33, xftol=34) +c/ +c +c------------------------------- body -------------------------------- +c + machep = rmdcon(3) + v(afctol) = 1.d-20 + if (machep .gt. 1.d-10) v(afctol) = machep**2 + v(decfac) = 0.5d+0 + sqteps = rmdcon(4) + v(dfac) = 0.6d+0 + v(delta0) = sqteps + v(dtinit) = 1.d-6 + mepcrt = machep ** (one/three) + v(d0init) = 1.d+0 + v(epslon) = 0.1d+0 + v(incfac) = 2.d+0 + v(lmax0) = 1.d+0 + v(lmaxs) = 1.d+0 + v(phmnfc) = -0.1d+0 + v(phmxfc) = 0.1d+0 + v(rdfcmn) = 0.1d+0 + v(rdfcmx) = 4.d+0 + v(rfctol) = dmax1(1.d-10, mepcrt**2) + v(sctol) = v(rfctol) + v(tuner1) = 0.1d+0 + v(tuner2) = 1.d-4 + v(tuner3) = 0.75d+0 + v(tuner4) = 0.5d+0 + v(tuner5) = 0.75d+0 + v(xctol) = sqteps + v(xftol) = 1.d+2 * machep +c + if (alg .ge. 2) go to 10 +c +c *** regression values +c + v(cosmin) = dmax1(1.d-6, 1.d+2 * machep) + v(dinit) = 0.d+0 + v(dltfdc) = mepcrt + v(dltfdj) = sqteps + v(fuzz) = 1.5d+0 + v(huberc) = 0.7d+0 + v(rlimit) = rmdcon(5) + v(rsptol) = 1.d-3 + v(sigmin) = 1.d-4 + go to 999 +c +c *** general optimization values +c + 10 v(bias) = 0.8d+0 + v(dinit) = -1.0d+0 + v(eta0) = 1.0d+3 * machep +c + 999 return +c *** last card of vdflt follows *** + end + subroutine vscopy(p, y, s) +c +c *** set p-vector y to scalar s *** +c + integer p + double precision s, y(p) +c + integer i +c + do 10 i = 1, p + 10 y(i) = s + return + end + double precision function v2norm(p, x) +c +c *** return the 2-norm of the p-vector x, taking *** +c *** care to avoid the most likely underflows. *** +c + integer p + double precision x(p) +c + integer i, j + double precision one, r, scale, sqteta, t, xi, zero +c/+ + double precision dabs, dsqrt +c/ + external rmdcon + double precision rmdcon +c +c/6 +c data one/1.d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, zero=0.d+0) + save sqteta +c/ + data sqteta/0.d+0/ +c + if (p .gt. 0) go to 10 + v2norm = zero + go to 999 + 10 do 20 i = 1, p + if (x(i) .ne. zero) go to 30 + 20 continue + v2norm = zero + go to 999 +c + 30 scale = dabs(x(i)) + if (i .lt. p) go to 40 + v2norm = scale + go to 999 + 40 t = one + if (sqteta .eq. zero) sqteta = rmdcon(2) +c +c *** sqteta is (slightly larger than) the square root of the +c *** smallest positive floating point number on the machine. +c *** the tests involving sqteta are done to prevent underflows. +c + j = i + 1 + do 60 i = j, p + xi = dabs(x(i)) + if (xi .gt. scale) go to 50 + r = xi / scale + if (r .gt. sqteta) t = t + r*r + go to 60 + 50 r = scale / xi + if (r .le. sqteta) r = zero + t = one + t * r*r + scale = xi + 60 continue +c + v2norm = scale * dsqrt(t) + 999 return +c *** last card of v2norm follows *** + end + subroutine humsl(n, d, x, calcf, calcgh, iv, liv, lv, v, + 1 uiparm, urparm, ufparm) +c +c *** minimize general unconstrained objective function using *** +c *** (analytic) gradient and hessian provided by the caller. *** +c + integer liv, lv, n + integer iv(liv), uiparm(1) + double precision d(n), x(n), v(lv), urparm(1) +c dimension v(78 + n*(n+12)), uiparm(*), urparm(*) + external calcf, calcgh, ufparm +c +c------------------------------ discussion --------------------------- +c +c this routine is like sumsl, except that the subroutine para- +c meter calcg of sumsl (which computes the gradient of the objec- +c tive function) is replaced by the subroutine parameter calcgh, +c which computes both the gradient and (lower triangle of the) +c hessian of the objective function. the calling sequence is... +c call calcgh(n, x, nf, g, h, uiparm, urparm, ufparm) +c parameters n, x, nf, g, uiparm, urparm, and ufparm are the same +c as for sumsl, while h is an array of length n*(n+1)/2 in which +c calcgh must store the lower triangle of the hessian at x. start- +c ing at h(1), calcgh must store the hessian entries in the order +c (1,1), (2,1), (2,2), (3,1), (3,2), (3,3), ... +c the value printed (by itsum) in the column labelled stppar +c is the levenberg-marquardt used in computing the current step. +c zero means a full newton step. if the special case described in +c ref. 1 is detected, then stppar is negated. the value printed +c in the column labelled npreldf is zero if the current hessian +c is not positive definite. +c it sometimes proves worthwhile to let d be determined from the +c diagonal of the hessian matrix by setting iv(dtype) = 1 and +c v(dinit) = 0. the following iv and v components are relevant... +c +c iv(dtol)..... iv(59) gives the starting subscript in v of the dtol +c array used when d is updated. (iv(dtol) can be +c initialized by calling humsl with iv(1) = 13.) +c iv(dtype).... iv(16) tells how the scale vector d should be chosen. +c iv(dtype) .le. 0 means that d should not be updated, and +c iv(dtype) .ge. 1 means that d should be updated as +c described below with v(dfac). default = 0. +c v(dfac)..... v(41) and the dtol and d0 arrays (see v(dtinit) and +c v(d0init)) are used in updating the scale vector d when +c iv(dtype) .gt. 0. (d is initialized according to +c v(dinit), described in sumsl.) let +c d1(i) = max(sqrt(abs(h(i,i))), v(dfac)*d(i)), +c where h(i,i) is the i-th diagonal element of the current +c hessian. if iv(dtype) = 1, then d(i) is set to d1(i) +c unless d1(i) .lt. dtol(i), in which case d(i) is set to +c max(d0(i), dtol(i)). +c if iv(dtype) .ge. 2, then d is updated during the first +c iteration as for iv(dtype) = 1 (after any initialization +c due to v(dinit)) and is left unchanged thereafter. +c default = 0.6. +c v(dtinit)... v(39), if positive, is the value to which all components +c of the dtol array (see v(dfac)) are initialized. if +c v(dtinit) = 0, then it is assumed that the caller has +c stored dtol in v starting at v(iv(dtol)). +c default = 10**-6. +c v(d0init)... v(40), if positive, is the value to which all components +c of the d0 vector (see v(dfac)) are initialized. if +c v(dfac) = 0, then it is assumed that the caller has +c stored d0 in v starting at v(iv(dtol)+n). default = 1.0. +c +c *** reference *** +c +c 1. gay, d.m. (1981), computing optimal locally constrained steps, +c siam j. sci. statist. comput. 2, pp. 186-197. +c. +c *** general *** +c +c coded by david m. gay (winter 1980). revised sept. 1982. +c this subroutine was written in connection with research supported +c in part by the national science foundation under grants +c mcs-7600324 and mcs-7906671. +c +c---------------------------- declarations --------------------------- +c + external deflt, humit +c +c deflt... provides default input values for iv and v. +c humit... reverse-communication routine that does humsl algorithm. +c + integer g1, h1, iv1, lh, nf + double precision f +c +c *** subscripts for iv *** +c + integer g, h, nextv, nfcall, nfgcal, toobig, vneed +c +c/6 +c data nextv/47/, nfcall/6/, nfgcal/7/, g/28/, h/56/, toobig/2/, +c 1 vneed/4/ +c/7 + parameter (nextv=47, nfcall=6, nfgcal=7, g=28, h=56, toobig=2, + 1 vneed=4) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + lh = n * (n + 1) / 2 + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + if (iv(1) .eq. 12 .or. iv(1) .eq. 13) + 1 iv(vneed) = iv(vneed) + n*(n+3)/2 + iv1 = iv(1) + if (iv1 .eq. 14) go to 10 + if (iv1 .gt. 2 .and. iv1 .lt. 12) go to 10 + g1 = 1 + h1 = 1 + if (iv1 .eq. 12) iv(1) = 13 + go to 20 +c + 10 g1 = iv(g) + h1 = iv(h) +c + 20 call humit(d, f, v(g1), v(h1), iv, lh, liv, lv, n, v, x) + if (iv(1) - 2) 30, 40, 50 +c + 30 nf = iv(nfcall) + call calcf(n, x, nf, f, uiparm, urparm, ufparm) + if (nf .le. 0) iv(toobig) = 1 + go to 20 +c + 40 call calcgh(n, x, iv(nfgcal), v(g1), v(h1), uiparm, urparm, + 1 ufparm) + go to 20 +c + 50 if (iv(1) .ne. 14) go to 999 +c +c *** storage allocation +c + iv(g) = iv(nextv) + iv(h) = iv(g) + n + iv(nextv) = iv(h) + n*(n+1)/2 + if (iv1 .ne. 13) go to 10 +c + 999 return +c *** last card of humsl follows *** + end + subroutine humit(d, fx, g, h, iv, lh, liv, lv, n, v, x) +c +c *** carry out humsl (unconstrained minimization) iterations, using +c *** hessian matrix provided by the caller. +c +c *** parameter declarations *** +c + integer lh, liv, lv, n + integer iv(liv) + double precision d(n), fx, g(n), h(lh), v(lv), x(n) +c +c-------------------------- parameter usage -------------------------- +c +c d.... scale vector. +c fx... function value. +c g.... gradient vector. +c h.... lower triangle of the hessian, stored rowwise. +c iv... integer value array. +c lh... length of h = p*(p+1)/2. +c liv.. length of iv (at least 60). +c lv... length of v (at least 78 + n*(n+21)/2). +c n.... number of variables (components in x and g). +c v.... floating-point value array. +c x.... parameter vector. +c +c *** discussion *** +c +c parameters iv, n, v, and x are the same as the corresponding +c ones to humsl (which see), except that v can be shorter (since +c the part of v that humsl uses for storing g and h is not needed). +c moreover, compared with humsl, iv(1) may have the two additional +c output values 1 and 2, which are explained below, as is the use +c of iv(toobig) and iv(nfgcal). the value iv(g), which is an +c output value from humsl, is not referenced by humit or the +c subroutines it calls. +c +c iv(1) = 1 means the caller should set fx to f(x), the function value +c at x, and call humit again, having changed none of the +c other parameters. an exception occurs if f(x) cannot be +c computed (e.g. if overflow would occur), which may happen +c because of an oversized step. in this case the caller +c should set iv(toobig) = iv(2) to 1, which will cause +c humit to ignore fx and try a smaller step. the para- +c meter nf that humsl passes to calcf (for possible use by +c calcgh) is a copy of iv(nfcall) = iv(6). +c iv(1) = 2 means the caller should set g to g(x), the gradient of f at +c x, and h to the lower triangle of h(x), the hessian of f +c at x, and call humit again, having changed none of the +c other parameters except perhaps the scale vector d. +c the parameter nf that humsl passes to calcg is +c iv(nfgcal) = iv(7). if g(x) and h(x) cannot be evaluated, +c then the caller may set iv(nfgcal) to 0, in which case +c humit will return with iv(1) = 65. +c note -- humit overwrites h with the lower triangle +c of diag(d)**-1 * h(x) * diag(d)**-1. +c. +c *** general *** +c +c coded by david m. gay (winter 1980). revised sept. 1982. +c this subroutine was written in connection with research supported +c in part by the national science foundation under grants +c mcs-7600324 and mcs-7906671. +c +c (see sumsl and humsl for references.) +c +c+++++++++++++++++++++++++++ declarations ++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer dg1, dummy, i, j, k, l, lstgst, nn1o2, step1, + 1 temp1, w1, x01 + double precision t +c +c *** constants *** +c + double precision one, onep2, zero +c +c *** no intrinsic functions *** +c +c *** external functions and subroutines *** +c + external assst, deflt, dotprd, dupdu, gqtst, itsum, parck, + 1 reldst, slvmul, stopx, vaxpy, vcopy, vscopy, v2norm + logical stopx + double precision dotprd, reldst, v2norm +c +c assst.... assesses candidate step. +c deflt.... provides default iv and v input values. +c dotprd... returns inner product of two vectors. +c dupdu.... updates scale vector d. +c gqtst.... computes optimally locally constrained step. +c itsum.... prints iteration summary and info on initial and final x. +c parck.... checks validity of input iv and v values. +c reldst... computes v(reldx) = relative step size. +c slvmul... multiplies symmetric matrix times vector, given the lower +c triangle of the matrix. +c stopx.... returns .true. if the break key has been pressed. +c vaxpy.... computes scalar times one vector plus another. +c vcopy.... copies one vector to another. +c vscopy... sets all elements of a vector to a scalar. +c v2norm... returns the 2-norm of a vector. +c +c *** subscripts for iv and v *** +c + integer cnvcod, dg, dgnorm, dinit, dstnrm, dtinit, dtol, + 1 dtype, d0init, f, f0, fdif, gtstep, incfac, irc, kagqt, + 2 lmat, lmax0, lmaxs, mode, model, mxfcal, mxiter, nextv, + 3 nfcall, nfgcal, ngcall, niter, preduc, radfac, radinc, + 4 radius, rad0, reldx, restor, step, stglim, stlstg, stppar, + 5 toobig, tuner4, tuner5, vneed, w, xirc, x0 +c +c *** iv subscript values *** +c +c/6 +c data cnvcod/55/, dg/37/, dtol/59/, dtype/16/, irc/29/, kagqt/33/, +c 1 lmat/42/, mode/35/, model/5/, mxfcal/17/, mxiter/18/, +c 2 nextv/47/, nfcall/6/, nfgcal/7/, ngcall/30/, niter/31/, +c 3 radinc/8/, restor/9/, step/40/, stglim/11/, stlstg/41/, +c 4 toobig/2/, vneed/4/, w/34/, xirc/13/, x0/43/ +c/7 + parameter (cnvcod=55, dg=37, dtol=59, dtype=16, irc=29, kagqt=33, + 1 lmat=42, mode=35, model=5, mxfcal=17, mxiter=18, + 2 nextv=47, nfcall=6, nfgcal=7, ngcall=30, niter=31, + 3 radinc=8, restor=9, step=40, stglim=11, stlstg=41, + 4 toobig=2, vneed=4, w=34, xirc=13, x0=43) +c/ +c +c *** v subscript values *** +c +c/6 +c data dgnorm/1/, dinit/38/, dstnrm/2/, dtinit/39/, d0init/40/, +c 1 f/10/, f0/13/, fdif/11/, gtstep/4/, incfac/23/, lmax0/35/, +c 2 lmaxs/36/, preduc/7/, radfac/16/, radius/8/, rad0/9/, +c 3 reldx/17/, stppar/5/, tuner4/29/, tuner5/30/ +c/7 + parameter (dgnorm=1, dinit=38, dstnrm=2, dtinit=39, d0init=40, + 1 f=10, f0=13, fdif=11, gtstep=4, incfac=23, lmax0=35, + 2 lmaxs=36, preduc=7, radfac=16, radius=8, rad0=9, + 3 reldx=17, stppar=5, tuner4=29, tuner5=30) +c/ +c +c/6 +c data one/1.d+0/, onep2/1.2d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, onep2=1.2d+0, zero=0.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + i = iv(1) + if (i .eq. 1) go to 30 + if (i .eq. 2) go to 40 +c +c *** check validity of iv and v input values *** +c + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + if (iv(1) .eq. 12 .or. iv(1) .eq. 13) + 1 iv(vneed) = iv(vneed) + n*(n+21)/2 + 7 + call parck(2, d, iv, liv, lv, n, v) + i = iv(1) - 2 + if (i .gt. 12) go to 999 + nn1o2 = n * (n + 1) / 2 + if (lh .ge. nn1o2) go to (210,210,210,210,210,210,160,120,160, + 1 10,10,20), i + iv(1) = 66 + go to 350 +c +c *** storage allocation *** +c + 10 iv(dtol) = iv(lmat) + nn1o2 + iv(x0) = iv(dtol) + 2*n + iv(step) = iv(x0) + n + iv(stlstg) = iv(step) + n + iv(dg) = iv(stlstg) + n + iv(w) = iv(dg) + n + iv(nextv) = iv(w) + 4*n + 7 + if (iv(1) .ne. 13) go to 20 + iv(1) = 14 + go to 999 +c +c *** initialization *** +c + 20 iv(niter) = 0 + iv(nfcall) = 1 + iv(ngcall) = 1 + iv(nfgcal) = 1 + iv(mode) = -1 + iv(model) = 1 + iv(stglim) = 1 + iv(toobig) = 0 + iv(cnvcod) = 0 + iv(radinc) = 0 + v(rad0) = zero + v(stppar) = zero + if (v(dinit) .ge. zero) call vscopy(n, d, v(dinit)) + k = iv(dtol) + if (v(dtinit) .gt. zero) call vscopy(n, v(k), v(dtinit)) + k = k + n + if (v(d0init) .gt. zero) call vscopy(n, v(k), v(d0init)) + iv(1) = 1 + go to 999 +c + 30 v(f) = fx + if (iv(mode) .ge. 0) go to 210 + iv(1) = 2 + if (iv(toobig) .eq. 0) go to 999 + iv(1) = 63 + go to 350 +c +c *** make sure gradient could be computed *** +c + 40 if (iv(nfgcal) .ne. 0) go to 50 + iv(1) = 65 + go to 350 +c +c *** update the scale vector d *** +c + 50 dg1 = iv(dg) + if (iv(dtype) .le. 0) go to 70 + k = dg1 + j = 0 + do 60 i = 1, n + j = j + i + v(k) = h(j) + k = k + 1 + 60 continue + call dupdu(d, v(dg1), iv, liv, lv, n, v) +c +c *** compute scaled gradient and its norm *** +c + 70 dg1 = iv(dg) + k = dg1 + do 80 i = 1, n + v(k) = g(i) / d(i) + k = k + 1 + 80 continue + v(dgnorm) = v2norm(n, v(dg1)) +c +c *** compute scaled hessian *** +c + k = 1 + do 100 i = 1, n + t = one / d(i) + do 90 j = 1, i + h(k) = t * h(k) / d(j) + k = k + 1 + 90 continue + 100 continue +c + if (iv(cnvcod) .ne. 0) go to 340 + if (iv(mode) .eq. 0) go to 300 +c +c *** allow first step to have scaled 2-norm at most v(lmax0) *** +c + v(radius) = v(lmax0) +c + iv(mode) = 0 +c +c +c----------------------------- main loop ----------------------------- +c +c +c *** print iteration summary, check iteration limit *** +c + 110 call itsum(d, g, iv, liv, lv, n, v, x) + 120 k = iv(niter) + if (k .lt. iv(mxiter)) go to 130 + iv(1) = 10 + go to 350 +c + 130 iv(niter) = k + 1 +c +c *** initialize for start of next iteration *** +c + dg1 = iv(dg) + x01 = iv(x0) + v(f0) = v(f) + iv(irc) = 4 + iv(kagqt) = -1 +c +c *** copy x to x0 *** +c + call vcopy(n, v(x01), x) +c +c *** update radius *** +c + if (k .eq. 0) go to 150 + step1 = iv(step) + k = step1 + do 140 i = 1, n + v(k) = d(i) * v(k) + k = k + 1 + 140 continue + v(radius) = v(radfac) * v2norm(n, v(step1)) +c +c *** check stopx and function evaluation limit *** +c +C AL 4/30/95 + dummy=iv(nfcall) + 150 if (.not. stopx(dummy)) go to 170 + iv(1) = 11 + go to 180 +c +c *** come here when restarting after func. eval. limit or stopx. +c + 160 if (v(f) .ge. v(f0)) go to 170 + v(radfac) = one + k = iv(niter) + go to 130 +c + 170 if (iv(nfcall) .lt. iv(mxfcal)) go to 190 + iv(1) = 9 + 180 if (v(f) .ge. v(f0)) go to 350 +c +c *** in case of stopx or function evaluation limit with +c *** improved v(f), evaluate the gradient at x. +c + iv(cnvcod) = iv(1) + go to 290 +c +c. . . . . . . . . . . . . compute candidate step . . . . . . . . . . +c + 190 step1 = iv(step) + dg1 = iv(dg) + l = iv(lmat) + w1 = iv(w) + call gqtst(d, v(dg1), h, iv(kagqt), v(l), n, v(step1), v, v(w1)) + if (iv(irc) .eq. 6) go to 210 +c +c *** check whether evaluating f(x0 + step) looks worthwhile *** +c + if (v(dstnrm) .le. zero) go to 210 + if (iv(irc) .ne. 5) go to 200 + if (v(radfac) .le. one) go to 200 + if (v(preduc) .le. onep2 * v(fdif)) go to 210 +c +c *** compute f(x0 + step) *** +c + 200 x01 = iv(x0) + step1 = iv(step) + call vaxpy(n, x, one, v(step1), v(x01)) + iv(nfcall) = iv(nfcall) + 1 + iv(1) = 1 + iv(toobig) = 0 + go to 999 +c +c. . . . . . . . . . . . . assess candidate step . . . . . . . . . . . +c + 210 x01 = iv(x0) + v(reldx) = reldst(n, d, x, v(x01)) + call assst(iv, liv, lv, v) + step1 = iv(step) + lstgst = iv(stlstg) + if (iv(restor) .eq. 1) call vcopy(n, x, v(x01)) + if (iv(restor) .eq. 2) call vcopy(n, v(lstgst), v(step1)) + if (iv(restor) .ne. 3) go to 220 + call vcopy(n, v(step1), v(lstgst)) + call vaxpy(n, x, one, v(step1), v(x01)) + v(reldx) = reldst(n, d, x, v(x01)) +c + 220 k = iv(irc) + go to (230,260,260,260,230,240,250,250,250,250,250,250,330,300), k +c +c *** recompute step with new radius *** +c + 230 v(radius) = v(radfac) * v(dstnrm) + go to 150 +c +c *** compute step of length v(lmaxs) for singular convergence test. +c + 240 v(radius) = v(lmaxs) + go to 190 +c +c *** convergence or false convergence *** +c + 250 iv(cnvcod) = k - 4 + if (v(f) .ge. v(f0)) go to 340 + if (iv(xirc) .eq. 14) go to 340 + iv(xirc) = 14 +c +c. . . . . . . . . . . . process acceptable step . . . . . . . . . . . +c + 260 if (iv(irc) .ne. 3) go to 290 + temp1 = lstgst +c +c *** prepare for gradient tests *** +c *** set temp1 = hessian * step + g(x0) +c *** = diag(d) * (h * step + g(x0)) +c +c use x0 vector as temporary. + k = x01 + do 270 i = 1, n + v(k) = d(i) * v(step1) + k = k + 1 + step1 = step1 + 1 + 270 continue + call slvmul(n, v(temp1), h, v(x01)) + do 280 i = 1, n + v(temp1) = d(i) * v(temp1) + g(i) + temp1 = temp1 + 1 + 280 continue +c +c *** compute gradient and hessian *** +c + 290 iv(ngcall) = iv(ngcall) + 1 + iv(1) = 2 + go to 999 +c + 300 iv(1) = 2 + if (iv(irc) .ne. 3) go to 110 +c +c *** set v(radfac) by gradient tests *** +c + temp1 = iv(stlstg) + step1 = iv(step) +c +c *** set temp1 = diag(d)**-1 * (hessian*step + (g(x0)-g(x))) *** +c + k = temp1 + do 310 i = 1, n + v(k) = (v(k) - g(i)) / d(i) + k = k + 1 + 310 continue +c +c *** do gradient tests *** +c + if (v2norm(n, v(temp1)) .le. v(dgnorm) * v(tuner4)) go to 320 + if (dotprd(n, g, v(step1)) + 1 .ge. v(gtstep) * v(tuner5)) go to 110 + 320 v(radfac) = v(incfac) + go to 110 +c +c. . . . . . . . . . . . . . misc. details . . . . . . . . . . . . . . +c +c *** bad parameters to assess *** +c + 330 iv(1) = 64 + go to 350 +c +c *** print summary of final iteration and other requested items *** +c + 340 iv(1) = iv(cnvcod) + iv(cnvcod) = 0 + 350 call itsum(d, g, iv, liv, lv, n, v, x) +c + 999 return +c +c *** last card of humit follows *** + end + subroutine dupdu(d, hdiag, iv, liv, lv, n, v) +c +c *** update scale vector d for humsl *** +c +c *** parameter declarations *** +c + integer liv, lv, n + integer iv(liv) + double precision d(n), hdiag(n), v(lv) +c +c *** local variables *** +c + integer dtoli, d0i, i + double precision t, vdfac +c +c *** intrinsic functions *** +c/+ + double precision dabs, dmax1, dsqrt +c/ +c *** subscripts for iv and v *** +c + integer dfac, dtol, dtype, niter +c/6 +c data dfac/41/, dtol/59/, dtype/16/, niter/31/ +c/7 + parameter (dfac=41, dtol=59, dtype=16, niter=31) +c/ +c +c------------------------------- body -------------------------------- +c + i = iv(dtype) + if (i .eq. 1) go to 10 + if (iv(niter) .gt. 0) go to 999 +c + 10 dtoli = iv(dtol) + d0i = dtoli + n + vdfac = v(dfac) + do 20 i = 1, n + t = dmax1(dsqrt(dabs(hdiag(i))), vdfac*d(i)) + if (t .lt. v(dtoli)) t = dmax1(v(dtoli), v(d0i)) + d(i) = t + dtoli = dtoli + 1 + d0i = d0i + 1 + 20 continue +c + 999 return +c *** last card of dupdu follows *** + end + subroutine gqtst(d, dig, dihdi, ka, l, p, step, v, w) +c +c *** compute goldfeld-quandt-trotter step by more-hebden technique *** +c *** (nl2sol version 2.2), modified a la more and sorensen *** +c +c *** parameter declarations *** +c + integer ka, p +cal double precision d(p), dig(p), dihdi(1), l(1), v(21), step(p), +cal 1 w(1) + double precision d(p), dig(p), dihdi(p*(p+1)/2), l(p*(p+1)/2), + 1 v(21), step(p),w(4*p+7) +c dimension dihdi(p*(p+1)/2), l(p*(p+1)/2), w(4*p+7) +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** purpose *** +c +c given the (compactly stored) lower triangle of a scaled +c hessian (approximation) and a nonzero scaled gradient vector, +c this subroutine computes a goldfeld-quandt-trotter step of +c approximate length v(radius) by the more-hebden technique. in +c other words, step is computed to (approximately) minimize +c psi(step) = (g**t)*step + 0.5*(step**t)*h*step such that the +c 2-norm of d*step is at most (approximately) v(radius), where +c g is the gradient, h is the hessian, and d is a diagonal +c scale matrix whose diagonal is stored in the parameter d. +c (gqtst assumes dig = d**-1 * g and dihdi = d**-1 * h * d**-1.) +c +c *** parameter description *** +c +c d (in) = the scale vector, i.e. the diagonal of the scale +c matrix d mentioned above under purpose. +c dig (in) = the scaled gradient vector, d**-1 * g. if g = 0, then +c step = 0 and v(stppar) = 0 are returned. +c dihdi (in) = lower triangle of the scaled hessian (approximation), +c i.e., d**-1 * h * d**-1, stored compactly by rows., i.e., +c in the order (1,1), (2,1), (2,2), (3,1), (3,2), etc. +c ka (i/o) = the number of hebden iterations (so far) taken to deter- +c mine step. ka .lt. 0 on input means this is the first +c attempt to determine step (for the present dig and dihdi) +c -- ka is initialized to 0 in this case. output with +c ka = 0 (or v(stppar) = 0) means step = -(h**-1)*g. +c l (i/o) = workspace of length p*(p+1)/2 for cholesky factors. +c p (in) = number of parameters -- the hessian is a p x p matrix. +c step (i/o) = the step computed. +c v (i/o) contains various constants and variables described below. +c w (i/o) = workspace of length 4*p + 6. +c +c *** entries in v *** +c +c v(dgnorm) (i/o) = 2-norm of (d**-1)*g. +c v(dstnrm) (output) = 2-norm of d*step. +c v(dst0) (i/o) = 2-norm of d*(h**-1)*g (for pos. def. h only), or +c overestimate of smallest eigenvalue of (d**-1)*h*(d**-1). +c v(epslon) (in) = max. rel. error allowed for psi(step). for the +c step returned, psi(step) will exceed its optimal value +c by less than -v(epslon)*psi(step). suggested value = 0.1. +c v(gtstep) (out) = inner product between g and step. +c v(nreduc) (out) = psi(-(h**-1)*g) = psi(newton step) (for pos. def. +c h only -- v(nreduc) is set to zero otherwise). +c v(phmnfc) (in) = tol. (together with v(phmxfc)) for accepting step +c (more*s sigma). the error v(dstnrm) - v(radius) must lie +c between v(phmnfc)*v(radius) and v(phmxfc)*v(radius). +c v(phmxfc) (in) (see v(phmnfc).) +c suggested values -- v(phmnfc) = -0.25, v(phmxfc) = 0.5. +c v(preduc) (out) = psi(step) = predicted obj. func. reduction for step. +c v(radius) (in) = radius of current (scaled) trust region. +c v(rad0) (i/o) = value of v(radius) from previous call. +c v(stppar) (i/o) is normally the marquardt parameter, i.e. the alpha +c described below under algorithm notes. if h + alpha*d**2 +c (see algorithm notes) is (nearly) singular, however, +c then v(stppar) = -alpha. +c +c *** usage notes *** +c +c if it is desired to recompute step using a different value of +c v(radius), then this routine may be restarted by calling it +c with all parameters unchanged except v(radius). (this explains +c why step and w are listed as i/o). on an initial call (one with +c ka .lt. 0), step and w need not be initialized and only compo- +c nents v(epslon), v(stppar), v(phmnfc), v(phmxfc), v(radius), and +c v(rad0) of v must be initialized. +c +c *** algorithm notes *** +c +c the desired g-q-t step (ref. 2, 3, 4, 6) satisfies +c (h + alpha*d**2)*step = -g for some nonnegative alpha such that +c h + alpha*d**2 is positive semidefinite. alpha and step are +c computed by a scheme analogous to the one described in ref. 5. +c estimates of the smallest and largest eigenvalues of the hessian +c are obtained from the gerschgorin circle theorem enhanced by a +c simple form of the scaling described in ref. 7. cases in which +c h + alpha*d**2 is nearly (or exactly) singular are handled by +c the technique discussed in ref. 2. in these cases, a step of +c (exact) length v(radius) is returned for which psi(step) exceeds +c its optimal value by less than -v(epslon)*psi(step). the test +c suggested in ref. 6 for detecting the special case is performed +c once two matrix factorizations have been done -- doing so sooner +c seems to degrade the performance of optimization routines that +c call this routine. +c +c *** functions and subroutines called *** +c +c dotprd - returns inner product of two vectors. +c litvmu - applies inverse-transpose of compact lower triang. matrix. +c livmul - applies inverse of compact lower triang. matrix. +c lsqrt - finds cholesky factor (of compactly stored lower triang.). +c lsvmin - returns approx. to min. sing. value of lower triang. matrix. +c rmdcon - returns machine-dependent constants. +c v2norm - returns 2-norm of a vector. +c +c *** references *** +c +c 1. dennis, j.e., gay, d.m., and welsch, r.e. (1981), an adaptive +c nonlinear least-squares algorithm, acm trans. math. +c software, vol. 7, no. 3. +c 2. gay, d.m. (1981), computing optimal locally constrained steps, +c siam j. sci. statist. computing, vol. 2, no. 2, pp. +c 186-197. +c 3. goldfeld, s.m., quandt, r.e., and trotter, h.f. (1966), +c maximization by quadratic hill-climbing, econometrica 34, +c pp. 541-551. +c 4. hebden, m.d. (1973), an algorithm for minimization using exact +c second derivatives, report t.p. 515, theoretical physics +c div., a.e.r.e. harwell, oxon., england. +c 5. more, j.j. (1978), the levenberg-marquardt algorithm, implemen- +c tation and theory, pp.105-116 of springer lecture notes +c in mathematics no. 630, edited by g.a. watson, springer- +c verlag, berlin and new york. +c 6. more, j.j., and sorensen, d.c. (1981), computing a trust region +c step, technical report anl-81-83, argonne national lab. +c 7. varga, r.s. (1965), minimal gerschgorin sets, pacific j. math. 15, +c pp. 719-729. +c +c *** general *** +c +c coded by david m. gay. +c this subroutine was written in connection with research +c supported by the national science foundation under grants +c mcs-7600324, dcr75-10143, 76-14311dss, mcs76-11989, and +c mcs-7906671. +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** local variables *** +c + logical restrt + integer dggdmx, diag, diag0, dstsav, emax, emin, i, im1, inc, irc, + 1 j, k, kalim, kamin, k1, lk0, phipin, q, q0, uk0, x + double precision alphak, aki, akk, delta, dst, eps, gtsta, lk, + 1 oldphi, phi, phimax, phimin, psifac, rad, radsq, + 2 root, si, sk, sw, t, twopsi, t1, t2, uk, wi +c +c *** constants *** + double precision big, dgxfac, epsfac, four, half, kappa, negone, + 1 one, p001, six, three, two, zero +c +c *** intrinsic functions *** +c/+ + double precision dabs, dmax1, dmin1, dsqrt +c/ +c *** external functions and subroutines *** +c + external dotprd, litvmu, livmul, lsqrt, lsvmin, rmdcon, v2norm + double precision dotprd, lsvmin, rmdcon, v2norm +c +c *** subscripts for v *** +c + integer dgnorm, dstnrm, dst0, epslon, gtstep, stppar, nreduc, + 1 phmnfc, phmxfc, preduc, radius, rad0 +c/6 +c data dgnorm/1/, dstnrm/2/, dst0/3/, epslon/19/, gtstep/4/, +c 1 nreduc/6/, phmnfc/20/, phmxfc/21/, preduc/7/, radius/8/, +c 2 rad0/9/, stppar/5/ +c/7 + parameter (dgnorm=1, dstnrm=2, dst0=3, epslon=19, gtstep=4, + 1 nreduc=6, phmnfc=20, phmxfc=21, preduc=7, radius=8, + 2 rad0=9, stppar=5) +c/ +c +c/6 +c data epsfac/50.0d+0/, four/4.0d+0/, half/0.5d+0/, +c 1 kappa/2.0d+0/, negone/-1.0d+0/, one/1.0d+0/, p001/1.0d-3/, +c 2 six/6.0d+0/, three/3.0d+0/, two/2.0d+0/, zero/0.0d+0/ +c/7 + parameter (epsfac=50.0d+0, four=4.0d+0, half=0.5d+0, + 1 kappa=2.0d+0, negone=-1.0d+0, one=1.0d+0, p001=1.0d-3, + 2 six=6.0d+0, three=3.0d+0, two=2.0d+0, zero=0.0d+0) + save dgxfac +c/ + data big/0.d+0/, dgxfac/0.d+0/ +c +c *** body *** +c +c *** store largest abs. entry in (d**-1)*h*(d**-1) at w(dggdmx). + dggdmx = p + 1 +c *** store gerschgorin over- and underestimates of the largest +c *** and smallest eigenvalues of (d**-1)*h*(d**-1) at w(emax) +c *** and w(emin) respectively. + emax = dggdmx + 1 + emin = emax + 1 +c *** for use in recomputing step, the final values of lk, uk, dst, +c *** and the inverse derivative of more*s phi at 0 (for pos. def. +c *** h) are stored in w(lk0), w(uk0), w(dstsav), and w(phipin) +c *** respectively. + lk0 = emin + 1 + phipin = lk0 + 1 + uk0 = phipin + 1 + dstsav = uk0 + 1 +c *** store diag of (d**-1)*h*(d**-1) in w(diag),...,w(diag0+p). + diag0 = dstsav + diag = diag0 + 1 +c *** store -d*step in w(q),...,w(q0+p). + q0 = diag0 + p + q = q0 + 1 +c *** allocate storage for scratch vector x *** + x = q + p + rad = v(radius) + radsq = rad**2 +c *** phitol = max. error allowed in dst = v(dstnrm) = 2-norm of +c *** d*step. + phimax = v(phmxfc) * rad + phimin = v(phmnfc) * rad + psifac = two * v(epslon) / (three * (four * (v(phmnfc) + one) * + 1 (kappa + one) + kappa + two) * rad**2) +c *** oldphi is used to detect limits of numerical accuracy. if +c *** we recompute step and it does not change, then we accept it. + oldphi = zero + eps = v(epslon) + irc = 0 + restrt = .false. + kalim = ka + 50 +c +c *** start or restart, depending on ka *** +c + if (ka .ge. 0) go to 290 +c +c *** fresh start *** +c + k = 0 + uk = negone + ka = 0 + kalim = 50 + v(dgnorm) = v2norm(p, dig) + v(nreduc) = zero + v(dst0) = zero + kamin = 3 + if (v(dgnorm) .eq. zero) kamin = 0 +c +c *** store diag(dihdi) in w(diag0+1),...,w(diag0+p) *** +c + j = 0 + do 10 i = 1, p + j = j + i + k1 = diag0 + i + w(k1) = dihdi(j) + 10 continue +c +c *** determine w(dggdmx), the largest element of dihdi *** +c + t1 = zero + j = p * (p + 1) / 2 + do 20 i = 1, j + t = dabs(dihdi(i)) + if (t1 .lt. t) t1 = t + 20 continue + w(dggdmx) = t1 +c +c *** try alpha = 0 *** +c + 30 call lsqrt(1, p, l, dihdi, irc) + if (irc .eq. 0) go to 50 +c *** indef. h -- underestimate smallest eigenvalue, use this +c *** estimate to initialize lower bound lk on alpha. + j = irc*(irc+1)/2 + t = l(j) + l(j) = one + do 40 i = 1, irc + 40 w(i) = zero + w(irc) = one + call litvmu(irc, w, l, w) + t1 = v2norm(irc, w) + lk = -t / t1 / t1 + v(dst0) = -lk + if (restrt) go to 210 + go to 70 +c +c *** positive definite h -- compute unmodified newton step. *** + 50 lk = zero + t = lsvmin(p, l, w(q), w(q)) + if (t .ge. one) go to 60 + if (big .le. zero) big = rmdcon(6) + if (v(dgnorm) .ge. t*t*big) go to 70 + 60 call livmul(p, w(q), l, dig) + gtsta = dotprd(p, w(q), w(q)) + v(nreduc) = half * gtsta + call litvmu(p, w(q), l, w(q)) + dst = v2norm(p, w(q)) + v(dst0) = dst + phi = dst - rad + if (phi .le. phimax) go to 260 + if (restrt) go to 210 +c +c *** prepare to compute gerschgorin estimates of largest (and +c *** smallest) eigenvalues. *** +c + 70 k = 0 + do 100 i = 1, p + wi = zero + if (i .eq. 1) go to 90 + im1 = i - 1 + do 80 j = 1, im1 + k = k + 1 + t = dabs(dihdi(k)) + wi = wi + t + w(j) = w(j) + t + 80 continue + 90 w(i) = wi + k = k + 1 + 100 continue +c +c *** (under-)estimate smallest eigenvalue of (d**-1)*h*(d**-1) *** +c + k = 1 + t1 = w(diag) - w(1) + if (p .le. 1) go to 120 + do 110 i = 2, p + j = diag0 + i + t = w(j) - w(i) + if (t .ge. t1) go to 110 + t1 = t + k = i + 110 continue +c + 120 sk = w(k) + j = diag0 + k + akk = w(j) + k1 = k*(k-1)/2 + 1 + inc = 1 + t = zero + do 150 i = 1, p + if (i .eq. k) go to 130 + aki = dabs(dihdi(k1)) + si = w(i) + j = diag0 + i + t1 = half * (akk - w(j) + si - aki) + t1 = t1 + dsqrt(t1*t1 + sk*aki) + if (t .lt. t1) t = t1 + if (i .lt. k) go to 140 + 130 inc = i + 140 k1 = k1 + inc + 150 continue +c + w(emin) = akk - t + uk = v(dgnorm)/rad - w(emin) + if (v(dgnorm) .eq. zero) uk = uk + p001 + p001*uk + if (uk .le. zero) uk = p001 +c +c *** compute gerschgorin (over-)estimate of largest eigenvalue *** +c + k = 1 + t1 = w(diag) + w(1) + if (p .le. 1) go to 170 + do 160 i = 2, p + j = diag0 + i + t = w(j) + w(i) + if (t .le. t1) go to 160 + t1 = t + k = i + 160 continue +c + 170 sk = w(k) + j = diag0 + k + akk = w(j) + k1 = k*(k-1)/2 + 1 + inc = 1 + t = zero + do 200 i = 1, p + if (i .eq. k) go to 180 + aki = dabs(dihdi(k1)) + si = w(i) + j = diag0 + i + t1 = half * (w(j) + si - aki - akk) + t1 = t1 + dsqrt(t1*t1 + sk*aki) + if (t .lt. t1) t = t1 + if (i .lt. k) go to 190 + 180 inc = i + 190 k1 = k1 + inc + 200 continue +c + w(emax) = akk + t + lk = dmax1(lk, v(dgnorm)/rad - w(emax)) +c +c *** alphak = current value of alpha (see alg. notes above). we +c *** use more*s scheme for initializing it. + alphak = dabs(v(stppar)) * v(rad0)/rad +c + if (irc .ne. 0) go to 210 +c +c *** compute l0 for positive definite h *** +c + call livmul(p, w, l, w(q)) + t = v2norm(p, w) + w(phipin) = dst / t / t + lk = dmax1(lk, phi*w(phipin)) +c +c *** safeguard alphak and add alphak*i to (d**-1)*h*(d**-1) *** +c + 210 ka = ka + 1 + if (-v(dst0) .ge. alphak .or. alphak .lt. lk .or. alphak .ge. uk) + 1 alphak = uk * dmax1(p001, dsqrt(lk/uk)) + if (alphak .le. zero) alphak = half * uk + if (alphak .le. zero) alphak = uk + k = 0 + do 220 i = 1, p + k = k + i + j = diag0 + i + dihdi(k) = w(j) + alphak + 220 continue +c +c *** try computing cholesky decomposition *** +c + call lsqrt(1, p, l, dihdi, irc) + if (irc .eq. 0) go to 240 +c +c *** (d**-1)*h*(d**-1) + alphak*i is indefinite -- overestimate +c *** smallest eigenvalue for use in updating lk *** +c + j = (irc*(irc+1))/2 + t = l(j) + l(j) = one + do 230 i = 1, irc + 230 w(i) = zero + w(irc) = one + call litvmu(irc, w, l, w) + t1 = v2norm(irc, w) + lk = alphak - t/t1/t1 + v(dst0) = -lk + go to 210 +c +c *** alphak makes (d**-1)*h*(d**-1) positive definite. +c *** compute q = -d*step, check for convergence. *** +c + 240 call livmul(p, w(q), l, dig) + gtsta = dotprd(p, w(q), w(q)) + call litvmu(p, w(q), l, w(q)) + dst = v2norm(p, w(q)) + phi = dst - rad + if (phi .le. phimax .and. phi .ge. phimin) go to 270 + if (phi .eq. oldphi) go to 270 + oldphi = phi + if (phi .lt. zero) go to 330 +c +c *** unacceptable alphak -- update lk, uk, alphak *** +c + 250 if (ka .ge. kalim) go to 270 +c *** the following dmin1 is necessary because of restarts *** + if (phi .lt. zero) uk = dmin1(uk, alphak) +c *** kamin = 0 only iff the gradient vanishes *** + if (kamin .eq. 0) go to 210 + call livmul(p, w, l, w(q)) + t1 = v2norm(p, w) + alphak = alphak + (phi/t1) * (dst/t1) * (dst/rad) + lk = dmax1(lk, alphak) + go to 210 +c +c *** acceptable step on first try *** +c + 260 alphak = zero +c +c *** successful step in general. compute step = -(d**-1)*q *** +c + 270 do 280 i = 1, p + j = q0 + i + step(i) = -w(j)/d(i) + 280 continue + v(gtstep) = -gtsta + v(preduc) = half * (dabs(alphak)*dst*dst + gtsta) + go to 410 +c +c +c *** restart with new radius *** +c + 290 if (v(dst0) .le. zero .or. v(dst0) - rad .gt. phimax) go to 310 +c +c *** prepare to return newton step *** +c + restrt = .true. + ka = ka + 1 + k = 0 + do 300 i = 1, p + k = k + i + j = diag0 + i + dihdi(k) = w(j) + 300 continue + uk = negone + go to 30 +c + 310 kamin = ka + 3 + if (v(dgnorm) .eq. zero) kamin = 0 + if (ka .eq. 0) go to 50 +c + dst = w(dstsav) + alphak = dabs(v(stppar)) + phi = dst - rad + t = v(dgnorm)/rad + uk = t - w(emin) + if (v(dgnorm) .eq. zero) uk = uk + p001 + p001*uk + if (uk .le. zero) uk = p001 + if (rad .gt. v(rad0)) go to 320 +c +c *** smaller radius *** + lk = zero + if (alphak .gt. zero) lk = w(lk0) + lk = dmax1(lk, t - w(emax)) + if (v(dst0) .gt. zero) lk = dmax1(lk, (v(dst0)-rad)*w(phipin)) + go to 250 +c +c *** bigger radius *** + 320 if (alphak .gt. zero) uk = dmin1(uk, w(uk0)) + lk = dmax1(zero, -v(dst0), t - w(emax)) + if (v(dst0) .gt. zero) lk = dmax1(lk, (v(dst0)-rad)*w(phipin)) + go to 250 +c +c *** decide whether to check for special case... in practice (from +c *** the standpoint of the calling optimization code) it seems best +c *** not to check until a few iterations have failed -- hence the +c *** test on kamin below. +c + 330 delta = alphak + dmin1(zero, v(dst0)) + twopsi = alphak*dst*dst + gtsta + if (ka .ge. kamin) go to 340 +c *** if the test in ref. 2 is satisfied, fall through to handle +c *** the special case (as soon as the more-sorensen test detects +c *** it). + if (delta .ge. psifac*twopsi) go to 370 +c +c *** check for the special case of h + alpha*d**2 (nearly) +c *** singular. use one step of inverse power method with start +c *** from lsvmin to obtain approximate eigenvector corresponding +c *** to smallest eigenvalue of (d**-1)*h*(d**-1). lsvmin returns +c *** x and w with l*w = x. +c + 340 t = lsvmin(p, l, w(x), w) +c +c *** normalize w *** + do 350 i = 1, p + 350 w(i) = t*w(i) +c *** complete current inv. power iter. -- replace w by (l**-t)*w. + call litvmu(p, w, l, w) + t2 = one/v2norm(p, w) + do 360 i = 1, p + 360 w(i) = t2*w(i) + t = t2 * t +c +c *** now w is the desired approximate (unit) eigenvector and +c *** t*x = ((d**-1)*h*(d**-1) + alphak*i)*w. +c + sw = dotprd(p, w(q), w) + t1 = (rad + dst) * (rad - dst) + root = dsqrt(sw*sw + t1) + if (sw .lt. zero) root = -root + si = t1 / (sw + root) +c +c *** the actual test for the special case... +c + if ((t2*si)**2 .le. eps*(dst**2 + alphak*radsq)) go to 380 +c +c *** update upper bound on smallest eigenvalue (when not positive) +c *** (as recommended by more and sorensen) and continue... +c + if (v(dst0) .le. zero) v(dst0) = dmin1(v(dst0), t2**2 - alphak) + lk = dmax1(lk, -v(dst0)) +c +c *** check whether we can hope to detect the special case in +c *** the available arithmetic. accept step as it is if not. +c +c *** if not yet available, obtain machine dependent value dgxfac. + 370 if (dgxfac .eq. zero) dgxfac = epsfac * rmdcon(3) +c + if (delta .gt. dgxfac*w(dggdmx)) go to 250 + go to 270 +c +c *** special case detected... negate alphak to indicate special case +c + 380 alphak = -alphak + v(preduc) = half * twopsi +c +c *** accept current step if adding si*w would lead to a +c *** further relative reduction in psi of less than v(epslon)/3. +c + t1 = zero + t = si*(alphak*sw - half*si*(alphak + t*dotprd(p,w(x),w))) + if (t .lt. eps*twopsi/six) go to 390 + v(preduc) = v(preduc) + t + dst = rad + t1 = -si + 390 do 400 i = 1, p + j = q0 + i + w(j) = t1*w(i) - w(j) + step(i) = w(j) / d(i) + 400 continue + v(gtstep) = dotprd(p, dig, w(q)) +c +c *** save values for use in a possible restart *** +c + 410 v(dstnrm) = dst + v(stppar) = alphak + w(lk0) = lk + w(uk0) = uk + v(rad0) = rad + w(dstsav) = dst +c +c *** restore diagonal of dihdi *** +c + j = 0 + do 420 i = 1, p + j = j + i + k = diag0 + i + dihdi(j) = w(k) + 420 continue +c + 999 return +c +c *** last card of gqtst follows *** + end + subroutine lsqrt(n1, n, l, a, irc) +c +c *** compute rows n1 through n of the cholesky factor l of +c *** a = l*(l**t), where l and the lower triangle of a are both +c *** stored compactly by rows (and may occupy the same storage). +c *** irc = 0 means all went well. irc = j means the leading +c *** principal j x j submatrix of a is not positive definite -- +c *** and l(j*(j+1)/2) contains the (nonpos.) reduced j-th diagonal. +c +c *** parameters *** +c + integer n1, n, irc +cal double precision l(1), a(1) + double precision l(n*(n+1)/2), a(n*(n+1)/2) +c dimension l(n*(n+1)/2), a(n*(n+1)/2) +c +c *** local variables *** +c + integer i, ij, ik, im1, i0, j, jk, jm1, j0, k + double precision t, td, zero +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c +c *** body *** +c + i0 = n1 * (n1 - 1) / 2 + do 50 i = n1, n + td = zero + if (i .eq. 1) go to 40 + j0 = 0 + im1 = i - 1 + do 30 j = 1, im1 + t = zero + if (j .eq. 1) go to 20 + jm1 = j - 1 + do 10 k = 1, jm1 + ik = i0 + k + jk = j0 + k + t = t + l(ik)*l(jk) + 10 continue + 20 ij = i0 + j + j0 = j0 + j + t = (a(ij) - t) / l(j0) + l(ij) = t + td = td + t*t + 30 continue + 40 i0 = i0 + i + t = a(i0) - td + if (t .le. zero) go to 60 + l(i0) = dsqrt(t) + 50 continue +c + irc = 0 + go to 999 +c + 60 l(i0) = t + irc = i +c + 999 return +c +c *** last card of lsqrt *** + end + double precision function lsvmin(p, l, x, y) +c +c *** estimate smallest sing. value of packed lower triang. matrix l +c +c *** parameter declarations *** +c + integer p +cal double precision l(1), x(p), y(p) + double precision l(p*(p+1)/2), x(p), y(p) +c dimension l(p*(p+1)/2) +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** purpose *** +c +c this function returns a good over-estimate of the smallest +c singular value of the packed lower triangular matrix l. +c +c *** parameter description *** +c +c p (in) = the order of l. l is a p x p lower triangular matrix. +c l (in) = array holding the elements of l in row order, i.e. +c l(1,1), l(2,1), l(2,2), l(3,1), l(3,2), l(3,3), etc. +c x (out) if lsvmin returns a positive value, then x is a normalized +c approximate left singular vector corresponding to the +c smallest singular value. this approximation may be very +c crude. if lsvmin returns zero, then some components of x +c are zero and the rest retain their input values. +c y (out) if lsvmin returns a positive value, then y = (l**-1)*x is an +c unnormalized approximate right singular vector correspond- +c ing to the smallest singular value. this approximation +c may be crude. if lsvmin returns zero, then y retains its +c input value. the caller may pass the same vector for x +c and y (nonstandard fortran usage), in which case y over- +c writes x (for nonzero lsvmin returns). +c +c *** algorithm notes *** +c +c the algorithm is based on (1), with the additional provision that +c lsvmin = 0 is returned if the smallest diagonal element of l +c (in magnitude) is not more than the unit roundoff times the +c largest. the algorithm uses a random number generator proposed +c in (4), which passes the spectral test with flying colors -- see +c (2) and (3). +c +c *** subroutines and functions called *** +c +c v2norm - function, returns the 2-norm of a vector. +c +c *** references *** +c +c (1) cline, a., moler, c., stewart, g., and wilkinson, j.h.(1977), +c an estimate for the condition number of a matrix, report +c tm-310, applied math. div., argonne national laboratory. +c +c (2) hoaglin, d.c. (1976), theoretical properties of congruential +c random-number generators -- an empirical view, +c memorandum ns-340, dept. of statistics, harvard univ. +c +c (3) knuth, d.e. (1969), the art of computer programming, vol. 2 +c (seminumerical algorithms), addison-wesley, reading, mass. +c +c (4) smith, c.s. (1971), multiplicative pseudo-random number +c generators with prime modulus, j. assoc. comput. mach. 18, +c pp. 586-593. +c +c *** history *** +c +c designed and coded by david m. gay (winter 1977/summer 1978). +c +c *** general *** +c +c this subroutine was written in connection with research +c supported by the national science foundation under grants +c mcs-7600324, dcr75-10143, 76-14311dss, and mcs76-11989. +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer i, ii, ix, j, ji, jj, jjj, jm1, j0, pm1 + double precision b, sminus, splus, t, xminus, xplus +c +c *** constants *** +c + double precision half, one, r9973, zero +c +c *** intrinsic functions *** +c/+ + integer mod + real float + double precision dabs +c/ +c *** external functions and subroutines *** +c + external dotprd, v2norm, vaxpy + double precision dotprd, v2norm +c +c/6 +c data half/0.5d+0/, one/1.d+0/, r9973/9973.d+0/, zero/0.d+0/ +c/7 + parameter (half=0.5d+0, one=1.d+0, r9973=9973.d+0, zero=0.d+0) +c/ +c +c *** body *** +c + ix = 2 + pm1 = p - 1 +c +c *** first check whether to return lsvmin = 0 and initialize x *** +c + ii = 0 + j0 = p*pm1/2 + jj = j0 + p + if (l(jj) .eq. zero) go to 110 + ix = mod(3432*ix, 9973) + b = half*(one + float(ix)/r9973) + xplus = b / l(jj) + x(p) = xplus + if (p .le. 1) go to 60 + do 10 i = 1, pm1 + ii = ii + i + if (l(ii) .eq. zero) go to 110 + ji = j0 + i + x(i) = xplus * l(ji) + 10 continue +c +c *** solve (l**t)*x = b, where the components of b have randomly +c *** chosen magnitudes in (.5,1) with signs chosen to make x large. +c +c do j = p-1 to 1 by -1... + do 50 jjj = 1, pm1 + j = p - jjj +c *** determine x(j) in this iteration. note for i = 1,2,...,j +c *** that x(i) holds the current partial sum for row i. + ix = mod(3432*ix, 9973) + b = half*(one + float(ix)/r9973) + xplus = (b - x(j)) + xminus = (-b - x(j)) + splus = dabs(xplus) + sminus = dabs(xminus) + jm1 = j - 1 + j0 = j*jm1/2 + jj = j0 + j + xplus = xplus/l(jj) + xminus = xminus/l(jj) + if (jm1 .eq. 0) go to 30 + do 20 i = 1, jm1 + ji = j0 + i + splus = splus + dabs(x(i) + l(ji)*xplus) + sminus = sminus + dabs(x(i) + l(ji)*xminus) + 20 continue + 30 if (sminus .gt. splus) xplus = xminus + x(j) = xplus +c *** update partial sums *** + if (jm1 .gt. 0) call vaxpy(jm1, x, xplus, l(j0+1), x) + 50 continue +c +c *** normalize x *** +c + 60 t = one/v2norm(p, x) + do 70 i = 1, p + 70 x(i) = t*x(i) +c +c *** solve l*y = x and return lsvmin = 1/twonorm(y) *** +c + do 100 j = 1, p + jm1 = j - 1 + j0 = j*jm1/2 + jj = j0 + j + t = zero + if (jm1 .gt. 0) t = dotprd(jm1, l(j0+1), y) + y(j) = (x(j) - t) / l(jj) + 100 continue +c + lsvmin = one/v2norm(p, y) + go to 999 +c + 110 lsvmin = zero + 999 return +c *** last card of lsvmin follows *** + end + subroutine slvmul(p, y, s, x) +c +c *** set y = s * x, s = p x p symmetric matrix. *** +c *** lower triangle of s stored rowwise. *** +c +c *** parameter declarations *** +c + integer p +cal double precision s(1), x(p), y(p) + double precision s(p*(p+1)/2), x(p), y(p) +c dimension s(p*(p+1)/2) +c +c *** local variables *** +c + integer i, im1, j, k + double precision xi +c +c *** no intrinsic functions *** +c +c *** external function *** +c + external dotprd + double precision dotprd +c +c----------------------------------------------------------------------- +c + j = 1 + do 10 i = 1, p + y(i) = dotprd(i, s(j), x) + j = j + i + 10 continue +c + if (p .le. 1) go to 999 + j = 1 + do 40 i = 2, p + xi = x(i) + im1 = i - 1 + j = j + 1 + do 30 k = 1, im1 + y(k) = y(k) + s(j)*xi + j = j + 1 + 30 continue + 40 continue +c + 999 return +c *** last card of slvmul follows *** + end diff --git a/source/unres/src_Eshel/dihed_cons.F b/source/unres/src_Eshel/dihed_cons.F new file mode 100644 index 0000000..e45405f --- /dev/null +++ b/source/unres/src_Eshel/dihed_cons.F @@ -0,0 +1,185 @@ + subroutine secstrp2dihc + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.BOUNDS' + include 'COMMON.CHAIN' + include 'COMMON.TORCNSTR' + include 'COMMON.IOUNITS' + character*1 secstruc(maxres) + COMMON/SECONDARYS/secstruc + character*80 line + logical errflag + external ilen + +cdr call getenv_loc('SECPREDFIL',secpred) + lenpre=ilen(prefix) + secpred=prefix(:lenpre)//'.spred' + +#if defined(WINIFL) || defined(WINPGI) + open(isecpred,file=secpred,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open(isecpred,file=secpred,status='old',action='read') +#elif (defined G77) + open(isecpred,file=secpred,status='old') +#else + open(isecpred,file=secpred,status='old',action='read') +#endif +C read secondary structure prediction from JPRED here! +! read(isecpred,'(A80)',err=100,end=100) line +! read(line,'(f10.3)',err=110) ftors + read(isecpred,'(f10.3)',err=110) ftors + + write (iout,*) 'FTORS factor =',ftors +! initialize secstruc to any + do i=1,nres + secstruc(i) ='-' + enddo + ndih_constr=0 + ndih_nconstr=0 + + call read_secstr_pred(isecpred,iout,errflag) + if (errflag) then + write(iout,*)'There is a problem with the list of secondary-', + & 'structure prediction' + goto 100 + endif +C 8/13/98 Set limits to generating the dihedral angles + do i=1,nres + phibound(1,i)=-pi + phibound(2,i)=pi + enddo + + ii=0 + do i=1,nres + if ( secstruc(i) .eq. 'H') then +C Helix restraints for this residue + ii=ii+1 + idih_constr(ii)=i + phi0(ii) = 45.0D0*deg2rad + drange(ii)= 5.0D0*deg2rad + phibound(1,i) = phi0(ii)-drange(ii) + phibound(2,i) = phi0(ii)+drange(ii) + else if (secstruc(i) .eq. 'E') then +C strand restraints for this residue + ii=ii+1 + idih_constr(ii)=i + phi0(ii) = 180.0D0*deg2rad + drange(ii)= 5.0D0*deg2rad + phibound(1,i) = phi0(ii)-drange(ii) + phibound(2,i) = phi0(ii)+drange(ii) + else +C no restraints for this residue + ndih_nconstr=ndih_nconstr+1 + idih_nconstr(ndih_nconstr)=i + endif + enddo + ndih_constr=ii + return +100 continue + write(iout,'(A30,A80)')'Error reading file SECPRED',secpred + return + 110 continue + write(iout,'(A20)')'Error reading FTORS' + return + end + + subroutine read_secstr_pred(jin,jout,errors) + + implicit real*8 (a-h,o-z) + INCLUDE 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + character*1 secstruc(maxres) + COMMON/SECONDARYS/secstruc + EXTERNAL ILEN + character*80 line,line1,ucase + logical errflag,errors,blankline + + errors=.false. + read (jin,'(a)') line + write (jout,'(2a)') '> ',line(1:78) + line1=ucase(line) +C Remember that we number full residues starting from 2, then, iseq=1 and iseq=nres +C correspond to the end-groups. ADD to the secondary structure prediction "-" for the +C end-groups in the input file "*.spred" + + iseq=1 + do while (index(line1,'$END').eq.0) +* Override commented lines. + ipos=1 + blankline=.false. + do while (.not.blankline) + line1=' ' + call mykey(line,line1,ipos,blankline,errflag) + if (errflag) write (jout,'(2a)') + & 'Error when reading sequence in line: ',line + errors=errors .or. errflag + if (.not. blankline .and. .not. errflag) then + ipos1=2 + iend=ilen(line1) + if (iseq.le.maxres) then + if (line1(1:1).eq.'-' ) then + secstruc(iseq)=line1(1:1) + else if ( ( ucase(line1(1:1)).eq.'E' ) .or. + & ( ucase(line1(1:1)).eq.'H' ) ) then + secstruc(iseq)=ucase(line1(1:1)) + else + errors=.true. + write (jout,1010) line1(1:1), iseq + goto 80 + endif + else + errors=.true. + write (jout,1000) iseq,maxres + goto 80 + endif + do while (ipos1.le.iend) + + iseq=iseq+1 + il=1 + ipos1=ipos1+1 + if (iseq.le.maxres) then + if (line1(ipos1-1:ipos1-1).eq.'-' ) then + secstruc(iseq)=line1(ipos1-1:ipos1-1) + else if((ucase(line1(ipos1-1:ipos1-1)).eq.'E').or. + & (ucase(line1(ipos1-1:ipos1-1)).eq.'H') ) then + secstruc(iseq)=ucase(line1(ipos1-1:ipos1-1)) + else + errors=.true. + write (jout,1010) line1(ipos1-1:ipos1-1), iseq + goto 80 + endif + else + errors=.true. + write (jout,1000) iseq,maxres + goto 80 + endif + enddo + iseq=iseq+1 + endif + enddo + read (jin,'(a)') line + write (jout,'(2a)') '> ',line(1:78) + line1=ucase(line) + enddo + +cd write (jout,'(10a8)') (sequence(i),i=1,iseq-1) + +cd check whether the found length of the chain is correct. + length_of_chain=iseq-1 + if (length_of_chain .ne. nres) then +! errors=.true. + write (jout,'(a,i4,a,i4,a)') + & 'Error: the number of labels specified in $SEC_STRUC_PRED (' + & ,length_of_chain,') does not match with the number of residues (' + & ,nres,').' + endif + 80 continue + + 1000 format('Error - the number of residues (',i4, + & ') has exceeded maximum (',i4,').') + 1010 format ('Error - unrecognized secondary structure label',a4, + & ' in position',i4) + return + end diff --git a/source/unres/src_Eshel/djacob.f b/source/unres/src_Eshel/djacob.f new file mode 100644 index 0000000..e3f46bc --- /dev/null +++ b/source/unres/src_Eshel/djacob.f @@ -0,0 +1,107 @@ + SUBROUTINE DJACOB(N,NMAX,MAXJAC,E,A,C,AII) + IMPLICIT REAL*8 (A-H,O-Z) +C THE JACOBI DIAGONALIZATION PROCEDURE + COMMON INP,IOUT,IPN + DIMENSION A(NMAX,N),C(NMAX,N),AII(150),AJJ(150) + SIN45 = .70710678 + COS45 = .70710678 + S45SQ = 0.50 + C45SQ = 0.50 +C UNIT EIGENVECTOR MATRIX + DO 70 I = 1,N + DO 7 J = I,N + A(J,I)=A(I,J) + C(I,J) = 0.0 + 7 C(J,I) = 0.0 + 70 C(I,I) = 1.0 +C DETERMINATION OF SEARCH ARGUMENT, TEST + AMAX = 0.0 + DO 1 I = 1,N + DO 1 J = 1,I + TEMPA=DABS(A(I,J)) + IF (AMAX-TEMPA) 2,1,1 + 2 AMAX = TEMPA + 1 CONTINUE + TEST = AMAX*E +C SEARCH FOR LARGEST OFF DIAGONAL ELEMENT + DO 72 IJAC=1,MAXJAC + AIJMAX = 0.0 + DO 3 I = 2,N + LIM = I-1 + DO 3 J = 1,LIM + TAIJ=DABS(A(I,J)) + IF (AIJMAX-TAIJ) 4,3,3 + 4 AIJMAX = TAIJ + IPIV = I + JPIV = J + 3 CONTINUE + IF(AIJMAX-TEST)300,300,5 +C PARAMETERS FOR ROTATION + 5 TAII = A(IPIV,IPIV) + TAJJ = A(JPIV,JPIV) + TAIJ = A(IPIV,JPIV) + TMT = TAII-TAJJ + IF(DABS(TMT/TAIJ)-1.0D-12) 60,60,6 + 60 IF(TAIJ) 10,10,11 + 6 ZAMMA=TAIJ/(2.0*TMT) + 90 IF(DABS(ZAMMA)-0.38268)8,8,9 + 9 IF(ZAMMA)10,10,11 + 10 SINT = -SIN45 + GO TO 12 + 11 SINT = SIN45 + 12 COST = COS45 + SINSQ = S45SQ + COSSQ = C45SQ + GO TO 120 + 8 GAMSQ=ZAMMA*ZAMMA + SINT=2.0*ZAMMA/(1.0+GAMSQ) + COST = (1.0-GAMSQ)/(1.0+GAMSQ) + SINSQ=SINT*SINT + COSSQ=COST*COST +C ROTATION + 120 DO 13 K = 1,N + TAIK = A(IPIV,K) + TAJK = A(JPIV,K) + A(IPIV,K) = TAIK*COST+TAJK*SINT + A(JPIV,K) = TAJK*COST-TAIK*SINT + TCIK = C(IPIV,K) + TCJK = C(JPIV,K) + C(IPIV,K) = TCIK*COST+TCJK*SINT + 13 C(JPIV,K) = TCJK*COST-TCIK*SINT + A(IPIV,IPIV) = TAII*COSSQ+TAJJ*SINSQ+2.0*TAIJ*SINT*COST + A(JPIV,JPIV) = TAII*SINSQ+TAJJ*COSSQ-2.0*TAIJ*SINT*COST + A(IPIV,JPIV) = TAIJ*(COSSQ-SINSQ)-SINT*COST*TMT + A(JPIV,IPIV) = A(IPIV,JPIV) + DO 30 K = 1,N + A(K,IPIV) = A(IPIV,K) + 30 A(K,JPIV) = A(JPIV,K) + 72 CONTINUE + WRITE (IOUT,1000) AIJMAX + 1000 FORMAT (/1X,'NONCONVERGENT JACOBI. LARGEST OFF-DIAGONAL ELE', + 1 'MENT = ',1PE14.7) +C ARRANGEMENT OF EIGENVALUES IN ASCENDING ORDER + 300 DO 14 I=1,N + 14 AJJ(I)=A(I,I) + LT=N+1 + DO15 L=1,N + LT=LT-1 + AIIMIN=1.0E+30 + DO16 I=1,N + IF(AJJ(I)-AIIMIN)17,16,16 + 17 AIIMIN=AJJ(I) + IT=I + 16 CONTINUE + IN=L + AII(IN)=AIIMIN + AJJ(IT)=1.0E+30 + DO15 K=1,N + 15 A(IN,K)=C(IT,K) + DO 18 I=1,N + IF(A(I,1))19,22,22 + 19 T=-1.0 + GO TO 91 + 22 T=1.0 + 91 DO 18 J=1,N + 18 C(J,I)=T*A(I,J) + RETURN + END diff --git a/source/unres/src_Eshel/econstr_local.F b/source/unres/src_Eshel/econstr_local.F new file mode 100644 index 0000000..f11acfb --- /dev/null +++ b/source/unres/src_Eshel/econstr_local.F @@ -0,0 +1,91 @@ + subroutine Econstr_back +c MD with umbrella_sampling using Wolyne's distance measure as a constraint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + Uconst_back=0.0d0 + do i=1,nres + dutheta(i)=0.0d0 + dugamma(i)=0.0d0 + do j=1,3 + duscdiff(j,i)=0.0d0 + duscdiffx(j,i)=0.0d0 + enddo + enddo + do i=1,nfrag_back + ii = ifrag_back(2,i,iset)-ifrag_back(1,i,iset) +c +c Deviations from theta angles +c + utheta_i=0.0d0 + do j=ifrag_back(1,i,iset)+2,ifrag_back(2,i,iset) + dtheta_i=theta(j)-thetaref(j) + utheta_i=utheta_i+0.5d0*dtheta_i*dtheta_i + dutheta(j-2)=dutheta(j-2)+wfrag_back(1,i,iset)*dtheta_i/(ii-1) + enddo + utheta(i)=utheta_i/(ii-1) +c +c Deviations from gamma angles +c + ugamma_i=0.0d0 + do j=ifrag_back(1,i,iset)+3,ifrag_back(2,i,iset) + dgamma_i=pinorm(phi(j)-phiref(j)) +c write (iout,*) j,phi(j),phi(j)-phiref(j) + ugamma_i=ugamma_i+0.5d0*dgamma_i*dgamma_i + dugamma(j-3)=dugamma(j-3)+wfrag_back(2,i,iset)*dgamma_i/(ii-2) +c write (iout,*) i,j,dgamma_i,wfrag_back(2,i,iset),dugamma(j-3) + enddo + ugamma(i)=ugamma_i/(ii-2) +c +c Deviations from local SC geometry +c + uscdiff(i)=0.0d0 + do j=ifrag_back(1,i,iset)+1,ifrag_back(2,i,iset)-1 + dxx=xxtab(j)-xxref(j) + dyy=yytab(j)-yyref(j) + dzz=zztab(j)-zzref(j) + uscdiff(i)=uscdiff(i)+dxx*dxx+dyy*dyy+dzz*dzz + do k=1,3 + duscdiff(k,j-1)=duscdiff(k,j-1)+wfrag_back(3,i,iset)* + & (dXX_C1tab(k,j)*dxx+dYY_C1tab(k,j)*dyy+dZZ_C1tab(k,j)*dzz)/ + & (ii-1) + duscdiff(k,j)=duscdiff(k,j)+wfrag_back(3,i,iset)* + & (dXX_Ctab(k,j)*dxx+dYY_Ctab(k,j)*dyy+dZZ_Ctab(k,j)*dzz)/ + & (ii-1) + duscdiffx(k,j)=duscdiffx(k,j)+wfrag_back(3,i,iset)* + & (dXX_XYZtab(k,j)*dxx+dYY_XYZtab(k,j)*dyy+dZZ_XYZtab(k,j)*dzz) + & /(ii-1) + enddo +c write (iout,'(i5,6f10.5)') j,xxtab(j),yytab(j),zztab(j), +c & xxref(j),yyref(j),zzref(j) + enddo + uscdiff(i)=0.5d0*uscdiff(i)/(ii-1) +c write (iout,*) i," uscdiff",uscdiff(i) +c +c Put together deviations from local geometry +c + Uconst_back=Uconst_back+wfrag_back(1,i,iset)*utheta(i)+ + & wfrag_back(2,i,iset)*ugamma(i)+wfrag_back(3,i,iset)*uscdiff(i) +c write(iout,*) "i",i," utheta",utheta(i)," ugamma",ugamma(i), +c & " uconst_back",uconst_back + utheta(i)=dsqrt(utheta(i)) + ugamma(i)=dsqrt(ugamma(i)) + uscdiff(i)=dsqrt(uscdiff(i)) + enddo + return + end diff --git a/source/unres/src_Eshel/elecont.f b/source/unres/src_Eshel/elecont.f new file mode 100644 index 0000000..e9ed067 --- /dev/null +++ b/source/unres/src_Eshel/elecont.f @@ -0,0 +1,509 @@ + subroutine elecont(lprint,ncont,icont) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + logical lprint + double precision elpp_6(2,2),elpp_3(2,2),ael6_(2,2),ael3_(2,2) + double precision app_(2,2),bpp_(2,2),rpp_(2,2) + integer ncont,icont(2,maxcont) + double precision econt(maxcont) +* +* Load the constants of peptide bond - peptide bond interactions. +* Type 1 - ordinary peptide bond, type 2 - alkylated peptide bond (e.g. +* proline) - determined by averaging ECEPP energy. +* +* as of 7/06/91. +* +c data epp / 0.3045d0, 0.3649d0, 0.3649d0, 0.5743d0/ + data rpp_ / 4.5088d0, 4.5395d0, 4.5395d0, 4.4846d0/ + data elpp_6 /-0.2379d0,-0.2056d0,-0.2056d0,-0.0610d0/ + data elpp_3 / 0.0503d0, 0.0000d0, 0.0000d0, 0.0692d0/ + data elcutoff /-0.3d0/,elecutoff_14 /-0.5d0/ + if (lprint) write (iout,'(a)') + & "Constants of electrostatic interaction energy expression." + do i=1,2 + do j=1,2 + rri=rpp_(i,j)**6 + app_(i,j)=epp(i,j)*rri*rri + bpp_(i,j)=-2.0*epp(i,j)*rri + ael6_(i,j)=elpp_6(i,j)*4.2**6 + ael3_(i,j)=elpp_3(i,j)*4.2**3 + if (lprint) + & write (iout,'(2i2,4e15.4)') i,j,app_(i,j),bpp_(i,j),ael6_(i,j), + & ael3_(i,j) + enddo + enddo + ncont=0 + ees=0.0 + evdw=0.0 + do 1 i=nnt,nct-2 + xi=c(1,i) + yi=c(2,i) + zi=c(3,i) + dxi=c(1,i+1)-c(1,i) + dyi=c(2,i+1)-c(2,i) + dzi=c(3,i+1)-c(3,i) + xmedi=xi+0.5*dxi + ymedi=yi+0.5*dyi + zmedi=zi+0.5*dzi + do 4 j=i+2,nct-1 + ind=ind+1 + iteli=itel(i) + itelj=itel(j) + if (j.eq.i+2 .and. itelj.eq.2) iteli=2 + if (iteli.eq.2 .and. itelj.eq.2) goto 4 + aaa=app_(iteli,itelj) + bbb=bpp_(iteli,itelj) + ael6_i=ael6_(iteli,itelj) + ael3_i=ael3_(iteli,itelj) + dxj=c(1,j+1)-c(1,j) + dyj=c(2,j+1)-c(2,j) + dzj=c(3,j+1)-c(3,j) + xj=c(1,j)+0.5*dxj-xmedi + yj=c(2,j)+0.5*dyj-ymedi + zj=c(3,j)+0.5*dzj-zmedi + rrmij=1.0/(xj*xj+yj*yj+zj*zj) + rmij=sqrt(rrmij) + r3ij=rrmij*rmij + r6ij=r3ij*r3ij + vrmij=vblinv*rmij + cosa=(dxi*dxj+dyi*dyj+dzi*dzj)*vblinv2 + cosb=(xj*dxi+yj*dyi+zj*dzi)*vrmij + cosg=(xj*dxj+yj*dyj+zj*dzj)*vrmij + fac=cosa-3.0*cosb*cosg + ev1=aaa*r6ij*r6ij + ev2=bbb*r6ij + fac3=ael6_i*r6ij + fac4=ael3_i*r3ij + evdwij=ev1+ev2 + el1=fac3*(4.0+fac*fac-3.0*(cosb*cosb+cosg*cosg)) + el2=fac4*fac + eesij=el1+el2 + if (j.gt.i+2 .and. eesij.le.elcutoff .or. + & j.eq.i+2 .and. eesij.le.elecutoff_14) then + ncont=ncont+1 + icont(1,ncont)=i + icont(2,ncont)=j + econt(ncont)=eesij + endif + ees=ees+eesij + evdw=evdw+evdwij + 4 continue + 1 continue + if (lprint) then + write (iout,*) 'Total average electrostatic energy: ',ees + write (iout,*) 'VDW energy between peptide-group centers: ',evdw + write (iout,*) + write (iout,*) 'Electrostatic contacts before pruning: ' + do i=1,ncont + i1=icont(1,i) + i2=icont(2,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4,f10.5)') + & i,restyp(it1),i1,restyp(it2),i2,econt(i) + enddo + endif +c For given residues keep only the contacts with the greatest energy. + i=0 + do while (i.lt.ncont) + i=i+1 + ene=econt(i) + ic1=icont(1,i) + ic2=icont(2,i) + j=i + do while (j.lt.ncont) + j=j+1 + if (ic1.eq.icont(1,j).and.iabs(icont(2,j)-ic2).le.2 .or. + & ic2.eq.icont(2,j).and.iabs(icont(1,j)-ic1).le.2) then +c write (iout,*) "i",i," j",j," ic1",ic1," ic2",ic2, +c & " jc1",icont(1,j)," jc2",icont(2,j)," ncont",ncont + if (econt(j).lt.ene .and. icont(2,j).ne.icont(1,j)+2) then + if (ic1.eq.icont(1,j)) then + do k=1,ncont + if (k.ne.i .and. k.ne.j .and. icont(2,k).eq.icont(2,j) + & .and. iabs(icont(1,k)-ic1).le.2 .and. + & econt(k).lt.econt(j) ) goto 21 + enddo + else if (ic2.eq.icont(2,j) ) then + do k=1,ncont + if (k.ne.i .and. k.ne.j .and. icont(1,k).eq.icont(1,j) + & .and. iabs(icont(2,k)-ic2).le.2 .and. + & econt(k).lt.econt(j) ) goto 21 + enddo + endif +c Remove ith contact + do k=i+1,ncont + icont(1,k-1)=icont(1,k) + icont(2,k-1)=icont(2,k) + econt(k-1)=econt(k) + enddo + i=i-1 + ncont=ncont-1 +c write (iout,*) "ncont",ncont +c do k=1,ncont +c write (iout,*) icont(1,k),icont(2,k) +c enddo + goto 20 + else if (econt(j).gt.ene .and. ic2.ne.ic1+2) + & then + if (ic1.eq.icont(1,j)) then + do k=1,ncont + if (k.ne.i .and. k.ne.j .and. icont(2,k).eq.ic2 + & .and. iabs(icont(1,k)-icont(1,j)).le.2 .and. + & econt(k).lt.econt(i) ) goto 21 + enddo + else if (ic2.eq.icont(2,j) ) then + do k=1,ncont + if (k.ne.i .and. k.ne.j .and. icont(1,k).eq.ic1 + & .and. iabs(icont(2,k)-icont(2,j)).le.2 .and. + & econt(k).lt.econt(i) ) goto 21 + enddo + endif +c Remove jth contact + do k=j+1,ncont + icont(1,k-1)=icont(1,k) + icont(2,k-1)=icont(2,k) + econt(k-1)=econt(k) + enddo + ncont=ncont-1 +c write (iout,*) "ncont",ncont +c do k=1,ncont +c write (iout,*) icont(1,k),icont(2,k) +c enddo + j=j-1 + endif + endif + 21 continue + enddo + 20 continue + enddo + if (lprint) then + write (iout,*) + write (iout,*) 'Electrostatic contacts after pruning: ' + do i=1,ncont + i1=icont(1,i) + i2=icont(2,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4,f10.5)') + & i,restyp(it1),i1,restyp(it2),i2,econt(i) + enddo + endif + return + end +c-------------------------------------------- + subroutine secondary2(lprint) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.DISTFIT' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.CONTROL' + integer ncont,icont(2,maxcont),isec(maxres,4),nsec(maxres) + logical lprint,not_done,freeres + double precision p1,p2 + external freeres + + if(.not.dccart) call chainbuild +cd call write_pdb(99,'sec structure',0d0) + ncont=0 + nbfrag=0 + nhfrag=0 + do i=1,nres + isec(i,1)=0 + isec(i,2)=0 + nsec(i)=0 + enddo + + call elecont(lprint,ncont,icont) + +c finding parallel beta +cd write (iout,*) '------- looking for parallel beta -----------' + nbeta=0 + nstrand=0 + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if(j1-i1.gt.5 .and. freeres(i1,j1,nsec,isec)) then + ii1=i1 + jj1=j1 +cd write (iout,*) i1,j1 + not_done=.true. + do while (not_done) + i1=i1+1 + j1=j1+1 + do j=1,ncont + if (i1.eq.icont(1,j) .and. j1.eq.icont(2,j) .and. + & freeres(i1,j1,nsec,isec)) goto 5 + enddo + not_done=.false. + 5 continue +cd write (iout,*) i1,j1,not_done + enddo + j1=j1-1 + i1=i1-1 + if (i1-ii1.gt.1) then + ii1=max0(ii1-1,1) + jj1=max0(jj1-1,1) + nbeta=nbeta+1 + if(lprint)write(iout,'(a,i3,4i4)')'parallel beta', + & nbeta,ii1,i1,jj1,j1 + + nbfrag=nbfrag+1 + bfrag(1,nbfrag)=ii1+1 + bfrag(2,nbfrag)=i1+1 + bfrag(3,nbfrag)=jj1+1 + bfrag(4,nbfrag)=min0(j1+1,nres) + + do ij=ii1,i1 + nsec(ij)=nsec(ij)+1 + isec(ij,nsec(ij))=nbeta + enddo + do ij=jj1,j1 + nsec(ij)=nsec(ij)+1 + isec(ij,nsec(ij))=nbeta + enddo + + if(lprint) then + nstrand=nstrand+1 + if (nbeta.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-1,"..",i1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-1,"..",i1-1,"'" + endif + nstrand=nstrand+1 + if (nbeta.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",jj1-1,"..",j1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",jj1-1,"..",j1-1,"'" + endif + write(12,'(a8,4i4)') + & "SetNeigh",ii1-1,i1-1,jj1-1,j1-1 + endif + endif + endif + enddo + +c finding alpha or 310 helix + + nhelix=0 + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + p1=phi(i1+2)*rad2deg + p2=0.0 + if (j1+2.le.nres) p2=phi(j1+2)*rad2deg + + + if (j1.eq.i1+3 .and. + & ((p1.ge.10.and.p1.le.80).or.i1.le.2).and. + & ((p2.ge.10.and.p2.le.80).or.j1.le.2.or.j1.ge.nres-3) )then +cd if (j1.eq.i1+3) write (iout,*) "found 1-4 ",i1,j1,p1,p2 +co if (j1.eq.i1+4) write (iout,*) "found 1-5 ",i1,j1,p1,p2 + ii1=i1 + jj1=j1 + if (nsec(ii1).eq.0) then + not_done=.true. + else + not_done=.false. + endif + do while (not_done) + i1=i1+1 + j1=j1+1 + do j=1,ncont + if (i1.eq.icont(1,j) .and. j1.eq.icont(2,j)) goto 10 + enddo + not_done=.false. + 10 continue + p1=phi(i1+2)*rad2deg + p2=phi(j1+2)*rad2deg + if (p1.lt.10.or.p1.gt.80.or.p2.lt.10.or.p2.gt.80) + & not_done=.false. +cd write (iout,*) i1,j1,not_done,p1,p2 + enddo + j1=j1+1 + if (j1-ii1.gt.5) then + nhelix=nhelix+1 +cd write (iout,*)'helix',nhelix,ii1,j1 + + nhfrag=nhfrag+1 + hfrag(1,nhfrag)=ii1 + hfrag(2,nhfrag)=j1 + + do ij=ii1,j1 + nsec(ij)=-1 + enddo + if (lprint) then + write (iout,'(a,i3,2i4)') "Helix",nhelix,ii1-1,j1-1 + if (nhelix.le.9) then + write(12,'(a17,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'helix",nhelix, + & "' 'num = ",ii1-1,"..",j1-2,"'" + else + write(12,'(a17,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'helix",nhelix, + & "' 'num = ",ii1-1,"..",j1-2,"'" + endif + endif + endif + endif + enddo + + if (nhelix.gt.0.and.lprint) then + write(12,'(a26,$)') "DefPropRes 'helix' 'helix1" + do i=2,nhelix + if (nhelix.le.9) then + write(12,'(a8,i1,$)') " | helix",i + else + write(12,'(a8,i2,$)') " | helix",i + endif + enddo + write(12,'(a1)') "'" + endif + + +c finding antiparallel beta +cd write (iout,*) '--------- looking for antiparallel beta ---------' + + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if (freeres(i1,j1,nsec,isec)) then + ii1=i1 + jj1=j1 +cd write (iout,*) i1,j1 + + not_done=.true. + do while (not_done) + i1=i1+1 + j1=j1-1 + do j=1,ncont + if (i1.eq.icont(1,j).and.j1.eq.icont(2,j) .and. + & freeres(i1,j1,nsec,isec)) goto 6 + enddo + not_done=.false. + 6 continue +cd write (iout,*) i1,j1,not_done + enddo + i1=i1-1 + j1=j1+1 + if (i1-ii1.gt.1) then + + nbfrag=nbfrag+1 + bfrag(1,nbfrag)=ii1 + bfrag(2,nbfrag)=min0(i1+1,nres) + bfrag(3,nbfrag)=min0(jj1+1,nres) + bfrag(4,nbfrag)=j1 + + nbeta=nbeta+1 + iii1=max0(ii1-1,1) + do ij=iii1,i1 + nsec(ij)=nsec(ij)+1 + if (nsec(ij).le.2) then + isec(ij,nsec(ij))=nbeta + endif + enddo + jjj1=max0(j1-1,1) + do ij=jjj1,jj1 + nsec(ij)=nsec(ij)+1 + if (nsec(ij).le.2 .and. nsec(ij).gt.0) then + isec(ij,nsec(ij))=nbeta + endif + enddo + + + if (lprint) then + write (iout,'(a,i3,4i4)')'antiparallel beta', + & nbeta,ii1-1,i1,jj1,j1-1 + nstrand=nstrand+1 + if (nstrand.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-2,"..",i1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-2,"..",i1-1,"'" + endif + nstrand=nstrand+1 + if (nstrand.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",j1-2,"..",jj1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",j1-2,"..",jj1-1,"'" + endif + write(12,'(a8,4i4)') + & "SetNeigh",ii1-2,i1-1,jj1-1,j1-2 + endif + endif + endif + enddo + + if (nstrand.gt.0.and.lprint) then + write(12,'(a27,$)') "DefPropRes 'sheet' 'strand1" + do i=2,nstrand + if (i.le.9) then + write(12,'(a9,i1,$)') " | strand",i + else + write(12,'(a9,i2,$)') " | strand",i + endif + enddo + write(12,'(a1)') "'" + endif + + + + if (lprint) then + write(12,'(a37)') "DefPropRes 'coil' '! (helix | sheet)'" + write(12,'(a20)') "XMacStand ribbon.mac" + + + write(iout,*) 'UNRES seq:' + do j=1,nbfrag + write(iout,*) 'beta ',(bfrag(i,j),i=1,4) + enddo + + do j=1,nhfrag + write(iout,*) 'helix ',(hfrag(i,j),i=1,2) + enddo + endif + + return + end +c------------------------------------------------- + logical function freeres(i,j,nsec,isec) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer isec(maxres,4),nsec(maxres) + freeres=.false. + + if (nsec(i).lt.0.or.nsec(j).lt.0) return + if (nsec(i).gt.1.or.nsec(j).gt.1) return + do k=1,nsec(i) + do l=1,nsec(j) + if (isec(i,k).eq.isec(j,l)) return + enddo + enddo + freeres=.true. + return + end + diff --git a/source/unres/src_Eshel/energy_p_new_barrier.F b/source/unres/src_Eshel/energy_p_new_barrier.F new file mode 100644 index 0000000..1e6d778 --- /dev/null +++ b/source/unres/src_Eshel/energy_p_new_barrier.F @@ -0,0 +1,9316 @@ + subroutine etotal(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" + double precision weights_(n_ene) +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene) + include 'COMMON.LOCAL' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' + include "COMMON.ECOMPON" + do i=1,ntyp + vdw2compon(i)=0.0d0 + becompon(i)=0.0d0 + sccompon(i)=0.0d0 + tordcompon(i)=0.0d0 + enddo + do i=1,ntyp + do j=1,ntyp + vdwcompon(i,j)=0.0d0 + torcompon(i,j)=0.0d0 + sccorcompon(i,j)=0.0d0 + enddo + enddo +#ifdef MPI +c print*,"ETOTAL Processor",fg_rank," absolute rank",myrank, +c & " nfgtasks",nfgtasks + if (nfgtasks.gt.1) then +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (fg_rank.eq.0) then + call MPI_Bcast(0,1,MPI_INTEGER,king,FG_COMM,IERROR) +c print *,"Processor",myrank," BROADCAST iorder" +C FG master sets up the WEIGHTS_ array which will be broadcast to the +C FG slaves as WEIGHTS array. + weights_(1)=wsc + weights_(2)=wscp + weights_(3)=welec + weights_(4)=wcorr + weights_(5)=wcorr5 + weights_(6)=wcorr6 + weights_(7)=wel_loc + weights_(8)=wturn3 + weights_(9)=wturn4 + weights_(10)=wturn6 + weights_(11)=wang + weights_(12)=wscloc + weights_(13)=wtor + weights_(14)=wtor_d + weights_(15)=wstrain + weights_(16)=wvdwpp + weights_(17)=wbond + weights_(18)=scal14 + weights_(21)=wsccor + weights_(22)=wsct +C FG Master broadcasts the WEIGHTS_ array + call MPI_Bcast(weights_(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + else +C FG slaves receive the WEIGHTS array + call MPI_Bcast(weights(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + wsc=weights(1) + wscp=weights(2) + welec=weights(3) + wcorr=weights(4) + wcorr5=weights(5) + wcorr6=weights(6) + wel_loc=weights(7) + wturn3=weights(8) + wturn4=weights(9) + wturn6=weights(10) + wang=weights(11) + wscloc=weights(12) + wtor=weights(13) + wtor_d=weights(14) + wstrain=weights(15) + wvdwpp=weights(16) + wbond=weights(17) + scal14=weights(18) + wsccor=weights(21) + wsct=weights(22) + endif + time_Bcast=time_Bcast+MPI_Wtime()-time00 + time_Bcastw=time_Bcastw+MPI_Wtime()-time00 +c call chainbuild_cart + endif +c print *,'Processor',myrank,' calling etotal ipot=',ipot +c print *,'Processor',myrank,' nnt=',nnt,' nct=',nct +#else +c if (modecalc.eq.12.or.modecalc.eq.14) then +c call int_from_cart1(.false.) +c endif +#endif +#ifdef TIMING +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +#endif +C +C Compute the side-chain and electrostatic interaction energy +C + goto (101,102,103,104,105,106) ipot +C Lennard-Jones potential. + 101 call elj(evdw,evdw_p,evdw_m) +cd print '(a)','Exit ELJ' + goto 107 +C Lennard-Jones-Kihara potential (shifted). + 102 call eljk(evdw,evdw_p,evdw_m) + goto 107 +C Berne-Pechukas potential (dilated LJ, angular dependence). + 103 call ebp(evdw,evdw_p,evdw_m) + goto 107 +C Gay-Berne potential (shifted LJ, angular dependence). + 104 call egb(evdw,evdw_p,evdw_m) + goto 107 +C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence). + 105 call egbv(evdw,evdw_p,evdw_m) + goto 107 +C Soft-sphere potential + 106 call e_softsphere(evdw) +C +C Calculate electrostatic (H-bonding) energy of the main chain. +C + 107 continue +c print *,"Processor",myrank," computed USCSC" +#ifdef TIMING +#ifdef MPI + time01=MPI_Wtime() +#else + time00=tcpu() +#endif +#endif + call vec_and_deriv +#ifdef TIMING +#ifdef MPI + time_vec=time_vec+MPI_Wtime()-time01 +#else + time_vec=time_vec+tcpu()-time01 +#endif +#endif +c print *,"Processor",myrank," left VEC_AND_DERIV" + if (ipot.lt.6) then +#ifdef SPLITELE + if (welec.gt.0d0.or.wvdwpp.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#else + if (welec.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#endif + call eelec(ees,evdw1,eel_loc,eello_turn3,eello_turn4) + else + ees=0.0d0 + evdw1=0.0d0 + eel_loc=0.0d0 + eello_turn3=0.0d0 + eello_turn4=0.0d0 + endif + else +c write (iout,*) "Soft-spheer ELEC potential" + call eelec_soft_sphere(ees,evdw1,eel_loc,eello_turn3, + & eello_turn4) + endif +c print *,"Processor",myrank," computed UELEC" +C +C Calculate excluded-volume interaction energy between peptide groups +C and side chains. +C + if (ipot.lt.6) then + if(wscp.gt.0d0) then + call escp(evdw2,evdw2_14) + else + evdw2=0 + evdw2_14=0 + endif + else +c write (iout,*) "Soft-sphere SCP potential" + call escp_soft_sphere(evdw2,evdw2_14) + endif +c +c Calculate the bond-stretching energy +c + call ebond(estr) +C +C Calculate the disulfide-bridge and other energy and the contributions +C from other distance constraints. +cd print *,'Calling EHPB' + call edis(ehpb) +cd print *,'EHPB exitted succesfully.' +C +C Calculate the virtual-bond-angle energy. +C + if (wang.gt.0d0) then + call ebend(ebe) + else + ebe=0 + endif +c print *,"Processor",myrank," computed UB" +C +C Calculate the SC local energy. +C + call esc(escloc) +c print *,"Processor",myrank," computed USC" +C +C Calculate the virtual-bond torsional energy. +C +cd print *,'nterm=',nterm + if (wtor.gt.0) then + call etor(etors,edihcnstr) + else + etors=0 + edihcnstr=0 + endif +c print *,"Processor",myrank," computed Utor" +C +C 6/23/01 Calculate double-torsional energy +C + if (wtor_d.gt.0) then + call etor_d(etors_d) + else + etors_d=0 + endif +c print *,"Processor",myrank," computed Utord" +C +C 21/5/07 Calculate local sicdechain correlation energy +C +c if (wsccor.gt.0.0d0) then + call eback_sc_corr(esccor) +c else +c esccor=0.0d0 +c endif +c print *,"Processor",myrank," computed Usccorr" +C +C 12/1/95 Multi-body terms +C + n_corr=0 + n_corr1=0 + if ((wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 + & .or. wturn6.gt.0.0d0) .and. ipot.lt.6) then + call multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr,n_corr1) +cd write(2,*)'multibody_eello n_corr=',n_corr,' n_corr1=',n_corr1, +cd &" ecorr",ecorr," ecorr5",ecorr5," ecorr6",ecorr6," eturn6",eturn6 + else + ecorr=0.0d0 + ecorr5=0.0d0 + ecorr6=0.0d0 + eturn6=0.0d0 + endif + if ((wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) .and. ipot.lt.6) then + call multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) +cd write (iout,*) "multibody_hb ecorr",ecorr + endif +c print *,"Processor",myrank," computed Ucorr" +C +C If performing constraint dynamics, call the constraint energy +C after the equilibration time +c if(usampl.and.totT.gt.eq_time) then +c call EconstrQ +c call Econstr_back +c else +c Uconst=0.0d0 +c Uconst_back=0.0d0 +c endif +#ifdef TIMING +#ifdef MPI + time_enecalc=time_enecalc+MPI_Wtime()-time00 +#else + time_enecalc=time_enecalc+tcpu()-time00 +#endif +#endif +c print *,"Processor",myrank," computed Uconstr" +#ifdef TIMING +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +#endif +c +C Sum the energies +C + energia(1)=evdw +#ifdef SCP14 + energia(2)=evdw2-evdw2_14 + energia(18)=evdw2_14 +#else + energia(2)=evdw2 + energia(18)=0.0d0 +#endif +#ifdef SPLITELE + energia(3)=ees + energia(16)=evdw1 +#else + energia(3)=ees+evdw1 + energia(16)=0.0d0 +#endif + energia(4)=ecorr + energia(5)=ecorr5 + energia(6)=ecorr6 + energia(7)=eel_loc + energia(8)=eello_turn3 + energia(9)=eello_turn4 + energia(10)=eturn6 + energia(11)=ebe + energia(12)=escloc + energia(13)=etors + energia(14)=etors_d + energia(15)=ehpb + energia(19)=edihcnstr + energia(17)=estr + energia(20)=Uconst+Uconst_back + energia(21)=esccor + energia(22)=evdw_p + energia(23)=evdw_m +c print *," Processor",myrank," calls SUM_ENERGY" + call sum_energy(energia,.true.) +c print *," Processor",myrank," left SUM_ENERGY" +#ifdef TIMING +#ifdef MPI + time_sumene=time_sumene+MPI_Wtime()-time00 +#else + time_sumene=time_sumene+tcpu()-time00 +#endif +#endif + return + end +c------------------------------------------------------------------------------- + subroutine sum_energy(energia,reduce) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene),enebuff(0:n_ene+1) + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' + logical reduce +#ifdef MPI + if (nfgtasks.gt.1 .and. reduce) then +#ifdef DEBUG + write (iout,*) "energies before REDUCE" + call enerprint(energia) + call flush(iout) +#endif + do i=0,n_ene + enebuff(i)=energia(i) + enddo + time00=MPI_Wtime() + call MPI_Barrier(FG_COMM,IERR) + time_barrier_e=time_barrier_e+MPI_Wtime()-time00 + time00=MPI_Wtime() + call MPI_Reduce(enebuff(0),energia(0),n_ene+1, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) +#ifdef DEBUG + write (iout,*) "energies after REDUCE" + call enerprint(energia) + call flush(iout) +#endif + time_Reduce=time_Reduce+MPI_Wtime()-time00 + endif + if (fg_rank.eq.0) then +#endif +#ifdef TSCSC + evdw=energia(22)+wsct*energia(23) +#else + evdw=energia(1) +#endif +#ifdef SCP14 + evdw2=energia(2)+energia(18) + evdw2_14=energia(18) +#else + evdw2=energia(2) +#endif +#ifdef SPLITELE + ees=energia(3) + evdw1=energia(16) +#else + ees=energia(3) + evdw1=0.0d0 +#endif + ecorr=energia(4) + ecorr5=energia(5) + ecorr6=energia(6) + eel_loc=energia(7) + eello_turn3=energia(8) + eello_turn4=energia(9) + eturn6=energia(10) + ebe=energia(11) + escloc=energia(12) + etors=energia(13) + etors_d=energia(14) + ehpb=energia(15) + edihcnstr=energia(19) + estr=energia(17) + Uconst=energia(20) + esccor=energia(21) +#ifdef SPLITELE + etot=wsc*evdw+wscp*evdw2+welec*ees+wvdwpp*evdw1 + & +wang*ebe+wtor*etors+wscloc*escloc + & +wstrain*ehpb+wcorr*ecorr+wcorr5*ecorr5 + & +wcorr6*ecorr6+wturn4*eello_turn4+wturn3*eello_turn3 + & +wturn6*eturn6+wel_loc*eel_loc+edihcnstr+wtor_d*etors_d + & +wbond*estr+Uconst+wsccor*esccor +#else + etot=wsc*evdw+wscp*evdw2+welec*(ees+evdw1) + & +wang*ebe+wtor*etors+wscloc*escloc + & +wstrain*ehpb+wcorr*ecorr+wcorr5*ecorr5 + & +wcorr6*ecorr6+wturn4*eello_turn4+wturn3*eello_turn3 + & +wturn6*eturn6+wel_loc*eel_loc+edihcnstr+wtor_d*etors_d + & +wbond*estr+Uconst+wsccor*esccor +#endif + energia(0)=etot +c detecting NaNQ +#ifdef ISNAN +#ifdef AIX + if (isnan(etot).ne.0) energia(0)=1.0d+99 +#else + if (isnan(etot)) energia(0)=1.0d+99 +#endif +#else + i=0 +#ifdef WINPGI + idumm=proc_proc(etot,i) +#else + call proc_proc(etot,i) +#endif + if(i.eq.1)energia(0)=1.0d+99 +#endif +#ifdef MPI + endif +#endif + return + end +c------------------------------------------------------------------------------- + subroutine sum_gradient + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include 'mpif.h' +#endif + double precision gradbufc(3,maxres),gradbufx(3,maxres), + & glocbuf(4*maxres),gradbufc_sum(3,maxres),gloc_scbuf(3,maxres) + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' + include 'COMMON.MAXGRAD' + include 'COMMON.SCCOR' +#ifdef TIMING +#ifdef MPI + time01=MPI_Wtime() +#else + time01=tcpu() +#endif +#endif +#ifdef DEBUG + write (iout,*) "sum_gradient gvdwc, gvdwx" + do i=1,nres + write (iout,'(i3,3f10.5,5x,3f10.5,5x,3f10.5,5x,3f10.5)') + & i,(gvdwx(j,i),j=1,3),(gvdwcT(j,i),j=1,3),(gvdwc(j,i),j=1,3), + & (gvdwcT(j,i),j=1,3) + enddo + call flush(iout) +#endif +#ifdef MPI +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (nfgtasks.gt.1 .and. fg_rank.eq.0) + & call MPI_Bcast(1,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif +C +C 9/29/08 AL Transform parts of gradients in site coordinates to the gradient +C in virtual-bond-vector coordinates +C +#ifdef DEBUG +c write (iout,*) "gel_loc gel_loc_long and gel_loc_loc" +c do i=1,nres-1 +c write (iout,'(i5,3f10.5,2x,3f10.5,2x,f10.5)') +c & i,(gel_loc(j,i),j=1,3),(gel_loc_long(j,i),j=1,3),gel_loc_loc(i) +c enddo +c write (iout,*) "gel_loc_tur3 gel_loc_turn4" +c do i=1,nres-1 +c write (iout,'(i5,3f10.5,2x,f10.5)') +c & i,(gcorr4_turn(j,i),j=1,3),gel_loc_turn4(i) +c enddo + write (iout,*) "gradcorr5 gradcorr5_long gradcorr5_loc" + do i=1,nres + write (iout,'(i3,3f10.5,5x,3f10.5,5x,f10.5)') + & i,(gradcorr5(j,i),j=1,3),(gradcorr5_long(j,i),j=1,3), + & g_corr5_loc(i) + enddo + call flush(iout) +#endif +#ifdef SPLITELE +#ifdef TSCSC + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+wsc*wscT*gvdwcT(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#else + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#endif +#else + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+ + & wbond*gradb(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#endif +#ifdef MPI + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +#ifdef DEBUG + write (iout,*) "gradbufc before allreduce" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + do i=1,nres + do j=1,3 + gradbufc_sum(j,i)=gradbufc(j,i) + enddo + enddo +c call MPI_AllReduce(gradbufc(1,1),gradbufc_sum(1,1),3*nres, +c & MPI_DOUBLE_PRECISION,MPI_SUM,FG_COMM,IERR) +c time_reduce=time_reduce+MPI_Wtime()-time00 +#ifdef DEBUG +c write (iout,*) "gradbufc_sum after allreduce" +c do i=1,nres +c write (iout,'(i3,3f10.5)') i,(gradbufc_sum(j,i),j=1,3) +c enddo +c call flush(iout) +#endif +#ifdef TIMING +c time_allreduce=time_allreduce+MPI_Wtime()-time00 +#endif + do i=nnt,nres + do k=1,3 + gradbufc(k,i)=0.0d0 + enddo + enddo +#ifdef DEBUG + write (iout,*) "igrad_start",igrad_start," igrad_end",igrad_end + write (iout,*) (i," jgrad_start",jgrad_start(i), + & " jgrad_end ",jgrad_end(i), + & i=igrad_start,igrad_end) +#endif +c +c Obsolete and inefficient code; we can make the effort O(n) and, therefore, +c do not parallelize this part. +c +c do i=igrad_start,igrad_end +c do j=jgrad_start(i),jgrad_end(i) +c do k=1,3 +c gradbufc(k,i)=gradbufc(k,i)+gradbufc_sum(k,j) +c enddo +c enddo +c enddo + do j=1,3 + gradbufc(j,nres-1)=gradbufc_sum(j,nres) + enddo + do i=nres-2,nnt,-1 + do j=1,3 + gradbufc(j,i)=gradbufc(j,i+1)+gradbufc_sum(j,i+1) + enddo + enddo +#ifdef DEBUG + write (iout,*) "gradbufc after summing" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + else +#endif +#ifdef DEBUG + write (iout,*) "gradbufc" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + do i=1,nres + do j=1,3 + gradbufc_sum(j,i)=gradbufc(j,i) + gradbufc(j,i)=0.0d0 + enddo + enddo + do j=1,3 + gradbufc(j,nres-1)=gradbufc_sum(j,nres) + enddo + do i=nres-2,nnt,-1 + do j=1,3 + gradbufc(j,i)=gradbufc(j,i+1)+gradbufc_sum(j,i+1) + enddo + enddo +c do i=nnt,nres-1 +c do k=1,3 +c gradbufc(k,i)=0.0d0 +c enddo +c do j=i+1,nres +c do k=1,3 +c gradbufc(k,i)=gradbufc(k,i)+gradbufc(k,j) +c enddo +c enddo +c enddo +#ifdef DEBUG + write (iout,*) "gradbufc after summing" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif +#ifdef MPI + endif +#endif + do k=1,3 + gradbufc(k,nres)=0.0d0 + enddo + do i=1,nct + do j=1,3 +#ifdef SPLITELE + gradc(j,i,icg)=gradbufc(j,i)+welec*gelc(j,i)+ + & wel_loc*gel_loc(j,i)+ + & 0.5d0*(wscp*gvdwc_scpp(j,i)+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i))+ + & wbond*gradb(j,i)+ + & wcorr*gradcorr(j,i)+ + & wturn3*gcorr3_turn(j,i)+ + & wturn4*gcorr4_turn(j,i)+ + & wcorr5*gradcorr5(j,i)+ + & wcorr6*gradcorr6(j,i)+ + & wturn6*gcorr6_turn(j,i)+ + & wsccor*gsccorc(j,i) + & +wscloc*gscloc(j,i) +#else + gradc(j,i,icg)=gradbufc(j,i)+welec*gelc(j,i)+ + & wel_loc*gel_loc(j,i)+ + & 0.5d0*(wscp*gvdwc_scpp(j,i)+ + & welec*gelc_long(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i))+ + & wbond*gradb(j,i)+ + & wcorr*gradcorr(j,i)+ + & wturn3*gcorr3_turn(j,i)+ + & wturn4*gcorr4_turn(j,i)+ + & wcorr5*gradcorr5(j,i)+ + & wcorr6*gradcorr6(j,i)+ + & wturn6*gcorr6_turn(j,i)+ + & wsccor*gsccorc(j,i) + & +wscloc*gscloc(j,i) +#endif +#ifdef TSCSC + gradx(j,i,icg)=wsc*gvdwx(j,i)+wsc*wscT*gvdwxT(j,i)+ + & wscp*gradx_scp(j,i)+ + & wbond*gradbx(j,i)+ + & wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+ + & wsccor*gsccorx(j,i) + & +wscloc*gsclocx(j,i) +#else + gradx(j,i,icg)=wsc*gvdwx(j,i)+wscp*gradx_scp(j,i)+ + & wbond*gradbx(j,i)+ + & wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+ + & wsccor*gsccorx(j,i) + & +wscloc*gsclocx(j,i) +#endif + enddo + enddo +#ifdef DEBUG + write (iout,*) "gloc before adding corr" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif + do i=1,nres-3 + gloc(i,icg)=gloc(i,icg)+wcorr*gcorr_loc(i) + & +wcorr5*g_corr5_loc(i) + & +wcorr6*g_corr6_loc(i) + & +wturn4*gel_loc_turn4(i) + & +wturn3*gel_loc_turn3(i) + & +wturn6*gel_loc_turn6(i) + & +wel_loc*gel_loc_loc(i) + enddo +#ifdef DEBUG + write (iout,*) "gloc after adding corr" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif +#ifdef MPI + if (nfgtasks.gt.1) then + do j=1,3 + do i=1,nres + gradbufc(j,i)=gradc(j,i,icg) + gradbufx(j,i)=gradx(j,i,icg) + enddo + enddo + do i=1,4*nres + glocbuf(i)=gloc(i,icg) + enddo +#ifdef DEBUG + write (iout,*) "gloc_sc before reduce" + do i=1,nres + do j=1,3 + write (iout,*) i,j,gloc_sc(j,i,icg) + enddo + enddo +#endif + do i=1,nres + do j=1,3 + gloc_scbuf(j,i)=gloc_sc(j,i,icg) + enddo + enddo + time00=MPI_Wtime() + call MPI_Barrier(FG_COMM,IERR) + time_barrier_g=time_barrier_g+MPI_Wtime()-time00 + time00=MPI_Wtime() + call MPI_Reduce(gradbufc(1,1),gradc(1,1,icg),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + call MPI_Reduce(gradbufx(1,1),gradx(1,1,icg),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + call MPI_Reduce(glocbuf(1),gloc(1,icg),4*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + call MPI_Reduce(gloc_scbuf(1,1),gloc_sc(1,1,icg),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + time_reduce=time_reduce+MPI_Wtime()-time00 +#ifdef DEBUG + write (iout,*) "gloc_sc after reduce" + do i=1,nres + do j=1,3 + write (iout,*) i,j,gloc_sc(j,i,icg) + enddo + enddo +#endif +#ifdef DEBUG + write (iout,*) "gloc after reduce" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif + endif +#endif + if (gnorm_check) then +c +c Compute the maximum elements of the gradient +c + gvdwc_max=0.0d0 + gvdwc_scp_max=0.0d0 + gelc_max=0.0d0 + gvdwpp_max=0.0d0 + gradb_max=0.0d0 + ghpbc_max=0.0d0 + gradcorr_max=0.0d0 + gel_loc_max=0.0d0 + gcorr3_turn_max=0.0d0 + gcorr4_turn_max=0.0d0 + gradcorr5_max=0.0d0 + gradcorr6_max=0.0d0 + gcorr6_turn_max=0.0d0 + gsccorc_max=0.0d0 + gscloc_max=0.0d0 + gvdwx_max=0.0d0 + gradx_scp_max=0.0d0 + ghpbx_max=0.0d0 + gradxorr_max=0.0d0 + gsccorx_max=0.0d0 + gsclocx_max=0.0d0 + do i=1,nct + gvdwc_norm=dsqrt(scalar(gvdwc(1,i),gvdwc(1,i))) + if (gvdwc_norm.gt.gvdwc_max) gvdwc_max=gvdwc_norm +#ifdef TSCSC + gvdwc_norm=dsqrt(scalar(gvdwcT(1,i),gvdwcT(1,i))) + if (gvdwc_norm.gt.gvdwc_max) gvdwc_max=gvdwc_norm +#endif + gvdwc_scp_norm=dsqrt(scalar(gvdwc_scp(1,i),gvdwc_scp(1,i))) + if (gvdwc_scp_norm.gt.gvdwc_scp_max) + & gvdwc_scp_max=gvdwc_scp_norm + gelc_norm=dsqrt(scalar(gelc(1,i),gelc(1,i))) + if (gelc_norm.gt.gelc_max) gelc_max=gelc_norm + gvdwpp_norm=dsqrt(scalar(gvdwpp(1,i),gvdwpp(1,i))) + if (gvdwpp_norm.gt.gvdwpp_max) gvdwpp_max=gvdwpp_norm + gradb_norm=dsqrt(scalar(gradb(1,i),gradb(1,i))) + if (gradb_norm.gt.gradb_max) gradb_max=gradb_norm + ghpbc_norm=dsqrt(scalar(ghpbc(1,i),ghpbc(1,i))) + if (ghpbc_norm.gt.ghpbc_max) ghpbc_max=ghpbc_norm + gradcorr_norm=dsqrt(scalar(gradcorr(1,i),gradcorr(1,i))) + if (gradcorr_norm.gt.gradcorr_max) gradcorr_max=gradcorr_norm + gel_loc_norm=dsqrt(scalar(gel_loc(1,i),gel_loc(1,i))) + if (gel_loc_norm.gt.gel_loc_max) gel_loc_max=gel_loc_norm + gcorr3_turn_norm=dsqrt(scalar(gcorr3_turn(1,i), + & gcorr3_turn(1,i))) + if (gcorr3_turn_norm.gt.gcorr3_turn_max) + & gcorr3_turn_max=gcorr3_turn_norm + gcorr4_turn_norm=dsqrt(scalar(gcorr4_turn(1,i), + & gcorr4_turn(1,i))) + if (gcorr4_turn_norm.gt.gcorr4_turn_max) + & gcorr4_turn_max=gcorr4_turn_norm + gradcorr5_norm=dsqrt(scalar(gradcorr5(1,i),gradcorr5(1,i))) + if (gradcorr5_norm.gt.gradcorr5_max) + & gradcorr5_max=gradcorr5_norm + gradcorr6_norm=dsqrt(scalar(gradcorr6(1,i),gradcorr6(1,i))) + if (gradcorr6_norm.gt.gradcorr6_max) gcorr6_max=gradcorr6_norm + gcorr6_turn_norm=dsqrt(scalar(gcorr6_turn(1,i), + & gcorr6_turn(1,i))) + if (gcorr6_turn_norm.gt.gcorr6_turn_max) + & gcorr6_turn_max=gcorr6_turn_norm + gsccorr_norm=dsqrt(scalar(gsccorc(1,i),gsccorc(1,i))) + if (gsccorr_norm.gt.gsccorr_max) gsccorr_max=gsccorr_norm + gscloc_norm=dsqrt(scalar(gscloc(1,i),gscloc(1,i))) + if (gscloc_norm.gt.gscloc_max) gscloc_max=gscloc_norm + gvdwx_norm=dsqrt(scalar(gvdwx(1,i),gvdwx(1,i))) + if (gvdwx_norm.gt.gvdwx_max) gvdwx_max=gvdwx_norm +#ifdef TSCSC + gvdwx_norm=dsqrt(scalar(gvdwxT(1,i),gvdwxT(1,i))) + if (gvdwx_norm.gt.gvdwx_max) gvdwx_max=gvdwx_norm +#endif + gradx_scp_norm=dsqrt(scalar(gradx_scp(1,i),gradx_scp(1,i))) + if (gradx_scp_norm.gt.gradx_scp_max) + & gradx_scp_max=gradx_scp_norm + ghpbx_norm=dsqrt(scalar(ghpbx(1,i),ghpbx(1,i))) + if (ghpbx_norm.gt.ghpbx_max) ghpbx_max=ghpbx_norm + gradxorr_norm=dsqrt(scalar(gradxorr(1,i),gradxorr(1,i))) + if (gradxorr_norm.gt.gradxorr_max) gradxorr_max=gradxorr_norm + gsccorrx_norm=dsqrt(scalar(gsccorx(1,i),gsccorx(1,i))) + if (gsccorrx_norm.gt.gsccorrx_max) gsccorrx_max=gsccorrx_norm + gsclocx_norm=dsqrt(scalar(gsclocx(1,i),gsclocx(1,i))) + if (gsclocx_norm.gt.gsclocx_max) gsclocx_max=gsclocx_norm + enddo + if (gradout) then +#ifdef AIX + open(istat,file=statname,position="append") +#else + open(istat,file=statname,access="append") +#endif + write (istat,'(1h#,21f10.2)') gvdwc_max,gvdwc_scp_max, + & gelc_max,gvdwpp_max,gradb_max,ghpbc_max, + & gradcorr_max,gel_loc_max,gcorr3_turn_max,gcorr4_turn_max, + & gradcorr5_max,gradcorr6_max,gcorr6_turn_max,gsccorc_max, + & gscloc_max,gvdwx_max,gradx_scp_max,ghpbx_max,gradxorr_max, + & gsccorx_max,gsclocx_max + close(istat) + if (gvdwc_max.gt.1.0d4) then + write (iout,*) "gvdwc gvdwx gradb gradbx" + do i=nnt,nct + write(iout,'(i5,4(3f10.2,5x))') i,(gvdwc(j,i),gvdwx(j,i), + & gradb(j,i),gradbx(j,i),j=1,3) + enddo + call pdbout(0.0d0,'cipiszcze',iout) + call flush(iout) + endif + endif + endif +#ifdef DEBUG + write (iout,*) "gradc gradx gloc" + do i=1,nres + write (iout,'(i5,3f10.5,5x,3f10.5,5x,f10.5)') + & i,(gradc(j,i,icg),j=1,3),(gradx(j,i,icg),j=1,3),gloc(i,icg) + enddo +#endif +#ifdef TIMING +#ifdef MPI + time_sumgradient=time_sumgradient+MPI_Wtime()-time01 +#else + time_sumgradient=time_sumgradient+tcpu()-time01 +#endif +#endif + return + end +c------------------------------------------------------------------------------- + subroutine rescale_weights(t_bath) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + double precision kfac /2.4d0/ + double precision x,x2,x3,x4,x5,licznik /1.12692801104297249644/ +c facT=temp0/t_bath +c facT=2*temp0/(t_bath+temp0) + if (rescale_mode.eq.0) then + facT=1.0d0 + facT2=1.0d0 + facT3=1.0d0 + facT4=1.0d0 + facT5=1.0d0 + else if (rescale_mode.eq.1) then + facT=kfac/(kfac-1.0d0+t_bath/temp0) + facT2=kfac**2/(kfac**2-1.0d0+(t_bath/temp0)**2) + facT3=kfac**3/(kfac**3-1.0d0+(t_bath/temp0)**3) + facT4=kfac**4/(kfac**4-1.0d0+(t_bath/temp0)**4) + facT5=kfac**5/(kfac**5-1.0d0+(t_bath/temp0)**5) + else if (rescale_mode.eq.2) then + x=t_bath/temp0 + x2=x*x + x3=x2*x + x4=x3*x + x5=x4*x + facT=licznik/dlog(dexp(x)+dexp(-x)) + facT2=licznik/dlog(dexp(x2)+dexp(-x2)) + facT3=licznik/dlog(dexp(x3)+dexp(-x3)) + facT4=licznik/dlog(dexp(x4)+dexp(-x4)) + facT5=licznik/dlog(dexp(x5)+dexp(-x5)) + else + write (iout,*) "Wrong RESCALE_MODE",rescale_mode + write (*,*) "Wrong RESCALE_MODE",rescale_mode +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,IERROR) +#endif + stop 555 + endif + welec=weights(3)*fact + wcorr=weights(4)*fact3 + wcorr5=weights(5)*fact4 + wcorr6=weights(6)*fact5 + wel_loc=weights(7)*fact2 + wturn3=weights(8)*fact2 + wturn4=weights(9)*fact3 + wturn6=weights(10)*fact5 + wtor=weights(13)*fact + wtor_d=weights(14)*fact2 + wsccor=weights(21)*fact +#ifdef TSCSC +c wsct=t_bath/temp0 + wsct=(320.0+80.0*dtanh((t_bath-320.0)/80.0))/320.0 +#endif + return + end +C------------------------------------------------------------------------ + subroutine enerprint(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.MD' + double precision energia(0:n_ene) + etot=energia(0) +#ifdef TSCSC + evdw=energia(22)+wsct*energia(23) +#else + evdw=energia(1) +#endif + evdw2=energia(2) +#ifdef SCP14 + evdw2=energia(2)+energia(18) +#else + evdw2=energia(2) +#endif + ees=energia(3) +#ifdef SPLITELE + evdw1=energia(16) +#endif + ecorr=energia(4) + ecorr5=energia(5) + ecorr6=energia(6) + eel_loc=energia(7) + eello_turn3=energia(8) + eello_turn4=energia(9) + eello_turn6=energia(10) + ebe=energia(11) + escloc=energia(12) + etors=energia(13) + etors_d=energia(14) + ehpb=energia(15) + edihcnstr=energia(19) + estr=energia(17) + Uconst=energia(20) + esccor=energia(21) +#ifdef SPLITELE + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec,evdw1,wvdwpp, + & estr,wbond,ebe,wang, + & escloc,wscloc,etors,wtor,etors_d,wtor_d,ehpb,wstrain, + & ecorr,wcorr, + & ecorr5,wcorr5,ecorr6,wcorr6,eel_loc,wel_loc,eello_turn3,wturn3, + & eello_turn4,wturn4,eello_turn6,wturn6,esccor,wsccor, + & edihcnstr,ebr*nss, + & Uconst,etot + 10 format (/'Virtual-chain energies:'// + & 'EVDW= ',1pE16.6,' WEIGHT=',1pE16.6,' (SC-SC)'/ + & 'EVDW2= ',1pE16.6,' WEIGHT=',1pE16.6,' (SC-p)'/ + & 'EES= ',1pE16.6,' WEIGHT=',1pE16.6,' (p-p)'/ + & 'EVDWPP=',1pE16.6,' WEIGHT=',1pE16.6,' (p-p VDW)'/ + & 'ESTR= ',1pE16.6,' WEIGHT=',1pE16.6,' (stretching)'/ + & 'EBE= ',1pE16.6,' WEIGHT=',1pE16.6,' (bending)'/ + & 'ESC= ',1pE16.6,' WEIGHT=',1pE16.6,' (SC local)'/ + & 'ETORS= ',1pE16.6,' WEIGHT=',1pE16.6,' (torsional)'/ + & 'ETORSD=',1pE16.6,' WEIGHT=',1pE16.6,' (double torsional)'/ + & 'EHPB= ',1pE16.6,' WEIGHT=',1pE16.6, + & ' (SS bridges & dist. cnstr.)'/ + & 'ECORR4=',1pE16.6,' WEIGHT=',1pE16.6,' (multi-body)'/ + & 'ECORR5=',1pE16.6,' WEIGHT=',1pE16.6,' (multi-body)'/ + & 'ECORR6=',1pE16.6,' WEIGHT=',1pE16.6,' (multi-body)'/ + & 'EELLO= ',1pE16.6,' WEIGHT=',1pE16.6,' (electrostatic-local)'/ + & 'ETURN3=',1pE16.6,' WEIGHT=',1pE16.6,' (turns, 3rd order)'/ + & 'ETURN4=',1pE16.6,' WEIGHT=',1pE16.6,' (turns, 4th order)'/ + & 'ETURN6=',1pE16.6,' WEIGHT=',1pE16.6,' (turns, 6th order)'/ + & 'ESCCOR=',1pE16.6,' WEIGHT=',1pE16.6,' (backbone-rotamer corr)'/ + & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/ + & 'ESS= ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ + & 'UCONST= ',1pE16.6,' (Constraint energy)'/ + & 'ETOT= ',1pE16.6,' (total)') +#else + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec, + & estr,wbond,ebe,wang, + & escloc,wscloc,etors,wtor,etors_d,wtor_d,ehpb,wstrain, + & ecorr,wcorr, + & ecorr5,wcorr5,ecorr6,wcorr6,eel_loc,wel_loc,eello_turn3,wturn3, + & eello_turn4,wturn4,eello_turn6,wturn6,esccor,wsccro,edihcnstr, + & ebr*nss,Uconst,etot + 10 format (/'Virtual-chain energies:'// + & 'EVDW= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-SC)'/ + & 'EVDW2= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-p)'/ + & 'EES= ',1pE16.6,' WEIGHT=',1pD16.6,' (p-p)'/ + & 'ESTR= ',1pE16.6,' WEIGHT=',1pD16.6,' (stretching)'/ + & 'EBE= ',1pE16.6,' WEIGHT=',1pD16.6,' (bending)'/ + & 'ESC= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC local)'/ + & 'ETORS= ',1pE16.6,' WEIGHT=',1pD16.6,' (torsional)'/ + & 'ETORSD=',1pE16.6,' WEIGHT=',1pD16.6,' (double torsional)'/ + & 'EHBP= ',1pE16.6,' WEIGHT=',1pD16.6, + & ' (SS bridges & dist. cnstr.)'/ + & 'ECORR4=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR5=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR6=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'EELLO= ',1pE16.6,' WEIGHT=',1pD16.6,' (electrostatic-local)'/ + & 'ETURN3=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 3rd order)'/ + & 'ETURN4=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 4th order)'/ + & 'ETURN6=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 6th order)'/ + & 'ESCCOR=',1pE16.6,' WEIGHT=',1pD16.6,' (backbone-rotamer corr)'/ + & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/ + & 'ESS= ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ + & 'UCONST=',1pE16.6,' (Constraint energy)'/ + & 'ETOT= ',1pE16.6,' (total)') +#endif + return + end +C----------------------------------------------------------------------- + subroutine elj(evdw,evdw_p,evdw_m) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJ potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (accur=1.0d-10) + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.TORSION' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + include "COMMON.ECOMPON" + dimension gg(3) +c write(iout,*)'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + if (itypi.eq.ntyp1) cycle +C Change 12/1/95 + num_conti=0 +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) +cd write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint), +cd & 'iend=',iend(i,iint) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + if (itypj.eq.ntyp1) cycle + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi +C Change 12/1/95 to calculate four-body interactions + rij=xj*xj+yj*yj+zj*zj + rrij=1.0D0/rij +c write (iout,*)'i=',i,' j=',j,' itypi=',itypi,' itypj=',itypj + eps0ij=eps(itypi,itypj) + fac=rrij**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e1+e2 +cd sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +cd epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),6(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & restyp(itypi),i,restyp(itypj),j,aa(itypi,itypj), +cd & bb(itypi,itypj),1.0D0/dsqrt(rrij),evdwij,epsi,sigm, +cd & (c(k,i),k=1,3),(c(k,j),k=1,3) + vdwcompon(itypi,itypj)=vdwcompon(itypi,itypj)+evdwij +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + evdw_p=evdw_p+evdwij + else + evdw_m=evdw_m+evdwij + endif +#else + evdw=evdw+evdwij +#endif +C +C Calculate the components of the gradient in DC and X +C + fac=-rrij*(e1+evdwij) + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +#ifdef TSCSC + if (bb(itypi,itypj).gt.0.0d0) then + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + else + do k=1,3 + gvdwxT(k,i)=gvdwxT(k,i)-gg(k) + gvdwxT(k,j)=gvdwxT(k,j)+gg(k) + gvdwcT(k,i)=gvdwcT(k,i)-gg(k) + gvdwcT(k,j)=gvdwcT(k,j)+gg(k) + enddo + endif +#else + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo +#endif +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad gvdwc(l,k)=gvdwc(l,k)+gg(l) +cgrad enddo +cgrad enddo +C +C 12/1/95, revised on 5/20/97 +C +C Calculate the contact function. The ith column of the array JCONT will +C contain the numbers of atoms that make contacts with the atom I (of numbers +C greater than I). The arrays FACONT and GACONT will contain the values of +C the contact function and its derivative. +C +C Uncomment next line, if the correlation interactions include EVDW explicitly. +c if (j.gt.i+1 .and. evdwij.le.0.0D0) then +C Uncomment next line, if the correlation interactions are contact function only + if (j.gt.i+1.and. eps0ij.gt.0.0D0) then + rij=dsqrt(rij) + sigij=sigma(itypi,itypj) + r0ij=rs0(itypi,itypj) +C +C Check whether the SC's are not too far to make a contact. +C + rcut=1.5d0*r0ij + call gcont(rij,rcut,1.0d0,0.2d0*rcut,fcont,fprimcont) +C Add a new contact, if the SC's are close enough, but not too close (ri' +cgrad do k=1,3 +cgrad ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) +cgrad enddo +cgrad endif +cgrad do k=1,3 +cgrad gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) +cgrad enddo +cgrad kstart=min0(i+1,j) +cgrad kend=max0(i-1,j-1) +cd write (iout,*) 'i=',i,' j=',j,' kstart=',kstart,' kend=',kend +cd write (iout,*) ggg(1),ggg(2),ggg(3) +cgrad do k=kstart,kend +cgrad do l=1,3 +cgrad gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + enddo + + enddo ! iint + enddo ! i + return + end +C----------------------------------------------------------------------------- + subroutine escp(evdw2,evdw2_14) +C +C This subroutine calculates the excluded-volume interaction energy between +C peptide-group centers and side chains and its gradient in virtual-bond and +C side-chain vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include "COMMON.ECOMPON" + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 +cd print '(a)','Enter ESCP' +cd write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e + do i=iatscp_s,iatscp_e + if (itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1) cycle + iteli=itel(i) + xi=0.5D0*(c(1,i)+c(1,i+1)) + yi=0.5D0*(c(2,i)+c(2,i+1)) + zi=0.5D0*(c(3,i)+c(3,i+1)) + + do iint=1,nscp_gr(i) + + do j=iscpstart(i,iint),iscpend(i,iint) + if (itype(j).eq.ntyp1) cycle + itypj=itype(j) +C Uncomment following three lines for SC-p interactions +c xj=c(1,nres+j)-xi +c yj=c(2,nres+j)-yi +c zj=c(3,nres+j)-zi +C Uncomment following three lines for Ca-p interactions + xj=c(1,j)-xi + yj=c(2,j)-yi + zj=c(3,j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + fac=rrij**expon2 + e1=fac*fac*aad(itypj,iteli) + e2=fac*bad(itypj,iteli) + if (iabs(j-i) .le. 2) then + e1=scal14*e1 + e2=scal14*e2 + evdw2_14=evdw2_14+e1+e2 + endif + evdwij=e1+e2 + vdw2compon(itypj)=vdw2compon(itypj)+evdwij + evdw2=evdw2+evdwij + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw2',i,j,evdwij +C +C Calculate contributions to the gradient in the virtual-bond and SC vectors. +C + fac=-(evdwij+e1)*rrij + ggg(1)=xj*fac + ggg(2)=yj*fac + ggg(3)=zj*fac +cgrad if (j.lt.i) then +cd write (iout,*) 'ji' +cgrad do k=1,3 +cgrad ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +ccgrad gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) +cgrad enddo +cgrad endif +cgrad do k=1,3 +cgrad gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) +cgrad enddo +cgrad kstart=min0(i+1,j) +cgrad kend=max0(i-1,j-1) +cd write (iout,*) 'i=',i,' j=',j,' kstart=',kstart,' kend=',kend +cd write (iout,*) ggg(1),ggg(2),ggg(3) +cgrad do k=kstart,kend +cgrad do l=1,3 +cgrad gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + enddo + + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(j,i) + gvdwc_scpp(j,i)=expon*gvdwc_scpp(j,i) + gradx_scp(j,i)=expon*gradx_scp(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time the factor EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end +C-------------------------------------------------------------------------- + subroutine edis(ehpb) +C +C Evaluate bridge-strain energy and its gradient in virtual-bond and SC vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + dimension ggg(3) + ehpb=0.0D0 +cd write(iout,*)'edis: nhpb=',nhpb,' fbr=',fbr +cd write(iout,*)'link_start=',link_start,' link_end=',link_end + if (link_end.eq.0) return + do i=link_start,link_end +C If ihpb(i) and jhpb(i) > NRES, this is a SC-SC distance, otherwise a +C CA-CA distance used in regularization of structure. + ii=ihpb(i) + jj=jhpb(i) + if (itype(ii).eq.ntyp1 .or. itype(jj).eq.ntyp1) cycle +C iii and jjj point to the residues for which the distance is assigned. + if (ii.gt.nres) then + iii=ii-nres + jjj=jj-nres + else + iii=ii + jjj=jj + endif +c write (iout,*) "i",i," ii",ii," iii",iii," jj",jj," jjj",jjj, +c & dhpb(i),dhpb1(i),forcon(i) +C 24/11/03 AL: SS bridges handled separately because of introducing a specific +C distance and angle dependent SS bond potential. + if (ii.gt.nres .and. itype(iii).eq.1 .and. itype(jjj).eq.1) then + call ssbond_ene(iii,jjj,eij) + ehpb=ehpb+2*eij +cd write (iout,*) "eij",eij + else if (ii.gt.nres .and. jj.gt.nres) then +c Restraints from contact prediction + dd=dist(ii,jj) + if (dhpb1(i).gt.0.0d0) then + ehpb=ehpb+2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i)) + fac=forcon(i)*gnmr1prim(dd,dhpb(i),dhpb1(i))/dd +c write (iout,*) "beta nmr", +c & dd,2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i)) + else + dd=dist(ii,jj) + rdis=dd-dhpb(i) +C Get the force constant corresponding to this distance. + waga=forcon(i) +C Calculate the contribution to energy. + ehpb=ehpb+waga*rdis*rdis +c write (iout,*) "beta reg",dd,waga*rdis*rdis +C +C Evaluate gradient. +C + fac=waga*rdis/dd + endif + do j=1,3 + ggg(j)=fac*(c(j,jj)-c(j,ii)) + enddo + do j=1,3 + ghpbx(j,iii)=ghpbx(j,iii)-ggg(j) + ghpbx(j,jjj)=ghpbx(j,jjj)+ggg(j) + enddo + do k=1,3 + ghpbc(k,jjj)=ghpbc(k,jjj)+ggg(k) + ghpbc(k,iii)=ghpbc(k,iii)-ggg(k) + enddo + else +C Calculate the distance between the two points and its difference from the +C target distance. + dd=dist(ii,jj) + if (dhpb1(i).gt.0.0d0) then + ehpb=ehpb+2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i)) + fac=forcon(i)*gnmr1prim(dd,dhpb(i),dhpb1(i))/dd +c write (iout,*) "alph nmr", +c & dd,2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i)) + else + rdis=dd-dhpb(i) +C Get the force constant corresponding to this distance. + waga=forcon(i) +C Calculate the contribution to energy. + ehpb=ehpb+waga*rdis*rdis +c write (iout,*) "alpha reg",dd,waga*rdis*rdis +C +C Evaluate gradient. +C + fac=waga*rdis/dd + endif +cd print *,'i=',i,' ii=',ii,' jj=',jj,' dhpb=',dhpb(i),' dd=',dd, +cd & ' waga=',waga,' fac=',fac + do j=1,3 + ggg(j)=fac*(c(j,jj)-c(j,ii)) + enddo +cd print '(i3,3(1pe14.5))',i,(ggg(j),j=1,3) +C If this is a SC-SC distance, we need to calculate the contributions to the +C Cartesian gradient in the SC vectors (ghpbx). + if (iii.lt.ii) then + do j=1,3 + ghpbx(j,iii)=ghpbx(j,iii)-ggg(j) + ghpbx(j,jjj)=ghpbx(j,jjj)+ggg(j) + enddo + endif +cgrad do j=iii,jjj-1 +cgrad do k=1,3 +cgrad ghpbc(k,j)=ghpbc(k,j)+ggg(k) +cgrad enddo +cgrad enddo + do k=1,3 + ghpbc(k,jjj)=ghpbc(k,jjj)+ggg(k) + ghpbc(k,iii)=ghpbc(k,iii)-ggg(k) + enddo + endif + enddo + ehpb=0.5D0*ehpb + return + end +C-------------------------------------------------------------------------- + subroutine ssbond_ene(i,j,eij) +C +C Calculate the distance and angle dependent SS-bond potential energy +C using a free-energy function derived based on RHF/6-31G** ab initio +C calculations of diethyl disulfide. +C +C A. Liwo and U. Kozlowska, 11/24/03 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + double precision erij(3),dcosom1(3),dcosom2(3),gg(3) + itypi=itype(i) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(nres+i) + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(nres+j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + erij(1)=xj*rij + erij(2)=yj*rij + erij(3)=zj*rij + om1=dxi*erij(1)+dyi*erij(2)+dzi*erij(3) + om2=dxj*erij(1)+dyj*erij(2)+dzj*erij(3) + om12=dxi*dxj+dyi*dyj+dzi*dzj + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,nres+i)-om1*erij(k)) + dcosom2(k)=rij*(dc_norm(k,nres+j)-om2*erij(k)) + enddo + rij=1.0d0/rij + deltad=rij-d0cm + deltat1=1.0d0-om1 + deltat2=1.0d0+om2 + deltat12=om2-om1+2.0d0 + cosphi=om12-om1*om2 + eij=akcm*deltad*deltad+akth*(deltat1*deltat1+deltat2*deltat2) + & +akct*deltad*deltat12+ebr + & +v1ss*cosphi+v2ss*cosphi*cosphi+v3ss*cosphi*cosphi*cosphi +c write(iout,*) i,j,"rij",rij,"d0cm",d0cm," akcm",akcm," akth",akth, +c & " akct",akct," deltad",deltad," deltat",deltat1,deltat2, +c & " deltat12",deltat12," eij",eij + ed=2*akcm*deltad+akct*deltat12 + pom1=akct*deltad + pom2=v1ss+2*v2ss*cosphi+3*v3ss*cosphi*cosphi + eom1=-2*akth*deltat1-pom1-om2*pom2 + eom2= 2*akth*deltat2+pom1-om1*pom2 + eom12=pom2 + do k=1,3 + ggk=ed*erij(k)+eom1*dcosom1(k)+eom2*dcosom2(k) + ghpbx(k,i)=ghpbx(k,i)-ggk + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + ghpbx(k,j)=ghpbx(k,j)+ggk + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + ghpbc(k,i)=ghpbc(k,i)-ggk + ghpbc(k,j)=ghpbc(k,j)+ggk + enddo +C +C Calculate the components of the gradient in DC and X +C +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad ghpbc(l,k)=ghpbc(l,k)+gg(l) +cgrad enddo +cgrad enddo + return + end +C-------------------------------------------------------------------------- + subroutine ebond(estr) +c +c Evaluate the energy of stretching of the CA-CA and CA-SC virtual bonds +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + double precision u(3),ud(3) + estr=0.0d0 + do i=ibondp_start,ibondp_end + if (itype(i-1).eq.ntyp1 .or. itype(i).eq.ntyp1) cycle + diff = vbld(i)-vbldp0 + if (energy_dec) write (iout,*) i,vbld(i),vbldp0,diff,AKP*diff*diff + estr=estr+diff*diff + do j=1,3 + gradb(j,i-1)=AKP*diff*dc(j,i-1)/vbld(i) + enddo +c write (iout,'(i5,3f10.5)') i,(gradb(j,i-1),j=1,3) + enddo + estr=0.5d0*AKP*estr +c +c 09/18/07 AL: multimodal bond potential based on AM1 CA-SC PMF's included +c + do i=ibond_start,ibond_end + iti=itype(i) + if (iti.ne.10 .and. iti.ne.ntyp1) then + nbi=nbondterm(iti) + if (nbi.eq.1) then + diff=vbld(i+nres)-vbldsc0(1,iti) + if (energy_dec) write (iout,*) i,iti,vbld(i+nres), + & vbldsc0(1,iti),diff, + & AKSC(1,iti),AKSC(1,iti)*diff*diff + estr=estr+0.5d0*AKSC(1,iti)*diff*diff + do j=1,3 + gradbx(j,i)=AKSC(1,iti)*diff*dc(j,i+nres)/vbld(i+nres) + enddo + else + do j=1,nbi + diff=vbld(i+nres)-vbldsc0(j,iti) + ud(j)=aksc(j,iti)*diff + u(j)=abond0(j,iti)+0.5d0*ud(j)*diff + enddo + uprod=u(1) + do j=2,nbi + uprod=uprod*u(j) + enddo + usum=0.0d0 + usumsqder=0.0d0 + do j=1,nbi + uprod1=1.0d0 + uprod2=1.0d0 + do k=1,nbi + if (k.ne.j) then + uprod1=uprod1*u(k) + uprod2=uprod2*u(k)*u(k) + endif + enddo + usum=usum+uprod1 + usumsqder=usumsqder+ud(j)*uprod2 + enddo + estr=estr+uprod/usum + do j=1,3 + gradbx(j,i)=usumsqder/(usum*usum)*dc(j,i+nres)/vbld(i+nres) + enddo + endif + endif + enddo + return + end +#ifdef CRYST_THETA +C-------------------------------------------------------------------------- + subroutine ebend(etheta) +C +C Evaluate the virtual-bond-angle energy given the virtual-bond dihedral +C angles gamma and its derivatives in consecutive thetas and gammas. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include "COMMON.ECOMPON" + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it + double precision y(2),z(2) + delta=0.02d0*pi +c time11=dexp(-2*time) +c time12=1.0d0 + etheta=0.0D0 +c write (*,'(a,i2)') 'EBEND ICG=',icg + do i=ithet_start,ithet_end + if (itype(i-2).eq.ntyp1 .or. itype(i-1).eq.ntyp1 .or. + & itype(i).eq.ntyp1) cycle +C Zero the energy function and its derivative at 0 or pi. + call splinthet(theta(i),0.5d0*delta,ss,ssd) + it=itype(i-1) + if (i.gt.3) then +#ifdef OSF + phii=phi(i) + if (phii.ne.phii) phii=150.0 +#else + phii=phi(i) +#endif + y(1)=dcos(phii) + y(2)=dsin(phii) + else + y(1)=0.0D0 + y(2)=0.0D0 + endif + if (i.lt.nres) then +#ifdef OSF + phii1=phi(i+1) + if (phii1.ne.phii1) phii1=150.0 + phii1=pinorm(phii1) + z(1)=cos(phii1) +#else + phii1=phi(i+1) + z(1)=dcos(phii1) +#endif + z(2)=dsin(phii1) + else + z(1)=0.0D0 + z(2)=0.0D0 + endif +C Calculate the "mean" value of theta from the part of the distribution +C dependent on the adjacent virtual-bond-valence angles (gamma1 & gamma2). +C In following comments this theta will be referred to as t_c. + thet_pred_mean=0.0d0 + do k=1,2 + athetk=athet(k,it) + bthetk=bthet(k,it) + thet_pred_mean=thet_pred_mean+athetk*y(k)+bthetk*z(k) + enddo + dthett=thet_pred_mean*ssd + thet_pred_mean=thet_pred_mean*ss+a0thet(it) +C Derivatives of the "mean" values in gamma1 and gamma2. + dthetg1=(-athet(1,it)*y(2)+athet(2,it)*y(1))*ss + dthetg2=(-bthet(1,it)*z(2)+bthet(2,it)*z(1))*ss + if (theta(i).gt.pi-delta) then + call theteng(pi-delta,thet_pred_mean,theta0(it),f0,fprim0, + & E_tc0) + call mixder(pi-delta,thet_pred_mean,theta0(it),fprim_tc0) + call theteng(pi,thet_pred_mean,theta0(it),f1,fprim1,E_tc1) + call spline1(theta(i),pi-delta,delta,f0,f1,fprim0,ethetai, + & E_theta) + call spline2(theta(i),pi-delta,delta,E_tc0,E_tc1,fprim_tc0, + & E_tc) + else if (theta(i).lt.delta) then + call theteng(delta,thet_pred_mean,theta0(it),f0,fprim0,E_tc0) + call theteng(0.0d0,thet_pred_mean,theta0(it),f1,fprim1,E_tc1) + call spline1(theta(i),delta,-delta,f0,f1,fprim0,ethetai, + & E_theta) + call mixder(delta,thet_pred_mean,theta0(it),fprim_tc0) + call spline2(theta(i),delta,-delta,E_tc0,E_tc1,fprim_tc0, + & E_tc) + else + call theteng(theta(i),thet_pred_mean,theta0(it),ethetai, + & E_theta,E_tc) + endif + becompon(it)=becompon(it)+ethetai + etheta=etheta+ethetai + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'ebend',i,ethetai + if (i.gt.3) gloc(i-3,icg)=gloc(i-3,icg)+wang*E_tc*dthetg1 + if (i.lt.nres) gloc(i-2,icg)=gloc(i-2,icg)+wang*E_tc*dthetg2 + gloc(nphi+i-2,icg)=wang*(E_theta+E_tc*dthett) + enddo +C Ufff.... We've done all this!!! + return + end +C--------------------------------------------------------------------------- + subroutine theteng(thetai,thet_pred_mean,theta0i,ethetai,E_theta, + & E_tc) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it +C Calculate the contributions to both Gaussian lobes. +C 6/6/97 - Deform the Gaussians using the factor of 1/(1+time) +C The "polynomial part" of the "standard deviation" of this part of +C the distribution. + sig=polthet(3,it) + do j=2,0,-1 + sig=sig*thet_pred_mean+polthet(j,it) + enddo +C Derivative of the "interior part" of the "standard deviation of the" +C gamma-dependent Gaussian lobe in t_c. + sigtc=3*polthet(3,it) + do j=2,1,-1 + sigtc=sigtc*thet_pred_mean+j*polthet(j,it) + enddo + sigtc=sig*sigtc +C Set the parameters of both Gaussian lobes of the distribution. +C "Standard deviation" of the gamma-dependent Gaussian lobe (sigtc) + fac=sig*sig+sigc0(it) + sigcsq=fac+fac + sigc=1.0D0/sigcsq +C Following variable (sigsqtc) is -(1/2)d[sigma(t_c)**(-2))]/dt_c + sigsqtc=-4.0D0*sigcsq*sigtc +c print *,i,sig,sigtc,sigsqtc +C Following variable (sigtc) is d[sigma(t_c)]/dt_c + sigtc=-sigtc/(fac*fac) +C Following variable is sigma(t_c)**(-2) + sigcsq=sigcsq*sigcsq + sig0i=sig0(it) + sig0inv=1.0D0/sig0i**2 + delthec=thetai-thet_pred_mean + delthe0=thetai-theta0i + term1=-0.5D0*sigcsq*delthec*delthec + term2=-0.5D0*sig0inv*delthe0*delthe0 +C Following fuzzy logic is to avoid underflows in dexp and subsequent INFs and +C NaNs in taking the logarithm. We extract the largest exponent which is added +C to the energy (this being the log of the distribution) at the end of energy +C term evaluation for this virtual-bond angle. + if (term1.gt.term2) then + termm=term1 + term2=dexp(term2-termm) + term1=1.0d0 + else + termm=term2 + term1=dexp(term1-termm) + term2=1.0d0 + endif +C The ratio between the gamma-independent and gamma-dependent lobes of +C the distribution is a Gaussian function of thet_pred_mean too. + diffak=gthet(2,it)-thet_pred_mean + ratak=diffak/gthet(3,it)**2 + ak=dexp(gthet(1,it)-0.5D0*diffak*ratak) +C Let's differentiate it in thet_pred_mean NOW. + aktc=ak*ratak +C Now put together the distribution terms to make complete distribution. + termexp=term1+ak*term2 + termpre=sigc+ak*sig0i +C Contribution of the bending energy from this theta is just the -log of +C the sum of the contributions from the two lobes and the pre-exponential +C factor. Simple enough, isn't it? + ethetai=(-dlog(termexp)-termm+dlog(termpre)) +C NOW the derivatives!!! +C 6/6/97 Take into account the deformation. + E_theta=(delthec*sigcsq*term1 + & +ak*delthe0*sig0inv*term2)/termexp + E_tc=((sigtc+aktc*sig0i)/termpre + & -((delthec*sigcsq+delthec*delthec*sigsqtc)*term1+ + & aktc*term2)/termexp) + return + end +c----------------------------------------------------------------------------- + subroutine mixder(thetai,thet_pred_mean,theta0i,E_tc_t) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it + delthec=thetai-thet_pred_mean + delthe0=thetai-theta0i +C "Thank you" to MAPLE (probably spared one day of hand-differentiation). + t3 = thetai-thet_pred_mean + t6 = t3**2 + t9 = term1 + t12 = t3*sigcsq + t14 = t12+t6*sigsqtc + t16 = 1.0d0 + t21 = thetai-theta0i + t23 = t21**2 + t26 = term2 + t27 = t21*t26 + t32 = termexp + t40 = t32**2 + E_tc_t = -((sigcsq+2.D0*t3*sigsqtc)*t9-t14*sigcsq*t3*t16*t9 + & -aktc*sig0inv*t27)/t32+(t14*t9+aktc*t26)/t40 + & *(-t12*t9-ak*sig0inv*t27) + return + end +#else +C-------------------------------------------------------------------------- + subroutine ebend(etheta) +C +C Evaluate the virtual-bond-angle energy given the virtual-bond dihedral +C angles gamma and its derivatives in consecutive thetas and gammas. +C ab initio-derived potentials from +c Kozlowska et al., J. Phys.: Condens. Matter 19 (2007) 285203 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include "COMMON.ECOMPON" + double precision coskt(mmaxtheterm),sinkt(mmaxtheterm), + & cosph1(maxsingle),sinph1(maxsingle),cosph2(maxsingle), + & sinph2(maxsingle),cosph1ph2(maxdouble,maxdouble), + & sinph1ph2(maxdouble,maxdouble) + logical lprn /.false./, lprn1 /.false./ + etheta=0.0D0 + do i=ithet_start,ithet_end + if (itype(i-2).eq.ntyp1 .or. itype(i-1).eq.ntyp1 .or. + & itype(i).eq.ntyp1) cycle + dethetai=0.0d0 + dephii=0.0d0 + dephii1=0.0d0 + theti2=0.5d0*theta(i) + ityp2=ithetyp(itype(i-1)) + do k=1,nntheterm + coskt(k)=dcos(k*theti2) + sinkt(k)=dsin(k*theti2) + enddo + if (i.gt.3) then +#ifdef OSF + phii=phi(i) + if (phii.ne.phii) phii=150.0 +#else + phii=phi(i) +#endif + ityp1=ithetyp(itype(i-2)) + do k=1,nsingle + cosph1(k)=dcos(k*phii) + sinph1(k)=dsin(k*phii) + enddo + else + phii=0.0d0 + ityp1=nthetyp+1 + do k=1,nsingle + cosph1(k)=0.0d0 + sinph1(k)=0.0d0 + enddo + endif + if (i.lt.nres) then +#ifdef OSF + phii1=phi(i+1) + if (phii1.ne.phii1) phii1=150.0 + phii1=pinorm(phii1) +#else + phii1=phi(i+1) +#endif + ityp3=ithetyp(itype(i)) + do k=1,nsingle + cosph2(k)=dcos(k*phii1) + sinph2(k)=dsin(k*phii1) + enddo + else + phii1=0.0d0 + ityp3=nthetyp+1 + do k=1,nsingle + cosph2(k)=0.0d0 + sinph2(k)=0.0d0 + enddo + endif + ethetai=aa0thet(ityp1,ityp2,ityp3) + do k=1,ndouble + do l=1,k-1 + ccl=cosph1(l)*cosph2(k-l) + ssl=sinph1(l)*sinph2(k-l) + scl=sinph1(l)*cosph2(k-l) + csl=cosph1(l)*sinph2(k-l) + cosph1ph2(l,k)=ccl-ssl + cosph1ph2(k,l)=ccl+ssl + sinph1ph2(l,k)=scl+csl + sinph1ph2(k,l)=scl-csl + enddo + enddo + if (lprn) then + write (iout,*) "i",i," ityp1",ityp1," ityp2",ityp2, + & " ityp3",ityp3," theti2",theti2," phii",phii," phii1",phii1 + write (iout,*) "coskt and sinkt" + do k=1,nntheterm + write (iout,*) k,coskt(k),sinkt(k) + enddo + endif + do k=1,ntheterm + ethetai=ethetai+aathet(k,ityp1,ityp2,ityp3)*sinkt(k) + dethetai=dethetai+0.5d0*k*aathet(k,ityp1,ityp2,ityp3) + & *coskt(k) + if (lprn) + & write (iout,*) "k",k," aathet",aathet(k,ityp1,ityp2,ityp3), + & " ethetai",ethetai + enddo + if (lprn) then + write (iout,*) "cosph and sinph" + do k=1,nsingle + write (iout,*) k,cosph1(k),sinph1(k),cosph2(k),sinph2(k) + enddo + write (iout,*) "cosph1ph2 and sinph2ph2" + do k=2,ndouble + do l=1,k-1 + write (iout,*) l,k,cosph1ph2(l,k),cosph1ph2(k,l), + & sinph1ph2(l,k),sinph1ph2(k,l) + enddo + enddo + write(iout,*) "ethetai",ethetai + endif + do m=1,ntheterm2 + do k=1,nsingle + aux=bbthet(k,m,ityp1,ityp2,ityp3)*cosph1(k) + & +ccthet(k,m,ityp1,ityp2,ityp3)*sinph1(k) + & +ddthet(k,m,ityp1,ityp2,ityp3)*cosph2(k) + & +eethet(k,m,ityp1,ityp2,ityp3)*sinph2(k) + ethetai=ethetai+sinkt(m)*aux + dethetai=dethetai+0.5d0*m*aux*coskt(m) + dephii=dephii+k*sinkt(m)*( + & ccthet(k,m,ityp1,ityp2,ityp3)*cosph1(k)- + & bbthet(k,m,ityp1,ityp2,ityp3)*sinph1(k)) + dephii1=dephii1+k*sinkt(m)*( + & eethet(k,m,ityp1,ityp2,ityp3)*cosph2(k)- + & ddthet(k,m,ityp1,ityp2,ityp3)*sinph2(k)) + if (lprn) + & write (iout,*) "m",m," k",k," bbthet", + & bbthet(k,m,ityp1,ityp2,ityp3)," ccthet", + & ccthet(k,m,ityp1,ityp2,ityp3)," ddthet", + & ddthet(k,m,ityp1,ityp2,ityp3)," eethet", + & eethet(k,m,ityp1,ityp2,ityp3)," ethetai",ethetai + enddo + enddo + if (lprn) + & write(iout,*) "ethetai",ethetai + do m=1,ntheterm3 + do k=2,ndouble + do l=1,k-1 + aux=ffthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)+ + & ffthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)+ + & ggthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l) + ethetai=ethetai+sinkt(m)*aux + dethetai=dethetai+0.5d0*m*coskt(m)*aux + dephii=dephii+l*sinkt(m)*( + & -ffthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)- + & ffthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)+ + & ggthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)) + dephii1=dephii1+(k-l)*sinkt(m)*( + & -ffthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)+ + & ffthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)- + & ggthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)) + if (lprn) then + write (iout,*) "m",m," k",k," l",l," ffthet", + & ffthet(l,k,m,ityp1,ityp2,ityp3), + & ffthet(k,l,m,ityp1,ityp2,ityp3)," ggthet", + & ggthet(l,k,m,ityp1,ityp2,ityp3), + & ggthet(k,l,m,ityp1,ityp2,ityp3)," ethetai",ethetai + write (iout,*) cosph1ph2(l,k)*sinkt(m), + & cosph1ph2(k,l)*sinkt(m), + & sinph1ph2(l,k)*sinkt(m),sinph1ph2(k,l)*sinkt(m) + endif + enddo + enddo + enddo +10 continue + if (lprn1) write (iout,'(i2,3f8.1,9h ethetai ,f10.5)') + & i,theta(i)*rad2deg,phii*rad2deg, + & phii1*rad2deg,ethetai + becompon(itype(i-1))=becompon(itype(i-1))+ethetai + etheta=etheta+ethetai + if (i.gt.3) gloc(i-3,icg)=gloc(i-3,icg)+wang*dephii + if (i.lt.nres) gloc(i-2,icg)=gloc(i-2,icg)+wang*dephii1 + gloc(nphi+i-2,icg)=wang*dethetai + enddo + return + end +#endif +#ifdef CRYST_SC +c----------------------------------------------------------------------------- + subroutine esc(escloc) +C Calculate the local energy of a side chain and its derivatives in the +C corresponding virtual-bond valence angles THETA and the spherical angles +C ALPHA and OMEGA. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include "COMMON.ECOMPON" + double precision x(3),dersc(3),xemp(3),dersc0(3),dersc1(3), + & ddersc0(3),ddummy(3),xtemp(3),temp(3) + common /sccalc/ time11,time12,time112,theti,it,nlobit + delta=0.02d0*pi + escloc=0.0D0 +c write (iout,'(a)') 'ESC' + do i=loc_start,loc_end + it=itype(i) + if (it.eq.10 .or. it.eq.ntyp1 .or. itype(i-1).eq.ntyp1 .or. + & itype(i+1).eq.ntyp1) goto 1 + nlobit=nlob(it) +c print *,'i=',i,' it=',it,' nlobit=',nlobit +c write (iout,*) 'i=',i,' ssa=',ssa,' ssad=',ssad + theti=theta(i+1)-pipol + x(1)=dtan(theti) + x(2)=alph(i) + x(3)=omeg(i) + + if (x(2).gt.pi-delta) then + xtemp(1)=x(1) + xtemp(2)=pi-delta + xtemp(3)=x(3) + call enesc(xtemp,escloci0,dersc0,ddersc0,.true.) + xtemp(2)=pi + call enesc(xtemp,escloci1,dersc1,ddummy,.false.) + call spline1(x(2),pi-delta,delta,escloci0,escloci1,dersc0(2), + & escloci,dersc(2)) + call spline2(x(2),pi-delta,delta,dersc0(1),dersc1(1), + & ddersc0(1),dersc(1)) + call spline2(x(2),pi-delta,delta,dersc0(3),dersc1(3), + & ddersc0(3),dersc(3)) + xtemp(2)=pi-delta + call enesc_bound(xtemp,esclocbi0,dersc0,dersc12,.true.) + xtemp(2)=pi + call enesc_bound(xtemp,esclocbi1,dersc1,chuju,.false.) + call spline1(x(2),pi-delta,delta,esclocbi0,esclocbi1, + & dersc0(2),esclocbi,dersc02) + call spline2(x(2),pi-delta,delta,dersc0(1),dersc1(1), + & dersc12,dersc01) + call splinthet(x(2),0.5d0*delta,ss,ssd) + dersc0(1)=dersc01 + dersc0(2)=dersc02 + dersc0(3)=0.0d0 + do k=1,3 + dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k) + enddo + dersc(2)=dersc(2)+ssd*(escloci-esclocbi) +c write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci, +c & esclocbi,ss,ssd + escloci=ss*escloci+(1.0d0-ss)*esclocbi +c escloci=esclocbi +c write (iout,*) escloci + else if (x(2).lt.delta) then + xtemp(1)=x(1) + xtemp(2)=delta + xtemp(3)=x(3) + call enesc(xtemp,escloci0,dersc0,ddersc0,.true.) + xtemp(2)=0.0d0 + call enesc(xtemp,escloci1,dersc1,ddummy,.false.) + call spline1(x(2),delta,-delta,escloci0,escloci1,dersc0(2), + & escloci,dersc(2)) + call spline2(x(2),delta,-delta,dersc0(1),dersc1(1), + & ddersc0(1),dersc(1)) + call spline2(x(2),delta,-delta,dersc0(3),dersc1(3), + & ddersc0(3),dersc(3)) + xtemp(2)=delta + call enesc_bound(xtemp,esclocbi0,dersc0,dersc12,.true.) + xtemp(2)=0.0d0 + call enesc_bound(xtemp,esclocbi1,dersc1,chuju,.false.) + call spline1(x(2),delta,-delta,esclocbi0,esclocbi1, + & dersc0(2),esclocbi,dersc02) + call spline2(x(2),delta,-delta,dersc0(1),dersc1(1), + & dersc12,dersc01) + dersc0(1)=dersc01 + dersc0(2)=dersc02 + dersc0(3)=0.0d0 + call splinthet(x(2),0.5d0*delta,ss,ssd) + do k=1,3 + dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k) + enddo + dersc(2)=dersc(2)+ssd*(escloci-esclocbi) +c write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci, +c & esclocbi,ss,ssd + escloci=ss*escloci+(1.0d0-ss)*esclocbi +c write (iout,*) escloci + else + call enesc(x,escloci,dersc,ddummy,.false.) + endif + + sccompon(it)=sccompon(it)+escloci + escloc=escloc+escloci + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'escloc',i,escloci +c write (iout,*) 'i=',i,' escloci=',escloci,' dersc=',dersc + + gloc(nphi+i-1,icg)=gloc(nphi+i-1,icg)+ + & wscloc*dersc(1) + gloc(ialph(i,1),icg)=wscloc*dersc(2) + gloc(ialph(i,1)+nside,icg)=wscloc*dersc(3) + 1 continue + enddo + return + end +C--------------------------------------------------------------------------- + subroutine enesc(x,escloci,dersc,ddersc,mixed) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /sccalc/ time11,time12,time112,theti,it,nlobit + double precision x(3),z(3),Ax(3,maxlob,-1:1),dersc(3),ddersc(3) + double precision contr(maxlob,-1:1) + logical mixed +c write (iout,*) 'it=',it,' nlobit=',nlobit + escloc_i=0.0D0 + do j=1,3 + dersc(j)=0.0D0 + if (mixed) ddersc(j)=0.0d0 + enddo + x3=x(3) + +C Because of periodicity of the dependence of the SC energy in omega we have +C to add up the contributions from x(3)-2*pi, x(3), and x(3+2*pi). +C To avoid underflows, first compute & store the exponents. + + do iii=-1,1 + + x(3)=x3+iii*dwapi + + do j=1,nlobit + do k=1,3 + z(k)=x(k)-censc(k,j,it) + enddo + do k=1,3 + Axk=0.0D0 + do l=1,3 + Axk=Axk+gaussc(l,k,j,it)*z(l) + enddo + Ax(k,j,iii)=Axk + enddo + expfac=0.0D0 + do k=1,3 + expfac=expfac+Ax(k,j,iii)*z(k) + enddo + contr(j,iii)=expfac + enddo ! j + + enddo ! iii + + x(3)=x3 +C As in the case of ebend, we want to avoid underflows in exponentiation and +C subsequent NaNs and INFs in energy calculation. +C Find the largest exponent + emin=contr(1,-1) + do iii=-1,1 + do j=1,nlobit + if (emin.gt.contr(j,iii)) emin=contr(j,iii) + enddo + enddo + emin=0.5D0*emin +cd print *,'it=',it,' emin=',emin + +C Compute the contribution to SC energy and derivatives + do iii=-1,1 + + do j=1,nlobit +#ifdef OSF + adexp=bsc(j,it)-0.5D0*contr(j,iii)+emin + if(adexp.ne.adexp) adexp=1.0 + expfac=dexp(adexp) +#else + expfac=dexp(bsc(j,it)-0.5D0*contr(j,iii)+emin) +#endif +cd print *,'j=',j,' expfac=',expfac + escloc_i=escloc_i+expfac + do k=1,3 + dersc(k)=dersc(k)+Ax(k,j,iii)*expfac + enddo + if (mixed) then + do k=1,3,2 + ddersc(k)=ddersc(k)+(-Ax(2,j,iii)*Ax(k,j,iii) + & +gaussc(k,2,j,it))*expfac + enddo + endif + enddo + + enddo ! iii + + dersc(1)=dersc(1)/cos(theti)**2 + ddersc(1)=ddersc(1)/cos(theti)**2 + ddersc(3)=ddersc(3) + + escloci=-(dlog(escloc_i)-emin) + do j=1,3 + dersc(j)=dersc(j)/escloc_i + enddo + if (mixed) then + do j=1,3,2 + ddersc(j)=(ddersc(j)/escloc_i+dersc(2)*dersc(j)) + enddo + endif + return + end +C------------------------------------------------------------------------------ + subroutine enesc_bound(x,escloci,dersc,dersc12,mixed) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /sccalc/ time11,time12,time112,theti,it,nlobit + double precision x(3),z(3),Ax(3,maxlob),dersc(3) + double precision contr(maxlob) + logical mixed + + escloc_i=0.0D0 + + do j=1,3 + dersc(j)=0.0D0 + enddo + + do j=1,nlobit + do k=1,2 + z(k)=x(k)-censc(k,j,it) + enddo + z(3)=dwapi + do k=1,3 + Axk=0.0D0 + do l=1,3 + Axk=Axk+gaussc(l,k,j,it)*z(l) + enddo + Ax(k,j)=Axk + enddo + expfac=0.0D0 + do k=1,3 + expfac=expfac+Ax(k,j)*z(k) + enddo + contr(j)=expfac + enddo ! j + +C As in the case of ebend, we want to avoid underflows in exponentiation and +C subsequent NaNs and INFs in energy calculation. +C Find the largest exponent + emin=contr(1) + do j=1,nlobit + if (emin.gt.contr(j)) emin=contr(j) + enddo + emin=0.5D0*emin + +C Compute the contribution to SC energy and derivatives + + dersc12=0.0d0 + do j=1,nlobit + expfac=dexp(bsc(j,it)-0.5D0*contr(j)+emin) + escloc_i=escloc_i+expfac + do k=1,2 + dersc(k)=dersc(k)+Ax(k,j)*expfac + enddo + if (mixed) dersc12=dersc12+(-Ax(2,j)*Ax(1,j) + & +gaussc(1,2,j,it))*expfac + dersc(3)=0.0d0 + enddo + + dersc(1)=dersc(1)/cos(theti)**2 + dersc12=dersc12/cos(theti)**2 + escloci=-(dlog(escloc_i)-emin) + do j=1,2 + dersc(j)=dersc(j)/escloc_i + enddo + if (mixed) dersc12=(dersc12/escloc_i+dersc(2)*dersc(1)) + return + end +#else +c---------------------------------------------------------------------------------- + subroutine esc(escloc) +C Calculate the local energy of a side chain and its derivatives in the +C corresponding virtual-bond valence angles THETA and the spherical angles +C ALPHA and OMEGA derived from AM1 all-atom calculations. +C added by Urszula Kozlowska. 07/11/2007 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.SCROT' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include 'COMMON.VECTORS' + include "COMMON.ECOMPON" + double precision x_prime(3),y_prime(3),z_prime(3) + & , sumene,dsc_i,dp2_i,x(65), + & xx,yy,zz,sumene1,sumene2,sumene3,sumene4,s1,s1_6,s2,s2_6, + & de_dxx,de_dyy,de_dzz,de_dt + double precision s1_t,s1_6_t,s2_t,s2_6_t + double precision + & dXX_Ci1(3),dYY_Ci1(3),dZZ_Ci1(3),dXX_Ci(3), + & dYY_Ci(3),dZZ_Ci(3),dXX_XYZ(3),dYY_XYZ(3),dZZ_XYZ(3), + & dt_dCi(3),dt_dCi1(3) + common /sccalc/ time11,time12,time112,theti,it,nlobit + delta=0.02d0*pi + escloc=0.0D0 + do i=loc_start,loc_end + costtab(i+1) =dcos(theta(i+1)) + sinttab(i+1) =dsqrt(1-costtab(i+1)*costtab(i+1)) + cost2tab(i+1)=dsqrt(0.5d0*(1.0d0+costtab(i+1))) + sint2tab(i+1)=dsqrt(0.5d0*(1.0d0-costtab(i+1))) + cosfac2=0.5d0/(1.0d0+costtab(i+1)) + cosfac=dsqrt(cosfac2) + sinfac2=0.5d0/(1.0d0-costtab(i+1)) + sinfac=dsqrt(sinfac2) + it=itype(i) + if (it.eq.10 .or. it.eq.ntyp1 .or. itype(i-1).eq.ntyp1 .or. + & itype(i+1).eq.ntyp1) goto 1 +c +C Compute the axes of tghe local cartesian coordinates system; store in +c x_prime, y_prime and z_prime +c + do j=1,3 + x_prime(j) = 0.00 + y_prime(j) = 0.00 + z_prime(j) = 0.00 + enddo +C write(2,*) "dc_norm", dc_norm(1,i+nres),dc_norm(2,i+nres), +C & dc_norm(3,i+nres) + do j = 1,3 + x_prime(j) = (dc_norm(j,i) - dc_norm(j,i-1))*cosfac + y_prime(j) = (dc_norm(j,i) + dc_norm(j,i-1))*sinfac + enddo + do j = 1,3 + z_prime(j) = -uz(j,i-1) + enddo +c write (2,*) "i",i +c write (2,*) "x_prime",(x_prime(j),j=1,3) +c write (2,*) "y_prime",(y_prime(j),j=1,3) +c write (2,*) "z_prime",(z_prime(j),j=1,3) +c write (2,*) "xx",scalar(x_prime(1),x_prime(1)), +c & " xy",scalar(x_prime(1),y_prime(1)), +c & " xz",scalar(x_prime(1),z_prime(1)), +c & " yy",scalar(y_prime(1),y_prime(1)), +c & " yz",scalar(y_prime(1),z_prime(1)), +c & " zz",scalar(z_prime(1),z_prime(1)) +c +C Transform the unit vector of the ith side-chain centroid, dC_norm(*,i), +C to local coordinate system. Store in xx, yy, zz. +c + xx=0.0d0 + yy=0.0d0 + zz=0.0d0 + do j = 1,3 + xx = xx + x_prime(j)*dc_norm(j,i+nres) + yy = yy + y_prime(j)*dc_norm(j,i+nres) + zz = zz + z_prime(j)*dc_norm(j,i+nres) + enddo + + xxtab(i)=xx + yytab(i)=yy + zztab(i)=zz +C +C Compute the energy of the ith side cbain +C +c write (2,*) "xx",xx," yy",yy," zz",zz + it=itype(i) + do j = 1,65 + x(j) = sc_parmin(j,it) + enddo +#ifdef CHECK_COORD +Cc diagnostics - remove later + xx1 = dcos(alph(2)) + yy1 = dsin(alph(2))*dcos(omeg(2)) + zz1 = -dsin(alph(2))*dsin(omeg(2)) + write(2,'(3f8.1,3f9.3,1x,3f9.3)') + & alph(2)*rad2deg,omeg(2)*rad2deg,theta(3)*rad2deg,xx,yy,zz, + & xx1,yy1,zz1 +C," --- ", xx_w,yy_w,zz_w +c end diagnostics +#endif + sumene1= x(1)+ x(2)*xx+ x(3)*yy+ x(4)*zz+ x(5)*xx**2 + & + x(6)*yy**2+ x(7)*zz**2+ x(8)*xx*zz+ x(9)*xx*yy + & + x(10)*yy*zz + sumene2= x(11) + x(12)*xx + x(13)*yy + x(14)*zz + x(15)*xx**2 + & + x(16)*yy**2 + x(17)*zz**2 + x(18)*xx*zz + x(19)*xx*yy + & + x(20)*yy*zz + sumene3= x(21) +x(22)*xx +x(23)*yy +x(24)*zz +x(25)*xx**2 + & +x(26)*yy**2 +x(27)*zz**2 +x(28)*xx*zz +x(29)*xx*yy + & +x(30)*yy*zz +x(31)*xx**3 +x(32)*yy**3 +x(33)*zz**3 + & +x(34)*(xx**2)*yy +x(35)*(xx**2)*zz +x(36)*(yy**2)*xx + & +x(37)*(yy**2)*zz +x(38)*(zz**2)*xx +x(39)*(zz**2)*yy + & +x(40)*xx*yy*zz + sumene4= x(41) +x(42)*xx +x(43)*yy +x(44)*zz +x(45)*xx**2 + & +x(46)*yy**2 +x(47)*zz**2 +x(48)*xx*zz +x(49)*xx*yy + & +x(50)*yy*zz +x(51)*xx**3 +x(52)*yy**3 +x(53)*zz**3 + & +x(54)*(xx**2)*yy +x(55)*(xx**2)*zz +x(56)*(yy**2)*xx + & +x(57)*(yy**2)*zz +x(58)*(zz**2)*xx +x(59)*(zz**2)*yy + & +x(60)*xx*yy*zz + dsc_i = 0.743d0+x(61) + dp2_i = 1.9d0+x(62) + dscp1=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2tab(i+1)+yy*sint2tab(i+1))) + dscp2=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2tab(i+1)-yy*sint2tab(i+1))) + s1=(1+x(63))/(0.1d0 + dscp1) + s1_6=(1+x(64))/(0.1d0 + dscp1**6) + s2=(1+x(65))/(0.1d0 + dscp2) + s2_6=(1+x(65))/(0.1d0 + dscp2**6) + sumene = ( sumene3*sint2tab(i+1) + sumene1)*(s1+s1_6) + & + (sumene4*cost2tab(i+1) +sumene2)*(s2+s2_6) +c write(2,'(i2," sumene",7f9.3)') i,sumene1,sumene2,sumene3, +c & sumene4, +c & dscp1,dscp2,sumene +c sumene = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + sccompon(it)=sccompon(it)+sumene + escloc = escloc + sumene +c write (2,*) "i",i," escloc",sumene,escloc +#ifdef DEBUG +C +C This section to check the numerical derivatives of the energy of ith side +C chain in xx, yy, zz, and theta. Use the -DDEBUG compiler option or insert +C #define DEBUG in the code to turn it on. +C + write (2,*) "sumene =",sumene + aincr=1.0d-7 + xxsave=xx + xx=xx+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dxx_num=(sumenep-sumene)/aincr + xx=xxsave + write (2,*) "xx+ sumene from enesc=",sumenep + yysave=yy + yy=yy+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dyy_num=(sumenep-sumene)/aincr + yy=yysave + write (2,*) "yy+ sumene from enesc=",sumenep + zzsave=zz + zz=zz+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dzz_num=(sumenep-sumene)/aincr + zz=zzsave + write (2,*) "zz+ sumene from enesc=",sumenep + costsave=cost2tab(i+1) + sintsave=sint2tab(i+1) + cost2tab(i+1)=dcos(0.5d0*(theta(i+1)+aincr)) + sint2tab(i+1)=dsin(0.5d0*(theta(i+1)+aincr)) + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dt_num=(sumenep-sumene)/aincr + write (2,*) " t+ sumene from enesc=",sumenep + cost2tab(i+1)=costsave + sint2tab(i+1)=sintsave +C End of diagnostics section. +#endif +C +C Compute the gradient of esc +C + pom_s1=(1.0d0+x(63))/(0.1d0 + dscp1)**2 + pom_s16=6*(1.0d0+x(64))/(0.1d0 + dscp1**6)**2 + pom_s2=(1.0d0+x(65))/(0.1d0 + dscp2)**2 + pom_s26=6*(1.0d0+x(65))/(0.1d0 + dscp2**6)**2 + pom_dx=dsc_i*dp2_i*cost2tab(i+1) + pom_dy=dsc_i*dp2_i*sint2tab(i+1) + pom_dt1=-0.5d0*dsc_i*dp2_i*(xx*sint2tab(i+1)-yy*cost2tab(i+1)) + pom_dt2=-0.5d0*dsc_i*dp2_i*(xx*sint2tab(i+1)+yy*cost2tab(i+1)) + pom1=(sumene3*sint2tab(i+1)+sumene1) + & *(pom_s1/dscp1+pom_s16*dscp1**4) + pom2=(sumene4*cost2tab(i+1)+sumene2) + & *(pom_s2/dscp2+pom_s26*dscp2**4) + sumene1x=x(2)+2*x(5)*xx+x(8)*zz+ x(9)*yy + sumene3x=x(22)+2*x(25)*xx+x(28)*zz+x(29)*yy+3*x(31)*xx**2 + & +2*x(34)*xx*yy +2*x(35)*xx*zz +x(36)*(yy**2) +x(38)*(zz**2) + & +x(40)*yy*zz + sumene2x=x(12)+2*x(15)*xx+x(18)*zz+ x(19)*yy + sumene4x=x(42)+2*x(45)*xx +x(48)*zz +x(49)*yy +3*x(51)*xx**2 + & +2*x(54)*xx*yy+2*x(55)*xx*zz+x(56)*(yy**2)+x(58)*(zz**2) + & +x(60)*yy*zz + de_dxx =(sumene1x+sumene3x*sint2tab(i+1))*(s1+s1_6) + & +(sumene2x+sumene4x*cost2tab(i+1))*(s2+s2_6) + & +(pom1+pom2)*pom_dx +#ifdef DEBUG + write(2,*), "de_dxx = ", de_dxx,de_dxx_num +#endif +C + sumene1y=x(3) + 2*x(6)*yy + x(9)*xx + x(10)*zz + sumene3y=x(23) +2*x(26)*yy +x(29)*xx +x(30)*zz +3*x(32)*yy**2 + & +x(34)*(xx**2) +2*x(36)*yy*xx +2*x(37)*yy*zz +x(39)*(zz**2) + & +x(40)*xx*zz + sumene2y=x(13) + 2*x(16)*yy + x(19)*xx + x(20)*zz + sumene4y=x(43)+2*x(46)*yy+x(49)*xx +x(50)*zz + & +3*x(52)*yy**2+x(54)*xx**2+2*x(56)*yy*xx +2*x(57)*yy*zz + & +x(59)*zz**2 +x(60)*xx*zz + de_dyy =(sumene1y+sumene3y*sint2tab(i+1))*(s1+s1_6) + & +(sumene2y+sumene4y*cost2tab(i+1))*(s2+s2_6) + & +(pom1-pom2)*pom_dy +#ifdef DEBUG + write(2,*), "de_dyy = ", de_dyy,de_dyy_num +#endif +C + de_dzz =(x(24) +2*x(27)*zz +x(28)*xx +x(30)*yy + & +3*x(33)*zz**2 +x(35)*xx**2 +x(37)*yy**2 +2*x(38)*zz*xx + & +2*x(39)*zz*yy +x(40)*xx*yy)*sint2tab(i+1)*(s1+s1_6) + & +(x(4) + 2*x(7)*zz+ x(8)*xx + x(10)*yy)*(s1+s1_6) + & +(x(44)+2*x(47)*zz +x(48)*xx +x(50)*yy +3*x(53)*zz**2 + & +x(55)*xx**2 +x(57)*(yy**2)+2*x(58)*zz*xx +2*x(59)*zz*yy + & +x(60)*xx*yy)*cost2tab(i+1)*(s2+s2_6) + & + ( x(14) + 2*x(17)*zz+ x(18)*xx + x(20)*yy)*(s2+s2_6) +#ifdef DEBUG + write(2,*), "de_dzz = ", de_dzz,de_dzz_num +#endif +C + de_dt = 0.5d0*sumene3*cost2tab(i+1)*(s1+s1_6) + & -0.5d0*sumene4*sint2tab(i+1)*(s2+s2_6) + & +pom1*pom_dt1+pom2*pom_dt2 +#ifdef DEBUG + write(2,*), "de_dt = ", de_dt,de_dt_num +#endif +c +C + cossc=scalar(dc_norm(1,i),dc_norm(1,i+nres)) + cossc1=scalar(dc_norm(1,i-1),dc_norm(1,i+nres)) + cosfac2xx=cosfac2*xx + sinfac2yy=sinfac2*yy + do k = 1,3 + dt_dCi(k) = -(dc_norm(k,i-1)+costtab(i+1)*dc_norm(k,i))* + & vbld_inv(i+1) + dt_dCi1(k)= -(dc_norm(k,i)+costtab(i+1)*dc_norm(k,i-1))* + & vbld_inv(i) + pom=(dC_norm(k,i+nres)-cossc*dC_norm(k,i))*vbld_inv(i+1) + pom1=(dC_norm(k,i+nres)-cossc1*dC_norm(k,i-1))*vbld_inv(i) +c write (iout,*) "i",i," k",k," pom",pom," pom1",pom1, +c & " dt_dCi",dt_dCi(k)," dt_dCi1",dt_dCi1(k) +c write (iout,*) "dC_norm",(dC_norm(j,i),j=1,3), +c & (dC_norm(j,i-1),j=1,3)," vbld_inv",vbld_inv(i+1),vbld_inv(i) + dXX_Ci(k)=pom*cosfac-dt_dCi(k)*cosfac2xx + dXX_Ci1(k)=-pom1*cosfac-dt_dCi1(k)*cosfac2xx + dYY_Ci(k)=pom*sinfac+dt_dCi(k)*sinfac2yy + dYY_Ci1(k)=pom1*sinfac+dt_dCi1(k)*sinfac2yy + dZZ_Ci1(k)=0.0d0 + dZZ_Ci(k)=0.0d0 + do j=1,3 + dZZ_Ci(k)=dZZ_Ci(k)-uzgrad(j,k,2,i-1)*dC_norm(j,i+nres) + dZZ_Ci1(k)=dZZ_Ci1(k)-uzgrad(j,k,1,i-1)*dC_norm(j,i+nres) + enddo + + dXX_XYZ(k)=vbld_inv(i+nres)*(x_prime(k)-xx*dC_norm(k,i+nres)) + dYY_XYZ(k)=vbld_inv(i+nres)*(y_prime(k)-yy*dC_norm(k,i+nres)) + dZZ_XYZ(k)=vbld_inv(i+nres)*(z_prime(k)-zz*dC_norm(k,i+nres)) +c + dt_dCi(k) = -dt_dCi(k)/sinttab(i+1) + dt_dCi1(k)= -dt_dCi1(k)/sinttab(i+1) + enddo + + do k=1,3 + dXX_Ctab(k,i)=dXX_Ci(k) + dXX_C1tab(k,i)=dXX_Ci1(k) + dYY_Ctab(k,i)=dYY_Ci(k) + dYY_C1tab(k,i)=dYY_Ci1(k) + dZZ_Ctab(k,i)=dZZ_Ci(k) + dZZ_C1tab(k,i)=dZZ_Ci1(k) + dXX_XYZtab(k,i)=dXX_XYZ(k) + dYY_XYZtab(k,i)=dYY_XYZ(k) + dZZ_XYZtab(k,i)=dZZ_XYZ(k) + enddo + + do k = 1,3 +c write (iout,*) "k",k," dxx_ci1",dxx_ci1(k)," dyy_ci1", +c & dyy_ci1(k)," dzz_ci1",dzz_ci1(k) +c write (iout,*) "k",k," dxx_ci",dxx_ci(k)," dyy_ci", +c & dyy_ci(k)," dzz_ci",dzz_ci(k) +c write (iout,*) "k",k," dt_dci",dt_dci(k)," dt_dci", +c & dt_dci(k) +c write (iout,*) "k",k," dxx_XYZ",dxx_XYZ(k)," dyy_XYZ", +c & dyy_XYZ(k)," dzz_XYZ",dzz_XYZ(k) + gscloc(k,i-1)=gscloc(k,i-1)+de_dxx*dxx_ci1(k) + & +de_dyy*dyy_ci1(k)+de_dzz*dzz_ci1(k)+de_dt*dt_dCi1(k) + gscloc(k,i)=gscloc(k,i)+de_dxx*dxx_Ci(k) + & +de_dyy*dyy_Ci(k)+de_dzz*dzz_Ci(k)+de_dt*dt_dCi(k) + gsclocx(k,i)= de_dxx*dxx_XYZ(k) + & +de_dyy*dyy_XYZ(k)+de_dzz*dzz_XYZ(k) + enddo +c write(iout,*) "ENERGY GRAD = ", (gscloc(k,i-1),k=1,3), +c & (gscloc(k,i),k=1,3),(gsclocx(k,i),k=1,3) + +C to check gradient call subroutine check_grad + + 1 continue + enddo + return + end +c------------------------------------------------------------------------------ + double precision function enesc(x,xx,yy,zz,cost2,sint2) + implicit none + double precision x(65),xx,yy,zz,cost2,sint2,sumene1,sumene2, + & sumene3,sumene4,sumene,dsc_i,dp2_i,dscp1,dscp2,s1,s1_6,s2,s2_6 + sumene1= x(1)+ x(2)*xx+ x(3)*yy+ x(4)*zz+ x(5)*xx**2 + & + x(6)*yy**2+ x(7)*zz**2+ x(8)*xx*zz+ x(9)*xx*yy + & + x(10)*yy*zz + sumene2= x(11) + x(12)*xx + x(13)*yy + x(14)*zz + x(15)*xx**2 + & + x(16)*yy**2 + x(17)*zz**2 + x(18)*xx*zz + x(19)*xx*yy + & + x(20)*yy*zz + sumene3= x(21) +x(22)*xx +x(23)*yy +x(24)*zz +x(25)*xx**2 + & +x(26)*yy**2 +x(27)*zz**2 +x(28)*xx*zz +x(29)*xx*yy + & +x(30)*yy*zz +x(31)*xx**3 +x(32)*yy**3 +x(33)*zz**3 + & +x(34)*(xx**2)*yy +x(35)*(xx**2)*zz +x(36)*(yy**2)*xx + & +x(37)*(yy**2)*zz +x(38)*(zz**2)*xx +x(39)*(zz**2)*yy + & +x(40)*xx*yy*zz + sumene4= x(41) +x(42)*xx +x(43)*yy +x(44)*zz +x(45)*xx**2 + & +x(46)*yy**2 +x(47)*zz**2 +x(48)*xx*zz +x(49)*xx*yy + & +x(50)*yy*zz +x(51)*xx**3 +x(52)*yy**3 +x(53)*zz**3 + & +x(54)*(xx**2)*yy +x(55)*(xx**2)*zz +x(56)*(yy**2)*xx + & +x(57)*(yy**2)*zz +x(58)*(zz**2)*xx +x(59)*(zz**2)*yy + & +x(60)*xx*yy*zz + dsc_i = 0.743d0+x(61) + dp2_i = 1.9d0+x(62) + dscp1=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2+yy*sint2)) + dscp2=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2-yy*sint2)) + s1=(1+x(63))/(0.1d0 + dscp1) + s1_6=(1+x(64))/(0.1d0 + dscp1**6) + s2=(1+x(65))/(0.1d0 + dscp2) + s2_6=(1+x(65))/(0.1d0 + dscp2**6) + sumene = ( sumene3*sint2 + sumene1)*(s1+s1_6) + & + (sumene4*cost2 +sumene2)*(s2+s2_6) + enesc=sumene + return + end +#endif +c------------------------------------------------------------------------------ + subroutine gcont(rij,r0ij,eps0ij,delta,fcont,fprimcont) +C +C This procedure calculates two-body contact function g(rij) and its derivative: +C +C eps0ij ! x < -1 +C g(rij) = esp0ij*(-0.9375*x+0.625*x**3-0.1875*x**5) ! -1 =< x =< 1 +C 0 ! x > 1 +C +C where x=(rij-r0ij)/delta +C +C rij - interbody distance, r0ij - contact distance, eps0ij - contact energy +C + implicit none + double precision rij,r0ij,eps0ij,fcont,fprimcont + double precision x,x2,x4,delta +c delta=0.02D0*r0ij +c delta=0.2D0*r0ij + x=(rij-r0ij)/delta + if (x.lt.-1.0D0) then + fcont=eps0ij + fprimcont=0.0D0 + else if (x.le.1.0D0) then + x2=x*x + x4=x2*x2 + fcont=eps0ij*(x*(-0.9375D0+0.6250D0*x2-0.1875D0*x4)+0.5D0) + fprimcont=eps0ij * (-0.9375D0+1.8750D0*x2-0.9375D0*x4)/delta + else + fcont=0.0D0 + fprimcont=0.0D0 + endif + return + end +c------------------------------------------------------------------------------ + subroutine splinthet(theti,delta,ss,ssder) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + thetup=pi-delta + thetlow=delta + if (theti.gt.pipol) then + call gcont(theti,thetup,1.0d0,delta,ss,ssder) + else + call gcont(-theti,-thetlow,1.0d0,delta,ss,ssder) + ssder=-ssder + endif + return + end +c------------------------------------------------------------------------------ + subroutine spline1(x,x0,delta,f0,f1,fprim0,f,fprim) + implicit none + double precision x,x0,delta,f0,f1,fprim0,f,fprim + double precision ksi,ksi2,ksi3,a1,a2,a3 + a1=fprim0*delta/(f1-f0) + a2=3.0d0-2.0d0*a1 + a3=a1-2.0d0 + ksi=(x-x0)/delta + ksi2=ksi*ksi + ksi3=ksi2*ksi + f=f0+(f1-f0)*ksi*(a1+ksi*(a2+a3*ksi)) + fprim=(f1-f0)/delta*(a1+ksi*(2*a2+3*ksi*a3)) + return + end +c------------------------------------------------------------------------------ + subroutine spline2(x,x0,delta,f0x,f1x,fprim0x,fx) + implicit none + double precision x,x0,delta,f0x,f1x,fprim0x,fx + double precision ksi,ksi2,ksi3,a1,a2,a3 + ksi=(x-x0)/delta + ksi2=ksi*ksi + ksi3=ksi2*ksi + a1=fprim0x*delta + a2=3*(f1x-f0x)-2*fprim0x*delta + a3=fprim0x*delta-2*(f1x-f0x) + fx=f0x+a1*ksi+a2*ksi2+a3*ksi3 + return + end +C----------------------------------------------------------------------------- +#ifdef CRYST_TOR +C----------------------------------------------------------------------------- + subroutine etor(etors,edihcnstr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + include "COMMON.ECOMPON" + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors=0.0D0 + do i=iphi_start,iphi_end + if (itype(i-3).eq.ntyp1 .or. itype(i-2).eq.ntyp1 .or. + & itype(i-1).eq.ntyp1 .or. itype(i).eq.ntyp1) cycle + etors_ii=0.0D0 + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + phii=phi(i) + gloci=0.0D0 +C Proline-Proline pair is a special case... + if (itori.eq.3 .and. itori1.eq.3) then + if (phii.gt.-dwapi3) then + cosphi=dcos(3*phii) + fac=1.0D0/(1.0D0-cosphi) + etorsi=v1(1,3,3)*fac + etorsi=etorsi+etorsi + etors=etors+etorsi-v1(1,3,3) + torcompon(itype(i-2),itype(i-1))= + & torcompon(itype(i-2),itype(i-1))+etorsi + if (energy_dec) etors_ii=etors_ii+etorsi-v1(1,3,3) + gloci=gloci-3*fac*etorsi*dsin(3*phii) + endif + do j=1,3 + v1ij=v1(j+1,itori,itori1) + v2ij=v2(j+1,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + if (energy_dec) etors_ii=etors_ii+ + & v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + else + do j=1,nterm_old + v1ij=v1(j,itori,itori1) + v2ij=v2(j,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + torcompon(itype(i-2),itype(i-1))= + & torcompon(itype(i-2),itype(i-1))+v1ij*cosphi+v2ij*sinphi+ + & dabs(v1ij)+dabs(v2ij) + if (energy_dec) etors_ii=etors_ii+ + & v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + endif + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'etor',i,etors_ii + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1(j,itori,itori1),j=1,6),(v2(j,itori,itori1),j=1,6) + gloc(i-3,icg)=gloc(i-3,icg)+wtor*gloci + write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg) + enddo +! 6/20/98 - dihedral angle constraints + edihcnstr=0.0d0 + do i=1,ndih_constr + itori=idih_constr(i) + phii=phi(itori) + difi=phii-phi0(i) + if (difi.gt.drange(i)) then + difi=difi-drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else if (difi.lt.-drange(i)) then + difi=difi+drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + endif +! write (iout,'(2i5,2f8.3,2e14.5)') i,itori,rad2deg*phii, +! & rad2deg*difi,0.25d0*ftors*difi**4,gloc(itori-3,icg) + enddo +! write (iout,*) 'edihcnstr',edihcnstr + return + end +c------------------------------------------------------------------------------ + subroutine etor_d(etors_d) + etors_d=0.0d0 + return + end +c---------------------------------------------------------------------------- +#else + subroutine etor(etors,edihcnstr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + include "COMMON.ECOMPON" + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors=0.0D0 + do i=iphi_start,iphi_end + if (itype(i-3).eq.ntyp1 .or. itype(i-2).eq.ntyp1 .or. + & itype(i-1).eq.ntyp1 .or. itype(i).eq.ntyp1) cycle + etors_ii=0.0D0 + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + phii=phi(i) + gloci=0.0D0 +C Regular cosine and sine terms + do j=1,nterm(itori,itori1) + v1ij=v1(j,itori,itori1) + v2ij=v2(j,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi + torcompon(itype(i-2),itype(i-1))= + & torcompon(itype(i-2),itype(i-1))+v1ij*cosphi+v2ij*sinphi + if (energy_dec) etors_ii=etors_ii+ + & v1ij*cosphi+v2ij*sinphi + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo +C Lorentz terms +C v1 +C E = SUM ----------------------------------- - v1 +C [v2 cos(phi/2)+v3 sin(phi/2)]^2 + 1 +C + cosphi=dcos(0.5d0*phii) + sinphi=dsin(0.5d0*phii) + do j=1,nlor(itori,itori1) + vl1ij=vlor1(j,itori,itori1) + vl2ij=vlor2(j,itori,itori1) + vl3ij=vlor3(j,itori,itori1) + pom=vl2ij*cosphi+vl3ij*sinphi + pom1=1.0d0/(pom*pom+1.0d0) + etors=etors+vl1ij*pom1 + torcompon(itype(i-2),itype(i-1))= + & torcompon(itype(i-2),itype(i-1))+vl1ij*pom1 + if (energy_dec) etors_ii=etors_ii+ + & vl1ij*pom1 + pom=-pom*pom1*pom1 + gloci=gloci+vl1ij*(vl3ij*cosphi-vl2ij*sinphi)*pom + enddo +C Subtract the constant term + etors=etors-v0(itori,itori1) + torcompon(itype(i-2),itype(i-1))= + & torcompon(itype(i-2),itype(i-1))-v0(itori,itori1) + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'etor',i,etors_ii-v0(itori,itori1) + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1(j,itori,itori1),j=1,6),(v2(j,itori,itori1),j=1,6) + gloc(i-3,icg)=gloc(i-3,icg)+wtor*gloci +c write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg) + enddo +! 6/20/98 - dihedral angle constraints + edihcnstr=0.0d0 +c do i=1,ndih_constr + do i=idihconstr_start,idihconstr_end + itori=idih_constr(i) + phii=phi(itori) + difi=pinorm(phii-phi0(i)) + if (difi.gt.drange(i)) then + difi=difi-drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else if (difi.lt.-drange(i)) then + difi=difi+drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else + difi=0.0 + endif +c write (iout,*) "gloci", gloc(i-3,icg) +cd write (iout,'(2i5,4f8.3,2e14.5)') i,itori,rad2deg*phii, +cd & rad2deg*phi0(i), rad2deg*drange(i), +cd & rad2deg*difi,0.25d0*ftors*difi**4,gloc(itori-3,icg) + enddo +cd write (iout,*) 'edihcnstr',edihcnstr + return + end +c---------------------------------------------------------------------------- + subroutine etor_d(etors_d) +C 6/23/01 Compute double torsional energy + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + include "COMMON.ECOMPON" + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors_d=0.0D0 + do i=iphid_start,iphid_end + if (itype(i-3).eq.ntyp1 .or. itype(i-2).eq.ntyp1 .or. + & itype(i-1).eq.ntyp1 .or. itype(i).eq.ntyp1 .or. + & itype(i+1).eq.ntyp1) cycle + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + itori2=itortyp(itype(i)) + phii=phi(i) + phii1=phi(i+1) + gloci1=0.0D0 + gloci2=0.0D0 + do j=1,ntermd_1(itori,itori1,itori2) + v1cij=v1c(1,j,itori,itori1,itori2) + v1sij=v1s(1,j,itori,itori1,itori2) + v2cij=v1c(2,j,itori,itori1,itori2) + v2sij=v1s(2,j,itori,itori1,itori2) + cosphi1=dcos(j*phii) + sinphi1=dsin(j*phii) + cosphi2=dcos(j*phii1) + sinphi2=dsin(j*phii1) + etors_d=etors_d+v1cij*cosphi1+v1sij*sinphi1+ + & v2cij*cosphi2+v2sij*sinphi2 + tordcompon(itype(i-1))=tordcompon(itype(i-1))+ + & v1cij*cosphi1+v1sij*sinphi1+v2cij*cosphi2+v2sij*sinphi2 + gloci1=gloci1+j*(v1sij*cosphi1-v1cij*sinphi1) + gloci2=gloci2+j*(v2sij*cosphi2-v2cij*sinphi2) + enddo + do k=2,ntermd_2(itori,itori1,itori2) + do l=1,k-1 + v1cdij = v2c(k,l,itori,itori1,itori2) + v2cdij = v2c(l,k,itori,itori1,itori2) + v1sdij = v2s(k,l,itori,itori1,itori2) + v2sdij = v2s(l,k,itori,itori1,itori2) + cosphi1p2=dcos(l*phii+(k-l)*phii1) + cosphi1m2=dcos(l*phii-(k-l)*phii1) + sinphi1p2=dsin(l*phii+(k-l)*phii1) + sinphi1m2=dsin(l*phii-(k-l)*phii1) + etors_d=etors_d+v1cdij*cosphi1p2+v2cdij*cosphi1m2+ + & v1sdij*sinphi1p2+v2sdij*sinphi1m2 + tordcompon(itype(i-1))=tordcompon(itype(i-1))+ + & v1cdij*cosphi1p2+v2cdij*cosphi1m2+ + & v1sdij*sinphi1p2+v2sdij*sinphi1m2 + gloci1=gloci1+l*(v1sdij*cosphi1p2+v2sdij*cosphi1m2 + & -v1cdij*sinphi1p2-v2cdij*sinphi1m2) + gloci2=gloci2+(k-l)*(v1sdij*cosphi1p2-v2sdij*cosphi1m2 + & -v1cdij*sinphi1p2+v2cdij*sinphi1m2) + enddo + enddo + gloc(i-3,icg)=gloc(i-3,icg)+wtor_d*gloci1 + gloc(i-2,icg)=gloc(i-2,icg)+wtor_d*gloci2 +c write (iout,*) "gloci", gloc(i-3,icg) + enddo + return + end +#endif +c------------------------------------------------------------------------------ + subroutine eback_sc_corr(esccor) +c 7/21/2007 Correlations between the backbone-local and side-chain-local +c conformational states; temporarily implemented as differences +c between UNRES torsional potentials (dependent on three types of +c residues) and the torsional potentials dependent on all 20 types +c of residues computed from AM1 energy surfaces of terminally-blocked +c amino-acid residues. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.SCCOR' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include 'COMMON.ECOMPON' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. +c write (iout,*) "EBACK_SC_COR",iphi_start,iphi_end,nterm_sccor + esccor=0.0D0 + do i=itau_start,itau_end + esccor_ii=0.0D0 + isccori=isccortyp(itype(i-2)) + isccori1=isccortyp(itype(i-1)) + if (itype(i-2).eq.ntyp1 .or. itype(i-1).eq.ntyp1) cycle + phii=phi(i) +cccc Added 9 May 2012 +cc Tauangle is torsional engle depending on the value of first digit +c(see comment below) +cc Omicron is flat angle depending on the value of first digit +c(see comment below) + + + do intertyp=1,3 !intertyp +cc Added 09 May 2012 (Adasko) +cc Intertyp means interaction type of backbone mainchain correlation: +c 1 = SC...Ca...Ca...Ca +c 2 = Ca...Ca...Ca...SC +c 3 = SC...Ca...Ca...SCi + gloci=0.0D0 + if (((intertyp.eq.3).and.((itype(i-2).eq.10).or. + & (itype(i-1).eq.10).or.(itype(i-2).eq.ntyp1).or. + & (itype(i-1).eq.ntyp1))) + & .or. ((intertyp.eq.1).and.((itype(i-2).eq.10) + & .or.(itype(i-2).eq.ntyp1))) + & .or.((intertyp.eq.2).and.((itype(i-1).eq.10).or. + & (itype(i-1).eq.ntyp1)))) cycle + if ((intertyp.eq.2).and.(i.eq.4).and.(itype(1).eq.ntyp1)) cycle + if ((intertyp.eq.1).and.(i.eq.nres).and.(itype(nres).eq.ntyp1)) + & cycle + do j=1,nterm_sccor(isccori,isccori1) + v1ij=v1sccor(j,intertyp,isccori,isccori1) + v2ij=v2sccor(j,intertyp,isccori,isccori1) + cosphi=dcos(j*tauangle(intertyp,i)) + sinphi=dsin(j*tauangle(intertyp,i)) + esccor=esccor+v1ij*cosphi+v2ij*sinphi + sccorcompon(itype(i-2),itype(i-1))= + & sccorcompon(itype(i-2),itype(i-1))+v1ij*cosphi+v2ij*sinphi + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + gloc_sc(intertyp,i-3,icg)=gloc_sc(intertyp,i-3,icg)+wsccor*gloci +c write (iout,*) "WTF",intertyp,i,itype(i),v1ij*cosphi+v2ij*sinphi +c &gloc_sc(intertyp,i-3,icg) + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1sccor(j,intertyp,itori,itori1),j=1,6) + & ,(v2sccor(j,intertyp,itori,itori1),j=1,6) + gsccor_loc(i-3)=gsccor_loc(i-3)+gloci + enddo !intertyp + enddo +c do i=1,nres +c write (iout,*) "W@T@F", gloc_sc(1,i,icg),gloc(i,icg) +c enddo + return + end +c---------------------------------------------------------------------------- + subroutine multibody(ecorr) +C This subroutine calculates multi-body contributions to energy following +C the idea of Skolnick et al. If side chains I and J make a contact and +C at the same time side chains I+1 and J+1 make a contact, an extra +C contribution equal to sqrt(eps(i,j)*eps(i+1,j+1)) is added. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + +C Set lprn=.true. for debugging + lprn=.false. + + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(i2,20(1x,i2,f10.5))') + & i,(jcont(j,i),facont(j,i),j=1,num_cont(i)) + enddo + endif + ecorr=0.0D0 + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo + do i=nnt,nct-2 + + DO ISHIFT = 3,4 + + i1=i+ishift + num_conti=num_cont(i) + num_conti1=num_cont(i1) + do jj=1,num_conti + j=jcont(jj,i) + do kk=1,num_conti1 + j1=jcont(kk,i1) + if (j1.eq.j+ishift .or. j1.eq.j-ishift) then +cd write(iout,*)'i=',i,' j=',j,' i1=',i1,' j1=',j1, +cd & ' ishift=',ishift +C Contacts I--J and I+ISHIFT--J+-ISHIFT1 occur simultaneously. +C The system gains extra energy. + ecorr=ecorr+esccorr(i,j,i1,j1,jj,kk) + endif ! j1==j+-ishift + enddo ! kk + enddo ! jj + + ENDDO ! ISHIFT + + enddo ! i + return + end +c------------------------------------------------------------------------------ + double precision function esccorr(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + lprn=.false. + eij=facont(jj,i) + ekl=facont(kk,k) +cd write (iout,'(4i5,3f10.5)') i,j,k,l,eij,ekl,-eij*ekl +C Calculate the multi-body contribution to energy. +C Calculate multi-body contributions to the gradient. +cd write (iout,'(2(2i3,3f10.5))')i,j,(gacont(m,jj,i),m=1,3), +cd & k,l,(gacont(m,kk,k),m=1,3) + do m=1,3 + gx(m) =ekl*gacont(m,jj,i) + gx1(m)=eij*gacont(m,kk,k) + gradxorr(m,i)=gradxorr(m,i)-gx(m) + gradxorr(m,j)=gradxorr(m,j)+gx(m) + gradxorr(m,k)=gradxorr(m,k)-gx1(m) + gradxorr(m,l)=gradxorr(m,l)+gx1(m) + enddo + do m=i,j-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+gx(ll) + enddo + enddo + do m=k,l-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+gx1(ll) + enddo + enddo + esccorr=-eij*ekl + return + end +c------------------------------------------------------------------------------ + subroutine multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) +C This subroutine calculates multi-body contributions to hydrogen-bonding + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPI + include "mpif.h" + parameter (max_cont=maxconts) + parameter (max_dim=26) + integer source,CorrelType,CorrelID,CorrelType1,CorrelID1,Error + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer status(MPI_STATUS_SIZE),req(maxconts*2), + & status_array(MPI_STATUS_SIZE,maxconts*2) +#endif + include 'COMMON.SETUP' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.LOCAL' + double precision gx(3),gx1(3),time00 + logical lprn,ldone + +C Set lprn=.true. for debugging + lprn=.false. +#ifdef MPI + n_corr=0 + n_corr1=0 + if (nfgtasks.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values before RECEIVE:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + call flush(iout) + do i=1,ntask_cont_from + ncont_recv(i)=0 + enddo + do i=1,ntask_cont_to + ncont_sent(i)=0 + enddo +c write (iout,*) "ntask_cont_from",ntask_cont_from," ntask_cont_to", +c & ntask_cont_to +C Make the list of contacts to send to send to other procesors +c write (iout,*) "limits",max0(iturn4_end-1,iatel_s),iturn3_end +c call flush(iout) + do i=iturn3_start,iturn3_end +c write (iout,*) "make contact list turn3",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact(i,i+2,iturn3_sent_local(1,i)) + enddo + do i=iturn4_start,iturn4_end +c write (iout,*) "make contact list turn4",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact(i,i+3,iturn4_sent_local(1,i)) + enddo + do ii=1,nat_sent + i=iat_sent(ii) +c write (iout,*) "make contact list longrange",i,ii," num_cont", +c & num_cont_hb(i) + do j=1,num_cont_hb(i) + do k=1,4 + jjc=jcont_hb(j,i) + iproc=iint_sent_local(k,jjc,ii) +c write (iout,*) "i",i," j",j," k",k," jjc",jjc," iproc",iproc + if (iproc.gt.0) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=i + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=facont_hb(j,i) + zapas(4,nn,iproc)=ees0p(j,i) + zapas(5,nn,iproc)=ees0m(j,i) + zapas(6,nn,iproc)=gacont_hbr(1,j,i) + zapas(7,nn,iproc)=gacont_hbr(2,j,i) + zapas(8,nn,iproc)=gacont_hbr(3,j,i) + zapas(9,nn,iproc)=gacontm_hb1(1,j,i) + zapas(10,nn,iproc)=gacontm_hb1(2,j,i) + zapas(11,nn,iproc)=gacontm_hb1(3,j,i) + zapas(12,nn,iproc)=gacontp_hb1(1,j,i) + zapas(13,nn,iproc)=gacontp_hb1(2,j,i) + zapas(14,nn,iproc)=gacontp_hb1(3,j,i) + zapas(15,nn,iproc)=gacontm_hb2(1,j,i) + zapas(16,nn,iproc)=gacontm_hb2(2,j,i) + zapas(17,nn,iproc)=gacontm_hb2(3,j,i) + zapas(18,nn,iproc)=gacontp_hb2(1,j,i) + zapas(19,nn,iproc)=gacontp_hb2(2,j,i) + zapas(20,nn,iproc)=gacontp_hb2(3,j,i) + zapas(21,nn,iproc)=gacontm_hb3(1,j,i) + zapas(22,nn,iproc)=gacontm_hb3(2,j,i) + zapas(23,nn,iproc)=gacontm_hb3(3,j,i) + zapas(24,nn,iproc)=gacontp_hb3(1,j,i) + zapas(25,nn,iproc)=gacontp_hb3(2,j,i) + zapas(26,nn,iproc)=gacontp_hb3(3,j,i) + endif + enddo + enddo + enddo + if (lprn) then + write (iout,*) + & "Numbers of contacts to be sent to other processors", + & (ncont_sent(i),i=1,ntask_cont_to) + write (iout,*) "Contacts sent" + do ii=1,ntask_cont_to + nn=ncont_sent(ii) + iproc=itask_cont_to(ii) + write (iout,*) nn," contacts to processor",iproc, + & " of CONT_TO_COMM group" + do i=1,nn + write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) + enddo + enddo + call flush(iout) + endif + CorrelType=477 + CorrelID=fg_rank+1 + CorrelType1=478 + CorrelID1=nfgtasks+fg_rank+1 + ireq=0 +C Receive the numbers of needed contacts from other processors + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + ireq=ireq+1 + call MPI_Irecv(ncont_recv(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "IRECV ended" +c call flush(iout) +C Send the number of contacts needed by other processors + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + ireq=ireq+1 + call MPI_Isend(ncont_sent(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "ISEND ended" +c write (iout,*) "number of requests (nn)",ireq + call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) +c write (iout,*) +c & "Numbers of contacts to be received from other processors", +c & (ncont_recv(i),i=1,ntask_cont_from) +c call flush(iout) +C Receive contacts + ireq=0 + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + nn=ncont_recv(ii) +c write (iout,*) "Receiving",nn," contacts from processor",iproc, +c & " of CONT_TO_COMM group" + call flush(iout) + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Irecv(zapas_recv(1,1,ii),nn*max_dim, + & MPI_DOUBLE_PRECISION,iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) + endif + enddo +C Send the contacts to processors that need them + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + nn=ncont_sent(ii) +c write (iout,*) nn," contacts to processor",iproc, +c & " of CONT_TO_COMM group" + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Isend(zapas(1,1,ii),nn*max_dim,MPI_DOUBLE_PRECISION, + & iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) +c do i=1,nn +c write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) +c enddo + endif + enddo +c write (iout,*) "number of requests (contacts)",ireq +c write (iout,*) "req",(req(i),i=1,4) +c call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) + do iii=1,ntask_cont_from + iproc=itask_cont_from(iii) + nn=ncont_recv(iii) + if (lprn) then + write (iout,*) "Received",nn," contacts from processor",iproc, + & " of CONT_FROM_COMM group" + call flush(iout) + do i=1,nn + write(iout,'(2f5.0,4f10.5)')(zapas_recv(j,i,iii),j=1,5) + enddo + call flush(iout) + endif + do i=1,nn + ii=zapas_recv(1,i,iii) +c Flag the received contacts to prevent double-counting + jj=-zapas_recv(2,i,iii) +c write (iout,*) "iii",iii," i",i," ii",ii," jj",jj +c call flush(iout) + nnn=num_cont_hb(ii)+1 + num_cont_hb(ii)=nnn + jcont_hb(nnn,ii)=jj + facont_hb(nnn,ii)=zapas_recv(3,i,iii) + ees0p(nnn,ii)=zapas_recv(4,i,iii) + ees0m(nnn,ii)=zapas_recv(5,i,iii) + gacont_hbr(1,nnn,ii)=zapas_recv(6,i,iii) + gacont_hbr(2,nnn,ii)=zapas_recv(7,i,iii) + gacont_hbr(3,nnn,ii)=zapas_recv(8,i,iii) + gacontm_hb1(1,nnn,ii)=zapas_recv(9,i,iii) + gacontm_hb1(2,nnn,ii)=zapas_recv(10,i,iii) + gacontm_hb1(3,nnn,ii)=zapas_recv(11,i,iii) + gacontp_hb1(1,nnn,ii)=zapas_recv(12,i,iii) + gacontp_hb1(2,nnn,ii)=zapas_recv(13,i,iii) + gacontp_hb1(3,nnn,ii)=zapas_recv(14,i,iii) + gacontm_hb2(1,nnn,ii)=zapas_recv(15,i,iii) + gacontm_hb2(2,nnn,ii)=zapas_recv(16,i,iii) + gacontm_hb2(3,nnn,ii)=zapas_recv(17,i,iii) + gacontp_hb2(1,nnn,ii)=zapas_recv(18,i,iii) + gacontp_hb2(2,nnn,ii)=zapas_recv(19,i,iii) + gacontp_hb2(3,nnn,ii)=zapas_recv(20,i,iii) + gacontm_hb3(1,nnn,ii)=zapas_recv(21,i,iii) + gacontm_hb3(2,nnn,ii)=zapas_recv(22,i,iii) + gacontm_hb3(3,nnn,ii)=zapas_recv(23,i,iii) + gacontp_hb3(1,nnn,ii)=zapas_recv(24,i,iii) + gacontp_hb3(2,nnn,ii)=zapas_recv(25,i,iii) + gacontp_hb3(3,nnn,ii)=zapas_recv(26,i,iii) + enddo + enddo + call flush(iout) + if (lprn) then + write (iout,'(a)') 'Contact function values after receive:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + call flush(iout) + endif + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + ecorr=0.0D0 +C Remove the loop below after debugging !!! + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo +C Calculate the local-electrostatic correlation terms + do i=min0(iatel_s,iturn4_start),max0(iatel_e,iturn3_end) + i1=i+1 + num_conti=num_cont_hb(i) + num_conti1=num_cont_hb(i+1) + do jj=1,num_conti + j=jcont_hb(jj,i) + jp=iabs(j) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) + jp1=iabs(j1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if ((j.gt.0 .and. j1.gt.0 .or. j.gt.0 .and. j1.lt.0 + & .or. j.lt.0 .and. j1.gt.0) .and. + & (jp1.eq.jp+1 .or. jp1.eq.jp-1)) then +C Contacts I-J and (I+1)-(J+1) or (I+1)-(J-1) occur simultaneously. +C The system gains extra energy. + ecorr=ecorr+ehbcorr(i,jp,i+1,jp1,jj,kk,0.72D0,0.32D0) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'ecorrh',i,j,ehbcorr(i,j,i+1,j1,jj,kk,0.72D0,0.32D0) + n_corr=n_corr+1 + else if (j1.eq.j) then +C Contacts I-J and I-(J+1) occur simultaneously. +C The system loses extra energy. +c ecorr=ecorr+ehbcorr(i,j,i+1,j,jj,kk,0.60D0,-0.40D0) + endif + enddo ! kk + do kk=1,num_conti + j1=jcont_hb(kk,i) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if (j1.eq.j+1) then +C Contacts I-J and (I+1)-J occur simultaneously. +C The system loses extra energy. +c ecorr=ecorr+ehbcorr(i,j,i,j+1,jj,kk,0.60D0,-0.40D0) + endif ! j1==j+1 + enddo ! kk + enddo ! jj + enddo ! i + return + end +c------------------------------------------------------------------------------ + subroutine add_hb_contact(ii,jj,itask) + implicit real*8 (a-h,o-z) + include "DIMENSIONS" + include "COMMON.IOUNITS" + integer max_cont + integer max_dim + parameter (max_cont=maxconts) + parameter (max_dim=26) + include "COMMON.CONTACTS" + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer i,j,ii,jj,iproc,itask(4),nn +c write (iout,*) "itask",itask + do i=1,2 + iproc=itask(i) + if (iproc.gt.0) then + do j=1,num_cont_hb(ii) + jjc=jcont_hb(j,ii) +c write (iout,*) "i",ii," j",jj," jjc",jjc + if (jjc.eq.jj) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=ii + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=facont_hb(j,ii) + zapas(4,nn,iproc)=ees0p(j,ii) + zapas(5,nn,iproc)=ees0m(j,ii) + zapas(6,nn,iproc)=gacont_hbr(1,j,ii) + zapas(7,nn,iproc)=gacont_hbr(2,j,ii) + zapas(8,nn,iproc)=gacont_hbr(3,j,ii) + zapas(9,nn,iproc)=gacontm_hb1(1,j,ii) + zapas(10,nn,iproc)=gacontm_hb1(2,j,ii) + zapas(11,nn,iproc)=gacontm_hb1(3,j,ii) + zapas(12,nn,iproc)=gacontp_hb1(1,j,ii) + zapas(13,nn,iproc)=gacontp_hb1(2,j,ii) + zapas(14,nn,iproc)=gacontp_hb1(3,j,ii) + zapas(15,nn,iproc)=gacontm_hb2(1,j,ii) + zapas(16,nn,iproc)=gacontm_hb2(2,j,ii) + zapas(17,nn,iproc)=gacontm_hb2(3,j,ii) + zapas(18,nn,iproc)=gacontp_hb2(1,j,ii) + zapas(19,nn,iproc)=gacontp_hb2(2,j,ii) + zapas(20,nn,iproc)=gacontp_hb2(3,j,ii) + zapas(21,nn,iproc)=gacontm_hb3(1,j,ii) + zapas(22,nn,iproc)=gacontm_hb3(2,j,ii) + zapas(23,nn,iproc)=gacontm_hb3(3,j,ii) + zapas(24,nn,iproc)=gacontp_hb3(1,j,ii) + zapas(25,nn,iproc)=gacontp_hb3(2,j,ii) + zapas(26,nn,iproc)=gacontp_hb3(3,j,ii) + exit + endif + enddo + endif + enddo + return + end +c------------------------------------------------------------------------------ + subroutine multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr, + & n_corr1) +C This subroutine calculates multi-body contributions to hydrogen-bonding + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPI + include "mpif.h" + parameter (max_cont=maxconts) + parameter (max_dim=70) + integer source,CorrelType,CorrelID,CorrelType1,CorrelID1,Error + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer status(MPI_STATUS_SIZE),req(maxconts*2), + & status_array(MPI_STATUS_SIZE,maxconts*2) +#endif + include 'COMMON.SETUP' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.CONTROL' + double precision gx(3),gx1(3) + integer num_cont_hb_old(maxres) + logical lprn,ldone + double precision eello4,eello5,eelo6,eello_turn6 + external eello4,eello5,eello6,eello_turn6 +C Set lprn=.true. for debugging + lprn=.false. + eturn6=0.0d0 +#ifdef MPI + do i=1,nres + num_cont_hb_old(i)=num_cont_hb(i) + enddo + n_corr=0 + n_corr1=0 + if (nfgtasks.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values before RECEIVE:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + call flush(iout) + do i=1,ntask_cont_from + ncont_recv(i)=0 + enddo + do i=1,ntask_cont_to + ncont_sent(i)=0 + enddo +c write (iout,*) "ntask_cont_from",ntask_cont_from," ntask_cont_to", +c & ntask_cont_to +C Make the list of contacts to send to send to other procesors + do i=iturn3_start,iturn3_end +c write (iout,*) "make contact list turn3",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact_eello(i,i+2,iturn3_sent_local(1,i)) + enddo + do i=iturn4_start,iturn4_end +c write (iout,*) "make contact list turn4",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact_eello(i,i+3,iturn4_sent_local(1,i)) + enddo + do ii=1,nat_sent + i=iat_sent(ii) +c write (iout,*) "make contact list longrange",i,ii," num_cont", +c & num_cont_hb(i) + do j=1,num_cont_hb(i) + do k=1,4 + jjc=jcont_hb(j,i) + iproc=iint_sent_local(k,jjc,ii) +c write (iout,*) "i",i," j",j," k",k," jjc",jjc," iproc",iproc + if (iproc.ne.0) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=i + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=d_cont(j,i) + ind=3 + do kk=1,3 + ind=ind+1 + zapas(ind,nn,iproc)=grij_hb_cont(kk,j,i) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj(ll,kk,j,i) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj_der(mm,ll,kk,jj,j,i) + enddo + enddo + enddo + enddo + endif + enddo + enddo + enddo + if (lprn) then + write (iout,*) + & "Numbers of contacts to be sent to other processors", + & (ncont_sent(i),i=1,ntask_cont_to) + write (iout,*) "Contacts sent" + do ii=1,ntask_cont_to + nn=ncont_sent(ii) + iproc=itask_cont_to(ii) + write (iout,*) nn," contacts to processor",iproc, + & " of CONT_TO_COMM group" + do i=1,nn + write(iout,'(2f5.0,10f10.5)')(zapas(j,i,ii),j=1,10) + enddo + enddo + call flush(iout) + endif + CorrelType=477 + CorrelID=fg_rank+1 + CorrelType1=478 + CorrelID1=nfgtasks+fg_rank+1 + ireq=0 +C Receive the numbers of needed contacts from other processors + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + ireq=ireq+1 + call MPI_Irecv(ncont_recv(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "IRECV ended" +c call flush(iout) +C Send the number of contacts needed by other processors + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + ireq=ireq+1 + call MPI_Isend(ncont_sent(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "ISEND ended" +c write (iout,*) "number of requests (nn)",ireq + call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) +c write (iout,*) +c & "Numbers of contacts to be received from other processors", +c & (ncont_recv(i),i=1,ntask_cont_from) +c call flush(iout) +C Receive contacts + ireq=0 + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + nn=ncont_recv(ii) +c write (iout,*) "Receiving",nn," contacts from processor",iproc, +c & " of CONT_TO_COMM group" + call flush(iout) + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Irecv(zapas_recv(1,1,ii),nn*max_dim, + & MPI_DOUBLE_PRECISION,iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) + endif + enddo +C Send the contacts to processors that need them + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + nn=ncont_sent(ii) +c write (iout,*) nn," contacts to processor",iproc, +c & " of CONT_TO_COMM group" + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Isend(zapas(1,1,ii),nn*max_dim,MPI_DOUBLE_PRECISION, + & iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) +c do i=1,nn +c write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) +c enddo + endif + enddo +c write (iout,*) "number of requests (contacts)",ireq +c write (iout,*) "req",(req(i),i=1,4) +c call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) + do iii=1,ntask_cont_from + iproc=itask_cont_from(iii) + nn=ncont_recv(iii) + if (lprn) then + write (iout,*) "Received",nn," contacts from processor",iproc, + & " of CONT_FROM_COMM group" + call flush(iout) + do i=1,nn + write(iout,'(2f5.0,10f10.5)')(zapas_recv(j,i,iii),j=1,10) + enddo + call flush(iout) + endif + do i=1,nn + ii=zapas_recv(1,i,iii) +c Flag the received contacts to prevent double-counting + jj=-zapas_recv(2,i,iii) +c write (iout,*) "iii",iii," i",i," ii",ii," jj",jj +c call flush(iout) + nnn=num_cont_hb(ii)+1 + num_cont_hb(ii)=nnn + jcont_hb(nnn,ii)=jj + d_cont(nnn,ii)=zapas_recv(3,i,iii) + ind=3 + do kk=1,3 + ind=ind+1 + grij_hb_cont(kk,nnn,ii)=zapas_recv(ind,i,iii) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + a_chuj(ll,kk,nnn,ii)=zapas_recv(ind,i,iii) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + a_chuj_der(mm,ll,kk,jj,nnn,ii)=zapas_recv(ind,i,iii) + enddo + enddo + enddo + enddo + enddo + enddo + call flush(iout) + if (lprn) then + write (iout,'(a)') 'Contact function values after receive:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,5f6.3))') + & i,num_cont_hb(i),(jcont_hb(j,i),d_cont(j,i), + & ((a_chuj(ll,kk,j,i),ll=1,2),kk=1,2),j=1,num_cont_hb(i)) + enddo + call flush(iout) + endif + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,5f6.3))') + & i,num_cont_hb(i),(jcont_hb(j,i),d_cont(j,i), + & ((a_chuj(ll,kk,j,i),ll=1,2),kk=1,2),j=1,num_cont_hb(i)) + enddo + endif + ecorr=0.0D0 + ecorr5=0.0d0 + ecorr6=0.0d0 +C Remove the loop below after debugging !!! + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo +C Calculate the dipole-dipole interaction energies + if (wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0) then + do i=iatel_s,iatel_e+1 + num_conti=num_cont_hb(i) + do jj=1,num_conti + j=jcont_hb(jj,i) +#ifdef MOMENT + call dipole(i,j,jj) +#endif + enddo + enddo + endif +C Calculate the local-electrostatic correlation terms +c write (iout,*) "gradcorr5 in eello5 before loop" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + do i=min0(iatel_s,iturn4_start),max0(iatel_e+1,iturn3_end+1) +c write (iout,*) "corr loop i",i + i1=i+1 + num_conti=num_cont_hb(i) + num_conti1=num_cont_hb(i+1) + do jj=1,num_conti + j=jcont_hb(jj,i) + jp=iabs(j) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) + jp1=iabs(j1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk +c if (j1.eq.j+1 .or. j1.eq.j-1) then + if ((j.gt.0 .and. j1.gt.0 .or. j.gt.0 .and. j1.lt.0 + & .or. j.lt.0 .and. j1.gt.0) .and. + & (jp1.eq.jp+1 .or. jp1.eq.jp-1)) then +C Contacts I-J and (I+1)-(J+1) or (I+1)-(J-1) occur simultaneously. +C The system gains extra energy. + n_corr=n_corr+1 + sqd1=dsqrt(d_cont(jj,i)) + sqd2=dsqrt(d_cont(kk,i1)) + sred_geom = sqd1*sqd2 + IF (sred_geom.lt.cutoff_corr) THEN + call gcont(sred_geom,r0_corr,1.0D0,delt_corr, + & ekont,fprimcont) +cd write (iout,*) 'i=',i,' j=',jp,' i1=',i1,' j1=',jp1, +cd & ' jj=',jj,' kk=',kk + fac_prim1=0.5d0*sqd2/sqd1*fprimcont + fac_prim2=0.5d0*sqd1/sqd2*fprimcont + do l=1,3 + g_contij(l,1)=fac_prim1*grij_hb_cont(l,jj,i) + g_contij(l,2)=fac_prim2*grij_hb_cont(l,kk,i1) + enddo + n_corr1=n_corr1+1 +cd write (iout,*) 'sred_geom=',sred_geom, +cd & ' ekont=',ekont,' fprim=',fprimcont, +cd & ' fac_prim1',fac_prim1,' fac_prim2',fac_prim2 +cd write (iout,*) "g_contij",g_contij +cd write (iout,*) "grij_hb_cont i",grij_hb_cont(:,jj,i) +cd write (iout,*) "grij_hb_cont i1",grij_hb_cont(:,jj,i1) + call calc_eello(i,jp,i+1,jp1,jj,kk) + if (wcorr4.gt.0.0d0) + & ecorr=ecorr+eello4(i,jp,i+1,jp1,jj,kk) + if (energy_dec.and.wcorr4.gt.0.0d0) + 1 write (iout,'(a6,4i5,0pf7.3)') + 2 'ecorr4',i,j,i+1,j1,eello4(i,jp,i+1,jp1,jj,kk) +c write (iout,*) "gradcorr5 before eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + if (wcorr5.gt.0.0d0) + & ecorr5=ecorr5+eello5(i,jp,i+1,jp1,jj,kk) +c write (iout,*) "gradcorr5 after eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + if (energy_dec.and.wcorr5.gt.0.0d0) + 1 write (iout,'(a6,4i5,0pf7.3)') + 2 'ecorr5',i,j,i+1,j1,eello5(i,jp,i+1,jp1,jj,kk) +cd write(2,*)'wcorr6',wcorr6,' wturn6',wturn6 +cd write(2,*)'ijkl',i,jp,i+1,jp1 + if (wcorr6.gt.0.0d0 .and. (jp.ne.i+4 .or. jp1.ne.i+3 + & .or. wturn6.eq.0.0d0))then +cd write (iout,*) '******ecorr6: i,j,i+1,j1',i,j,i+1,j1 + ecorr6=ecorr6+eello6(i,jp,i+1,jp1,jj,kk) + if (energy_dec) write (iout,'(a6,4i5,0pf7.3)') + 1 'ecorr6',i,j,i+1,j1,eello6(i,jp,i+1,jp1,jj,kk) +cd write (iout,*) 'ecorr',ecorr,' ecorr5=',ecorr5, +cd & 'ecorr6=',ecorr6 +cd write (iout,'(4e15.5)') sred_geom, +cd & dabs(eello4(i,jp,i+1,jp1,jj,kk)), +cd & dabs(eello5(i,jp,i+1,jp1,jj,kk)), +cd & dabs(eello6(i,jp,i+1,jp1,jj,kk)) + else if (wturn6.gt.0.0d0 + & .and. (jp.eq.i+4 .and. jp1.eq.i+3)) then +cd write (iout,*) '******eturn6: i,j,i+1,j1',i,jip,i+1,jp1 + eturn6=eturn6+eello_turn6(i,jj,kk) + if (energy_dec) write (iout,'(a6,4i5,0pf7.3)') + 1 'eturn6',i,j,i+1,j1,eello_turn6(i,jj,kk) +cd write (2,*) 'multibody_eello:eturn6',eturn6 + endif + ENDIF +1111 continue + endif + enddo ! kk + enddo ! jj + enddo ! i + do i=1,nres + num_cont_hb(i)=num_cont_hb_old(i) + enddo +c write (iout,*) "gradcorr5 in eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + return + end +c------------------------------------------------------------------------------ + subroutine add_hb_contact_eello(ii,jj,itask) + implicit real*8 (a-h,o-z) + include "DIMENSIONS" + include "COMMON.IOUNITS" + integer max_cont + integer max_dim + parameter (max_cont=maxconts) + parameter (max_dim=70) + include "COMMON.CONTACTS" + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer i,j,ii,jj,iproc,itask(4),nn +c write (iout,*) "itask",itask + do i=1,2 + iproc=itask(i) + if (iproc.gt.0) then + do j=1,num_cont_hb(ii) + jjc=jcont_hb(j,ii) +c write (iout,*) "send turns i",ii," j",jj," jjc",jjc + if (jjc.eq.jj) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=ii + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=d_cont(j,ii) + ind=3 + do kk=1,3 + ind=ind+1 + zapas(ind,nn,iproc)=grij_hb_cont(kk,j,ii) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj(ll,kk,j,ii) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj_der(mm,ll,kk,jj,j,ii) + enddo + enddo + enddo + enddo + exit + endif + enddo + endif + enddo + return + end +c------------------------------------------------------------------------------ + double precision function ehbcorr(i,j,k,l,jj,kk,coeffp,coeffm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + lprn=.false. + eij=facont_hb(jj,i) + ekl=facont_hb(kk,k) + ees0pij=ees0p(jj,i) + ees0pkl=ees0p(kk,k) + ees0mij=ees0m(jj,i) + ees0mkl=ees0m(kk,k) + ekont=eij*ekl + ees=-(coeffp*ees0pij*ees0pkl+coeffm*ees0mij*ees0mkl) +cd ees=-(coeffp*ees0pkl+coeffm*ees0mkl) +C Following 4 lines for diagnostics. +cd ees0pkl=0.0D0 +cd ees0pij=1.0D0 +cd ees0mkl=0.0D0 +cd ees0mij=1.0D0 +c write (iout,'(2(a,2i3,a,f10.5,a,2f10.5),a,f10.5,a,$)') +c & 'Contacts ',i,j, +c & ' eij',eij,' eesij',ees0pij,ees0mij,' and ',k,l +c & ,' fcont ',ekl,' eeskl',ees0pkl,ees0mkl,' energy=',ekont*ees, +c & 'gradcorr_long' +C Calculate the multi-body contribution to energy. +c ecorr=ecorr+ekont*ees +C Calculate multi-body contributions to the gradient. + coeffpees0pij=coeffp*ees0pij + coeffmees0mij=coeffm*ees0mij + coeffpees0pkl=coeffp*ees0pkl + coeffmees0mkl=coeffm*ees0mkl + do ll=1,3 +cgrad ghalfi=ees*ekl*gacont_hbr(ll,jj,i) + gradcorr(ll,i)=gradcorr(ll,i)!+0.5d0*ghalfi + & -ekont*(coeffpees0pkl*gacontp_hb1(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb1(ll,jj,i)) + gradcorr(ll,j)=gradcorr(ll,j)!+0.5d0*ghalfi + & -ekont*(coeffpees0pkl*gacontp_hb2(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb2(ll,jj,i)) +cgrad ghalfk=ees*eij*gacont_hbr(ll,kk,k) + gradcorr(ll,k)=gradcorr(ll,k)!+0.5d0*ghalfk + & -ekont*(coeffpees0pij*gacontp_hb1(ll,kk,k)+ + & coeffmees0mij*gacontm_hb1(ll,kk,k)) + gradcorr(ll,l)=gradcorr(ll,l)!+0.5d0*ghalfk + & -ekont*(coeffpees0pij*gacontp_hb2(ll,kk,k)+ + & coeffmees0mij*gacontm_hb2(ll,kk,k)) + gradlongij=ees*ekl*gacont_hbr(ll,jj,i)- + & ekont*(coeffpees0pkl*gacontp_hb3(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb3(ll,jj,i)) + gradcorr_long(ll,j)=gradcorr_long(ll,j)+gradlongij + gradcorr_long(ll,i)=gradcorr_long(ll,i)-gradlongij + gradlongkl=ees*eij*gacont_hbr(ll,kk,k)- + & ekont*(coeffpees0pij*gacontp_hb3(ll,kk,k)+ + & coeffmees0mij*gacontm_hb3(ll,kk,k)) + gradcorr_long(ll,l)=gradcorr_long(ll,l)+gradlongkl + gradcorr_long(ll,k)=gradcorr_long(ll,k)-gradlongkl +c write (iout,'(2f10.5,2x,$)') gradlongij,gradlongkl + enddo +c write (iout,*) +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ +cgrad & ees*ekl*gacont_hbr(ll,jj,i)- +cgrad & ekont*(coeffp*ees0pkl*gacontp_hb3(ll,jj,i)+ +cgrad & coeffm*ees0mkl*gacontm_hb3(ll,jj,i)) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ +cgrad & ees*eij*gacont_hbr(ll,kk,k)- +cgrad & ekont*(coeffp*ees0pij*gacontp_hb3(ll,kk,k)+ +cgrad & coeffm*ees0mij*gacontm_hb3(ll,kk,k)) +cgrad enddo +cgrad enddo +c write (iout,*) "ehbcorr",ekont*ees + ehbcorr=ekont*ees + return + end +#ifdef MOMENT +C--------------------------------------------------------------------------- + subroutine dipole(i,j,jj) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + dimension dipi(2,2),dipj(2,2),dipderi(2),dipderj(2),auxvec(2), + & auxmat(2,2) + iti1 = itortyp(itype(i+1)) + if (j.lt.nres-1) then + itj1 = itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + do iii=1,2 + dipi(iii,1)=Ub2(iii,i) + dipderi(iii)=Ub2der(iii,i) + dipi(iii,2)=b1(iii,iti1) + dipj(iii,1)=Ub2(iii,j) + dipderj(iii)=Ub2der(iii,j) + dipj(iii,2)=b1(iii,itj1) + enddo + kkk=0 + do iii=1,2 + call matvec2(a_chuj(1,1,jj,i),dipj(1,iii),auxvec(1)) + do jjj=1,2 + kkk=kkk+1 + dip(kkk,jj,i)=scalar2(dipi(1,jjj),auxvec(1)) + enddo + enddo + do kkk=1,5 + do lll=1,3 + mmm=0 + do iii=1,2 + call matvec2(a_chuj_der(1,1,lll,kkk,jj,i),dipj(1,iii), + & auxvec(1)) + do jjj=1,2 + mmm=mmm+1 + dipderx(lll,kkk,mmm,jj,i)=scalar2(dipi(1,jjj),auxvec(1)) + enddo + enddo + enddo + enddo + call transpose2(a_chuj(1,1,jj,i),auxmat(1,1)) + call matvec2(auxmat(1,1),dipderi(1),auxvec(1)) + do iii=1,2 + dipderg(iii,jj,i)=scalar2(auxvec(1),dipj(1,iii)) + enddo + call matvec2(a_chuj(1,1,jj,i),dipderj(1),auxvec(1)) + do iii=1,2 + dipderg(iii+2,jj,i)=scalar2(auxvec(1),dipi(1,iii)) + enddo + return + end +#endif +C--------------------------------------------------------------------------- + subroutine calc_eello(i,j,k,l,jj,kk) +C +C This subroutine computes matrices and vectors needed to calculate +C the fourth-, fifth-, and sixth-order local-electrostatic terms. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision aa1(2,2),aa2(2,2),aa1t(2,2),aa2t(2,2), + & aa1tder(2,2,3,5),aa2tder(2,2,3,5),auxmat(2,2) + logical lprn + common /kutas/ lprn +cd write (iout,*) 'calc_eello: i=',i,' j=',j,' k=',k,' l=',l, +cd & ' jj=',jj,' kk=',kk +cd if (i.ne.2 .or. j.ne.4 .or. k.ne.3 .or. l.ne.5) return +cd write (iout,*) "a_chujij",((a_chuj(iii,jjj,jj,i),iii=1,2),jjj=1,2) +cd write (iout,*) "a_chujkl",((a_chuj(iii,jjj,kk,k),iii=1,2),jjj=1,2) + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=a_chuj(iii,jjj,jj,i) + aa2(iii,jjj)=a_chuj(iii,jjj,kk,k) + enddo + enddo + call transpose2(aa1(1,1),aa1t(1,1)) + call transpose2(aa2(1,1),aa2t(1,1)) + do kkk=1,5 + do lll=1,3 + call transpose2(a_chuj_der(1,1,lll,kkk,jj,i), + & aa1tder(1,1,lll,kkk)) + call transpose2(a_chuj_der(1,1,lll,kkk,kk,k), + & aa2tder(1,1,lll,kkk)) + enddo + enddo + if (l.eq.j+1) then +C parallel orientation of the two CA-CA-CA frames. + if (i.gt.1) then + iti=itortyp(itype(i)) + else + iti=ntortyp+1 + endif + itk1=itortyp(itype(k+1)) + itj=itortyp(itype(j)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +C A1 kernel(j+1) A2T +cd do iii=1,2 +cd write (iout,'(3f10.5,5x,3f10.5)') +cd & (EUg(iii,jjj,k),jjj=1,2),(EUg(iii,jjj,l),jjj=1,2) +cd enddo + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.false.,EUg(1,1,l),EUgder(1,1,l), + & AEA(1,1,1),AEAderg(1,1,1),AEAderx(1,1,1,1,1,1)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0) THEN + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.false.,EUgC(1,1,l),EUgCder(1,1,l), + & AECA(1,1,1),AECAderg(1,1,1),AECAderx(1,1,1,1,1,1)) + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.false.,Ug2DtEUg(1,1,l), + & Ug2DtEUgder(1,1,1,l),ADtEA(1,1,1),ADtEAderg(1,1,1,1), + & ADtEAderx(1,1,1,1,1,1)) + lprn=.false. + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.false.,DtUg2EUg(1,1,l), + & DtUg2EUgder(1,1,1,l),ADtEA1(1,1,1),ADtEA1derg(1,1,1,1), + & ADtEA1derx(1,1,1,1,1,1)) + ENDIF +C End 6-th order cumulants +cd lprn=.false. +cd if (lprn) then +cd write (2,*) 'In calc_eello6' +cd do iii=1,2 +cd write (2,*) 'iii=',iii +cd do kkk=1,5 +cd write (2,*) 'kkk=',kkk +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & ((ADtEA1derx(jjj,mmm,lll,kkk,iii,1),mmm=1,2),lll=1,3) +cd enddo +cd enddo +cd enddo +cd endif + call transpose2(EUgder(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,1,1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEA(1,1,1)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),EAEAderg(1,1,2,1)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & EAEAderx(1,1,lll,kkk,iii,1)) + enddo + enddo + enddo +C A1T kernel(i+1) A2 + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),1,.false.,EUg(1,1,k),EUgder(1,1,k), + & AEA(1,1,2),AEAderg(1,1,2),AEAderx(1,1,1,1,1,2)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0) THEN + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),1,.false.,EUgC(1,1,k),EUgCder(1,1,k), + & AECA(1,1,2),AECAderg(1,1,2),AECAderx(1,1,1,1,1,2)) + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),2,.false.,Ug2DtEUg(1,1,k), + & Ug2DtEUgder(1,1,1,k),ADtEA(1,1,2),ADtEAderg(1,1,1,2), + & ADtEAderx(1,1,1,1,1,2)) + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),2,.false.,DtUg2EUg(1,1,k), + & DtUg2EUgder(1,1,1,k),ADtEA1(1,1,2),ADtEA1derg(1,1,1,2), + & ADtEA1derx(1,1,1,1,1,2)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,l),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEAderg(1,1,1,2)) + call transpose2(EUg(1,1,l),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEA(1,1,2)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),EAEAderg(1,1,2,2)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & EAEAderx(1,1,lll,kkk,iii,2)) + enddo + enddo + enddo +C AEAb1 and AEAb2 +C Calculate the vectors and their derivatives in virtual-bond dihedral angles. +C They are needed only when the fifth- or the sixth-order cumulants are +C indluded. + IF (wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) THEN + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2(1,1,1)) + call matvec2(auxmat(1,1),Ub2der(1,i),AEAb2derg(1,2,1,1)) + call transpose2(AEAderg(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1derg(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2derg(1,1,1,1)) + call matvec2(AEA(1,1,1),b1(1,itk1),AEAb1(1,2,1)) + call matvec2(AEAderg(1,1,1),b1(1,itk1),AEAb1derg(1,2,1)) + call matvec2(AEA(1,1,1),Ub2(1,k+1),AEAb2(1,2,1)) + call matvec2(AEAderg(1,1,1),Ub2(1,k+1),AEAb2derg(1,1,2,1)) + call matvec2(AEA(1,1,1),Ub2der(1,k+1),AEAb2derg(1,2,2,1)) + call transpose2(AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j),AEAb2(1,1,2)) + call matvec2(auxmat(1,1),Ub2der(1,j),AEAb2derg(1,2,1,2)) + call transpose2(AEAderg(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj),AEAb1derg(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j),AEAb2derg(1,1,1,2)) + call matvec2(AEA(1,1,2),b1(1,itl1),AEAb1(1,2,2)) + call matvec2(AEAderg(1,1,2),b1(1,itl1),AEAb1derg(1,2,2)) + call matvec2(AEA(1,1,2),Ub2(1,l+1),AEAb2(1,2,2)) + call matvec2(AEAderg(1,1,2),Ub2(1,l+1),AEAb2derg(1,1,2,2)) + call matvec2(AEA(1,1,2),Ub2der(1,l+1),AEAb2derg(1,2,2,2)) +C Calculate the Cartesian derivatives of the vectors. + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti), + & AEAb1derx(1,lll,kkk,iii,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i), + & AEAb2derx(1,lll,kkk,iii,1,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & AEAb1derx(1,lll,kkk,iii,2,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),Ub2(1,k+1), + & AEAb2derx(1,lll,kkk,iii,2,1)) + call transpose2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj), + & AEAb1derx(1,lll,kkk,iii,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j), + & AEAb2derx(1,lll,kkk,iii,1,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,itl1), + & AEAb1derx(1,lll,kkk,iii,2,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),Ub2(1,l+1), + & AEAb2derx(1,lll,kkk,iii,2,2)) + enddo + enddo + enddo + ENDIF +C End vectors + else +C Antiparallel orientation of the two CA-CA-CA frames. + if (i.gt.1) then + iti=itortyp(itype(i)) + else + iti=ntortyp+1 + endif + itk1=itortyp(itype(k+1)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif +C A2 kernel(j-1)T A1T + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.true.,EUg(1,1,j),EUgder(1,1,j), + & AEA(1,1,1),AEAderg(1,1,1),AEAderx(1,1,1,1,1,1)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0 .or. (wturn6.gt.0.0d0 .and. + & j.eq.i+4 .and. l.eq.i+3)) THEN + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.true.,EUgC(1,1,j),EUgCder(1,1,j), + & AECA(1,1,1),AECAderg(1,1,1),AECAderx(1,1,1,1,1,1)) + call kernel(aa2(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.true.,Ug2DtEUg(1,1,j), + & Ug2DtEUgder(1,1,1,j),ADtEA(1,1,1),ADtEAderg(1,1,1,1), + & ADtEAderx(1,1,1,1,1,1)) + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.true.,DtUg2EUg(1,1,j), + & DtUg2EUgder(1,1,1,j),ADtEA1(1,1,1),ADtEA1derg(1,1,1,1), + & ADtEA1derx(1,1,1,1,1,1)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,1,1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEA(1,1,1)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),EAEAderg(1,1,2,1)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & EAEAderx(1,1,lll,kkk,iii,1)) + enddo + enddo + enddo +C A2T kernel(i+1)T A1 + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),1,.true.,EUg(1,1,k),EUgder(1,1,k), + & AEA(1,1,2),AEAderg(1,1,2),AEAderx(1,1,1,1,1,2)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0 .or. (wturn6.gt.0.0d0 .and. + & j.eq.i+4 .and. l.eq.i+3)) THEN + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),1,.true.,EUgC(1,1,k),EUgCder(1,1,k), + & AECA(1,1,2),AECAderg(1,1,2),AECAderx(1,1,1,1,1,2)) + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),2,.true.,Ug2DtEUg(1,1,k), + & Ug2DtEUgder(1,1,1,k),ADtEA(1,1,2),ADtEAderg(1,1,1,2), + & ADtEAderx(1,1,1,1,1,2)) + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),2,.true.,DtUg2EUg(1,1,k), + & DtUg2EUgder(1,1,1,k),ADtEA1(1,1,2),ADtEA1derg(1,1,1,2), + & ADtEA1derx(1,1,1,1,1,2)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,j),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,2,2)) + call transpose2(EUg(1,1,j),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEA(1,1,2)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),EAEAderg(1,1,2,2)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & EAEAderx(1,1,lll,kkk,iii,2)) + enddo + enddo + enddo +C AEAb1 and AEAb2 +C Calculate the vectors and their derivatives in virtual-bond dihedral angles. +C They are needed only when the fifth- or the sixth-order cumulants are +C indluded. + IF (wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 .or. + & (wturn6.gt.0.0d0 .and. j.eq.i+4 .and. l.eq.i+3)) THEN + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2(1,1,1)) + call matvec2(auxmat(1,1),Ub2der(1,i),AEAb2derg(1,2,1,1)) + call transpose2(AEAderg(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1derg(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2derg(1,1,1,1)) + call matvec2(AEA(1,1,1),b1(1,itk1),AEAb1(1,2,1)) + call matvec2(AEAderg(1,1,1),b1(1,itk1),AEAb1derg(1,2,1)) + call matvec2(AEA(1,1,1),Ub2(1,k+1),AEAb2(1,2,1)) + call matvec2(AEAderg(1,1,1),Ub2(1,k+1),AEAb2derg(1,1,2,1)) + call matvec2(AEA(1,1,1),Ub2der(1,k+1),AEAb2derg(1,2,2,1)) + call transpose2(AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj1),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l),AEAb2(1,1,2)) + call matvec2(auxmat(1,1),Ub2der(1,l),AEAb2derg(1,2,1,2)) + call transpose2(AEAderg(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itl),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l),AEAb2derg(1,1,1,2)) + call matvec2(AEA(1,1,2),b1(1,itj1),AEAb1(1,2,2)) + call matvec2(AEAderg(1,1,2),b1(1,itj1),AEAb1derg(1,2,2)) + call matvec2(AEA(1,1,2),Ub2(1,j),AEAb2(1,2,2)) + call matvec2(AEAderg(1,1,2),Ub2(1,j),AEAb2derg(1,1,2,2)) + call matvec2(AEA(1,1,2),Ub2der(1,j),AEAb2derg(1,2,2,2)) +C Calculate the Cartesian derivatives of the vectors. + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti), + & AEAb1derx(1,lll,kkk,iii,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i), + & AEAb2derx(1,lll,kkk,iii,1,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & AEAb1derx(1,lll,kkk,iii,2,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),Ub2(1,k+1), + & AEAb2derx(1,lll,kkk,iii,2,1)) + call transpose2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itl), + & AEAb1derx(1,lll,kkk,iii,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l), + & AEAb2derx(1,lll,kkk,iii,1,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,itj1), + & AEAb1derx(1,lll,kkk,iii,2,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),Ub2(1,j), + & AEAb2derx(1,lll,kkk,iii,2,2)) + enddo + enddo + enddo + ENDIF +C End vectors + endif + return + end +C--------------------------------------------------------------------------- + subroutine kernel(aa1,aa2t,aa1derx,aa2tderx,nderg,transp, + & KK,KKderg,AKA,AKAderg,AKAderx) + implicit none + integer nderg + logical transp + double precision aa1(2,2),aa2t(2,2),aa1derx(2,2,3,5), + & aa2tderx(2,2,3,5),KK(2,2),KKderg(2,2,nderg),AKA(2,2), + & AKAderg(2,2,nderg),AKAderx(2,2,3,5,2) + integer iii,kkk,lll + integer jjj,mmm + logical lprn + common /kutas/ lprn + call prodmat3(aa1(1,1),aa2t(1,1),KK(1,1),transp,AKA(1,1)) + do iii=1,nderg + call prodmat3(aa1(1,1),aa2t(1,1),KKderg(1,1,iii),transp, + & AKAderg(1,1,iii)) + enddo +cd if (lprn) write (2,*) 'In kernel' + do kkk=1,5 +cd if (lprn) write (2,*) 'kkk=',kkk + do lll=1,3 + call prodmat3(aa1derx(1,1,lll,kkk),aa2t(1,1), + & KK(1,1),transp,AKAderx(1,1,lll,kkk,1)) +cd if (lprn) then +cd write (2,*) 'lll=',lll +cd write (2,*) 'iii=1' +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & (AKAderx(jjj,mmm,lll,kkk,1),mmm=1,2) +cd enddo +cd endif + call prodmat3(aa1(1,1),aa2tderx(1,1,lll,kkk), + & KK(1,1),transp,AKAderx(1,1,lll,kkk,2)) +cd if (lprn) then +cd write (2,*) 'lll=',lll +cd write (2,*) 'iii=2' +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & (AKAderx(jjj,mmm,lll,kkk,2),mmm=1,2) +cd enddo +cd endif + enddo + enddo + return + end +C--------------------------------------------------------------------------- + double precision function eello4(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision pizda(2,2),ggg1(3),ggg2(3) +cd if (i.ne.1 .or. j.ne.5 .or. k.ne.2 .or.l.ne.4) then +cd eello4=0.0d0 +cd return +cd endif +cd print *,'eello4:',i,j,k,l,jj,kk +cd write (2,*) 'i',i,' j',j,' k',k,' l',l +cd call checkint4(i,j,k,l,jj,kk,eel4_num) +cold eij=facont_hb(jj,i) +cold ekl=facont_hb(kk,k) +cold ekont=eij*ekl + eel4=-EAEA(1,1,1)-EAEA(2,2,1) +cd eel41=-EAEA(1,1,2)-EAEA(2,2,2) + gcorr_loc(k-1)=gcorr_loc(k-1) + & -ekont*(EAEAderg(1,1,1,1)+EAEAderg(2,2,1,1)) + if (l.eq.j+1) then + gcorr_loc(l-1)=gcorr_loc(l-1) + & -ekont*(EAEAderg(1,1,2,1)+EAEAderg(2,2,2,1)) + else + gcorr_loc(j-1)=gcorr_loc(j-1) + & -ekont*(EAEAderg(1,1,2,1)+EAEAderg(2,2,2,1)) + endif + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=-EAEAderx(1,1,lll,kkk,iii,1) + & -EAEAderx(2,2,lll,kkk,iii,1) +cd derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd gcorr_loc(l-1)=0.0d0 +cd gcorr_loc(j-1)=0.0d0 +cd gcorr_loc(k-1)=0.0d0 +cd eel4=1.0d0 +cd write (iout,*)'Contacts have occurred for peptide groups', +cd & i,j,' fcont:',eij,' eij',' and ',k,l, +cd & ' fcont ',ekl,' eel4=',eel4,' eel4_num',16*eel4_num + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel4*g_contij(ll,1) +cgrad ggg2(ll)=eel4*g_contij(ll,2) + glongij=eel4*g_contij(ll,1)+ekont*derx(ll,1,1) + glongkl=eel4*g_contij(ll,2)+ekont*derx(ll,1,2) +cgrad ghalf=0.5d0*ggg1(ll) + gradcorr(ll,i)=gradcorr(ll,i)+ekont*derx(ll,2,1) + gradcorr(ll,i+1)=gradcorr(ll,i+1)+ekont*derx(ll,3,1) + gradcorr(ll,j)=gradcorr(ll,j)+ekont*derx(ll,4,1) + gradcorr(ll,j1)=gradcorr(ll,j1)+ekont*derx(ll,5,1) + gradcorr_long(ll,j)=gradcorr_long(ll,j)+glongij + gradcorr_long(ll,i)=gradcorr_long(ll,i)-glongij +cgrad ghalf=0.5d0*ggg2(ll) + gradcorr(ll,k)=gradcorr(ll,k)+ekont*derx(ll,2,2) + gradcorr(ll,k+1)=gradcorr(ll,k+1)+ekont*derx(ll,3,2) + gradcorr(ll,l)=gradcorr(ll,l)+ekont*derx(ll,4,2) + gradcorr(ll,l1)=gradcorr(ll,l1)+ekont*derx(ll,5,2) + gradcorr_long(ll,l)=gradcorr_long(ll,l)+glongkl + gradcorr_long(ll,k)=gradcorr_long(ll,k)-glongkl + enddo +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,gcorr_loc(iii) +cd enddo + eello4=ekont*eel4 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello4',ekont*eel4 + return + end +C--------------------------------------------------------------------------- + double precision function eello5(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision pizda(2,2),auxmat(2,2),auxmat1(2,2),vv(2) + double precision ggg1(3),ggg2(3) +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel chains C +C C +C o o o o C +C /l\ / \ \ / \ / \ / C +C / \ / \ \ / \ / \ / C +C j| o |l1 | o | o| o | | o |o C +C \ |/k\| |/ \| / |/ \| |/ \| C +C \i/ \ / \ / / \ / \ C +C o k1 o C +C (I) (II) (III) (IV) C +C C +C eello5_1 eello5_2 eello5_3 eello5_4 C +C C +C Antiparallel chains C +C C +C o o o o C +C /j\ / \ \ / \ / \ / C +C / \ / \ \ / \ / \ / C +C j1| o |l | o | o| o | | o |o C +C \ |/k\| |/ \| / |/ \| |/ \| C +C \i/ \ / \ / / \ / \ C +C o k1 o C +C (I) (II) (III) (IV) C +C C +C eello5_1 eello5_2 eello5_3 eello5_4 C +C C +C o denotes a local interaction, vertical lines an electrostatic interaction. C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd if (i.ne.2 .or. j.ne.6 .or. k.ne.3 .or. l.ne.5) then +cd eello5=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO5: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l + itk=itortyp(itype(k)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) + eello5_1=0.0d0 + eello5_2=0.0d0 + eello5_3=0.0d0 + eello5_4=0.0d0 +cd call checkint5(i,j,k,l,jj,kk,eel5_1_num,eel5_2_num, +cd & eel5_3_num,eel5_4_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=facont_hb(jj,i) +cd ekl=facont_hb(kk,k) +cd ekont=eij*ekl +cd write (iout,*)'Contacts have occurred for peptide groups', +cd & i,j,' fcont:',eij,' eij',' and ',k,l +cd goto 1111 +C Contribution from the graph I. +cd write (2,*) 'AEA ',AEA(1,1,1),AEA(2,1,1),AEA(1,2,1),AEA(2,2,1) +cd write (2,*) 'AEAb2',AEAb2(1,1,1),AEAb2(2,1,1) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_1=scalar2(AEAb2(1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i)) +C Explicit gradient in virtual-dihedral angles. + if (i.gt.1) g_corr5_loc(i-1)=g_corr5_loc(i-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,i))) + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(AEA(1,1,1),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2(1,1,1),Ub2der(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + call matmat2(AEAderg(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + if (l.eq.j+1) then + if (l.lt.nres-1) g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + else + if (j.lt.nres-1) g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + endif +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i)) + enddo + enddo + enddo +c goto 1112 +c1111 continue +C Contribution from graph II + call transpose2(EE(1,1,itk),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_2=scalar2(AEAb1(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,k)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + if (l.eq.j+1) then + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k))) + else + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k))) + endif +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k)) + enddo + enddo + enddo +cd goto 1112 +cd1111 continue + if (l.eq.j+1) then +cd goto 1110 +C Parallel orientation +C Contribution from graph III + call transpose2(EUg(1,1,l),auxmat(1,1)) + call matmat2(AEA(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_3=scalar2(AEAb2(1,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,j))) + call matmat2(AEAderg(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j))) + call transpose2(EUgder(1,1,l),auxmat1(1,1)) + call matmat2(AEA(1,1,2),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2(1,1,2),Ub2der(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j)) + enddo + enddo + enddo +cd goto 1112 +C Contribution from graph IV +cd1110 continue + call transpose2(EE(1,1,itl),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_4=scalar2(AEAb1(1,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,l)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l)) + enddo + enddo + enddo + else +C Antiparallel orientation +C Contribution from graph III +c goto 1110 + call transpose2(EUg(1,1,j),auxmat(1,1)) + call matmat2(AEA(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_3=scalar2(AEAb2(1,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,l))) + call matmat2(AEAderg(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l))) + call transpose2(EUgder(1,1,j),auxmat1(1,1)) + call matmat2(AEA(1,1,2),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2(1,1,2),Ub2der(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l)) + enddo + enddo + enddo +cd goto 1112 +C Contribution from graph IV +1110 continue + call transpose2(EE(1,1,itj),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_4=scalar2(AEAb1(1,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,j)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j)) + enddo + enddo + enddo + endif +1112 continue + eel5=eello5_1+eello5_2+eello5_3+eello5_4 +cd if (i.eq.2 .and. j.eq.8 .and. k.eq.3 .and. l.eq.7) then +cd write (2,*) 'ijkl',i,j,k,l +cd write (2,*) 'eello5_1',eello5_1,' eello5_2',eello5_2, +cd & ' eello5_3',eello5_3,' eello5_4',eello5_4 +cd endif +cd write(iout,*) 'eello5_1',eello5_1,' eel5_1_num',16*eel5_1_num +cd write(iout,*) 'eello5_2',eello5_2,' eel5_2_num',16*eel5_2_num +cd write(iout,*) 'eello5_3',eello5_3,' eel5_3_num',16*eel5_3_num +cd write(iout,*) 'eello5_4',eello5_4,' eel5_4_num',16*eel5_4_num + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 +cd write (2,*) 'eij',eij,' ekl',ekl,' ekont',ekont +C 2/11/08 AL Gradients over DC's connecting interacting sites will be +C summed up outside the subrouine as for the other subroutines +C handling long-range interactions. The old code is commented out +C with "cgrad" to keep track of changes. + do ll=1,3 +cgrad ggg1(ll)=eel5*g_contij(ll,1) +cgrad ggg2(ll)=eel5*g_contij(ll,2) + gradcorr5ij=eel5*g_contij(ll,1)+ekont*derx(ll,1,1) + gradcorr5kl=eel5*g_contij(ll,2)+ekont*derx(ll,1,2) +c write (iout,'(a,3i3,a,5f8.3,2i3,a,5f8.3,a,f8.3)') +c & "ecorr5",ll,i,j," derx",derx(ll,2,1),derx(ll,3,1),derx(ll,4,1), +c & derx(ll,5,1),k,l," derx",derx(ll,2,2),derx(ll,3,2), +c & derx(ll,4,2),derx(ll,5,2)," ekont",ekont +c write (iout,'(a,3i3,a,3f8.3,2i3,a,3f8.3)') +c & "ecorr5",ll,i,j," gradcorr5",g_contij(ll,1),derx(ll,1,1), +c & gradcorr5ij, +c & k,l," gradcorr5",g_contij(ll,2),derx(ll,1,2),gradcorr5kl +cold ghalf=0.5d0*eel5*ekl*gacont_hbr(ll,jj,i) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr5(ll,i)=gradcorr5(ll,i)+ekont*derx(ll,2,1) + gradcorr5(ll,i+1)=gradcorr5(ll,i+1)+ekont*derx(ll,3,1) + gradcorr5(ll,j)=gradcorr5(ll,j)+ekont*derx(ll,4,1) + gradcorr5(ll,j1)=gradcorr5(ll,j1)+ekont*derx(ll,5,1) + gradcorr5_long(ll,j)=gradcorr5_long(ll,j)+gradcorr5ij + gradcorr5_long(ll,i)=gradcorr5_long(ll,i)-gradcorr5ij +cold ghalf=0.5d0*eel5*eij*gacont_hbr(ll,kk,k) +cgrad ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gradcorr5(ll,k)=gradcorr5(ll,k)+ghalf+ekont*derx(ll,2,2) + gradcorr5(ll,k+1)=gradcorr5(ll,k+1)+ekont*derx(ll,3,2) + gradcorr5(ll,l)=gradcorr5(ll,l)+ghalf+ekont*derx(ll,4,2) + gradcorr5(ll,l1)=gradcorr5(ll,l1)+ekont*derx(ll,5,2) + gradcorr5_long(ll,l)=gradcorr5_long(ll,l)+gradcorr5kl + gradcorr5_long(ll,k)=gradcorr5_long(ll,k)-gradcorr5kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*ekl*gacont_hbr(ll,jj,i) +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*eij*gacont_hbr(ll,kk,k) +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +c1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr5_loc(iii) +cd enddo + eello5=ekont*eel5 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello5',ekont*eel5 + return + end +c-------------------------------------------------------------------------- + double precision function eello6(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision ggg1(3),ggg2(3) +cd if (i.ne.1 .or. j.ne.3 .or. k.ne.2 .or. l.ne.4) then +cd eello6=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO6: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l + eello6_1=0.0d0 + eello6_2=0.0d0 + eello6_3=0.0d0 + eello6_4=0.0d0 + eello6_5=0.0d0 + eello6_6=0.0d0 +cd call checkint6(i,j,k,l,jj,kk,eel6_1_num,eel6_2_num, +cd & eel6_3_num,eel6_4_num,eel6_5_num,eel6_6_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=facont_hb(jj,i) +cd ekl=facont_hb(kk,k) +cd ekont=eij*ekl +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 + if (l.eq.j+1) then + eello6_1=eello6_graph1(i,j,k,l,1,.false.) + eello6_2=eello6_graph1(j,i,l,k,2,.false.) + eello6_3=eello6_graph2(i,j,k,l,jj,kk,.false.) + eello6_4=eello6_graph4(i,j,k,l,jj,kk,1,.false.) + eello6_5=eello6_graph4(j,i,l,k,jj,kk,2,.false.) + eello6_6=eello6_graph3(i,j,k,l,jj,kk,.false.) + else + eello6_1=eello6_graph1(i,j,k,l,1,.false.) + eello6_2=eello6_graph1(l,k,j,i,2,.true.) + eello6_3=eello6_graph2(i,l,k,j,jj,kk,.true.) + eello6_4=eello6_graph4(i,j,k,l,jj,kk,1,.false.) + if (wturn6.eq.0.0d0 .or. j.ne.i+4) then + eello6_5=eello6_graph4(l,k,j,i,kk,jj,2,.true.) + else + eello6_5=0.0d0 + endif + eello6_6=eello6_graph3(i,l,k,j,jj,kk,.true.) + endif +C If turn contributions are considered, they will be handled separately. + eel6=eello6_1+eello6_2+eello6_3+eello6_4+eello6_5+eello6_6 +cd write(iout,*) 'eello6_1',eello6_1!,' eel6_1_num',16*eel6_1_num +cd write(iout,*) 'eello6_2',eello6_2!,' eel6_2_num',16*eel6_2_num +cd write(iout,*) 'eello6_3',eello6_3!,' eel6_3_num',16*eel6_3_num +cd write(iout,*) 'eello6_4',eello6_4!,' eel6_4_num',16*eel6_4_num +cd write(iout,*) 'eello6_5',eello6_5!,' eel6_5_num',16*eel6_5_num +cd write(iout,*) 'eello6_6',eello6_6!,' eel6_6_num',16*eel6_6_num +cd goto 1112 + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel6*g_contij(ll,1) +cgrad ggg2(ll)=eel6*g_contij(ll,2) +cold ghalf=0.5d0*eel6*ekl*gacont_hbr(ll,jj,i) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr6ij=eel6*g_contij(ll,1)+ekont*derx(ll,1,1) + gradcorr6kl=eel6*g_contij(ll,2)+ekont*derx(ll,1,2) + gradcorr6(ll,i)=gradcorr6(ll,i)+ekont*derx(ll,2,1) + gradcorr6(ll,i+1)=gradcorr6(ll,i+1)+ekont*derx(ll,3,1) + gradcorr6(ll,j)=gradcorr6(ll,j)+ekont*derx(ll,4,1) + gradcorr6(ll,j1)=gradcorr6(ll,j1)+ekont*derx(ll,5,1) + gradcorr6_long(ll,j)=gradcorr6_long(ll,j)+gradcorr6ij + gradcorr6_long(ll,i)=gradcorr6_long(ll,i)-gradcorr6ij +cgrad ghalf=0.5d0*ggg2(ll) +cold ghalf=0.5d0*eel6*eij*gacont_hbr(ll,kk,k) +cd ghalf=0.0d0 + gradcorr6(ll,k)=gradcorr6(ll,k)+ekont*derx(ll,2,2) + gradcorr6(ll,k+1)=gradcorr6(ll,k+1)+ekont*derx(ll,3,2) + gradcorr6(ll,l)=gradcorr6(ll,l)+ekont*derx(ll,4,2) + gradcorr6(ll,l1)=gradcorr6(ll,l1)+ekont*derx(ll,5,2) + gradcorr6_long(ll,l)=gradcorr6_long(ll,l)+gradcorr6kl + gradcorr6_long(ll,k)=gradcorr6_long(ll,k)-gradcorr6kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*ekl*gacont_hbr(ll,jj,i) +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*eij*gacont_hbr(ll,kk,k) +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + eello6=ekont*eel6 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello6',ekont*eel6 + return + end +c-------------------------------------------------------------------------- + double precision function eello6_graph1(i,j,k,l,imat,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vv(2),vv1(2),pizda(2,2),auxmat(2,2),pizda1(2,2) + logical swap + logical lprn + common /kutas/ lprn +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C Parallel Antiparallel +C +C o o +C /l\ /j\ +C / \ / \ +C /| o | | o |\ +C \ j|/k\| / \ |/k\|l / +C \ / \ / \ / \ / +C o o o o +C i i +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + itk=itortyp(itype(k)) + s1= scalar2(AEAb1(1,2,imat),CUgb2(1,i)) + s2=-scalar2(AEAb2(1,1,imat),Ug2Db1t(1,k)) + s3= scalar2(AEAb2(1,1,imat),CUgb2(1,k)) + call transpose2(EUgC(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + s4=0.5d0*scalar2(vv1(1),Dtobr2(1,i)) + vv(1)=AEAb1(1,2,imat)*b1(1,itk)-AEAb1(2,2,imat)*b1(2,itk) + vv(2)=AEAb1(1,2,imat)*b1(2,itk)+AEAb1(2,2,imat)*b1(1,itk) + s5=scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4', s4,' s5',s5 + eello6_graph1=-0.5d0*(s1+s2+s3+s4+s5) + if (i.gt.1) g_corr6_loc(i-1)=g_corr6_loc(i-1) + & -0.5d0*ekont*(scalar2(AEAb1(1,2,imat),CUgb2der(1,i)) + & -scalar2(AEAb2derg(1,2,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,2,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2der(1,i)) + & +scalar2(vv(1),Dtobr2der(1,i))) + call matmat2(AEAderg(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + vv(1)=AEAb1derg(1,2,imat)*b1(1,itk)-AEAb1derg(2,2,imat)*b1(2,itk) + vv(2)=AEAb1derg(1,2,imat)*b1(2,itk)+AEAb1derg(2,2,imat)*b1(1,itk) + if (l.eq.j+1) then + g_corr6_loc(l-1)=g_corr6_loc(l-1) + & +ekont*(-0.5d0*(scalar2(AEAb1derg(1,2,imat),CUgb2(1,i)) + & -scalar2(AEAb2derg(1,1,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,1,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i))+scalar2(vv(1),Dtobr2(1,i)))) + else + g_corr6_loc(j-1)=g_corr6_loc(j-1) + & +ekont*(-0.5d0*(scalar2(AEAb1derg(1,2,imat),CUgb2(1,i)) + & -scalar2(AEAb2derg(1,1,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,1,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i))+scalar2(vv(1),Dtobr2(1,i)))) + endif + call transpose2(EUgCder(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + if (k.gt.1) g_corr6_loc(k-1)=g_corr6_loc(k-1) + & +ekont*(-0.5d0*(-scalar2(AEAb2(1,1,imat),Ug2Db1tder(1,k)) + & +scalar2(AEAb2(1,1,imat),CUgb2der(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i)))) + do iii=1,2 + if (swap) then + ind=3-iii + else + ind=iii + endif + do kkk=1,5 + do lll=1,3 + s1= scalar2(AEAb1derx(1,lll,kkk,iii,2,imat),CUgb2(1,i)) + s2=-scalar2(AEAb2derx(1,lll,kkk,iii,1,imat),Ug2Db1t(1,k)) + s3= scalar2(AEAb2derx(1,lll,kkk,iii,1,imat),CUgb2(1,k)) + call transpose2(EUgC(1,1,k),auxmat(1,1)) + call matmat2(AEAderx(1,1,lll,kkk,iii,imat),auxmat(1,1), + & pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + s4=0.5d0*scalar2(vv1(1),Dtobr2(1,i)) + vv(1)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(1,itk) + & -AEAb1derx(2,lll,kkk,iii,2,imat)*b1(2,itk) + vv(2)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(2,itk) + & +AEAb1derx(2,lll,kkk,iii,2,imat)*b1(1,itk) + s5=scalar2(vv(1),Dtobr2(1,i)) + derx(lll,kkk,ind)=derx(lll,kkk,ind)-0.5d0*(s1+s2+s3+s4+s5) + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello6_graph2(i,j,k,l,jj,kk,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + logical swap + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2), + & auxvec1(2),auxvec2(2),auxmat1(2,2) + logical lprn + common /kutas/ lprn +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel Antiparallel C +C C +C o o C +C \ /l\ /j\ / C +C \ / \ / \ / C +C o| o | | o |o C +C \ j|/k\| \ |/k\|l C +C \ / \ \ / \ C +C o o C +C i i C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd write (2,*) 'eello6_graph2: i,',i,' j',j,' k',k,' l',l +C AL 7/4/01 s1 would occur in the sixth-order moment, +C but not in a cluster cumulant +#ifdef MOMENT + s1=dip(1,jj,i)*dip(1,kk,k) +#endif + call matvec2(ADtEA1(1,1,1),Ub2(1,k),auxvec(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matvec2(ADtEA(1,1,2),Ub2(1,l),auxvec1(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec1(1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(ADtEA1(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 'eello6_graph2:','s1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + eello6_graph2=-(s1+s2+s3+s4) +#else + eello6_graph2=-(s2+s3+s4) +#endif +c eello6_graph2=-s3 +C Derivatives in gamma(i-1) + if (i.gt.1) then +#ifdef MOMENT + s1=dipderg(1,jj,i)*dip(1,kk,k) +#endif + s2=-0.5d0*scalar2(Ub2der(1,i),auxvec(1)) + call matvec2(ADtEAderg(1,1,1,2),Ub2(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + s4=-0.25d0*scalar2(vv(1),Dtobr2der(1,i)) +#ifdef MOMENT + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s2+s3+s4) +#endif +c g_corr6_loc(i-1)=g_corr6_loc(i-1)-s3 + endif +C Derivatives in gamma(k-1) +#ifdef MOMENT + s1=dip(1,jj,i)*dipderg(1,kk,k) +#endif + call matvec2(ADtEA1(1,1,1),Ub2der(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + call matvec2(ADtEAderg(1,1,2,2),Ub2(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(ADtEA1(1,1,1),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s2+s3+s4) +#endif +c g_corr6_loc(k-1)=g_corr6_loc(k-1)-s3 +C Derivatives in gamma(j-1) or gamma(l-1) + if (j.gt.1) then +#ifdef MOMENT + s1=dipderg(3,jj,i)*dip(1,kk,k) +#endif + call matvec2(ADtEA1derg(1,1,1,1),Ub2(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2der(1,j),auxvec1(1)) + call matmat2(ADtEA1derg(1,1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + if (swap) then + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*s1 + else + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*s1 + endif +#endif + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*(s2+s3+s4) +c g_corr6_loc(j-1)=g_corr6_loc(j-1)-s3 + endif +C Derivatives in gamma(l-1) or gamma(j-1) + if (l.gt.1) then +#ifdef MOMENT + s1=dip(1,jj,i)*dipderg(3,kk,k) +#endif + call matvec2(ADtEA1derg(1,1,2,1),Ub2(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + call matvec2(ADtEA(1,1,2),Ub2der(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + call matmat2(ADtEA1derg(1,1,2,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + if (swap) then + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*s1 + else + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*s1 + endif +#endif + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s3+s4) +c g_corr6_loc(l-1)=g_corr6_loc(l-1)-s3 + endif +C Cartesian derivatives. + if (lprn) then + write (2,*) 'In eello6_graph2' + do iii=1,2 + write (2,*) 'iii=',iii + do kkk=1,5 + write (2,*) 'kkk=',kkk + do jjj=1,2 + write (2,'(3(2f10.5),5x)') + & ((ADtEA1derx(jjj,mmm,lll,kkk,iii,1),mmm=1,2),lll=1,3) + enddo + enddo + enddo + endif + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + s1=dipderx(lll,kkk,1,jj,i)*dip(1,kk,k) + else + s1=dip(1,jj,i)*dipderx(lll,kkk,1,kk,k) + endif +#endif + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,1),Ub2(1,k), + & auxvec(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matvec2(ADtEAderx(1,1,lll,kkk,iii,2),Ub2(1,l), + & auxvec(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec(1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(ADtEA1derx(1,1,lll,kkk,iii,1),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (swap) then + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello6_graph3(i,j,k,l,jj,kk,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2) + logical swap +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel Antiparallel C +C C +C o o C +C /l\ / \ /j\ C +C / \ / \ / \ C +C /| o |o o| o |\ C +C j|/k\| / |/k\|l / C +C / \ / / \ / C +C / o / o C +C i i C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C 4/7/01 AL Component s1 was removed, because it pertains to the respective +C energy moment and not to the cluster cumulant. + iti=itortyp(itype(i)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + itk=itortyp(itype(k)) + itk1=itortyp(itype(k+1)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +#ifdef MOMENT + s1=dip(4,jj,i)*dip(4,kk,k) +#endif + call matvec2(AECA(1,1,1),b1(1,itk1),auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matvec2(AECA(1,1,2),b1(1,itl1),auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + call transpose2(EE(1,1,itk),auxmat(1,1)) + call matmat2(auxmat(1,1),AECA(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) +cd write (2,*) 'eello6_graph3:','s1',s1,' s2',s2,' s3',s3,' s4',s4, +cd & "sum",-(s2+s3+s4) +#ifdef MOMENT + eello6_graph3=-(s1+s2+s3+s4) +#else + eello6_graph3=-(s2+s3+s4) +#endif +c eello6_graph3=-s4 +C Derivatives in gamma(k-1) + call matvec2(AECAderg(1,1,2),b1(1,itl1),auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + s4=-0.25d0*scalar2(vv(1),Ctobrder(1,k)) + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s3+s4) +C Derivatives in gamma(l-1) + call matvec2(AECAderg(1,1,1),b1(1,itk1),auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matmat2(auxmat(1,1),AECAderg(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s4) +C Cartesian derivatives. + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + s1=dipderx(lll,kkk,4,jj,i)*dip(4,kk,k) + else + s1=dip(4,jj,i)*dipderx(lll,kkk,4,kk,k) + endif +#endif + call matvec2(AECAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matvec2(AECAderx(1,1,lll,kkk,iii,2),b1(1,itl1), + & auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + call matmat2(auxmat(1,1),AECAderx(1,1,lll,kkk,iii,1), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (swap) then + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif +c derx(lll,kkk,iii)=derx(lll,kkk,iii)-s4 + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello6_graph4(i,j,k,l,jj,kk,imat,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2), + & auxvec1(2),auxmat1(2,2) + logical swap +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel Antiparallel C +C C +C o o C +C /l\ / \ /j\ C +C / \ / \ / \ C +C /| o |o o| o |\ C +C \ j|/k\| \ |/k\|l C +C \ / \ \ / \ C +C o \ o \ C +C i i C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C 4/7/01 AL Component s1 was removed, because it pertains to the respective +C energy moment and not to the cluster cumulant. +cd write (2,*) 'eello_graph4: wturn6',wturn6 + iti=itortyp(itype(i)) + itj=itortyp(itype(j)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + itk=itortyp(itype(k)) + if (k.lt.nres-1) then + itk1=itortyp(itype(k+1)) + else + itk1=ntortyp+1 + endif + itl=itortyp(itype(l)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +cd write (2,*) 'eello6_graph4:','i',i,' j',j,' k',k,' l',l +cd write (2,*) 'iti',iti,' itj',itj,' itj1',itj1,' itk',itk, +cd & ' itl',itl,' itl1',itl1 +#ifdef MOMENT + if (imat.eq.1) then + s1=dip(3,jj,i)*dip(3,kk,k) + else + s1=dip(2,jj,j)*dip(2,kk,l) + endif +#endif + call matvec2(AECA(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1(1,1,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1(1,1,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(AECA(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 'eello6_graph4:','s1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + eello6_graph4=-(s1+s2+s3+s4) +#else + eello6_graph4=-(s2+s3+s4) +#endif +C Derivatives in gamma(i-1) + if (i.gt.1) then +#ifdef MOMENT + if (imat.eq.1) then + s1=dipderg(2,jj,i)*dip(3,kk,k) + else + s1=dipderg(4,jj,j)*dip(2,kk,l) + endif +#endif + s2=0.5d0*scalar2(Ub2der(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + s4=0.25d0*scalar2(vv(1),Dtobr2der(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +cd write (2,*) 'turn6 derivatives' +#ifdef MOMENT + gel_loc_turn6(i-1)=gel_loc_turn6(i-1)-ekont*(s1+s2+s3+s4) +#else + gel_loc_turn6(i-1)=gel_loc_turn6(i-1)-ekont*(s2+s3+s4) +#endif + else +#ifdef MOMENT + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s2+s3+s4) +#endif + endif + endif +C Derivatives in gamma(k-1) +#ifdef MOMENT + if (imat.eq.1) then + s1=dip(3,jj,i)*dipderg(2,kk,k) + else + s1=dip(2,jj,j)*dipderg(4,kk,l) + endif +#endif + call matvec2(AECA(1,1,imat),Ub2der(1,k),auxvec1(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec1(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(AECA(1,1,imat),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +#ifdef MOMENT + gel_loc_turn6(k-1)=gel_loc_turn6(k-1)-ekont*(s1+s2+s3+s4) +#else + gel_loc_turn6(k-1)=gel_loc_turn6(k-1)-ekont*(s2+s3+s4) +#endif + else +#ifdef MOMENT + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s2+s3+s4) +#endif + endif +C Derivatives in gamma(j-1) or gamma(l-1) + if (l.eq.j+1 .and. l.gt.1) then + call matvec2(AECAderg(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matmat2(AECAderg(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s4) + else if (j.gt.1) then + call matvec2(AECAderg(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matmat2(AECAderg(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then + gel_loc_turn6(j-1)=gel_loc_turn6(j-1)-ekont*(s2+s4) + else + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*(s2+s4) + endif + endif +C Cartesian derivatives. + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + if (imat.eq.1) then + s1=dipderx(lll,kkk,3,jj,i)*dip(3,kk,k) + else + s1=dipderx(lll,kkk,2,jj,j)*dip(2,kk,l) + endif + else + if (imat.eq.1) then + s1=dip(3,jj,i)*dipderx(lll,kkk,3,kk,k) + else + s1=dip(2,jj,j)*dipderx(lll,kkk,2,kk,l) + endif + endif +#endif + call matvec2(AECAderx(1,1,lll,kkk,iii,imat),Ub2(1,k), + & auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat), + & b1(1,itj1),auxvec(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec(1)) + else + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat), + & b1(1,itl1),auxvec(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec(1)) + endif + call matmat2(AECAderx(1,1,lll,kkk,iii,imat),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (swap) then + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +#ifdef MOMENT + derx_turn(lll,kkk,3-iii)=derx_turn(lll,kkk,3-iii) + & -(s1+s2+s4) +#else + derx_turn(lll,kkk,3-iii)=derx_turn(lll,kkk,3-iii) + & -(s2+s4) +#endif + derx_turn(lll,kkk,iii)=derx_turn(lll,kkk,iii)-s3 + else +#ifdef MOMENT + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-(s1+s2+s4) +#else + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-(s2+s4) +#endif + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif + else +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (l.eq.j+1) then + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + else + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + endif + endif + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello_turn6(i,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vtemp1(2),vtemp2(2),vtemp3(2),vtemp4(2), + & atemp(2,2),auxmat(2,2),achuj_temp(2,2),gtemp(2,2),gvec(2), + & ggg1(3),ggg2(3) + double precision vtemp1d(2),vtemp2d(2),vtemp3d(2),vtemp4d(2), + & atempd(2,2),auxmatd(2,2),achuj_tempd(2,2),gtempd(2,2),gvecd(2) +C 4/7/01 AL Components s1, s8, and s13 were removed, because they pertain to +C the respective energy moment and not to the cluster cumulant. + s1=0.0d0 + s8=0.0d0 + s13=0.0d0 +c + eello_turn6=0.0d0 + j=i+4 + k=i+1 + l=i+3 + iti=itortyp(itype(i)) + itk=itortyp(itype(k)) + itk1=itortyp(itype(k+1)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) +cd write (2,*) 'itk',itk,' itk1',itk1,' itl',itl,' itj',itj +cd write (2,*) 'i',i,' k',k,' j',j,' l',l +cd if (i.ne.1 .or. j.ne.3 .or. k.ne.2 .or. l.ne.4) then +cd eello6=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO6: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l +cd call checkint_turn6(i,jj,kk,eel_turn6_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx_turn(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 + eello6_5=eello6_graph4(l,k,j,i,kk,jj,2,.true.) +cd eello6_5=0.0d0 +cd write (2,*) 'eello6_5',eello6_5 +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matmat2(EUg(1,1,i+1),auxmat(1,1),auxmat(1,1)) + ss1=scalar2(Ub2(1,i+2),b1(1,itl)) + s1 = (auxmat(1,1)+auxmat(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1(1)) + call matvec2(AEA(1,1,1),vtemp1(1),vtemp1(1)) + s2 = scalar2(b1(1,itk),vtemp1(1)) +#ifdef MOMENT + call transpose2(AEA(1,1,2),atemp(1,1)) + call matmat2(atemp(1,1),EUg(1,1,i+4),atemp(1,1)) + call matvec2(Ug2(1,1,i+2),dd(1,1,itk1),vtemp2(1)) + s8 = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),Ub2(1,i+4),vtemp3(1)) + s12 = scalar2(Ub2(1,i+2),vtemp3(1)) +#ifdef MOMENT + call transpose2(a_chuj(1,1,kk,i+1),achuj_temp(1,1)) + call matmat2(achuj_temp(1,1),EUg(1,1,i+2),gtemp(1,1)) + call matmat2(gtemp(1,1),EUg(1,1,i+3),gtemp(1,1)) + call matvec2(a_chuj(1,1,jj,i),Ub2(1,i+4),vtemp4(1)) + ss13 = scalar2(b1(1,itk),vtemp4(1)) + s13 = (gtemp(1,1)+gtemp(2,2))*ss13 +#endif +c write (2,*) 's1,s2,s8,s12,s13',s1,s2,s8,s12,s13 +c s1=0.0d0 +c s2=0.0d0 +c s8=0.0d0 +c s12=0.0d0 +c s13=0.0d0 + eel_turn6 = eello6_5 - 0.5d0*(s1+s2+s12+s8+s13) +C Derivatives in gamma(i+2) + s1d =0.0d0 + s8d =0.0d0 +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmatd(1,1)) + call matmat2(EUgder(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 + call transpose2(AEAderg(1,1,2),atempd(1,1)) + call matmat2(atempd(1,1),EUg(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEAderg(1,1,2),auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 + gel_loc_turn6(i)=gel_loc_turn6(i)-0.5d0*ekont*(s1d+s8d+s12d) +C Derivatives in gamma(i+3) +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + ss1d=scalar2(Ub2der(1,i+2),b1(1,itl)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1d +#endif + call matvec2(EUgder(1,1,i+2),b1(1,itl),vtemp1d(1)) + call matvec2(AEA(1,1,1),vtemp1d(1),vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call matvec2(Ug2der(1,1,i+2),dd(1,1,itk1),vtemp2d(1)) + s8d = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,itl),vtemp2d(1)) +#endif + s12d = scalar2(Ub2der(1,i+2),vtemp3(1)) +#ifdef MOMENT + call matmat2(achuj_temp(1,1),EUgder(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUg(1,1,i+3),gtempd(1,1)) + s13d = (gtempd(1,1)+gtempd(2,2))*ss13 +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+1)=gel_loc_turn6(i+1) + & -0.5d0*ekont*(s1d+s2d+s8d+s12d+s13d) +#else + gel_loc_turn6(i+1)=gel_loc_turn6(i+1) + & -0.5d0*ekont*(s2d+s12d) +#endif +C Derivatives in gamma(i+4) + call matmat2(EUgder(1,1,i+3),AEA(1,1,2),auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +#ifdef MOMENT + call matmat2(achuj_temp(1,1),EUg(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUgder(1,1,i+3),gtempd(1,1)) + s13d = (gtempd(1,1)+gtempd(2,2))*ss13 +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +C s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+2)=gel_loc_turn6(i+2)-0.5d0*ekont*(s12d+s13d) +#else + gel_loc_turn6(i+2)=gel_loc_turn6(i+2)-0.5d0*ekont*(s12d) +#endif +C Derivatives in gamma(i+5) +#ifdef MOMENT + call transpose2(AEAderg(1,1,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1d(1)) + call matvec2(AEAderg(1,1,1),vtemp1d(1),vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call transpose2(AEA(1,1,2),atempd(1,1)) + call matmat2(atempd(1,1),EUgder(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matvec2(auxmat(1,1),Ub2der(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +#ifdef MOMENT + call matvec2(a_chuj(1,1,jj,i),Ub2der(1,i+4),vtemp4d(1)) + ss13d = scalar2(b1(1,itk),vtemp4d(1)) + s13d = (gtemp(1,1)+gtemp(2,2))*ss13d +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+3)=gel_loc_turn6(i+3) + & -0.5d0*ekont*(s1d+s2d+s8d+s12d+s13d) +#else + gel_loc_turn6(i+3)=gel_loc_turn6(i+3) + & -0.5d0*ekont*(s2d+s12d) +#endif +C Cartesian derivatives + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1(1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),vtemp1(1), + & vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call transpose2(AEAderx(1,1,lll,kkk,iii,2),atempd(1,1)) + call matmat2(atempd(1,1),EUg(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))* + & scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEAderx(1,1,lll,kkk,iii,2), + & auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + derx_turn(lll,kkk,iii) = derx_turn(lll,kkk,iii) + & - 0.5d0*(s1d+s2d) +#else + derx_turn(lll,kkk,iii) = derx_turn(lll,kkk,iii) + & - 0.5d0*s2d +#endif +#ifdef MOMENT + derx_turn(lll,kkk,3-iii) = derx_turn(lll,kkk,3-iii) + & - 0.5d0*(s8d+s12d) +#else + derx_turn(lll,kkk,3-iii) = derx_turn(lll,kkk,3-iii) + & - 0.5d0*s12d +#endif + enddo + enddo + enddo +#ifdef MOMENT + do kkk=1,5 + do lll=1,3 + call transpose2(a_chuj_der(1,1,lll,kkk,kk,i+1), + & achuj_tempd(1,1)) + call matmat2(achuj_tempd(1,1),EUg(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUg(1,1,i+3),gtempd(1,1)) + s13d=(gtempd(1,1)+gtempd(2,2))*ss13 + derx_turn(lll,kkk,2) = derx_turn(lll,kkk,2)-0.5d0*s13d + call matvec2(a_chuj_der(1,1,lll,kkk,jj,i),Ub2(1,i+4), + & vtemp4d(1)) + ss13d = scalar2(b1(1,itk),vtemp4d(1)) + s13d = (gtemp(1,1)+gtemp(2,2))*ss13d + derx_turn(lll,kkk,1) = derx_turn(lll,kkk,1)-0.5d0*s13d + enddo + enddo +#endif +cd write(iout,*) 'eel6_turn6',eel_turn6,' eel_turn6_num', +cd & 16*eel_turn6_num +cd goto 1112 + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel_turn6*g_contij(ll,1) +cgrad ggg2(ll)=eel_turn6*g_contij(ll,2) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gturn6ij=eel_turn6*g_contij(ll,1)+ekont*derx_turn(ll,1,1) + gturn6kl=eel_turn6*g_contij(ll,2)+ekont*derx_turn(ll,1,2) + gcorr6_turn(ll,i)=gcorr6_turn(ll,i)!+ghalf + & +ekont*derx_turn(ll,2,1) + gcorr6_turn(ll,i+1)=gcorr6_turn(ll,i+1)+ekont*derx_turn(ll,3,1) + gcorr6_turn(ll,j)=gcorr6_turn(ll,j)!+ghalf + & +ekont*derx_turn(ll,4,1) + gcorr6_turn(ll,j1)=gcorr6_turn(ll,j1)+ekont*derx_turn(ll,5,1) + gcorr6_turn_long(ll,j)=gcorr6_turn_long(ll,j)+gturn6ij + gcorr6_turn_long(ll,i)=gcorr6_turn_long(ll,i)-gturn6ij +cgrad ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gcorr6_turn(ll,k)=gcorr6_turn(ll,k)!+ghalf + & +ekont*derx_turn(ll,2,2) + gcorr6_turn(ll,k+1)=gcorr6_turn(ll,k+1)+ekont*derx_turn(ll,3,2) + gcorr6_turn(ll,l)=gcorr6_turn(ll,l)!+ghalf + & +ekont*derx_turn(ll,4,2) + gcorr6_turn(ll,l1)=gcorr6_turn(ll,l1)+ekont*derx_turn(ll,5,2) + gcorr6_turn_long(ll,l)=gcorr6_turn_long(ll,l)+gturn6kl + gcorr6_turn_long(ll,k)=gcorr6_turn_long(ll,k)-gturn6kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + eello_turn6=ekont*eel_turn6 +cd write (2,*) 'ekont',ekont +cd write (2,*) 'eel_turn6',ekont*eel_turn6 + return + end + +C----------------------------------------------------------------------------- + double precision function scalar(u,v) +!DIR$ INLINEALWAYS scalar +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::scalar +#endif + implicit none + double precision u(3),v(3) +cd double precision sc +cd integer i +cd sc=0.0d0 +cd do i=1,3 +cd sc=sc+u(i)*v(i) +cd enddo +cd scalar=sc + + scalar=u(1)*v(1)+u(2)*v(2)+u(3)*v(3) + return + end +crc------------------------------------------------- + SUBROUTINE MATVEC2(A1,V1,V2) +!DIR$ INLINEALWAYS MATVEC2 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::MATVEC2 +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A1(2,2),V1(2),V2(2) +c DO 1 I=1,2 +c VI=0.0 +c DO 3 K=1,2 +c 3 VI=VI+A1(I,K)*V1(K) +c Vaux(I)=VI +c 1 CONTINUE + + vaux1=a1(1,1)*v1(1)+a1(1,2)*v1(2) + vaux2=a1(2,1)*v1(1)+a1(2,2)*v1(2) + + v2(1)=vaux1 + v2(2)=vaux2 + END +C--------------------------------------- + SUBROUTINE MATMAT2(A1,A2,A3) +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::MATMAT2 +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A1(2,2),A2(2,2),A3(2,2) +c DIMENSION AI3(2,2) +c DO J=1,2 +c A3IJ=0.0 +c DO K=1,2 +c A3IJ=A3IJ+A1(I,K)*A2(K,J) +c enddo +c A3(I,J)=A3IJ +c enddo +c enddo + + ai3_11=a1(1,1)*a2(1,1)+a1(1,2)*a2(2,1) + ai3_12=a1(1,1)*a2(1,2)+a1(1,2)*a2(2,2) + ai3_21=a1(2,1)*a2(1,1)+a1(2,2)*a2(2,1) + ai3_22=a1(2,1)*a2(1,2)+a1(2,2)*a2(2,2) + + A3(1,1)=AI3_11 + A3(2,1)=AI3_21 + A3(1,2)=AI3_12 + A3(2,2)=AI3_22 + END + +c------------------------------------------------------------------------- + double precision function scalar2(u,v) +!DIR$ INLINEALWAYS scalar2 + implicit none + double precision u(2),v(2) + double precision sc + integer i + scalar2=u(1)*v(1)+u(2)*v(2) + return + end + +C----------------------------------------------------------------------------- + + subroutine transpose2(a,at) +!DIR$ INLINEALWAYS transpose2 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::transpose2 +#endif + implicit none + double precision a(2,2),at(2,2) + at(1,1)=a(1,1) + at(1,2)=a(2,1) + at(2,1)=a(1,2) + at(2,2)=a(2,2) + return + end +c-------------------------------------------------------------------------- + subroutine transpose(n,a,at) + implicit none + integer n,i,j + double precision a(n,n),at(n,n) + do i=1,n + do j=1,n + at(j,i)=a(i,j) + enddo + enddo + return + end +C--------------------------------------------------------------------------- + subroutine prodmat3(a1,a2,kk,transp,prod) +!DIR$ INLINEALWAYS prodmat3 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::prodmat3 +#endif + implicit none + integer i,j + double precision a1(2,2),a2(2,2),a2t(2,2),kk(2,2),prod(2,2) + logical transp +crc double precision auxmat(2,2),prod_(2,2) + + if (transp) then +crc call transpose2(kk(1,1),auxmat(1,1)) +crc call matmat2(a1(1,1),auxmat(1,1),auxmat(1,1)) +crc call matmat2(auxmat(1,1),a2(1,1),prod_(1,1)) + + prod(1,1)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(1,2))*a2(1,1) + & +(a1(1,1)*kk(2,1)+a1(1,2)*kk(2,2))*a2(2,1) + prod(1,2)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(1,2))*a2(1,2) + & +(a1(1,1)*kk(2,1)+a1(1,2)*kk(2,2))*a2(2,2) + prod(2,1)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(1,2))*a2(1,1) + & +(a1(2,1)*kk(2,1)+a1(2,2)*kk(2,2))*a2(2,1) + prod(2,2)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(1,2))*a2(1,2) + & +(a1(2,1)*kk(2,1)+a1(2,2)*kk(2,2))*a2(2,2) + + else +crc call matmat2(a1(1,1),kk(1,1),auxmat(1,1)) +crc call matmat2(auxmat(1,1),a2(1,1),prod_(1,1)) + + prod(1,1)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(2,1))*a2(1,1) + & +(a1(1,1)*kk(1,2)+a1(1,2)*kk(2,2))*a2(2,1) + prod(1,2)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(2,1))*a2(1,2) + & +(a1(1,1)*kk(1,2)+a1(1,2)*kk(2,2))*a2(2,2) + prod(2,1)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(2,1))*a2(1,1) + & +(a1(2,1)*kk(1,2)+a1(2,2)*kk(2,2))*a2(2,1) + prod(2,2)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(2,1))*a2(1,2) + & +(a1(2,1)*kk(1,2)+a1(2,2)*kk(2,2))*a2(2,2) + + endif +c call transpose2(a2(1,1),a2t(1,1)) + +crc print *,transp +crc print *,((prod_(i,j),i=1,2),j=1,2) +crc print *,((prod(i,j),i=1,2),j=1,2) + + return + end + diff --git a/source/unres/src_Eshel/fitsq.f b/source/unres/src_Eshel/fitsq.f new file mode 100644 index 0000000..36cbd30 --- /dev/null +++ b/source/unres/src_Eshel/fitsq.f @@ -0,0 +1,364 @@ + subroutine fitsq(rms,x,y,nn,t,b,non_conv) + implicit real*8 (a-h,o-z) + include 'COMMON.IOUNITS' +c x and y are the vectors of coordinates (dimensioned (3,n)) of the two +c structures to be superimposed. nn is 3*n, where n is the number of +c points. t and b are respectively the translation vector and the +c rotation matrix that transforms the second set of coordinates to the +c frame of the first set. +c eta = machine-specific variable + + dimension x(3*nn),y(3*nn),t(3) + dimension b(3,3),q(3,3),r(3,3),v(3),xav(3),yav(3),e(3),c(3,3) + logical non_conv +c eta = z00100000 +c small=25.0*rmdcon(3) +c small=25.0*eta +c small=25.0*10.e-10 +c the following is a very lenient value for 'small' + small = 0.0001D0 + non_conv=.false. + fn=nn + do 10 i=1,3 + xav(i)=0.0D0 + yav(i)=0.0D0 + do 10 j=1,3 + 10 b(j,i)=0.0D0 + nc=0 +c + do 30 n=1,nn + do 20 i=1,3 +c write(iout,*)'x = ',x(nc+i),' y = ',y(nc+i) + xav(i)=xav(i)+x(nc+i)/fn + 20 yav(i)=yav(i)+y(nc+i)/fn + 30 nc=nc+3 +c + do i=1,3 + t(i)=yav(i)-xav(i) + enddo + + rms=0.0d0 + do n=1,nn + do i=1,3 + rms=rms+(y(3*(n-1)+i)-x(3*(n-1)+i)-t(i))**2 + enddo + enddo + rms=dabs(rms/fn) + +c write(iout,*)'xav = ',(xav(j),j=1,3) +c write(iout,*)'yav = ',(yav(j),j=1,3) +c write(iout,*)'t = ',(t(j),j=1,3) +c write(iout,*)'rms=',rms + if (rms.lt.small) return + + + nc=0 + rms=0.0D0 + do 50 n=1,nn + do 40 i=1,3 + rms=rms+((x(nc+i)-xav(i))**2+(y(nc+i)-yav(i))**2)/fn + do 40 j=1,3 + b(j,i)=b(j,i)+(x(nc+i)-xav(i))*(y(nc+j)-yav(j))/fn + 40 c(j,i)=b(j,i) + 50 nc=nc+3 + call sivade(b,q,r,d,non_conv) + sn3=dsign(1.0d0,d) + do 120 i=1,3 + do 120 j=1,3 + 120 b(j,i)=-q(j,1)*r(i,1)-q(j,2)*r(i,2)-sn3*q(j,3)*r(i,3) + call mvvad(b,xav,yav,t) + do 130 i=1,3 + do 130 j=1,3 + rms=rms+2.0*c(j,i)*b(j,i) + 130 b(j,i)=-b(j,i) + if (dabs(rms).gt.small) go to 140 +* write (6,301) + return + 140 if (rms.gt.0.0d0) go to 150 +c write (iout,303) rms + rms=0.0d0 +* stop +c 150 write (iout,302) dsqrt(rms) + 150 continue + return + 301 format (5x,'rms deviation negligible') + 302 format (5x,'rms deviation ',f14.6) + 303 format (//,5x,'negative ms deviation - ',f14.6) + end +c + subroutine sivade(x,q,r,dt,non_conv) + implicit real*8(a-h,o-z) +c computes q,e and r such that q(t)xr = diag(e) + dimension x(3,3),q(3,3),r(3,3),e(3) + dimension h(3,3),p(3,3),u(3,3),d(3) + logical non_conv +c eta = z00100000 +c write (2,*) "SIVADE" + nit = 0 + small=25.0*10.d-10 +c small=25.0*eta +c small=2.0*rmdcon(3) + xnrm=0.0d0 + do 20 i=1,3 + do 10 j=1,3 + xnrm=xnrm+x(j,i)*x(j,i) + u(j,i)=0.0d0 + r(j,i)=0.0d0 + 10 h(j,i)=0.0d0 + u(i,i)=1.0 + 20 r(i,i)=1.0 + xnrm=dsqrt(xnrm) + do 110 n=1,2 + xmax=0.0d0 + do 30 j=n,3 + 30 if (dabs(x(j,n)).gt.xmax) xmax=dabs(x(j,n)) + a=0.0d0 + do 40 j=n,3 + h(j,n)=x(j,n)/xmax + 40 a=a+h(j,n)*h(j,n) + a=dsqrt(a) + den=a*(a+dabs(h(n,n))) + d(n)=1.0/den + h(n,n)=h(n,n)+dsign(a,h(n,n)) + do 70 i=n,3 + s=0.0d0 + do 50 j=n,3 + 50 s=s+h(j,n)*x(j,i) + s=d(n)*s + do 60 j=n,3 + 60 x(j,i)=x(j,i)-s*h(j,n) + 70 continue + if (n.gt.1) go to 110 + xmax=dmax1(dabs(x(1,2)),dabs(x(1,3))) + h(2,3)=x(1,2)/xmax + h(3,3)=x(1,3)/xmax + a=dsqrt(h(2,3)*h(2,3)+h(3,3)*h(3,3)) + den=a*(a+dabs(h(2,3))) + d(3)=1.0/den + h(2,3)=h(2,3)+sign(a,h(2,3)) + do 100 i=1,3 + s=0.0d0 + do 80 j=2,3 + 80 s=s+h(j,3)*x(i,j) + s=d(3)*s + do 90 j=2,3 + 90 x(i,j)=x(i,j)-s*h(j,3) + 100 continue + 110 continue + do 130 i=1,3 + do 120 j=1,3 + 120 p(j,i)=-d(1)*h(j,1)*h(i,1) + 130 p(i,i)=1.0+p(i,i) + do 140 i=2,3 + do 140 j=2,3 + u(j,i)=u(j,i)-d(2)*h(j,2)*h(i,2) + 140 r(j,i)=r(j,i)-d(3)*h(j,3)*h(i,3) + call mmmul(p,u,q) + 150 np=1 + nq=1 + nit=nit+1 +c write (2,*) "nit",nit," e",(x(i,i),i=1,3) + if (nit.gt.10000) then + print '(a)','!!!! Over 10000 iterations in SIVADE!!!!!' + non_conv=.true. + return + endif + if (dabs(x(2,3)).gt.small*(dabs(x(2,2))+abs(x(3,3)))) go to 160 + x(2,3)=0.0d0 + nq=nq+1 + 160 if (dabs(x(1,2)).gt.small*(dabs(x(1,1))+dabs(x(2,2)))) go to 180 + x(1,2)=0.0d0 + if (x(2,3).ne.0.0d0) go to 170 + nq=nq+1 + go to 180 + 170 np=np+1 + 180 if (nq.eq.3) go to 310 + npq=4-np-nq +c write (2,*) "np",np," npq",npq + if (np.gt.npq) go to 230 + n0=0 + do 220 n=np,npq + nn=n+np-1 +c write (2,*) "nn",nn + if (dabs(x(nn,nn)).gt.small*xnrm) go to 220 + x(nn,nn)=0.0d0 + if (x(nn,nn+1).eq.0.0d0) go to 220 + n0=n0+1 +c write (2,*) "nn",nn + go to (190,210,220),nn + 190 do 200 j=2,3 + 200 call givns(x,q,1,j) + go to 220 + 210 call givns(x,q,2,3) + 220 continue +c write (2,*) "nn",nn," np",np," nq",nq," n0",n0 +c write (2,*) "x",(x(i,i),i=1,3) + if (n0.ne.0) go to 150 + 230 nn=3-nq + a=x(nn,nn)*x(nn,nn) + if (nn.gt.1) a=a+x(nn-1,nn)*x(nn-1,nn) + b=x(nn+1,nn+1)*x(nn+1,nn+1)+x(nn,nn+1)*x(nn,nn+1) + c=x(nn,nn)*x(nn,nn+1) + dd=0.5*(a-b) + xn2=c*c + rt=b-xn2/(dd+sign(dsqrt(dd*dd+xn2),dd)) + y=x(np,np)*x(np,np)-rt + z=x(np,np)*x(np,np+1) + do 300 n=np,nn +c write (2,*) "n",n," a",a," b",b," c",c," y",y," z",z + if (dabs(y).lt.dabs(z)) go to 240 + t=z/y + c=1.0/dsqrt(1.0d0+t*t) + s=c*t + go to 250 + 240 t=y/z + s=1.0/dsqrt(1.0d0+t*t) + c=s*t + 250 do 260 j=1,3 + v=x(j,n) + w=x(j,n+1) + x(j,n)=c*v+s*w + x(j,n+1)=-s*v+c*w + a=r(j,n) + b=r(j,n+1) + r(j,n)=c*a+s*b + 260 r(j,n+1)=-s*a+c*b + y=x(n,n) + z=x(n+1,n) + if (dabs(y).lt.dabs(z)) go to 270 + t=z/y + c=1.0/dsqrt(1.0+t*t) + s=c*t + go to 280 + 270 t=y/z + s=1.0/dsqrt(1.0+t*t) + c=s*t + 280 do 290 j=1,3 + v=x(n,j) + w=x(n+1,j) + a=q(j,n) + b=q(j,n+1) + x(n,j)=c*v+s*w + x(n+1,j)=-s*v+c*w + q(j,n)=c*a+s*b + 290 q(j,n+1)=-s*a+c*b + if (n.ge.nn) go to 300 + y=x(n,n+1) + z=x(n,n+2) + 300 continue + go to 150 + 310 do 320 i=1,3 + 320 e(i)=x(i,i) + nit=0 + 330 n0=0 + nit=nit+1 + if (nit.gt.10000) then + print '(a)','!!!! Over 10000 iterations in SIVADE!!!!!' + non_conv=.true. + return + endif +c write (2,*) "e",(e(i),i=1,3) + do 360 i=1,3 + if (e(i).ge.0.0d0) go to 350 + e(i)=-e(i) + do 340 j=1,3 + 340 q(j,i)=-q(j,i) + 350 if (i.eq.1) go to 360 + if (dabs(e(i)).lt.dabs(e(i-1))) go to 360 + call switch(i,1,q,r,e) + n0=n0+1 + 360 continue + if (n0.ne.0) go to 330 +c write (2,*) "e",(e(i),i=1,3) + if (dabs(e(3)).gt.small*xnrm) go to 370 + e(3)=0.0d0 + if (dabs(e(2)).gt.small*xnrm) go to 370 + e(2)=0.0d0 + 370 dt=det(q(1,1),q(1,2),q(1,3))*det(r(1,1),r(1,2),r(1,3)) +c write (2,*) "nit",nit +c write (2,501) (e(i),i=1,3) + return + 501 format (/,5x,'singular values - ',3e15.5) + end + subroutine givns(a,b,m,n) + implicit real*8 (a-h,o-z) + dimension a(3,3),b(3,3) + if (dabs(a(m,n)).lt.dabs(a(n,n))) go to 10 + t=a(n,n)/a(m,n) + s=1.0/dsqrt(1.0+t*t) + c=s*t + go to 20 + 10 t=a(m,n)/a(n,n) + c=1.0/dsqrt(1.0+t*t) + s=c*t + 20 do 30 j=1,3 + v=a(m,j) + w=a(n,j) + x=b(j,m) + y=b(j,n) + a(m,j)=c*v-s*w + a(n,j)=s*v+c*w + b(j,m)=c*x-s*y + 30 b(j,n)=s*x+c*y + return + end + subroutine switch(n,m,u,v,d) + implicit real*8 (a-h,o-z) + dimension u(3,3),v(3,3),d(3) + do 10 i=1,3 + tem=u(i,n) + u(i,n)=u(i,n-1) + u(i,n-1)=tem + if (m.eq.0) go to 10 + tem=v(i,n) + v(i,n)=v(i,n-1) + v(i,n-1)=tem + 10 continue + tem=d(n) + d(n)=d(n-1) + d(n-1)=tem + return + end + subroutine mvvad(b,xav,yav,t) + implicit real*8 (a-h,o-z) + dimension b(3,3),xav(3),yav(3),t(3) +c dimension a(3,3),b(3),c(3),d(3) +c do 10 j=1,3 +c d(j)=c(j) +c do 10 i=1,3 +c 10 d(j)=d(j)+a(j,i)*b(i) + do 10 j=1,3 + t(j)=yav(j) + do 10 i=1,3 + 10 t(j)=t(j)+b(j,i)*xav(i) + return + end + double precision function det (a,b,c) + implicit real*8 (a-h,o-z) + dimension a(3),b(3),c(3) + det=a(1)*(b(2)*c(3)-b(3)*c(2))+a(2)*(b(3)*c(1)-b(1)*c(3)) + 1 +a(3)*(b(1)*c(2)-b(2)*c(1)) + return + end + subroutine mmmul(a,b,c) + implicit real*8 (a-h,o-z) + dimension a(3,3),b(3,3),c(3,3) + do 10 i=1,3 + do 10 j=1,3 + c(i,j)=0.0d0 + do 10 k=1,3 + 10 c(i,j)=c(i,j)+a(i,k)*b(k,j) + return + end + subroutine matvec(uvec,tmat,pvec,nback) + implicit real*8 (a-h,o-z) + real*8 tmat(3,3),uvec(3,nback), pvec(3,nback) +c + do 2 j=1,nback + do 1 i=1,3 + uvec(i,j) = 0.0d0 + do 1 k=1,3 + 1 uvec(i,j)=uvec(i,j)+tmat(i,k)*pvec(k,j) + 2 continue + return + end diff --git a/source/unres/src_Eshel/gen_rand_conf.F b/source/unres/src_Eshel/gen_rand_conf.F new file mode 100644 index 0000000..6cc31ba --- /dev/null +++ b/source/unres/src_Eshel/gen_rand_conf.F @@ -0,0 +1,910 @@ + subroutine gen_rand_conf(nstart,*) +C Generate random conformation or chain cut and regrowth. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.MCM' + include 'COMMON.GEO' + include 'COMMON.CONTROL' + logical overlap,back,fail +cd print *,' CG Processor',me,' maxgen=',maxgen + maxsi=100 +cd write (iout,*) 'Gen_Rand_conf: nstart=',nstart + if (nstart.lt.5) then + it1=itype(2) + phi(4)=gen_phi(4,itype(2),itype(3)) +c write(iout,*)'phi(4)=',rad2deg*phi(4) + if (nstart.lt.3) theta(3)=gen_theta(itype(2),pi,phi(4)) +c write(iout,*)'theta(3)=',rad2deg*theta(3) + if (it1.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(it1,theta(3),alph(2),omeg(2),fail) + nsi=nsi+1 + enddo + if (nsi.gt.maxsi) return1 + endif ! it1.ne.10 + call orig_frame + i=4 + nstart=4 + else + i=nstart + nstart=max0(i,4) + endif + + maxnit=0 + + nit=0 + niter=0 + back=.false. + do while (i.le.nres .and. niter.lt.maxgen) + if (i.lt.nstart) then + if(iprint.gt.1) then + write (iout,'(/80(1h*)/2a/80(1h*))') + & 'Generation procedure went down to ', + & 'chain beginning. Cannot continue...' + write (*,'(/80(1h*)/2a/80(1h*))') + & 'Generation procedure went down to ', + & 'chain beginning. Cannot continue...' + endif + return1 + endif + it1=itype(i-1) + it2=itype(i-2) + it=itype(i) +c print *,'Gen_Rand_Conf: i=',i,' it=',it,' it1=',it1,' it2=',it2, +c & ' nit=',nit,' niter=',niter,' maxgen=',maxgen + phi(i+1)=gen_phi(i+1,it1,it) + if (back) then + phi(i)=gen_phi(i+1,it2,it1) +c print *,'phi(',i,')=',phi(i) + theta(i-1)=gen_theta(it2,phi(i-1),phi(i)) + if (it2.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(it2,theta(i-1),alph(i-2),omeg(i-2),fail) + nsi=nsi+1 + enddo + if (nsi.gt.maxsi) return1 + endif + call locate_next_res(i-1) + endif + theta(i)=gen_theta(it1,phi(i),phi(i+1)) + if (it1.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(it1,theta(i),alph(i-1),omeg(i-1),fail) + nsi=nsi+1 + enddo + if (nsi.gt.maxsi) return1 + endif + call locate_next_res(i) + if (overlap(i-1)) then + if (nit.lt.maxnit) then + back=.true. + nit=nit+1 + else + nit=0 + if (i.gt.3) then + back=.true. + i=i-1 + else + write (iout,'(a)') + & 'Cannot generate non-overlaping conformation. Increase MAXNIT.' + write (*,'(a)') + & 'Cannot generate non-overlaping conformation. Increase MAXNIT.' + return1 + endif + endif + else + back=.false. + nit=0 + i=i+1 + endif + niter=niter+1 + enddo + if (niter.ge.maxgen) then + write (iout,'(a,2i5)') + & 'Too many trials in conformation generation',niter,maxgen + write (*,'(a,2i5)') + & 'Too many trials in conformation generation',niter,maxgen + return1 + endif + do j=1,3 + c(j,nres+1)=c(j,1) + c(j,nres+nres)=c(j,nres) + enddo + return + end +c------------------------------------------------------------------------- + logical function overlap(i) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + data redfac /0.5D0/ + overlap=.false. + iti=itype(i) + if (iti.gt.ntyp) return +C Check for SC-SC overlaps. +cd print *,'nnt=',nnt,' nct=',nct + do j=nnt,i-1 + itj=itype(j) + if (j.lt.i-1 .or. ipot.ne.4) then + rcomp=sigmaii(iti,itj) + else + rcomp=sigma(iti,itj) + endif +cd print *,'j=',j + if (dist(nres+i,nres+j).lt.redfac*rcomp) then + overlap=.true. +c print *,'overlap, SC-SC: i=',i,' j=',j, +c & ' dist=',dist(nres+i,nres+j),' rcomp=', +c & rcomp + return + endif + enddo +C Check for overlaps between the added peptide group and the preceding +C SCs. + iteli=itel(i) + do j=1,3 + c(j,maxres2+1)=0.5D0*(c(j,i)+c(j,i+1)) + enddo + do j=nnt,i-2 + itj=itype(j) +cd print *,'overlap, p-Sc: i=',i,' j=',j, +cd & ' dist=',dist(nres+j,maxres2+1) + if (dist(nres+j,maxres2+1).lt.4.0D0*redfac) then + overlap=.true. + return + endif + enddo +C Check for overlaps between the added side chain and the preceding peptide +C groups. + do j=1,nnt-2 + do k=1,3 + c(k,maxres2+1)=0.5D0*(c(k,j)+c(k,j+1)) + enddo +cd print *,'overlap, SC-p: i=',i,' j=',j, +cd & ' dist=',dist(nres+i,maxres2+1) + if (dist(nres+i,maxres2+1).lt.4.0D0*redfac) then + overlap=.true. + return + endif + enddo +C Check for p-p overlaps + do j=1,3 + c(j,maxres2+2)=0.5D0*(c(j,i)+c(j,i+1)) + enddo + do j=nnt,i-2 + itelj=itel(j) + do k=1,3 + c(k,maxres2+2)=0.5D0*(c(k,j)+c(k,j+1)) + enddo +cd print *,'overlap, p-p: i=',i,' j=',j, +cd & ' dist=',dist(maxres2+1,maxres2+2) + if(iteli.ne.0.and.itelj.ne.0)then + if (dist(maxres2+1,maxres2+2).lt.rpp(iteli,itelj)*redfac) then + overlap=.true. + return + endif + endif + enddo + return + end +c-------------------------------------------------------------------------- + double precision function gen_phi(i,it1,it2) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.BOUNDS' +c gen_phi=ran_number(-pi,pi) +C 8/13/98 Generate phi using pre-defined boundaries + gen_phi=ran_number(phibound(1,i),phibound(2,i)) + return + end +c--------------------------------------------------------------------------- + double precision function gen_theta(it,gama,gama1) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + double precision y(2),z(2) + double precision theta_max,theta_min +c print *,'gen_theta: it=',it + theta_min=0.05D0*pi + theta_max=0.95D0*pi + if (dabs(gama).gt.dwapi) then + y(1)=dcos(gama) + y(2)=dsin(gama) + else + y(1)=0.0D0 + y(2)=0.0D0 + endif + if (dabs(gama1).gt.dwapi) then + z(1)=dcos(gama1) + z(2)=dsin(gama1) + else + z(1)=0.0D0 + z(2)=0.0D0 + endif + thet_pred_mean=a0thet(it) + do k=1,2 + thet_pred_mean=thet_pred_mean+athet(k,it)*y(k)+bthet(k,it)*z(k) + enddo + sig=polthet(3,it) + do j=2,0,-1 + sig=sig*thet_pred_mean+polthet(j,it) + enddo + sig=0.5D0/(sig*sig+sigc0(it)) + ak=dexp(gthet(1,it)- + &0.5D0*((gthet(2,it)-thet_pred_mean)/gthet(3,it))**2) +c print '(i5,5(1pe14.4))',it,(gthet(j,it),j=1,3) +c print '(5(1pe14.4))',thet_pred_mean,theta0(it),sig,sig0(it),ak + theta_temp=binorm(thet_pred_mean,theta0(it),sig,sig0(it),ak) + if (theta_temp.lt.theta_min) theta_temp=theta_min + if (theta_temp.gt.theta_max) theta_temp=theta_max + gen_theta=theta_temp +c print '(a)','Exiting GENTHETA.' + return + end +c------------------------------------------------------------------------- + subroutine gen_side(it,the,al,om,fail) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision MaxBoxLen /10.0D0/ + double precision Ap_inv(3,3),a(3,3),z(3,maxlob),W1(maxlob), + & sumW(0:maxlob),y(2),cm(2),eig(2),box(2,2),work(100),detAp(maxlob) + double precision eig_limit /1.0D-8/ + double precision Big /10.0D0/ + double precision vec(3,3) + logical lprint,fail,lcheck + lcheck=.false. + lprint=.false. + fail=.false. + if (the.eq.0.0D0 .or. the.eq.pi) then +#ifdef MPI + write (*,'(a,i4,a,i3,a,1pe14.5)') + & 'CG Processor:',me,' Error in GenSide: it=',it,' theta=',the +#else +cd write (iout,'(a,i3,a,1pe14.5)') +cd & 'Error in GenSide: it=',it,' theta=',the +#endif + fail=.true. + return + endif + tant=dtan(the-pipol) + nlobit=nlob(it) + if (lprint) then +#ifdef MPI + print '(a,i4,a)','CG Processor:',me,' Enter Gen_Side.' + write (iout,'(a,i4,a)') 'Processor:',me,' Enter Gen_Side.' +#endif + print *,'it=',it,' nlobit=',nlobit,' the=',the,' tant=',tant + write (iout,*) 'it=',it,' nlobit=',nlobit,' the=',the, + & ' tant=',tant + endif + do i=1,nlobit + zz1=tant-censc(1,i,it) + do k=1,3 + do l=1,3 + a(k,l)=gaussc(k,l,i,it) + enddo + enddo + detApi=a(2,2)*a(3,3)-a(2,3)**2 + Ap_inv(2,2)=a(3,3)/detApi + Ap_inv(2,3)=-a(2,3)/detApi + Ap_inv(3,2)=Ap_inv(2,3) + Ap_inv(3,3)=a(2,2)/detApi + if (lprint) then + write (*,'(/a,i2/)') 'Cluster #',i + write (*,'(3(1pe14.5),5x,1pe14.5)') + & ((a(l,k),l=1,3),censc(k,i,it),k=1,3) + write (iout,'(/a,i2/)') 'Cluster #',i + write (iout,'(3(1pe14.5),5x,1pe14.5)') + & ((a(l,k),l=1,3),censc(k,i,it),k=1,3) + endif + W1i=0.0D0 + do k=2,3 + do l=2,3 + W1i=W1i+a(k,1)*a(l,1)*Ap_inv(k,l) + enddo + enddo + W1i=a(1,1)-W1i + W1(i)=dexp(bsc(i,it)-0.5D0*W1i*zz1*zz1) +c if (lprint) write(*,'(a,3(1pe15.5)/)') +c & 'detAp, W1, anormi',detApi,W1i,anormi + do k=2,3 + zk=censc(k,i,it) + do l=2,3 + zk=zk+zz1*Ap_inv(k,l)*a(l,1) + enddo + z(k,i)=zk + enddo + detAp(i)=dsqrt(detApi) + enddo + + if (lprint) then + print *,'W1:',(w1(i),i=1,nlobit) + print *,'detAp:',(detAp(i),i=1,nlobit) + print *,'Z' + do i=1,nlobit + print '(i2,3f10.5)',i,(rad2deg*z(j,i),j=2,3) + enddo + write (iout,*) 'W1:',(w1(i),i=1,nlobit) + write (iout,*) 'detAp:',(detAp(i),i=1,nlobit) + write (iout,*) 'Z' + do i=1,nlobit + write (iout,'(i2,3f10.5)') i,(rad2deg*z(j,i),j=2,3) + enddo + endif + if (lcheck) then +C Writing the distribution just to check the procedure + fac=0.0D0 + dV=deg2rad**2*10.0D0 + sum=0.0D0 + sum1=0.0D0 + do i=1,nlobit + fac=fac+W1(i)/detAp(i) + enddo + fac=1.0D0/(2.0D0*fac*pi) +cd print *,it,'fac=',fac + do ial=90,180,2 + y(1)=deg2rad*ial + do iom=-180,180,5 + y(2)=deg2rad*iom + wart=0.0D0 + do i=1,nlobit + do j=2,3 + do k=2,3 + a(j-1,k-1)=gaussc(j,k,i,it) + enddo + enddo + y2=y(2) + + do iii=-1,1 + + y(2)=y2+iii*dwapi + + wykl=0.0D0 + do j=1,2 + do k=1,2 + wykl=wykl+a(j,k)*(y(j)-z(j+1,i))*(y(k)-z(k+1,i)) + enddo + enddo + wart=wart+W1(i)*dexp(-0.5D0*wykl) + + enddo + + y(2)=y2 + + enddo +c print *,'y',y(1),y(2),' fac=',fac + wart=fac*wart + write (20,'(2f10.3,1pd15.5)') y(1)*rad2deg,y(2)*rad2deg,wart + sum=sum+wart + sum1=sum1+1.0D0 + enddo + enddo +c print *,'it=',it,' sum=',sum*dV,' sum1=',sum1*dV + return + endif + +C Calculate the CM of the system +C + do i=1,nlobit + W1(i)=W1(i)/detAp(i) + enddo + sumW(0)=0.0D0 + do i=1,nlobit + sumW(i)=sumW(i-1)+W1(i) + enddo + cm(1)=z(2,1)*W1(1) + cm(2)=z(3,1)*W1(1) + do j=2,nlobit + cm(1)=cm(1)+z(2,j)*W1(j) + cm(2)=cm(2)+W1(j)*(z(3,1)+pinorm(z(3,j)-z(3,1))) + enddo + cm(1)=cm(1)/sumW(nlobit) + cm(2)=cm(2)/sumW(nlobit) + if (cm(1).gt.Big .or. cm(1).lt.-Big .or. + & cm(2).gt.Big .or. cm(2).lt.-Big) then +cd write (iout,'(a)') +cd & 'Unexpected error in GenSide - CM coordinates too large.' +cd write (iout,'(i5,2(1pe14.5))') it,cm(1),cm(2) +cd write (*,'(a)') +cd & 'Unexpected error in GenSide - CM coordinates too large.' +cd write (*,'(i5,2(1pe14.5))') it,cm(1),cm(2) + fail=.true. + return + endif +cd print *,'CM:',cm(1),cm(2) +C +C Find the largest search distance from CM +C + radmax=0.0D0 + do i=1,nlobit + do j=2,3 + do k=2,3 + a(j-1,k-1)=gaussc(j,k,i,it) + enddo + enddo +#ifdef NAG + call f02faf('N','U',2,a,3,eig,work,100,ifail) +#else + call djacob(2,3,10000,1.0d-10,a,vec,eig) +#endif +#ifdef MPI + if (lprint) then + print *,'*************** CG Processor',me + print *,'CM:',cm(1),cm(2) + write (iout,*) '*************** CG Processor',me + write (iout,*) 'CM:',cm(1),cm(2) + print '(A,8f10.5)','Eigenvalues: ',(1.0/dsqrt(eig(k)),k=1,2) + write (iout,'(A,8f10.5)') + & 'Eigenvalues: ',(1.0/dsqrt(eig(k)),k=1,2) + endif +#endif + if (eig(1).lt.eig_limit) then + write(iout,'(a)') + & 'From Mult_Norm: Eigenvalues of A are too small.' + write(*,'(a)') + & 'From Mult_Norm: Eigenvalues of A are too small.' + fail=.true. + return + endif + radius=0.0D0 +cd print *,'i=',i + do j=1,2 + radius=radius+pinorm(z(j+1,i)-cm(j))**2 + enddo + radius=dsqrt(radius)+3.0D0/dsqrt(eig(1)) + if (radius.gt.radmax) radmax=radius + enddo + if (radmax.gt.pi) radmax=pi +C +C Determine the boundaries of the search rectangle. +C + if (lprint) then + print '(a,4(1pe14.4))','W1: ',(W1(i),i=1,nlob(it) ) + print '(a,4(1pe14.4))','radmax: ',radmax + endif + box(1,1)=dmax1(cm(1)-radmax,0.0D0) + box(2,1)=dmin1(cm(1)+radmax,pi) + box(1,2)=cm(2)-radmax + box(2,2)=cm(2)+radmax + if (lprint) then +#ifdef MPI + print *,'CG Processor',me,' Array BOX:' +#else + print *,'Array BOX:' +#endif + print '(4(1pe14.4))',((box(k,j),k=1,2),j=1,2) + print '(a,4(1pe14.4))','sumW: ',(sumW(i),i=0,nlob(it) ) +#ifdef MPI + write (iout,*)'CG Processor',me,' Array BOX:' +#else + write (iout,*)'Array BOX:' +#endif + write(iout,'(4(1pe14.4))') ((box(k,j),k=1,2),j=1,2) + write(iout,'(a,4(1pe14.4))')'sumW: ',(sumW(i),i=0,nlob(it) ) + endif + if (box(1,2).lt.-MaxBoxLen .or. box(2,2).gt.MaxBoxLen) then +#ifdef MPI + write (iout,'(a,i4,a)') 'CG Processor:',me,': bad sampling box.' + write (*,'(a,i4,a)') 'CG Processor:',me,': bad sampling box.' +#else +c write (iout,'(a)') 'Bad sampling box.' +#endif + fail=.true. + return + endif + which_lobe=ran_number(0.0D0,sumW(nlobit)) +c print '(a,1pe14.4)','which_lobe=',which_lobe + do i=1,nlobit + if (sumW(i-1).le.which_lobe .and. sumW(i).ge.which_lobe) goto 1 + enddo + 1 ilob=i +c print *,'ilob=',ilob,' nlob=',nlob(it) + do i=2,3 + cm(i-1)=z(i,ilob) + do j=2,3 + a(i-1,j-1)=gaussc(i,j,ilob,it) + enddo + enddo +cd print '(a,i4,a)','CG Processor',me,' Calling MultNorm1.' + call mult_norm1(3,2,a,cm,box,y,fail) + if (fail) return + al=y(1) + om=pinorm(y(2)) +cd print *,'al=',al,' om=',om +cd stop + return + end +c--------------------------------------------------------------------------- + double precision function ran_number(x1,x2) +C Calculate a random real number from the range (x1,x2). + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + double precision x1,x2,fctor + data fctor /2147483647.0D0/ +#ifdef MPI + include "mpif.h" + include 'COMMON.SETUP' + ran_number=x1+(x2-x1)*prng_next(me) +#else + call vrnd(ix,1) + ran_number=x1+(x2-x1)*ix/fctor +#endif + return + end +c-------------------------------------------------------------------------- + integer function iran_num(n1,n2) +C Calculate a random integer number from the range (n1,n2). + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer n1,n2,ix + real fctor /2147483647.0/ +#ifdef MPI + include "mpif.h" + include 'COMMON.SETUP' + ix=n1+(n2-n1+1)*prng_next(me) + if (ix.lt.n1) ix=n1 + if (ix.gt.n2) ix=n2 + iran_num=ix +#else + call vrnd(ix,1) + ix=n1+(n2-n1+1)*(ix/fctor) + if (ix.gt.n2) ix=n2 + iran_num=ix +#endif + return + end +c-------------------------------------------------------------------------- + double precision function binorm(x1,x2,sigma1,sigma2,ak) + implicit real*8 (a-h,o-z) +c print '(a)','Enter BINORM.' + alowb=dmin1(x1-3.0D0*sigma1,x2-3.0D0*sigma2) + aupb=dmax1(x1+3.0D0*sigma1,x2+3.0D0*sigma2) + seg=sigma1/(sigma1+ak*sigma2) + alen=ran_number(0.0D0,1.0D0) + if (alen.lt.seg) then + binorm=anorm_distr(x1,sigma1,alowb,aupb) + else + binorm=anorm_distr(x2,sigma2,alowb,aupb) + endif +c print '(a)','Exiting BINORM.' + return + end +c----------------------------------------------------------------------- +c double precision function anorm_distr(x,sigma,alowb,aupb) +c implicit real*8 (a-h,o-z) +c print '(a)','Enter ANORM_DISTR.' +c 10 y=ran_number(alowb,aupb) +c expon=dexp(-0.5D0*((y-x)/sigma)**2) +c ran=ran_number(0.0D0,1.0D0) +c if (expon.lt.ran) goto 10 +c anorm_distr=y +c print '(a)','Exiting ANORM_DISTR.' +c return +c end +c----------------------------------------------------------------------- + double precision function anorm_distr(x,sigma,alowb,aupb) + implicit real*8 (a-h,o-z) +c to make a normally distributed deviate with zero mean and unit variance +c + integer iset + real fac,gset,rsq,v1,v2,ran1 + save iset,gset + data iset/0/ + if(iset.eq.0) then +1 v1=2.0d0*ran_number(0.0d0,1.0d0)-1.0d0 + v2=2.0d0*ran_number(0.0d0,1.0d0)-1.0d0 + rsq=v1**2+v2**2 + if(rsq.ge.1.d0.or.rsq.eq.0.0d0) goto 1 + fac=sqrt(-2.0d0*log(rsq)/rsq) + gset=v1*fac + gaussdev=v2*fac + iset=1 + else + gaussdev=gset + iset=0 + endif + anorm_distr=x+gaussdev*sigma + return + end +c------------------------------------------------------------------------ + subroutine mult_norm(lda,n,a,x,fail) +C +C Generate the vector X whose elements obey the multiple-normal distribution +C from exp(-0.5*X'AX). LDA is the leading dimension of the moment matrix A, +C n is the dimension of the problem. FAIL is set at .TRUE., if the smallest +C eigenvalue of the matrix A is close to 0. +C + implicit double precision (a-h,o-z) + double precision a(lda,n),x(n),eig(100),vec(3,3),work(100) + double precision eig_limit /1.0D-8/ + logical fail + fail=.false. +c print '(a)','Enter MULT_NORM.' +C +C Find the smallest eigenvalue of the matrix A. +C +c do i=1,n +c print '(8f10.5)',(a(i,j),j=1,n) +c enddo +#ifdef NAG + call f02faf('V','U',2,a,lda,eig,work,100,ifail) +#else + call djacob(2,lda,10000,1.0d-10,a,vec,eig) +#endif +c print '(8f10.5)',(eig(i),i=1,n) +C print '(a)' +c do i=1,n +c print '(8f10.5)',(a(i,j),j=1,n) +c enddo + if (eig(1).lt.eig_limit) then + print *,'From Mult_Norm: Eigenvalues of A are too small.' + fail=.true. + return + endif +C +C Generate points following the normal distributions along the principal +C axes of the moment matrix. Store in WORK. +C + do i=1,n + sigma=1.0D0/dsqrt(eig(i)) + alim=-3.0D0*sigma + work(i)=anorm_distr(0.0D0,sigma,-alim,alim) + enddo +C +C Transform the vector of normal variables back to the original basis. +C + do i=1,n + xi=0.0D0 + do j=1,n + xi=xi+a(i,j)*work(j) + enddo + x(i)=xi + enddo + return + end +c------------------------------------------------------------------------ + subroutine mult_norm1(lda,n,a,z,box,x,fail) +C +C Generate the vector X whose elements obey the multi-gaussian multi-dimensional +C distribution from sum_{i=1}^m W(i)exp[-0.5*X'(i)A(i)X(i)]. LDA is the +C leading dimension of the moment matrix A, n is the dimension of the +C distribution, nlob is the number of lobes. FAIL is set at .TRUE., if the +C smallest eigenvalue of the matrix A is close to 0. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + double precision a(lda,n),z(n),x(n),box(n,n) + double precision etmp + include 'COMMON.IOUNITS' +#ifdef MP + include 'COMMON.SETUP' +#endif + logical fail +C +C Generate points following the normal distributions along the principal +C axes of the moment matrix. Store in WORK. +C +cd print *,'CG Processor',me,' entered MultNorm1.' +cd print '(2(1pe14.4),3x,1pe14.4)',((a(i,j),j=1,2),z(i),i=1,2) +cd do i=1,n +cd print *,i,box(1,i),box(2,i) +cd enddo + istep = 0 + 10 istep = istep + 1 + if (istep.gt.10000) then +c write (iout,'(a,i4,2a)') 'CG Processor: ',me,': too many steps', +c & ' in MultNorm1.' +c write (*,'(a,i4,2a)') 'CG Processor: ',me,': too many steps', +c & ' in MultNorm1.' +c write (iout,*) 'box',box +c write (iout,*) 'a',a +c write (iout,*) 'z',z + fail=.true. + return + endif + do i=1,n + x(i)=ran_number(box(1,i),box(2,i)) + enddo + ww=0.0D0 + do i=1,n + xi=pinorm(x(i)-z(i)) + ww=ww+0.5D0*a(i,i)*xi*xi + do j=i+1,n + ww=ww+a(i,j)*xi*pinorm(x(j)-z(j)) + enddo + enddo + dec=ran_number(0.0D0,1.0D0) +c print *,(x(i),i=1,n),ww,dexp(-ww),dec +crc if (dec.gt.dexp(-ww)) goto 10 + if(-ww.lt.100) then + etmp=dexp(-ww) + else + return + endif + if (dec.gt.etmp) goto 10 +cd print *,'CG Processor',me,' exitting MultNorm1.' + return + end +c +crc-------------------------------------- + subroutine overlap_sc(scfail) +c Internal and cartesian coordinates must be consistent as input, +c and will be up-to-date on return. +c At the end of this procedure, scfail is true if there are +c overlapping residues left, or false otherwise (success) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.VAR' + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' + logical had_overlaps,fail,scfail + integer ioverlap(maxres),ioverlap_last + + had_overlaps=.false. + call overlap_sc_list(ioverlap,ioverlap_last) + if (ioverlap_last.gt.0) then + write (iout,*) '#OVERLAPing residues ',ioverlap_last + write (iout,'(20i4)') (ioverlap(k),k=1,ioverlap_last) + had_overlaps=.true. + endif + + maxsi=1000 + do k=1,1000 + if (ioverlap_last.eq.0) exit + + do ires=1,ioverlap_last + i=ioverlap(ires) + iti=itype(i) + if (iti.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(iti,theta(i+1),alph(i),omeg(i),fail) + nsi=nsi+1 + enddo + if(fail) goto 999 + endif + enddo + + call chainbuild + call overlap_sc_list(ioverlap,ioverlap_last) +c write (iout,*) 'Overlaping residues ',ioverlap_last, +c & (ioverlap(j),j=1,ioverlap_last) + enddo + + if (k.le.1000.and.ioverlap_last.eq.0) then + scfail=.false. + if (had_overlaps) then + write (iout,*) '#OVERLAPing all corrected after ',k, + & ' random generation' + endif + else + scfail=.true. + write (iout,*) '#OVERLAPing NOT all corrected ',ioverlap_last + write (iout,'(20i4)') (ioverlap(j),j=1,ioverlap_last) + endif + + return + + 999 continue + write (iout,'(a30,i5,a12,i4)') + & '#OVERLAP FAIL in gen_side after',maxsi, + & 'iter for RES',i + scfail=.true. + return + end + + subroutine overlap_sc_list(ioverlap,ioverlap_last) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.VAR' + include 'COMMON.CALC' + logical fail + integer ioverlap(maxres),ioverlap_last + data redfac /0.5D0/ + + ioverlap_last=0 +C Check for SC-SC overlaps and mark residues +c print *,'>>overlap_sc nnt=',nnt,' nct=',nct + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) + dsci_inv=dsc_inv(itypi) +c + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) + dscj_inv=dsc_inv(itypj) + sig0ij=sigma(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + if (j.gt.i+1) then + rcomp=sigmaii(itypi,itypj) + else + rcomp=sigma(itypi,itypj) + endif +c print '(2(a3,2i3),a3,2f10.5)', +c & ' i=',i,iti,' j=',j,itj,' d=',dist(nres+i,nres+j) +c & ,rcomp + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+sig0ij + +ct if ( 1.0/rij .lt. redfac*rcomp .or. +ct & rij_shift.le.0.0D0 ) then + if ( rij_shift.le.0.0D0 ) then +cd write (iout,'(a,i3,a,i3,a,f10.5,a,3f10.5)') +cd & 'overlap SC-SC: i=',i,' j=',j, +cd & ' dist=',dist(nres+i,nres+j),' rcomp=', +cd & rcomp,1.0/rij,rij_shift + ioverlap_last=ioverlap_last+1 + ioverlap(ioverlap_last)=i + do k=1,ioverlap_last-1 + if (ioverlap(k).eq.i) ioverlap_last=ioverlap_last-1 + enddo + ioverlap_last=ioverlap_last+1 + ioverlap(ioverlap_last)=j + do k=1,ioverlap_last-1 + if (ioverlap(k).eq.j) ioverlap_last=ioverlap_last-1 + enddo + endif + enddo + enddo + enddo + return + end diff --git a/source/unres/src_Eshel/geomout.F b/source/unres/src_Eshel/geomout.F new file mode 100644 index 0000000..c1ac3df --- /dev/null +++ b/source/unres/src_Eshel/geomout.F @@ -0,0 +1,492 @@ + subroutine pdbout(etot,tytul,iunit) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + include 'COMMON.DISTFIT' + include 'COMMON.MD' + character*50 tytul + dimension ica(maxres) + write (iunit,'(3a,1pe15.5)') 'REMARK ',tytul,' ENERGY ',etot +cmodel write (iunit,'(a5,i6)') 'MODEL',1 + if (nhfrag.gt.0) then + do j=1,nhfrag + iti=itype(hfrag(1,j)) + itj=itype(hfrag(2,j)) + if (j.lt.10) then + write (iunit,'(a5,i5,1x,a1,i1,2x,a3,i7,2x,a3,i7,i3,t76,i5)') + & 'HELIX',j,'H',j, + & restyp(iti),hfrag(1,j)-1, + & restyp(itj),hfrag(2,j)-1,1,hfrag(2,j)-hfrag(1,j) + else + write (iunit,'(a5,i5,1x,a1,i2,1x,a3,i7,2x,a3,i7,i3)') + & 'HELIX',j,'H',j, + & restyp(iti),hfrag(1,j)-1, + & restyp(itj),hfrag(2,j)-1,1,hfrag(2,j)-hfrag(1,j) + endif + enddo + endif + + if (nbfrag.gt.0) then + + do j=1,nbfrag + + iti=itype(bfrag(1,j)) + itj=itype(bfrag(2,j)-1) + + write (iunit,'(a5,i5,1x,a1,i1,i3,1x,a3,i6,2x,a3,i6,i3)') + & 'SHEET',1,'B',j,2, + & restyp(iti),bfrag(1,j)-1, + & restyp(itj),bfrag(2,j)-2,0 + + if (bfrag(3,j).gt.bfrag(4,j)) then + + itk=itype(bfrag(3,j)) + itl=itype(bfrag(4,j)+1) + + write (iunit,'(a5,i5,1x,a1,i1,i3,1x,a3,i6,2x,a3,i6,i3, + & 2x,a1,2x,a3,i6,3x,a1,2x,a3,i6)') + & 'SHEET',2,'B',j,2, + & restyp(itl),bfrag(4,j), + & restyp(itk),bfrag(3,j)-1,-1, + & "N",restyp(itk),bfrag(3,j)-1, + & "O",restyp(iti),bfrag(1,j)-1 + + else + + itk=itype(bfrag(3,j)) + itl=itype(bfrag(4,j)-1) + + + write (iunit,'(a5,i5,1x,a1,i1,i3,1x,a3,i6,2x,a3,i6,i3, + & 2x,a1,2x,a3,i6,3x,a1,2x,a3,i6)') + & 'SHEET',2,'B',j,2, + & restyp(itk),bfrag(3,j)-1, + & restyp(itl),bfrag(4,j)-2,1, + & "N",restyp(itk),bfrag(3,j)-1, + & "O",restyp(iti),bfrag(1,j)-1 + + + + endif + + enddo + endif + + if (nss.gt.0) then + do i=1,nss + write(iunit,'(a6,i4,1x,a3,i7,4x,a3,i7)') + & 'SSBOND',i,'CYS',ihpb(i)-1-nres, + & 'CYS',jhpb(i)-1-nres + enddo + endif + + iatom=0 + do i=nnt,nct + ires=i-nnt+1 + iatom=iatom+1 + ica(i)=iatom + iti=itype(i) + write (iunit,10) iatom,restyp(iti),ires,(c(j,i),j=1,3) + if (iti.ne.10) then + iatom=iatom+1 + write (iunit,20) iatom,restyp(iti),ires,(c(j,nres+i),j=1,3) + endif + enddo + write (iunit,'(a)') 'TER' + do i=nnt,nct-1 + if (itype(i).eq.10) then + write (iunit,30) ica(i),ica(i+1) + else + write (iunit,30) ica(i),ica(i+1),ica(i)+1 + endif + enddo + if (itype(nct).ne.10) then + write (iunit,30) ica(nct),ica(nct)+1 + endif + do i=1,nss + write (iunit,30) ica(ihpb(i)-nres)+1,ica(jhpb(i)-nres)+1 + enddo + write (iunit,'(a6)') 'ENDMDL' + 10 FORMAT ('ATOM',I7,' CA ',A3,I6,4X,3F8.3,f15.3) + 20 FORMAT ('ATOM',I7,' CB ',A3,I6,4X,3F8.3,f15.3) + 30 FORMAT ('CONECT',8I5) + return + end +c------------------------------------------------------------------------------ + subroutine MOL2out(etot,tytul) +C Prints the Cartesian coordinates of the alpha-carbons in the Tripos mol2 +C format. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + character*32 tytul,fd + character*3 zahl + character*6 res_num,pom,ucase +#ifdef AIX + call fdate_(fd) +#elif (defined CRAY) + call date(fd) +#else + call fdate(fd) +#endif + write (imol2,'(a)') '#' + write (imol2,'(a)') + & '# Creating user name: unres' + write (imol2,'(2a)') '# Creation time: ', + & fd + write (imol2,'(/a)') '\@MOLECULE' + write (imol2,'(a)') tytul + write (imol2,'(5i5)') nct-nnt+1,nct-nnt+nss+1,nct-nnt+nss+1,0,0 + write (imol2,'(a)') 'SMALL' + write (imol2,'(a)') 'USER_CHARGES' + write (imol2,'(a)') '\@ATOM' + do i=nnt,nct + write (zahl,'(i3)') i + pom=ucase(restyp(itype(i))) + res_num = pom(:3)//zahl(2:) + write (imol2,10) i,(c(j,i),j=1,3),i,res_num,0.0 + enddo + write (imol2,'(a)') '\@BOND' + do i=nnt,nct-1 + write (imol2,'(i5,2i6,i2)') i-nnt+1,i-nnt+1,i-nnt+2,1 + enddo + do i=1,nss + write (imol2,'(i5,2i6,i2)') nct-nnt+i,ihpb(i),jhpb(i),1 + enddo + write (imol2,'(a)') '\@SUBSTRUCTURE' + do i=nnt,nct + write (zahl,'(i3)') i + pom = ucase(restyp(itype(i))) + res_num = pom(:3)//zahl(2:) + write (imol2,30) i-nnt+1,res_num,i-nnt+1,0 + enddo + 10 FORMAT (I7,' CA ',3F10.4,' C.3',I8,1X,A,F11.4,' ****') + 30 FORMAT (I7,1x,A,I14,' RESIDUE',I13,' **** ****') + return + end +c------------------------------------------------------------------------ + subroutine intout + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + write (iout,'(/a)') 'Geometry of the virtual chain.' + write (iout,'(7a)') ' Res ',' d',' Theta', + & ' Gamma',' Dsc',' Alpha',' Beta ' + do i=1,nres + iti=itype(i) + write (iout,'(a3,i4,6f10.3)') restyp(iti),i,vbld(i), + & rad2deg*theta(i),rad2deg*phi(i),vbld(nres+i),rad2deg*alph(i), + & rad2deg*omeg(i) + enddo + return + end +c--------------------------------------------------------------------------- + subroutine briefout(it,ener) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.SBRIDGE' +c print '(a,i5)',intname,igeom +#if defined(AIX) || defined(PGI) + open (igeom,file=intname,position='append') +#else + open (igeom,file=intname,access='append') +#endif + IF (NSS.LE.9) THEN + WRITE (igeom,180) IT,ENER,NSS,(IHPB(I),JHPB(I),I=1,NSS) + ELSE + WRITE (igeom,180) IT,ENER,NSS,(IHPB(I),JHPB(I),I=1,9) + WRITE (igeom,190) (IHPB(I),JHPB(I),I=10,NSS) + ENDIF +c IF (nvar.gt.nphi) WRITE (igeom,200) (RAD2DEG*THETA(I),I=3,NRES) + WRITE (igeom,200) (RAD2DEG*THETA(I),I=3,NRES) + WRITE (igeom,200) (RAD2DEG*PHI(I),I=4,NRES) +c if (nvar.gt.nphi+ntheta) then + write (igeom,200) (rad2deg*alph(i),i=2,nres-1) + write (igeom,200) (rad2deg*omeg(i),i=2,nres-1) +c endif + close(igeom) + 180 format (I5,F12.3,I2,9(1X,2I3)) + 190 format (3X,11(1X,2I3)) + 200 format (8F10.4) + return + end +#ifdef WINIFL + subroutine fdate(fd) + character*32 fd + write(fd,'(32x)') + return + end +#endif +c---------------------------------------------------------------- +#ifdef NOXDR + subroutine cartout(time) +#else + subroutine cartoutx(time) +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + include 'COMMON.DISTFIT' + include 'COMMON.MD' + double precision time +#if defined(AIX) || defined(PGI) + open(icart,file=cartname,position="append") +#else + open(icart,file=cartname,access="append") +#endif + write (icart,'(e15.8,2e15.5,f12.5,$)') time,potE,uconst,t_bath + write (icart,'(i4,$)') + & nss,(ihpb(j),jhpb(j),j=1,nss) + write (icart,'(i4,20f7.4)') nfrag+npair+3*nfrag_back, + & (qfrag(i),i=1,nfrag),(qpair(i),i=1,npair), + & (utheta(i),ugamma(i),uscdiff(i),i=1,nfrag_back) + write (icart,'(8f10.5)') + & ((c(k,j),k=1,3),j=1,nres), + & ((c(k,j+nres),k=1,3),j=nnt,nct) + close(icart) + return + end +c----------------------------------------------------------------- +#ifndef NOXDR + subroutine cartout(time) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + include 'COMMON.SETUP' +#else + parameter (me=0) +#endif + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + include 'COMMON.DISTFIT' + include 'COMMON.MD' + double precision time + integer iret,itmp + real xcoord(3,maxres2+2),prec + +#ifdef AIX + call xdrfopen_(ixdrf,cartname, "a", iret) + call xdrffloat_(ixdrf, real(time), iret) + call xdrffloat_(ixdrf, real(potE), iret) + call xdrffloat_(ixdrf, real(uconst), iret) + call xdrffloat_(ixdrf, real(uconst_back), iret) + call xdrffloat_(ixdrf, real(t_bath), iret) + call xdrfint_(ixdrf, nss, iret) + do j=1,nss + call xdrfint_(ixdrf, ihpb(j), iret) + call xdrfint_(ixdrf, jhpb(j), iret) + enddo + call xdrfint_(ixdrf, nfrag+npair+3*nfrag_back, iret) + do i=1,nfrag + call xdrffloat_(ixdrf, real(qfrag(i)), iret) + enddo + do i=1,npair + call xdrffloat_(ixdrf, real(qpair(i)), iret) + enddo + do i=1,nfrag_back + call xdrffloat_(ixdrf, real(utheta(i)), iret) + call xdrffloat_(ixdrf, real(ugamma(i)), iret) + call xdrffloat_(ixdrf, real(uscdiff(i)), iret) + enddo +#else + call xdrfopen(ixdrf,cartname, "a", iret) + call xdrffloat(ixdrf, real(time), iret) + call xdrffloat(ixdrf, real(potE), iret) + call xdrffloat(ixdrf, real(uconst), iret) + call xdrffloat(ixdrf, real(uconst_back), iret) + call xdrffloat(ixdrf, real(t_bath), iret) + call xdrfint(ixdrf, nss, iret) + do j=1,nss + call xdrfint(ixdrf, ihpb(j), iret) + call xdrfint(ixdrf, jhpb(j), iret) + enddo + call xdrfint(ixdrf, nfrag+npair+3*nfrag_back, iret) + do i=1,nfrag + call xdrffloat(ixdrf, real(qfrag(i)), iret) + enddo + do i=1,npair + call xdrffloat(ixdrf, real(qpair(i)), iret) + enddo + do i=1,nfrag_back + call xdrffloat(ixdrf, real(utheta(i)), iret) + call xdrffloat(ixdrf, real(ugamma(i)), iret) + call xdrffloat(ixdrf, real(uscdiff(i)), iret) + enddo +#endif + prec=10000.0 + do i=1,nres + do j=1,3 + xcoord(j,i)=c(j,i) + enddo + enddo + do i=nnt,nct + do j=1,3 + xcoord(j,nres+i-nnt+1)=c(j,i+nres) + enddo + enddo + + itmp=nres+nct-nnt+1 +#ifdef AIX + call xdrf3dfcoord_(ixdrf, xcoord, itmp, prec, iret) + call xdrfclose_(ixdrf, iret) +#else + call xdrf3dfcoord(ixdrf, xcoord, itmp, prec, iret) + call xdrfclose(ixdrf, iret) +#endif + return + end +#endif +c----------------------------------------------------------------- + subroutine statout(ifile,energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + include 'COMMON.DISTFIT' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.ECOMPON' + integer itime + double precision energia(0:n_ene) + double precision gyrate + external gyrate + common /gucio/ cm + character*256 line1,line2 + character*4 format1,format2 + character*30 format + integer ilen +#ifdef AIX + if(itime.eq.0) then + open(istat,file=statname,position="append") + endif +#else +#ifdef PGI + open(istat,file=statname,position="append") +#else + open(istat,file=statname,access="append") +#endif +#endif + write (istat,'("BEGIN DECOY ",a)') + & pdbname(ifile)(:ilen(pdbname(ifile))) + if (refstr) then + call rms_nac_nnc(rms,frac,frac_nn,co,.false.) + write (istat,'("total UNRES energy",1pe15.6," rmsd ",0pf12.3, + & " frac.nat. ",f12.3," frac.nnat. ",f12.3," rad.gyr",f7.2)') + & energia(0),rms,frac,frac_nn,gyrate() + else + write (istat,'("total UNRES energy ",e15.5)') energia(0) + endif + write(istat,'(a10,1pe15.6)') + & (ename(print_order(i)),energia(print_order(i)),i=1,nprint_ene) + write (istat,'("EVDW components")') + write (istat,'(5x,20(12x,a3))') (restyp(i),i=1,ntyp) + do i=1,ntyp + write (istat,'(a3,2x,20(1pe15.6))') restyp(i), + & (vdwcompon(i,j),j=1,ntyp) + enddo + write (istat,'("ETOR components")') + write (istat,'(5x,20(12x,a3))') (restyp(i),i=1,ntyp) + do i=1,ntyp + write (istat,'(a3,2x,20(1pe15.6))') restyp(i), + & (torcompon(i,j),j=1,ntyp) + enddo + write (istat,'("ESCCOR components")') + write (istat,'(5x,20(12x,a3))') (restyp(i),i=1,ntyp) + do i=1,ntyp + write (istat,'(a3,2x,20(1pe15.6))') restyp(i), + & (sccorcompon(i,j),j=1,ntyp) + enddo + write (istat,'("EVDW2 components")') + do i=1,ntyp + write (istat,'(a3,2x,1pe15.6)') restyp(i),vdw2compon(i) + enddo + write (istat,'("EBE components")') + do i=1,ntyp + write (istat,'(a3,2x,1pe15.6)') restyp(i),becompon(i) + enddo + write (istat,'("ESCLOC components")') + do i=1,ntyp + write (istat,'(a3,2x,1pe15.6)') restyp(i),sccompon(i) + enddo + write (istat,'("ETORD components")') + do i=1,ntyp + write (istat,'(a3,2x,1pe15.6)') restyp(i),tordcompon(i) + enddo + write (istat,'(2a)') "END DECOY ", + & pdbname(ifile)(:ilen(pdbname(ifile))) +#if defined(AIX) + call flush(istat) +#else + close(istat) +#endif + return + end +c--------------------------------------------------------------- + double precision function gyrate() + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.INTERACT' + include 'COMMON.CHAIN' + double precision cen(3),rg + + do j=1,3 + cen(j)=0.0d0 + enddo + + do i=nnt,nct + do j=1,3 + cen(j)=cen(j)+c(j,i) + enddo + enddo + do j=1,3 + cen(j)=cen(j)/dble(nct-nnt+1) + enddo + rg = 0.0d0 + do i = nnt, nct + do j=1,3 + rg = rg + (c(j,i)-cen(j))**2 + enddo + end do + gyrate = sqrt(rg/dble(nct-nnt+1)) + return + end + diff --git a/source/unres/src_Eshel/gnmr1.f b/source/unres/src_Eshel/gnmr1.f new file mode 100644 index 0000000..905e746 --- /dev/null +++ b/source/unres/src_Eshel/gnmr1.f @@ -0,0 +1,43 @@ + double precision function gnmr1(y,ymin,ymax) + implicit none + double precision y,ymin,ymax + double precision wykl /4.0d0/ + if (y.lt.ymin) then + gnmr1=(ymin-y)**wykl/wykl + else if (y.gt.ymax) then + gnmr1=(y-ymax)**wykl/wykl + else + gnmr1=0.0d0 + endif + return + end +c------------------------------------------------------------------------------ + double precision function gnmr1prim(y,ymin,ymax) + implicit none + double precision y,ymin,ymax + double precision wykl /4.0d0/ + if (y.lt.ymin) then + gnmr1prim=-(ymin-y)**(wykl-1) + else if (y.gt.ymax) then + gnmr1prim=(y-ymax)**(wykl-1) + else + gnmr1prim=0.0d0 + endif + return + end +c------------------------------------------------------------------------------ + double precision function harmonic(y,ymax) + implicit none + double precision y,ymax + double precision wykl /2.0d0/ + harmonic=(y-ymax)**wykl + return + end +c------------------------------------------------------------------------------- + double precision function harmonicprim(y,ymax) + double precision y,ymin,ymax + double precision wykl /2.0d0/ + harmonicprim=(y-ymax)*wykl + return + end +c--------------------------------------------------------------------------------- diff --git a/source/unres/src_Eshel/gradient_p.F b/source/unres/src_Eshel/gradient_p.F new file mode 100644 index 0000000..9a25497 --- /dev/null +++ b/source/unres/src_Eshel/gradient_p.F @@ -0,0 +1,421 @@ + subroutine gradient(n,x,nf,g,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.SCCOR' + external ufparm + integer uiparm(1) + double precision urparm(1) + dimension x(maxvar),g(maxvar) +c +c This subroutine calculates total internal coordinate gradient. +c Depending on the number of function evaluations, either whole energy +c is evaluated beforehand, Cartesian coordinates and their derivatives in +c internal coordinates are reevaluated or only the cartesian-in-internal +c coordinate derivatives are evaluated. The subroutine was designed to work +c with SUMSL. +c +c + icg=mod(nf,2)+1 + +cd print *,'grad',nf,icg + if (nf-nfl+1) 20,30,40 + 20 call func(n,x,nf,f,uiparm,urparm,ufparm) +c write (iout,*) 'grad 20' + if (nf.eq.0) return + goto 40 + 30 call var_to_geom(n,x) + call chainbuild +c write (iout,*) 'grad 30' +C +C Evaluate the derivatives of virtual bond lengths and SC vectors in variables. +C + 40 call cartder +c write (iout,*) 'grad 40' +c print *,'GRADIENT: nnt=',nnt,' nct=',nct,' expon=',expon +C +C Convert the Cartesian gradient into internal-coordinate gradient. +C + ind=0 + ind1=0 + do i=1,nres-2 + gthetai=0.0D0 + gphii=0.0D0 + do j=i+1,nres-1 + ind=ind+1 +c ind=indmat(i,j) +c print *,'GRAD: i=',i,' jc=',j,' ind=',ind + do k=1,3 + gthetai=gthetai+dcdv(k,ind)*gradc(k,j,icg) + enddo + do k=1,3 + gphii=gphii+dcdv(k+3,ind)*gradc(k,j,icg) + enddo + enddo + do j=i+1,nres-1 + ind1=ind1+1 +c ind1=indmat(i,j) +c print *,'GRAD: i=',i,' jx=',j,' ind1=',ind1 + do k=1,3 + gthetai=gthetai+dxdv(k,ind1)*gradx(k,j,icg) + gphii=gphii+dxdv(k+3,ind1)*gradx(k,j,icg) + enddo + enddo + if (i.gt.1) g(i-1)=gphii + if (n.gt.nphi) g(nphi+i)=gthetai + enddo + if (n.le.nphi+ntheta) goto 10 + do i=2,nres-1 + if (itype(i).ne.10) then + galphai=0.0D0 + gomegai=0.0D0 + do k=1,3 + galphai=galphai+dxds(k,i)*gradx(k,i,icg) + enddo + do k=1,3 + gomegai=gomegai+dxds(k+3,i)*gradx(k,i,icg) + enddo + g(ialph(i,1))=galphai + g(ialph(i,1)+nside)=gomegai + endif + enddo +C +C Add the components corresponding to local energy terms. +C + 10 continue + do i=1,nvar +cd write (iout,*) 'i=',i,'g=',g(i),' gloc=',gloc(i,icg) + g(i)=g(i)+gloc(i,icg) + enddo +C Uncomment following three lines for diagnostics. +cd call intout +cd call briefout(0,0.0d0) +cd write (iout,'(i3,1pe15.5)') (k,g(k),k=1,n) + return + end +C------------------------------------------------------------------------- + subroutine grad_restr(n,x,nf,g,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + external ufparm + integer uiparm(1) + double precision urparm(1) + dimension x(maxvar),g(maxvar) + + icg=mod(nf,2)+1 + if (nf-nfl+1) 20,30,40 + 20 call func_restr(n,x,nf,f,uiparm,urparm,ufparm) +c write (iout,*) 'grad 20' + if (nf.eq.0) return + goto 40 + 30 continue +#ifdef OSF +c Intercept NaNs in the coordinates +c write(iout,*) (var(i),i=1,nvar) + x_sum=0.D0 + do i=1,n + x_sum=x_sum+x(i) + enddo + if (x_sum.ne.x_sum) then + write(iout,*)" *** grad_restr : Found NaN in coordinates" + call flush(iout) + print *," *** grad_restr : Found NaN in coordinates" + return + endif +#endif + call var_to_geom_restr(n,x) + call chainbuild +C +C Evaluate the derivatives of virtual bond lengths and SC vectors in variables. +C + 40 call cartder +C +C Convert the Cartesian gradient into internal-coordinate gradient. +C + + ig=0 + ind=nres-2 + do i=2,nres-2 + IF (mask_phi(i+2).eq.1) THEN + gphii=0.0D0 + do j=i+1,nres-1 + ind=ind+1 + do k=1,3 + gphii=gphii+dcdv(k+3,ind)*gradc(k,j,icg) + gphii=gphii+dxdv(k+3,ind)*gradx(k,j,icg) + enddo + enddo + ig=ig+1 + g(ig)=gphii + ELSE + ind=ind+nres-1-i + ENDIF + enddo + + + ind=0 + do i=1,nres-2 + IF (mask_theta(i+2).eq.1) THEN + ig=ig+1 + gthetai=0.0D0 + do j=i+1,nres-1 + ind=ind+1 + do k=1,3 + gthetai=gthetai+dcdv(k,ind)*gradc(k,j,icg) + gthetai=gthetai+dxdv(k,ind)*gradx(k,j,icg) + enddo + enddo + g(ig)=gthetai + ELSE + ind=ind+nres-1-i + ENDIF + enddo + + do i=2,nres-1 + if (itype(i).ne.10) then + IF (mask_side(i).eq.1) THEN + ig=ig+1 + galphai=0.0D0 + do k=1,3 + galphai=galphai+dxds(k,i)*gradx(k,i,icg) + enddo + g(ig)=galphai + ENDIF + endif + enddo + + + do i=2,nres-1 + if (itype(i).ne.10) then + IF (mask_side(i).eq.1) THEN + ig=ig+1 + gomegai=0.0D0 + do k=1,3 + gomegai=gomegai+dxds(k+3,i)*gradx(k,i,icg) + enddo + g(ig)=gomegai + ENDIF + endif + enddo + +C +C Add the components corresponding to local energy terms. +C + + ig=0 + igall=0 + do i=4,nres + igall=igall+1 + if (mask_phi(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + enddo + + do i=3,nres + igall=igall+1 + if (mask_theta(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + enddo + + do ij=1,2 + do i=2,nres-1 + if (itype(i).ne.10) then + igall=igall+1 + if (mask_side(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + endif + enddo + enddo + +cd do i=1,ig +cd write (iout,'(a2,i5,a3,f25.8)') 'i=',i,' g=',g(i) +cd enddo + return + end +C------------------------------------------------------------------------- + subroutine cartgrad + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.SCCOR' +c +c This subrouting calculates total Cartesian coordinate gradient. +c The subroutine chainbuild_cart and energy MUST be called beforehand. +c +c do i=1,nres +c write (iout,*) "przed sum_grad", gloc_sc(1,i,icg),gloc(i,icg) +c enddo + +#ifdef TIMING + time00=MPI_Wtime() +#endif + icg=1 + call sum_gradient +#ifdef TIMING +#endif +c do i=1,nres +c write (iout,*) "checkgrad", gloc_sc(1,i,icg),gloc(i,icg) +c enddo +cd write (iout,*) "After sum_gradient" +cd do i=1,nres-1 +cd write (iout,*) i," gradc ",(gradc(j,i,icg),j=1,3) +cd write (iout,*) i," gradx ",(gradx(j,i,icg),j=1,3) +cd enddo +c If performing constraint dynamics, add the gradients of the constraint energy +c if(usampl.and.totT.gt.eq_time) then +c do i=1,nct +c do j=1,3 +c gradc(j,i,icg)=gradc(j,i,icg)+dudconst(j,i)+duscdiff(j,i) +c gradx(j,i,icg)=gradx(j,i,icg)+dudxconst(j,i)+duscdiffx(j,i) +c enddo +c enddo +c do i=1,nres-3 +c gloc(i,icg)=gloc(i,icg)+dugamma(i) +c enddo +c do i=1,nres-2 +c gloc(nphi+i,icg)=gloc(nphi+i,icg)+dutheta(i) +c enddo +c endif +#ifdef TIMING + time01=MPI_Wtime() +#endif + call intcartderiv +#ifdef TIMING + time_intcartderiv=time_intcartderiv+MPI_Wtime()-time01 +#endif +cd call checkintcartgrad +cd write(iout,*) 'calling int_to_cart' +cd write (iout,*) "gcart, gxcart, gloc before int_to_cart" + do i=1,nct + do j=1,3 + gcart(j,i)=gradc(j,i,icg) + gxcart(j,i)=gradx(j,i,icg) + enddo +cd write (iout,'(i5,2(3f10.5,5x),f10.5)') i,(gcart(j,i),j=1,3), +cd & (gxcart(j,i),j=1,3),gloc(i,icg) + enddo +#ifdef TIMING + time01=MPI_Wtime() +#endif + call int_to_cart +#ifdef TIMING + time_inttocart=time_inttocart+MPI_Wtime()-time01 +#endif +cd write (iout,*) "gcart and gxcart after int_to_cart" +cd do i=0,nres-1 +cd write (iout,'(i5,3f10.5,5x,3f10.5)') i,(gcart(j,i),j=1,3), +cd & (gxcart(j,i),j=1,3) +cd enddo +#ifdef TIMING + time_cartgrad=time_cartgrad+MPI_Wtime()-time00 +#endif + return + end +C------------------------------------------------------------------------- + subroutine zerograd + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.SCCOR' +C +C Initialize Cartesian-coordinate gradient +C + do i=1,nres + do j=1,3 + gvdwx(j,i)=0.0D0 + gvdwxT(j,i)=0.0D0 + gradx_scp(j,i)=0.0D0 + gvdwc(j,i)=0.0D0 + gvdwcT(j,i)=0.0D0 + gvdwc_scp(j,i)=0.0D0 + gvdwc_scpp(j,i)=0.0d0 + gelc (j,i)=0.0D0 + gelc_long(j,i)=0.0D0 + gradb(j,i)=0.0d0 + gradbx(j,i)=0.0d0 + gvdwpp(j,i)=0.0d0 + gel_loc(j,i)=0.0d0 + gel_loc_long(j,i)=0.0d0 + ghpbc(j,i)=0.0D0 + ghpbx(j,i)=0.0D0 + gcorr3_turn(j,i)=0.0d0 + gcorr4_turn(j,i)=0.0d0 + gradcorr(j,i)=0.0d0 + gradcorr_long(j,i)=0.0d0 + gradcorr5_long(j,i)=0.0d0 + gradcorr6_long(j,i)=0.0d0 + gcorr6_turn_long(j,i)=0.0d0 + gradcorr5(j,i)=0.0d0 + gradcorr6(j,i)=0.0d0 + gcorr6_turn(j,i)=0.0d0 + gsccorc(j,i)=0.0d0 + gsccorx(j,i)=0.0d0 + gradc(j,i,icg)=0.0d0 + gradx(j,i,icg)=0.0d0 + gscloc(j,i)=0.0d0 + gsclocx(j,i)=0.0d0 + do intertyp=1,3 + gloc_sc(intertyp,i,icg)=0.0d0 + enddo + enddo + enddo +C +C Initialize the gradient of local energy terms. +C + do i=1,4*nres + gloc(i,icg)=0.0D0 + enddo + do i=1,nres + gel_loc_loc(i)=0.0d0 + gcorr_loc(i)=0.0d0 + g_corr5_loc(i)=0.0d0 + g_corr6_loc(i)=0.0d0 + gel_loc_turn3(i)=0.0d0 + gel_loc_turn4(i)=0.0d0 + gel_loc_turn6(i)=0.0d0 + gsccor_loc(i)=0.0d0 + enddo +c initialize gcart and gxcart + do i=0,nres + do j=1,3 + gcart(j,i)=0.0d0 + gxcart(j,i)=0.0d0 + enddo + enddo + return + end +c------------------------------------------------------------------------- + double precision function fdum() + fdum=0.0D0 + return + end diff --git a/source/unres/src_Eshel/icant.f b/source/unres/src_Eshel/icant.f new file mode 100644 index 0000000..5adba24 --- /dev/null +++ b/source/unres/src_Eshel/icant.f @@ -0,0 +1,9 @@ + integer function icant(i,j) + integer i,j + if (j.ge.i) then + icant=i*(i-1)/2+j + else + icant=j*(j-1)/2+i + endif + return + end diff --git a/source/unres/src_Eshel/initialize_p.F b/source/unres/src_Eshel/initialize_p.F new file mode 100644 index 0000000..10e2653 --- /dev/null +++ b/source/unres/src_Eshel/initialize_p.F @@ -0,0 +1,1390 @@ + block data + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.MD' + data MovTypID + & /'pool','chain regrow','multi-bond','phi','theta','side chain', + & 'total'/ + end +c-------------------------------------------------------------------------- + subroutine initialize +C +C Define constants and zero out tables. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.MCM' + include 'COMMON.MINIM' + include 'COMMON.DERIV' + include 'COMMON.SPLITELE' +c Common blocks from the diagonalization routines + COMMON /IOFILE/ IR,IW,IP,IJK,IPK,IDAF,NAV,IODA(400) + COMMON /MACHSW/ KDIAG,ICORFL,IXDR + logical mask_r +c real*8 text1 /'initial_i'/ + + mask_r=.false. +#ifndef ISNAN +c NaNQ initialization + i=-1 + arg=100.0d0 + rr=dacos(arg) +#ifdef WINPGI + idumm=proc_proc(rr,i) +#else + call proc_proc(rr,i) +#endif +#endif + + kdiag=0 + icorfl=0 + iw=2 +C +C The following is just to define auxiliary variables used in angle conversion +C + pi=4.0D0*datan(1.0D0) + dwapi=2.0D0*pi + dwapi3=dwapi/3.0D0 + pipol=0.5D0*pi + deg2rad=pi/180.0D0 + rad2deg=1.0D0/deg2rad + angmin=10.0D0*deg2rad +C +C Define I/O units. +C + inp= 1 + iout= 2 + ipdbin= 3 + ipdb= 7 + icart = 30 + imol2= 4 + igeom= 8 + intin= 9 + ithep= 11 + ithep_pdb=51 + irotam=12 + irotam_pdb=52 + itorp= 13 + itordp= 23 + ielep= 14 + isidep=15 + iscpp=25 + icbase=16 + ifourier=20 + istat= 17 + irest1=55 + irest2=56 + iifrag=57 + ientin=18 + ientout=19 + ibond = 28 + isccor = 29 +crc for write_rmsbank1 + izs1=21 +cdr include secondary structure prediction bias + isecpred=27 +C +C CSA I/O units (separated from others especially for Jooyoung) +C + icsa_rbank=30 + icsa_seed=31 + icsa_history=32 + icsa_bank=33 + icsa_bank1=34 + icsa_alpha=35 + icsa_alpha1=36 + icsa_bankt=37 + icsa_int=39 + icsa_bank_reminimized=38 + icsa_native_int=41 + icsa_in=40 +crc for ifc error 118 + icsa_pdb=42 +C +C Set default weights of the energy terms. +C + wlong=1.0D0 + welec=1.0D0 + wtor =1.0D0 + wang =1.0D0 + wscloc=1.0D0 + wstrain=1.0D0 +C +C Zero out tables. +C + print '(a,$)','Inside initialize' +c call memmon_print_usage() + do i=1,maxres2 + do j=1,3 + c(j,i)=0.0D0 + dc(j,i)=0.0D0 + enddo + enddo + do i=1,maxres + do j=1,3 + xloc(j,i)=0.0D0 + enddo + enddo + do i=1,ntyp + do j=1,ntyp + aa(i,j)=0.0D0 + bb(i,j)=0.0D0 + augm(i,j)=0.0D0 + sigma(i,j)=0.0D0 + r0(i,j)=0.0D0 + chi(i,j)=0.0D0 + enddo + do j=1,2 + bad(i,j)=0.0D0 + enddo + chip(i)=0.0D0 + alp(i)=0.0D0 + sigma0(i)=0.0D0 + sigii(i)=0.0D0 + rr0(i)=0.0D0 + a0thet(i)=0.0D0 + do j=1,2 + athet(j,i)=0.0D0 + bthet(j,i)=0.0D0 + enddo + do j=0,3 + polthet(j,i)=0.0D0 + enddo + do j=1,3 + gthet(j,i)=0.0D0 + enddo + theta0(i)=0.0D0 + sig0(i)=0.0D0 + sigc0(i)=0.0D0 + do j=1,maxlob + bsc(j,i)=0.0D0 + do k=1,3 + censc(k,j,i)=0.0D0 + enddo + do k=1,3 + do l=1,3 + gaussc(l,k,j,i)=0.0D0 + enddo + enddo + nlob(i)=0 + enddo + enddo + nlob(ntyp1)=0 + dsc(ntyp1)=0.0D0 + do i=1,maxtor + itortyp(i)=0 + do j=1,maxtor + do k=1,maxterm + v1(k,j,i)=0.0D0 + v2(k,j,i)=0.0D0 + enddo + enddo + enddo + do i=1,maxres + itype(i)=0 + itel(i)=0 + enddo +C Initialize the bridge arrays + ns=0 + nss=0 + nhpb=0 + do i=1,maxss + iss(i)=0 + enddo + do i=1,maxdim + dhpb(i)=0.0D0 + enddo + do i=1,maxres + ihpb(i)=0 + jhpb(i)=0 + enddo +C +C Initialize timing. +C + call set_timers +C +C Initialize variables used in minimization. +C +c maxfun=5000 +c maxit=2000 + maxfun=500 + maxit=200 + tolf=1.0D-2 + rtolf=5.0D-4 +C +C Initialize the variables responsible for the mode of gradient storage. +C + nfl=0 + icg=1 +C +C Initialize constants used to split the energy into long- and short-range +C components +C + r_cut=2.0d0 + rlamb=0.3d0 +#ifndef SPLITELE + nprint_ene=nprint_ene-1 +#endif + return + end +c------------------------------------------------------------------------- + block data nazwy + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + data restyp / + &'CYS','MET','PHE','ILE','LEU','VAL','TRP','TYR','ALA','GLY','THR', + &'SER','GLN','ASN','GLU','ASP','HIS','ARG','LYS','PRO','D'/ + data onelet / + &'C','M','F','I','L','V','W','Y','A','G','T', + &'S','Q','N','E','D','H','R','K','P','X'/ + data potname /'LJ','LJK','BP','GB','GBV'/ + data ename / + & "EVDW SC-SC","EVDW2 SC-p","EES p-p","ECORR4 ","ECORR5 ", + & "ECORR6 ","EELLO ","ETURN3 ","ETURN4 ","ETURN6 ", + & "EBE bend","ESC SCloc","ETORS ","ETORSD ","EHPB ","EVDWPP ", + & "ESTR ","EVDW2_14 ","UCONST ", " ","ESCCOR"," "," "/ + data wname / + & "WSC","WSCP","WELEC","WCORR","WCORR5","WCORR6","WEL_LOC", + & "WTURN3","WTURN4","WTURN6","WANG","WSCLOC","WTOR","WTORD", + & "WSTRAIN","WVDWPP","WBOND","SCAL14"," "," ","WSCCOR", + & " "," "/ + data nprint_ene /20/ + data print_order/1,2,3,11,12,13,14,4,5,6,7,8,9,10,19,18,15,17,16, + & 21,0,0,0/ + end +c--------------------------------------------------------------------------- + subroutine init_int_table + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer blocklengths(15),displs(15) +#endif + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.SBRIDGE' + include 'COMMON.TORCNSTR' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.CONTACTS' + common /przechowalnia/ iturn3_start_all(0:MaxProcs), + & iturn3_end_all(0:MaxProcs),iturn4_start_all(0:MaxProcs), + & iturn4_end_all(0:MaxProcs),iatel_s_all(0:MaxProcs), + & iatel_e_all(0:MaxProcs),ielstart_all(maxres,0:MaxProcs-1), + & ielend_all(maxres,0:MaxProcs-1), + & ntask_cont_from_all(0:max_fg_procs-1), + & itask_cont_from_all(0:max_fg_procs-1,0:max_fg_procs-1), + & ntask_cont_to_all(0:max_fg_procs-1), + & itask_cont_to_all(0:max_fg_procs-1,0:max_fg_procs-1) + integer FG_GROUP,CONT_FROM_GROUP,CONT_TO_GROUP + logical scheck,lprint,flag +#ifdef MPI + integer my_sc_int(0:max_fg_Procs-1),my_sc_intt(0:max_fg_Procs), + & my_ele_int(0:max_fg_Procs-1),my_ele_intt(0:max_fg_Procs) +C... Determine the numbers of start and end SC-SC interaction +C... to deal with by current processor. + do i=0,nfgtasks-1 + itask_cont_from(i)=fg_rank + itask_cont_to(i)=fg_rank + enddo + lprint=.false. + if (lprint) + &write (iout,*) 'INIT_INT_TABLE nres=',nres,' nnt=',nnt,' nct=',nct + n_sc_int_tot=(nct-nnt+1)*(nct-nnt)/2-nss + call int_bounds(n_sc_int_tot,my_sc_inds,my_sc_inde) + if (lprint) + & write (iout,*) 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',MyRank, + & ' n_sc_int_tot',n_sc_int_tot,' my_sc_inds=',my_sc_inds, + & ' my_sc_inde',my_sc_inde + ind_sctint=0 + iatsc_s=0 + iatsc_e=0 +#endif +c lprint=.false. + do i=1,maxres + nint_gr(i)=0 + nscp_gr(i)=0 + do j=1,maxint_gr + istart(i,1)=0 + iend(i,1)=0 + ielstart(i)=0 + ielend(i)=0 + iscpstart(i,1)=0 + iscpend(i,1)=0 + enddo + enddo + ind_scint=0 + ind_scint_old=0 +cd write (iout,*) 'ns=',ns,' nss=',nss,' ihpb,jhpb', +cd & (ihpb(i),jhpb(i),i=1,nss) + do i=nnt,nct-1 + scheck=.false. + do ii=1,nss + if (ihpb(ii).eq.i+nres) then + scheck=.true. + jj=jhpb(ii)-nres + goto 10 + endif + enddo + 10 continue +cd write (iout,*) 'i=',i,' scheck=',scheck,' jj=',jj + if (scheck) then + if (jj.eq.i+1) then +#ifdef MPI +c write (iout,*) 'jj=i+1' + call int_partition(ind_scint,my_sc_inds,my_sc_inde,i, + & iatsc_s,iatsc_e,i+2,nct,nint_gr(i),istart(i,1),iend(i,1),*12) +#else + nint_gr(i)=1 + istart(i,1)=i+2 + iend(i,1)=nct +#endif + else if (jj.eq.nct) then +#ifdef MPI +c write (iout,*) 'jj=nct' + call int_partition(ind_scint,my_sc_inds,my_sc_inde,i, + & iatsc_s,iatsc_e,i+1,nct-1,nint_gr(i),istart(i,1),iend(i,1),*12) +#else + nint_gr(i)=1 + istart(i,1)=i+1 + iend(i,1)=nct-1 +#endif + else +#ifdef MPI + call int_partition(ind_scint,my_sc_inds,my_sc_inde,i, + & iatsc_s,iatsc_e,i+1,jj-1,nint_gr(i),istart(i,1),iend(i,1),*12) + ii=nint_gr(i)+1 + call int_partition(ind_scint,my_sc_inds,my_sc_inde,i, + & iatsc_s,iatsc_e,jj+1,nct,nint_gr(i),istart(i,ii),iend(i,ii),*12) +#else + nint_gr(i)=2 + istart(i,1)=i+1 + iend(i,1)=jj-1 + istart(i,2)=jj+1 + iend(i,2)=nct +#endif + endif + else +#ifdef MPI + call int_partition(ind_scint,my_sc_inds,my_sc_inde,i, + & iatsc_s,iatsc_e,i+1,nct,nint_gr(i),istart(i,1),iend(i,1),*12) +#else + nint_gr(i)=1 + istart(i,1)=i+1 + iend(i,1)=nct + ind_scint=ind_scint+nct-i +#endif + endif +#ifdef MPI + ind_scint_old=ind_scint +#endif + enddo + 12 continue +#ifndef MPI + iatsc_s=nnt + iatsc_e=nct-1 +#endif +#ifdef MPI + if (lprint) write (*,*) 'Processor',fg_rank,' CG Group',kolor, + & ' absolute rank',myrank,' iatsc_s=',iatsc_s,' iatsc_e=',iatsc_e +#endif + if (lprint) then + write (iout,'(a)') 'Interaction array:' + do i=iatsc_s,iatsc_e + write (iout,'(i3,2(2x,2i3))') + & i,(istart(i,iint),iend(i,iint),iint=1,nint_gr(i)) + enddo + endif + ispp=4 +#ifdef MPI +C Now partition the electrostatic-interaction array + npept=nct-nnt + nele_int_tot=(npept-ispp)*(npept-ispp+1)/2 + call int_bounds(nele_int_tot,my_ele_inds,my_ele_inde) + if (lprint) + & write (*,*) 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',MyRank, + & ' nele_int_tot',nele_int_tot,' my_ele_inds=',my_ele_inds, + & ' my_ele_inde',my_ele_inde + iatel_s=0 + iatel_e=0 + ind_eleint=0 + ind_eleint_old=0 + do i=nnt,nct-3 + ijunk=0 + call int_partition(ind_eleint,my_ele_inds,my_ele_inde,i, + & iatel_s,iatel_e,i+ispp,nct-1,ijunk,ielstart(i),ielend(i),*13) + enddo ! i + 13 continue + if (iatel_s.eq.0) iatel_s=1 + nele_int_tot_vdw=(npept-2)*(npept-2+1)/2 +c write (iout,*) "nele_int_tot_vdw",nele_int_tot_vdw + call int_bounds(nele_int_tot_vdw,my_ele_inds_vdw,my_ele_inde_vdw) +c write (iout,*) "my_ele_inds_vdw",my_ele_inds_vdw, +c & " my_ele_inde_vdw",my_ele_inde_vdw + ind_eleint_vdw=0 + ind_eleint_vdw_old=0 + iatel_s_vdw=0 + iatel_e_vdw=0 + do i=nnt,nct-3 + ijunk=0 + call int_partition(ind_eleint_vdw,my_ele_inds_vdw, + & my_ele_inde_vdw,i, + & iatel_s_vdw,iatel_e_vdw,i+2,nct-1,ijunk,ielstart_vdw(i), + & ielend_vdw(i),*15) +c write (iout,*) i," ielstart_vdw",ielstart_vdw(i), +c & " ielend_vdw",ielend_vdw(i) + enddo ! i + if (iatel_s_vdw.eq.0) iatel_s_vdw=1 + 15 continue +#else + iatel_s=nnt + iatel_e=nct-5 + do i=iatel_s,iatel_e + ielstart(i)=i+4 + ielend(i)=nct-1 + enddo + iatel_s_vdw=nnt + iatel_e_vdw=nct-3 + do i=iatel_s_vdw,iatel_e_vdw + ielstart_vdw(i)=i+2 + ielend_vdw(i)=nct-1 + enddo +#endif + if (lprint) then + write (*,'(a)') 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',MyRank + write (iout,*) 'Electrostatic interaction array:' + do i=iatel_s,iatel_e + write (iout,'(i3,2(2x,2i3))') i,ielstart(i),ielend(i) + enddo + endif ! lprint +c iscp=3 + iscp=2 +C Partition the SC-p interaction array +#ifdef MPI + nscp_int_tot=(npept-iscp+1)*(npept-iscp+1) + call int_bounds(nscp_int_tot,my_scp_inds,my_scp_inde) + if (lprint) write (iout,*) 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',myrank, + & ' nscp_int_tot',nscp_int_tot,' my_scp_inds=',my_scp_inds, + & ' my_scp_inde',my_scp_inde + iatscp_s=0 + iatscp_e=0 + ind_scpint=0 + ind_scpint_old=0 + do i=nnt,nct-1 + if (i.lt.nnt+iscp) then +cd write (iout,*) 'i.le.nnt+iscp' + call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i, + & iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,1), + & iscpend(i,1),*14) + else if (i.gt.nct-iscp) then +cd write (iout,*) 'i.gt.nct-iscp' + call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i, + & iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1), + & iscpend(i,1),*14) + else + call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i, + & iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1), + & iscpend(i,1),*14) + ii=nscp_gr(i)+1 + call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i, + & iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,ii), + & iscpend(i,ii),*14) + endif + enddo ! i + 14 continue +#else + iatscp_s=nnt + iatscp_e=nct-1 + do i=nnt,nct-1 + if (i.lt.nnt+iscp) then + nscp_gr(i)=1 + iscpstart(i,1)=i+iscp + iscpend(i,1)=nct + elseif (i.gt.nct-iscp) then + nscp_gr(i)=1 + iscpstart(i,1)=nnt + iscpend(i,1)=i-iscp + else + nscp_gr(i)=2 + iscpstart(i,1)=nnt + iscpend(i,1)=i-iscp + iscpstart(i,2)=i+iscp + iscpend(i,2)=nct + endif + enddo ! i +#endif + if (lprint) then + write (iout,'(a)') 'SC-p interaction array:' + do i=iatscp_s,iatscp_e + write (iout,'(i3,2(2x,2i3))') + & i,(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i)) + enddo + endif ! lprint +C Partition local interactions +#ifdef MPI + call int_bounds(nres-2,loc_start,loc_end) + loc_start=loc_start+1 + loc_end=loc_end+1 + call int_bounds(nres-2,ithet_start,ithet_end) + ithet_start=ithet_start+2 + ithet_end=ithet_end+2 + call int_bounds(nct-nnt-2,iturn3_start,iturn3_end) + iturn3_start=iturn3_start+nnt + iphi_start=iturn3_start+2 + iturn3_end=iturn3_end+nnt + iphi_end=iturn3_end+2 + iturn3_start=iturn3_start-1 + iturn3_end=iturn3_end-1 + call int_bounds(nres-3,itau_start,itau_end) + itau_start=itau_start+3 + itau_end=itau_end+3 + call int_bounds(nres-3,iphi1_start,iphi1_end) + iphi1_start=iphi1_start+3 + iphi1_end=iphi1_end+3 + call int_bounds(nct-nnt-3,iturn4_start,iturn4_end) + iturn4_start=iturn4_start+nnt + iphid_start=iturn4_start+2 + iturn4_end=iturn4_end+nnt + iphid_end=iturn4_end+2 + iturn4_start=iturn4_start-1 + iturn4_end=iturn4_end-1 + call int_bounds(nres-2,ibond_start,ibond_end) + ibond_start=ibond_start+1 + ibond_end=ibond_end+1 + call int_bounds(nct-nnt,ibondp_start,ibondp_end) + ibondp_start=ibondp_start+nnt + ibondp_end=ibondp_end+nnt + call int_bounds1(nres-1,ivec_start,ivec_end) + print *,"Processor",myrank,fg_rank,fg_rank1, + & " ivec_start",ivec_start," ivec_end",ivec_end + iset_start=loc_start+2 + iset_end=loc_end+2 + if (ndih_constr.eq.0) then + idihconstr_start=1 + idihconstr_end=0 + else + call int_bounds(ndih_constr,idihconstr_start,idihconstr_end) + endif + nsumgrad=(nres-nnt)*(nres-nnt+1)/2 + nlen=nres-nnt+1 + call int_bounds(nsumgrad,ngrad_start,ngrad_end) + igrad_start=((2*nlen+1) + & -sqrt(float((2*nlen-1)**2-8*(ngrad_start-1))))/2 + jgrad_start(igrad_start)= + & ngrad_start-(2*nlen-igrad_start)*(igrad_start-1)/2 + & +igrad_start + jgrad_end(igrad_start)=nres + igrad_end=((2*nlen+1) + & -sqrt(float((2*nlen-1)**2-8*(ngrad_end-1))))/2 + if (igrad_end.gt.igrad_start) jgrad_start(igrad_end)=igrad_end+1 + jgrad_end(igrad_end)=ngrad_end-(2*nlen-igrad_end)*(igrad_end-1)/2 + & +igrad_end + do i=igrad_start+1,igrad_end-1 + jgrad_start(i)=i+1 + jgrad_end(i)=nres + enddo + if (lprint) then + write (*,*) 'Processor:',fg_rank,' CG group',kolor, + & ' absolute rank',myrank, + & ' loc_start',loc_start,' loc_end',loc_end, + & ' ithet_start',ithet_start,' ithet_end',ithet_end, + & ' iphi_start',iphi_start,' iphi_end',iphi_end, + & ' iphid_start',iphid_start,' iphid_end',iphid_end, + & ' ibond_start',ibond_start,' ibond_end',ibond_end, + & ' ibondp_start',ibondp_start,' ibondp_end',ibondp_end, + & ' iturn3_start',iturn3_start,' iturn3_end',iturn3_end, + & ' iturn4_start',iturn4_start,' iturn4_end',iturn4_end, + & ' ivec_start',ivec_start,' ivec_end',ivec_end, + & ' iset_start',iset_start,' iset_end',iset_end, + & ' idihconstr_start',idihconstr_start,' idihconstr_end', + & idihconstr_end + write (*,*) 'Processor:',fg_rank,myrank,' igrad_start', + & igrad_start,' igrad_end',igrad_end,' ngrad_start',ngrad_start, + & ' ngrad_end',ngrad_end + do i=igrad_start,igrad_end + write(*,*) 'Processor:',fg_rank,myrank,i, + & jgrad_start(i),jgrad_end(i) + enddo + endif + if (nfgtasks.gt.1) then + call MPI_Allgather(ivec_start,1,MPI_INTEGER,ivec_displ(0),1, + & MPI_INTEGER,FG_COMM1,IERROR) + iaux=ivec_end-ivec_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,ivec_count(0),1, + & MPI_INTEGER,FG_COMM1,IERROR) + call MPI_Allgather(iset_start-2,1,MPI_INTEGER,iset_displ(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + iaux=iset_end-iset_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,iset_count(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(ibond_start,1,MPI_INTEGER,ibond_displ(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + iaux=ibond_end-ibond_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,ibond_count(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(ithet_start,1,MPI_INTEGER,ithet_displ(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + iaux=ithet_end-ithet_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,ithet_count(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iphi_start,1,MPI_INTEGER,iphi_displ(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + iaux=iphi_end-iphi_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,iphi_count(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iphi1_start,1,MPI_INTEGER,iphi1_displ(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + iaux=iphi1_end-iphi1_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,iphi1_count(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + do i=0,maxprocs-1 + do j=1,maxres + ielstart_all(j,i)=0 + ielend_all(j,i)=0 + enddo + enddo + call MPI_Allgather(iturn3_start,1,MPI_INTEGER, + & iturn3_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iturn4_start,1,MPI_INTEGER, + & iturn4_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iturn3_end,1,MPI_INTEGER, + & iturn3_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iturn4_end,1,MPI_INTEGER, + & iturn4_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iatel_s,1,MPI_INTEGER, + & iatel_s_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iatel_e,1,MPI_INTEGER, + & iatel_e_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(ielstart(1),maxres,MPI_INTEGER, + & ielstart_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(ielend(1),maxres,MPI_INTEGER, + & ielend_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR) + if (lprint) then + write (iout,*) "iatel_s_all",(iatel_s_all(i),i=0,nfgtasks) + write (iout,*) "iatel_e_all",(iatel_e_all(i),i=0,nfgtasks) + write (iout,*) "iturn3_start_all", + & (iturn3_start_all(i),i=0,nfgtasks-1) + write (iout,*) "iturn3_end_all", + & (iturn3_end_all(i),i=0,nfgtasks-1) + write (iout,*) "iturn4_start_all", + & (iturn4_start_all(i),i=0,nfgtasks-1) + write (iout,*) "iturn4_end_all", + & (iturn4_end_all(i),i=0,nfgtasks-1) + write (iout,*) "The ielstart_all array" + do i=nnt,nct + write (iout,'(20i4)') i,(ielstart_all(i,j),j=0,nfgtasks-1) + enddo + write (iout,*) "The ielend_all array" + do i=nnt,nct + write (iout,'(20i4)') i,(ielend_all(i,j),j=0,nfgtasks-1) + enddo + call flush(iout) + endif + ntask_cont_from=0 + ntask_cont_to=0 + itask_cont_from(0)=fg_rank + itask_cont_to(0)=fg_rank + flag=.false. + do ii=iturn3_start,iturn3_end + call add_int(ii,ii+2,iturn3_sent(1,ii), + & ntask_cont_to,itask_cont_to,flag) + enddo + do ii=iturn4_start,iturn4_end + call add_int(ii,ii+3,iturn4_sent(1,ii), + & ntask_cont_to,itask_cont_to,flag) + enddo + do ii=iturn3_start,iturn3_end + call add_int_from(ii,ii+2,ntask_cont_from,itask_cont_from) + enddo + do ii=iturn4_start,iturn4_end + call add_int_from(ii,ii+3,ntask_cont_from,itask_cont_from) + enddo + if (lprint) then + write (iout,*) "After turn3 ntask_cont_from",ntask_cont_from, + & " ntask_cont_to",ntask_cont_to + write (iout,*) "itask_cont_from", + & (itask_cont_from(i),i=1,ntask_cont_from) + write (iout,*) "itask_cont_to", + & (itask_cont_to(i),i=1,ntask_cont_to) + call flush(iout) + endif +c write (iout,*) "Loop forward" +c call flush(iout) + do i=iatel_s,iatel_e +c write (iout,*) "from loop i=",i +c call flush(iout) + do j=ielstart(i),ielend(i) + call add_int_from(i,j,ntask_cont_from,itask_cont_from) + enddo + enddo +c write (iout,*) "Loop backward iatel_e-1",iatel_e-1, +c & " iatel_e",iatel_e +c call flush(iout) + nat_sent=0 + do i=iatel_s,iatel_e +c write (iout,*) "i",i," ielstart",ielstart(i), +c & " ielend",ielend(i) +c call flush(iout) + flag=.false. + do j=ielstart(i),ielend(i) + call add_int(i,j,iint_sent(1,j,nat_sent+1),ntask_cont_to, + & itask_cont_to,flag) + enddo + if (flag) then + nat_sent=nat_sent+1 + iat_sent(nat_sent)=i + endif + enddo + if (lprint) then + write (iout,*)"After longrange ntask_cont_from",ntask_cont_from, + & " ntask_cont_to",ntask_cont_to + write (iout,*) "itask_cont_from", + & (itask_cont_from(i),i=1,ntask_cont_from) + write (iout,*) "itask_cont_to", + & (itask_cont_to(i),i=1,ntask_cont_to) + call flush(iout) + write (iout,*) "iint_sent" + do i=1,nat_sent + ii=iat_sent(i) + write (iout,'(20i4)') ii,(j,(iint_sent(k,j,i),k=1,4), + & j=ielstart(ii),ielend(ii)) + enddo + write (iout,*) "iturn3_sent iturn3_start",iturn3_start, + & " iturn3_end",iturn3_end + write (iout,'(20i4)') (i,(iturn3_sent(j,i),j=1,4), + & i=iturn3_start,iturn3_end) + write (iout,*) "iturn4_sent iturn4_start",iturn4_start, + & " iturn4_end",iturn4_end + write (iout,'(20i4)') (i,(iturn4_sent(j,i),j=1,4), + & i=iturn4_start,iturn4_end) + call flush(iout) + endif + call MPI_Gather(ntask_cont_from,1,MPI_INTEGER, + & ntask_cont_from_all,1,MPI_INTEGER,king,FG_COMM,IERR) +c write (iout,*) "Gather ntask_cont_from ended" +c call flush(iout) + call MPI_Gather(itask_cont_from(0),max_fg_procs,MPI_INTEGER, + & itask_cont_from_all(0,0),max_fg_procs,MPI_INTEGER,king, + & FG_COMM,IERR) +c write (iout,*) "Gather itask_cont_from ended" +c call flush(iout) + call MPI_Gather(ntask_cont_to,1,MPI_INTEGER,ntask_cont_to_all, + & 1,MPI_INTEGER,king,FG_COMM,IERR) +c write (iout,*) "Gather ntask_cont_to ended" +c call flush(iout) + call MPI_Gather(itask_cont_to,max_fg_procs,MPI_INTEGER, + & itask_cont_to_all,max_fg_procs,MPI_INTEGER,king,FG_COMM,IERR) +c write (iout,*) "Gather itask_cont_to ended" +c call flush(iout) + if (fg_rank.eq.king) then + write (iout,*)"Contact receive task map (proc, #tasks, tasks)" + do i=0,nfgtasks-1 + write (iout,'(20i4)') i,ntask_cont_from_all(i), + & (itask_cont_from_all(j,i),j=1,ntask_cont_from_all(i)) + enddo + write (iout,*) + call flush(iout) + write (iout,*) "Contact send task map (proc, #tasks, tasks)" + do i=0,nfgtasks-1 + write (iout,'(20i4)') i,ntask_cont_to_all(i), + & (itask_cont_to_all(j,i),j=1,ntask_cont_to_all(i)) + enddo + write (iout,*) + call flush(iout) +C Check if every send will have a matching receive + ncheck_to=0 + ncheck_from=0 + do i=0,nfgtasks-1 + ncheck_to=ncheck_to+ntask_cont_to_all(i) + ncheck_from=ncheck_from+ntask_cont_from_all(i) + enddo + write (iout,*) "Control sums",ncheck_from,ncheck_to + if (ncheck_from.ne.ncheck_to) then + write (iout,*) "Error: #receive differs from #send." + write (iout,*) "Terminating program...!" + call flush(iout) + flag=.false. + else + flag=.true. + do i=0,nfgtasks-1 + do j=1,ntask_cont_to_all(i) + ii=itask_cont_to_all(j,i) + do k=1,ntask_cont_from_all(ii) + if (itask_cont_from_all(k,ii).eq.i) then + if(lprint)write(iout,*)"Matching send/receive",i,ii + exit + endif + enddo + if (k.eq.ntask_cont_from_all(ii)+1) then + flag=.false. + write (iout,*) "Error: send by",j," to",ii, + & " would have no matching receive" + endif + enddo + enddo + endif + if (.not.flag) then + write (iout,*) "Unmatched sends; terminating program" + call flush(iout) + endif + endif + call MPI_Bcast(flag,1,MPI_LOGICAL,king,FG_COMM,IERROR) +c write (iout,*) "flag broadcast ended flag=",flag +c call flush(iout) + if (.not.flag) then + call MPI_Finalize(IERROR) + stop "Error in INIT_INT_TABLE: unmatched send/receive." + endif + call MPI_Comm_group(FG_COMM,fg_group,IERR) +c write (iout,*) "MPI_Comm_group ended" +c call flush(iout) + call MPI_Group_incl(fg_group,ntask_cont_from+1, + & itask_cont_from(0),CONT_FROM_GROUP,IERR) + call MPI_Group_incl(fg_group,ntask_cont_to+1,itask_cont_to(0), + & CONT_TO_GROUP,IERR) + do i=1,nat_sent + ii=iat_sent(i) + iaux=4*(ielend(ii)-ielstart(ii)+1) + call MPI_Group_translate_ranks(fg_group,iaux, + & iint_sent(1,ielstart(ii),i),CONT_TO_GROUP, + & iint_sent_local(1,ielstart(ii),i),IERR ) +c write (iout,*) "Ranks translated i=",i +c call flush(iout) + enddo + iaux=4*(iturn3_end-iturn3_start+1) + call MPI_Group_translate_ranks(fg_group,iaux, + & iturn3_sent(1,iturn3_start),CONT_TO_GROUP, + & iturn3_sent_local(1,iturn3_start),IERR) + iaux=4*(iturn4_end-iturn4_start+1) + call MPI_Group_translate_ranks(fg_group,iaux, + & iturn4_sent(1,iturn4_start),CONT_TO_GROUP, + & iturn4_sent_local(1,iturn4_start),IERR) + if (lprint) then + write (iout,*) "iint_sent_local" + do i=1,nat_sent + ii=iat_sent(i) + write (iout,'(20i4)') ii,(j,(iint_sent_local(k,j,i),k=1,4), + & j=ielstart(ii),ielend(ii)) + call flush(iout) + enddo + write (iout,*) "iturn3_sent_local iturn3_start",iturn3_start, + & " iturn3_end",iturn3_end + write (iout,'(20i4)') (i,(iturn3_sent_local(j,i),j=1,4), + & i=iturn3_start,iturn3_end) + write (iout,*) "iturn4_sent_local iturn4_start",iturn4_start, + & " iturn4_end",iturn4_end + write (iout,'(20i4)') (i,(iturn4_sent_local(j,i),j=1,4), + & i=iturn4_start,iturn4_end) + call flush(iout) + endif + call MPI_Group_free(fg_group,ierr) + call MPI_Group_free(cont_from_group,ierr) + call MPI_Group_free(cont_to_group,ierr) + call MPI_Type_contiguous(3,MPI_DOUBLE_PRECISION,MPI_UYZ,IERROR) + call MPI_Type_commit(MPI_UYZ,IERROR) + call MPI_Type_contiguous(18,MPI_DOUBLE_PRECISION,MPI_UYZGRAD, + & IERROR) + call MPI_Type_commit(MPI_UYZGRAD,IERROR) + call MPI_Type_contiguous(2,MPI_DOUBLE_PRECISION,MPI_MU,IERROR) + call MPI_Type_commit(MPI_MU,IERROR) + call MPI_Type_contiguous(4,MPI_DOUBLE_PRECISION,MPI_MAT1,IERROR) + call MPI_Type_commit(MPI_MAT1,IERROR) + call MPI_Type_contiguous(8,MPI_DOUBLE_PRECISION,MPI_MAT2,IERROR) + call MPI_Type_commit(MPI_MAT2,IERROR) + call MPI_Type_contiguous(6,MPI_DOUBLE_PRECISION,MPI_THET,IERROR) + call MPI_Type_commit(MPI_THET,IERROR) + call MPI_Type_contiguous(9,MPI_DOUBLE_PRECISION,MPI_GAM,IERROR) + call MPI_Type_commit(MPI_GAM,IERROR) +#ifndef MATGATHER +c 9/22/08 Derived types to send matrices which appear in correlation terms + do i=0,nfgtasks-1 + if (ivec_count(i).eq.ivec_count(0)) then + lentyp(i)=0 + else + lentyp(i)=1 + endif + enddo + do ind_typ=lentyp(0),lentyp(nfgtasks-1) + if (ind_typ.eq.0) then + ichunk=ivec_count(0) + else + ichunk=ivec_count(1) + endif +c do i=1,4 +c blocklengths(i)=4 +c enddo +c displs(1)=0 +c do i=2,4 +c displs(i)=displs(i-1)+blocklengths(i-1)*maxres +c enddo +c do i=1,4 +c blocklengths(i)=blocklengths(i)*ichunk +c enddo +c write (iout,*) "blocklengths and displs" +c do i=1,4 +c write (iout,*) i,blocklengths(i),displs(i) +c enddo +c call flush(iout) +c call MPI_Type_indexed(4,blocklengths(1),displs(1), +c & MPI_DOUBLE_PRECISION,MPI_ROTAT1(ind_typ),IERROR) +c call MPI_Type_commit(MPI_ROTAT1(ind_typ),IERROR) +c write (iout,*) "MPI_ROTAT1",MPI_ROTAT1 +c do i=1,4 +c blocklengths(i)=2 +c enddo +c displs(1)=0 +c do i=2,4 +c displs(i)=displs(i-1)+blocklengths(i-1)*maxres +c enddo +c do i=1,4 +c blocklengths(i)=blocklengths(i)*ichunk +c enddo +c write (iout,*) "blocklengths and displs" +c do i=1,4 +c write (iout,*) i,blocklengths(i),displs(i) +c enddo +c call flush(iout) +c call MPI_Type_indexed(4,blocklengths(1),displs(1), +c & MPI_DOUBLE_PRECISION,MPI_ROTAT2(ind_typ),IERROR) +c call MPI_Type_commit(MPI_ROTAT2(ind_typ),IERROR) +c write (iout,*) "MPI_ROTAT2",MPI_ROTAT2 + do i=1,8 + blocklengths(i)=2 + enddo + displs(1)=0 + do i=2,8 + displs(i)=displs(i-1)+blocklengths(i-1)*maxres + enddo + do i=1,15 + blocklengths(i)=blocklengths(i)*ichunk + enddo + call MPI_Type_indexed(8,blocklengths,displs, + & MPI_DOUBLE_PRECISION,MPI_PRECOMP11(ind_typ),IERROR) + call MPI_Type_commit(MPI_PRECOMP11(ind_typ),IERROR) + do i=1,8 + blocklengths(i)=4 + enddo + displs(1)=0 + do i=2,8 + displs(i)=displs(i-1)+blocklengths(i-1)*maxres + enddo + do i=1,15 + blocklengths(i)=blocklengths(i)*ichunk + enddo + call MPI_Type_indexed(8,blocklengths,displs, + & MPI_DOUBLE_PRECISION,MPI_PRECOMP12(ind_typ),IERROR) + call MPI_Type_commit(MPI_PRECOMP12(ind_typ),IERROR) + do i=1,6 + blocklengths(i)=4 + enddo + displs(1)=0 + do i=2,6 + displs(i)=displs(i-1)+blocklengths(i-1)*maxres + enddo + do i=1,6 + blocklengths(i)=blocklengths(i)*ichunk + enddo + call MPI_Type_indexed(6,blocklengths,displs, + & MPI_DOUBLE_PRECISION,MPI_PRECOMP22(ind_typ),IERROR) + call MPI_Type_commit(MPI_PRECOMP22(ind_typ),IERROR) + do i=1,2 + blocklengths(i)=8 + enddo + displs(1)=0 + do i=2,2 + displs(i)=displs(i-1)+blocklengths(i-1)*maxres + enddo + do i=1,2 + blocklengths(i)=blocklengths(i)*ichunk + enddo + call MPI_Type_indexed(2,blocklengths,displs, + & MPI_DOUBLE_PRECISION,MPI_PRECOMP23(ind_typ),IERROR) + call MPI_Type_commit(MPI_PRECOMP23(ind_typ),IERROR) + do i=1,4 + blocklengths(i)=1 + enddo + displs(1)=0 + do i=2,4 + displs(i)=displs(i-1)+blocklengths(i-1)*maxres + enddo + do i=1,4 + blocklengths(i)=blocklengths(i)*ichunk + enddo + call MPI_Type_indexed(4,blocklengths,displs, + & MPI_DOUBLE_PRECISION,MPI_ROTAT_OLD(ind_typ),IERROR) + call MPI_Type_commit(MPI_ROTAT_OLD(ind_typ),IERROR) + enddo +#endif + endif + iint_start=ivec_start+1 + iint_end=ivec_end+1 + do i=0,nfgtasks-1 + iint_count(i)=ivec_count(i) + iint_displ(i)=ivec_displ(i) + ivec_displ(i)=ivec_displ(i)-1 + iset_displ(i)=iset_displ(i)-1 + ithet_displ(i)=ithet_displ(i)-1 + iphi_displ(i)=iphi_displ(i)-1 + iphi1_displ(i)=iphi1_displ(i)-1 + ibond_displ(i)=ibond_displ(i)-1 + enddo + if (nfgtasks.gt.1 .and. fg_rank.eq.king + & .and. (me.eq.0 .or. out1file)) then + write (iout,*) "IVEC_DISPL, IVEC_COUNT, ISET_START, ISET_COUNT" + do i=0,nfgtasks-1 + write (iout,*) i,ivec_displ(i),ivec_count(i),iset_displ(i), + & iset_count(i) + enddo + write (iout,*) "iphi_start",iphi_start," iphi_end",iphi_end, + & " iphi1_start",iphi1_start," iphi1_end",iphi1_end + write (iout,*)"IPHI_COUNT, IPHI_DISPL, IPHI1_COUNT, IPHI1_DISPL" + do i=0,nfgtasks-1 + write (iout,*) i,iphi_count(i),iphi_displ(i),iphi1_count(i), + & iphi1_displ(i) + enddo + write(iout,'(i10,a,i10,a,i10,a/a,i3,a)') n_sc_int_tot,' SC-SC ', + & nele_int_tot,' electrostatic and ',nscp_int_tot, + & ' SC-p interactions','were distributed among',nfgtasks, + & ' fine-grain processors.' + endif +#else + loc_start=2 + loc_end=nres-1 + ithet_start=3 + ithet_end=nres + iturn3_start=nnt + iturn3_end=nct-3 + iturn4_start=nnt + iturn4_end=nct-4 + iphi_start=nnt+3 + iphi_end=nct + iphi1_start=4 + iphi1_end=nres + idihconstr_start=1 + idihconstr_end=ndih_constr + iphid_start=iphi_start + iphid_end=iphi_end-1 + itau_start=4 + itau_end=nres + ibond_start=2 + ibond_end=nres-1 + ibondp_start=nnt+1 + ibondp_end=nct + ivec_start=1 + ivec_end=nres-1 + iset_start=3 + iset_end=nres+1 + iint_start=2 + iint_end=nres-1 +#endif + return + end +#ifdef MPI +c--------------------------------------------------------------------------- + subroutine add_int(ii,jj,itask,ntask_cont_to,itask_cont_to,flag) + implicit none + include "DIMENSIONS" + include "COMMON.INTERACT" + include "COMMON.SETUP" + include "COMMON.IOUNITS" + integer ii,jj,itask(4),ntask_cont_to,itask_cont_to(0:MaxProcs-1) + logical flag + integer iturn3_start_all,iturn3_end_all,iturn4_start_all, + & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all + common /przechowalnia/ iturn3_start_all(0:MaxProcs), + & iturn3_end_all(0:MaxProcs),iturn4_start_all(0:MaxProcs), + & iturn4_end_all(0:MaxProcs),iatel_s_all(0:MaxProcs), + & iatel_e_all(0:MaxProcs),ielstart_all(maxres,0:MaxProcs-1), + & ielend_all(maxres,0:MaxProcs-1) + integer iproc,isent,k,l +c Determines whether to send interaction ii,jj to other processors; a given +c interaction can be sent to at most 2 processors. +c Sets flag=.true. if interaction ii,jj needs to be sent to at least +c one processor, otherwise flag is unchanged from the input value. + isent=0 + itask(1)=fg_rank + itask(2)=fg_rank + itask(3)=fg_rank + itask(4)=fg_rank +c write (iout,*) "ii",ii," jj",jj +c Loop over processors to check if anybody could need interaction ii,jj + do iproc=0,fg_rank-1 +c Check if the interaction matches any turn3 at iproc + do k=iturn3_start_all(iproc),iturn3_end_all(iproc) + l=k+2 + if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1 + & .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1) + & then +c write (iout,*) "turn3 to iproc",iproc," ij",ii,jj,"kl",k,l +c call flush(iout) + flag=.true. + if (iproc.ne.itask(1).and.iproc.ne.itask(2) + & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then + isent=isent+1 + itask(isent)=iproc + call add_task(iproc,ntask_cont_to,itask_cont_to) + endif + endif + enddo +C Check if the interaction matches any turn4 at iproc + do k=iturn4_start_all(iproc),iturn4_end_all(iproc) + l=k+3 + if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1 + & .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1) + & then +c write (iout,*) "turn3 to iproc",iproc," ij",ii,jj," kl",k,l +c call flush(iout) + flag=.true. + if (iproc.ne.itask(1).and.iproc.ne.itask(2) + & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then + isent=isent+1 + itask(isent)=iproc + call add_task(iproc,ntask_cont_to,itask_cont_to) + endif + endif + enddo + if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0 .and. + & iatel_s_all(iproc).le.ii-1 .and. iatel_e_all(iproc).ge.ii-1)then + if (ielstart_all(ii-1,iproc).le.jj-1.and. + & ielend_all(ii-1,iproc).ge.jj-1) then + flag=.true. + if (iproc.ne.itask(1).and.iproc.ne.itask(2) + & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then + isent=isent+1 + itask(isent)=iproc + call add_task(iproc,ntask_cont_to,itask_cont_to) + endif + endif + if (ielstart_all(ii-1,iproc).le.jj+1.and. + & ielend_all(ii-1,iproc).ge.jj+1) then + flag=.true. + if (iproc.ne.itask(1).and.iproc.ne.itask(2) + & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then + isent=isent+1 + itask(isent)=iproc + call add_task(iproc,ntask_cont_to,itask_cont_to) + endif + endif + endif + enddo + return + end +c--------------------------------------------------------------------------- + subroutine add_int_from(ii,jj,ntask_cont_from,itask_cont_from) + implicit none + include "DIMENSIONS" + include "COMMON.INTERACT" + include "COMMON.SETUP" + include "COMMON.IOUNITS" + integer ii,jj,itask(2),ntask_cont_from, + & itask_cont_from(0:MaxProcs-1) + logical flag + integer iturn3_start_all,iturn3_end_all,iturn4_start_all, + & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all + common /przechowalnia/ iturn3_start_all(0:MaxProcs), + & iturn3_end_all(0:MaxProcs),iturn4_start_all(0:MaxProcs), + & iturn4_end_all(0:MaxProcs),iatel_s_all(0:MaxProcs), + & iatel_e_all(0:MaxProcs),ielstart_all(maxres,0:MaxProcs-1), + & ielend_all(maxres,0:MaxProcs-1) + integer iproc,k,l + do iproc=fg_rank+1,nfgtasks-1 + do k=iturn3_start_all(iproc),iturn3_end_all(iproc) + l=k+2 + if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1 + & .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1) + & then +c write (iout,*)"turn3 from iproc",iproc," ij",ii,jj," kl",k,l + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + enddo + do k=iturn4_start_all(iproc),iturn4_end_all(iproc) + l=k+3 + if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1 + & .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1) + & then +c write (iout,*)"turn4 from iproc",iproc," ij",ii,jj," kl",k,l + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + enddo + if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0) then + if (ii+1.ge.iatel_s_all(iproc).and.ii+1.le.iatel_e_all(iproc)) + & then + if (jj+1.ge.ielstart_all(ii+1,iproc).and. + & jj+1.le.ielend_all(ii+1,iproc)) then + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + if (jj-1.ge.ielstart_all(ii+1,iproc).and. + & jj-1.le.ielend_all(ii+1,iproc)) then + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + endif + if (ii-1.ge.iatel_s_all(iproc).and.ii-1.le.iatel_e_all(iproc)) + & then + if (jj-1.ge.ielstart_all(ii-1,iproc).and. + & jj-1.le.ielend_all(ii-1,iproc)) then + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + if (jj+1.ge.ielstart_all(ii-1,iproc).and. + & jj+1.le.ielend_all(ii-1,iproc)) then + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + endif + endif + enddo + return + end +c--------------------------------------------------------------------------- + subroutine add_task(iproc,ntask_cont,itask_cont) + implicit none + include "DIMENSIONS" + integer iproc,ntask_cont,itask_cont(0:MaxProcs-1) + integer ii + do ii=1,ntask_cont + if (itask_cont(ii).eq.iproc) return + enddo + ntask_cont=ntask_cont+1 + itask_cont(ntask_cont)=iproc + return + end +c--------------------------------------------------------------------------- + subroutine int_bounds(total_ints,lower_bound,upper_bound) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SETUP' + integer total_ints,lower_bound,upper_bound + integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs) + nint=total_ints/nfgtasks + do i=1,nfgtasks + int4proc(i-1)=nint + enddo + nexcess=total_ints-nint*nfgtasks + do i=1,nexcess + int4proc(nfgtasks-i)=int4proc(nfgtasks-i)+1 + enddo + lower_bound=0 + do i=0,fg_rank-1 + lower_bound=lower_bound+int4proc(i) + enddo + upper_bound=lower_bound+int4proc(fg_rank) + lower_bound=lower_bound+1 + return + end +c--------------------------------------------------------------------------- + subroutine int_bounds1(total_ints,lower_bound,upper_bound) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SETUP' + integer total_ints,lower_bound,upper_bound + integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs) + nint=total_ints/nfgtasks1 + do i=1,nfgtasks1 + int4proc(i-1)=nint + enddo + nexcess=total_ints-nint*nfgtasks1 + do i=1,nexcess + int4proc(nfgtasks1-i)=int4proc(nfgtasks1-i)+1 + enddo + lower_bound=0 + do i=0,fg_rank1-1 + lower_bound=lower_bound+int4proc(i) + enddo + upper_bound=lower_bound+int4proc(fg_rank1) + lower_bound=lower_bound+1 + return + end +c--------------------------------------------------------------------------- + subroutine int_partition(int_index,lower_index,upper_index,atom, + & at_start,at_end,first_atom,last_atom,int_gr,jat_start,jat_end,*) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + integer int_index,lower_index,upper_index,atom,at_start,at_end, + & first_atom,last_atom,int_gr,jat_start,jat_end + logical lprn + lprn=.false. + if (lprn) write (iout,*) 'int_index=',int_index + int_index_old=int_index + int_index=int_index+last_atom-first_atom+1 + if (lprn) + & write (iout,*) 'int_index=',int_index, + & ' int_index_old',int_index_old, + & ' lower_index=',lower_index, + & ' upper_index=',upper_index, + & ' atom=',atom,' first_atom=',first_atom, + & ' last_atom=',last_atom + if (int_index.ge.lower_index) then + int_gr=int_gr+1 + if (at_start.eq.0) then + at_start=atom + jat_start=first_atom-1+lower_index-int_index_old + else + jat_start=first_atom + endif + if (lprn) write (iout,*) 'jat_start',jat_start + if (int_index.ge.upper_index) then + at_end=atom + jat_end=first_atom-1+upper_index-int_index_old + return1 + else + jat_end=last_atom + endif + if (lprn) write (iout,*) 'jat_end',jat_end + endif + return + end +#endif +c------------------------------------------------------------------------------ + subroutine hpb_partition + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' + include 'COMMON.SETUP' + include 'COMMON.CONTROL' +c write(2,*)"hpb_partition: nhpb=",nhpb +#ifdef MPI + call int_bounds(nhpb,link_start,link_end) + if (.not. out1file) + & write (iout,*) 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',MyRank, + & ' nhpb',nhpb,' link_start=',link_start, + & ' link_end',link_end +#else + link_start=1 + link_end=nhpb +#endif +c write(2,*)"hpb_partition: link_start=",nhpb," link_end=",link_end + return + end diff --git a/source/unres/src_Eshel/int_to_cart.f b/source/unres/src_Eshel/int_to_cart.f new file mode 100644 index 0000000..73e8384 --- /dev/null +++ b/source/unres/src_Eshel/int_to_cart.f @@ -0,0 +1,278 @@ + subroutine int_to_cart +c-------------------------------------------------------------- +c This subroutine converts the energy derivatives from internal +c coordinates to cartesian coordinates +c------------------------------------------------------------- + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.SCCOR' +c calculating dE/ddc1 + if (nres.lt.3) goto 18 +c do i=1,nres +c c do intertyp=1,3 +c write (iout,*) "przed tosyjnymi",i,intertyp,gcart(intertyp,i) +c &,gloc_sc(1,i,icg),gloc(i,icg) +c enddo +c enddo + do j=1,3 + gcart(j,1)=gcart(j,1)+gloc(1,icg)*dphi(j,1,4) + & +gloc(nres-2,icg)*dtheta(j,1,3) + if(itype(2).ne.10) then + gcart(j,1)=gcart(j,1)+gloc(ialph(2,1),icg)*dalpha(j,1,2)+ + & gloc(ialph(2,1)+nside,icg)*domega(j,1,2) + endif + enddo +c Calculating the remainder of dE/ddc2 + do j=1,3 + gcart(j,2)=gcart(j,2)+gloc(1,icg)*dphi(j,2,4)+ + & gloc(nres-2,icg)*dtheta(j,2,3)+gloc(nres-1,icg)*dtheta(j,1,4) + if(itype(2).ne.10) then + gcart(j,2)=gcart(j,2)+gloc(ialph(2,1),icg)*dalpha(j,2,2)+ + & gloc(ialph(2,1)+nside,icg)*domega(j,2,2) + endif + if(itype(3).ne.10) then + gcart(j,2)=gcart(j,2)+gloc(ialph(3,1),icg)*dalpha(j,1,3)+ + & gloc(ialph(3,1)+nside,icg)*domega(j,1,3) + endif + if(nres.gt.4) then + gcart(j,2)=gcart(j,2)+gloc(2,icg)*dphi(j,1,5) + endif + enddo +c If there are only five residues + if(nres.eq.5) then + do j=1,3 + gcart(j,3)=gcart(j,3)+gloc(1,icg)*dphi(j,3,4)+gloc(2,icg)* + & dphi(j,2,5)+gloc(nres-1,icg)*dtheta(j,2,4)+gloc(nres,icg)* + & dtheta(j,1,5) + if(itype(3).ne.10) then + gcart(j,3)=gcart(j,3)+gloc(ialph(3,1),icg)* + & dalpha(j,2,3)+gloc(ialph(3,1)+nside,icg)*domega(j,2,3) + endif + if(itype(4).ne.10) then + gcart(j,3)=gcart(j,3)+gloc(ialph(4,1),icg)* + & dalpha(j,1,4)+gloc(ialph(4,1)+nside,icg)*domega(j,1,4) + endif + enddo + endif +c If there are more than five residues + if(nres.gt.5) then + do i=3,nres-3 + do j=1,3 + gcart(j,i)=gcart(j,i)+gloc(i-2,icg)*dphi(j,3,i+1) + & +gloc(i-1,icg)*dphi(j,2,i+2)+ + & gloc(i,icg)*dphi(j,1,i+3)+gloc(nres+i-4,icg)*dtheta(j,2,i+1)+ + & gloc(nres+i-3,icg)*dtheta(j,1,i+2) + if(itype(i).ne.10) then + gcart(j,i)=gcart(j,i)+gloc(ialph(i,1),icg)*dalpha(j,2,i)+ + & gloc(ialph(i,1)+nside,icg)*domega(j,2,i) + endif + if(itype(i+1).ne.10) then + gcart(j,i)=gcart(j,i)+gloc(ialph(i+1,1),icg)*dalpha(j,1,i+1) + & +gloc(ialph(i+1,1)+nside,icg)*domega(j,1,i+1) + endif + enddo + enddo + endif +c Setting dE/ddnres-2 + if(nres.gt.5) then + do j=1,3 + gcart(j,nres-2)=gcart(j,nres-2)+gloc(nres-4,icg)* + & dphi(j,3,nres-1)+gloc(nres-3,icg)*dphi(j,2,nres) + & +gloc(2*nres-6,icg)* + & dtheta(j,2,nres-1)+gloc(2*nres-5,icg)*dtheta(j,1,nres) + if(itype(nres-2).ne.10) then + gcart(j,nres-2)=gcart(j,nres-2)+gloc(ialph(nres-2,1),icg)* + & dalpha(j,2,nres-2)+gloc(ialph(nres-2,1)+nside,icg)* + & domega(j,2,nres-2) + endif + if(itype(nres-1).ne.10) then + gcart(j,nres-2)=gcart(j,nres-2)+gloc(ialph(nres-1,1),icg)* + & dalpha(j,1,nres-1)+gloc(ialph(nres-1,1)+nside,icg)* + & domega(j,1,nres-1) + endif + enddo + endif +c Settind dE/ddnres-1 + do j=1,3 + gcart(j,nres-1)=gcart(j,nres-1)+gloc(nres-3,icg)*dphi(j,3,nres)+ + & gloc(2*nres-5,icg)*dtheta(j,2,nres) + if(itype(nres-1).ne.10) then + gcart(j,nres-1)=gcart(j,nres-1)+gloc(ialph(nres-1,1),icg)* + & dalpha(j,2,nres-1)+gloc(ialph(nres-1,1)+nside,icg)* + & domega(j,2,nres-1) + endif + enddo +c The side-chain vector derivatives + do i=2,nres-1 + if(itype(i).ne.10) then + do j=1,3 + gxcart(j,i)=gxcart(j,i)+gloc(ialph(i,1),icg)*dalpha(j,3,i) + & +gloc(ialph(i,1)+nside,icg)*domega(j,3,i) + enddo + endif + enddo +c---------------------------------------------------------------------- +C INTERTYP=1 SC...Ca...Ca...Ca +C INTERTYP=2 Ca...Ca...Ca...SC +C INTERTYP=3 SC...Ca...Ca...SC +c calculating dE/ddc1 + 18 continue +c do i=1,nres +c gloc(i,icg)=0.0D0 +c write (iout,*) "poczotkoawy",i,gloc_sc(1,i,icg) +c enddo + if (nres.lt.2) return + if ((nres.lt.3).and.(itype(1).eq.10)) return + if ((itype(1).ne.10).and.(itype(1).ne.21)) then + do j=1,3 +cc Derviative was calculated for oposite vector of side chain therefore +c there is "-" sign before gloc_sc + gxcart(j,1)=gxcart(j,1)-gloc_sc(1,0,icg)* + & dtauangle(j,1,1,3) + gcart(j,1)=gcart(j,1)+gloc_sc(1,0,icg)* + & dtauangle(j,1,2,3) + if ((itype(2).ne.10).and.(itype(2).ne.21)) then + gxcart(j,1)= gxcart(j,1) + & -gloc_sc(3,0,icg)*dtauangle(j,3,1,3) + gcart(j,1)=gcart(j,1)+gloc_sc(3,0,icg)* + & dtauangle(j,3,2,3) + endif + enddo + endif + if ((nres.ge.3).and.(itype(3).ne.10).and.(itype(3).ne.21)) + & then + do j=1,3 + gcart(j,1)=gcart(j,1)+gloc_sc(2,1,icg)*dtauangle(j,2,1,4) + enddo + endif +c As potetnial DO NOT depend on omicron anlge their derivative is +c ommited +c & +gloc_sc(intertyp,nres-2,icg)*dtheta(j,1,3) + +c Calculating the remainder of dE/ddc2 + do j=1,3 + if((itype(2).ne.10).and.(itype(2).ne.21)) then + if (itype(1).ne.10) gxcart(j,2)=gxcart(j,2)+ + & gloc_sc(3,0,icg)*dtauangle(j,3,3,3) + if ((itype(3).ne.10).and.(nres.ge.3).and.(itype(3).ne.21)) then + gxcart(j,2)=gxcart(j,2)-gloc_sc(3,1,icg)*dtauangle(j,3,1,4) +cc the - above is due to different vector direction + gcart(j,2)=gcart(j,2)+gloc_sc(3,1,icg)*dtauangle(j,3,2,4) + endif + if (nres.gt.3) then + gxcart(j,2)=gxcart(j,2)-gloc_sc(1,1,icg)*dtauangle(j,1,1,4) +cc the - above is due to different vector direction + gcart(j,2)=gcart(j,2)+gloc_sc(1,1,icg)*dtauangle(j,1,2,4) +c write(iout,*) gloc_sc(1,1,icg),dtauangle(j,1,2,4),"gcart" +c write(iout,*) gloc_sc(1,1,icg),dtauangle(j,1,1,4),"gx" + endif + endif + if ((itype(1).ne.10).and.(itype(1).ne.21)) then + gcart(j,2)=gcart(j,2)+gloc_sc(1,0,icg)*dtauangle(j,1,3,3) +c write(iout,*) gloc_sc(1,0,icg),dtauangle(j,1,3,3) + endif + if ((itype(3).ne.10).and.(nres.ge.3)) then + gcart(j,2)=gcart(j,2)+gloc_sc(2,1,icg)*dtauangle(j,2,2,4) +c write(iout,*) gloc_sc(2,1,icg),dtauangle(j,2,2,4) + endif + if ((itype(4).ne.10).and.(nres.ge.4)) then + gcart(j,2)=gcart(j,2)+gloc_sc(2,2,icg)*dtauangle(j,2,1,5) +c write(iout,*) gloc_sc(2,2,icg),dtauangle(j,2,1,5) + endif + +c write(iout,*) gcart(j,2),itype(2),itype(1),itype(3), "gcart2" + enddo +c If there are more than five residues + if(nres.ge.5) then + do i=3,nres-2 + do j=1,3 +c write(iout,*) "before", gcart(j,i) + if (itype(i).ne.10) then + gxcart(j,i)=gxcart(j,i)+gloc_sc(2,i-2,icg) + & *dtauangle(j,2,3,i+1) + & -gloc_sc(1,i-1,icg)*dtauangle(j,1,1,i+2) + gcart(j,i)=gcart(j,i)+gloc_sc(1,i-1,icg) + & *dtauangle(j,1,2,i+2) +c write(iout,*) "new",j,i, +c & gcart(j,i),gloc_sc(1,i-1,icg),dtauangle(j,1,2,i+2) + + if (itype(i-1).ne.10) then + gxcart(j,i)=gxcart(j,i)+gloc_sc(3,i-2,icg) + &*dtauangle(j,3,3,i+1) + endif + if (itype(i+1).ne.10) then + gxcart(j,i)=gxcart(j,i)-gloc_sc(3,i-1,icg) + &*dtauangle(j,3,1,i+2) + gcart(j,i)=gcart(j,i)+gloc_sc(3,i-1,icg) + &*dtauangle(j,3,2,i+2) + endif + endif + if (itype(i-1).ne.10) then + gcart(j,i)=gcart(j,i)+gloc_sc(1,i-2,icg)* + & dtauangle(j,1,3,i+1) + endif + if (itype(i+1).ne.10) then + gcart(j,i)=gcart(j,i)+gloc_sc(2,i-1,icg)* + & dtauangle(j,2,2,i+2) +c write(iout,*) "numer",i,gloc_sc(2,i-1,icg), +c & dtauangle(j,2,2,i+2) + endif + if (itype(i+2).ne.10) then + gcart(j,i)=gcart(j,i)+gloc_sc(2,i,icg)* + & dtauangle(j,2,1,i+3) + endif + enddo + enddo + endif +c Setting dE/ddnres-1 + if(nres.ge.4) then + do j=1,3 + if ((itype(nres-1).ne.10).and.(itype(nres-1).ne.21)) then + gxcart(j,nres-1)=gxcart(j,nres-1)+gloc_sc(2,nres-3,icg) + & *dtauangle(j,2,3,nres) +c write (iout,*) "gxcart(nres-1)", gloc_sc(2,nres-3,icg), +c & dtauangle(j,2,3,nres), gxcart(j,nres-1) + if (itype(nres-2).ne.10) then + gxcart(j,nres-1)=gxcart(j,nres-1)+gloc_sc(3,nres-3,icg) + & *dtauangle(j,3,3,nres) + endif + if ((itype(nres).ne.10).and.(itype(nres).ne.21)) then + gxcart(j,nres-1)=gxcart(j,nres-1)-gloc_sc(3,nres-2,icg) + & *dtauangle(j,3,1,nres+1) + gcart(j,nres-1)=gcart(j,nres-1)+gloc_sc(3,nres-2,icg) + & *dtauangle(j,3,2,nres+1) + endif + endif + if ((itype(nres-2).ne.10).and.(itype(nres-2).ne.21)) then + gcart(j,nres-1)=gcart(j,nres-1)+gloc_sc(1,nres-3,icg)* + & dtauangle(j,1,3,nres) + endif + if ((itype(nres).ne.10).and.(itype(nres).ne.21)) then + gcart(j,nres-1)=gcart(j,nres-1)+gloc_sc(2,nres-2,icg)* + & dtauangle(j,2,2,nres+1) +c write (iout,*) "gcart(nres-1)", gloc_sc(2,nres-2,icg), +c & dtauangle(j,2,2,nres+1), itype(nres-1),itype(nres) + endif + enddo + endif +c Settind dE/ddnres + if ((nres.ge.3).and.(itype(nres).ne.10))then + do j=1,3 + gxcart(j,nres)=gxcart(j,nres)+gloc_sc(3,nres-2,icg) + & *dtauangle(j,3,3,nres+1)+gloc_sc(2,nres-2,icg) + & *dtauangle(j,2,3,nres+1) + enddo + endif +c The side-chain vector derivatives + return + end + + diff --git a/source/unres/src_Eshel/intcartderiv.F b/source/unres/src_Eshel/intcartderiv.F new file mode 100644 index 0000000..c220540 --- /dev/null +++ b/source/unres/src_Eshel/intcartderiv.F @@ -0,0 +1,725 @@ + subroutine intcartderiv + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.LOCAL' + include 'COMMON.SCCOR' + double precision dcostheta(3,2,maxres), + & dcosphi(3,3,maxres),dsinphi(3,3,maxres), + & dcosalpha(3,3,maxres),dcosomega(3,3,maxres), + & dsinomega(3,3,maxres),vo1(3),vo2(3),vo3(3), + & dummy(3),vp1(3),vp2(3),vp3(3),vpp1(3),n(3) + +#if defined(MPI) && defined(PARINTDER) + if (nfgtasks.gt.1 .and. me.eq.king) + & call MPI_Bcast(8,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif + pi4 = 0.5d0*pipol + pi34 = 3*pi4 + +c write (iout,*) "iphi1_start",iphi1_start," iphi1_end",iphi1_end +c Derivatives of theta's +#if defined(MPI) && defined(PARINTDER) +c We need dtheta(:,:,i-1) to compute dphi(:,:,i) + do i=max0(ithet_start-1,3),ithet_end +#else + do i=3,nres +#endif + cost=dcos(theta(i)) + sint=sqrt(1-cost*cost) + do j=1,3 + dcostheta(j,1,i)=-(dc_norm(j,i-1)+cost*dc_norm(j,i-2))/ + & vbld(i-1) + dtheta(j,1,i)=-1/sint*dcostheta(j,1,i) + dcostheta(j,2,i)=-(dc_norm(j,i-2)+cost*dc_norm(j,i-1))/ + & vbld(i) + dtheta(j,2,i)=-1/sint*dcostheta(j,2,i) + enddo + enddo + +#if defined(MPI) && defined(PARINTDER) +c We need dtheta(:,:,i-1) to compute dphi(:,:,i) + do i=max0(ithet_start-1,3),ithet_end +#else + do i=3,nres +#endif + if ((itype(i-1).ne.10).and.(itype(i-1).ne.21)) then + cost1=dcos(omicron(1,i)) + sint1=sqrt(1-cost1*cost1) + cost2=dcos(omicron(2,i)) + sint2=sqrt(1-cost2*cost2) + do j=1,3 +CC Calculate derivative over first omicron (Cai-2,Cai-1,SCi-1) + dcosomicron(j,1,1,i)=-(dc_norm(j,i-1+nres)+ + & cost1*dc_norm(j,i-2))/ + & vbld(i-1) + domicron(j,1,1,i)=-1/sint1*dcosomicron(j,1,1,i) + dcosomicron(j,1,2,i)=-(dc_norm(j,i-2) + & +cost1*(dc_norm(j,i-1+nres)))/ + & vbld(i-1+nres) + domicron(j,1,2,i)=-1/sint1*dcosomicron(j,1,2,i) +CC Calculate derivative over second omicron Sci-1,Cai-1 Cai +CC Looks messy but better than if in loop + dcosomicron(j,2,1,i)=-(-dc_norm(j,i-1+nres) + & +cost2*dc_norm(j,i-1))/ + & vbld(i) + domicron(j,2,1,i)=-1/sint2*dcosomicron(j,2,1,i) + dcosomicron(j,2,2,i)=-(dc_norm(j,i-1) + & +cost2*(-dc_norm(j,i-1+nres)))/ + & vbld(i-1+nres) +c write(iout,*) "vbld", i,itype(i),vbld(i-1+nres) + domicron(j,2,2,i)=-1/sint2*dcosomicron(j,2,2,i) + enddo + endif + enddo + + + +c Derivatives of phi: +c If phi is 0 or 180 degrees, then the formulas +c have to be derived by power series expansion of the +c conventional formulas around 0 and 180. +#ifdef PARINTDER + do i=iphi1_start,iphi1_end +#else + do i=4,nres +#endif +c the conventional case + sint=dsin(theta(i)) + sint1=dsin(theta(i-1)) + sing=dsin(phi(i)) + cost=dcos(theta(i)) + cost1=dcos(theta(i-1)) + cosg=dcos(phi(i)) + scalp=scalar(dc_norm(1,i-3),dc_norm(1,i-1)) + fac0=1.0d0/(sint1*sint) + fac1=cost*fac0 + fac2=cost1*fac0 + fac3=cosg*cost1/(sint1*sint1) + fac4=cosg*cost/(sint*sint) +c Obtaining the gamma derivatives from sine derivative + if (phi(i).gt.-pi4.and.phi(i).le.pi4.or. + & phi(i).gt.pi34.and.phi(i).le.pi.or. + & phi(i).gt.-pi.and.phi(i).le.-pi34) then + call vecpr(dc_norm(1,i-1),dc_norm(1,i-2),vp1) + call vecpr(dc_norm(1,i-3),dc_norm(1,i-1),vp2) + call vecpr(dc_norm(1,i-3),dc_norm(1,i-2),vp3) + do j=1,3 + ctgt=cost/sint + ctgt1=cost1/sint1 + cosg_inv=1.0d0/cosg + dsinphi(j,1,i)=-sing*ctgt1*dtheta(j,1,i-1) + & -(fac0*vp1(j)+sing*dc_norm(j,i-3))*vbld_inv(i-2) + dphi(j,1,i)=cosg_inv*dsinphi(j,1,i) + dsinphi(j,2,i)= + & -sing*(ctgt1*dtheta(j,2,i-1)+ctgt*dtheta(j,1,i)) + & -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1) + dphi(j,2,i)=cosg_inv*dsinphi(j,2,i) +c Bug fixed 3/24/05 (AL) + dsinphi(j,3,i)=-sing*ctgt*dtheta(j,2,i) + & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i) +c & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1) + dphi(j,3,i)=cosg_inv*dsinphi(j,3,i) + enddo +c Obtaining the gamma derivatives from cosine derivative + else + do j=1,3 + dcosphi(j,1,i)=fac1*dcostheta(j,1,i-1)+fac3* + & dcostheta(j,1,i-1)-fac0*(dc_norm(j,i-1)-scalp* + & dc_norm(j,i-3))/vbld(i-2) + dphi(j,1,i)=-1/sing*dcosphi(j,1,i) + dcosphi(j,2,i)=fac1*dcostheta(j,2,i-1)+fac2* + & dcostheta(j,1,i)+fac3*dcostheta(j,2,i-1)+fac4* + & dcostheta(j,1,i) + dphi(j,2,i)=-1/sing*dcosphi(j,2,i) + dcosphi(j,3,i)=fac2*dcostheta(j,2,i)+fac4* + & dcostheta(j,2,i)-fac0*(dc_norm(j,i-3)-scalp* + & dc_norm(j,i-1))/vbld(i) + dphi(j,3,i)=-1/sing*dcosphi(j,3,i) + enddo + endif + enddo + +Calculate derivative of Tauangle +#ifdef PARINTDER + do i=itau_start,itau_end +#else + do i=3,nres +#endif + if ((itype(i-2).eq.21).or.(itype(i-2).eq.10)) cycle +cc dtauangle(j,intertyp,dervityp,residue number) +cc INTERTYP=1 SC...Ca...Ca..Ca +c the conventional case + sint=dsin(theta(i)) + sint1=dsin(omicron(2,i-1)) + sing=dsin(tauangle(1,i)) + cost=dcos(theta(i)) + cost1=dcos(omicron(2,i-1)) + cosg=dcos(tauangle(1,i)) + do j=1,3 + dc_norm2(j,i-2+nres)=-dc_norm(j,i-2+nres) +cc write(iout,*) dc_norm2(j,i-2+nres),"dcnorm" + enddo + scalp=scalar(dc_norm2(1,i-2+nres),dc_norm(1,i-1)) + fac0=1.0d0/(sint1*sint) + fac1=cost*fac0 + fac2=cost1*fac0 + fac3=cosg*cost1/(sint1*sint1) + fac4=cosg*cost/(sint*sint) +cc write(iout,*) "faki",fac0,fac1,fac2,fac3,fac4 +c Obtaining the gamma derivatives from sine derivative + if (tauangle(1,i).gt.-pi4.and.tauangle(1,i).le.pi4.or. + & tauangle(1,i).gt.pi34.and.tauangle(1,i).le.pi.or. + & tauangle(1,i).gt.-pi.and.tauangle(1,i).le.-pi34) then + call vecpr(dc_norm(1,i-1),dc_norm(1,i-2),vp1) + call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-1),vp2) + call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-2),vp3) + do j=1,3 + ctgt=cost/sint + ctgt1=cost1/sint1 + cosg_inv=1.0d0/cosg + dsintau(j,1,1,i)=-sing*ctgt1*domicron(j,2,2,i-1) + &-(fac0*vp1(j)+sing*(dc_norm2(j,i-2+nres))) + & *vbld_inv(i-2+nres) + dtauangle(j,1,1,i)=cosg_inv*dsintau(j,1,1,i) + dsintau(j,1,2,i)= + & -sing*(ctgt1*domicron(j,2,1,i-1)+ctgt*dtheta(j,1,i)) + & -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1) +c write(iout,*) "dsintau", dsintau(j,1,2,i) + dtauangle(j,1,2,i)=cosg_inv*dsintau(j,1,2,i) +c Bug fixed 3/24/05 (AL) + dsintau(j,1,3,i)=-sing*ctgt*dtheta(j,2,i) + & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i) +c & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1) + dtauangle(j,1,3,i)=cosg_inv*dsintau(j,1,3,i) + enddo +c Obtaining the gamma derivatives from cosine derivative + else + do j=1,3 + dcostau(j,1,1,i)=fac1*dcosomicron(j,2,2,i-1)+fac3* + & dcosomicron(j,2,2,i-1)-fac0*(dc_norm(j,i-1)-scalp* + & (dc_norm2(j,i-2+nres)))/vbld(i-2+nres) + dtauangle(j,1,1,i)=-1/sing*dcostau(j,1,1,i) + dcostau(j,1,2,i)=fac1*dcosomicron(j,2,1,i-1)+fac2* + & dcostheta(j,1,i)+fac3*dcosomicron(j,2,1,i-1)+fac4* + & dcostheta(j,1,i) + dtauangle(j,1,2,i)=-1/sing*dcostau(j,1,2,i) + dcostau(j,1,3,i)=fac2*dcostheta(j,2,i)+fac4* + & dcostheta(j,2,i)-fac0*(-dc_norm(j,i-2+nres)-scalp* + & dc_norm(j,i-1))/vbld(i) + dtauangle(j,1,3,i)=-1/sing*dcostau(j,1,3,i) +c write (iout,*) "else",i + enddo + endif +c do k=1,3 +c write(iout,*) "tu",i,k,(dtauangle(j,1,k,i),j=1,3) +c enddo + enddo +CC Second case Ca...Ca...Ca...SC +#ifdef PARINTDER + do i=itau_start,itau_end +#else + do i=4,nres +#endif + if ((itype(i-1).eq.21).or.(itype(i-1).eq.10)) cycle +c the conventional case + sint=dsin(omicron(1,i)) + sint1=dsin(theta(i-1)) + sing=dsin(tauangle(2,i)) + cost=dcos(omicron(1,i)) + cost1=dcos(theta(i-1)) + cosg=dcos(tauangle(2,i)) +c do j=1,3 +c dc_norm2(j,i-1+nres)=-dc_norm(j,i-1+nres) +c enddo + scalp=scalar(dc_norm(1,i-3),dc_norm(1,i-1+nres)) + fac0=1.0d0/(sint1*sint) + fac1=cost*fac0 + fac2=cost1*fac0 + fac3=cosg*cost1/(sint1*sint1) + fac4=cosg*cost/(sint*sint) +c Obtaining the gamma derivatives from sine derivative + if (tauangle(2,i).gt.-pi4.and.tauangle(2,i).le.pi4.or. + & tauangle(2,i).gt.pi34.and.tauangle(2,i).le.pi.or. + & tauangle(2,i).gt.-pi.and.tauangle(2,i).le.-pi34) then + call vecpr(dc_norm2(1,i-1+nres),dc_norm(1,i-2),vp1) + call vecpr(dc_norm(1,i-3),dc_norm(1,i-1+nres),vp2) + call vecpr(dc_norm(1,i-3),dc_norm(1,i-2),vp3) + do j=1,3 + ctgt=cost/sint + ctgt1=cost1/sint1 + cosg_inv=1.0d0/cosg + dsintau(j,2,1,i)=-sing*ctgt1*dtheta(j,1,i-1) + & +(fac0*vp1(j)-sing*dc_norm(j,i-3))*vbld_inv(i-2) +c write(iout,*) i,j,dsintau(j,2,1,i),sing*ctgt1*dtheta(j,1,i-1), +c &fac0*vp1(j),sing*dc_norm(j,i-3),vbld_inv(i-2),"dsintau(2,1)" + dtauangle(j,2,1,i)=cosg_inv*dsintau(j,2,1,i) + dsintau(j,2,2,i)= + & -sing*(ctgt1*dtheta(j,2,i-1)+ctgt*domicron(j,1,1,i)) + & -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1) +c write(iout,*) "sprawdzenie",i,j,sing*ctgt1*dtheta(j,2,i-1), +c & sing*ctgt*domicron(j,1,2,i), +c & (fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1) + dtauangle(j,2,2,i)=cosg_inv*dsintau(j,2,2,i) +c Bug fixed 3/24/05 (AL) + dsintau(j,2,3,i)=-sing*ctgt*domicron(j,1,2,i) + & +(fac0*vp3(j)-sing*dc_norm(j,i-1+nres))*vbld_inv(i-1+nres) +c & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1) + dtauangle(j,2,3,i)=cosg_inv*dsintau(j,2,3,i) + enddo +c Obtaining the gamma derivatives from cosine derivative + else + do j=1,3 + dcostau(j,2,1,i)=fac1*dcostheta(j,1,i-1)+fac3* + & dcostheta(j,1,i-1)-fac0*(dc_norm(j,i-1+nres)-scalp* + & dc_norm(j,i-3))/vbld(i-2) + dtauangle(j,2,1,i)=-1/sing*dcostau(j,2,1,i) + dcostau(j,2,2,i)=fac1*dcostheta(j,2,i-1)+fac2* + & dcosomicron(j,1,1,i)+fac3*dcostheta(j,2,i-1)+fac4* + & dcosomicron(j,1,1,i) + dtauangle(j,2,2,i)=-1/sing*dcostau(j,2,2,i) + dcostau(j,2,3,i)=fac2*dcosomicron(j,1,2,i)+fac4* + & dcosomicron(j,1,2,i)-fac0*(dc_norm(j,i-3)-scalp* + & dc_norm(j,i-1+nres))/vbld(i-1+nres) + dtauangle(j,2,3,i)=-1/sing*dcostau(j,2,3,i) +c write(iout,*) i,j,"else", dtauangle(j,2,3,i) + enddo + endif + enddo + + +CCC third case SC...Ca...Ca...SC +#ifdef PARINTDER + + do i=itau_start,itau_end +#else + do i=3,nres +#endif +c the conventional case + if ((itype(i-1).eq.21).or.(itype(i-1).eq.10).or. + &(itype(i-2).eq.21).or.(itype(i-2).eq.10)) cycle + sint=dsin(omicron(1,i)) + sint1=dsin(omicron(2,i-1)) + sing=dsin(tauangle(3,i)) + cost=dcos(omicron(1,i)) + cost1=dcos(omicron(2,i-1)) + cosg=dcos(tauangle(3,i)) + do j=1,3 + dc_norm2(j,i-2+nres)=-dc_norm(j,i-2+nres) +c dc_norm2(j,i-1+nres)=-dc_norm(j,i-1+nres) + enddo + scalp=scalar(dc_norm2(1,i-2+nres),dc_norm(1,i-1+nres)) + fac0=1.0d0/(sint1*sint) + fac1=cost*fac0 + fac2=cost1*fac0 + fac3=cosg*cost1/(sint1*sint1) + fac4=cosg*cost/(sint*sint) +c Obtaining the gamma derivatives from sine derivative + if (tauangle(3,i).gt.-pi4.and.tauangle(3,i).le.pi4.or. + & tauangle(3,i).gt.pi34.and.tauangle(3,i).le.pi.or. + & tauangle(3,i).gt.-pi.and.tauangle(3,i).le.-pi34) then + call vecpr(dc_norm(1,i-1+nres),dc_norm(1,i-2),vp1) + call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-1+nres),vp2) + call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-2),vp3) + do j=1,3 + ctgt=cost/sint + ctgt1=cost1/sint1 + cosg_inv=1.0d0/cosg + dsintau(j,3,1,i)=-sing*ctgt1*domicron(j,2,2,i-1) + & -(fac0*vp1(j)-sing*dc_norm(j,i-2+nres)) + & *vbld_inv(i-2+nres) + dtauangle(j,3,1,i)=cosg_inv*dsintau(j,3,1,i) + dsintau(j,3,2,i)= + & -sing*(ctgt1*domicron(j,2,1,i-1)+ctgt*domicron(j,1,1,i)) + & -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1) + dtauangle(j,3,2,i)=cosg_inv*dsintau(j,3,2,i) +c Bug fixed 3/24/05 (AL) + dsintau(j,3,3,i)=-sing*ctgt*domicron(j,1,2,i) + & +(fac0*vp3(j)-sing*dc_norm(j,i-1+nres)) + & *vbld_inv(i-1+nres) +c & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1) + dtauangle(j,3,3,i)=cosg_inv*dsintau(j,3,3,i) + enddo +c Obtaining the gamma derivatives from cosine derivative + else + do j=1,3 + dcostau(j,3,1,i)=fac1*dcosomicron(j,2,2,i-1)+fac3* + & dcosomicron(j,2,2,i-1)-fac0*(dc_norm(j,i-1+nres)-scalp* + & dc_norm2(j,i-2+nres))/vbld(i-2+nres) + dtauangle(j,3,1,i)=-1/sing*dcostau(j,3,1,i) + dcostau(j,3,2,i)=fac1*dcosomicron(j,2,1,i-1)+fac2* + & dcosomicron(j,1,1,i)+fac3*dcosomicron(j,2,1,i-1)+fac4* + & dcosomicron(j,1,1,i) + dtauangle(j,3,2,i)=-1/sing*dcostau(j,3,2,i) + dcostau(j,3,3,i)=fac2*dcosomicron(j,1,2,i)+fac4* + & dcosomicron(j,1,2,i)-fac0*(dc_norm2(j,i-2+nres)-scalp* + & dc_norm(j,i-1+nres))/vbld(i-1+nres) + dtauangle(j,3,3,i)=-1/sing*dcostau(j,3,3,i) +c write(iout,*) "else",i + enddo + endif + enddo +#ifdef CRYST_SC +c Derivatives of side-chain angles alpha and omega +#if defined(MPI) && defined(PARINTDER) + do i=ibond_start,ibond_end +#else + do i=2,nres-1 +#endif + if(itype(i).ne.10) then + fac5=1.0d0/dsqrt(2*(1+dcos(theta(i+1)))) + fac6=fac5/vbld(i) + fac7=fac5*fac5 + fac8=fac5/vbld(i+1) + fac9=fac5/vbld(i+nres) + scala1=scalar(dc_norm(1,i-1),dc_norm(1,i+nres)) + scala2=scalar(dc_norm(1,i),dc_norm(1,i+nres)) + cosa=dsqrt(0.5d0/(1.0d0+dcos(theta(i+1))))*( + & scalar(dC_norm(1,i),dC_norm(1,i+nres)) + & -scalar(dC_norm(1,i-1),dC_norm(1,i+nres))) + sina=sqrt(1-cosa*cosa) + sino=dsin(omeg(i)) + do j=1,3 + dcosalpha(j,1,i)=fac6*(scala1*dc_norm(j,i-1)- + & dc_norm(j,i+nres))-cosa*fac7*dcostheta(j,1,i+1) + dalpha(j,1,i)=-1/sina*dcosalpha(j,1,i) + dcosalpha(j,2,i)=fac8*(dc_norm(j,i+nres)- + & scala2*dc_norm(j,i))-cosa*fac7*dcostheta(j,2,i+1) + dalpha(j,2,i)=-1/sina*dcosalpha(j,2,i) + dcosalpha(j,3,i)=(fac9*(dc_norm(j,i)- + & dc_norm(j,i-1))-(cosa*dc_norm(j,i+nres))/ + & vbld(i+nres)) + dalpha(j,3,i)=-1/sina*dcosalpha(j,3,i) + enddo +c obtaining the derivatives of omega from sines + if(omeg(i).gt.-pi4.and.omeg(i).le.pi4.or. + & omeg(i).gt.pi34.and.omeg(i).le.pi.or. + & omeg(i).gt.-pi.and.omeg(i).le.-pi34) then + fac15=dcos(theta(i+1))/(dsin(theta(i+1))* + & dsin(theta(i+1))) + fac16=dcos(alph(i))/(dsin(alph(i))*dsin(alph(i))) + fac17=1.0d0/(dsin(theta(i+1))*dsin(alph(i))) + call vecpr(dc_norm(1,i+nres),dc_norm(1,i),vo1) + call vecpr(dc_norm(1,i+nres),dc_norm(1,i-1),vo2) + call vecpr(dc_norm(1,i),dc_norm(1,i-1),vo3) + coso_inv=1.0d0/dcos(omeg(i)) + do j=1,3 + dsinomega(j,1,i)=sino*(fac15*dcostheta(j,1,i+1) + & +fac16*dcosalpha(j,1,i))-fac17/vbld(i)*vo1(j)-( + & sino*dc_norm(j,i-1))/vbld(i) + domega(j,1,i)=coso_inv*dsinomega(j,1,i) + dsinomega(j,2,i)=sino*(fac15*dcostheta(j,2,i+1) + & +fac16*dcosalpha(j,2,i))+fac17/vbld(i+1)*vo2(j) + & -sino*dc_norm(j,i)/vbld(i+1) + domega(j,2,i)=coso_inv*dsinomega(j,2,i) + dsinomega(j,3,i)=sino*fac16*dcosalpha(j,3,i)- + & fac17/vbld(i+nres)*vo3(j)-sino*dc_norm(j,i+nres)/ + & vbld(i+nres) + domega(j,3,i)=coso_inv*dsinomega(j,3,i) + enddo + else +c obtaining the derivatives of omega from cosines + fac10=sqrt(0.5d0*(1-dcos(theta(i+1)))) + fac11=sqrt(0.5d0*(1+dcos(theta(i+1)))) + fac12=fac10*sina + fac13=fac12*fac12 + fac14=sina*sina + do j=1,3 + dcosomega(j,1,i)=(-(0.25d0*cosa/fac11* + & dcostheta(j,1,i+1)+fac11*dcosalpha(j,1,i))*fac12+ + & (0.25d0/fac10*sina*dcostheta(j,1,i+1)+cosa/sina* + & fac10*dcosalpha(j,1,i))*(scala2-fac11*cosa))/fac13 + domega(j,1,i)=-1/sino*dcosomega(j,1,i) + dcosomega(j,2,i)=(((dc_norm(j,i+nres)-scala2* + & dc_norm(j,i))/vbld(i+1)-0.25d0*cosa/fac11* + & dcostheta(j,2,i+1)-fac11*dcosalpha(j,2,i))*fac12+ + & (scala2-fac11*cosa)*(0.25d0*sina/fac10* + & dcostheta(j,2,i+1)+fac10*cosa/sina*dcosalpha(j,2,i) + & ))/fac13 + domega(j,2,i)=-1/sino*dcosomega(j,2,i) + dcosomega(j,3,i)=1/fac10*((1/vbld(i+nres)*(dc_norm(j,i)- + & scala2*dc_norm(j,i+nres))-fac11*dcosalpha(j,3,i))*sina+ + & (scala2-fac11*cosa)*(cosa/sina*dcosalpha(j,3,i)))/fac14 + domega(j,3,i)=-1/sino*dcosomega(j,3,i) + enddo + endif + endif + enddo +#endif +#if defined(MPI) && defined(PARINTDER) + if (nfgtasks.gt.1) then +#ifdef DEBUG + write (iout,*) "Gather dtheta" +cd call flush(iout) +c write (iout,*) "dtheta before gather" +c do i=1,nres +c write (iout,'(i3,3(3f8.5,3x))') i,((dtheta(j,k,i),k=1,3),j=1,2) +c enddo +#endif + call MPI_Gatherv(dtheta(1,1,ithet_start),ithet_count(fg_rank), + & MPI_THET,dtheta(1,1,1),ithet_count(0),ithet_displ(0),MPI_THET, + & king,FG_COMM,IERROR) +#ifdef DEBUG +cd write (iout,*) "Gather dphi" +cd call flush(iout) + write (iout,*) "dphi before gather" + do i=1,nres + write (iout,'(i3,3(3f8.5,3x))') i,((dphi(j,k,i),k=1,3),j=1,3) + enddo +#endif + call MPI_Gatherv(dphi(1,1,iphi1_start),iphi1_count(fg_rank), + & MPI_GAM,dphi(1,1,1),iphi1_count(0),iphi1_displ(0),MPI_GAM, + & king,FG_COMM,IERROR) +cd write (iout,*) "Gather dalpha" +cd call flush(iout) +#ifdef CRYST_SC + call MPI_Gatherv(dalpha(1,1,ibond_start),ibond_count(fg_rank), + & MPI_GAM,dalpha(1,1,1),ibond_count(0),ibond_displ(0),MPI_GAM, + & king,FG_COMM,IERROR) +cd write (iout,*) "Gather domega" +cd call flush(iout) + call MPI_Gatherv(domega(1,1,ibond_start),ibond_count(fg_rank), + & MPI_GAM,domega(1,1,1),ibond_count(0),ibond_displ(0),MPI_GAM, + & king,FG_COMM,IERROR) +#endif + endif +#endif +#ifdef DEBUG + write (iout,*) "dtheta after gather" + do i=1,nres + write (iout,'(i3,3(3f8.5,3x))') i,((dtheta(j,k,i),j=1,3),j=1,2) + enddo + write (iout,*) "dphi after gather" + do i=1,nres + write (iout,'(i3,3(3f8.5,3x))') i,((dphi(j,k,i),j=1,3),k=1,3) + enddo +#endif + return + end + + subroutine checkintcartgrad + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.SETUP' + double precision dthetanum(3,2,maxres),dphinum(3,3,maxres) + & ,dalphanum(3,3,maxres), domeganum(3,3,maxres) + double precision theta_s(maxres),phi_s(maxres),alph_s(maxres), + & omeg_s(maxres),dc_norm_s(3) + double precision aincr /1.0d-5/ + + do i=1,nres + phi_s(i)=phi(i) + theta_s(i)=theta(i) + alph_s(i)=alph(i) + omeg_s(i)=omeg(i) + enddo +c Check theta gradient + write (iout,*) + & "Analytical (upper) and numerical (lower) gradient of theta" + write (iout,*) + do i=3,nres + do j=1,3 + dcji=dc(j,i-2) + dc(j,i-2)=dcji+aincr + call chainbuild_cart + call int_from_cart1(.false.) + dthetanum(j,1,i)=(theta(i)-theta_s(i))/aincr + dc(j,i-2)=dcji + dcji=dc(j,i-1) + dc(j,i-1)=dc(j,i-1)+aincr + call chainbuild_cart + dthetanum(j,2,i)=(theta(i)-theta_s(i))/aincr + dc(j,i-1)=dcji + enddo + write (iout,'(i5,3f10.5,5x,3f10.5)') i,(dtheta(j,1,i),j=1,3), + & (dtheta(j,2,i),j=1,3) + write (iout,'(5x,3f10.5,5x,3f10.5)') (dthetanum(j,1,i),j=1,3), + & (dthetanum(j,2,i),j=1,3) + write (iout,'(5x,3f10.5,5x,3f10.5)') + & (dthetanum(j,1,i)/dtheta(j,1,i),j=1,3), + & (dthetanum(j,2,i)/dtheta(j,2,i),j=1,3) + write (iout,*) + enddo +c Check gamma gradient + write (iout,*) + & "Analytical (upper) and numerical (lower) gradient of gamma" + do i=4,nres + do j=1,3 + dcji=dc(j,i-3) + dc(j,i-3)=dcji+aincr + call chainbuild_cart + dphinum(j,1,i)=(phi(i)-phi_s(i))/aincr + dc(j,i-3)=dcji + dcji=dc(j,i-2) + dc(j,i-2)=dcji+aincr + call chainbuild_cart + dphinum(j,2,i)=(phi(i)-phi_s(i))/aincr + dc(j,i-2)=dcji + dcji=dc(j,i-1) + dc(j,i-1)=dc(j,i-1)+aincr + call chainbuild_cart + dphinum(j,3,i)=(phi(i)-phi_s(i))/aincr + dc(j,i-1)=dcji + enddo + write (iout,'(i5,3(3f10.5,5x))') i,(dphi(j,1,i),j=1,3), + & (dphi(j,2,i),j=1,3),(dphi(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') (dphinum(j,1,i),j=1,3), + & (dphinum(j,2,i),j=1,3),(dphinum(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') + & (dphinum(j,1,i)/dphi(j,1,i),j=1,3), + & (dphinum(j,2,i)/dphi(j,2,i),j=1,3), + & (dphinum(j,3,i)/dphi(j,3,i),j=1,3) + write (iout,*) + enddo +c Check alpha gradient + write (iout,*) + & "Analytical (upper) and numerical (lower) gradient of alpha" + do i=2,nres-1 + if(itype(i).ne.10) then + do j=1,3 + dcji=dc(j,i-1) + dc(j,i-1)=dcji+aincr + call chainbuild_cart + dalphanum(j,1,i)=(alph(i)-alph_s(i)) + & /aincr + dc(j,i-1)=dcji + dcji=dc(j,i) + dc(j,i)=dcji+aincr + call chainbuild_cart + dalphanum(j,2,i)=(alph(i)-alph_s(i)) + & /aincr + dc(j,i)=dcji + dcji=dc(j,i+nres) + dc(j,i+nres)=dc(j,i+nres)+aincr + call chainbuild_cart + dalphanum(j,3,i)=(alph(i)-alph_s(i)) + & /aincr + dc(j,i+nres)=dcji + enddo + endif + write (iout,'(i5,3(3f10.5,5x))') i,(dalpha(j,1,i),j=1,3), + & (dalpha(j,2,i),j=1,3),(dalpha(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') (dalphanum(j,1,i),j=1,3), + & (dalphanum(j,2,i),j=1,3),(dalphanum(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') + & (dalphanum(j,1,i)/dalpha(j,1,i),j=1,3), + & (dalphanum(j,2,i)/dalpha(j,2,i),j=1,3), + & (dalphanum(j,3,i)/dalpha(j,3,i),j=1,3) + write (iout,*) + enddo +c Check omega gradient + write (iout,*) + & "Analytical (upper) and numerical (lower) gradient of omega" + do i=2,nres-1 + if(itype(i).ne.10) then + do j=1,3 + dcji=dc(j,i-1) + dc(j,i-1)=dcji+aincr + call chainbuild_cart + domeganum(j,1,i)=(omeg(i)-omeg_s(i)) + & /aincr + dc(j,i-1)=dcji + dcji=dc(j,i) + dc(j,i)=dcji+aincr + call chainbuild_cart + domeganum(j,2,i)=(omeg(i)-omeg_s(i)) + & /aincr + dc(j,i)=dcji + dcji=dc(j,i+nres) + dc(j,i+nres)=dc(j,i+nres)+aincr + call chainbuild_cart + domeganum(j,3,i)=(omeg(i)-omeg_s(i)) + & /aincr + dc(j,i+nres)=dcji + enddo + endif + write (iout,'(i5,3(3f10.5,5x))') i,(domega(j,1,i),j=1,3), + & (domega(j,2,i),j=1,3),(domega(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') (domeganum(j,1,i),j=1,3), + & (domeganum(j,2,i),j=1,3),(domeganum(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') + & (domeganum(j,1,i)/domega(j,1,i),j=1,3), + & (domeganum(j,2,i)/domega(j,2,i),j=1,3), + & (domeganum(j,3,i)/domega(j,3,i),j=1,3) + write (iout,*) + enddo + return + end + + subroutine chainbuild_cart + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.TIME1' + include 'COMMON.IOUNITS' + +#ifdef MPI + if (nfgtasks.gt.1) then +c write (iout,*) "BCAST in chainbuild_cart" +c call flush(iout) +c Broadcast the order to build the chain and compute internal coordinates +c to the slaves. The slaves receive the order in ERGASTULUM. + time00=MPI_Wtime() +c write (iout,*) "CHAINBUILD_CART: DC before BCAST" +c do i=0,nres +c write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3), +c & (dc(j,i+nres),j=1,3) +c enddo + if (fg_rank.eq.0) + & call MPI_Bcast(7,1,MPI_INTEGER,king,FG_COMM,IERROR) + time_bcast7=time_bcast7+MPI_Wtime()-time00 + time01=MPI_Wtime() + call MPI_Bcast(dc(1,0),6*(nres+1),MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "CHAINBUILD_CART: DC after BCAST" +c do i=0,nres +c write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3), +c & (dc(j,i+nres),j=1,3) +c enddo +c write (iout,*) "End BCAST in chainbuild_cart" +c call flush(iout) + time_bcast=time_bcast+MPI_Wtime()-time00 + time_bcastc=time_bcastc+MPI_Wtime()-time01 + endif +#endif + do j=1,3 + c(j,1)=dc(j,0) + enddo + do i=2,nres + do j=1,3 + c(j,i)=c(j,i-1)+dc(j,i-1) + enddo + enddo + do i=1,nres + do j=1,3 + c(j,i+nres)=c(j,i)+dc(j,i+nres) + enddo + enddo +c write (iout,*) "CHAINBUILD_CART" +c call cartprint + call int_from_cart1(.false.) + return + end diff --git a/source/unres/src_Eshel/intcor.f b/source/unres/src_Eshel/intcor.f new file mode 100644 index 0000000..a3cd5d0 --- /dev/null +++ b/source/unres/src_Eshel/intcor.f @@ -0,0 +1,91 @@ +C +C------------------------------------------------------------------------------ +C + double precision function alpha(i1,i2,i3) +c +c Calculates the planar angle between atoms (i1), (i2), and (i3). +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + x12=c(1,i1)-c(1,i2) + x23=c(1,i3)-c(1,i2) + y12=c(2,i1)-c(2,i2) + y23=c(2,i3)-c(2,i2) + z12=c(3,i1)-c(3,i2) + z23=c(3,i3)-c(3,i2) + vnorm=dsqrt(x12*x12+y12*y12+z12*z12) + wnorm=dsqrt(x23*x23+y23*y23+z23*z23) + scalar=(x12*x23+y12*y23+z12*z23)/(vnorm*wnorm) + alpha=arcos(scalar) + return + end +C +C------------------------------------------------------------------------------ +C + double precision function beta(i1,i2,i3,i4) +c +c Calculates the dihedral angle between atoms (i1), (i2), (i3) and (i4) +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + x12=c(1,i1)-c(1,i2) + x23=c(1,i3)-c(1,i2) + x34=c(1,i4)-c(1,i3) + y12=c(2,i1)-c(2,i2) + y23=c(2,i3)-c(2,i2) + y34=c(2,i4)-c(2,i3) + z12=c(3,i1)-c(3,i2) + z23=c(3,i3)-c(3,i2) + z34=c(3,i4)-c(3,i3) +cd print '(2i3,3f10.5)',i1,i2,x12,y12,z12 +cd print '(2i3,3f10.5)',i2,i3,x23,y23,z23 +cd print '(2i3,3f10.5)',i3,i4,x34,y34,z34 + wx=-y23*z34+y34*z23 + wy=x23*z34-z23*x34 + wz=-x23*y34+y23*x34 + wnorm=dsqrt(wx*wx+wy*wy+wz*wz) + vx=y12*z23-z12*y23 + vy=-x12*z23+z12*x23 + vz=x12*y23-y12*x23 + vnorm=dsqrt(vx*vx+vy*vy+vz*vz) + if (vnorm.gt.1.0D-13 .and. wnorm.gt.1.0D-13) then + scalar=(vx*wx+vy*wy+vz*wz)/(vnorm*wnorm) + if (dabs(scalar).gt.1.0D0) + &scalar=0.99999999999999D0*scalar/dabs(scalar) + angle=dacos(scalar) +cd print '(2i4,10f7.3)',i2,i3,vx,vy,vz,wx,wy,wz,vnorm,wnorm, +cd &scalar,angle + else + angle=pi + endif +c if (angle.le.0.0D0) angle=pi+angle + tx=vy*wz-vz*wy + ty=-vx*wz+vz*wx + tz=vx*wy-vy*wx + scalar=tx*x23+ty*y23+tz*z23 + if (scalar.lt.0.0D0) angle=-angle + beta=angle + return + end +C +C------------------------------------------------------------------------------ +C + function dist(i1,i2) +c +c Calculates the distance between atoms (i1) and (i2). +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + x12=c(1,i1)-c(1,i2) + y12=c(2,i1)-c(2,i2) + z12=c(3,i1)-c(3,i2) + dist=dsqrt(x12*x12+y12*y12+z12*z12) + return + end +C diff --git a/source/unres/src_Eshel/intlocal.f b/source/unres/src_Eshel/intlocal.f new file mode 100644 index 0000000..2dbcc88 --- /dev/null +++ b/source/unres/src_Eshel/intlocal.f @@ -0,0 +1,517 @@ + subroutine integral(gamma1,gamma2,gamma3,gamma4,ity1,ity2,a1,a2, + & si1,si2,si3,si4,transp,q) + implicit none + integer ity1,ity2 + integer ilam1,ilam2,ilam3,ilam4,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4 + logical transp + double precision elocal,ele + double precision delta,delta2,sum,ene,sumene,boltz + double precision q,a1(2,2),a2(2,2),si1,si2,si3,si4 + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=20 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta +cd write(2,*) gamma1,gamma2,ity1,ity2,a1,a2,si1,si2,si3,si4,transp + +cd do ilam1=-180,180,5 +cd do ilam2=-180,180,5 +cd lambda1=ilam1*conv+delta2 +cd lambda2=ilam2*conv+delta2 +cd write(2,'(2i5,2f10.5)') ilam1,ilam2,elocal(2,lambda1,lambda2), +cd & ele(lambda1,lambda2,a1,1.0d0,1.d00) +cd enddo +cd enddo +cd stop + + sum=0.0d0 + sumene=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 +cd write (2,*) ilam1,ilam2,ilam3,ilam4 +cd write (2,*) lambda1,lambda2,lambda3,lambda4 + ene= + & -elocal(ity1,lambda1,lambda2,.false.)* + & elocal(ity2,lambda3,lambda4,transp)* + & ele(si1*lambda1+gamma1,si3*lambda3+gamma3,a1)* + & ele(si2*lambda2+gamma2,si4*lambda4+gamma4,a2) +cd write (2,*) elocal(ity1,lambda1,gamma1-pi-lambda2), +cd & elocal(ity2,lambda3,gamma2-pi-lambda4), +cd & ele(lambda1,lambda2,a1,si1,si3), +cd & ele(lambda3,lambda4,a2,si2,si4) + sum=sum+ene + enddo + enddo + enddo + enddo + q=sum/(2*pi)**4*delta**4 + write (2,* )'sum',sum,' q',q + return + end +c--------------------------------------------------------------------------- + subroutine integral3(gamma1,gamma2,ity1,ity2,ity3,ity4, + & a1,koniec,q1,q2,q3,q4) + implicit none + integer ity1,ity2,ity3,ity4 + integer ilam1,ilam2,ilam3,ilam4,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,lambda1, + & lambda2,lambda3,lambda4 + logical koniec + double precision elocal,ele + double precision delta,delta2,sum1,sum2,sum3,sum4, + & ene1,ene2,ene3,ene4,boltz + double precision q1,q2,q3,q4,a1(2,2),a2(2,2) + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta + write(2,*) gamma1,gamma2,ity1,ity2,ity3,ity4,a1,koniec + +cd do ilam1=-180,180,5 +cd do ilam2=-180,180,5 +cd lambda1=ilam1*conv+delta2 +cd lambda2=ilam2*conv+delta2 +cd write(2,'(2i5,2f10.5)') ilam1,ilam2,elocal(2,lambda1,lambda2), +cd & ele(lambda1,lambda2,a1,1.0d0,1.d00) +cd enddo +cd enddo +cd stop + + sum1=0.0d0 + sum2=0.0d0 + sum3=0.0d0 + sum4=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 +cd write (2,*) ilam1,ilam2,ilam3,ilam4 +cd write (2,*) lambda1,lambda2,lambda3,lambda4 + if (.not.koniec) then + ene1= + & elocal(ity1,lambda1,gamma1-pi-lambda2,.false.)* + & elocal(ity3,lambda3,gamma2-pi-lambda4,.false.)* + & ele(lambda2,lambda4,a1) + else + ene1= + & elocal(ity1,lambda1,gamma1-pi-lambda2,.false.)* + & elocal(ity3,lambda3,lambda4,.false.)* + & ele(lambda2,-lambda4,a1) + endif + ene2= + & elocal(ity1,lambda1,gamma1-pi-lambda2,.false.)* + & elocal(ity4,lambda3,lambda4,.false.)* + & ele(lambda2,lambda3,a1) + if (.not.koniec) then + ene3= + & elocal(ity2,lambda1,lambda2,.false.)* + & elocal(ity3,lambda3,gamma2-pi-lambda4,.false.)* + & ele(lambda1,lambda4,a1) + else + ene3= + & elocal(ity2,lambda1,lambda2,.false.)* + & elocal(ity3,lambda3,lambda4,.false.)* + & ele(lambda1,-lambda4,a1) + endif + ene4= + & elocal(ity2,lambda1,lambda2,.false.)* + & elocal(ity4,lambda3,lambda4,.false.)* + & ele(lambda1,lambda3,a1) + sum1=sum1+ene1 + sum2=sum2+ene2 + sum3=sum3+ene3 + sum4=sum4+ene4 + enddo + enddo + enddo + enddo + q1=sum1/(2*pi)**4*delta**4 + q2=sum2/(2*pi)**4*delta**4 + q3=sum3/(2*pi)**4*delta**4 + q4=sum4/(2*pi)**4*delta**4 + write (2,* )'sum',sum1,sum2,sum3,sum4,' q',q1,q2,q3,q4 + return + end +c------------------------------------------------------------------------- + subroutine integral5(gamma1,gamma2,gamma3,gamma4,ity1,ity2,ity3, + & ity4,ity5,ity6,a1,a2,si1,si2,si3,si4,transp,ene1,ene2,ene3,ene4) + implicit none + integer ity1,ity2,ity3,ity4,ity5,ity6 + integer ilam1,ilam2,ilam3,ilam4,ilam5,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4,lambda5 + logical transp + double precision elocal,ele + double precision eloc1,eloc2,eloc3,eloc4,eloc5,eloc6,ele1,ele2 + double precision delta,delta2,sum,ene,sumene,pom + double precision ene1,ene2,ene3,ene4,sum1,sum2,sum3,sum4, + & a1(2,2),a2(2,2) + integer si1,si2,si3,si4 + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta +cd write(2,*) 'gamma1=',gamma1,' gamma2=',gamma2, +cd & ' gamma3=',gamma3,' gamma4=',gamma4 +cd write(2,*) ity1,ity2,ity3,ity4,ity5,ity6 +cd write(2,*) 'a1=',a1 +cd write(2,*) 'a2=',a2 +cd write(2,*) si1,si2,si3,si4,transp + + sum1=0.0d0 + sum2=0.0d0 + sum3=0.0d0 + sum4=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + do ilam5=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 + lambda5=ilam5*conv+delta2 + if (transp) then + ele1=ele(lambda1,si4*lambda4,a1) + ele2=ele(lambda2,lambda3,a2) + else + ele1=ele(lambda1,lambda3,a1) + ele2=ele(lambda2,si4*lambda4,a2) + endif + eloc2=elocal(ity2,lambda1,gamma2-pi-lambda2,.false.) + eloc5=elocal(ity5,lambda3,gamma4-pi-si4*lambda4,.false.) + pom=ele1*ele2*eloc2*eloc5 + if (si1.gt.0) then + eloc1=elocal(ity1,lambda5,gamma1-pi-lambda1,.false.) + sum1=sum1+pom*eloc1 + endif + eloc3=elocal(ity3,lambda2,lambda5,.false.) + sum2=sum2+pom*eloc3 + eloc4=elocal(ity4,lambda5,gamma3-pi-lambda3,.false.) + sum3=sum3+pom*eloc4 + if (si4.gt.0) then + eloc6=elocal(ity6,lambda4,lambda5,.false.) + sum4=sum4+pom*eloc6 + endif + enddo + enddo + enddo + enddo + enddo + pom=1.0d0/(2*pi)**5*delta**5 + ene1=sum1*pom + ene2=sum2*pom + ene3=sum3*pom + ene4=sum4*pom +c write (2,* )'sum',sum1,sum2,sum3,sum4,' q',ene1,ene2,ene3,ene4 + return + end +c------------------------------------------------------------------------- + subroutine integral_turn6(gamma1,gamma2,gamma3,gamma4,ity1,ity2, + & ity3,ity4,ity5,ity6,a1,a2,ene_turn6) + implicit none + integer ity1,ity2,ity3,ity4,ity5,ity6 + integer ilam1,ilam2,ilam3,ilam4,ilam5,ilam6,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4,lambda5,lambda6 + logical transp + double precision elocal,ele + double precision eloc1,eloc2,eloc3,eloc4,eloc41,eloc5,eloc6, + & eloc61,ele1,ele2 + double precision delta,delta2,sum,ene,sumene,pom,ene5 + double precision ene_turn6,sum5,a1(2,2),a2(2,2) + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta + write(2,*) 'gamma1=',gamma1,' gamma2=',gamma2, + & ' gamma3=',gamma3,' gamma4=',gamma4 + write(2,*) ity1,ity2,ity3,ity4,ity5,ity6 + write(2,*) 'a1=',a1 + write(2,*) 'a2=',a2 + + sum5=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + do ilam5=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 + lambda5=ilam5*conv+delta2 + ele1=ele(lambda1,-lambda4,a1) + ele2=ele(lambda2,lambda3,a2) + eloc2=elocal(ity2,lambda1,gamma2-pi-lambda2,.false.) + eloc5=elocal(ity5,lambda3,lambda4,.false.) + pom=ele1*ele2*eloc2*eloc5 + eloc3=elocal(ity3,lambda2,gamma3-pi-lambda5,.false.) + eloc4=elocal(ity4,lambda5,gamma4-pi-lambda3,.false.) + sum5=sum5+pom*eloc3*eloc4 + enddo + enddo + enddo + enddo + enddo + pom=-1.0d0/(2*pi)**5*delta**5 + ene_turn6=sum5*pom +c print *,'sum6',sum6,' ene6',ene6 + return + end +c------------------------------------------------------------------------- + subroutine integral6(gamma1,gamma2,gamma3,gamma4,ity1,ity2,ity3, + & ity4,ity5,ity6,a1,a2,si1,si2,si3,si4,transp,ene1,ene2,ene3,ene4, + & ene5,ene6) + implicit none + integer ity1,ity2,ity3,ity4,ity5,ity6 + integer ilam1,ilam2,ilam3,ilam4,ilam5,ilam6,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4,lambda5,lambda6 + logical transp + double precision elocal,ele + double precision eloc1,eloc2,eloc3,eloc4,eloc41,eloc5,eloc6, + & eloc61,ele1,ele2 + double precision delta,delta2,sum,ene,sumene,pom + double precision ene1,ene2,ene3,ene4,ene5,ene6,sum1,sum2,sum3, + & sum4,sum5,sum6,a1(2,2),a2(2,2) + integer si1,si2,si3,si4 + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta +cd write(2,*) 'gamma1=',gamma1,' gamma2=',gamma2, +cd & ' gamma3=',gamma3,' gamma4=',gamma4 +cd write(2,*) ity1,ity2,ity3,ity4,ity5,ity6 +cd write(2,*) 'a1=',a1 +cd write(2,*) 'a2=',a2 +cd write(2,*) si1,si2,si3,si4,transp + + sum1=0.0d0 + sum2=0.0d0 + sum3=0.0d0 + sum4=0.0d0 + sum5=0.0d0 + sum6=0.0d0 + eloc1=0.0d0 + eloc6=0.0d0 + eloc61=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + do ilam5=-180,179,iincr + do ilam6=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 + lambda5=ilam5*conv+delta2 + lambda6=ilam6*conv+delta2 + if (transp) then + ele1=ele(lambda1,si4*lambda4,a1) + ele2=ele(lambda2,lambda3,a2) + else + ele1=ele(lambda1,lambda3,a1) + ele2=ele(lambda2,si4*lambda4,a2) + endif + eloc2=elocal(ity2,lambda1,gamma2-pi-lambda2,.false.) + eloc5=elocal(ity5,lambda3,gamma4-pi-si4*lambda4,.false.) + pom=ele1*ele2*eloc2*eloc5 + if (si1.gt.0) then + eloc1=elocal(ity1,lambda5,gamma1-pi-lambda1,.false.) + endif + eloc3=elocal(ity3,lambda2,lambda6,.false.) + sum1=sum1+pom*eloc1*eloc3 + eloc4=elocal(ity4,lambda5,gamma3-pi-lambda3,.false.) + if (si4.gt.0) then + eloc6=elocal(ity6,lambda4,lambda6,.false.) + eloc61=elocal(ity6,lambda4,lambda5,.false.) + endif + sum2=sum2+pom*eloc4*eloc6 + eloc41=elocal(ity4,lambda6,gamma3-pi-lambda3,.false.) + sum3=sum3+pom*eloc1*eloc41 + sum4=sum4+pom*eloc1*eloc6 + sum5=sum5+pom*eloc3*eloc4 + sum6=sum6+pom*eloc3*eloc61 + enddo + enddo + enddo + enddo + enddo + enddo + pom=-1.0d0/(2*pi)**6*delta**6 + ene1=sum1*pom + ene2=sum2*pom + ene3=sum3*pom + ene4=sum4*pom + ene5=sum5*pom + ene6=sum6*pom +c print *,'sum6',sum6,' ene6',ene6 + return + end +c------------------------------------------------------------------------- + subroutine integral3a(gamma1,gamma2,ity1,ity2,a1,si1,ene1) + implicit none + integer ity1,ity2,ity3,ity4,ity5,ity6 + integer ilam1,ilam2,ilam3,ilam4,ilam5,ilam6,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4,lambda5,lambda6 + logical transp + double precision elocal,ele + double precision eloc1,eloc2,eloc3,eloc4,eloc41,eloc5,eloc6, + & eloc61,ele1,ele2 + double precision delta,delta2,sum,ene,sumene,pom + double precision ene1,ene2,ene3,ene4,ene5,ene6,sum1,sum2,sum3, + & sum4,sum5,sum6,a1(2,2),a2(2,2) + integer si1,si2,si3,si4 + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta +cd write(2,*) 'gamma1=',gamma1,' gamma2=',gamma2 +cd write(2,*) ity1,ity2 +cd write(2,*) 'a1=',a1 +cd write(2,*) si1, + + sum1=0.0d0 + eloc1=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + ele1=ele(lambda1,si1*lambda3,a1) + eloc1=elocal(ity1,lambda1,gamma1-pi-lambda2,.false.) + if (si1.gt.0) then + eloc2=elocal(ity2,lambda2,gamma2-pi-lambda3,.false.) + else + eloc2=elocal(ity2,lambda2,lambda3,.false.) + endif + sum1=sum1+ele1*eloc1*eloc2 + enddo + enddo + enddo + pom=1.0d0/(2*pi)**3*delta**3 + ene1=sum1*pom + return + end +c------------------------------------------------------------------------- + subroutine integral4a(gamma1,gamma2,gamma3,ity1,ity2,ity3,a1,si1, + & ene1) + implicit none + integer ity1,ity2,ity3,ity4,ity5,ity6 + integer ilam1,ilam2,ilam3,ilam4,ilam5,ilam6,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4,lambda5,lambda6 + logical transp + double precision elocal,ele + double precision eloc1,eloc2,eloc3,eloc4,eloc41,eloc5,eloc6, + & eloc61,ele1,ele2 + double precision delta,delta2,sum,ene,sumene,pom + double precision ene1,ene2,ene3,ene4,ene5,ene6,sum1,sum2,sum3, + & sum4,sum5,sum6,a1(2,2),a2(2,2) + integer si1,si2,si3,si4 + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta +cd write(2,*) 'gamma1=',gamma1,' gamma2=',gamma2, +cd & ' gamma3=',gamma3 +cd write(2,*) ity1,ity2,ity3 +cd write(2,*) 'a1=',a1 +cd write(2,*) 'si1=',si1 + sum1=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 + ele1=ele(lambda1,si1*lambda4,a1) + eloc1=elocal(ity1,lambda1,gamma1-pi-lambda2,.false.) + eloc2=elocal(ity2,lambda2,gamma2-pi-lambda3,.false.) + if (si1.gt.0) then + eloc3=elocal(ity3,lambda3,gamma3-pi-lambda4,.false.) + else + eloc3=elocal(ity3,lambda3,lambda4,.false.) + endif + sum1=sum1+ele1*eloc1*eloc2*eloc3 + enddo + enddo + enddo + enddo + pom=-1.0d0/(2*pi)**4*delta**4 + ene1=sum1*pom + return + end +c------------------------------------------------------------------------- + double precision function elocal(i,x,y,transp) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.TORSION' + integer i + double precision x,y,u(2),v(2),cu(2),dv(2),ev(2) + double precision scalar2 + logical transp + u(1)=dcos(x) + u(2)=dsin(x) + v(1)=dcos(y) + v(2)=dsin(y) + if (transp) then + call matvec2(cc(1,1,i),v,cu) + call matvec2(dd(1,1,i),u,dv) + call matvec2(ee(1,1,i),u,ev) + elocal=scalar2(b1(1,i),v)+scalar2(b2(1,i),u)+scalar2(cu,v)+ + & scalar2(dv,u)+scalar2(ev,v) + else + call matvec2(cc(1,1,i),u,cu) + call matvec2(dd(1,1,i),v,dv) + call matvec2(ee(1,1,i),v,ev) + elocal=scalar2(b1(1,i),u)+scalar2(b2(1,i),v)+scalar2(cu,u)+ + & scalar2(dv,v)+scalar2(ev,u) + endif + return + end +c------------------------------------------------------------------------- + double precision function ele(x,y,a) + implicit none + double precision x,y,a(2,2),si1,si2,u(2),v(2),av(2) + double precision scalar2 + u(1)=-cos(x) + u(2)= sin(x) + v(1)=-cos(y) + v(2)= sin(y) + call matvec2(a,v,av) + ele=scalar2(u,av) + return + end diff --git a/source/unres/src_Eshel/local_move.f b/source/unres/src_Eshel/local_move.f new file mode 100644 index 0000000..7a7e125 --- /dev/null +++ b/source/unres/src_Eshel/local_move.f @@ -0,0 +1,972 @@ +c------------------------------------------------------------- + + subroutine local_move_init(debug) +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' ! Needed by COMMON.LOCAL + include 'COMMON.GEO' ! For pi, deg2rad + include 'COMMON.LOCAL' ! For vbl + include 'COMMON.LOCMOVE' + +c INPUT arguments + logical debug + + +c Determine wheter to do some debugging output + locmove_output=debug + +c Set the init_called flag to 1 + init_called=1 + +c The following are never changed + min_theta=60.D0*deg2rad ! (0,PI) + max_theta=175.D0*deg2rad ! (0,PI) + dmin2=vbl*vbl*2.*(1.-cos(min_theta)) + dmax2=vbl*vbl*2.*(1.-cos(max_theta)) + flag=1.0D300 + small=1.0D-5 + small2=0.5*small*small + +c Not really necessary... + a_n=0 + b_n=0 + res_n=0 + + return + end + +c------------------------------------------------------------- + + subroutine local_move(n_start, n_end, PHImin, PHImax) +c Perform a local move between residues m and n (inclusive) +c PHImin and PHImax [0,PI] determine the size of the move +c Works on whatever structure is in the variables theta and phi, +c sidechain variables are left untouched +c The final structure is NOT minimized, but both the cartesian +c variables c and the angles are up-to-date at the end (no further +c chainbuild is required) +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.MINIM' + include 'COMMON.SBRIDGE' + include 'COMMON.LOCMOVE' + +c External functions + integer move_res + external move_res + double precision ran_number + external ran_number + +c INPUT arguments + integer n_start, n_end ! First and last residues to move + double precision PHImin, PHImax ! min/max angles [0,PI] + +c Local variables + integer i,j + double precision min,max + integer iretcode + + +c Check if local_move_init was called. This assumes that it +c would not be 1 if not explicitely initialized + if (init_called.ne.1) then + write(6,*)' *** local_move_init not called!!!' + stop + endif + +c Quick check for crazy range + if (n_start.gt.n_end .or. n_start.lt.1 .or. n_end.gt.nres) then + write(6,'(a,i3,a,i3)') + + ' *** Cannot make local move between n_start = ', + + n_start,' and n_end = ',n_end + return + endif + +c Take care of end residues first... + if (n_start.eq.1) then +c Move residue 1 (completely random) + theta(3)=ran_number(min_theta,max_theta) + phi(4)=ran_number(-PI,PI) + i=2 + else + i=n_start + endif + if (n_end.eq.nres) then +c Move residue nres (completely random) + theta(nres)=ran_number(min_theta,max_theta) + phi(nres)=ran_number(-PI,PI) + j=nres-1 + else + j=n_end + endif + +c ...then go through all other residues one by one +c Start from the two extremes and converge + call chainbuild + do while (i.le.j) + min=PHImin + max=PHImax +c$$$c Move the first two residues by less than the others +c$$$ if (i-n_start.lt.3) then +c$$$ if (i-n_start.eq.0) then +c$$$ min=0.4*PHImin +c$$$ max=0.4*PHImax +c$$$ else if (i-n_start.eq.1) then +c$$$ min=0.8*PHImin +c$$$ max=0.8*PHImax +c$$$ else if (i-n_start.eq.2) then +c$$$ min=PHImin +c$$$ max=PHImax +c$$$ endif +c$$$ endif + +c The actual move, on residue i + iretcode=move_res(min,max,i) ! Discard iretcode + i=i+1 + + if (i.le.j) then + min=PHImin + max=PHImax +c$$$c Move the last two residues by less than the others +c$$$ if (n_end-j.lt.3) then +c$$$ if (n_end-j.eq.0) then +c$$$ min=0.4*PHImin +c$$$ max=0.4*PHImax +c$$$ else if (n_end-j.eq.1) then +c$$$ min=0.8*PHImin +c$$$ max=0.8*PHImax +c$$$ else if (n_end-j.eq.2) then +c$$$ min=PHImin +c$$$ max=PHImax +c$$$ endif +c$$$ endif + +c The actual move, on residue j + iretcode=move_res(min,max,j) ! Discard iretcode + j=j-1 + endif + enddo + + call int_from_cart(.false.,.false.) + + return + end + +c------------------------------------------------------------- + + subroutine output_tabs +c Prints out the contents of a_..., b_..., res_... + implicit none + +c Includes + include 'COMMON.GEO' + include 'COMMON.LOCMOVE' + +c Local variables + integer i,j + + + write(6,*)'a_...' + write(6,'(8f7.1)')(a_ang(i)*rad2deg,i=0,a_n-1) + write(6,'(8(2x,3l1,2x))')((a_tab(i,j),i=0,2),j=0,a_n-1) + + write(6,*)'b_...' + write(6,'(4f7.1)')(b_ang(i)*rad2deg,i=0,b_n-1) + write(6,'(4(2x,3l1,2x))')((b_tab(i,j),i=0,2),j=0,b_n-1) + + write(6,*)'res_...' + write(6,'(12f7.1)')(res_ang(i)*rad2deg,i=0,res_n-1) + write(6,'(12(2x,3l1,2x))')((res_tab(0,i,j),i=0,2),j=0,res_n-1) + write(6,'(12(2x,3l1,2x))')((res_tab(1,i,j),i=0,2),j=0,res_n-1) + write(6,'(12(2x,3l1,2x))')((res_tab(2,i,j),i=0,2),j=0,res_n-1) + + return + end + +c------------------------------------------------------------- + + subroutine angles2tab(PHImin,PHImax,n,ang,tab) +c Only uses angles if [0,PI] (but PHImin cannot be 0., +c and PHImax cannot be PI) + implicit none + +c Includes + include 'COMMON.GEO' + +c INPUT arguments + double precision PHImin,PHImax + +c OUTPUT arguments + integer n + double precision ang(0:3) + logical tab(0:2,0:3) + + + if (PHImin .eq. PHImax) then +c Special case with two 010's + n = 2; + ang(0) = -PHImin; + ang(1) = PHImin; + tab(0,0) = .false. + tab(2,0) = .false. + tab(0,1) = .false. + tab(2,1) = .false. + tab(1,0) = .true. + tab(1,1) = .true. + else if (PHImin .eq. PI) then +c Special case with one 010 + n = 1 + ang(0) = PI + tab(0,0) = .false. + tab(2,0) = .false. + tab(1,0) = .true. + else if (PHImax .eq. 0.) then +c Special case with one 010 + n = 1 + ang(0) = 0. + tab(0,0) = .false. + tab(2,0) = .false. + tab(1,0) = .true. + else +c Standard cases + n = 0 + if (PHImin .gt. 0.) then +c Start of range (011) + ang(n) = PHImin + tab(0,n) = .false. + tab(1,n) = .true. + tab(2,n) = .true. +c End of range (110) + ang(n+1) = -PHImin + tab(0,n+1) = .true. + tab(1,n+1) = .true. + tab(2,n+1) = .false. + n = n+2 + endif + if (PHImax .lt. PI) then +c Start of range (011) + ang(n) = -PHImax + tab(0,n) = .false. + tab(1,n) = .true. + tab(2,n) = .true. +c End of range (110) + ang(n+1) = PHImax + tab(0,n+1) = .true. + tab(1,n+1) = .true. + tab(2,n+1) = .false. + n = n+2 + endif + endif + + return + end + +c------------------------------------------------------------- + + subroutine minmax_angles(x,y,z,r,n,ang,tab) +c When solutions do not exist, assume all angles +c are acceptable - i.e., initial geometry must be correct + implicit none + +c Includes + include 'COMMON.GEO' + include 'COMMON.LOCMOVE' + +c Input arguments + double precision x,y,z,r + +c Output arguments + integer n + double precision ang(0:3) + logical tab(0:2,0:3) + +c Local variables + double precision num, denom, phi + double precision Kmin, Kmax + integer i + + + num = x*x + y*y + z*z + denom = x*x + y*y + n = 0 + if (denom .gt. 0.) then + phi = atan2(y,x) + denom = 2.*r*sqrt(denom) + num = num+r*r + Kmin = (num - dmin2)/denom + Kmax = (num - dmax2)/denom + +c Allowed values of K (else all angles are acceptable) +c -1 <= Kmin < 1 +c -1 < Kmax <= 1 + if (Kmin .gt. 1. .or. abs(Kmin-1.) .lt. small2) then + Kmin = -flag + else if (Kmin .lt. -1. .or. abs(Kmin+1.) .lt. small2) then + Kmin = PI + else + Kmin = acos(Kmin) + endif + + if (Kmax .lt. -1. .or. abs(Kmax+1.) .lt. small2) then + Kmax = flag + else if (Kmax .gt. 1. .or. abs(Kmax-1.) .lt. small2) then + Kmax = 0. + else + Kmax = acos(Kmax) + endif + + if (Kmax .lt. Kmin) Kmax = Kmin + + call angles2tab(Kmin, Kmax, n, ang, tab) + +c Add phi and check that angles are within range (-PI,PI] + do i=0,n-1 + ang(i) = ang(i)+phi + if (ang(i) .le. -PI) then + ang(i) = ang(i)+2.*PI + else if (ang(i) .gt. PI) then + ang(i) = ang(i)-2.*PI + endif + enddo + endif + + return + end + +c------------------------------------------------------------- + + subroutine construct_tab +c Take a_... and b_... values and produces the results res_... +c x_ang are assumed to be all different (diff > small) +c x_tab(1,i) must be 1 for all i (i.e., all x_ang are acceptable) + implicit none + +c Includes + include 'COMMON.LOCMOVE' + +c Local variables + integer n_max,i,j,index + logical done + double precision phi + + + n_max = a_n + b_n + if (n_max .eq. 0) then + res_n = 0 + return + endif + + do i=0,n_max-1 + do j=0,1 + res_tab(j,0,i) = .true. + res_tab(j,2,i) = .true. + res_tab(j,1,i) = .false. + enddo + enddo + + index = 0 + phi = -flag + done = .false. + do while (.not.done) + res_ang(index) = flag + +c Check a first... + do i=0,a_n-1 + if ((a_ang(i)-phi).gt.small .and. + + a_ang(i) .lt. res_ang(index)) then +c Found a lower angle + res_ang(index) = a_ang(i) +c Copy the values from a_tab into res_tab(0,,) + res_tab(0,0,index) = a_tab(0,i) + res_tab(0,1,index) = a_tab(1,i) + res_tab(0,2,index) = a_tab(2,i) +c Set default values for res_tab(1,,) + res_tab(1,0,index) = .true. + res_tab(1,1,index) = .false. + res_tab(1,2,index) = .true. + else if (abs(a_ang(i)-res_ang(index)).lt.small) then +c Found an equal angle (can only be equal to a b_ang) + res_tab(0,0,index) = a_tab(0,i) + res_tab(0,1,index) = a_tab(1,i) + res_tab(0,2,index) = a_tab(2,i) + endif + enddo +c ...then check b + do i=0,b_n-1 + if ((b_ang(i)-phi).gt.small .and. + + b_ang(i) .lt. res_ang(index)) then +c Found a lower angle + res_ang(index) = b_ang(i) +c Copy the values from b_tab into res_tab(1,,) + res_tab(1,0,index) = b_tab(0,i) + res_tab(1,1,index) = b_tab(1,i) + res_tab(1,2,index) = b_tab(2,i) +c Set default values for res_tab(0,,) + res_tab(0,0,index) = .true. + res_tab(0,1,index) = .false. + res_tab(0,2,index) = .true. + else if (abs(b_ang(i)-res_ang(index)).lt.small) then +c Found an equal angle (can only be equal to an a_ang) + res_tab(1,0,index) = b_tab(0,i) + res_tab(1,1,index) = b_tab(1,i) + res_tab(1,2,index) = b_tab(2,i) + endif + enddo + + if (res_ang(index) .eq. flag) then + res_n = index + done = .true. + else if (index .eq. n_max-1) then + res_n = n_max + done = .true. + else + phi = res_ang(index) ! Store previous angle + index = index+1 + endif + enddo + +c Fill the gaps +c First a... + index = 0 + if (a_n .gt. 0) then + do while (.not.res_tab(0,1,index)) + index=index+1 + enddo + done = res_tab(0,2,index) + do i=index+1,res_n-1 + if (res_tab(0,1,i)) then + done = res_tab(0,2,i) + else + res_tab(0,0,i) = done + res_tab(0,1,i) = done + res_tab(0,2,i) = done + endif + enddo + done = res_tab(0,0,index) + do i=index-1,0,-1 + if (res_tab(0,1,i)) then + done = res_tab(0,0,i) + else + res_tab(0,0,i) = done + res_tab(0,1,i) = done + res_tab(0,2,i) = done + endif + enddo + else + do i=0,res_n-1 + res_tab(0,0,i) = .true. + res_tab(0,1,i) = .true. + res_tab(0,2,i) = .true. + enddo + endif +c ...then b + index = 0 + if (b_n .gt. 0) then + do while (.not.res_tab(1,1,index)) + index=index+1 + enddo + done = res_tab(1,2,index) + do i=index+1,res_n-1 + if (res_tab(1,1,i)) then + done = res_tab(1,2,i) + else + res_tab(1,0,i) = done + res_tab(1,1,i) = done + res_tab(1,2,i) = done + endif + enddo + done = res_tab(1,0,index) + do i=index-1,0,-1 + if (res_tab(1,1,i)) then + done = res_tab(1,0,i) + else + res_tab(1,0,i) = done + res_tab(1,1,i) = done + res_tab(1,2,i) = done + endif + enddo + else + do i=0,res_n-1 + res_tab(1,0,i) = .true. + res_tab(1,1,i) = .true. + res_tab(1,2,i) = .true. + enddo + endif + +c Finally fill the last row with AND operation + do i=0,res_n-1 + do j=0,2 + res_tab(2,j,i) = (res_tab(0,j,i) .and. res_tab(1,j,i)) + enddo + enddo + + return + end + +c------------------------------------------------------------- + + subroutine construct_ranges(phi_n,phi_start,phi_end) +c Given the data in res_..., construct a table of +c min/max allowed angles + implicit none + +c Includes + include 'COMMON.GEO' + include 'COMMON.LOCMOVE' + +c Output arguments + integer phi_n + double precision phi_start(0:11),phi_end(0:11) + +c Local variables + logical done + integer index + + + if (res_n .eq. 0) then +c Any move is allowed + phi_n = 1 + phi_start(0) = -PI + phi_end(0) = PI + else + phi_n = 0 + index = 0 + done = .false. + do while (.not.done) +c Find start of range (01x) + done = .false. + do while (.not.done) + if (res_tab(2,0,index).or.(.not.res_tab(2,1,index))) then + index=index+1 + else + done = .true. + phi_start(phi_n) = res_ang(index) + endif + if (index .eq. res_n) done = .true. + enddo +c If a start was found (index < res_n), find the end of range (x10) +c It may not be found without wrapping around + if (index .lt. res_n) then + done = .false. + do while (.not.done) + if ((.not.res_tab(2,1,index)).or.res_tab(2,2,index)) then + index=index+1 + else + done = .true. + endif + if (index .eq. res_n) done = .true. + enddo + if (index .lt. res_n) then +c Found the end of the range + phi_end(phi_n) = res_ang(index) + phi_n=phi_n+1 + index=index+1 + if (index .eq. res_n) then + done = .true. + else + done = .false. + endif + else +c Need to wrap around + done = .true. + phi_end(phi_n) = flag + endif + endif + enddo +c Take care of the last one if need to wrap around + if (phi_end(phi_n) .eq. flag) then + index = 0 + do while ((.not.res_tab(2,1,index)).or.res_tab(2,2,index)) + index=index+1 + enddo + phi_end(phi_n) = res_ang(index) + 2.*PI + phi_n=phi_n+1 + endif + endif + + return + end + +c------------------------------------------------------------- + + subroutine fix_no_moves(phi) + implicit none + +c Includes + include 'COMMON.GEO' + include 'COMMON.LOCMOVE' + +c Output arguments + double precision phi + +c Local variables + integer index + double precision diff,temp + + +c Look for first 01x in gammas (there MUST be at least one) + diff = flag + index = 0 + do while (res_tab(1,0,index) .or. (.not.res_tab(1,1,index))) + index=index+1 + enddo + if (res_ang(index) .le. 0.D0) then ! Make sure it's from PHImax +c Try to increase PHImax + if (index .gt. 0) then + phi = res_ang(index-1) + diff = abs(res_ang(index) - res_ang(index-1)) + endif +c Look for last (corresponding) x10 + index = res_n - 1 + do while ((.not.res_tab(1,1,index)) .or. res_tab(1,2,index)) + index=index-1 + enddo + if (index .lt. res_n-1) then + temp = abs(res_ang(index) - res_ang(index+1)) + if (temp .lt. diff) then + phi = res_ang(index+1) + diff = temp + endif + endif + endif + +c If increasing PHImax didn't work, decreasing PHImin +c will (with one exception) +c Look for first x10 (there MUST be at least one) + index = 0 + do while ((.not.res_tab(1,1,index)) .or. res_tab(1,2,index)) + index=index+1 + enddo + if (res_ang(index) .lt. 0.D0) then ! Make sure it's from PHImin +c Try to decrease PHImin + if (index .lt. res_n-1) then + temp = abs(res_ang(index) - res_ang(index+1)) + if (res_ang(index+1) .le. 0.D0 .and. temp .lt. diff) then + phi = res_ang(index+1) + diff = temp + endif + endif +c Look for last (corresponding) 01x + index = res_n - 1 + do while (res_tab(1,0,index) .or. (.not.res_tab(1,1,index))) + index=index-1 + enddo + if (index .gt. 0) then + temp = abs(res_ang(index) - res_ang(index-1)) + if (res_ang(index-1) .ge. 0.D0 .and. temp .lt. diff) then + phi = res_ang(index-1) + diff = temp + endif + endif + endif + +c If it still didn't work, it must be PHImax == 0. or PHImin == PI + if (diff .eq. flag) then + index = 0 + if (res_tab(index,1,0) .or. (.not.res_tab(index,1,1)) .or. + + res_tab(index,1,2)) index = res_n - 1 +c This MUST work at this point + if (index .eq. 0) then + phi = res_ang(1) + else + phi = res_ang(index - 1) + endif + endif + + return + end + +c------------------------------------------------------------- + + integer function move_res(PHImin,PHImax,i_move) +c Moves residue i_move (in array c), leaving everything else fixed +c Starting geometry is not checked, it should be correct! +c R(,i_move) is the only residue that will move, but must have +c 1 < i_move < nres (i.e., cannot move ends) +c Whether any output is done is controlled by locmove_output +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.LOCMOVE' + +c External functions + double precision ran_number + external ran_number + +c Input arguments + double precision PHImin,PHImax + integer i_move + +c RETURN VALUES: +c 0: move successfull +c 1: Dmin or Dmax had to be modified +c 2: move failed - check your input geometry + + +c Local variables + double precision X(0:2),Y(0:2),Z(0:2),Orig(0:2) + double precision P(0:2) + logical no_moves,done + integer index,i,j + double precision phi,temp,radius + double precision phi_start(0:11), phi_end(0:11) + integer phi_n + +c Set up the coordinate system + do i=0,2 + Orig(i)=0.5*(c(i+1,i_move-1)+c(i+1,i_move+1)) ! Position of origin + enddo + + do i=0,2 + Z(i)=c(i+1,i_move+1)-c(i+1,i_move-1) + enddo + temp=sqrt(Z(0)*Z(0)+Z(1)*Z(1)+Z(2)*Z(2)) + do i=0,2 + Z(i)=Z(i)/temp + enddo + + do i=0,2 + X(i)=c(i+1,i_move)-Orig(i) + enddo +c radius is the radius of the circle on which c(,i_move) can move + radius=sqrt(X(0)*X(0)+X(1)*X(1)+X(2)*X(2)) + do i=0,2 + X(i)=X(i)/radius + enddo + + Y(0)=Z(1)*X(2)-X(1)*Z(2) + Y(1)=X(0)*Z(2)-Z(0)*X(2) + Y(2)=Z(0)*X(1)-X(0)*Z(1) + +c Calculate min, max angles coming from dmin, dmax to c(,i_move-2) + if (i_move.gt.2) then + do i=0,2 + P(i)=c(i+1,i_move-2)-Orig(i) + enddo + call minmax_angles(P(0)*X(0)+P(1)*X(1)+P(2)*X(2), + + P(0)*Y(0)+P(1)*Y(1)+P(2)*Y(2), + + P(0)*Z(0)+P(1)*Z(1)+P(2)*Z(2), + + radius,a_n,a_ang,a_tab) + else + a_n=0 + endif + +c Calculate min, max angles coming from dmin, dmax to c(,i_move+2) + if (i_move.lt.nres-2) then + do i=0,2 + P(i)=c(i+1,i_move+2)-Orig(i) + enddo + call minmax_angles(P(0)*X(0)+P(1)*X(1)+P(2)*X(2), + + P(0)*Y(0)+P(1)*Y(1)+P(2)*Y(2), + + P(0)*Z(0)+P(1)*Z(1)+P(2)*Z(2), + + radius,b_n,b_ang,b_tab) + else + b_n=0 + endif + +c Construct the resulting table for alpha and beta + call construct_tab() + + if (locmove_output) then + print *,'ALPHAS & BETAS TABLE' + call output_tabs() + endif + +c Check that there is at least one possible move + no_moves = .true. + if (res_n .eq. 0) then + no_moves = .false. + else + index = 0 + do while ((index .lt. res_n) .and. no_moves) + if (res_tab(2,1,index)) no_moves = .false. + index=index+1 + enddo + endif + if (no_moves) then + if (locmove_output) print *,' *** Cannot move anywhere' + move_res=2 + return + endif + +c Transfer res_... into a_... + a_n = 0 + do i=0,res_n-1 + if ( (res_tab(2,0,i).neqv.res_tab(2,1,i)) .or. + + (res_tab(2,0,i).neqv.res_tab(2,2,i)) ) then + a_ang(a_n) = res_ang(i) + do j=0,2 + a_tab(j,a_n) = res_tab(2,j,i) + enddo + a_n=a_n+1 + endif + enddo + +c Check that the PHI's are within [0,PI] + if (PHImin .lt. 0. .or. abs(PHImin) .lt. small) PHImin = -flag + if (PHImin .gt. PI .or. abs(PHImin-PI) .lt. small) PHImin = PI + if (PHImax .gt. PI .or. abs(PHImax-PI) .lt. small) PHImax = flag + if (PHImax .lt. 0. .or. abs(PHImax) .lt. small) PHImax = 0. + if (PHImax .lt. PHImin) PHImax = PHImin +c Calculate min and max angles coming from PHImin and PHImax, +c and put them in b_... + call angles2tab(PHImin, PHImax, b_n, b_ang, b_tab) +c Construct the final table + call construct_tab() + + if (locmove_output) then + print *,'FINAL TABLE' + call output_tabs() + endif + +c Check that there is at least one possible move + no_moves = .true. + if (res_n .eq. 0) then + no_moves = .false. + else + index = 0 + do while ((index .lt. res_n) .and. no_moves) + if (res_tab(2,1,index)) no_moves = .false. + index=index+1 + enddo + endif + + if (no_moves) then +c Take care of the case where no solution exists... + call fix_no_moves(phi) + if (locmove_output) then + print *,' *** Had to modify PHImin or PHImax' + print *,'phi: ',phi*rad2deg + endif + move_res=1 + else +c ...or calculate the solution +c Construct phi_start/phi_end arrays + call construct_ranges(phi_n, phi_start, phi_end) +c Choose random angle phi in allowed range(s) + temp = 0. + do i=0,phi_n-1 + temp = temp + phi_end(i) - phi_start(i) + enddo + phi = ran_number(phi_start(0),phi_start(0)+temp) + index = 0 + done = .false. + do while (.not.done) + if (phi .lt. phi_end(index)) then + done = .true. + else + index=index+1 + endif + if (index .eq. phi_n) then + done = .true. + else if (.not.done) then + phi = phi + phi_start(index) - phi_end(index-1) + endif + enddo + if (index.eq.phi_n) phi=phi_end(phi_n-1) ! Fix numerical errors + if (phi .gt. PI) phi = phi-2.*PI + + if (locmove_output) then + print *,'ALLOWED RANGE(S)' + do i=0,phi_n-1 + print *,phi_start(i)*rad2deg,phi_end(i)*rad2deg + enddo + print *,'phi: ',phi*rad2deg + endif + move_res=0 + endif + +c Re-use radius as temp variable + temp=radius*cos(phi) + radius=radius*sin(phi) + do i=0,2 + c(i+1,i_move)=Orig(i)+temp*X(i)+radius*Y(i) + enddo + + return + end + +c------------------------------------------------------------- + + subroutine loc_test +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.LOCMOVE' + +c External functions + integer move_res + external move_res + +c Local variables + integer i,j + integer phi_n + double precision phi_start(0:11),phi_end(0:11) + double precision phi + double precision R(0:2,0:5) + + locmove_output=.true. + +c call angles2tab(30.*deg2rad,70.*deg2rad,a_n,a_ang,a_tab) +c call angles2tab(80.*deg2rad,130.*deg2rad,b_n,b_ang,b_tab) +c call minmax_angles(0.D0,3.8D0,0.D0,3.8D0,b_n,b_ang,b_tab) +c call construct_tab +c call output_tabs + +c call construct_ranges(phi_n,phi_start,phi_end) +c do i=0,phi_n-1 +c print *,phi_start(i)*rad2deg,phi_end(i)*rad2deg +c enddo + +c call fix_no_moves(phi) +c print *,'NO MOVES FOUND, BEST PHI IS',phi*rad2deg + + R(0,0)=0.D0 + R(1,0)=0.D0 + R(2,0)=0.D0 + R(0,1)=0.D0 + R(1,1)=-cos(28.D0*deg2rad) + R(2,1)=-0.5D0-sin(28.D0*deg2rad) + R(0,2)=0.D0 + R(1,2)=0.D0 + R(2,2)=-0.5D0 + R(0,3)=cos(30.D0*deg2rad) + R(1,3)=0.D0 + R(2,3)=0.D0 + R(0,4)=0.D0 + R(1,4)=0.D0 + R(2,4)=0.5D0 + R(0,5)=0.D0 + R(1,5)=cos(26.D0*deg2rad) + R(2,5)=0.5D0+sin(26.D0*deg2rad) + do i=1,5 + do j=0,2 + R(j,i)=vbl*R(j,i) + enddo + enddo +c i=move_res(R(0,1),0.D0*deg2rad,180.D0*deg2rad) + imov=nnt + i=move_res(0.D0*deg2rad,180.D0*deg2rad,imov) + print *,'RETURNED ',i + print *,(R(i,3)/vbl,i=0,2) + + return + end + +c------------------------------------------------------------- diff --git a/source/unres/src_Eshel/map.f b/source/unres/src_Eshel/map.f new file mode 100644 index 0000000..9dbe64e --- /dev/null +++ b/source/unres/src_Eshel/map.f @@ -0,0 +1,90 @@ + subroutine map + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MAP' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.CONTROL' + include 'COMMON.TORCNSTR' + double precision energia(0:n_ene) + character*5 angid(4) /'PHI','THETA','ALPHA','OMEGA'/ + double precision ang_list(10) + double precision g(maxvar),x(maxvar) + integer nn(10) + write (iout,'(a,i3,a)')'Energy map constructed in the following ', + & nmap,' groups of variables:' + do i=1,nmap + write (iout,'(2a,i3,a,i3)') angid(kang(i)),' of residues ', + & res1(i),' to ',res2(i) + enddo + nmax=nstep(1) + do i=2,nmap + if (nmax.lt.nstep(i)) nmax=nstep(i) + enddo + ntot=nmax**nmap + iii=0 + write (istat,'(1h#,a14,29a15)') (" ",k=1,nmap), + & (ename(print_order(k)),k=1,nprint_ene),"ETOT","GNORM" + do i=0,ntot-1 + ii=i + do j=1,nmap + nn(j)=mod(ii,nmax)+1 + ii=ii/nmax + enddo + do j=1,nmap + if (nn(j).gt.nstep(j)) goto 10 + enddo + iii=iii+1 +Cd write (iout,*) i,iii,(nn(j),j=1,nmap) + do j=1,nmap + ang_list(j)=ang_from(j) + & +(nn(j)-1)*(ang_to(j)-ang_from(j))/nstep(j) + do k=res1(j),res2(j) + goto (1,2,3,4), kang(j) + 1 phi(k)=deg2rad*ang_list(j) + if (minim) phi0(k-res1(j)+1)=deg2rad*ang_list(j) + goto 5 + 2 theta(k)=deg2rad*ang_list(j) + goto 5 + 3 alph(k)=deg2rad*ang_list(j) + goto 5 + 4 omeg(k)=deg2rad*ang_list(j) + 5 continue + enddo ! k + enddo ! j + call chainbuild + call int_from_cart1(.false.) + if (minim) then + call geom_to_var(nvar,x) + call minimize(etot,x,iretcode,nfun) + print *,'SUMSL return code is',iretcode,' eval ',nfun +c call intout + else + call zerograd + call geom_to_var(nvar,x) + endif + call etotal(energia(0)) + etot = energia(0) + nf=1 + nfl=3 + call gradient(nvar,x,nf,g,uiparm,urparm,fdum) + gnorm=0.0d0 + do k=1,nvar + gnorm=gnorm+g(k)**2 + enddo + etot=energia(0) + + gnorm=dsqrt(gnorm) +c write (iout,'(6(1pe15.5))') (ang_list(k),k=1,nmap),etot,gnorm + write (istat,'(30e15.5)') (ang_list(k),k=1,nmap), + & (energia(print_order(ii)),ii=1,nprint_ene),etot,gnorm +c write (iout,*) 'POINT',I,' ANGLES:',(ang_list(k),k=1,nmap) +c call intout +c call enerprint(energia) + 10 continue + enddo ! i + return + end diff --git a/source/unres/src_Eshel/matmult.f b/source/unres/src_Eshel/matmult.f new file mode 100644 index 0000000..e9257cf --- /dev/null +++ b/source/unres/src_Eshel/matmult.f @@ -0,0 +1,18 @@ + SUBROUTINE MATMULT(A1,A2,A3) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A1(3,3),A2(3,3),A3(3,3) + DIMENSION AI3(3,3) + DO 1 I=1,3 + DO 2 J=1,3 + A3IJ=0.0 + DO 3 K=1,3 + 3 A3IJ=A3IJ+A1(I,K)*A2(K,J) + AI3(I,J)=A3IJ + 2 CONTINUE + 1 CONTINUE + DO 4 I=1,3 + DO 4 J=1,3 + 4 A3(I,J)=AI3(I,J) + RETURN + END diff --git a/source/unres/src_Eshel/minimize_p.F b/source/unres/src_Eshel/minimize_p.F new file mode 100644 index 0000000..c7922c7 --- /dev/null +++ b/source/unres/src_Eshel/minimize_p.F @@ -0,0 +1,641 @@ + subroutine minimize(etot,x,iretcode,nfun) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) +********************************************************************* +* OPTIMIZE sets up SUMSL or DFP and provides a simple interface for * +* the calling subprogram. * +* when d(i)=1.0, then v(35) is the length of the initial step, * +* calculated in the usual pythagorean way. * +* absolute convergence occurs when the function is within v(31) of * +* zero. unless you know the minimum value in advance, abs convg * +* is probably not useful. * +* relative convergence is when the model predicts that the function * +* will decrease by less than v(32)*abs(fun). * +********************************************************************* + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.MINIM' + common /srutu/ icall + dimension iv(liv) + double precision minval,x(maxvar),d(maxvar),v(1:lv),xx(maxvar) + double precision energia(0:n_ene) + external func,gradient,fdum + external func_restr,grad_restr + logical not_done,change,reduce +c common /przechowalnia/ v + + icall = 1 + + NOT_DONE=.TRUE. + +c DO WHILE (NOT_DONE) + + call deflt(2,iv,liv,lv,v) +* 12 means fresh start, dont call deflt + iv(1)=12 +* max num of fun calls + if (maxfun.eq.0) maxfun=500 + iv(17)=maxfun +* max num of iterations + if (maxmin.eq.0) maxmin=1000 + iv(18)=maxmin +* controls output + iv(19)=2 +* selects output unit + iv(21)=0 + if (print_min_ini+print_min_stat+print_min_res.gt.0) iv(21)=iout +* 1 means to print out result + iv(22)=print_min_res +* 1 means to print out summary stats + iv(23)=print_min_stat +* 1 means to print initial x and d + iv(24)=print_min_ini +* min val for v(radfac) default is 0.1 + v(24)=0.1D0 +* max val for v(radfac) default is 4.0 + v(25)=2.0D0 +c v(25)=4.0D0 +* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +* the sumsl default is 0.1 + v(26)=0.1D0 +* false conv if (act fnctn decrease) .lt. v(34) +* the sumsl default is 100*machep + v(34)=v(34)/100.0D0 +* absolute convergence + if (tolf.eq.0.0D0) tolf=1.0D-4 + v(31)=tolf +* relative convergence + if (rtolf.eq.0.0D0) rtolf=1.0D-4 + v(32)=rtolf +* controls initial step size + v(35)=1.0D-1 +* large vals of d correspond to small components of step + do i=1,nphi + d(i)=1.0D-1 + enddo + do i=nphi+1,nvar + d(i)=1.0D-1 + enddo +cd print *,'Calling SUMSL' +c call var_to_geom(nvar,x) +c call chainbuild +c call etotal(energia(0)) +c etot = energia(0) + IF (mask_r) THEN + call x2xx(x,xx,nvar_restr) + call sumsl(nvar_restr,d,xx,func_restr,grad_restr, + & iv,liv,lv,v,idum,rdum,fdum) + call xx2x(x,xx) + ELSE + call sumsl(nvar,d,x,func,gradient,iv,liv,lv,v,idum,rdum,fdum) + ENDIF + etot=v(10) + iretcode=iv(1) +cd print *,'Exit SUMSL; return code:',iretcode,' energy:',etot +cd write (iout,'(/a,i4/)') 'SUMSL return code:',iv(1) +c call intout +c change=reduce(x) + call var_to_geom(nvar,x) +c if (change) then +c write (iout,'(a)') 'Reduction worked, minimizing again...' +c else +c not_done=.false. +c endif + call chainbuild +c call etotal(energia(0)) +c etot=energia(0) +c call enerprint(energia(0)) + nfun=iv(6) + +c write (*,*) 'Processor',MyID,' leaves MINIMIZE.' + +c ENDDO ! NOT_DONE + + return + end +#ifdef MPI +c---------------------------------------------------------------------------- + subroutine ergastulum + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.SETUP' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.TIME1' + double precision z(maxres6),d_a_tmp(maxres6) + double precision edum(0:n_ene),time_order(0:10) + double precision Gcopy(maxres2,maxres2) + common /przechowalnia/ Gcopy + integer icall /0/ +C Workers wait for variables and NF, and NFL from the boss + iorder=0 + do while (iorder.ge.0) +c write (*,*) 'Processor',fg_rank,' CG group',kolor, +c & ' receives order from Master' + time00=MPI_Wtime() + call MPI_Bcast(iorder,1,MPI_INTEGER,king,FG_COMM,IERR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 + if (icall.gt.4 .and. iorder.ge.0) + & time_order(iorder)=time_order(iorder)+MPI_Wtime()-time00 + icall=icall+1 +c write (*,*) +c & 'Processor',fg_rank,' completed receive MPI_BCAST order',iorder + if (iorder.eq.0) then + call zerograd + call etotal(edum) +c write (2,*) "After etotal" +c write (2,*) "dimen",dimen," dimen3",dimen3 +c call flush(2) + else if (iorder.eq.2) then + call zerograd + call etotal_short(edum) +c write (2,*) "After etotal_short" +c write (2,*) "dimen",dimen," dimen3",dimen3 +c call flush(2) + else if (iorder.eq.3) then + call zerograd + call etotal_long(edum) +c write (2,*) "After etotal_long" +c write (2,*) "dimen",dimen," dimen3",dimen3 +c call flush(2) + else if (iorder.eq.1) then + call sum_gradient +c write (2,*) "After sum_gradient" +c write (2,*) "dimen",dimen," dimen3",dimen3 +c call flush(2) + else if (iorder.eq.4) then + call ginv_mult(z,d_a_tmp) + else if (iorder.eq.5) then +c Setup MD things for a slave + dimen=(nct-nnt+1)+nside + dimen1=(nct-nnt)+(nct-nnt+1) + dimen3=dimen*3 +c write (2,*) "dimen",dimen," dimen3",dimen3 +c call flush(2) + call int_bounds(dimen,igmult_start,igmult_end) + igmult_start=igmult_start-1 + call MPI_Allgather(3*igmult_start,1,MPI_INTEGER, + & ng_start(0),1,MPI_INTEGER,FG_COMM,IERROR) + my_ng_count=igmult_end-igmult_start + call MPI_Allgather(3*my_ng_count,1,MPI_INTEGER,ng_counts(0),1, + & MPI_INTEGER,FG_COMM,IERROR) +c write (2,*) "ng_start",(ng_start(i),i=0,nfgtasks-1) +c write (2,*) "ng_counts",(ng_counts(i),i=0,nfgtasks-1) + myginv_ng_count=maxres2*my_ng_count +c write (2,*) "igmult_start",igmult_start," igmult_end", +c & igmult_end," my_ng_count",my_ng_count +c call flush(2) + call MPI_Allgather(maxres2*igmult_start,1,MPI_INTEGER, + & nginv_start(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(myginv_ng_count,1,MPI_INTEGER, + & nginv_counts(0),1,MPI_INTEGER,FG_COMM,IERROR) +c write (2,*) "nginv_start",(nginv_start(i),i=0,nfgtasks-1) +c write (2,*) "nginv_counts",(nginv_counts(i),i=0,nfgtasks-1) +c call flush(2) +c call MPI_Barrier(FG_COMM,IERROR) + time00=MPI_Wtime() + call MPI_Scatterv(ginv(1,1),nginv_counts(0), + & nginv_start(0),MPI_DOUBLE_PRECISION,gcopy(1,1), + & myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERR) +#ifdef TIMING + time_scatter_ginv=time_scatter_ginv+MPI_Wtime()-time00 +#endif + do i=1,dimen + do j=1,2*my_ng_count + ginv(j,i)=gcopy(i,j) + enddo + enddo +c write (2,*) "dimen",dimen," dimen3",dimen3 +c write (2,*) "End MD setup" +c call flush(2) +c write (iout,*) "My chunk of ginv_block" +c call MATOUT2(my_ng_count,dimen3,maxres2,maxers2,ginv_block) + else if (iorder.eq.6) then + call int_from_cart1(.false.) + else if (iorder.eq.7) then + call chainbuild_cart + else if (iorder.eq.8) then + call intcartderiv + else if (iorder.eq.9) then + call fricmat_mult(z,d_a_tmp) + else if (iorder.eq.10) then + call setup_fricmat + endif + enddo + write (*,*) 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',myrank,' leves ERGASTULUM.' + write(*,*)'Processor',fg_rank,' wait times for respective orders', + & (' order[',i,']',time_order(i),i=0,10) + return + end +#endif +************************************************************************ + subroutine func(n,x,nf,f,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + common /chuju/ jjj + double precision energia(0:n_ene) + integer jjj + double precision ufparm + external ufparm + integer uiparm(1) + real*8 urparm(1) + dimension x(maxvar) +c if (jjj.gt.0) then +c write (iout,'(10f8.3)') (rad2deg*x(i),i=1,n) +c endif + nfl=nf + icg=mod(nf,2)+1 +cd print *,'func',nf,nfl,icg + call var_to_geom(n,x) + call zerograd + call chainbuild +cd write (iout,*) 'ETOTAL called from FUNC' + call etotal(energia(0)) + call sum_gradient + f=energia(0) +c if (jjj.gt.0) then +c write (iout,'(10f8.3)') (rad2deg*x(i),i=1,n) +c write (iout,*) 'f=',etot +c jjj=0 +c endif + return + end +************************************************************************ + subroutine func_restr(n,x,nf,f,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + common /chuju/ jjj + double precision energia(0:n_ene) + integer jjj + double precision ufparm + external ufparm + integer uiparm(1) + real*8 urparm(1) + dimension x(maxvar) +c if (jjj.gt.0) then +c write (iout,'(10f8.3)') (rad2deg*x(i),i=1,n) +c endif + nfl=nf + icg=mod(nf,2)+1 + call var_to_geom_restr(n,x) + call zerograd + call chainbuild +cd write (iout,*) 'ETOTAL called from FUNC' + call etotal(energia(0)) + call sum_gradient + f=energia(0) +c if (jjj.gt.0) then +c write (iout,'(10f8.3)') (rad2deg*x(i),i=1,n) +c write (iout,*) 'f=',etot +c jjj=0 +c endif + return + end +c------------------------------------------------------- + subroutine x2xx(x,xx,n) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + double precision xx(maxvar),x(maxvar) + + do i=1,nvar + varall(i)=x(i) + enddo + + ig=0 + igall=0 + do i=4,nres + igall=igall+1 + if (mask_phi(i).eq.1) then + ig=ig+1 + xx(ig)=x(igall) + endif + enddo + + do i=3,nres + igall=igall+1 + if (mask_theta(i).eq.1) then + ig=ig+1 + xx(ig)=x(igall) + endif + enddo + + do ij=1,2 + do i=2,nres-1 + if (itype(i).ne.10) then + igall=igall+1 + if (mask_side(i).eq.1) then + ig=ig+1 + xx(ig)=x(igall) + endif + endif + enddo + enddo + + n=ig + + return + end + + subroutine xx2x(x,xx) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + double precision xx(maxvar),x(maxvar) + + do i=1,nvar + x(i)=varall(i) + enddo + + ig=0 + igall=0 + do i=4,nres + igall=igall+1 + if (mask_phi(i).eq.1) then + ig=ig+1 + x(igall)=xx(ig) + endif + enddo + + do i=3,nres + igall=igall+1 + if (mask_theta(i).eq.1) then + ig=ig+1 + x(igall)=xx(ig) + endif + enddo + + do ij=1,2 + do i=2,nres-1 + if (itype(i).ne.10) then + igall=igall+1 + if (mask_side(i).eq.1) then + ig=ig+1 + x(igall)=xx(ig) + endif + endif + enddo + enddo + + return + end + +c---------------------------------------------------------- + subroutine minim_dc(etot,iretcode,nfun) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.MINIM' + include 'COMMON.CHAIN' + dimension iv(liv) + double precision minval,x(maxvar),d(maxvar),v(1:lv),xx(maxvar) +c common /przechowalnia/ v + + double precision energia(0:n_ene) + external func_dc,grad_dc,fdum + logical not_done,change,reduce + double precision g(maxvar),f1 + + call deflt(2,iv,liv,lv,v) +* 12 means fresh start, dont call deflt + iv(1)=12 +* max num of fun calls + if (maxfun.eq.0) maxfun=500 + iv(17)=maxfun +* max num of iterations + if (maxmin.eq.0) maxmin=1000 + iv(18)=maxmin +* controls output + iv(19)=2 +* selects output unit + iv(21)=0 + if (print_min_ini+print_min_stat+print_min_res.gt.0) iv(21)=iout +* 1 means to print out result + iv(22)=print_min_res +* 1 means to print out summary stats + iv(23)=print_min_stat +* 1 means to print initial x and d + iv(24)=print_min_ini +* min val for v(radfac) default is 0.1 + v(24)=0.1D0 +* max val for v(radfac) default is 4.0 + v(25)=2.0D0 +c v(25)=4.0D0 +* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +* the sumsl default is 0.1 + v(26)=0.1D0 +* false conv if (act fnctn decrease) .lt. v(34) +* the sumsl default is 100*machep + v(34)=v(34)/100.0D0 +* absolute convergence + if (tolf.eq.0.0D0) tolf=1.0D-4 + v(31)=tolf +* relative convergence + if (rtolf.eq.0.0D0) rtolf=1.0D-4 + v(32)=rtolf +* controls initial step size + v(35)=1.0D-1 +* large vals of d correspond to small components of step + do i=1,6*nres + d(i)=1.0D-1 + enddo + + k=0 + do i=1,nres-1 + do j=1,3 + k=k+1 + x(k)=dc(j,i) + enddo + enddo + do i=2,nres-1 + if (ialph(i,1).gt.0) then + do j=1,3 + k=k+1 + x(k)=dc(j,i+nres) + enddo + endif + enddo + + call sumsl(k,d,x,func_dc,grad_dc,iv,liv,lv,v,idum,rdum,fdum) + + k=0 + do i=1,nres-1 + do j=1,3 + k=k+1 + dc(j,i)=x(k) + enddo + enddo + do i=2,nres-1 + if (ialph(i,1).gt.0) then + do j=1,3 + k=k+1 + dc(j,i+nres)=x(k) + enddo + endif + enddo + call chainbuild_cart + +cd call zerograd +cd nf=0 +cd call func_dc(k,x,nf,f,idum,rdum,fdum) +cd call grad_dc(k,x,nf,g,idum,rdum,fdum) +cd +cd do i=1,k +cd x(i)=x(i)+1.0D-5 +cd call func_dc(k,x,nf,f1,idum,rdum,fdum) +cd x(i)=x(i)-1.0D-5 +cd print '(i5,2f15.5)',i,g(i),(f1-f)/1.0D-5 +cd enddo + + etot=v(10) + iretcode=iv(1) + nfun=iv(6) + return + end + + subroutine func_dc(n,x,nf,f,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + double precision energia(0:n_ene) + double precision ufparm + external ufparm + integer uiparm(1) + real*8 urparm(1) + dimension x(maxvar) + nfl=nf +cbad icg=mod(nf,2)+1 + icg=1 + + k=0 + do i=1,nres-1 + do j=1,3 + k=k+1 + dc(j,i)=x(k) + enddo + enddo + do i=2,nres-1 + if (ialph(i,1).gt.0) then + do j=1,3 + k=k+1 + dc(j,i+nres)=x(k) + enddo + endif + enddo + call chainbuild_cart + + call zerograd + call etotal(energia(0)) + f=energia(0) + +cd print *,'func_dc ',nf,nfl,f + + return + end + + subroutine grad_dc(n,x,nf,g,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + external ufparm + integer uiparm(1),k + double precision urparm(1) + dimension x(maxvar),g(maxvar) +c +c +c +cbad icg=mod(nf,2)+1 + icg=1 +cd print *,'grad_dc ',nf,nfl,nf-nfl+1,icg + if (nf-nfl+1) 20,30,40 + 20 call func_dc(n,x,nf,f,uiparm,urparm,ufparm) +cd print *,20 + if (nf.eq.0) return + goto 40 + 30 continue +cd print *,30 + k=0 + do i=1,nres-1 + do j=1,3 + k=k+1 + dc(j,i)=x(k) + enddo + enddo + do i=2,nres-1 + if (ialph(i,1).gt.0) then + do j=1,3 + k=k+1 + dc(j,i+nres)=x(k) + enddo + endif + enddo + call chainbuild_cart + +C +C Evaluate the derivatives of virtual bond lengths and SC vectors in variables. +C + 40 call cartgrad +cd print *,40 + k=0 + do i=1,nres-1 + do j=1,3 + k=k+1 + g(k)=gcart(j,i) + enddo + enddo + do i=2,nres-1 + if (ialph(i,1).gt.0) then + do j=1,3 + k=k+1 + g(k)=gxcart(j,i) + enddo + endif + enddo + + return + end diff --git a/source/unres/src_Eshel/misc.f b/source/unres/src_Eshel/misc.f new file mode 100644 index 0000000..e189839 --- /dev/null +++ b/source/unres/src_Eshel/misc.f @@ -0,0 +1,203 @@ +C $Date: 1994/10/12 17:24:21 $ +C $Revision: 2.5 $ +C +C +C + logical function find_arg(ipos,line,errflag) + parameter (maxlen=80) + character*80 line + character*1 empty /' '/,equal /'='/ + logical errflag +* This function returns .TRUE., if an argument follows keyword keywd; if so +* IPOS will point to the first non-blank character of the argument. Returns +* .FALSE., if no argument follows the keyword; in this case IPOS points +* to the first non-blank character of the next keyword. + do while (line(ipos:ipos) .eq. empty .and. ipos.le.maxlen) + ipos=ipos+1 + enddo + errflag=.false. + if (line(ipos:ipos).eq.equal) then + find_arg=.true. + ipos=ipos+1 + do while (line(ipos:ipos) .eq. empty .and. ipos.le.maxlen) + ipos=ipos+1 + enddo + if (ipos.gt.maxlen) errflag=.true. + else + find_arg=.false. + endif + return + end + logical function find_group(iunit,jout,key1) + character*(*) key1 + character*80 karta,ucase + integer ilen + external ilen + logical lcom + rewind (iunit) + karta=' ' + ll=ilen(key1) + do while (index(ucase(karta),key1(1:ll)).eq.0.or.lcom(1,karta)) + read (iunit,'(a)',end=10) karta + enddo + write (jout,'(2a)') '> ',karta(1:78) + find_group=.true. + return + 10 find_group=.false. + return + end + logical function iblnk(charc) + character*1 charc + integer n + n = ichar(charc) + iblnk = (n.eq.9) .or. (n.eq.10) .or. (charc.eq. ' ') + return + end + integer function ilen(string) + character*(*) string + logical iblnk + + ilen = len(string) +1 if ( ilen .gt. 0 ) then + if ( iblnk( string(ilen:ilen) ) ) then + ilen = ilen - 1 + goto 1 + endif + endif + return + end + integer function in_keywd_set(nkey,ikey,narg,keywd,keywdset) + character*16 keywd,keywdset(1:nkey,0:nkey) + character*16 ucase + do i=1,narg + if (ucase(keywd).eq.keywdset(i,ikey)) then +* Match found + in_keywd_set=i + return + endif + enddo +* No match to the allowed set of keywords if this point is reached. + in_keywd_set=0 + return + end + character*(*) function lcase(string) + integer i, k, idiff + character*(*) string + character*1 c + character*40 chtmp +c + i = len(lcase) + k = len(string) + if (i .lt. k) then + k = i + if (string(k+1:) .ne. ' ') then + chtmp = string + endif + endif + idiff = ichar('a') - ichar('A') + lcase = string + do 99 i = 1, k + c = string(i:i) + if (lge(c,'A') .and. lle(c,'Z')) then + lcase(i:i) = char(ichar(c) + idiff) + endif + 99 continue + return + end + logical function lcom(ipos,karta) + character*80 karta + character koment(2) /'!','#'/ + lcom=.false. + do i=1,2 + if (karta(ipos:ipos).eq.koment(i)) lcom=.true. + enddo + return + end + logical function lower_case(ch) + character*(*) ch + lower_case=(ch.ge.'a' .and. ch.le.'z') + return + end + subroutine mykey(line,keywd,ipos,blankline,errflag) +* This subroutine seeks a non-empty substring keywd in the string LINE. +* The substring begins with the first character different from blank and +* "=" encountered right to the pointer IPOS (inclusively) and terminates +* at the character left to the first blank or "=". When the subroutine is +* exited, the pointer IPOS is moved to the position of the terminator in LINE. +* The logical variable BLANKLINE is set at .TRUE., if LINE(IPOS:) contains +* only separators or the maximum length of the data line (80) has been reached. +* The logical variable ERRFLAG is set at .TRUE. if the string +* consists only from a "=". + parameter (maxlen=80) + character*1 empty /' '/,equal /'='/,comma /','/ + character*(*) keywd + character*80 line + logical blankline,errflag,lcom + errflag=.false. + do while (line(ipos:ipos).eq.empty .and. (ipos.le.maxlen)) + ipos=ipos+1 + enddo + if (ipos.gt.maxlen .or. lcom(ipos,line) ) then +* At this point the rest of the input line turned out to contain only blanks +* or to be commented out. + blankline=.true. + return + endif + blankline=.false. + istart=ipos +* Checks whether the current char is a separator. + do while (line(ipos:ipos).ne.empty .and. line(ipos:ipos).ne.equal + & .and. line(ipos:ipos).ne.comma .and. ipos.le.maxlen) + ipos=ipos+1 + enddo + iend=ipos-1 +* Error flag set to .true., if the length of the keyword was found less than 1. + if (iend.lt.istart) then + errflag=.true. + return + endif + keywd=line(istart:iend) + return + end + subroutine numstr(inum,numm) + character*10 huj /'0123456789'/ + character*(*) numm + inumm=inum + inum1=inumm/10 + inum2=inumm-10*inum1 + inumm=inum1 + numm(3:3)=huj(inum2+1:inum2+1) + inum1=inumm/10 + inum2=inumm-10*inum1 + inumm=inum1 + numm(2:2)=huj(inum2+1:inum2+1) + inum1=inumm/10 + inum2=inumm-10*inum1 + inumm=inum1 + numm(1:1)=huj(inum2+1:inum2+1) + return + end + character*(*) function ucase(string) + integer i, k, idiff + character*(*) string + character*1 c + character*40 chtmp +c + i = len(ucase) + k = len(string) + if (i .lt. k) then + k = i + if (string(k+1:) .ne. ' ') then + chtmp = string + endif + endif + idiff = ichar('a') - ichar('A') + ucase = string + do 99 i = 1, k + c = string(i:i) + if (lge(c,'a') .and. lle(c,'z')) then + ucase(i:i) = char(ichar(c) - idiff) + endif + 99 continue + return + end diff --git a/source/unres/src_Eshel/openunits.F b/source/unres/src_Eshel/openunits.F new file mode 100644 index 0000000..8259dac --- /dev/null +++ b/source/unres/src_Eshel/openunits.F @@ -0,0 +1,367 @@ + subroutine openunits + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + character*16 form,nodename + integer nodelen +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.MD' + include 'COMMON.CONTROL' + integer lenpre,lenpot,ilen,lentmp + external ilen + character*3 out1file_text,ucase + character*3 ll + external ucase +c print *,"Processor",myrank,"fg_rank",fg_rank," entered openunits" + call getenv_loc("PREFIX",prefix) + pref_orig = prefix + call getenv_loc("POT",pot) + call getenv_loc("DIRTMP",tmpdir) + call getenv_loc("CURDIR",curdir) + call getenv_loc("OUT1FILE",out1file_text) +c print *,"Processor",myrank,"fg_rank",fg_rank," did GETENV" + out1file_text=ucase(out1file_text) + if (out1file_text(1:1).eq."Y") then + out1file=.true. + else + out1file=fg_rank.gt.0 + endif + lenpre=ilen(prefix) + lenpot=ilen(pot) + lentmp=ilen(tmpdir) + if (lentmp.gt.0) then + write (*,'(80(1h!))') + write (*,'(a,19x,a,19x,a)') "!"," A T T E N T I O N ","!" + write (*,'(80(1h!))') + write (*,*)"All output files will be on node /tmp directory." +#ifdef MPI + call MPI_GET_PROCESSOR_NAME( nodename, nodelen, IERROR ) + if (me.eq.king) then + write (*,*) "The master node is ",nodename + else if (fg_rank.eq.0) then + write (*,*) "I am the CG slave node ",nodename + else + write (*,*) "I am the FG slave node ",nodename + endif +#endif + PREFIX = tmpdir(:lentmp)//'/'//prefix(:lenpre) + lenpre = lentmp+lenpre+1 + endif + entname=prefix(:lenpre)//'_'//pot(:lenpot)//'.entr' +C Get the names and open the input files +#if defined(WINIFL) || defined(WINPGI) + open(1,file=pref_orig(:ilen(pref_orig))// + & '.inp',status='old',readonly,shared) + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old',readonly,shared) + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old',readonly,shared) +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + open (ithep_pdb,file=thetname_pdb,status='old',readonly,shared) +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old',readonly,shared) +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old',readonly,shared) +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old',readonly,shared) + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old',readonly,shared) + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old',readonly,shared) + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old',readonly,shared) + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old', + & action='read') +c print *,"Processor",myrank," opened file 1" + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +c print *,"Processor",myrank," opened file 9" +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old',action='read') +c print *,"Processor",myrank," opened file IBOND" + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old',action='read') +c print *,"Processor",myrank," opened file ITHEP" +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + open (ithep_pdb,file=thetname_pdb,status='old',action='read') +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old',action='read') +c print *,"Processor",myrank," opened file IROTAM" +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old',action='read') +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old',action='read') +c print *,"Processor",myrank," opened file ITORP" + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old',action='read') +c print *,"Processor",myrank," opened file ITORDP" + call getenv_loc('SCCORPAR',sccorname) + open (isccor,file=sccorname,status='old',action='read') +c print *,"Processor",myrank," opened file ISCCOR" + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old',action='read') +c print *,"Processor",myrank," opened file IFOURIER" + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old',action='read') +c print *,"Processor",myrank," opened file IELEP" + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old',action='read') +c print *,"Processor",myrank," opened file ISIDEP" +c print *,"Processor",myrank," opened parameter files" +#elif (defined G77) + open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old') + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old') + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old') +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + open (ithep_pdb,file=thetname_pdb,status='old') +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old') +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old') +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old') + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old') + call getenv_loc('SCCORPAR',sccorname) + open (isccor,file=sccorname,status='old') + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old') + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old') + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old') +#else + open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old', + &action='read') + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old',action='read') + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old',action='read') +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + print *,"thetname_pdb ",thetname_pdb + open (ithep_pdb,file=thetname_pdb,status='old',action='read') + print *,ithep_pdb," opened" +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old',action='read') +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old',action='read') +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old',action='read') + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old',action='read') + call getenv_loc('SCCORPAR',sccorname) + open (isccor,file=sccorname,status='old',action='read') + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old',action='read') + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old',action='read') + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old',action='read') +#endif +#ifndef OLDSCP +C +C 8/9/01 In the newest version SCp interaction constants are read from a file +C Use -DOLDSCP to use hard-coded constants instead. +C + call getenv_loc('SCPPAR',scpname) +#if defined(WINIFL) || defined(WINPGI) + open (iscpp,file=scpname,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open (iscpp,file=scpname,status='old',action='read') +#elif (defined G77) + open (iscpp,file=scpname,status='old') +#else + open (iscpp,file=scpname,status='old',action='read') +#endif +#endif + call getenv_loc('PATTERN',patname) +#if defined(WINIFL) || defined(WINPGI) + open (icbase,file=patname,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open (icbase,file=patname,status='old',action='read') +#elif (defined G77) + open (icbase,file=patname,status='old') +#else + open (icbase,file=patname,status='old',action='read') +#endif +#ifdef MPI +C Open output file only for CG processes +c print *,"Processor",myrank," fg_rank",fg_rank + if (fg_rank.eq.0) then + + if (nodes.eq.1) then + npos=3 + else + npos = dlog10(dfloat(nodes-1))+1 + endif + if (npos.lt.3) npos=3 + write (liczba,'(i1)') npos + form = '(bz,i'//liczba(:ilen(liczba))//'.'//liczba(:ilen(liczba)) + & //')' + write (liczba,form) me + outname=prefix(:lenpre)//'.out_'//pot(:lenpot)// + & liczba(:ilen(liczba)) + intname=prefix(:lenpre)//'_'//pot(:lenpot)//liczba(:ilen(liczba)) + & //'.int' + pdbname(1)=prefix(:lenpre)//'_'//pot(:lenpot)// + & liczba(:ilen(liczba)) + & //'.pdb' + mol2name=prefix(:lenpre)//'_'//pot(:lenpot)// + & liczba(:ilen(liczba))//'.mol2' + statname=prefix(:lenpre)//'_'//pot(:lenpot)// + & liczba(:ilen(liczba))//'.stat' + if (lentmp.gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'//pot(:lenpot) + & //liczba(:ilen(liczba))//'.stat') + rest2name=prefix(:ilen(prefix))//"_"//liczba(:ilen(liczba)) + & //'.rst' + if(usampl) then + qname=prefix(:lenpre)//'_'//pot(:lenpot)// + & liczba(:ilen(liczba))//'.const' + endif + + endif +#else + outname=prefix(:lenpre)//'.out_'//pot(:lenpot) + intname=prefix(:lenpre)//'_'//pot(:lenpot)//'.int' + pdbname(1)=prefix(:lenpre)//'_'//pot(:lenpot)//'.pdb' + mol2name=prefix(:lenpre)//'_'//pot(:lenpot)//'.mol2' + statname=prefix(:lenpre)//'_'//pot(:lenpot)//'.stat' + if (lentmp.gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'//pot(:lenpot) + & //'.stat') + rest2name=prefix(:ilen(prefix))//'.rst' +#endif +#if defined(AIX) || defined(PGI) + if (me.eq.king .or. .not. out1file) + & open(iout,file=outname,status='unknown') +c#define DEBUG +#ifdef DEBUG + if (fg_rank.gt.0) then + write (liczba,'(i3.3)') myrank/nfgtasks + write (ll,'(bz,i3.3)') fg_rank + open(iout,file="debug"//liczba(:ilen(liczba))//"."//ll, + & status='unknown') + endif +#endif +c#undef DEBUG + if(me.eq.king) then + open(igeom,file=intname,status='unknown',position='append') + open(ipdb,file=pdbname(1),status='unknown') + open(imol2,file=mol2name,status='unknown') + open(istat,file=statname,status='unknown',position='append') + else +c1out open(iout,file=outname,status='unknown') + endif +#else + if (me.eq.king .or. .not.out1file) + & open(iout,file=outname,status='unknown') +c#define DEBUG +#ifdef DEBUG + if (fg_rank.gt.0) then + print "Processor",fg_rank," opening output file" + write (liczba,'(i3.3)') myrank/nfgtasks + write (ll,'(bz,i3.3)') fg_rank + open(iout,file="debug"//liczba(:ilen(liczba))//"."//ll, + & status='unknown') + endif +#endif +c#undef DEBUG + if(me.eq.king) then + open(igeom,file=intname,status='unknown',access='append') + open(ipdb,file=pdbname(1),status='unknown') + open(imol2,file=mol2name,status='unknown') + open(istat,file=statname,status='unknown',access='append') + else +c1out open(iout,file=outname,status='unknown') + endif +#endif +csa csa_rbank=prefix(:lenpre)//'.CSA.rbank' +csa csa_seed=prefix(:lenpre)//'.CSA.seed' +csa csa_history=prefix(:lenpre)//'.CSA.history' +csa csa_bank=prefix(:lenpre)//'.CSA.bank' +csa csa_bank1=prefix(:lenpre)//'.CSA.bank1' +csa csa_alpha=prefix(:lenpre)//'.CSA.alpha' +csa csa_alpha1=prefix(:lenpre)//'.CSA.alpha1' +csac!bankt csa_bankt=prefix(:lenpre)//'.CSA.bankt' +csa csa_int=prefix(:lenpre)//'.int' +csa csa_bank_reminimized=prefix(:lenpre)//'.CSA.bank_reminimized' +csa csa_native_int=prefix(:lenpre)//'.CSA.native.int' +csa csa_in=prefix(:lenpre)//'.CSA.in' +c print *,"Processor",myrank,"fg_rank",fg_rank," opened files" +C Write file names + if (me.eq.king)then + write (iout,'(80(1h-))') + write (iout,'(30x,a)') "FILE ASSIGNMENT" + write (iout,'(80(1h-))') + write (iout,*) "Input file : ", + & pref_orig(:ilen(pref_orig))//'.inp' + write (iout,*) "Output file : ", + & outname(:ilen(outname)) + write (iout,*) + write (iout,*) "Sidechain potential file : ", + & sidename(:ilen(sidename)) +#ifndef OLDSCP + write (iout,*) "SCp potential file : ", + & scpname(:ilen(scpname)) +#endif + write (iout,*) "Electrostatic potential file : ", + & elename(:ilen(elename)) + write (iout,*) "Cumulant coefficient file : ", + & fouriername(:ilen(fouriername)) + write (iout,*) "Torsional parameter file : ", + & torname(:ilen(torname)) + write (iout,*) "Double torsional parameter file : ", + & tordname(:ilen(tordname)) + write (iout,*) "SCCOR parameter file : ", + & sccorname(:ilen(sccorname)) + write (iout,*) "Bond & inertia constant file : ", + & bondname(:ilen(bondname)) + write (iout,*) "Bending parameter file : ", + & thetname(:ilen(thetname)) + write (iout,*) "Rotamer parameter file : ", + & rotname(:ilen(rotname)) + write (iout,*) "Threading database : ", + & patname(:ilen(patname)) + if (lentmp.ne.0) + &write (iout,*)" DIRTMP : ", + & tmpdir(:lentmp) + write (iout,'(80(1h-))') + endif + return + end + diff --git a/source/unres/src_Eshel/parmread.F b/source/unres/src_Eshel/parmread.F new file mode 100644 index 0000000..cd9bda2 --- /dev/null +++ b/source/unres/src_Eshel/parmread.F @@ -0,0 +1,1036 @@ + subroutine parmread +C +C Read the parameters of the probability distributions of the virtual-bond +C valence angles and the side chains and energy parameters. +C +C Important! Energy-term weights ARE NOT read here; they are read from the +C main input file instead, because NO defaults have yet been set for these +C parameters. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" + integer IERROR +#endif + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.SCCOR' + include 'COMMON.SCROT' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + include 'COMMON.SBRIDGE' + include 'COMMON.MD' + include 'COMMON.SETUP' + character*1 t1,t2,t3 + character*1 onelett(4) /"G","A","P","D"/ + logical lprint,LaTeX + dimension blower(3,3,maxlob) + dimension b(13) + character*3 lancuch,ucase +C +C For printing parameters after they are read set the following in the UNRES +C C-shell script: +C +C setenv PRINT_PARM YES +C +C To print parameters in LaTeX format rather than as ASCII tables: +C +C setenv LATEX YES +C + call getenv_loc("PRINT_PARM",lancuch) + lprint = (ucase(lancuch).eq."YES" .or. ucase(lancuch).eq."Y") + call getenv_loc("LATEX",lancuch) + LaTeX = (ucase(lancuch).eq."YES" .or. ucase(lancuch).eq."Y") +C + dwa16=2.0d0**(1.0d0/6.0d0) + itypro=20 +C Assign virtual-bond length + vbl=3.8D0 + vblinv=1.0D0/vbl + vblinv2=vblinv*vblinv +c +c Read the virtual-bond parameters, masses, and moments of inertia +c and Stokes' radii of the peptide group and side chains +c +#ifdef CRYST_BOND + read (ibond,*) vbldp0,akp,mp,ip,pstok + do i=1,ntyp + nbondterm(i)=1 + read (ibond,*) vbldsc0(1,i),aksc(1,i),msc(i),isc(i),restok(i) + dsc(i) = vbldsc0(1,i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + enddo +#else + read (ibond,*) junk,vbldp0,akp,rjunk,mp,ip,pstok + do i=1,ntyp + read (ibond,*) nbondterm(i),(vbldsc0(j,i),aksc(j,i),abond0(j,i), + & j=1,nbondterm(i)),msc(i),isc(i),restok(i) + dsc(i) = vbldsc0(1,i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + enddo +#endif + if (lprint) then + write(iout,'(/a/)')"Dynamic constants of the interaction sites:" + write (iout,'(a10,a3,6a10)') 'Type','N','VBL','K','A0','mass', + & 'inertia','Pstok' + write(iout,'(a10,i3,6f10.5)') "p",1,vbldp0,akp,0.0d0,mp,ip,pstok + do i=1,ntyp + write (iout,'(a10,i3,6f10.5)') restyp(i),nbondterm(i), + & vbldsc0(1,i),aksc(1,i),abond0(1,i),msc(i),isc(i),restok(i) + do j=2,nbondterm(i) + write (iout,'(13x,3f10.5)') + & vbldsc0(j,i),aksc(j,i),abond0(j,i) + enddo + enddo + endif +#ifdef CRYST_THETA +C +C Read the parameters of the probability distribution/energy expression +C of the virtual-bond valence angles theta +C + do i=1,ntyp + read (ithep,*,err=111,end=111) a0thet(i),(athet(j,i),j=1,2), + & (bthet(j,i),j=1,2) + read (ithep,*,err=111,end=111) (polthet(j,i),j=0,3) + read (ithep,*,err=111,end=111) (gthet(j,i),j=1,3) + read (ithep,*,err=111,end=111) theta0(i),sig0(i),sigc0(i) + sigc0(i)=sigc0(i)**2 + enddo + close (ithep) + if (lprint) then + if (.not.LaTeX) then + write (iout,'(a)') + & 'Parameters of the virtual-bond valence angles:' + write (iout,'(/a/9x,5a/79(1h-))') 'Fourier coefficients:', + & ' ATHETA0 ',' A1 ',' A2 ', + & ' B1 ',' B2 ' + do i=1,ntyp + write(iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i, + & a0thet(i),(athet(j,i),j=1,2),(bthet(j,i),j=1,2) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the expression for sigma(theta_c):', + & ' ALPH0 ',' ALPH1 ',' ALPH2 ', + & ' ALPH3 ',' SIGMA0C ' + do i=1,ntyp + write (iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i, + & (polthet(j,i),j=0,3),sigc0(i) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the second gaussian:', + & ' THETA0 ',' SIGMA0 ',' G1 ', + & ' G2 ',' G3 ' + do i=1,ntyp + write (iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i,theta0(i), + & sig0(i),(gthet(j,i),j=1,3) + enddo + else + write (iout,'(a)') + & 'Parameters of the virtual-bond valence angles:' + write (iout,'(/a/9x,5a/79(1h-))') + & 'Coefficients of expansion', + & ' theta0 ',' a1*10^2 ',' a2*10^2 ', + & ' b1*10^1 ',' b2*10^1 ' + do i=1,ntyp + write(iout,'(a3,1h&,2x,5(f8.3,1h&))') restyp(i), + & a0thet(i),(100*athet(j,i),j=1,2),(10*bthet(j,i),j=1,2) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the expression for sigma(theta_c):', + & ' alpha0 ',' alph1 ',' alph2 ', + & ' alhp3 ',' sigma0c ' + do i=1,ntyp + write (iout,'(a3,1h&,2x,5(1pe12.3,1h&))') restyp(i), + & (polthet(j,i),j=0,3),sigc0(i) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the second gaussian:', + & ' theta0 ',' sigma0*10^2 ',' G1*10^-1', + & ' G2 ',' G3*10^1 ' + do i=1,ntyp + write (iout,'(a3,1h&,2x,5(f8.3,1h&))') restyp(i),theta0(i), + & 100*sig0(i),gthet(1,i)*0.1D0,gthet(2,i),gthet(3,i)*10.0D0 + enddo + endif + endif +#else +C +C Read the parameters of Utheta determined from ab initio surfaces +C Kozlowska et al., J. Phys.: Condens. Matter 19 (2007) 285203 +C + read (ithep,*,err=111,end=111) nthetyp,ntheterm,ntheterm2, + & ntheterm3,nsingle,ndouble + nntheterm=max0(ntheterm,ntheterm2,ntheterm3) + read (ithep,*,err=111,end=111) (ithetyp(i),i=1,ntyp1) + do i=1,maxthetyp + do j=1,maxthetyp + do k=1,maxthetyp + aa0thet(i,j,k)=0.0d0 + do l=1,ntheterm + aathet(l,i,j,k)=0.0d0 + enddo + do l=1,ntheterm2 + do m=1,nsingle + bbthet(m,l,i,j,k)=0.0d0 + ccthet(m,l,i,j,k)=0.0d0 + ddthet(m,l,i,j,k)=0.0d0 + eethet(m,l,i,j,k)=0.0d0 + enddo + enddo + do l=1,ntheterm3 + do m=1,ndouble + do mm=1,ndouble + ffthet(mm,m,l,i,j,k)=0.0d0 + ggthet(mm,m,l,i,j,k)=0.0d0 + enddo + enddo + enddo + enddo + enddo + enddo + do i=1,nthetyp + do j=1,nthetyp + do k=1,nthetyp + read (ithep,'(3a)',end=111,err=111) res1,res2,res3 + read (ithep,*,end=111,err=111) aa0thet(i,j,k) + read (ithep,*,end=111,err=111)(aathet(l,i,j,k),l=1,ntheterm) + read (ithep,*,end=111,err=111) + & ((bbthet(lll,ll,i,j,k),lll=1,nsingle), + & (ccthet(lll,ll,i,j,k),lll=1,nsingle), + & (ddthet(lll,ll,i,j,k),lll=1,nsingle), + & (eethet(lll,ll,i,j,k),lll=1,nsingle),ll=1,ntheterm2) + read (ithep,*,end=111,err=111) + & (((ffthet(llll,lll,ll,i,j,k),ffthet(lll,llll,ll,i,j,k), + & ggthet(llll,lll,ll,i,j,k),ggthet(lll,llll,ll,i,j,k), + & llll=1,lll-1),lll=2,ndouble),ll=1,ntheterm3) + enddo + enddo + enddo +C +C For dummy ends assign glycine-type coefficients of theta-only terms; the +C coefficients of theta-and-gamma-dependent terms are zero. +C + do i=1,nthetyp + do j=1,nthetyp + do l=1,ntheterm + aathet(l,i,j,nthetyp+1)=aathet(l,i,j,1) + aathet(l,nthetyp+1,i,j)=aathet(l,1,i,j) + enddo + aa0thet(i,j,nthetyp+1)=aa0thet(i,j,1) + aa0thet(nthetyp+1,i,j)=aa0thet(1,i,j) + enddo + do l=1,ntheterm + aathet(l,nthetyp+1,i,nthetyp+1)=aathet(l,1,i,1) + enddo + aa0thet(nthetyp+1,i,nthetyp+1)=aa0thet(1,i,1) + enddo +C +C Control printout of the coefficients of virtual-bond-angle potentials +C + if (lprint) then + write (iout,'(//a)') 'Parameter of virtual-bond-angle potential' + do i=1,nthetyp+1 + do j=1,nthetyp+1 + do k=1,nthetyp+1 + write (iout,'(//4a)') + & 'Type ',onelett(i),onelett(j),onelett(k) + write (iout,'(//a,10x,a)') " l","a[l]" + write (iout,'(i2,1pe15.5)') 0,aa0thet(i,j,k) + write (iout,'(i2,1pe15.5)') + & (l,aathet(l,i,j,k),l=1,ntheterm) + do l=1,ntheterm2 + write (iout,'(//2h m,4(9x,a,3h[m,,i1,1h]))') + & "b",l,"c",l,"d",l,"e",l + do m=1,nsingle + write (iout,'(i2,4(1pe15.5))') m, + & bbthet(m,l,i,j,k),ccthet(m,l,i,j,k), + & ddthet(m,l,i,j,k),eethet(m,l,i,j,k) + enddo + enddo + do l=1,ntheterm3 + write (iout,'(//3hm,n,4(6x,a,5h[m,n,,i1,1h]))') + & "f+",l,"f-",l,"g+",l,"g-",l + do m=2,ndouble + do n=1,m-1 + write (iout,'(i1,1x,i1,4(1pe15.5))') n,m, + & ffthet(n,m,l,i,j,k),ffthet(m,n,l,i,j,k), + & ggthet(n,m,l,i,j,k),ggthet(m,n,l,i,j,k) + enddo + enddo + enddo + enddo + enddo + enddo + call flush(iout) + endif + write (2,*) "Start reading THETA_PDB" + do i=1,ntyp + read (ithep_pdb,*,err=111,end=111) a0thet(i),(athet(j,i),j=1,2), + & (bthet(j,i),j=1,2) + read (ithep_pdb,*,err=111,end=111) (polthet(j,i),j=0,3) + read (ithep_pdb,*,err=111,end=111) (gthet(j,i),j=1,3) + read (ithep_pdb,*,err=111,end=111) theta0(i),sig0(i),sigc0(i) + sigc0(i)=sigc0(i)**2 + enddo + write (2,*) "End reading THETA_PDB" + close (ithep_pdb) +#endif + close(ithep) +#ifdef CRYST_SC +C +C Read the parameters of the probability distribution/energy expression +C of the side chains. +C + do i=1,ntyp + read (irotam,'(3x,i3,f8.3)',end=112,err=112) nlob(i),dsc(i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + if (i.ne.10) then + do j=1,nlob(i) + do k=1,3 + do l=1,3 + blower(l,k,j)=0.0D0 + enddo + enddo + enddo + bsc(1,i)=0.0D0 + read(irotam,*,end=112,err=112)(censc(k,1,i),k=1,3), + & ((blower(k,l,1),l=1,k),k=1,3) + do j=2,nlob(i) + read (irotam,*,end=112,err=112) bsc(j,i) + read (irotam,*,end=112,err=112) (censc(k,j,i),k=1,3), + & ((blower(k,l,j),l=1,k),k=1,3) + enddo + do j=1,nlob(i) + do k=1,3 + do l=1,k + akl=0.0D0 + do m=1,3 + akl=akl+blower(k,m,j)*blower(l,m,j) + enddo + gaussc(k,l,j,i)=akl + gaussc(l,k,j,i)=akl + enddo + enddo + enddo + endif + enddo + close (irotam) + if (lprint) then + write (iout,'(/a)') 'Parameters of side-chain local geometry' + do i=1,ntyp + nlobi=nlob(i) + if (nlobi.gt.0) then + if (LaTeX) then + write (iout,'(/3a,i2,a,f8.3)') 'Residue type: ',restyp(i), + & ' # of gaussian lobes:',nlobi,' dsc:',dsc(i) + write (iout,'(1h&,a,3(2h&&,f8.3,2h&&))') + & 'log h',(bsc(j,i),j=1,nlobi) + write (iout,'(1h&,a,3(1h&,f8.3,1h&,f8.3,1h&,f8.3,1h&))') + & 'x',((censc(k,j,i),k=1,3),j=1,nlobi) + do k=1,3 + write (iout,'(2h& ,5(2x,1h&,3(f7.3,1h&)))') + & ((gaussc(k,l,j,i),l=1,3),j=1,nlobi) + enddo + else + write (iout,'(/a,8x,i1,4(25x,i1))') 'Lobe:',(j,j=1,nlobi) + write (iout,'(a,f10.4,4(16x,f10.4))') + & 'Center ',(bsc(j,i),j=1,nlobi) + write (iout,'(5(2x,3f8.4))') ((censc(k,j,i),k=1,3), + & j=1,nlobi) + write (iout,'(a)') + endif + endif + enddo + endif +#else +C +C Read scrot parameters for potentials determined from all-atom AM1 calculations +C added by Urszula Kozlowska 07/11/2007 +C + do i=1,ntyp + read (irotam,*,end=112,err=112) + if (i.eq.10) then + read (irotam,*,end=112,err=112) + else + do j=1,65 + read(irotam,*,end=112,err=112) sc_parmin(j,i) + enddo + endif + enddo +C +C Read the parameters of the probability distribution/energy expression +C of the side chains. +C + do i=1,ntyp + read (irotam_pdb,'(3x,i3,f8.3)',end=112,err=112) nlob(i),dsc(i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + if (i.ne.10) then + do j=1,nlob(i) + do k=1,3 + do l=1,3 + blower(l,k,j)=0.0D0 + enddo + enddo + enddo + bsc(1,i)=0.0D0 + read(irotam_pdb,*,end=112,err=112)(censc(k,1,i),k=1,3), + & ((blower(k,l,1),l=1,k),k=1,3) + do j=2,nlob(i) + read (irotam_pdb,*,end=112,err=112) bsc(j,i) + read (irotam_pdb,*,end=112,err=112) (censc(k,j,i),k=1,3), + & ((blower(k,l,j),l=1,k),k=1,3) + enddo + do j=1,nlob(i) + do k=1,3 + do l=1,k + akl=0.0D0 + do m=1,3 + akl=akl+blower(k,m,j)*blower(l,m,j) + enddo + gaussc(k,l,j,i)=akl + gaussc(l,k,j,i)=akl + enddo + enddo + enddo + endif + enddo + close (irotam_pdb) +#endif + close(irotam) + +#ifdef CRYST_TOR +C +C Read torsional parameters in old format +C + read (itorp,*,end=113,err=113) ntortyp,nterm_old + if (lprint)write (iout,*) 'ntortyp,nterm',ntortyp,nterm_old + read (itorp,*,end=113,err=113) (itortyp(i),i=1,ntyp) + do i=1,ntortyp + do j=1,ntortyp + read (itorp,'(a)') + do k=1,nterm_old + read (itorp,*,end=113,err=113) kk,v1(k,j,i),v2(k,j,i) + enddo + enddo + enddo + close (itorp) + if (lprint) then + write (iout,'(/a/)') 'Torsional constants:' + do i=1,ntortyp + do j=1,ntortyp + write (iout,'(2i3,6f10.5)') i,j,(v1(k,i,j),k=1,nterm_old) + write (iout,'(6x,6f10.5)') (v2(k,i,j),k=1,nterm_old) + enddo + enddo + endif +#else +C +C Read torsional parameters +C + read (itorp,*,end=113,err=113) ntortyp + read (itorp,*,end=113,err=113) (itortyp(i),i=1,ntyp) +c write (iout,*) 'ntortyp',ntortyp + do i=1,ntortyp + do j=1,ntortyp + read (itorp,*,end=113,err=113) nterm(i,j),nlor(i,j) + v0ij=0.0d0 + si=-1.0d0 + do k=1,nterm(i,j) + read (itorp,*,end=113,err=113) kk,v1(k,i,j),v2(k,i,j) + v0ij=v0ij+si*v1(k,i,j) + si=-si + enddo + do k=1,nlor(i,j) + read (itorp,*,end=113,err=113) kk,vlor1(k,i,j), + & vlor2(k,i,j),vlor3(k,i,j) + v0ij=v0ij+vlor1(k,i,j)/(1+vlor3(k,i,j)**2) + enddo + v0(i,j)=v0ij + enddo + enddo + close (itorp) + if (lprint) then + write (iout,'(/a/)') 'Torsional constants:' + do i=1,ntortyp + do j=1,ntortyp + write (iout,*) 'ityp',i,' jtyp',j + write (iout,*) 'Fourier constants' + do k=1,nterm(i,j) + write (iout,'(2(1pe15.5))') v1(k,i,j),v2(k,i,j) + enddo + write (iout,*) 'Lorenz constants' + do k=1,nlor(i,j) + write (iout,'(3(1pe15.5))') + & vlor1(k,i,j),vlor2(k,i,j),vlor3(k,i,j) + enddo + enddo + enddo + endif +C +C 6/23/01 Read parameters for double torsionals +C + do i=1,ntortyp + do j=1,ntortyp + do k=1,ntortyp + read (itordp,'(3a1)',end=114,err=114) t1,t2,t3 + if (t1.ne.onelett(i) .or. t2.ne.onelett(j) + & .or. t3.ne.onelett(k)) then + write (iout,*) "Error in double torsional parameter file", + & i,j,k,t1,t2,t3 +#ifdef MPI + call MPI_Finalize(Ierror) +#endif + stop "Error in double torsional parameter file" + endif + read (itordp,*,end=114,err=114) ntermd_1(i,j,k), + & ntermd_2(i,j,k) + read (itordp,*,end=114,err=114) (v1c(1,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) (v1s(1,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) (v1c(2,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) (v1s(2,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) ((v2c(l,m,i,j,k), + & v2c(m,l,i,j,k),v2s(l,m,i,j,k),v2s(m,l,i,j,k), + & m=1,l-1),l=1,ntermd_2(i,j,k)) + enddo + enddo + enddo + if (lprint) then + write (iout,*) + write (iout,*) 'Constants for double torsionals' + do i=1,ntortyp + do j=1,ntortyp + do k=1,ntortyp + write (iout,*) 'ityp',i,' jtyp',j,' ktyp',k, + & ' nsingle',ntermd_1(i,j,k),' ndouble',ntermd_2(i,j,k) + write (iout,*) + write (iout,*) 'Single angles:' + do l=1,ntermd_1(i,j,k) + write (iout,'(i5,2f10.5,5x,2f10.5)') l, + & v1c(1,l,i,j,k),v1s(1,l,i,j,k), + & v1c(2,l,i,j,k),v1s(2,l,i,j,k) + enddo + write (iout,*) + write (iout,*) 'Pairs of angles:' + write (iout,'(3x,20i10)') (l,l=1,ntermd_2(i,j,k)) + do l=1,ntermd_2(i,j,k) + write (iout,'(i5,20f10.5)') + & l,(v2c(l,m,i,j,k),m=1,ntermd_2(i,j,k)) + enddo + write (iout,*) + write (iout,'(3x,20i10)') (l,l=1,ntermd_2(i,j,k)) + do l=1,ntermd_2(i,j,k) + write (iout,'(i5,20f10.5)') + & l,(v2s(l,m,i,j,k),m=1,ntermd_2(i,j,k)) + enddo + write (iout,*) + enddo + enddo + enddo + endif +#endif +C Read of Side-chain backbone correlation parameters +C Modified 11 May 2012 by Adasko +CCC +C + read (isccor,*,end=1113,err=1113) nsccortyp + read (isccor,*,end=1113,err=1113) (isccortyp(i),i=1,ntyp) +c write (iout,*) 'ntortyp',ntortyp + maxinter=3 +cc maxinter is maximum interaction sites + do l=1,maxinter + do i=1,nsccortyp + do j=1,nsccortyp + read (isccor,*,end=1113,err=1113) + & nterm_sccor(i,j),nlor_sccor(i,j) + v0ijsccor=0.0d0 + si=-1.0d0 + + do k=1,nterm_sccor(i,j) + read (isccor,*,end=1113,err=1113) kk,v1sccor(k,l,i,j) + & ,v2sccor(k,l,i,j) + v0ijsccor=v0ijsccor+si*v1sccor(k,l,i,j) + si=-si + enddo + do k=1,nlor_sccor(i,j) + read (isccor,*,end=1113,err=1113) kk,vlor1sccor(k,i,j), + & vlor2sccor(k,i,j),vlor3sccor(k,i,j) + v0ijsccor=v0ijsccor+vlor1sccor(k,i,j)/ + &(1+vlor3sccor(k,i,j)**2) + enddo + v0sccor(i,j)=v0ijsccor + enddo + enddo + enddo + close (isccor) + + if (lprint) then + write (iout,'(/a/)') 'Torsional constants:' + do i=1,nsccortyp + do j=1,nsccortyp + write (iout,*) 'ityp',i,' jtyp',j + write (iout,*) 'Fourier constants' + do k=1,nterm_sccor(i,j) + write (iout,'(2(1pe15.5))') v1sccor(k,l,i,j),v2sccor(k,l,i,j) + enddo + write (iout,*) 'Lorenz constants' + do k=1,nlor_sccor(i,j) + write (iout,'(3(1pe15.5))') + & vlor1sccor(k,i,j),vlor2sccor(k,i,j),vlor3sccor(k,i,j) + enddo + enddo + enddo + endif +C +C +C 9/18/99 (AL) Read coefficients of the Fourier expansion of the local +C interaction energy of the Gly, Ala, and Pro prototypes. +C + if (lprint) then + write (iout,*) + write (iout,*) "Coefficients of the cumulants" + endif + read (ifourier,*) nloctyp + do i=1,nloctyp + read (ifourier,*,end=115,err=115) + read (ifourier,*,end=115,err=115) (b(ii),ii=1,13) + if (lprint) then + write (iout,*) 'Type',i + write (iout,'(a,i2,a,f10.5)') ('b(',ii,')=',b(ii),ii=1,13) + endif + B1(1,i) = b(3) + B1(2,i) = b(5) +c b1(1,i)=0.0d0 +c b1(2,i)=0.0d0 + B1tilde(1,i) = b(3) + B1tilde(2,i) =-b(5) +c b1tilde(1,i)=0.0d0 +c b1tilde(2,i)=0.0d0 + B2(1,i) = b(2) + B2(2,i) = b(4) +c b2(1,i)=0.0d0 +c b2(2,i)=0.0d0 + CC(1,1,i)= b(7) + CC(2,2,i)=-b(7) + CC(2,1,i)= b(9) + CC(1,2,i)= b(9) +c CC(1,1,i)=0.0d0 +c CC(2,2,i)=0.0d0 +c CC(2,1,i)=0.0d0 +c CC(1,2,i)=0.0d0 + Ctilde(1,1,i)=b(7) + Ctilde(1,2,i)=b(9) + Ctilde(2,1,i)=-b(9) + Ctilde(2,2,i)=b(7) +c Ctilde(1,1,i)=0.0d0 +c Ctilde(1,2,i)=0.0d0 +c Ctilde(2,1,i)=0.0d0 +c Ctilde(2,2,i)=0.0d0 + DD(1,1,i)= b(6) + DD(2,2,i)=-b(6) + DD(2,1,i)= b(8) + DD(1,2,i)= b(8) +c DD(1,1,i)=0.0d0 +c DD(2,2,i)=0.0d0 +c DD(2,1,i)=0.0d0 +c DD(1,2,i)=0.0d0 + Dtilde(1,1,i)=b(6) + Dtilde(1,2,i)=b(8) + Dtilde(2,1,i)=-b(8) + Dtilde(2,2,i)=b(6) +c Dtilde(1,1,i)=0.0d0 +c Dtilde(1,2,i)=0.0d0 +c Dtilde(2,1,i)=0.0d0 +c Dtilde(2,2,i)=0.0d0 + EE(1,1,i)= b(10)+b(11) + EE(2,2,i)=-b(10)+b(11) + EE(2,1,i)= b(12)-b(13) + EE(1,2,i)= b(12)+b(13) +c ee(1,1,i)=1.0d0 +c ee(2,2,i)=1.0d0 +c ee(2,1,i)=0.0d0 +c ee(1,2,i)=0.0d0 +c ee(2,1,i)=ee(1,2,i) + enddo + if (lprint) then + do i=1,nloctyp + write (iout,*) 'Type',i + write (iout,*) 'B1' + write(iout,*) B1(1,i),B1(2,i) + write (iout,*) 'B2' + write(iout,*) B2(1,i),B2(2,i) + write (iout,*) 'CC' + do j=1,2 + write (iout,'(2f10.5)') CC(j,1,i),CC(j,2,i) + enddo + write(iout,*) 'DD' + do j=1,2 + write (iout,'(2f10.5)') DD(j,1,i),DD(j,2,i) + enddo + write(iout,*) 'EE' + do j=1,2 + write (iout,'(2f10.5)') EE(j,1,i),EE(j,2,i) + enddo + enddo + endif +C +C Read electrostatic-interaction parameters +C + if (lprint) then + write (iout,*) + write (iout,'(/a)') 'Electrostatic interaction constants:' + write (iout,'(1x,a,1x,a,10x,a,11x,a,11x,a,11x,a)') + & 'IT','JT','APP','BPP','AEL6','AEL3' + endif + read (ielep,*,end=116,err=116) ((epp(i,j),j=1,2),i=1,2) + read (ielep,*,end=116,err=116) ((rpp(i,j),j=1,2),i=1,2) + read (ielep,*,end=116,err=116) ((elpp6(i,j),j=1,2),i=1,2) + read (ielep,*,end=116,err=116) ((elpp3(i,j),j=1,2),i=1,2) + close (ielep) + do i=1,2 + do j=1,2 + rri=rpp(i,j)**6 + app (i,j)=epp(i,j)*rri*rri + bpp (i,j)=-2.0D0*epp(i,j)*rri + ael6(i,j)=elpp6(i,j)*4.2D0**6 + ael3(i,j)=elpp3(i,j)*4.2D0**3 + if (lprint) write(iout,'(2i3,4(1pe15.4))')i,j,app(i,j),bpp(i,j), + & ael6(i,j),ael3(i,j) + enddo + enddo +C +C Read side-chain interaction parameters. +C + read (isidep,*,end=117,err=117) ipot,expon + if (ipot.lt.1 .or. ipot.gt.5) then + write (iout,'(2a)') 'Error while reading SC interaction', + & 'potential file - unknown potential type.' +#ifdef MPI + call MPI_Finalize(Ierror) +#endif + stop + endif + expon2=expon/2 + if(me.eq.king) + & write(iout,'(/3a,2i3)') 'Potential is ',potname(ipot), + & ', exponents are ',expon,2*expon + goto (10,20,30,30,40) ipot +C----------------------- LJ potential --------------------------------- + 10 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp) + if (lprint) then + write (iout,'(/a/)') 'Parameters of the LJ potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,a)') 'residue','sigma' + write (iout,'(a3,6x,f10.5)') (restyp(i),sigma0(i),i=1,ntyp) + endif + goto 50 +C----------------------- LJK potential -------------------------------- + 20 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp),(rr0(i),i=1,ntyp) + if (lprint) then + write (iout,'(/a/)') 'Parameters of the LJK potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,2a)') 'residue',' sigma ',' r0 ' + write (iout,'(a3,6x,2f10.5)') (restyp(i),sigma0(i),rr0(i), + & i=1,ntyp) + endif + goto 50 +C---------------------- GB or BP potential ----------------------------- + 30 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp),(sigii(i),i=1,ntyp),(chip(i),i=1,ntyp), + & (alp(i),i=1,ntyp) +C For the GB potential convert sigma'**2 into chi' + if (ipot.eq.4) then + do i=1,ntyp + chip(i)=(chip(i)-1.0D0)/(chip(i)+1.0D0) + enddo + endif + if (lprint) then + write (iout,'(/a/)') 'Parameters of the BP potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,4a)') 'residue',' sigma ','s||/s_|_^2', + & ' chip ',' alph ' + write (iout,'(a3,6x,4f10.5)') (restyp(i),sigma0(i),sigii(i), + & chip(i),alp(i),i=1,ntyp) + endif + goto 50 +C--------------------- GBV potential ----------------------------------- + 40 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp),(rr0(i),i=1,ntyp),(sigii(i),i=1,ntyp), + & (chip(i),i=1,ntyp),(alp(i),i=1,ntyp) + if (lprint) then + write (iout,'(/a/)') 'Parameters of the GBV potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,5a)') 'residue',' sigma ',' r0 ', + & 's||/s_|_^2',' chip ',' alph ' + write (iout,'(a3,6x,5f10.5)') (restyp(i),sigma0(i),rr0(i), + & sigii(i),chip(i),alp(i),i=1,ntyp) + endif + 50 continue + close (isidep) +C----------------------------------------------------------------------- +C Calculate the "working" parameters of SC interactions. + do i=2,ntyp + do j=1,i-1 + eps(i,j)=eps(j,i) + enddo + enddo + do i=1,ntyp + do j=i,ntyp + sigma(i,j)=dsqrt(sigma0(i)**2+sigma0(j)**2) + sigma(j,i)=sigma(i,j) + rs0(i,j)=dwa16*sigma(i,j) + rs0(j,i)=rs0(i,j) + enddo + enddo + if (lprint) write (iout,'(/a/10x,7a/72(1h-))') + & 'Working parameters of the SC interactions:', + & ' a ',' b ',' augm ',' sigma ',' r0 ', + & ' chi1 ',' chi2 ' + do i=1,ntyp + do j=i,ntyp + epsij=eps(i,j) + if (ipot.eq.1 .or. ipot.eq.3 .or. ipot.eq.4) then + rrij=sigma(i,j) + else + rrij=rr0(i)+rr0(j) + endif + r0(i,j)=rrij + r0(j,i)=rrij + rrij=rrij**expon + epsij=eps(i,j) + sigeps=dsign(1.0D0,epsij) + epsij=dabs(epsij) + aa(i,j)=epsij*rrij*rrij + bb(i,j)=-sigeps*epsij*rrij + aa(j,i)=aa(i,j) + bb(j,i)=bb(i,j) + if (ipot.gt.2) then + sigt1sq=sigma0(i)**2 + sigt2sq=sigma0(j)**2 + sigii1=sigii(i) + sigii2=sigii(j) + ratsig1=sigt2sq/sigt1sq + ratsig2=1.0D0/ratsig1 + chi(i,j)=(sigii1-1.0D0)/(sigii1+ratsig1) + if (j.gt.i) chi(j,i)=(sigii2-1.0D0)/(sigii2+ratsig2) + rsum_max=dsqrt(sigii1*sigt1sq+sigii2*sigt2sq) + else + rsum_max=sigma(i,j) + endif +c if (ipot.eq.1 .or. ipot.eq.3 .or. ipot.eq.4) then + sigmaii(i,j)=rsum_max + sigmaii(j,i)=rsum_max +c else +c sigmaii(i,j)=r0(i,j) +c sigmaii(j,i)=r0(i,j) +c endif +cd write (iout,*) i,j,r0(i,j),sigma(i,j),rsum_max + if ((ipot.eq.2 .or. ipot.eq.5) .and. r0(i,j).gt.rsum_max) then + r_augm=sigma(i,j)*(rrij-sigma(i,j))/rrij + augm(i,j)=epsij*r_augm**(2*expon) +c augm(i,j)=0.5D0**(2*expon)*aa(i,j) + augm(j,i)=augm(i,j) + else + augm(i,j)=0.0D0 + augm(j,i)=0.0D0 + endif + if (lprint) then + write (iout,'(2(a3,2x),3(1pe10.3),5(0pf8.3))') + & restyp(i),restyp(j),aa(i,j),bb(i,j),augm(i,j), + & sigma(i,j),r0(i,j),chi(i,j),chi(j,i) + endif + enddo + enddo +#ifdef OLDSCP +C +C Define the SC-p interaction constants (hard-coded; old style) +C + do i=1,20 +C "Soft" SC-p repulsion (causes helices to be too flat, but facilitates +C helix formation) +c aad(i,1)=0.3D0*4.0D0**12 +C Following line for constants currently implemented +C "Hard" SC-p repulsion (gives correct turn spacing in helices) + aad(i,1)=1.5D0*4.0D0**12 +c aad(i,1)=0.17D0*5.6D0**12 + aad(i,2)=aad(i,1) +C "Soft" SC-p repulsion + bad(i,1)=0.0D0 +C Following line for constants currently implemented +c aad(i,1)=0.3D0*4.0D0**6 +C "Hard" SC-p repulsion + bad(i,1)=3.0D0*4.0D0**6 +c bad(i,1)=-2.0D0*0.17D0*5.6D0**6 + bad(i,2)=bad(i,1) +c aad(i,1)=0.0D0 +c aad(i,2)=0.0D0 +c bad(i,1)=1228.8D0 +c bad(i,2)=1228.8D0 + enddo +#else +C +C 8/9/01 Read the SC-p interaction constants from file +C + do i=1,ntyp + read (iscpp,*,end=118,err=118) (eps_scp(i,j),rscp(i,j),j=1,2) + enddo + do i=1,ntyp + aad(i,1)=dabs(eps_scp(i,1))*rscp(i,1)**12 + aad(i,2)=dabs(eps_scp(i,2))*rscp(i,2)**12 + bad(i,1)=-2*eps_scp(i,1)*rscp(i,1)**6 + bad(i,2)=-2*eps_scp(i,2)*rscp(i,2)**6 + enddo + + if (lprint) then + write (iout,*) "Parameters of SC-p interactions:" + do i=1,20 + write (iout,'(4f8.3,4e12.4)') eps_scp(i,1),rscp(i,1), + & eps_scp(i,2),rscp(i,2),aad(i,1),bad(i,1),aad(i,2),bad(i,2) + enddo + endif +#endif +C +C Define the constants of the disulfide bridge +C + ebr=-5.50D0 +c +c Old arbitrary potential - commented out. +c +c dbr= 4.20D0 +c fbr= 3.30D0 +c +c Constants of the disulfide-bond potential determined based on the RHF/6-31G** +c energy surface of diethyl disulfide. +c A. Liwo and U. Kozlowska, 11/24/03 +c + D0CM = 3.78d0 + AKCM = 15.1d0 + AKTH = 11.0d0 + AKCT = 12.0d0 + V1SS =-1.08d0 + V2SS = 7.61d0 + V3SS = 13.7d0 +c akcm=0.0d0 +c akth=0.0d0 +c akct=0.0d0 +c v1ss=0.0d0 +c v2ss=0.0d0 +c v3ss=0.0d0 + + if(me.eq.king) then + write (iout,'(/a)') "Disulfide bridge parameters:" + write (iout,'(a,f10.2)') 'S-S bridge energy: ',ebr + write (iout,'(2(a,f10.2))') 'd0cm:',d0cm,' akcm:',akcm + write (iout,'(2(a,f10.2))') 'akth:',akth,' akct:',akct + write (iout,'(3(a,f10.2))') 'v1ss:',v1ss,' v2ss:',v2ss, + & ' v3ss:',v3ss + endif + return + 111 write (iout,*) "Error reading bending energy parameters." + goto 999 + 112 write (iout,*) "Error reading rotamer energy parameters." + goto 999 + 113 write (iout,*) "Error reading torsional energy parameters." + goto 999 + 1113 write (iout,*) + & "Error reading side-chain torsional energy parameters." + goto 999 + 114 write (iout,*) "Error reading double torsional energy parameters." + goto 999 + 115 write (iout,*) + & "Error reading cumulant (multibody energy) parameters." + goto 999 + 116 write (iout,*) "Error reading electrostatic energy parameters." + goto 999 + 117 write (iout,*) "Error reading side chain interaction parameters." + goto 999 + 118 write (iout,*) "Error reading SCp interaction parameters." + goto 999 + 119 write (iout,*) "Error reading SCCOR parameters" + 999 continue +#ifdef MPI + call MPI_Finalize(Ierror) +#endif + stop + return + end + + + subroutine getenv_loc(var, val) + character(*) var, val + +#ifdef WINIFL + character(2000) line + external ilen + + open (196,file='env',status='old',readonly,shared) + iread=0 +c write(*,*)'looking for ',var +10 read(196,*,err=11,end=11)line + iread=index(line,var) +c write(*,*)iread,' ',var,' ',line + if (iread.eq.0) go to 10 +c write(*,*)'---> ',line +11 continue + if(iread.eq.0) then +c write(*,*)'CHUJ' + val='' + else + iread=iread+ilen(var)+1 + read (line(iread:),*,err=12,end=12) val +c write(*,*)'OK: ',var,' = ',val + endif + close(196) + return +12 val='' + close(196) +#elif (defined CRAY) + integer lennam,lenval,ierror +c +c getenv using a POSIX call, useful on the T3D +c Sept 1996, comment out error check on advice of H. Pritchard +c + lennam = len(var) + if(lennam.le.0) stop '--error calling getenv--' + call pxfgetenv(var,lennam,val,lenval,ierror) +c-HP- if(ierror.ne.0) stop '--error returned by pxfgetenv--' +#else + call getenv(var,val) +#endif + + return + end diff --git a/source/unres/src_Eshel/pinorm.f b/source/unres/src_Eshel/pinorm.f new file mode 100644 index 0000000..91392bf --- /dev/null +++ b/source/unres/src_Eshel/pinorm.f @@ -0,0 +1,17 @@ + double precision function pinorm(x) + implicit real*8 (a-h,o-z) +c +c this function takes an angle (in radians) and puts it in the range of +c -pi to +pi. +c + integer n + include 'COMMON.GEO' + n = x / dwapi + pinorm = x - n * dwapi + if ( pinorm .gt. pi ) then + pinorm = pinorm - dwapi + else if ( pinorm .lt. - pi ) then + pinorm = pinorm + dwapi + end if + return + end diff --git a/source/unres/src_Eshel/printmat.f b/source/unres/src_Eshel/printmat.f new file mode 100644 index 0000000..be2b38f --- /dev/null +++ b/source/unres/src_Eshel/printmat.f @@ -0,0 +1,16 @@ + subroutine printmat(ldim,m,n,iout,key,a) + character*3 key(n) + double precision a(ldim,n) + do 1 i=1,n,8 + nlim=min0(i+7,n) + write (iout,1000) (key(k),k=i,nlim) + write (iout,1020) + 1000 format (/5x,8(6x,a3)) + 1020 format (/80(1h-)/) + do 2 j=1,n + write (iout,1010) key(j),(a(j,k),k=i,nlim) + 2 continue + 1 continue + 1010 format (a3,2x,8(f9.4)) + return + end diff --git a/source/unres/src_Eshel/prng.f b/source/unres/src_Eshel/prng.f new file mode 100644 index 0000000..73f6766 --- /dev/null +++ b/source/unres/src_Eshel/prng.f @@ -0,0 +1,525 @@ + real*8 function prng_next(me) + implicit none + integer me +c +c Calling sequence: +c = prng_next ( ) +c = vprng ( , , ) +c +c This code is based on a sequential algorithm provided by Mal Kalos. +c This version uses a single 64-bit word to store the initial seeds +c and additive constants. +c A 64-bit floating point number is returned. +c +c The array "iparam" is full-word aligned, being padded by zeros to +c let each generator be on a subpage boundary. +c That is, rows 1 and 2 in a given column of the array are for real, +c rows 3-16 are bogus. +c +c July 12, 1993: double the number of sequences. We should have been +c using two packets per seed, rather than four +c October 31, 1993: merge the two arrays of seeds and constants, +c and switch to 64-bit arithmetic. +c June 1994: port to RS6K. Internal state is kept as 2 64-bit integers +c The ishft function is defined only on 32-bit integers, so we will +c shift numbers by dividing by 2**11 and then adding on 2**53-1. +c +c November 1994: ishift now works on 64-bit numbers (though it gives a +c warning). Thus we go back to using it. John Zollweg also added the +c vprng() routine to return vectors of real*8 random numbers. +c + real*8 recip53 + parameter ( recip53 = 2.0D0**(-53) ) + integer*8 two + parameter ( two = 2**11) + integer*8 m,ishift +c parameter ( m = 34522712143931 ) ! 11**13 +c parameter ( ishift = 9007199254740991 ) ! 2**53-1 + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + integer*8 next + +crc g77 doesn't support integer*8 constants + m = dint(34522712143931.0d0) + ishift = dint(9007199254740991.0d0) + +c RS6K porting note: ishift now takes 64-bit integers , with a warning + if ( 0.le.me .and. me.le.nmax ) then + next = iparam(1,me)*m + iparam(2,me) + iparam(1,me) = next + prng_next = recip53 * ishft( next, -11 ) + else + prng_next=-1.0D0 + endif + + end +c +c vprng(me, rn, num) Get a vector of random numbers +c + subroutine vprng(me,rn,num) + real*8 recip53, rn(1) + parameter ( recip53 = 2.0D0**(-53) ) + integer*8 m,iparam +c parameter ( m = 34522712143931 ) ! 11**13 + integer nmax, num, me + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + integer*8 next + +crc g77 doesn't support integer*8 constants + m = dint(34522712143931.0d0) + + if ( 0.le.me .and. me.le.nmax ) then + do 1 i=1,num + next = iparam(1,me)*m + iparam(2,me) + iparam(1,me) = next + rn(i) = recip53 * ishft( next, -11 ) + 1 continue + else + rn(1)=-1.0D0 + endif + return + end + +c +c prng_chkpnt Get the current state of a generator +c +c Calling sequence: +c logical prng_chkpnt, status +c status = prng_chkpnt (me, iseed) where +c +c me is the particular generator whose state is being gotten +c seed is an 4-element integer array where the "l"-values will be saved +c + logical function prng_chkpnt (me, iseed) + implicit none + integer me + integer*8 iseed + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + if (me .lt. 0 .or. me .gt. nmax) then + prng_chkpnt=.false. + else + prng_chkpnt=.true. + iseed=iparam(1,me) + endif + end +c +c prng_restart Restart generator from a saved state +c +c Calling sequence: +c logical prng_restart, status +c status = prng_restart (me, iseed) where +c +c me is the particular generator being restarted +c iseed is a 8-byte integer containing the "l"-values +c + logical function prng_restart (me, iseed) + implicit none + integer me + integer*8 iseed + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + if (me .lt. 0 .or. me .gt. nmax) then + prng_restart=.false. + return + else + prng_restart=.true. + iparam(1,me)=iseed + endif + end + + block data prngblk + parameter(nmax=1021) + integer*8 iparam + common/ksrprng/iparam(2,0:nmax) + data (iparam(1,i),iparam(2,i),i= 0, 29) / + + 11848219, 11848219, 11848237, 11848237, 11848241, 11848241, + + 11848247, 11848247, 11848253, 11848253, 11848271, 11848271, + + 11848297, 11848297, 11848313, 11848313, 11848339, 11848339, + + 11848351, 11848351, 11848357, 11848357, 11848363, 11848363, + + 11848367, 11848367, 11848373, 11848373, 11848379, 11848379, + + 11848393, 11848393, 11848433, 11848433, 11848451, 11848451, + + 11848469, 11848469, 11848477, 11848477, 11848489, 11848489, + + 11848493, 11848493, 11848513, 11848513, 11848523, 11848523, + + 11848531, 11848531, 11848537, 11848537, 11848553, 11848553, + + 11848589, 11848589, 11848591, 11848591, 11848601, 11848601 / + data (iparam(1,i),iparam(2,i),i= 30, 59) / + + 11848619, 11848619, 11848637, 11848637, 11848663, 11848663, + + 11848673, 11848673, 11848679, 11848679, 11848691, 11848691, + + 11848699, 11848699, 11848709, 11848709, 11848717, 11848717, + + 11848721, 11848721, 11848729, 11848729, 11848741, 11848741, + + 11848751, 11848751, 11848757, 11848757, 11848787, 11848787, + + 11848801, 11848801, 11848829, 11848829, 11848853, 11848853, + + 11848861, 11848861, 11848867, 11848867, 11848873, 11848873, + + 11848891, 11848891, 11848909, 11848909, 11848919, 11848919, + + 11848931, 11848931, 11848937, 11848937, 11848961, 11848961, + + 11848981, 11848981, 11849021, 11849021, 11849039, 11849039 / + data (iparam(1,i),iparam(2,i),i= 60, 89) / + + 11849053, 11849053, 11849059, 11849059, 11849069, 11849069, + + 11849077, 11849077, 11849087, 11849087, 11849093, 11849093, + + 11849107, 11849107, 11849111, 11849111, 11849129, 11849129, + + 11849137, 11849137, 11849177, 11849177, 11849183, 11849183, + + 11849203, 11849203, 11849231, 11849231, 11849237, 11849237, + + 11849239, 11849239, 11849249, 11849249, 11849251, 11849251, + + 11849269, 11849269, 11849273, 11849273, 11849291, 11849291, + + 11849297, 11849297, 11849309, 11849309, 11849339, 11849339, + + 11849359, 11849359, 11849363, 11849363, 11849399, 11849399, + + 11849401, 11849401, 11849413, 11849413, 11849417, 11849417 / + data (iparam(1,i),iparam(2,i),i= 90, 119) / + + 11849437, 11849437, 11849443, 11849443, 11849473, 11849473, + + 11849491, 11849491, 11849503, 11849503, 11849507, 11849507, + + 11849557, 11849557, 11849567, 11849567, 11849569, 11849569, + + 11849573, 11849573, 11849587, 11849587, 11849599, 11849599, + + 11849633, 11849633, 11849641, 11849641, 11849653, 11849653, + + 11849659, 11849659, 11849671, 11849671, 11849683, 11849683, + + 11849689, 11849689, 11849693, 11849693, 11849699, 11849699, + + 11849701, 11849701, 11849707, 11849707, 11849713, 11849713, + + 11849723, 11849723, 11849741, 11849741, 11849743, 11849743, + + 11849759, 11849759, 11849767, 11849767, 11849771, 11849771 / + data (iparam(1,i),iparam(2,i),i= 120, 149) / + + 11849791, 11849791, 11849801, 11849801, 11849809, 11849809, + + 11849813, 11849813, 11849869, 11849869, 11849881, 11849881, + + 11849891, 11849891, 11849909, 11849909, 11849923, 11849923, + + 11849933, 11849933, 11849947, 11849947, 11849987, 11849987, + + 11850001, 11850001, 11850011, 11850011, 11850019, 11850019, + + 11850023, 11850023, 11850031, 11850031, 11850049, 11850049, + + 11850061, 11850061, 11850073, 11850073, 11850077, 11850077, + + 11850103, 11850103, 11850109, 11850109, 11850121, 11850121, + + 11850127, 11850127, 11850133, 11850133, 11850149, 11850149, + + 11850161, 11850161, 11850169, 11850169, 11850191, 11850191 / + data (iparam(1,i),iparam(2,i),i= 150, 179) / + + 11850233, 11850233, 11850247, 11850247, 11850259, 11850259, + + 11850269, 11850269, 11850283, 11850283, 11850301, 11850301, + + 11850341, 11850341, 11850347, 11850347, 11850367, 11850367, + + 11850373, 11850373, 11850379, 11850379, 11850389, 11850389, + + 11850407, 11850407, 11850427, 11850427, 11850437, 11850437, + + 11850469, 11850469, 11850481, 11850481, 11850511, 11850511, + + 11850529, 11850529, 11850541, 11850541, 11850557, 11850557, + + 11850607, 11850607, 11850611, 11850611, 11850667, 11850667, + + 11850677, 11850677, 11850679, 11850679, 11850701, 11850701, + + 11850731, 11850731, 11850739, 11850739, 11850749, 11850749 / + data (iparam(1,i),iparam(2,i),i= 180, 209) / + + 11850791, 11850791, 11850803, 11850803, 11850829, 11850829, + + 11850833, 11850833, 11850859, 11850859, 11850877, 11850877, + + 11850899, 11850899, 11850907, 11850907, 11850913, 11850913, + + 11850919, 11850919, 11850931, 11850931, 11850941, 11850941, + + 11850947, 11850947, 11850953, 11850953, 11850961, 11850961, + + 11850983, 11850983, 11850991, 11850991, 11850997, 11850997, + + 11851031, 11851031, 11851033, 11851033, 11851051, 11851051, + + 11851061, 11851061, 11851067, 11851067, 11851093, 11851093, + + 11851109, 11851109, 11851123, 11851123, 11851127, 11851127, + + 11851139, 11851139, 11851157, 11851157, 11851163, 11851163 / + data (iparam(1,i),iparam(2,i),i= 210, 239) / + + 11851181, 11851181, 11851201, 11851201, 11851219, 11851219, + + 11851291, 11851291, 11851303, 11851303, 11851309, 11851309, + + 11851313, 11851313, 11851319, 11851319, 11851349, 11851349, + + 11851351, 11851351, 11851361, 11851361, 11851373, 11851373, + + 11851403, 11851403, 11851409, 11851409, 11851423, 11851423, + + 11851447, 11851447, 11851451, 11851451, 11851481, 11851481, + + 11851493, 11851493, 11851519, 11851519, 11851523, 11851523, + + 11851529, 11851529, 11851547, 11851547, 11851549, 11851549, + + 11851559, 11851559, 11851577, 11851577, 11851589, 11851589, + + 11851591, 11851591, 11851597, 11851597, 11851603, 11851603 / + data (iparam(1,i),iparam(2,i),i= 240, 269) / + + 11851607, 11851607, 11851613, 11851613, 11851621, 11851621, + + 11851627, 11851627, 11851639, 11851639, 11851673, 11851673, + + 11851681, 11851681, 11851727, 11851727, 11851753, 11851753, + + 11851759, 11851759, 11851787, 11851787, 11851793, 11851793, + + 11851799, 11851799, 11851813, 11851813, 11851841, 11851841, + + 11851859, 11851859, 11851867, 11851867, 11851891, 11851891, + + 11851909, 11851909, 11851919, 11851919, 11851927, 11851927, + + 11851933, 11851933, 11851949, 11851949, 11851967, 11851967, + + 11851997, 11851997, 11852017, 11852017, 11852051, 11852051, + + 11852053, 11852053, 11852059, 11852059, 11852083, 11852083 / + data (iparam(1,i),iparam(2,i),i= 270, 299) / + + 11852089, 11852089, 11852129, 11852129, 11852147, 11852147, + + 11852149, 11852149, 11852161, 11852161, 11852171, 11852171, + + 11852177, 11852177, 11852209, 11852209, 11852221, 11852221, + + 11852237, 11852237, 11852251, 11852251, 11852263, 11852263, + + 11852273, 11852273, 11852279, 11852279, 11852287, 11852287, + + 11852293, 11852293, 11852297, 11852297, 11852303, 11852303, + + 11852311, 11852311, 11852327, 11852327, 11852339, 11852339, + + 11852341, 11852341, 11852359, 11852359, 11852369, 11852369, + + 11852437, 11852437, 11852453, 11852453, 11852459, 11852459, + + 11852473, 11852473, 11852513, 11852513, 11852531, 11852531 / + data (iparam(1,i),iparam(2,i),i= 300, 329) / + + 11852537, 11852537, 11852539, 11852539, 11852557, 11852557, + + 11852573, 11852573, 11852579, 11852579, 11852591, 11852591, + + 11852609, 11852609, 11852611, 11852611, 11852623, 11852623, + + 11852641, 11852641, 11852647, 11852647, 11852657, 11852657, + + 11852663, 11852663, 11852717, 11852717, 11852719, 11852719, + + 11852741, 11852741, 11852759, 11852759, 11852767, 11852767, + + 11852773, 11852773, 11852803, 11852803, 11852807, 11852807, + + 11852809, 11852809, 11852831, 11852831, 11852833, 11852833, + + 11852837, 11852837, 11852857, 11852857, 11852873, 11852873, + + 11852879, 11852879, 11852891, 11852891, 11852917, 11852917 / + data (iparam(1,i),iparam(2,i),i= 330, 359) / + + 11852921, 11852921, 11852957, 11852957, 11852959, 11852959, + + 11852969, 11852969, 11852983, 11852983, 11852989, 11852989, + + 11853001, 11853001, 11853013, 11853013, 11853019, 11853019, + + 11853031, 11853031, 11853089, 11853089, 11853133, 11853133, + + 11853157, 11853157, 11853161, 11853161, 11853181, 11853181, + + 11853203, 11853203, 11853217, 11853217, 11853221, 11853221, + + 11853227, 11853227, 11853241, 11853241, 11853307, 11853307, + + 11853319, 11853319, 11853323, 11853323, 11853329, 11853329, + + 11853367, 11853367, 11853383, 11853383, 11853419, 11853419, + + 11853421, 11853421, 11853427, 11853427, 11853449, 11853449 / + data (iparam(1,i),iparam(2,i),i= 360, 389) / + + 11853451, 11853451, 11853463, 11853463, 11853529, 11853529, + + 11853557, 11853557, 11853571, 11853571, 11853601, 11853601, + + 11853613, 11853613, 11853617, 11853617, 11853629, 11853629, + + 11853649, 11853649, 11853659, 11853659, 11853679, 11853679, + + 11853689, 11853689, 11853719, 11853719, 11853731, 11853731, + + 11853757, 11853757, 11853761, 11853761, 11853773, 11853773, + + 11853791, 11853791, 11853817, 11853817, 11853839, 11853839, + + 11853847, 11853847, 11853857, 11853857, 11853869, 11853869, + + 11853883, 11853883, 11853887, 11853887, 11853889, 11853889, + + 11853893, 11853893, 11853899, 11853899, 11853911, 11853911 / + data (iparam(1,i),iparam(2,i),i= 390, 419) / + + 11853931, 11853931, 11853943, 11853943, 11853979, 11853979, + + 11853991, 11853991, 11854001, 11854001, 11854009, 11854009, + + 11854019, 11854019, 11854057, 11854057, 11854061, 11854061, + + 11854147, 11854147, 11854159, 11854159, 11854163, 11854163, + + 11854169, 11854169, 11854211, 11854211, 11854247, 11854247, + + 11854261, 11854261, 11854267, 11854267, 11854279, 11854279, + + 11854303, 11854303, 11854327, 11854327, 11854331, 11854331, + + 11854333, 11854333, 11854363, 11854363, 11854379, 11854379, + + 11854399, 11854399, 11854411, 11854411, 11854429, 11854429, + + 11854433, 11854433, 11854439, 11854439, 11854441, 11854441 / + data (iparam(1,i),iparam(2,i),i= 420, 449) / + + 11854463, 11854463, 11854477, 11854477, 11854489, 11854489, + + 11854517, 11854517, 11854519, 11854519, 11854523, 11854523, + + 11854529, 11854529, 11854567, 11854567, 11854571, 11854571, + + 11854573, 11854573, 11854603, 11854603, 11854607, 11854607, + + 11854681, 11854681, 11854691, 11854691, 11854709, 11854709, + + 11854723, 11854723, 11854757, 11854757, 11854783, 11854783, + + 11854793, 11854793, 11854813, 11854813, 11854847, 11854847, + + 11854853, 11854853, 11854873, 11854873, 11854877, 11854877, + + 11854883, 11854883, 11854891, 11854891, 11854897, 11854897, + + 11854901, 11854901, 11854919, 11854919, 11854937, 11854937 / + data (iparam(1,i),iparam(2,i),i= 450, 479) / + + 11854961, 11854961, 11854963, 11854963, 11854979, 11854979, + + 11855003, 11855003, 11855017, 11855017, 11855023, 11855023, + + 11855029, 11855029, 11855033, 11855033, 11855111, 11855111, + + 11855141, 11855141, 11855147, 11855147, 11855149, 11855149, + + 11855159, 11855159, 11855177, 11855177, 11855203, 11855203, + + 11855213, 11855213, 11855219, 11855219, 11855231, 11855231, + + 11855267, 11855267, 11855269, 11855269, 11855303, 11855303, + + 11855309, 11855309, 11855321, 11855321, 11855329, 11855329, + + 11855339, 11855339, 11855351, 11855351, 11855353, 11855353, + + 11855357, 11855357, 11855359, 11855359, 11855381, 11855381 / + data (iparam(1,i),iparam(2,i),i= 480, 509) / + + 11855383, 11855383, 11855387, 11855387, 11855399, 11855399, + + 11855407, 11855407, 11855413, 11855413, 11855489, 11855489, + + 11855491, 11855491, 11855507, 11855507, 11855521, 11855521, + + 11855531, 11855531, 11855549, 11855549, 11855551, 11855551, + + 11855567, 11855567, 11855581, 11855581, 11855587, 11855587, + + 11855593, 11855593, 11855633, 11855633, 11855653, 11855653, + + 11855663, 11855663, 11855687, 11855687, 11855689, 11855689, + + 11855699, 11855699, 11855713, 11855713, 11855731, 11855731, + + 11855737, 11855737, 11855743, 11855743, 11855747, 11855747, + + 11855759, 11855759, 11855773, 11855773, 11855801, 11855801 / + data (iparam(1,i),iparam(2,i),i= 510, 539) / + + 11855807, 11855807, 11855813, 11855813, 11855827, 11855827, + + 11855839, 11855839, 11855869, 11855869, 11855881, 11855881, + + 11855903, 11855903, 11855911, 11855911, 11855933, 11855933, + + 11855959, 11855959, 11855989, 11855989, 11855993, 11855993, + + 11855999, 11855999, 11856001, 11856001, 11856023, 11856023, + + 11856049, 11856049, 11856071, 11856071, 11856101, 11856101, + + 11856107, 11856107, 11856113, 11856113, 11856139, 11856139, + + 11856151, 11856151, 11856161, 11856161, 11856179, 11856179, + + 11856193, 11856193, 11856199, 11856199, 11856223, 11856223, + + 11856239, 11856239, 11856263, 11856263, 11856269, 11856269 / + data (iparam(1,i),iparam(2,i),i= 540, 569) / + + 11856281, 11856281, 11856287, 11856287, 11856307, 11856307, + + 11856311, 11856311, 11856329, 11856329, 11856343, 11856343, + + 11856359, 11856359, 11856371, 11856371, 11856373, 11856373, + + 11856409, 11856409, 11856419, 11856419, 11856461, 11856461, + + 11856469, 11856469, 11856473, 11856473, 11856479, 11856479, + + 11856511, 11856511, 11856517, 11856517, 11856541, 11856541, + + 11856547, 11856547, 11856553, 11856553, 11856583, 11856583, + + 11856629, 11856629, 11856641, 11856641, 11856653, 11856653, + + 11856659, 11856659, 11856673, 11856673, 11856697, 11856697, + + 11856709, 11856709, 11856727, 11856727, 11856731, 11856731 / + data (iparam(1,i),iparam(2,i),i= 570, 599) / + + 11856763, 11856763, 11856809, 11856809, 11856811, 11856811, + + 11856821, 11856821, 11856841, 11856841, 11856857, 11856857, + + 11856877, 11856877, 11856883, 11856883, 11856899, 11856899, + + 11856919, 11856919, 11856947, 11856947, 11856953, 11856953, + + 11856979, 11856979, 11857003, 11857003, 11857033, 11857033, + + 11857037, 11857037, 11857039, 11857039, 11857049, 11857049, + + 11857061, 11857061, 11857067, 11857067, 11857073, 11857073, + + 11857081, 11857081, 11857091, 11857091, 11857093, 11857093, + + 11857099, 11857099, 11857123, 11857123, 11857127, 11857127, + + 11857147, 11857147, 11857151, 11857151, 11857193, 11857193 / + data (iparam(1,i),iparam(2,i),i= 600, 629) / + + 11857217, 11857217, 11857229, 11857229, 11857243, 11857243, + + 11857249, 11857249, 11857267, 11857267, 11857277, 11857277, + + 11857291, 11857291, 11857303, 11857303, 11857309, 11857309, + + 11857327, 11857327, 11857331, 11857331, 11857333, 11857333, + + 11857361, 11857361, 11857367, 11857367, 11857369, 11857369, + + 11857393, 11857393, 11857399, 11857399, 11857409, 11857409, + + 11857421, 11857421, 11857423, 11857423, 11857451, 11857451, + + 11857453, 11857453, 11857457, 11857457, 11857477, 11857477, + + 11857481, 11857481, 11857493, 11857493, 11857499, 11857499, + + 11857519, 11857519, 11857523, 11857523, 11857529, 11857529 / + data (iparam(1,i),iparam(2,i),i= 630, 659) / + + 11857543, 11857543, 11857561, 11857561, 11857589, 11857589, + + 11857591, 11857591, 11857613, 11857613, 11857621, 11857621, + + 11857661, 11857661, 11857667, 11857667, 11857693, 11857693, + + 11857697, 11857697, 11857709, 11857709, 11857711, 11857711, + + 11857751, 11857751, 11857753, 11857753, 11857759, 11857759, + + 11857763, 11857763, 11857777, 11857777, 11857787, 11857787, + + 11857793, 11857793, 11857801, 11857801, 11857817, 11857817, + + 11857819, 11857819, 11857831, 11857831, 11857837, 11857837, + + 11857873, 11857873, 11857877, 11857877, 11857883, 11857883, + + 11857889, 11857889, 11857907, 11857907, 11857913, 11857913 / + data (iparam(1,i),iparam(2,i),i= 660, 689) / + + 11857931, 11857931, 11857969, 11857969, 11857991, 11857991, + + 11857999, 11857999, 11858009, 11858009, 11858017, 11858017, + + 11858023, 11858023, 11858029, 11858029, 11858039, 11858039, + + 11858051, 11858051, 11858057, 11858057, 11858059, 11858059, + + 11858101, 11858101, 11858111, 11858111, 11858131, 11858131, + + 11858149, 11858149, 11858159, 11858159, 11858177, 11858177, + + 11858191, 11858191, 11858201, 11858201, 11858227, 11858227, + + 11858243, 11858243, 11858267, 11858267, 11858269, 11858269, + + 11858279, 11858279, 11858281, 11858281, 11858291, 11858291, + + 11858311, 11858311, 11858323, 11858323, 11858359, 11858359 / + data (iparam(1,i),iparam(2,i),i= 690, 719) / + + 11858377, 11858377, 11858381, 11858381, 11858387, 11858387, + + 11858423, 11858423, 11858443, 11858443, 11858447, 11858447, + + 11858479, 11858479, 11858533, 11858533, 11858543, 11858543, + + 11858551, 11858551, 11858557, 11858557, 11858569, 11858569, + + 11858573, 11858573, 11858579, 11858579, 11858597, 11858597, + + 11858599, 11858599, 11858629, 11858629, 11858657, 11858657, + + 11858659, 11858659, 11858683, 11858683, 11858701, 11858701, + + 11858719, 11858719, 11858723, 11858723, 11858729, 11858729, + + 11858747, 11858747, 11858779, 11858779, 11858783, 11858783, + + 11858801, 11858801, 11858807, 11858807, 11858813, 11858813 / + data (iparam(1,i),iparam(2,i),i= 720, 749) / + + 11858839, 11858839, 11858851, 11858851, 11858893, 11858893, + + 11858897, 11858897, 11858921, 11858921, 11858947, 11858947, + + 11858953, 11858953, 11858969, 11858969, 11858971, 11858971, + + 11858989, 11858989, 11859017, 11859017, 11859031, 11859031, + + 11859049, 11859049, 11859061, 11859061, 11859073, 11859073, + + 11859077, 11859077, 11859079, 11859079, 11859083, 11859083, + + 11859101, 11859101, 11859109, 11859109, 11859137, 11859137, + + 11859139, 11859139, 11859151, 11859151, 11859157, 11859157, + + 11859163, 11859163, 11859167, 11859167, 11859179, 11859179, + + 11859187, 11859187, 11859229, 11859229, 11859233, 11859233 / + data (iparam(1,i),iparam(2,i),i= 750, 779) / + + 11859241, 11859241, 11859247, 11859247, 11859269, 11859269, + + 11859293, 11859293, 11859307, 11859307, 11859311, 11859311, + + 11859349, 11859349, 11859359, 11859359, 11859371, 11859371, + + 11859377, 11859377, 11859383, 11859383, 11859427, 11859427, + + 11859433, 11859433, 11859451, 11859451, 11859457, 11859457, + + 11859461, 11859461, 11859473, 11859473, 11859481, 11859481, + + 11859487, 11859487, 11859493, 11859493, 11859503, 11859503, + + 11859509, 11859509, 11859539, 11859539, 11859541, 11859541, + + 11859563, 11859563, 11859569, 11859569, 11859571, 11859571, + + 11859583, 11859583, 11859599, 11859599, 11859611, 11859611 / + data (iparam(1,i),iparam(2,i),i= 780, 809) / + + 11859643, 11859643, 11859707, 11859707, 11859713, 11859713, + + 11859719, 11859719, 11859739, 11859739, 11859751, 11859751, + + 11859791, 11859791, 11859817, 11859817, 11859821, 11859821, + + 11859833, 11859833, 11859847, 11859847, 11859853, 11859853, + + 11859877, 11859877, 11859889, 11859889, 11859893, 11859893, + + 11859901, 11859901, 11859907, 11859907, 11859917, 11859917, + + 11859923, 11859923, 11859929, 11859929, 11859961, 11859961, + + 11859979, 11859979, 11859989, 11859989, 11859997, 11859997, + + 11860021, 11860021, 11860031, 11860031, 11860039, 11860039, + + 11860049, 11860049, 11860081, 11860081, 11860087, 11860087 / + data (iparam(1,i),iparam(2,i),i= 810, 839) / + + 11860097, 11860097, 11860103, 11860103, 11860109, 11860109, + + 11860117, 11860117, 11860133, 11860133, 11860151, 11860151, + + 11860171, 11860171, 11860207, 11860207, 11860223, 11860223, + + 11860231, 11860231, 11860243, 11860243, 11860267, 11860267, + + 11860301, 11860301, 11860307, 11860307, 11860327, 11860327, + + 11860379, 11860379, 11860397, 11860397, 11860411, 11860411, + + 11860469, 11860469, 11860477, 11860477, 11860483, 11860483, + + 11860487, 11860487, 11860489, 11860489, 11860493, 11860493, + + 11860517, 11860517, 11860547, 11860547, 11860567, 11860567, + + 11860573, 11860573, 11860613, 11860613, 11860619, 11860619 / + data (iparam(1,i),iparam(2,i),i= 840, 869) / + + 11860627, 11860627, 11860637, 11860637, 11860643, 11860643, + + 11860649, 11860649, 11860661, 11860661, 11860669, 11860669, + + 11860687, 11860687, 11860691, 11860691, 11860697, 11860697, + + 11860699, 11860699, 11860703, 11860703, 11860727, 11860727, + + 11860741, 11860741, 11860753, 11860753, 11860777, 11860777, + + 11860787, 11860787, 11860789, 11860789, 11860811, 11860811, + + 11860837, 11860837, 11860859, 11860859, 11860867, 11860867, + + 11860889, 11860889, 11860897, 11860897, 11860963, 11860963, + + 11860969, 11860969, 11860973, 11860973, 11860993, 11860993, + + 11861011, 11861011, 11861033, 11861033, 11861071, 11861071 / + data (iparam(1,i),iparam(2,i),i= 870, 899) / + + 11861081, 11861081, 11861089, 11861089, 11861093, 11861093, + + 11861099, 11861099, 11861107, 11861107, 11861131, 11861131, + + 11861141, 11861141, 11861159, 11861159, 11861167, 11861167, + + 11861191, 11861191, 11861197, 11861197, 11861207, 11861207, + + 11861219, 11861219, 11861221, 11861221, 11861231, 11861231, + + 11861237, 11861237, 11861273, 11861273, 11861293, 11861293, + + 11861299, 11861299, 11861303, 11861303, 11861327, 11861327, + + 11861351, 11861351, 11861357, 11861357, 11861363, 11861363, + + 11861371, 11861371, 11861401, 11861401, 11861407, 11861407, + + 11861411, 11861411, 11861413, 11861413, 11861429, 11861429 / + data (iparam(1,i),iparam(2,i),i= 900, 929) / + + 11861441, 11861441, 11861467, 11861467, 11861527, 11861527, + + 11861539, 11861539, 11861543, 11861543, 11861557, 11861557, + + 11861569, 11861569, 11861573, 11861573, 11861579, 11861579, + + 11861581, 11861581, 11861599, 11861599, 11861611, 11861611, + + 11861617, 11861617, 11861627, 11861627, 11861639, 11861639, + + 11861651, 11861651, 11861659, 11861659, 11861671, 11861671, + + 11861683, 11861683, 11861687, 11861687, 11861693, 11861693, + + 11861701, 11861701, 11861711, 11861711, 11861713, 11861713, + + 11861749, 11861749, 11861791, 11861791, 11861803, 11861803, + + 11861819, 11861819, 11861827, 11861827, 11861849, 11861849 / + data (iparam(1,i),iparam(2,i),i= 930, 959) / + + 11861873, 11861873, 11861879, 11861879, 11861887, 11861887, + + 11861911, 11861911, 11861917, 11861917, 11861921, 11861921, + + 11861923, 11861923, 11861953, 11861953, 11861959, 11861959, + + 11861987, 11861987, 11862007, 11862007, 11862013, 11862013, + + 11862029, 11862029, 11862031, 11862031, 11862049, 11862049, + + 11862077, 11862077, 11862083, 11862083, 11862157, 11862157, + + 11862167, 11862167, 11862199, 11862199, 11862203, 11862203, + + 11862217, 11862217, 11862223, 11862223, 11862229, 11862229, + + 11862233, 11862233, 11862239, 11862239, 11862241, 11862241, + + 11862259, 11862259, 11862269, 11862269, 11862271, 11862271 / + data (iparam(1,i),iparam(2,i),i= 960, 989) / + + 11862293, 11862293, 11862307, 11862307, 11862313, 11862313, + + 11862317, 11862317, 11862343, 11862343, 11862353, 11862353, + + 11862373, 11862373, 11862391, 11862391, 11862439, 11862439, + + 11862469, 11862469, 11862493, 11862493, 11862527, 11862527, + + 11862547, 11862547, 11862563, 11862563, 11862569, 11862569, + + 11862577, 11862577, 11862581, 11862581, 11862611, 11862611, + + 11862623, 11862623, 11862661, 11862661, 11862673, 11862673, + + 11862679, 11862679, 11862701, 11862701, 11862703, 11862703, + + 11862713, 11862713, 11862761, 11862761, 11862791, 11862791, + + 11862803, 11862803, 11862839, 11862839, 11862841, 11862841 / + data (iparam(1,i),iparam(2,i),i= 990,1019) / + + 11862857, 11862857, 11862869, 11862869, 11862881, 11862881, + + 11862911, 11862911, 11862919, 11862919, 11862959, 11862959, + + 11862979, 11862979, 11862989, 11862989, 11862997, 11862997, + + 11863021, 11863021, 11863031, 11863031, 11863037, 11863037, + + 11863039, 11863039, 11863057, 11863057, 11863067, 11863067, + + 11863073, 11863073, 11863099, 11863099, 11863109, 11863109, + + 11863121, 11863121, 11863123, 11863123, 11863133, 11863133, + + 11863151, 11863151, 11863153, 11863153, 11863171, 11863171, + + 11863183, 11863183, 11863207, 11863207, 11863213, 11863213, + + 11863237, 11863237, 11863249, 11863249, 11863253, 11863253 / + data (iparam(1,i),iparam(2,i),i=1020,1021) / + + 11863259, 11863259, 11863279, 11863279 / + end diff --git a/source/unres/src_Eshel/proc_proc.c b/source/unres/src_Eshel/proc_proc.c new file mode 100644 index 0000000..d77c5a4 --- /dev/null +++ b/source/unres/src_Eshel/proc_proc.c @@ -0,0 +1,139 @@ +#include +#include + +#ifdef CRAY +void PROC_PROC(long int *f, int *i) +#else +#ifdef LINUX +#ifdef PGI +void proc_proc_(long int *f, int *i) +#else +void proc_proc__(long int *f, int *i) +#endif +#endif +#ifdef SGI +void proc_proc_(long int *f, int *i) +#endif +#if defined(WIN) && !defined(WINIFL) +void _stdcall PROC_PROC(long int *f, int *i) +#endif +#ifdef WINIFL +void proc_proc(long int *f, int *i) +#endif +#if defined(AIX) || defined(WINPGI) +void proc_proc(long int *f, int *i) +#endif +#endif + +{ +static long int NaNQ; +static long int NaNQm; + +if(*i==-1) + { + NaNQ=*f; + NaNQm=0xffffffff; + return; + } +*i=0; +if(*f==NaNQ) + *i=1; +if(*f==NaNQm) + *i=1; +} + +#ifdef CRAY +void PROC_CONV(char *buf, int *i, int n) +#endif +#ifdef LINUX +void proc_conv__(char *buf, int *i, int n) +#endif +#ifdef SGI +void proc_conv_(char *buf, int *i, int n) +#endif +#if defined(AIX) || defined(WINPGI) +void proc_conv(char *buf, int *i, int n) +#endif +#ifdef WIN +void _stdcall PROC_CONV(char *buf, int *i, int n) +#endif +{ +int j; + +sscanf(buf,"%d",&j); +*i=j; +return; +} + +#ifdef CRAY +void PROC_CONV_R(char *buf, int *i, int n) +#endif +#ifdef LINUX +void proc_conv_r__(char *buf, int *i, int n) +#endif +#ifdef SGI +void proc_conv_r_(char *buf, int *i, int n) +#endif +#if defined(AIX) || defined(WINPGI) +void proc_conv_r(char *buf, int *i, int n) +#endif +#ifdef WIN +void _stdcall PROC_CONV_R(char *buf, int *i, int n) +#endif + +{ + +/* sprintf(buf,"%d",*i); */ + +return; +} + + +#ifndef IMSL +#ifdef CRAY +void DSVRGP(int *n, double *tab1, double *tab2, int *itab) +#endif +#ifdef LINUX +void dsvrgp__(int *n, double *tab1, double *tab2, int *itab) +#endif +#ifdef SGI +void dsvrgp_(int *n, double *tab1, double *tab2, int *itab) +#endif +#if defined(AIX) || defined(WINPGI) +void dsvrgp(int *n, double *tab1, double *tab2, int *itab) +#endif +#ifdef WIN +void _stdcall DSVRGP(int *n, double *tab1, double *tab2, int *itab) +#endif +{ +double t; +int i,j,k; + +if(tab1 != tab2) + { + for(i=0; i<*n; i++) + tab2[i]=tab1[i]; + } +k=0; +while(k<*n-1) + { + j=k; + t=tab2[k]; + for(i=k+1; i<*n; i++) + if(t>tab2[i]) + { + j=i; + t=tab2[i]; + } + if(j!=k) + { + tab2[j]=tab2[k]; + tab2[k]=t; + i=itab[j]; + itab[j]=itab[k]; + itab[k]=i; + } + k++; + } +} +#endif diff --git a/source/unres/src_Eshel/randgens.f b/source/unres/src_Eshel/randgens.f new file mode 100644 index 0000000..0daeb35 --- /dev/null +++ b/source/unres/src_Eshel/randgens.f @@ -0,0 +1,99 @@ +C $Date: 1994/10/04 16:19:52 $ +C $Revision: 2.1 $ +C +C +C See help for RANDOMV on the PSFSHARE disk to understand these +C subroutines. This is the VS Fortran version of this code. +C +C + SUBROUTINE VRND(VEC,N) + INTEGER A(250) + COMMON /VRANDD/ A, I, I147 + INTEGER LOOP,I,I147,VEC(N) + DO 23000 LOOP=1,N + I=I+1 + IF(.NOT.(I.GE.251))GOTO 23002 + I=1 +23002 CONTINUE + I147=I147+1 + IF(.NOT.(I147.GE.251))GOTO 23004 + I147=1 +23004 CONTINUE + A(I)=IEOR(A(I147),A(I)) + VEC(LOOP)=A(I) +23000 CONTINUE + RETURN + END +C +C + DOUBLE PRECISION FUNCTION RNDV(IDUM) + DOUBLE PRECISION RM1,RM2,R(99) + INTEGER IA1,IC1,M1, IA2,IC2,M2, IA3,IC3,M3, IDUM + SAVE + DATA IA1,IC1,M1/1279,351762,1664557/ + DATA IA2,IC2,M2/2011,221592,1048583/ + DATA IA3,IC3,M3/15551,6150,29101/ + IF(.NOT.(IDUM.LT.0))GOTO 23006 + IX1 = MOD(-IDUM,M1) + IX1 = MOD(IA1*IX1+IC1,M1) + IX2 = MOD(IX1,M2) + IX1 = MOD(IA1*IX1+IC1,M1) + IX3 = MOD(IX1,M3) + RM1 = 1./DBLE(M1) + RM2 = 1./DBLE(M2) + DO 23008 J = 1,99 + IX1 = MOD(IA1*IX1+IC1,M1) + IX2 = MOD(IA2*IX2+IC2,M2) + R(J) = (DBLE(IX1)+DBLE(IX2)*RM2)*RM1 +23008 CONTINUE +23006 CONTINUE + IX1 = MOD(IA1*IX1+IC1,M1) + IX2 = MOD(IA2*IX2+IC2,M2) + IX3 = MOD(IA3*IX3+IC3,M3) + J = 1+(99*IX3)/M3 + RNDV = R(J) + R(J) = (DBLE(IX1)+DBLE(IX2)*RM2)*RM1 + IDUM = IX1 + RETURN + END +C +C + SUBROUTINE VRNDST(SEED) + INTEGER A(250),LOOP,IDUM,SEED + DOUBLE PRECISION RNDV + COMMON /VRANDD/ A, I, I147 + I=0 + I147=103 + IDUM=SEED + DO 23010 LOOP=1,250 + A(LOOP)=INT(RNDV(IDUM)*2147483647) +23010 CONTINUE + RETURN + END +C +C + SUBROUTINE VRNDIN(IODEV) + INTEGER IODEV, A(250) + COMMON/VRANDD/ A, I, I147 + READ(IODEV) A, I, I147 + RETURN + END +C +C + SUBROUTINE VRNDOU(IODEV) +C This corresponds to VRNDOUT in the APFTN64 version + INTEGER IODEV, A(250) + COMMON/VRANDD/ A, I, I147 + WRITE(IODEV) A, I, I147 + RETURN + END + FUNCTION RNUNF(N) + INTEGER IRAN1(2000) + DATA FCTOR /2147483647.0D0/ +C We get only one random number, here! DR 9/1/92 + CALL VRND(IRAN1,1) + RNUNF= DBLE( IRAN1(1) ) / FCTOR +C****************************** +C write(6,*) 'rnunf in rnunf = ',rnunf + RETURN + END diff --git a/source/unres/src_Eshel/readpdb.F b/source/unres/src_Eshel/readpdb.F new file mode 100644 index 0000000..5d6acc0 --- /dev/null +++ b/source/unres/src_Eshel/readpdb.F @@ -0,0 +1,441 @@ + subroutine readpdb +C Read the PDB file and convert the peptide geometry into virtual-chain +C geometry. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.NAMES' + include 'COMMON.CONTROL' + include 'COMMON.DISTFIT' + include 'COMMON.SETUP' + character*3 seq,atom,res + character*80 card + dimension sccor(3,20) + double precision e1(3),e2(3),e3(3) + logical fail + integer rescode + ibeg=1 + lsecondary=.false. + nhfrag=0 + nbfrag=0 + do i=1,maxres + itype(i)=21 + do j=1,3 + c(j,i)=0.0d0 + c(j,i+nres)=0.0d0 + enddo + enddo + do i=1,10000 + read (ipdbin,'(a80)',end=10) card + if (card(:5).eq.'HELIX') then + nhfrag=nhfrag+1 + lsecondary=.true. + read(card(22:25),*) hfrag(1,nhfrag) + read(card(34:37),*) hfrag(2,nhfrag) + endif + if (card(:5).eq.'SHEET') then + nbfrag=nbfrag+1 + lsecondary=.true. + read(card(24:26),*) bfrag(1,nbfrag) + read(card(35:37),*) bfrag(2,nbfrag) +crc---------------------------------------- +crc to be corrected !!! + bfrag(3,nbfrag)=bfrag(1,nbfrag) + bfrag(4,nbfrag)=bfrag(2,nbfrag) +crc---------------------------------------- + endif + if (card(:3).eq.'END' .or. card(:3).eq.'TER') goto 10 +C Fish out the ATOM cards. + if (index(card(1:4),'ATOM').gt.0) then + read (card(14:16),'(a3)') atom + if (atom.eq.'CA' .or. atom.eq.'CH3') then +C Calculate the CM of the preceding residue. + if (ibeg.eq.0) then + if (unres_pdb) then + do j=1,3 + dc(j,ires+nres)=sccor(j,iii) + enddo + else + call sccenter(ires,iii,sccor) + endif + endif +C Start new residue. + read (card(24:26),*) ires + read (card(18:20),'(a3)') res + if (ibeg.eq.1) then + ishift=ires-1 + if (res.ne.'GLY' .and. res.ne. 'ACE') then + ishift=ishift-1 + itype(1)=21 + endif + ibeg=0 + endif + ires=ires-ishift + if (res.eq.'ACE') then + ity=10 + else + itype(ires)=rescode(ires,res,0) + endif + read(card(31:54),'(3f8.3)') (c(j,ires),j=1,3) +c if(me.eq.king.or..not.out1file) +c & write (iout,'(2i3,2x,a,3f8.3)') +c & ires,itype(ires),res,(c(j,ires),j=1,3) + iii=1 + do j=1,3 + sccor(j,iii)=c(j,ires) + enddo + else if (atom.ne.'O '.and.atom(1:1).ne.'H' .and. + & atom.ne.'N ' .and. atom.ne.'C ') then + iii=iii+1 + read(card(31:54),'(3f8.3)') (sccor(j,iii),j=1,3) + endif + endif + enddo + 10 if(me.eq.king.or..not.out1file) + & write (iout,'(a,i5)') ' Nres: ',ires +C Calculate the CM of the last side chain. + if (unres_pdb) then + do j=1,3 + dc(j,ires+nres)=sccor(j,iii) + enddo + else if (.not.catrace) then + call sccenter(ires,iii,sccor) + endif + nres=ires + nsup=nres + nstart_sup=1 + if (itype(nres).ne.10) then + nres=nres+1 + itype(nres)=21 + if (unres_pdb) then +C 2/15/2013 by Adam: corrected insertion of the last dummy residue + call refsys(nres-3,nres-2,nres-1,e1,e2,e3,fail) + if (fail) then + e2(1)=0.0d0 + e2(2)=1.0d0 + e2(3)=0.0d0 + endif + do j=1,3 + c(j,nres)=c(j,nres-1)-3.8d0*e2(j) + enddo + else if (.not.catrace) then + do j=1,3 + dcj=c(j,nres-2)-c(j,nres-3) + c(j,nres)=c(j,nres-1)+dcj + c(j,2*nres)=c(j,nres) + enddo + endif + endif + do i=2,nres-1 + do j=1,3 + c(j,i+nres)=dc(j,i) + enddo + enddo + do j=1,3 + c(j,nres+1)=c(j,1) + c(j,2*nres)=c(j,nres) + enddo + if (itype(1).eq.21) then + nsup=nsup-1 + nstart_sup=2 + if (unres_pdb) then +C 2/15/2013 by Adam: corrected insertion of the first dummy residue + call refsys(2,3,4,e1,e2,e3,fail) + if (fail) then + e2(1)=0.0d0 + e2(2)=1.0d0 + e2(3)=0.0d0 + endif + do j=1,3 + c(j,1)=c(j,2)-3.8d0*e2(j) + enddo + else if (.not.catrace) then + do j=1,3 + dcj=c(j,4)-c(j,3) + c(j,1)=c(j,2)-dcj + c(j,nres+1)=c(j,1) + enddo + endif + endif +C Calculate internal coordinates. + if(me.eq.king.or..not.out1file)then + write (iout,'(a)') + & "Backbone and SC coordinates as read from the PDB" + do ires=1,nres + write (iout,'(2i3,2x,a,3f8.3,5x,3f8.3)') + & ires,itype(ires),restyp(itype(ires)),(c(j,ires),j=1,3), + & (c(j,nres+ires),j=1,3) + enddo + endif + call int_from_cart(.not.catrace,.false.) + if (.not.catrace) call sc_loc_geom(.false.) + do i=1,nres + thetaref(i)=theta(i) + phiref(i)=phi(i) + enddo + do i=1,nres-1 + do j=1,3 + dc(j,i)=c(j,i+1)-c(j,i) + dc_norm(j,i)=dc(j,i)*vbld_inv(i+1) + enddo + enddo + do i=2,nres-1 + do j=1,3 + dc(j,i+nres)=c(j,i+nres)-c(j,i) + dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres) + enddo +c write (iout,*) i,(dc(j,i+nres),j=1,3),(dc_norm(j,i+nres),j=1,3), +c & vbld_inv(i+nres) + enddo +c call chainbuild +C Copy the coordinates to reference coordinates + do i=1,2*nres + do j=1,3 + cref(j,i)=c(j,i) + enddo + enddo + + + do j=1,nbfrag + do i=1,4 + bfrag(i,j)=bfrag(i,j)-ishift + enddo + enddo + + do j=1,nhfrag + do i=1,2 + hfrag(i,j)=hfrag(i,j)-ishift + enddo + enddo + + return + end +c--------------------------------------------------------------------------- + subroutine int_from_cart(lside,lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.NAMES' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + character*3 seq,atom,res + character*80 card + dimension sccor(3,20) + integer rescode + logical lside,lprn + if(me.eq.king.or..not.out1file)then + if (lprn) then + write (iout,'(/a)') + & 'Internal coordinates calculated from crystal structure.' + if (lside) then + write (iout,'(8a)') ' Res ',' dvb',' Theta', + & ' Gamma',' Dsc_id',' Dsc',' Alpha', + & ' Beta ' + else + write (iout,'(4a)') ' Res ',' dvb',' Theta', + & ' Gamma' + endif + endif + endif + do i=1,nres-1 + if (itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1) cycle + iti=itype(i) + if (dist(i,i+1).lt.2.0D0 .or. dist(i,i+1).gt.5.0D0) then + write (iout,'(a,i4)') 'Bad Cartesians for residue',i +ctest stop + endif + vbld(i+1)=dist(i,i+1) + vbld_inv(i+1)=1.0d0/vbld(i+1) + if (i.gt.1) theta(i+1)=alpha(i-1,i,i+1) + if (i.gt.2) phi(i+1)=beta(i-2,i-1,i,i+1) + enddo +c if (unres_pdb) then +c if (itype(1).eq.21) then +c theta(3)=90.0d0*deg2rad +c phi(4)=180.0d0*deg2rad +c vbld(2)=3.8d0 +c vbld_inv(2)=1.0d0/vbld(2) +c endif +c if (itype(nres).eq.21) then +c theta(nres)=90.0d0*deg2rad +c phi(nres)=180.0d0*deg2rad +c vbld(nres)=3.8d0 +c vbld_inv(nres)=1.0d0/vbld(2) +c endif +c endif + if (lside) then + do i=2,nres-1 + if (itype(i).eq.ntyp1) cycle + do j=1,3 + c(j,maxres2)=0.5D0*(2*c(j,i)+(c(j,i-1)-c(j,i))*vbld_inv(i) + & +(c(j,i+1)-c(j,i))*vbld_inv(i+1)) + enddo + iti=itype(i) + di=dist(i,nres+i) +C 10/03/12 Adam: Correction for zero SC-SC bond length + if (itype(i).ne.10 .and. itype(i).ne.ntyp1. and. di.eq.0.0d0) + & di=dsc(itype(i)) + vbld(i+nres)=di + if (itype(i).ne.10) then + vbld_inv(i+nres)=1.0d0/di + else + vbld_inv(i+nres)=0.0d0 + endif + if (iti.ne.10) then + alph(i)=alpha(nres+i,i,maxres2) + omeg(i)=beta(nres+i,i,maxres2,i+1) + endif + if(me.eq.king.or..not.out1file)then + if (lprn) + & write (iout,'(a3,i4,7f10.3)') restyp(iti),i,vbld(i), + & rad2deg*theta(i),rad2deg*phi(i),dsc(iti),vbld(nres+i), + & rad2deg*alph(i),rad2deg*omeg(i) + endif + enddo + else if (lprn) then + do i=2,nres + iti=itype(i) + if(me.eq.king.or..not.out1file) + & write (iout,'(a3,i4,7f10.3)') restyp(iti),i,dist(i,i-1), + & rad2deg*theta(i),rad2deg*phi(i) + enddo + endif + return + end +c------------------------------------------------------------------------------- + subroutine sc_loc_geom(lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.NAMES' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + double precision x_prime(3),y_prime(3),z_prime(3) + logical lprn + do i=1,nres-1 + do j=1,3 + dc_norm(j,i)=vbld_inv(i+1)*(c(j,i+1)-c(j,i)) + enddo + enddo + do i=2,nres-1 + if (itype(i).ne.10) then + do j=1,3 + dc_norm(j,i+nres)=vbld_inv(i+nres)*(c(j,i+nres)-c(j,i)) + enddo + else + do j=1,3 + dc_norm(j,i+nres)=0.0d0 + enddo + endif + enddo + do i=2,nres-1 + costtab(i+1) =dcos(theta(i+1)) + sinttab(i+1) =dsqrt(1-costtab(i+1)*costtab(i+1)) + cost2tab(i+1)=dsqrt(0.5d0*(1.0d0+costtab(i+1))) + sint2tab(i+1)=dsqrt(0.5d0*(1.0d0-costtab(i+1))) + cosfac2=0.5d0/(1.0d0+costtab(i+1)) + cosfac=dsqrt(cosfac2) + sinfac2=0.5d0/(1.0d0-costtab(i+1)) + sinfac=dsqrt(sinfac2) + it=itype(i) + if (it.ne.10) then +c +C Compute the axes of tghe local cartesian coordinates system; store in +c x_prime, y_prime and z_prime +c + do j=1,3 + x_prime(j) = 0.00 + y_prime(j) = 0.00 + z_prime(j) = 0.00 + enddo + do j = 1,3 + x_prime(j) = (dc_norm(j,i) - dc_norm(j,i-1))*cosfac + y_prime(j) = (dc_norm(j,i) + dc_norm(j,i-1))*sinfac + enddo + call vecpr(x_prime,y_prime,z_prime) +c +C Transform the unit vector of the ith side-chain centroid, dC_norm(*,i), +C to local coordinate system. Store in xx, yy, zz. +c + xx=0.0d0 + yy=0.0d0 + zz=0.0d0 + do j = 1,3 + xx = xx + x_prime(j)*dc_norm(j,i+nres) + yy = yy + y_prime(j)*dc_norm(j,i+nres) + zz = zz + z_prime(j)*dc_norm(j,i+nres) + enddo + + xxref(i)=xx + yyref(i)=yy + zzref(i)=zz + else + xxref(i)=0.0d0 + yyref(i)=0.0d0 + zzref(i)=0.0d0 + endif + enddo + if (lprn) then + do i=2,nres + iti=itype(i) + if(me.eq.king.or..not.out1file) + & write (iout,'(a3,i4,3f10.5)') restyp(iti),i,xxref(i), + & yyref(i),zzref(i) + enddo + endif + return + end +c--------------------------------------------------------------------------- + subroutine sccenter(ires,nscat,sccor) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + dimension sccor(3,20) + do j=1,3 + sccmj=0.0D0 + do i=1,nscat + sccmj=sccmj+sccor(j,i) + enddo + dc(j,ires)=sccmj/nscat + enddo + return + end +c--------------------------------------------------------------------------- + subroutine bond_regular + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CALC' + include 'COMMON.INTERACT' + include 'COMMON.CHAIN' + do i=1,nres-1 + vbld(i+1)=vbl + vbld_inv(i+1)=1.0d0/vbld(i+1) + vbld(i+1+nres)=dsc(itype(i+1)) + vbld_inv(i+1+nres)=dsc_inv(itype(i+1)) +c print *,vbld(i+1),vbld(i+1+nres) + enddo + return + end diff --git a/source/unres/src_Eshel/readrtns.F b/source/unres/src_Eshel/readrtns.F new file mode 100644 index 0000000..d321d98 --- /dev/null +++ b/source/unres/src_Eshel/readrtns.F @@ -0,0 +1,1700 @@ + subroutine readrtns + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' + logical file_exist +C Read force-field parameters except weights + call parmread +C Read job setup parameters + call read_control +C Read control parameters for energy minimzation if required + if (minim) call read_minim +C Read molecule information, molecule geometry, energy-term weights, and +C restraints if requested + call molread +C Print restraint information +#ifdef MPI + if (.not. out1file .or. me.eq.king) then +#endif + if (nhpb.gt.nss) + &write (iout,'(a,i5,a)') "The following",nhpb-nss, + & " distance constraints have been imposed" + do i=nss+1,nhpb + write (iout,'(3i6,i2,3f10.5)') i-nss,ihpb(i),jhpb(i), + & ibecarb(i),dhpb(i),dhpb1(i),forcon(i) + enddo +#ifdef MPI + endif +#endif +c print *,"Processor",myrank," leaves READRTNS" + return + end +C------------------------------------------------------------------------------- + subroutine read_control +C +C Read contorl data +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MP + include 'mpif.h' + logical OKRandom, prng_restart + real*8 r1 +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.THREAD' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.MCM' + include 'COMMON.MAP' + include 'COMMON.HEADER' +csa include 'COMMON.CSA' + include 'COMMON.CHAIN' + include 'COMMON.MUCA' + include 'COMMON.MD' + include 'COMMON.FFIELD' + include 'COMMON.SETUP' + COMMON /MACHSW/ KDIAG,ICORFL,IXDR + character*8 diagmeth(0:3) /'Library','EVVRSP','Givens','Jacobi'/ + character*80 ucase + character*320 controlcard + + nglob_csa=0 + eglob_csa=1d99 + nmin_csa=0 + read (INP,'(a)') titel + call card_concat(controlcard) +c out1file=index(controlcard,'OUT1FILE').gt.0 .or. fg_rank.gt.0 +c print *,"Processor",me," fg_rank",fg_rank," out1file",out1file + call reada(controlcard,'SEED',seed,0.0D0) + call random_init(seed) +C Set up the time limit (caution! The time must be input in minutes!) + read_cart=index(controlcard,'READ_CART').gt.0 + catrace=index(controlcard,'CATRACE').gt.0 + call readi(controlcard,'CONSTR_DIST',constr_dist,0) + call reada(controlcard,'TIMLIM',timlim,960.0D0) ! default 16 hours + unres_pdb = index(controlcard,'UNRES_PDB') .gt. 0 + call reada(controlcard,'SAFETY',safety,30.0D0) ! default 30 minutes + call reada(controlcard,'RMSDBC',rmsdbc,3.0D0) + call reada(controlcard,'RMSDBC1',rmsdbc1,0.5D0) + call reada(controlcard,'RMSDBC1MAX',rmsdbc1max,1.5D0) + call reada(controlcard,'RMSDBCM',rmsdbcm,3.0D0) + call reada(controlcard,'DRMS',drms,0.1D0) + if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) then + write (iout,'(a,f10.1)')'RMSDBC = ',rmsdbc + write (iout,'(a,f10.1)')'RMSDBC1 = ',rmsdbc1 + write (iout,'(a,f10.1)')'RMSDBC1MAX = ',rmsdbc1max + write (iout,'(a,f10.1)')'DRMS = ',drms + write (iout,'(a,f10.1)')'RMSDBCM = ',rmsdbcm + write (iout,'(a,f10.1)') 'Time limit (min):',timlim + endif + call readi(controlcard,'NZ_START',nz_start,0) + call readi(controlcard,'NZ_END',nz_end,0) + call readi(controlcard,'IZ_SC',iz_sc,0) + timlim=60.0D0*timlim + safety = 60.0d0*safety + timem=timlim + modecalc=0 + call reada(controlcard,"T_BATH",t_bath,300.0d0) + minim=(index(controlcard,'MINIMIZE').gt.0) + dccart=(index(controlcard,'CART').gt.0) + overlapsc=(index(controlcard,'OVERLAP').gt.0) + overlapsc=.not.overlapsc + searchsc=(index(controlcard,'SEARCHSC').gt.0) + sideadd=(index(controlcard,'SIDEADD').gt.0) .or. catrace + energy_dec=(index(controlcard,'ENERGY_DEC').gt.0) + outpdb=(index(controlcard,'PDBOUT').gt.0) + outmol2=(index(controlcard,'MOL2OUT').gt.0) + pdbref=(index(controlcard,'PDBREF').gt.0) + refstr=pdbref .or. (index(controlcard,'REFSTR').gt.0) + indpdb=index(controlcard,'PDBSTART') + extconf=(index(controlcard,'EXTCONF').gt.0) + call readi(controlcard,'IPRINT',iprint,0) + call readi(controlcard,'MAXGEN',maxgen,10000) + call readi(controlcard,'MAXOVERLAP',maxoverlap,1000) + call readi(controlcard,"RESCALE_MODE",rescale_mode,2) + if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) + & write (iout,*) "RESCALE_MODE",rescale_mode + if (index(controlcard,'REGULAR').gt.0.0D0) then + call reada(controlcard,'WEIDIS',weidis,0.1D0) + modecalc=1 + refstr=.true. + regular=.true. + endif + if (index(controlcard,'CHECKGRAD').gt.0) then + modecalc=5 + if (index(controlcard,'CART').gt.0) then + icheckgrad=1 + elseif (index(controlcard,'CARINT').gt.0) then + icheckgrad=2 + else + icheckgrad=3 + endif + elseif (index(controlcard,'THREAD').gt.0) then + modecalc=2 + call readi(controlcard,'THREAD',nthread,0) + if (nthread.gt.0) then + call reada(controlcard,'WEIDIS',weidis,0.1D0) + else + if (fg_rank.eq.0) + & write (iout,'(a)')'A number has to follow the THREAD keyword.' + stop 'Error termination in Read_Control.' + endif + else if (index(controlcard,'MCMA').gt.0) then + modecalc=3 + else if (index(controlcard,'MCEE').gt.0) then + modecalc=6 + else if (index(controlcard,'MULTCONF').gt.0) then + modecalc=4 + else if (index(controlcard,'MAP').gt.0) then + modecalc=7 + call readi(controlcard,'MAP',nmap,0) + else if (index(controlcard,'CSA').gt.0) then + write(*,*) "CSA not supported in this version" + stop + else if (index(controlcard,'SOFTREG').gt.0) then + modecalc=11 + else if (index(controlcard,'CHECK_BOND').gt.0) then + modecalc=-1 + else if (index(controlcard,'TEST').gt.0) then + modecalc=-2 + endif + + lmuca=index(controlcard,'MUCA').gt.0 + call readi(controlcard,'MUCADYN',mucadyn,0) + call readi(controlcard,'MUCASMOOTH',muca_smooth,0) + if (lmuca .and. (me.eq.king .or. .not.out1file )) + & then + write (iout,*) 'MUCADYN=',mucadyn + write (iout,*) 'MUCASMOOTH=',muca_smooth + endif + + iscode=index(controlcard,'ONE_LETTER') + indphi=index(controlcard,'PHI') + indback=index(controlcard,'BACK') + iranconf=index(controlcard,'RAND_CONF') + i2ndstr=index(controlcard,'USE_SEC_PRED') + gradout=index(controlcard,'GRADOUT').gt.0 + gnorm_check=index(controlcard,'GNORM_CHECK').gt.0 + + if(me.eq.king.or..not.out1file) + & write (iout,'(2a)') diagmeth(kdiag), + & ' routine used to diagonalize matrices.' + return + end +c-------------------------------------------------------------------------- + subroutine molread +C +C Read molecular data. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer error_msg +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.CONTACTS' + include 'COMMON.TORCNSTR' + include 'COMMON.TIME1' + include 'COMMON.BOUNDS' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + character*4 sequence(maxres) + integer rescode + double precision x(maxvar) + character*320 weightcard + character*80 weightcard_t,ucase + dimension itype_pdb(maxres) + common /pizda/ itype_pdb + logical seq_comp,fail + double precision energia(0:n_ene) + integer ilen + external ilen +C +C Body +C +C Read weights of the subsequent energy terms. + if(hremd.gt.0) then + + k=0 + do il=1,hremd + do i=1,nrep + do j=1,remd_m(i) + i2set(k)=il + k=k+1 + enddo + enddo + enddo + + if(me.eq.king.or..not.out1file) then + write (iout,*) 'Reading ',hremd,' sets of weights for HREMD' + write (iout,*) 'Current weights for processor ', + & me,' set ',i2set(me) + endif + + do i=1,hremd + call card_concat(weightcard) + call reada(weightcard,'WLONG',wlong,1.0D0) + call reada(weightcard,'WSC',wsc,wlong) + call reada(weightcard,'WSCP',wscp,wlong) + call reada(weightcard,'WELEC',welec,1.0D0) + call reada(weightcard,'WVDWPP',wvdwpp,welec) + call reada(weightcard,'WEL_LOC',wel_loc,1.0D0) + call reada(weightcard,'WCORR4',wcorr4,0.0D0) + call reada(weightcard,'WCORR5',wcorr5,0.0D0) + call reada(weightcard,'WCORR6',wcorr6,0.0D0) + call reada(weightcard,'WTURN3',wturn3,1.0D0) + call reada(weightcard,'WTURN4',wturn4,1.0D0) + call reada(weightcard,'WTURN6',wturn6,1.0D0) + call reada(weightcard,'WSCCOR',wsccor,1.0D0) + call reada(weightcard,'WSTRAIN',wstrain,1.0D0) + call reada(weightcard,'WBOND',wbond,1.0D0) + call reada(weightcard,'WTOR',wtor,1.0D0) + call reada(weightcard,'WTORD',wtor_d,1.0D0) + call reada(weightcard,'WANG',wang,1.0D0) + call reada(weightcard,'WSCLOC',wscloc,1.0D0) + call reada(weightcard,'SCAL14',scal14,0.4D0) + call reada(weightcard,'SCALSCP',scalscp,1.0d0) + call reada(weightcard,'CUTOFF',cutoff_corr,7.0d0) + call reada(weightcard,'DELT_CORR',delt_corr,0.5d0) + call reada(weightcard,'TEMP0',temp0,300.0d0) + if (index(weightcard,'SOFT').gt.0) ipot=6 +C 12/1/95 Added weight for the multi-body term WCORR + call reada(weightcard,'WCORRH',wcorr,1.0D0) + if (wcorr4.gt.0.0d0) wcorr=wcorr4 + + hweights(i,1)=wsc + hweights(i,2)=wscp + hweights(i,3)=welec + hweights(i,4)=wcorr + hweights(i,5)=wcorr5 + hweights(i,6)=wcorr6 + hweights(i,7)=wel_loc + hweights(i,8)=wturn3 + hweights(i,9)=wturn4 + hweights(i,10)=wturn6 + hweights(i,11)=wang + hweights(i,12)=wscloc + hweights(i,13)=wtor + hweights(i,14)=wtor_d + hweights(i,15)=wstrain + hweights(i,16)=wvdwpp + hweights(i,17)=wbond + hweights(i,18)=scal14 + hweights(i,21)=wsccor + + enddo + + do i=1,n_ene + weights(i)=hweights(i2set(me),i) + enddo + wsc =weights(1) + wscp =weights(2) + welec =weights(3) + wcorr =weights(4) + wcorr5 =weights(5) + wcorr6 =weights(6) + wel_loc=weights(7) + wturn3 =weights(8) + wturn4 =weights(9) + wturn6 =weights(10) + wang =weights(11) + wscloc =weights(12) + wtor =weights(13) + wtor_d =weights(14) + wstrain=weights(15) + wvdwpp =weights(16) + wbond =weights(17) + scal14 =weights(18) + wsccor =weights(21) + + + else + call card_concat(weightcard) + call reada(weightcard,'WLONG',wlong,1.0D0) + call reada(weightcard,'WSC',wsc,wlong) + call reada(weightcard,'WSCP',wscp,wlong) + call reada(weightcard,'WELEC',welec,1.0D0) + call reada(weightcard,'WVDWPP',wvdwpp,welec) + call reada(weightcard,'WEL_LOC',wel_loc,1.0D0) + call reada(weightcard,'WCORR4',wcorr4,0.0D0) + call reada(weightcard,'WCORR5',wcorr5,0.0D0) + call reada(weightcard,'WCORR6',wcorr6,0.0D0) + call reada(weightcard,'WTURN3',wturn3,1.0D0) + call reada(weightcard,'WTURN4',wturn4,1.0D0) + call reada(weightcard,'WTURN6',wturn6,1.0D0) + call reada(weightcard,'WSCCOR',wsccor,1.0D0) + call reada(weightcard,'WSTRAIN',wstrain,1.0D0) + call reada(weightcard,'WBOND',wbond,1.0D0) + call reada(weightcard,'WTOR',wtor,1.0D0) + call reada(weightcard,'WTORD',wtor_d,1.0D0) + call reada(weightcard,'WANG',wang,1.0D0) + call reada(weightcard,'WSCLOC',wscloc,1.0D0) + call reada(weightcard,'SCAL14',scal14,0.4D0) + call reada(weightcard,'SCALSCP',scalscp,1.0d0) + call reada(weightcard,'CUTOFF',cutoff_corr,7.0d0) + call reada(weightcard,'DELT_CORR',delt_corr,0.5d0) + call reada(weightcard,'TEMP0',temp0,300.0d0) + if (index(weightcard,'SOFT').gt.0) ipot=6 +C 12/1/95 Added weight for the multi-body term WCORR + call reada(weightcard,'WCORRH',wcorr,1.0D0) + if (wcorr4.gt.0.0d0) wcorr=wcorr4 + weights(1)=wsc + weights(2)=wscp + weights(3)=welec + weights(4)=wcorr + weights(5)=wcorr5 + weights(6)=wcorr6 + weights(7)=wel_loc + weights(8)=wturn3 + weights(9)=wturn4 + weights(10)=wturn6 + weights(11)=wang + weights(12)=wscloc + weights(13)=wtor + weights(14)=wtor_d + weights(15)=wstrain + weights(16)=wvdwpp + weights(17)=wbond + weights(18)=scal14 + weights(21)=wsccor + endif + + if(me.eq.king.or..not.out1file) + & write (iout,10) wsc,wscp,welec,wvdwpp,wbond,wang,wscloc,wtor, + & wtor_d,wstrain,wel_loc,wcorr,wcorr5,wcorr6,wsccor,wturn3, + & wturn4,wturn6 + 10 format (/'Energy-term weights (unscaled):'// + & 'WSCC= ',f10.6,' (SC-SC)'/ + & 'WSCP= ',f10.6,' (SC-p)'/ + & 'WELEC= ',f10.6,' (p-p electr)'/ + & 'WVDWPP= ',f10.6,' (p-p VDW)'/ + & 'WBOND= ',f10.6,' (stretching)'/ + & 'WANG= ',f10.6,' (bending)'/ + & 'WSCLOC= ',f10.6,' (SC local)'/ + & 'WTOR= ',f10.6,' (torsional)'/ + & 'WTORD= ',f10.6,' (double torsional)'/ + & 'WSTRAIN=',f10.6,' (SS bridges & dist. cnstr.)'/ + & 'WEL_LOC=',f10.6,' (multi-body 3-rd order)'/ + & 'WCORR4= ',f10.6,' (multi-body 4th order)'/ + & 'WCORR5= ',f10.6,' (multi-body 5th order)'/ + & 'WCORR6= ',f10.6,' (multi-body 6th order)'/ + & 'WSCCOR= ',f10.6,' (back-scloc correlation)'/ + & 'WTURN3= ',f10.6,' (turns, 3rd order)'/ + & 'WTURN4= ',f10.6,' (turns, 4th order)'/ + & 'WTURN6= ',f10.6,' (turns, 6th order)') + if(me.eq.king.or..not.out1file)then + if (wcorr4.gt.0.0d0) then + write (iout,'(/2a/)') 'Local-electrostatic type correlation ', + & 'between contact pairs of peptide groups' + write (iout,'(2(a,f5.3/))') + & 'Cutoff on 4-6th order correlation terms: ',cutoff_corr, + & 'Range of quenching the correlation terms:',2*delt_corr + else if (wcorr.gt.0.0d0) then + write (iout,'(/2a/)') 'Hydrogen-bonding correlation ', + & 'between contact pairs of peptide groups' + endif + write (iout,'(a,f8.3)') + & 'Scaling factor of 1,4 SC-p interactions:',scal14 + write (iout,'(a,f8.3)') + & 'General scaling factor of SC-p interactions:',scalscp + endif + r0_corr=cutoff_corr-delt_corr + do i=1,20 + aad(i,1)=scalscp*aad(i,1) + aad(i,2)=scalscp*aad(i,2) + bad(i,1)=scalscp*bad(i,1) + bad(i,2)=scalscp*bad(i,2) + enddo + call rescale_weights(t_bath) + if(me.eq.king.or..not.out1file) + & write (iout,22) wsc,wscp,welec,wvdwpp,wbond,wang,wscloc,wtor, + & wtor_d,wstrain,wel_loc,wcorr,wcorr5,wcorr6,wsccor,wturn3, + & wturn4,wturn6 + 22 format (/'Energy-term weights (scaled):'// + & 'WSCC= ',f10.6,' (SC-SC)'/ + & 'WSCP= ',f10.6,' (SC-p)'/ + & 'WELEC= ',f10.6,' (p-p electr)'/ + & 'WVDWPP= ',f10.6,' (p-p VDW)'/ + & 'WBOND= ',f10.6,' (stretching)'/ + & 'WANG= ',f10.6,' (bending)'/ + & 'WSCLOC= ',f10.6,' (SC local)'/ + & 'WTOR= ',f10.6,' (torsional)'/ + & 'WTORD= ',f10.6,' (double torsional)'/ + & 'WSTRAIN=',f10.6,' (SS bridges & dist. cnstr.)'/ + & 'WEL_LOC=',f10.6,' (multi-body 3-rd order)'/ + & 'WCORR4= ',f10.6,' (multi-body 4th order)'/ + & 'WCORR5= ',f10.6,' (multi-body 5th order)'/ + & 'WCORR6= ',f10.6,' (multi-body 6th order)'/ + & 'WSCCOR= ',f10.6,' (back-scloc correlatkion)'/ + & 'WTURN3= ',f10.6,' (turns, 3rd order)'/ + & 'WTURN4= ',f10.6,' (turns, 4th order)'/ + & 'WTURN6= ',f10.6,' (turns, 6th order)') + if(me.eq.king.or..not.out1file) + & write (iout,*) "Reference temperature for weights calculation:", + & temp0 + call reada(weightcard,"D0CM",d0cm,3.78d0) + call reada(weightcard,"AKCM",akcm,15.1d0) + call reada(weightcard,"AKTH",akth,11.0d0) + call reada(weightcard,"AKCT",akct,12.0d0) + call reada(weightcard,"V1SS",v1ss,-1.08d0) + call reada(weightcard,"V2SS",v2ss,7.61d0) + call reada(weightcard,"V3SS",v3ss,13.7d0) + call reada(weightcard,"EBR",ebr,-5.50D0) + if(me.eq.king.or..not.out1file) then + write (iout,*) "Parameters of the SS-bond potential:" + write (iout,*) "D0CM",d0cm," AKCM",akcm," AKTH",akth, + & " AKCT",akct + write (iout,*) "V1SS",v1ss," V2SS",v2ss," V3SS",v3ss + write (iout,*) "EBR",ebr + print *,'indpdb=',indpdb,' pdbref=',pdbref + endif + if (indpdb.gt.0 .or. pdbref) then + read(inp,'(a)') pdbname(1) + call pdbinput(1) + call contact(.false.,ncont_ref,icont_ref,co) + endif + if (indpdb.eq.0) then +C Read sequence if not taken from the pdb file. + read (inp,*) nres +c print *,'nres=',nres + if (iscode.gt.0) then + read (inp,'(80a1)') (sequence(i)(1:1),i=1,nres) + else + read (inp,'(20(1x,a3))') (sequence(i),i=1,nres) + endif +C Convert sequence to numeric code + do i=1,nres + itype(i)=rescode(i,sequence(i),iscode) + enddo +C Assign initial virtual bond lengths + do i=2,nres + vbld(i)=vbl + vbld_inv(i)=vblinv + enddo + do i=2,nres-1 + vbld(i+nres)=dsc(itype(i)) + vbld_inv(i+nres)=dsc_inv(itype(i)) +c write (iout,*) "i",i," itype",itype(i), +c & " dsc",dsc(itype(i))," vbld",vbld(i),vbld(i+nres) + enddo + endif +c print *,nres +c print '(20i4)',(itype(i),i=1,nres) + do i=1,nres +#ifdef PROCOR + if (itype(i).eq.21 .or. itype(i+1).eq.21) then +#else + if (itype(i).eq.21) then +#endif + itel(i)=0 +#ifdef PROCOR + else if (itype(i+1).ne.20) then +#else + else if (itype(i).ne.20) then +#endif + itel(i)=1 + else + itel(i)=2 + endif + enddo + if(me.eq.king.or..not.out1file)then + write (iout,*) "ITEL" + do i=1,nres-1 + write (iout,*) i,itype(i),itel(i) + enddo + print *,'Call Read_Bridge.' + endif + call read_bridge +C 8/13/98 Set limits to generating the dihedral angles + do i=1,nres + phibound(1,i)=-pi + phibound(2,i)=pi + enddo + read (inp,*) ndih_constr + if (ndih_constr.gt.0) then + read (inp,*) ftors + read (inp,*) (idih_constr(i),phi0(i),drange(i),i=1,ndih_constr) + if(me.eq.king.or..not.out1file)then + write (iout,*) + & 'There are',ndih_constr,' constraints on phi angles.' + do i=1,ndih_constr + write (iout,'(i5,2f8.3)') idih_constr(i),phi0(i),drange(i) + enddo + endif + do i=1,ndih_constr + phi0(i)=deg2rad*phi0(i) + drange(i)=deg2rad*drange(i) + enddo + if(me.eq.king.or..not.out1file) + & write (iout,*) 'FTORS',ftors + do i=1,ndih_constr + ii = idih_constr(i) + phibound(1,ii) = phi0(i)-drange(i) + phibound(2,ii) = phi0(i)+drange(i) + enddo + endif + nnt=1 +#ifdef MPI + if (me.eq.king) then +#endif + write (iout,'(a)') 'Boundaries in phi angle sampling:' + do i=1,nres + write (iout,'(a3,i5,2f10.1)') + & restyp(itype(i)),i,phibound(1,i)*rad2deg,phibound(2,i)*rad2deg + enddo +#ifdef MP + endif +#endif + nct=nres +cd print *,'NNT=',NNT,' NCT=',NCT + if (itype(1).eq.21) nnt=2 + if (itype(nres).eq.21) nct=nct-1 + if (pdbref) then + if(me.eq.king.or..not.out1file) + & write (iout,'(a,i3)') 'nsup=',nsup + nstart_seq=nnt + if (nsup.le.(nct-nnt+1)) then + do i=0,nct-nnt+1-nsup + if (seq_comp(itype(nnt+i),itype_pdb(nstart_sup),nsup)) then + nstart_seq=nnt+i + goto 111 + endif + enddo + write (iout,'(a)') + & 'Error - sequences to be superposed do not match.' + stop + else + do i=0,nsup-(nct-nnt+1) + if (seq_comp(itype(nnt),itype_pdb(nstart_sup+i),nct-nnt+1)) + & then + nstart_sup=nstart_sup+i + nsup=nct-nnt+1 + goto 111 + endif + enddo + write (iout,'(a)') + & 'Error - sequences to be superposed do not match.' + endif + 111 continue + if (nsup.eq.0) nsup=nct-nnt + if (nstart_sup.eq.0) nstart_sup=nnt + if (nstart_seq.eq.0) nstart_seq=nnt + if(me.eq.king.or..not.out1file) + & write (iout,*) 'nsup=',nsup,' nstart_sup=',nstart_sup, + & ' nstart_seq=',nstart_seq + endif +c--- Zscore rms ------- + if (nz_start.eq.0) nz_start=nnt + if (nz_end.eq.0 .and. nsup.gt.0) then + nz_end=nnt+nsup-1 + else if (nz_end.eq.0) then + nz_end=nct + endif + if(me.eq.king.or..not.out1file)then + write (iout,*) 'NZ_START=',nz_start,' NZ_END=',nz_end + write (iout,*) 'IZ_SC=',iz_sc + endif +c---------------------- + call init_int_table + if (refstr) then + if (.not.pdbref) then + call read_angles(inp,*38) + goto 39 + 38 write (iout,'(a)') 'Error reading reference structure.' +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,IERROR) + stop 'Error reading reference structure' +#endif + 39 call chainbuild + call setup_var +czscore call geom_to_var(nvar,coord_exp_zs(1,1)) + nstart_sup=nnt + nstart_seq=nnt + nsup=nct-nnt+1 + do i=1,2*nres + do j=1,3 + cref(j,i)=c(j,i) + enddo + enddo + call contact(.true.,ncont_ref,icont_ref,co) + endif + if(me.eq.king.or..not.out1file) + & write (iout,*) 'Contact order:',co + if (pdbref) then + if(me.eq.king.or..not.out1file) + & write (2,*) 'Shifting contacts:',nstart_seq,nstart_sup + do i=1,ncont_ref + do j=1,2 + icont_ref(j,i)=icont_ref(j,i)+nstart_seq-nstart_sup + enddo + if(me.eq.king.or..not.out1file) + & write (2,*) i,' ',restyp(itype(icont_ref(1,i))),' ', + & icont_ref(1,i),' ', + & restyp(itype(icont_ref(2,i))),' ',icont_ref(2,i) + enddo + endif + endif +c write (iout,*) "constr_dist",constr_dist,nstart_sup,nsup + if (constr_dist.gt.0) then + call read_dist_constr + endif + if (nhpb.gt.0) call hpb_partition +c write (iout,*) "After read_dist_constr nhpb",nhpb +c call flush(iout) + if (indpdb.eq.0 .and. modecalc.ne.2 .and. modecalc.ne.4 + & .and. modecalc.ne.8 .and. modecalc.ne.9 .and. + & modecalc.ne.10) then +C If input structure hasn't been supplied from the PDB file read or generate +C initial geometry. + if (iranconf.eq.0 .and. .not. extconf) then + if(me.eq.king.or..not.out1file .and.fg_rank.eq.0) + & write (iout,'(a)') 'Initial geometry will be read in.' + if (read_cart) then + read(inp,'(8f10.5)',end=36,err=36) + & ((c(l,k),l=1,3),k=1,nres), + & ((c(l,k+nres),l=1,3),k=nnt,nct) + call int_from_cart1(.false.) + do i=1,nres-1 + do j=1,3 + dc(j,i)=c(j,i+1)-c(j,i) + dc_norm(j,i)=dc_norm(j,i)*vbld_inv(i+1) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + dc(j,i+nres)=c(j,i+nres)-c(j,i) + dc_norm(j,i+nres)=dc_norm(j,i+nres)*vbld_inv(i+nres) + enddo + endif + enddo + return + else + call read_angles(inp,*36) + endif + goto 37 + 36 write (iout,'(a)') 'Error reading angle file.' +#ifdef MPI + call mpi_finalize( MPI_COMM_WORLD,IERR ) +#endif + stop 'Error reading angle file.' + 37 continue + else if (extconf) then + if(me.eq.king.or..not.out1file .and. fg_rank.eq.0) + & write (iout,'(a)') 'Extended chain initial geometry.' + do i=3,nres + theta(i)=90d0*deg2rad + enddo + do i=4,nres + phi(i)=180d0*deg2rad + enddo + do i=2,nres-1 + alph(i)=110d0*deg2rad + enddo + do i=2,nres-1 + omeg(i)=-120d0*deg2rad + enddo + else + if(me.eq.king.or..not.out1file) + & write (iout,'(a)') 'Random-generated initial geometry.' + + +#ifdef MPI + if (me.eq.king .or. fg_rank.eq.0 .and. ( + & modecalc.eq.12 .or. modecalc.eq.14) ) then +#endif + do itrial=1,100 + itmp=1 + call gen_rand_conf(itmp,*30) + goto 40 + 30 write (iout,*) 'Failed to generate random conformation', + & ', itrial=',itrial + write (*,*) 'Processor:',me, + & ' Failed to generate random conformation', + & ' itrial=',itrial + call intout + +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif + enddo + write (iout,'(a,i3,a)') 'Processor:',me, + & ' error in generating random conformation.' + write (*,'(a,i3,a)') 'Processor:',me, + & ' error in generating random conformation.' + call flush(iout) +#ifdef MPI + call MPI_Abort(mpi_comm_world,error_msg,ierrcode) + 40 continue + endif +#else + 40 continue +#endif + endif + elseif (modecalc.eq.4) then + read (inp,'(a)') intinname + open (intin,file=intinname,status='old',err=333) + if (me.eq.king .or. .not.out1file.and.fg_rank.eq.0) + & write (iout,'(a)') 'intinname',intinname + write (*,'(a)') 'Processor',myrank,' intinname',intinname + goto 334 + 333 write (iout,'(2a)') 'Error opening angle file ',intinname +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,IERR) +#endif + stop 'Error opening angle file.' + 334 continue + + endif +C Generate distance constraints, if the PDB structure is to be regularized. + if (nthread.gt.0) then + call read_threadbase + endif + call setup_var + if (me.eq.king .or. .not. out1file) + & call intout + if (ns.gt.0 .and. (me.eq.king .or. .not.out1file) ) then + write (iout,'(/a,i3,a)') + & 'The chain contains',ns,' disulfide-bridging cysteines.' + write (iout,'(20i4)') (iss(i),i=1,ns) + write (iout,'(/a/)') 'Pre-formed links are:' + do i=1,nss + i1=ihpb(i)-nres + i2=jhpb(i)-nres + it1=itype(i1) + it2=itype(i2) + if (me.eq.king.or..not.out1file) + & write (iout,'(2a,i3,3a,i3,a,3f10.3)') + & restyp(it1),'(',i1,') -- ',restyp(it2),'(',i2,')',dhpb(i), + & ebr,forcon(i) + enddo + write (iout,'(a)') + endif + if (i2ndstr.gt.0) call secstrp2dihc +c call geom_to_var(nvar,x) +c call etotal(energia(0)) +c call enerprint(energia(0)) +c call briefout(0,etot) +c stop +cd write (iout,'(2(a,i3))') 'NNT',NNT,' NCT',NCT +cd write (iout,'(a)') 'Variable list:' +cd write (iout,'(i4,f10.5)') (i,rad2deg*x(i),i=1,nvar) + if (indpdb.gt.0) then + do i=1,10000 + read(1,'(a)',end=555,err=555) pdbname(i) + enddo + 555 npdbfile=i-1 + write (iout,*) "PDB files" + do i=1,npdbfile + write (iout,'(i6,a)') i,pdbname(i)(:ilen(pdbname(i))) + enddo + endif +#ifdef MPI + if (me.eq.king .or. (fg_rank.eq.0 .and. .not.out1file)) + & write (iout,'(//80(1h*)/20x,a,i4,a/80(1h*)//)') + & 'Processor',myrank,': end reading molecular data.' +#endif + return + end +c-------------------------------------------------------------------------- + logical function seq_comp(itypea,itypeb,length) + implicit none + integer length,itypea(length),itypeb(length) + integer i + do i=1,length + if (itypea(i).ne.itypeb(i)) then + seq_comp=.false. + return + endif + enddo + seq_comp=.true. + return + end +c----------------------------------------------------------------------------- + subroutine read_bridge +C Read information about disulfide bridges. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' + include 'COMMON.SETUP' +C Read bridging residues. + read (inp,*) ns,(iss(i),i=1,ns) + print *,'ns=',ns + if(me.eq.king.or..not.out1file) + & write (iout,*) 'ns=',ns,' iss:',(iss(i),i=1,ns) +C Check whether the specified bridging residues are cystines. + do i=1,ns + if (itype(iss(i)).ne.1) then + if (me.eq.king.or..not.out1file) write (iout,'(2a,i3,a)') + & 'Do you REALLY think that the residue ',restyp(iss(i)),i, + & ' can form a disulfide bridge?!!!' + write (*,'(2a,i3,a)') + & 'Do you REALLY think that the residue ',restyp(iss(i)),i, + & ' can form a disulfide bridge?!!!' +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,ierror) + stop +#endif + endif + enddo +C Read preformed bridges. + if (ns.gt.0) then + read (inp,*) nss,(ihpb(i),jhpb(i),i=1,nss) + write (iout,*) 'nss=',nss,' ihpb,jhpb: ',(ihpb(i),jhpb(i),i=1,nss) + if (nss.gt.0) then + nhpb=nss +C Check if the residues involved in bridges are in the specified list of +C bridging residues. + do i=1,nss + do j=1,i-1 + if (ihpb(i).eq.ihpb(j).or.ihpb(i).eq.jhpb(j) + & .or.jhpb(i).eq.ihpb(j).or.jhpb(i).eq.jhpb(j)) then + write (iout,'(a,i3,a)') 'Disulfide pair',i, + & ' contains residues present in other pairs.' + write (*,'(a,i3,a)') 'Disulfide pair',i, + & ' contains residues present in other pairs.' +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,ierror) + stop +#endif + endif + enddo + do j=1,ns + if (ihpb(i).eq.iss(j)) goto 10 + enddo + write (iout,'(a,i3,a)') 'Pair',i,' contains unknown cystine.' + 10 continue + do j=1,ns + if (jhpb(i).eq.iss(j)) goto 20 + enddo + write (iout,'(a,i3,a)') 'Pair',i,' contains unknown cystine.' + 20 continue + dhpb(i)=dbr + forcon(i)=fbr + enddo + do i=1,nss + ihpb(i)=ihpb(i)+nres + jhpb(i)=jhpb(i)+nres + enddo + endif + endif + return + end +c---------------------------------------------------------------------------- + subroutine read_x(kanal,*) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' +c Read coordinates from input +c + read(kanal,'(8f10.5)',end=10,err=10) + & ((c(l,k),l=1,3),k=1,nres), + & ((c(l,k+nres),l=1,3),k=nnt,nct) + do j=1,3 + c(j,nres+1)=c(j,1) + c(j,2*nres)=c(j,nres) + enddo + call int_from_cart1(.false.) + do i=1,nres-1 + do j=1,3 + dc(j,i)=c(j,i+1)-c(j,i) + dc_norm(j,i)=dc(j,i)*vbld_inv(i+1) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + dc(j,i+nres)=c(j,i+nres)-c(j,i) + dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres) + enddo + endif + enddo + + return + 10 return1 + end +c---------------------------------------------------------------------------- + subroutine read_threadbase + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' +C Read pattern database for threading. + read (icbase,*) nseq + do i=1,nseq + read (icbase,'(i5,2x,a8,2i4)') nres_base(1,i),str_nam(i), + & nres_base(2,i),nres_base(3,i) + read (icbase,'(9f8.3)') ((cart_base(k,j,i),k=1,3),j=1, + & nres_base(1,i)) +c write (iout,'(i5,2x,a8,2i4)') nres_base(1,i),str_nam(i), +c & nres_base(2,i),nres_base(3,i) +c write (iout,'(9f8.3)') ((cart_base(k,j,i),k=1,3),j=1, +c & nres_base(1,i)) + enddo + close (icbase) + if (weidis.eq.0.0D0) weidis=0.1D0 + do i=nnt,nct + do j=i+2,nct + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=weidis + enddo + enddo + read (inp,*) nexcl,(iexam(1,i),iexam(2,i),i=1,nexcl) + write (iout,'(a,i5)') 'nexcl: ',nexcl + write (iout,'(2i5)') (iexam(1,i),iexam(2,i),i=1,nexcl) + return + end +c------------------------------------------------------------------------------ + subroutine setup_var + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' +C Set up variable list. + ntheta=nres-2 + nphi=nres-3 + nvar=ntheta+nphi + nside=0 + do i=2,nres-1 + if (itype(i).ne.10) then + nside=nside+1 + ialph(i,1)=nvar+nside + ialph(nside,2)=i + endif + enddo + if (indphi.gt.0) then + nvar=nphi + else if (indback.gt.0) then + nvar=nphi+ntheta + else + nvar=nvar+2*nside + endif +cd write (iout,'(3i4)') (i,ialph(i,1),ialph(i,2),i=2,nres-1) + return + end +c---------------------------------------------------------------------------- + subroutine gen_dist_constr +C Generate CA distance constraints. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' + dimension itype_pdb(maxres) + common /pizda/ itype_pdb + character*2 iden +cd print *,'gen_dist_constr: nnt=',nnt,' nct=',nct +cd write (2,*) 'gen_dist_constr: nnt=',nnt,' nct=',nct, +cd & ' nstart_sup',nstart_sup,' nstart_seq',nstart_seq, +cd & ' nsup',nsup + do i=nstart_sup,nstart_sup+nsup-1 +cd write (2,*) 'i',i,' seq ',restyp(itype(i+nstart_seq-nstart_sup)), +cd & ' seq_pdb', restyp(itype_pdb(i)) + do j=i+2,nstart_sup+nsup-1 + nhpb=nhpb+1 + ihpb(nhpb)=i+nstart_seq-nstart_sup + jhpb(nhpb)=j+nstart_seq-nstart_sup + forcon(nhpb)=weidis + dhpb(nhpb)=dist(i,j) + enddo + enddo +cd write (iout,'(a)') 'Distance constraints:' +cd do i=nss+1,nhpb +cd ii=ihpb(i) +cd jj=jhpb(i) +cd iden='CA' +cd if (ii.gt.nres) then +cd iden='SC' +cd ii=ii-nres +cd jj=jj-nres +cd endif +cd write (iout,'(a,1x,a,i4,3x,a,1x,a,i4,2f10.3)') +cd & restyp(itype(ii)),iden,ii,restyp(itype(jj)),iden,jj, +cd & dhpb(i),forcon(i) +cd enddo + return + end +c---------------------------------------------------------------------------- + subroutine map_read + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MAP' + include 'COMMON.IOUNITS' + character*3 angid(4) /'THE','PHI','ALP','OME'/ + character*80 mapcard,ucase + do imap=1,nmap + read (inp,'(a)') mapcard + mapcard=ucase(mapcard) + if (index(mapcard,'PHI').gt.0) then + kang(imap)=1 + else if (index(mapcard,'THE').gt.0) then + kang(imap)=2 + else if (index(mapcard,'ALP').gt.0) then + kang(imap)=3 + else if (index(mapcard,'OME').gt.0) then + kang(imap)=4 + else + write(iout,'(a)')'Error - illegal variable spec in MAP card.' + stop 'Error - illegal variable spec in MAP card.' + endif + call readi (mapcard,'RES1',res1(imap),0) + call readi (mapcard,'RES2',res2(imap),0) + if (res1(imap).eq.0) then + res1(imap)=res2(imap) + else if (res2(imap).eq.0) then + res2(imap)=res1(imap) + endif + if(res1(imap)*res2(imap).eq.0 .or. res1(imap).gt.res2(imap))then + write (iout,'(a)') + & 'Error - illegal definition of variable group in MAP.' + stop 'Error - illegal definition of variable group in MAP.' + endif + call reada(mapcard,'FROM',ang_from(imap),0.0D0) + call reada(mapcard,'TO',ang_to(imap),0.0D0) + call readi(mapcard,'NSTEP',nstep(imap),0) + if (ang_from(imap).eq.ang_to(imap) .or. nstep(imap).eq.0) then + write (iout,'(a)') + & 'Illegal boundary and/or step size specification in MAP.' + stop 'Illegal boundary and/or step size specification in MAP.' + endif + enddo ! imap + return + end +c---------------------------------------------------------------------------- + subroutine read_minim + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MINIM' + include 'COMMON.IOUNITS' + character*80 ucase + character*320 minimcard + call card_concat(minimcard) + call readi(minimcard,'MAXMIN',maxmin,2000) + call readi(minimcard,'MAXFUN',maxfun,5000) + call readi(minimcard,'MINMIN',minmin,maxmin) + call readi(minimcard,'MINFUN',minfun,maxmin) + call reada(minimcard,'TOLF',tolf,1.0D-2) + call reada(minimcard,'RTOLF',rtolf,1.0D-4) + print_min_stat=min0(index(minimcard,'PRINT_MIN_STAT'),1) + print_min_res=min0(index(minimcard,'PRINT_MIN_RES'),1) + print_min_ini=min0(index(minimcard,'PRINT_MIN_INI'),1) + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Options in energy minimization:' + write (iout,'(4(a,i5),a,1pe14.5,a,1pe14.5)') + & 'MaxMin:',MaxMin,' MaxFun:',MaxFun, + & 'MinMin:',MinMin,' MinFun:',MinFun, + & ' TolF:',TolF,' RTolF:',RTolF + return + end +c---------------------------------------------------------------------------- + subroutine read_angles(kanal,*) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' +c Read angles from input +c + read (kanal,*,err=10,end=10) (theta(i),i=3,nres) + read (kanal,*,err=10,end=10) (phi(i),i=4,nres) + read (kanal,*,err=10,end=10) (alph(i),i=2,nres-1) + read (kanal,*,err=10,end=10) (omeg(i),i=2,nres-1) + + do i=1,nres +c 9/7/01 avoid 180 deg valence angle + if (theta(i).gt.179.99d0) theta(i)=179.99d0 +c + theta(i)=deg2rad*theta(i) + phi(i)=deg2rad*phi(i) + alph(i)=deg2rad*alph(i) + omeg(i)=deg2rad*omeg(i) + enddo + return + 10 return1 + end +c---------------------------------------------------------------------------- + subroutine reada(rekord,lancuch,wartosc,default) + implicit none + character*(*) rekord,lancuch + double precision wartosc,default + integer ilen,iread + external ilen + iread=index(rekord,lancuch) + if (iread.eq.0) then + wartosc=default + return + endif + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,err=10,end=10) wartosc + return + 10 wartosc=default + return + end +c---------------------------------------------------------------------------- + subroutine readi(rekord,lancuch,wartosc,default) + implicit none + character*(*) rekord,lancuch + integer wartosc,default + integer ilen,iread + external ilen + iread=index(rekord,lancuch) + if (iread.eq.0) then + wartosc=default + return + endif + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,err=10,end=10) wartosc + return + 10 wartosc=default + return + end +c---------------------------------------------------------------------------- + subroutine multreadi(rekord,lancuch,tablica,dim,default) + implicit none + integer dim,i + integer tablica(dim),default + character*(*) rekord,lancuch + character*80 aux + integer ilen,iread + external ilen + do i=1,dim + tablica(i)=default + enddo + iread=index(rekord,lancuch(:ilen(lancuch))//"=") + if (iread.eq.0) return + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim) + 10 return + end +c---------------------------------------------------------------------------- + subroutine multreada(rekord,lancuch,tablica,dim,default) + implicit none + integer dim,i + double precision tablica(dim),default + character*(*) rekord,lancuch + character*80 aux + integer ilen,iread + external ilen + do i=1,dim + tablica(i)=default + enddo + iread=index(rekord,lancuch(:ilen(lancuch))//"=") + if (iread.eq.0) return + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim) + 10 return + end +c---------------------------------------------------------------------------- + subroutine card_concat(card) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + character*(*) card + character*80 karta,ucase + external ilen + read (inp,'(a)') karta + karta=ucase(karta) + card=' ' + do while (karta(80:80).eq.'&') + card=card(:ilen(card)+1)//karta(:79) + read (inp,'(a)') karta + karta=ucase(karta) + enddo + card=card(:ilen(card)+1)//karta + return + end +c--------------------------------------------------------------------------------- + subroutine read_fragments + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.MD' + include 'COMMON.CONTROL' + read(inp,*) nset,nfrag,npair,nfrag_back + if(me.eq.king.or..not.out1file) + & write(iout,*) "nset",nset," nfrag",nfrag," npair",npair, + & " nfrag_back",nfrag_back + do iset=1,nset + read(inp,*) mset(iset) + do i=1,nfrag + read(inp,*) wfrag(i,iset),ifrag(1,i,iset),ifrag(2,i,iset), + & qinfrag(i,iset) + if(me.eq.king.or..not.out1file) + & write(iout,*) "R ",i,wfrag(i,iset),ifrag(1,i,iset), + & ifrag(2,i,iset), qinfrag(i,iset) + enddo + do i=1,npair + read(inp,*) wpair(i,iset),ipair(1,i,iset),ipair(2,i,iset), + & qinpair(i,iset) + if(me.eq.king.or..not.out1file) + & write(iout,*) "R ",i,wpair(i,iset),ipair(1,i,iset), + & ipair(2,i,iset), qinpair(i,iset) + enddo + do i=1,nfrag_back + read(inp,*) wfrag_back(1,i,iset),wfrag_back(2,i,iset), + & wfrag_back(3,i,iset), + & ifrag_back(1,i,iset),ifrag_back(2,i,iset) + if(me.eq.king.or..not.out1file) + & write(iout,*) "A",i,wfrag_back(1,i,iset),wfrag_back(2,i,iset), + & wfrag_back(3,i,iset),ifrag_back(1,i,iset),ifrag_back(2,i,iset) + enddo + enddo + return + end +c------------------------------------------------------------------------------- + subroutine read_dist_constr + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.SBRIDGE' + integer ifrag_(2,100),ipair_(2,100) + double precision wfrag_(100),wpair_(100) + character*500 controlcard +c write (iout,*) "Calling read_dist_constr" +c write (iout,*) "nres",nres," nstart_sup",nstart_sup," nsup",nsup +c call flush(iout) + call card_concat(controlcard) + call readi(controlcard,"NFRAG",nfrag_,0) + call readi(controlcard,"NPAIR",npair_,0) + call readi(controlcard,"NDIST",ndist_,0) + call reada(controlcard,'DIST_CUT',dist_cut,5.0d0) + call multreadi(controlcard,"IFRAG",ifrag_(1,1),2*nfrag_,0) + call multreadi(controlcard,"IPAIR",ipair_(1,1),2*npair_,0) + call multreada(controlcard,"WFRAG",wfrag_(1),nfrag_,0.0d0) + call multreada(controlcard,"WPAIR",wpair_(1),npair_,0.0d0) +c write (iout,*) "NFRAG",nfrag_," NPAIR",npair_," NDIST",ndist_ +c write (iout,*) "IFRAG" +c do i=1,nfrag_ +c write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i) +c enddo +c write (iout,*) "IPAIR" +c do i=1,npair_ +c write (iout,*) i,ipair_(1,i),ipair_(2,i),wpair_(i) +c enddo + if (.not.refstr .and. nfrag.gt.0) then + write (iout,*) + & "ERROR: no reference structure to compute distance restraints" + write (iout,*) + & "Restraints must be specified explicitly (NDIST=number)" + stop + endif + if (nfrag.lt.2 .and. npair.gt.0) then + write (iout,*) "ERROR: Less than 2 fragments specified", + & " but distance restraints between pairs requested" + stop + endif + call flush(iout) + do i=1,nfrag_ + if (ifrag_(1,i).lt.nstart_sup) ifrag_(1,i)=nstart_sup + if (ifrag_(2,i).gt.nstart_sup+nsup-1) + & ifrag_(2,i)=nstart_sup+nsup-1 +c write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i) + call flush(iout) + if (wfrag_(i).gt.0.0d0) then + do j=ifrag_(1,i),ifrag_(2,i)-1 + do k=j+1,ifrag_(2,i) + write (iout,*) "j",j," k",k + ddjk=dist(j,k) + if (constr_dist.eq.1) then + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + dhpb(nhpb)=ddjk + forcon(nhpb)=wfrag_(i) + else if (constr_dist.eq.2) then + if (ddjk.le.dist_cut) then + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + dhpb(nhpb)=ddjk + forcon(nhpb)=wfrag_(i) + endif + else + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + dhpb(nhpb)=ddjk + forcon(nhpb)=wfrag_(i)*dexp(-0.5d0*(ddjk/dist_cut)**2) + endif +#ifdef MPI + if (.not.out1file .or. me.eq.king) + & write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#else + write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#endif + enddo + enddo + endif + enddo + do i=1,npair_ + if (wpair_(i).gt.0.0d0) then + ii = ipair_(1,i) + jj = ipair_(2,i) + if (ii.gt.jj) then + itemp=ii + ii=jj + jj=itemp + endif + do j=ifrag_(1,ii),ifrag_(2,ii) + do k=ifrag_(1,jj),ifrag_(2,jj) + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + forcon(nhpb)=wpair_(i) + dhpb(nhpb)=dist(j,k) +#ifdef MPI + if (.not.out1file .or. me.eq.king) + & write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#else + write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#endif + enddo + enddo + endif + enddo + do i=1,ndist_ + read (inp,*) ihpb(nhpb+1),jhpb(nhpb+1),dhpb(i),dhpb1(i), + & ibecarb(i),forcon(nhpb+1) + if (forcon(nhpb+1).gt.0.0d0) then + nhpb=nhpb+1 + if (ibecarb(i).gt.0) then + ihpb(i)=ihpb(i)+nres + jhpb(i)=jhpb(i)+nres + endif + if (dhpb(nhpb).eq.0.0d0) + & dhpb(nhpb)=dist(ihpb(nhpb),jhpb(nhpb)) + endif + enddo +#ifdef MPI + if (.not.out1file .or. me.eq.king) then +#endif + do i=1,nhpb + write (iout,'(a,3i5,2f8.2,i2,f10.1)') "+dist.constr ", + & i,ihpb(i),jhpb(i),dhpb(i),dhpb1(i),ibecarb(i),forcon(i) + enddo + call flush(iout) +#ifdef MPI + endif +#endif + return + end +c------------------------------------------------------------------------------- +#ifdef WINIFL + subroutine flush(iu) + return + end +#endif +#ifdef AIX + subroutine flush(iu) + call flush_(iu) + return + end +#endif +c------------------------------------------------------------------------------ + subroutine copy_to_tmp(source) + include "DIMENSIONS" + include "COMMON.IOUNITS" + character*(*) source + character* 256 tmpfile + integer ilen + external ilen + logical ex + tmpfile=curdir(:ilen(curdir))//"/"//source(:ilen(source)) + inquire(file=tmpfile,exist=ex) + if (ex) then + write (*,*) "Copying ",tmpfile(:ilen(tmpfile)), + & " to temporary directory..." + write (*,*) "/bin/cp "//tmpfile(:ilen(tmpfile))//" "//tmpdir + call system("/bin/cp "//tmpfile(:ilen(tmpfile))//" "//tmpdir) + endif + return + end +c------------------------------------------------------------------------------ + subroutine move_from_tmp(source) + include "DIMENSIONS" + include "COMMON.IOUNITS" + character*(*) source + integer ilen + external ilen + write (*,*) "Moving ",source(:ilen(source)), + & " from temporary directory to working directory" + write (*,*) "/bin/mv "//source(:ilen(source))//" "//curdir + call system("/bin/mv "//source(:ilen(source))//" "//curdir) + return + end +c------------------------------------------------------------------------------ + subroutine random_init(seed) +C +C Initialize random number generator +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef AMD64 + integer*8 iseedi8 +#endif +#ifdef MPI + include 'mpif.h' + logical OKRandom, prng_restart + real*8 r1 + integer iseed_array(4) +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.THREAD' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.MCM' + include 'COMMON.MAP' + include 'COMMON.HEADER' +csa include 'COMMON.CSA' + include 'COMMON.CHAIN' + include 'COMMON.MUCA' + include 'COMMON.MD' + include 'COMMON.FFIELD' + include 'COMMON.SETUP' + iseed=-dint(dabs(seed)) + if (iseed.eq.0) then + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Random seed undefined. The program will stop.' + write (*,'(/80(1h*)/20x,a/80(1h*))') + & 'Random seed undefined. The program will stop.' +#ifdef MPI + call mpi_finalize(mpi_comm_world,ierr) +#endif + stop 'Bad random seed.' + endif +#ifdef MPI + if (fg_rank.eq.0) then + seed=seed*(me+1)+1 +#ifdef AMD64 + iseedi8=dint(seed) + if(me.eq.king .or. .not. out1file) + & write (iout,*) 'MPI: node= ', me, ' iseed= ',iseedi8 + write (*,*) 'MPI: node= ', me, ' iseed= ',iseedi8 + OKRandom = prng_restart(me,iseedi8) +#else + do i=1,4 + tmp=65536.0d0**(4-i) + iseed_array(i) = dint(seed/tmp) + seed=seed-iseed_array(i)*tmp + enddo + if(me.eq.king .or. .not. out1file) + & write (iout,*) 'MPI: node= ', me, ' iseed(4)= ', + & (iseed_array(i),i=1,4) + write (*,*) 'MPI: node= ',me, ' iseed(4)= ', + & (iseed_array(i),i=1,4) + OKRandom = prng_restart(me,iseed_array) +#endif + if (OKRandom) then + r1=ran_number(0.0D0,1.0D0) + if(me.eq.king .or. .not. out1file) + & write (iout,*) 'ran_num',r1 + if (r1.lt.0.0d0) OKRandom=.false. + endif + if (.not.OKRandom) then + write (iout,*) 'PRNG IS NOT WORKING!!!' + print *,'PRNG IS NOT WORKING!!!' + if (me.eq.0) then + call flush(iout) + call mpi_abort(mpi_comm_world,error_msg,ierr) + stop + else + write (iout,*) 'too many processors for parallel prng' + write (*,*) 'too many processors for parallel prng' + call flush(iout) + stop + endif + endif + endif +#else + call vrndst(iseed) + write (iout,*) 'ran_num',ran_number(0.0d0,1.0d0) +#endif + return + end +c-------------------------------------------------------------------------- + subroutine pdbinput(iconf) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer error_msg +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.CONTACTS' + include 'COMMON.TORCNSTR' + include 'COMMON.TIME1' + include 'COMMON.BOUNDS' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + character*4 sequence(maxres) + integer rescode + double precision x(maxvar) + dimension itype_pdb(maxres) + common /pizda/ itype_pdb + logical seq_comp,fail + double precision energia(0:n_ene) + integer ilen + external ilen + if(me.eq.king.or..not.out1file) + & write (iout,'(2a)') 'PDB data will be read from file ', + & pdbname(iconf)(:ilen(pdbname(iconf))) + open(ipdbin,file=pdbname(iconf),status='old',err=33) + goto 34 + 33 write (iout,'(a)') 'Error opening PDB file.' + stop + 34 continue +c print *,'Begin reading pdb data' + call readpdb +c print *,'Finished reading pdb data' + if(me.eq.king.or..not.out1file) + & write (iout,'(a,i3,a,i3)')'nsup=',nsup, + & ' nstart_sup=',nstart_sup + do i=1,nres + itype_pdb(i)=itype(i) + enddo + close (ipdbin) + nnt=nstart_sup + nct=nstart_sup+nsup-1 + + if (sideadd) then +C Following 2 lines for diagnostics; comment out if not needed + write (iout,*) "Before sideadd" + call intout + if (me.eq.king.or..not.out1file) + & write(iout,*)'Adding sidechains' + maxsi=1000 + do i=2,nres-1 + iti=itype(i) + if (iti.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(iti,theta(i+1),alph(i),omeg(i),fail) + nsi=nsi+1 + enddo + if(fail) write(iout,*)'Adding sidechain failed for res ', + & i,' after ',nsi,' trials' + endif + enddo +C 10/03/12 Adam: Recalculate coordinates with new side chain positions + call chainbuild +C Following 2 lines for diagnostics; comment out if not needed + write (iout,*) "After sideadd" + call intout + endif + return + end diff --git a/source/unres/src_Eshel/refsys.f b/source/unres/src_Eshel/refsys.f new file mode 100644 index 0000000..b57c201 --- /dev/null +++ b/source/unres/src_Eshel/refsys.f @@ -0,0 +1,60 @@ + subroutine refsys(i2,i3,i4,e1,e2,e3,fail) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +c this subroutine calculates unity vectors of a local reference system +c defined by atoms (i2), (i3), and (i4). the x axis is the axis from +c atom (i3) to atom (i2), and the xy plane is the plane defined by atoms +c (i2), (i3), and (i4). z axis is directed according to the sign of the +c vector product (i3)-(i2) and (i3)-(i4). sets fail to .true. if atoms +c (i2) and (i3) or (i3) and (i4) coincide or atoms (i2), (i3), and (i4) +c form a linear fragment. returns vectors e1, e2, and e3. + logical fail + double precision e1(3),e2(3),e3(3) + double precision u(3),z(3) + include 'COMMON.IOUNITS' + include "COMMON.CHAIN" + data coinc /1.0d-13/,align /1.0d-13/ + fail=.false. + s1=0.0d0 + s2=0.0d0 + do 1 i=1,3 + zi=c(i,i2)-c(i,i3) + ui=c(i,i4)-c(i,i3) + s1=s1+zi*zi + s2=s2+ui*ui + z(i)=zi + 1 u(i)=ui + s1=sqrt(s1) + s2=sqrt(s2) + if (s1.gt.coinc) goto 2 + write (iout,1000) i2,i3,i1 + fail=.true. + return + 2 if (s2.gt.coinc) goto 4 + write(iout,1000) i3,i4,i1 + fail=.true. + return + 4 s1=1.0/s1 + s2=1.0/s2 + v1=z(2)*u(3)-z(3)*u(2) + v2=z(3)*u(1)-z(1)*u(3) + v3=z(1)*u(2)-z(2)*u(1) + anorm=sqrt(v1*v1+v2*v2+v3*v3) + if (anorm.gt.align) goto 6 + write (iout,1010) i2,i3,i4,i1 + fail=.true. + return + 6 anorm=1.0/anorm + e3(1)=v1*anorm + e3(2)=v2*anorm + e3(3)=v3*anorm + e1(1)=z(1)*s1 + e1(2)=z(2)*s1 + e1(3)=z(3)*s1 + e2(1)=e1(3)*e3(2)-e1(2)*e3(3) + e2(2)=e1(1)*e3(3)-e1(3)*e3(1) + e2(3)=e1(2)*e3(1)-e1(1)*e3(2) + 1000 format (/1x,' * * * error - atoms',i4,' and',i4,' coincide.') + 1010 format (/1x,' * * * error - atoms',2(i4,2h, ),i4,' form a linear') + return + end diff --git a/source/unres/src_Eshel/regularize.F b/source/unres/src_Eshel/regularize.F new file mode 100644 index 0000000..c506b8a --- /dev/null +++ b/source/unres/src_Eshel/regularize.F @@ -0,0 +1,76 @@ + subroutine regularize(ncart,etot,rms,cref0,iretcode) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.HEADER' + include 'COMMON.IOUNITS' + include 'COMMON.MINIM' + double precision przes(3),obrot(3,3),fhpb0(maxdim),varia(maxvar) + double precision cref0(3,ncart) + double precision energia(0:n_ene) + logical non_conv + link_end0=link_end + do i=1,nhpb + fhpb0(i)=forcon(i) + enddo + maxit_reg=2 + print *,'Enter REGULARIZE: nnt=',nnt,' nct=',nct,' nsup=',nsup, + & ' nstart_seq=',nstart_seq,' nstart_sup',nstart_sup + write (iout,'(/a/)') 'Initial energies:' + call geom_to_var(nvar,varia) + call chainbuild + call etotal(energia(0)) + etot=energia(0) + call enerprint(energia(0)) + call fitsq(rms,c(1,nstart_seq),cref0(1,nstart_sup-1), + & nsup,przes,obrot,non_conv) + write (iout,'(a,f10.5)') + & 'Enter REGULARIZE: Initial RMS deviation:',dsqrt(dabs(rms)) + write (*,'(a,f10.5)') + & 'Enter REGULARIZE: Initial RMS deviation:',dsqrt(dabs(rms)) + maxit0=maxit + maxfun0=maxfun + rtolf0=rtolf + maxit=100 + maxfun=200 + rtolf=1.0D-2 + do it=1,maxit_reg + print *,'Regularization: pass:',it +C Minimize with distance constraints, gradually relieving the weight. + call minimize(etot,varia,iretcode,nfun) + print *,'Etot=',Etot + if (iretcode.eq.11) return + call fitsq(rms,c(1,nstart_seq),cref0(1,nstart_sup-1), + & nsup,przes,obrot,non_conv) + rms=dsqrt(rms) + write (iout,'(a,i2,a,f10.5,a,1pe14.5,a,i3/)') + & 'Finish pass',it,', RMS deviation:',rms,', energy',etot, + & ' SUMSL convergence',iretcode + do i=nss+1,nhpb + forcon(i)=0.1D0*forcon(i) + enddo + enddo +C Turn off the distance constraints and re-minimize energy. + print *,'Final minimization ... ' + maxit=maxit0 + maxfun=maxfun0 + rtolf=rtolf0 + link_end=min0(link_end,nss) + call minimize(etot,varia,iretcode,nfun) + print *,'Etot=',Etot + call fitsq(rms,c(1,nstart_seq),cref0(1,nstart_sup-1),nsup, + & przes,obrot,non_conv) + rms=dsqrt(rms) + write (iout,'(a,f10.5,a,1pe14.5,a,i3/)') + & 'Final RMS deviation:',rms,' energy',etot,' SUMSL convergence', + & iretcode + link_end=link_end0 + do i=nss+1,nhpb + forcon(i)=fhpb0(i) + enddo + call var_to_geom(nvar,varia) + call chainbuild + return + end diff --git a/source/unres/src_Eshel/rescode.f b/source/unres/src_Eshel/rescode.f new file mode 100644 index 0000000..2973ef9 --- /dev/null +++ b/source/unres/src_Eshel/rescode.f @@ -0,0 +1,32 @@ + integer function rescode(iseq,nam,itype) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + character*3 nam,ucase + + if (itype.eq.0) then + + do i=1,ntyp1 + if (ucase(nam).eq.restyp(i)) then + rescode=i + return + endif + enddo + + else + + do i=1,ntyp1 + if (nam(1:1).eq.onelet(i)) then + rescode=i + return + endif + enddo + + endif + + write (iout,10) iseq,nam + stop + 10 format ('**** Error - residue',i4,' has an unresolved name ',a3) + end + diff --git a/source/unres/src_Eshel/rmdd.f b/source/unres/src_Eshel/rmdd.f new file mode 100644 index 0000000..799ab47 --- /dev/null +++ b/source/unres/src_Eshel/rmdd.f @@ -0,0 +1,159 @@ +c algorithm 611, collected algorithms from acm. +c algorithm appeared in acm-trans. math. software, vol.9, no. 4, +c dec., 1983, p. 503-524. + integer function imdcon(k) +c + integer k +c +c *** return integer machine-dependent constants *** +c +c *** k = 1 means return standard output unit number. *** +c *** k = 2 means return alternate output unit number. *** +c *** k = 3 means return input unit number. *** +c (note -- k = 2, 3 are used only by test programs.) +c +c +++ port version follows... +c external i1mach +c integer i1mach +c integer mdperm(3) +c data mdperm(1)/2/, mdperm(2)/4/, mdperm(3)/1/ +c imdcon = i1mach(mdperm(k)) +c +++ end of port version +++ +c +c +++ non-port version follows... + integer mdcon(3) + data mdcon(1)/6/, mdcon(2)/8/, mdcon(3)/5/ + imdcon = mdcon(k) +c +++ end of non-port version +++ +c + 999 return +c *** last card of imdcon follows *** + end + double precision function rmdcon(k) +c +c *** return machine dependent constants used by nl2sol *** +c +c +++ comments below contain data statements for various machines. +++ +c +++ to convert to another machine, place a c in column 1 of the +++ +c +++ data statement line(s) that correspond to the current machine +++ +c +++ and remove the c from column 1 of the data statement line(s) +++ +c +++ that correspond to the new machine. +++ +c + integer k +c +c *** the constant returned depends on k... +c +c *** k = 1... smallest pos. eta such that -eta exists. +c *** k = 2... square root of eta. +c *** k = 3... unit roundoff = smallest pos. no. machep such +c *** that 1 + machep .gt. 1 .and. 1 - machep .lt. 1. +c *** k = 4... square root of machep. +c *** k = 5... square root of big (see k = 6). +c *** k = 6... largest machine no. big such that -big exists. +c + double precision big, eta, machep + integer bigi(4), etai(4), machei(4) +c/+ + double precision dsqrt +c/ + equivalence (big,bigi(1)), (eta,etai(1)), (machep,machei(1)) +c +c +++ ibm 360, ibm 370, or xerox +++ +c +c data big/z7fffffffffffffff/, eta/z0010000000000000/, +c 1 machep/z3410000000000000/ +c +c +++ data general +++ +c +c data big/0.7237005577d+76/, eta/0.5397605347d-78/, +c 1 machep/2.22044605d-16/ +c +c +++ dec 11 +++ +c +c data big/1.7d+38/, eta/2.938735878d-39/, machep/2.775557562d-17/ +c +c +++ hp3000 +++ +c +c data big/1.157920892d+77/, eta/8.636168556d-78/, +c 1 machep/5.551115124d-17/ +c +c +++ honeywell +++ +c +c data big/1.69d+38/, eta/5.9d-39/, machep/2.1680435d-19/ +c +c +++ dec10 +++ +c +c data big/"377777100000000000000000/, +c 1 eta/"002400400000000000000000/, +c 2 machep/"104400000000000000000000/ +c +c +++ burroughs +++ +c +c data big/o0777777777777777,o7777777777777777/, +c 1 eta/o1771000000000000,o7770000000000000/, +c 2 machep/o1451000000000000,o0000000000000000/ +c +c +++ control data +++ +c +c data big/37767777777777777777b,37167777777777777777b/, +c 1 eta/00014000000000000000b,00000000000000000000b/, +c 2 machep/15614000000000000000b,15010000000000000000b/ +c +c +++ prime +++ +c +c data big/1.0d+9786/, eta/1.0d-9860/, machep/1.4210855d-14/ +c +c +++ univac +++ +c +c data big/8.988d+307/, eta/1.2d-308/, machep/1.734723476d-18/ +c +c +++ vax +++ +c + data big/1.7d+38/, eta/2.939d-39/, machep/1.3877788d-17/ +c +c +++ cray 1 +++ +c +c data bigi(1)/577767777777777777777b/, +c 1 bigi(2)/000007777777777777776b/, +c 2 etai(1)/200004000000000000000b/, +c 3 etai(2)/000000000000000000000b/, +c 4 machei(1)/377224000000000000000b/, +c 5 machei(2)/000000000000000000000b/ +c +c +++ port library -- requires more than just a data statement... +++ +c +c external d1mach +c double precision d1mach, zero +c data big/0.d+0/, eta/0.d+0/, machep/0.d+0/, zero/0.d+0/ +c if (big .gt. zero) go to 1 +c big = d1mach(2) +c eta = d1mach(1) +c machep = d1mach(4) +c1 continue +c +c +++ end of port +++ +c +c------------------------------- body -------------------------------- +c + go to (10, 20, 30, 40, 50, 60), k +c + 10 rmdcon = eta + go to 999 +c + 20 rmdcon = dsqrt(256.d+0*eta)/16.d+0 + go to 999 +c + 30 rmdcon = machep + go to 999 +c + 40 rmdcon = dsqrt(machep) + go to 999 +c + 50 rmdcon = dsqrt(big/256.d+0)*16.d+0 + go to 999 +c + 60 rmdcon = big +c + 999 return +c *** last card of rmdcon follows *** + end diff --git a/source/unres/src_Eshel/rmsd.F b/source/unres/src_Eshel/rmsd.F new file mode 100644 index 0000000..52e7b37 --- /dev/null +++ b/source/unres/src_Eshel/rmsd.F @@ -0,0 +1,140 @@ + subroutine rms_nac_nnc(rms,frac,frac_nn,co,lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.CONTACTS' + include 'COMMON.IOUNITS' + double precision przes(3),obr(3,3) + logical non_conv,lprn +c call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup,przes, +c & obr,non_conv) +c rms=dsqrt(rms) + call rmsd(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + frac_nn=contact_fract_nn(ncont,ncont_ref,icont,icont_ref) + if (lprn) write (iout,'(a,f8.3/a,f8.3/a,f8.3/a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100, + & ' % of nonnative contacts:',frac_nn*100, + & ' contact order:',co + + return + end +c--------------------------------------------------------------------------- + subroutine rmsd(drms) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.INTERACT' + logical non_conv + double precision przes(3),obrot(3,3) + double precision ccopy(3,maxres2+2),crefcopy(3,maxres2+2) + + iatom=0 +c print *,"nz_start",nz_start," nz_end",nz_end + do i=nz_start,nz_end + iatom=iatom+1 + iti=itype(i) + do k=1,3 + ccopy(k,iatom)=c(k,i+nstart_seq-nstart_sup) + crefcopy(k,iatom)=cref(k,i) + enddo + if (iz_sc.eq.1.and.iti.ne.10) then + iatom=iatom+1 + do k=1,3 + ccopy(k,iatom)=c(k,nres+i+nstart_seq-nstart_sup) + crefcopy(k,iatom)=cref(k,nres+i) + enddo + endif + enddo + +c ----- diagnostics +c write (iout,*) 'Ccopy and CREFcopy' +c print '(i5,3f10.5,5x,3f10.5)',(k,(ccopy(j,k),j=1,3), +c & (crefcopy(j,k),j=1,3),k=1,iatom) +c write (iout,'(i5,3f10.5,5x,3f10.5)') (k,(ccopy(j,k),j=1,3), +c & (crefcopy(j,k),j=1,3),k=1,iatom) +c ----- end diagnostics + + call fitsq(roznica,ccopy(1,1),crefcopy(1,1),iatom, + & przes,obrot,non_conv) + if (non_conv) then + print *,'Problems in FITSQ!!! rmsd' + write (iout,*) 'Problems in FITSQ!!! rmsd' + print *,'Ccopy and CREFcopy' + write (iout,*) 'Ccopy and CREFcopy' + print '(i5,3f10.5,5x,3f10.5)',(k,(ccopy(j,k),j=1,3), + & (crefcopy(j,k),j=1,3),k=1,iatom) + write (iout,'(i5,3f10.5,5x,3f10.5)') (k,(ccopy(j,k),j=1,3), + & (crefcopy(j,k),j=1,3),k=1,iatom) +#ifdef MPI +c call mpi_abort(mpi_comm_world,ierror,ierrcode) + roznica=100.0 +#else + stop +#endif + endif + drms=dsqrt(dabs(roznica)) +c ---- diagnostics +c write (iout,*) "rms",drms +c ---- end diagnostics + return + end + +c-------------------------------------------- + subroutine rmsd_csa(drms) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.INTERACT' + logical non_conv + double precision przes(3),obrot(3,3) + double precision ccopy(3,maxres2+2),crefcopy(3,maxres2+2) + + iatom=0 + do i=nz_start,nz_end + iatom=iatom+1 + iti=itype(i) + do k=1,3 + ccopy(k,iatom)=c(k,i) + crefcopy(k,iatom)=crefjlee(k,i) + enddo + if (iz_sc.eq.1.and.iti.ne.10) then + iatom=iatom+1 + do k=1,3 + ccopy(k,iatom)=c(k,nres+i) + crefcopy(k,iatom)=crefjlee(k,nres+i) + enddo + endif + enddo + + call fitsq(roznica,ccopy(1,1),crefcopy(1,1),iatom, + & przes,obrot,non_conv) + if (non_conv) then + print *,'Problems in FITSQ!!! rmsd_csa' + write (iout,*) 'Problems in FITSQ!!! rmsd_csa' + print *,'Ccopy and CREFcopy' + write (iout,*) 'Ccopy and CREFcopy' + print '(i5,3f10.5,5x,3f10.5)',(k,(ccopy(j,k),j=1,3), + & (crefcopy(j,k),j=1,3),k=1,iatom) + write (iout,'(i5,3f10.5,5x,3f10.5)') (k,(ccopy(j,k),j=1,3), + & (crefcopy(j,k),j=1,3),k=1,iatom) +#ifdef MPI + call mpi_abort(mpi_comm_world,ierror,ierrcode) +#else + stop +#endif + endif + drms=dsqrt(dabs(roznica)) + return + end + diff --git a/source/unres/src_Eshel/sc_move.F b/source/unres/src_Eshel/sc_move.F new file mode 100644 index 0000000..b6837fd --- /dev/null +++ b/source/unres/src_Eshel/sc_move.F @@ -0,0 +1,823 @@ + subroutine sc_move(n_start,n_end,n_maxtry,e_drop, + + n_fun,etot) +c Perform a quick search over side-chain arrangments (over +c residues n_start to n_end) for a given (frozen) CA trace +c Only side-chains are minimized (at most n_maxtry times each), +c not CA positions +c Stops if energy drops by e_drop, otherwise tries all residues +c in the given range +c If there is an energy drop, full minimization may be useful +c n_start, n_end CAN be modified by this routine, but only if +c out of bounds (n_start <= 1, n_end >= nres, n_start < n_end) +c NOTE: this move should never increase the energy +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.HEADER' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + +c External functions + integer iran_num + external iran_num + +c Input arguments + integer n_start,n_end,n_maxtry + double precision e_drop + +c Output arguments + integer n_fun + double precision etot + +c Local variables + double precision energy(0:n_ene) + double precision cur_alph(2:nres-1),cur_omeg(2:nres-1) + double precision orig_e,cur_e + integer n,n_steps,n_first,n_cur,n_tot,i + double precision orig_w(n_ene) + double precision wtime + + +c Set non side-chain weights to zero (minimization is faster) +c NOTE: e(2) does not actually depend on the side-chain, only CA + orig_w(2)=wscp + orig_w(3)=welec + orig_w(4)=wcorr + orig_w(5)=wcorr5 + orig_w(6)=wcorr6 + orig_w(7)=wel_loc + orig_w(8)=wturn3 + orig_w(9)=wturn4 + orig_w(10)=wturn6 + orig_w(11)=wang + orig_w(13)=wtor + orig_w(14)=wtor_d + orig_w(15)=wvdwpp + + wscp=0.D0 + welec=0.D0 + wcorr=0.D0 + wcorr5=0.D0 + wcorr6=0.D0 + wel_loc=0.D0 + wturn3=0.D0 + wturn4=0.D0 + wturn6=0.D0 + wang=0.D0 + wtor=0.D0 + wtor_d=0.D0 + wvdwpp=0.D0 + +c Make sure n_start, n_end are within proper range + if (n_start.lt.2) n_start=2 + if (n_end.gt.nres-1) n_end=nres-1 +crc if (n_start.lt.n_end) then + if (n_start.gt.n_end) then + n_start=2 + n_end=nres-1 + endif + +c Save the initial values of energy and coordinates +cd call chainbuild +cd call etotal(energy) +cd write (iout,*) 'start sc ene',energy(0) +cd call enerprint(energy(0)) +crc etot=energy(0) + n_fun=0 +crc orig_e=etot +crc cur_e=orig_e +crc do i=2,nres-1 +crc cur_alph(i)=alph(i) +crc cur_omeg(i)=omeg(i) +crc enddo + +ct wtime=MPI_WTIME() +c Try (one by one) all specified residues, starting from a +c random position in sequence +c Stop early if the energy has decreased by at least e_drop + n_tot=n_end-n_start+1 + n_first=iran_num(0,n_tot-1) + n_steps=0 + n=0 +crc do while (n.lt.n_tot .and. orig_e-etot.lt.e_drop) + do while (n.lt.n_tot) + n_cur=n_start+mod(n_first+n,n_tot) + call single_sc_move(n_cur,n_maxtry,e_drop, + + n_steps,n_fun,etot) +c If a lower energy was found, update the current structure... +crc if (etot.lt.cur_e) then +crc cur_e=etot +crc do i=2,nres-1 +crc cur_alph(i)=alph(i) +crc cur_omeg(i)=omeg(i) +crc enddo +crc else +c ...else revert to the previous one +crc etot=cur_e +crc do i=2,nres-1 +crc alph(i)=cur_alph(i) +crc omeg(i)=cur_omeg(i) +crc enddo +crc endif + n=n+1 +cd +cd call chainbuild +cd call etotal(energy) +cd print *,'running',n,energy(0) + enddo + +cd call chainbuild +cd call etotal(energy) +cd write (iout,*) 'end sc ene',energy(0) + +c Put the original weights back to calculate the full energy + wscp=orig_w(2) + welec=orig_w(3) + wcorr=orig_w(4) + wcorr5=orig_w(5) + wcorr6=orig_w(6) + wel_loc=orig_w(7) + wturn3=orig_w(8) + wturn4=orig_w(9) + wturn6=orig_w(10) + wang=orig_w(11) + wtor=orig_w(13) + wtor_d=orig_w(14) + wvdwpp=orig_w(15) + +crc n_fun=n_fun+1 +ct write (iout,*) 'sc_local time= ',MPI_WTIME()-wtime + return + end + +c------------------------------------------------------------- + + subroutine single_sc_move(res_pick,n_maxtry,e_drop, + + n_steps,n_fun,e_sc) +c Perturb one side-chain (res_pick) and minimize the +c neighbouring region, keeping all CA's and non-neighbouring +c side-chains fixed +c Try until e_drop energy improvement is achieved, or n_maxtry +c attempts have been made +c At the start, e_sc should contain the side-chain-only energy(0) +c nsteps and nfun for this move are ADDED to n_steps and n_fun +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.CHAIN' + include 'COMMON.MINIM' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + +c External functions + double precision dist + external dist + +c Input arguments + integer res_pick,n_maxtry + double precision e_drop + +c Input/Output arguments + integer n_steps,n_fun + double precision e_sc + +c Local variables + logical fail + integer i,j + integer nres_moved + integer iretcode,loc_nfun,orig_maxfun,n_try + double precision sc_dist,sc_dist_cutoff + double precision energy(0:n_ene),orig_e,cur_e + double precision evdw,escloc + double precision cur_alph(2:nres-1),cur_omeg(2:nres-1) + double precision var(maxvar) + + double precision orig_theta(1:nres),orig_phi(1:nres), + + orig_alph(1:nres),orig_omeg(1:nres) + + +c Define what is meant by "neighbouring side-chain" + sc_dist_cutoff=5.0D0 + +c Don't do glycine or ends + i=itype(res_pick) + if (i.eq.10 .or. i.eq.21) return + +c Freeze everything (later will relax only selected side-chains) + mask_r=.true. + do i=1,nres + mask_phi(i)=0 + mask_theta(i)=0 + mask_side(i)=0 + enddo + +c Find the neighbours of the side-chain to move +c and save initial variables +crc orig_e=e_sc +crc cur_e=orig_e + nres_moved=0 + do i=2,nres-1 +c Don't do glycine (itype(j)==10) + if (itype(i).ne.10) then + sc_dist=dist(nres+i,nres+res_pick) + else + sc_dist=sc_dist_cutoff + endif + if (sc_dist.lt.sc_dist_cutoff) then + nres_moved=nres_moved+1 + mask_side(i)=1 + cur_alph(i)=alph(i) + cur_omeg(i)=omeg(i) + endif + enddo + + call chainbuild + call egb1(evdw) + call esc(escloc) + e_sc=wsc*evdw+wscloc*escloc +cd call etotal(energy) +cd print *,'new ',(energy(k),k=0,n_ene) + orig_e=e_sc + cur_e=orig_e + + n_try=0 + do while (n_try.lt.n_maxtry .and. orig_e-cur_e.lt.e_drop) +c Move the selected residue (don't worry if it fails) + call gen_side(itype(res_pick),theta(res_pick+1), + + alph(res_pick),omeg(res_pick),fail) + +c Minimize the side-chains starting from the new arrangement + call geom_to_var(nvar,var) + orig_maxfun=maxfun + maxfun=7 + +crc do i=1,nres +crc orig_theta(i)=theta(i) +crc orig_phi(i)=phi(i) +crc orig_alph(i)=alph(i) +crc orig_omeg(i)=omeg(i) +crc enddo + + call minimize_sc1(e_sc,var,iretcode,loc_nfun) + +cv write(*,'(2i3,2f12.5,2i3)') +cv & res_pick,nres_moved,orig_e,e_sc-cur_e, +cv & iretcode,loc_nfun + +c$$$ if (iretcode.eq.8) then +c$$$ write(iout,*)'Coordinates just after code 8' +c$$$ call chainbuild +c$$$ call all_varout +c$$$ call flush(iout) +c$$$ do i=1,nres +c$$$ theta(i)=orig_theta(i) +c$$$ phi(i)=orig_phi(i) +c$$$ alph(i)=orig_alph(i) +c$$$ omeg(i)=orig_omeg(i) +c$$$ enddo +c$$$ write(iout,*)'Coordinates just before code 8' +c$$$ call chainbuild +c$$$ call all_varout +c$$$ call flush(iout) +c$$$ endif + + n_fun=n_fun+loc_nfun + maxfun=orig_maxfun + call var_to_geom(nvar,var) + +c If a lower energy was found, update the current structure... + if (e_sc.lt.cur_e) then +cv call chainbuild +cv call etotal(energy) +cd call egb1(evdw) +cd call esc(escloc) +cd e_sc1=wsc*evdw+wscloc*escloc +cd print *,' new',e_sc1,energy(0) +cv print *,'new ',energy(0) +cd call enerprint(energy(0)) + cur_e=e_sc + do i=2,nres-1 + if (mask_side(i).eq.1) then + cur_alph(i)=alph(i) + cur_omeg(i)=omeg(i) + endif + enddo + else +c ...else revert to the previous one + e_sc=cur_e + do i=2,nres-1 + if (mask_side(i).eq.1) then + alph(i)=cur_alph(i) + omeg(i)=cur_omeg(i) + endif + enddo + endif + n_try=n_try+1 + + enddo + n_steps=n_steps+n_try + +c Reset the minimization mask_r to false + mask_r=.false. + + return + end + +c------------------------------------------------------------- + + subroutine sc_minimize(etot,iretcode,nfun) +c Minimizes side-chains only, leaving backbone frozen +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + +c Output arguments + double precision etot + integer iretcode,nfun + +c Local variables + integer i + double precision orig_w(n_ene),energy(0:n_ene) + double precision var(maxvar) + + +c Set non side-chain weights to zero (minimization is faster) +c NOTE: e(2) does not actually depend on the side-chain, only CA + orig_w(2)=wscp + orig_w(3)=welec + orig_w(4)=wcorr + orig_w(5)=wcorr5 + orig_w(6)=wcorr6 + orig_w(7)=wel_loc + orig_w(8)=wturn3 + orig_w(9)=wturn4 + orig_w(10)=wturn6 + orig_w(11)=wang + orig_w(13)=wtor + orig_w(14)=wtor_d + + wscp=0.D0 + welec=0.D0 + wcorr=0.D0 + wcorr5=0.D0 + wcorr6=0.D0 + wel_loc=0.D0 + wturn3=0.D0 + wturn4=0.D0 + wturn6=0.D0 + wang=0.D0 + wtor=0.D0 + wtor_d=0.D0 + +c Prepare to freeze backbone + do i=1,nres + mask_phi(i)=0 + mask_theta(i)=0 + mask_side(i)=1 + enddo + +c Minimize the side-chains + mask_r=.true. + call geom_to_var(nvar,var) + call minimize(etot,var,iretcode,nfun) + call var_to_geom(nvar,var) + mask_r=.false. + +c Put the original weights back and calculate the full energy + wscp=orig_w(2) + welec=orig_w(3) + wcorr=orig_w(4) + wcorr5=orig_w(5) + wcorr6=orig_w(6) + wel_loc=orig_w(7) + wturn3=orig_w(8) + wturn4=orig_w(9) + wturn6=orig_w(10) + wang=orig_w(11) + wtor=orig_w(13) + wtor_d=orig_w(14) + + call chainbuild + call etotal(energy) + etot=energy(0) + + return + end + +c------------------------------------------------------------- + subroutine minimize_sc1(etot,x,iretcode,nfun) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.MINIM' + common /srutu/ icall + dimension iv(liv) + double precision minval,x(maxvar),d(maxvar),v(1:lv),xx(maxvar) + double precision energia(0:n_ene) + external func,gradient,fdum + external func_restr1,grad_restr1 + logical not_done,change,reduce + common /przechowalnia/ v + + call deflt(2,iv,liv,lv,v) +* 12 means fresh start, dont call deflt + iv(1)=12 +* max num of fun calls + if (maxfun.eq.0) maxfun=500 + iv(17)=maxfun +* max num of iterations + if (maxmin.eq.0) maxmin=1000 + iv(18)=maxmin +* controls output + iv(19)=2 +* selects output unit +c iv(21)=iout + iv(21)=0 +* 1 means to print out result + iv(22)=0 +* 1 means to print out summary stats + iv(23)=0 +* 1 means to print initial x and d + iv(24)=0 +* min val for v(radfac) default is 0.1 + v(24)=0.1D0 +* max val for v(radfac) default is 4.0 + v(25)=2.0D0 +c v(25)=4.0D0 +* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +* the sumsl default is 0.1 + v(26)=0.1D0 +* false conv if (act fnctn decrease) .lt. v(34) +* the sumsl default is 100*machep + v(34)=v(34)/100.0D0 +* absolute convergence + if (tolf.eq.0.0D0) tolf=1.0D-4 + v(31)=tolf +* relative convergence + if (rtolf.eq.0.0D0) rtolf=1.0D-4 + v(32)=rtolf +* controls initial step size + v(35)=1.0D-1 +* large vals of d correspond to small components of step + do i=1,nphi + d(i)=1.0D-1 + enddo + do i=nphi+1,nvar + d(i)=1.0D-1 + enddo + IF (mask_r) THEN + call x2xx(x,xx,nvar_restr) + call sumsl(nvar_restr,d,xx,func_restr1,grad_restr1, + & iv,liv,lv,v,idum,rdum,fdum) + call xx2x(x,xx) + ELSE + call sumsl(nvar,d,x,func,gradient,iv,liv,lv,v,idum,rdum,fdum) + ENDIF + etot=v(10) + iretcode=iv(1) + nfun=iv(6) + + return + end +************************************************************************ + subroutine func_restr1(n,x,nf,f,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + include 'COMMON.INTERACT' + include 'COMMON.TIME1' + common /chuju/ jjj + double precision energia(0:n_ene),evdw,escloc + integer jjj + double precision ufparm,e1,e2 + external ufparm + integer uiparm(1) + real*8 urparm(1) + dimension x(maxvar) + nfl=nf + icg=mod(nf,2)+1 + +#ifdef OSF +c Intercept NaNs in the coordinates, before calling etotal + x_sum=0.D0 + do i=1,n + x_sum=x_sum+x(i) + enddo + FOUND_NAN=.false. + if (x_sum.ne.x_sum) then + write(iout,*)" *** func_restr1 : Found NaN in coordinates" + f=1.0D+73 + FOUND_NAN=.true. + return + endif +#endif + + call var_to_geom_restr(n,x) + call zerograd + call chainbuild +cd write (iout,*) 'ETOTAL called from FUNC' + call egb1(evdw) + call esc(escloc) + f=wsc*evdw+wscloc*escloc +cd call etotal(energia(0)) +cd f=wsc*energia(1)+wscloc*energia(12) +cd print *,f,evdw,escloc,energia(0) +C +C Sum up the components of the Cartesian gradient. +C + do i=1,nct + do j=1,3 + gradx(j,i,icg)=wsc*gvdwx(j,i) + enddo + enddo + + return + end +c------------------------------------------------------- + subroutine grad_restr1(n,x,nf,g,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + external ufparm + integer uiparm(1) + double precision urparm(1) + dimension x(maxvar),g(maxvar) + + icg=mod(nf,2)+1 + if (nf-nfl+1) 20,30,40 + 20 call func_restr1(n,x,nf,f,uiparm,urparm,ufparm) +c write (iout,*) 'grad 20' + if (nf.eq.0) return + goto 40 + 30 call var_to_geom_restr(n,x) + call chainbuild +C +C Evaluate the derivatives of virtual bond lengths and SC vectors in variables. +C + 40 call cartder +C +C Convert the Cartesian gradient into internal-coordinate gradient. +C + + ig=0 + ind=nres-2 + do i=2,nres-2 + IF (mask_phi(i+2).eq.1) THEN + gphii=0.0D0 + do j=i+1,nres-1 + ind=ind+1 + do k=1,3 + gphii=gphii+dcdv(k+3,ind)*gradc(k,j,icg) + gphii=gphii+dxdv(k+3,ind)*gradx(k,j,icg) + enddo + enddo + ig=ig+1 + g(ig)=gphii + ELSE + ind=ind+nres-1-i + ENDIF + enddo + + + ind=0 + do i=1,nres-2 + IF (mask_theta(i+2).eq.1) THEN + ig=ig+1 + gthetai=0.0D0 + do j=i+1,nres-1 + ind=ind+1 + do k=1,3 + gthetai=gthetai+dcdv(k,ind)*gradc(k,j,icg) + gthetai=gthetai+dxdv(k,ind)*gradx(k,j,icg) + enddo + enddo + g(ig)=gthetai + ELSE + ind=ind+nres-1-i + ENDIF + enddo + + do i=2,nres-1 + if (itype(i).ne.10) then + IF (mask_side(i).eq.1) THEN + ig=ig+1 + galphai=0.0D0 + do k=1,3 + galphai=galphai+dxds(k,i)*gradx(k,i,icg) + enddo + g(ig)=galphai + ENDIF + endif + enddo + + + do i=2,nres-1 + if (itype(i).ne.10) then + IF (mask_side(i).eq.1) THEN + ig=ig+1 + gomegai=0.0D0 + do k=1,3 + gomegai=gomegai+dxds(k+3,i)*gradx(k,i,icg) + enddo + g(ig)=gomegai + ENDIF + endif + enddo + +C +C Add the components corresponding to local energy terms. +C + + ig=0 + igall=0 + do i=4,nres + igall=igall+1 + if (mask_phi(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + enddo + + do i=3,nres + igall=igall+1 + if (mask_theta(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + enddo + + do ij=1,2 + do i=2,nres-1 + if (itype(i).ne.10) then + igall=igall+1 + if (mask_side(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + endif + enddo + enddo + +cd do i=1,ig +cd write (iout,'(a2,i5,a3,f25.8)') 'i=',i,' g=',g(i) +cd enddo + return + end +C----------------------------------------------------------------------------- + subroutine egb1(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Gay-Berne potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + include 'COMMON.CONTROL' + logical lprn + evdw=0.0D0 +c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + lprn=.false. +c if (icall.eq.0) lprn=.true. + ind=0 + do i=iatsc_s,iatsc_e + + + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) + dsci_inv=dsc_inv(itypi) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + IF (mask_side(j).eq.1.or.mask_side(i).eq.1) THEN + ind=ind+1 + itypj=itype(j) + dscj_inv=dsc_inv(itypj) + sig0ij=sigma(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) +C For diagnostics only!!! +c chi1=0.0D0 +c chi2=0.0D0 +c chi12=0.0D0 +c chip1=0.0D0 +c chip2=0.0D0 +c chip12=0.0D0 +c alf1=0.0D0 +c alf2=0.0D0 +c alf12=0.0D0 + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) +C Calculate angle-dependent terms of energy and contributions to their +C derivatives. + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+sig0ij +C I hate to put IF's in the loops, but here don't have another choice!!!! + if (rij_shift.le.0.0D0) then + evdw=1.0D20 +cd write (iout,'(2(a3,i3,2x),17(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & rij_shift,1.0D0/rij,sig,sig0ij,sigsq,1-dsqrt(sigsq) + return + endif + sigder=-sig*sigsq +c--------------------------------------------------------------- + rij_shift=1.0D0/rij_shift + fac=rij_shift**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt + evdwij=evdwij*eps2rt*eps3rt + evdw=evdw+evdwij + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),17(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & epsi,sigm,chi1,chi2,chip1,chip2, +cd & eps1,eps2rt**2,eps3rt**2,sig,sig0ij, +cd & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, +cd & evdwij + endif + + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw',i,j,evdwij + +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij)*rij_shift + sigder=fac*sigder + fac=rij*fac +C Calculate the radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate angular part of the gradient. + call sc_grad + ENDIF + enddo ! j + enddo ! iint + enddo ! i + end +C----------------------------------------------------------------------------- diff --git a/source/unres/src_Eshel/sizes.i b/source/unres/src_Eshel/sizes.i new file mode 100644 index 0000000..45c44ff --- /dev/null +++ b/source/unres/src_Eshel/sizes.i @@ -0,0 +1,83 @@ +c +c +c ################################################### +c ## COPYRIGHT (C) 1992 by Jay William Ponder ## +c ## All Rights Reserved ## +c ################################################### +c +c ############################################################# +c ## ## +c ## sizes.i -- parameter values to set array dimensions ## +c ## ## +c ############################################################# +c +c +c "sizes.i" sets values for critical array dimensions used +c throughout the software; these parameters will fix the size +c of the largest systems that can be handled; values too large +c for the computer's memory and/or swap space to accomodate +c will result in poor performance or outright failure +c +c parameter: maximum allowed number of: +c +c maxatm atoms in the molecular system +c maxval atoms directly bonded to an atom +c maxgrp user-defined groups of atoms +c maxtyp force field atom type definitions +c maxclass force field atom class definitions +c maxkey lines in the keyword file +c maxrot bonds for torsional rotation +c maxvar optimization variables (vector storage) +c maxopt optimization variables (matrix storage) +c maxhess off-diagonal Hessian elements +c maxlight sites for method of lights neighbors +c maxvib vibrational frequencies +c maxgeo distance geometry points +c maxcell unit cells in replicated crystal +c maxring 3-, 4-, or 5-membered rings +c maxfix geometric restraints +c maxbio biopolymer atom definitions +c maxres residues in the macromolecule +c maxamino amino acid residue types +c maxnuc nucleic acid residue types +c maxbnd covalent bonds in molecular system +c maxang bond angles in molecular system +c maxtors torsional angles in molecular system +c maxpi atoms in conjugated pisystem +c maxpib covalent bonds involving pisystem +c maxpit torsional angles involving pisystem +c +c + integer maxatm,maxval,maxgrp + integer maxtyp,maxclass,maxkey + integer maxrot,maxopt + integer maxhess,maxlight,maxvib + integer maxgeo,maxcell,maxring + integer maxfix,maxbio + integer maxamino,maxnuc,maxbnd + integer maxang,maxtors,maxpi + integer maxpib,maxpit + parameter (maxatm=maxres2) + parameter (maxval=8) + parameter (maxgrp=1000) + parameter (maxtyp=3000) + parameter (maxclass=500) + parameter (maxkey=10000) + parameter (maxrot=1000) + parameter (maxopt=1000) + parameter (maxhess=1000000) + parameter (maxlight=8*maxatm) + parameter (maxvib=1000) + parameter (maxgeo=1000) + parameter (maxcell=10000) + parameter (maxring=10000) + parameter (maxfix=10000) + parameter (maxbio=10000) + parameter (maxamino=31) + parameter (maxnuc=12) + parameter (maxbnd=2*maxatm) + parameter (maxang=3*maxatm) + parameter (maxtors=4*maxatm) + parameter (maxpi=100) + parameter (maxpib=2*maxpi) + parameter (maxpit=4*maxpi) diff --git a/source/unres/src_Eshel/sumsld.f b/source/unres/src_Eshel/sumsld.f new file mode 100644 index 0000000..1ce7b78 --- /dev/null +++ b/source/unres/src_Eshel/sumsld.f @@ -0,0 +1,1446 @@ + subroutine sumsl(n, d, x, calcf, calcg, iv, liv, lv, v, + 1 uiparm, urparm, ufparm) +c +c *** minimize general unconstrained objective function using *** +c *** analytic gradient and hessian approx. from secant update *** +c + integer n, liv, lv + integer iv(liv), uiparm(1) + double precision d(n), x(n), v(lv), urparm(1) +c dimension v(71 + n*(n+15)/2), uiparm(*), urparm(*) + external calcf, calcg, ufparm +c +c *** purpose *** +c +c this routine interacts with subroutine sumit in an attempt +c to find an n-vector x* that minimizes the (unconstrained) +c objective function computed by calcf. (often the x* found is +c a local minimizer rather than a global one.) +c +c-------------------------- parameter usage -------------------------- +c +c n........ (input) the number of variables on which f depends, i.e., +c the number of components in x. +c d........ (input/output) a scale vector such that d(i)*x(i), +c i = 1,2,...,n, are all in comparable units. +c d can strongly affect the behavior of sumsl. +c finding the best choice of d is generally a trial- +c and-error process. choosing d so that d(i)*x(i) +c has about the same value for all i often works well. +c the defaults provided by subroutine deflt (see i +c below) require the caller to supply d. +c x........ (input/output) before (initially) calling sumsl, the call- +c er should set x to an initial guess at x*. when +c sumsl returns, x contains the best point so far +c found, i.e., the one that gives the least value so +c far seen for f(x). +c calcf.... (input) a subroutine that, given x, computes f(x). calcf +c must be declared external in the calling program. +c it is invoked by +c call calcf(n, x, nf, f, uiparm, urparm, ufparm) +c when calcf is called, nf is the invocation +c count for calcf. nf is included for possible use +c with calcg. if x is out of bounds (e.g., if it +c would cause overflow in computing f(x)), then calcf +c should set nf to 0. this will cause a shorter step +c to be attempted. (if x is in bounds, then calcf +c should not change nf.) the other parameters are as +c described above and below. calcf should not change +c n, p, or x. +c calcg.... (input) a subroutine that, given x, computes g(x), the gra- +c dient of f at x. calcg must be declared external in +c the calling program. it is invoked by +c call calcg(n, x, nf, g, uiparm, urparm, ufaprm) +c when calcg is called, nf is the invocation +c count for calcf at the time f(x) was evaluated. the +c x passed to calcg is usually the one passed to calcf +c on either its most recent invocation or the one +c prior to it. if calcf saves intermediate results +c for use by calcg, then it is possible to tell from +c nf whether they are valid for the current x (or +c which copy is valid if two copies are kept). if g +c cannot be computed at x, then calcg should set nf to +c 0. in this case, sumsl will return with iv(1) = 65. +c (if g can be computed at x, then calcg should not +c changed nf.) the other parameters to calcg are as +c described above and below. calcg should not change +c n or x. +c iv....... (input/output) an integer value array of length liv (see +c below) that helps control the sumsl algorithm and +c that is used to store various intermediate quanti- +c ties. of particular interest are the initialization/ +c return code iv(1) and the entries in iv that control +c printing and limit the number of iterations and func- +c tion evaluations. see the section on iv input +c values below. +c liv...... (input) length of iv array. must be at least 60. if li +c is too small, then sumsl returns with iv(1) = 15. +c when sumsl returns, the smallest allowed value of +c liv is stored in iv(lastiv) -- see the section on +c iv output values below. (this is intended for use +c with extensions of sumsl that handle constraints.) +c lv....... (input) length of v array. must be at least 71+n*(n+15)/2. +c (at least 77+n*(n+17)/2 for smsno, at least +c 78+n*(n+12) for humsl). if lv is too small, then +c sumsl returns with iv(1) = 16. when sumsl returns, +c the smallest allowed value of lv is stored in +c iv(lastv) -- see the section on iv output values +c below. +c v........ (input/output) a floating-point value array of length l +c (see below) that helps control the sumsl algorithm +c and that is used to store various intermediate +c quantities. of particular interest are the entries +c in v that limit the length of the first step +c attempted (lmax0) and specify convergence tolerances +c (afctol, lmaxs, rfctol, sctol, xctol, xftol). +c uiparm... (input) user integer parameter array passed without change +c to calcf and calcg. +c urparm... (input) user floating-point parameter array passed without +c change to calcf and calcg. +c ufparm... (input) user external subroutine or function passed without +c change to calcf and calcg. +c +c *** iv input values (from subroutine deflt) *** +c +c iv(1)... on input, iv(1) should have a value between 0 and 14...... +c 0 and 12 mean this is a fresh start. 0 means that +c deflt(2, iv, liv, lv, v) +c is to be called to provide all default values to iv and +c v. 12 (the value that deflt assigns to iv(1)) means the +c caller has already called deflt and has possibly changed +c some iv and/or v entries to non-default values. +c 13 means deflt has been called and that sumsl (and +c sumit) should only do their storage allocation. that is, +c they should set the output components of iv that tell +c where various subarrays arrays of v begin, such as iv(g) +c (and, for humsl and humit only, iv(dtol)), and return. +c 14 means that a storage has been allocated (by a call +c with iv(1) = 13) and that the algorithm should be +c started. when called with iv(1) = 13, sumsl returns +c iv(1) = 14 unless liv or lv is too small (or n is not +c positive). default = 12. +c iv(inith).... iv(25) tells whether the hessian approximation h should +c be initialized. 1 (the default) means sumit should +c initialize h to the diagonal matrix whose i-th diagonal +c element is d(i)**2. 0 means the caller has supplied a +c cholesky factor l of the initial hessian approximation +c h = l*(l**t) in v, starting at v(iv(lmat)) = v(iv(42)) +c (and stored compactly by rows). note that iv(lmat) may +c be initialized by calling sumsl with iv(1) = 13 (see +c the iv(1) discussion above). default = 1. +c iv(mxfcal)... iv(17) gives the maximum number of function evaluations +c (calls on calcf) allowed. if this number does not suf- +c fice, then sumsl returns with iv(1) = 9. default = 200. +c iv(mxiter)... iv(18) gives the maximum number of iterations allowed. +c it also indirectly limits the number of gradient evalua- +c tions (calls on calcg) to iv(mxiter) + 1. if iv(mxiter) +c iterations do not suffice, then sumsl returns with +c iv(1) = 10. default = 150. +c iv(outlev)... iv(19) controls the number and length of iteration sum- +c mary lines printed (by itsum). iv(outlev) = 0 means do +c not print any summary lines. otherwise, print a summary +c line after each abs(iv(outlev)) iterations. if iv(outlev) +c is positive, then summary lines of length 78 (plus carri- +c age control) are printed, including the following... the +c iteration and function evaluation counts, f = the current +c function value, relative difference in function values +c achieved by the latest step (i.e., reldf = (f0-v(f))/f01, +c where f01 is the maximum of abs(v(f)) and abs(v(f0)) and +c v(f0) is the function value from the previous itera- +c tion), the relative function reduction predicted for the +c step just taken (i.e., preldf = v(preduc) / f01, where +c v(preduc) is described below), the scaled relative change +c in x (see v(reldx) below), the step parameter for the +c step just taken (stppar = 0 means a full newton step, +c between 0 and 1 means a relaxed newton step, between 1 +c and 2 means a double dogleg step, greater than 2 means +c a scaled down cauchy step -- see subroutine dbldog), the +c 2-norm of the scale vector d times the step just taken +c (see v(dstnrm) below), and npreldf, i.e., +c v(nreduc)/f01, where v(nreduc) is described below -- if +c npreldf is positive, then it is the relative function +c reduction predicted for a newton step (one with +c stppar = 0). if npreldf is negative, then it is the +c negative of the relative function reduction predicted +c for a step computed with step bound v(lmaxs) for use in +c testing for singular convergence. +c if iv(outlev) is negative, then lines of length 50 +c are printed, including only the first 6 items listed +c above (through reldx). +c default = 1. +c iv(parprt)... iv(20) = 1 means print any nondefault v values on a +c fresh start or any changed v values on a restart. +c iv(parprt) = 0 means skip this printing. default = 1. +c iv(prunit)... iv(21) is the output unit number on which all printing +c is done. iv(prunit) = 0 means suppress all printing. +c default = standard output unit (unit 6 on most systems). +c iv(solprt)... iv(22) = 1 means print out the value of x returned (as +c well as the gradient and the scale vector d). +c iv(solprt) = 0 means skip this printing. default = 1. +c iv(statpr)... iv(23) = 1 means print summary statistics upon return- +c ing. these consist of the function value, the scaled +c relative change in x caused by the most recent step (see +c v(reldx) below), the number of function and gradient +c evaluations (calls on calcf and calcg), and the relative +c function reductions predicted for the last step taken and +c for a newton step (or perhaps a step bounded by v(lmaxs) +c -- see the descriptions of preldf and npreldf under +c iv(outlev) above). +c iv(statpr) = 0 means skip this printing. +c iv(statpr) = -1 means skip this printing as well as that +c of the one-line termination reason message. default = 1. +c iv(x0prt).... iv(24) = 1 means print the initial x and scale vector d +c (on a fresh start only). iv(x0prt) = 0 means skip this +c printing. default = 1. +c +c *** (selected) iv output values *** +c +c iv(1)........ on output, iv(1) is a return code.... +c 3 = x-convergence. the scaled relative difference (see +c v(reldx)) between the current parameter vector x and +c a locally optimal parameter vector is very likely at +c most v(xctol). +c 4 = relative function convergence. the relative differ- +c ence between the current function value and its lo- +c cally optimal value is very likely at most v(rfctol). +c 5 = both x- and relative function convergence (i.e., the +c conditions for iv(1) = 3 and iv(1) = 4 both hold). +c 6 = absolute function convergence. the current function +c value is at most v(afctol) in absolute value. +c 7 = singular convergence. the hessian near the current +c iterate appears to be singular or nearly so, and a +c step of length at most v(lmaxs) is unlikely to yield +c a relative function decrease of more than v(sctol). +c 8 = false convergence. the iterates appear to be converg- +c ing to a noncritical point. this may mean that the +c convergence tolerances (v(afctol), v(rfctol), +c v(xctol)) are too small for the accuracy to which +c the function and gradient are being computed, that +c there is an error in computing the gradient, or that +c the function or gradient is discontinuous near x. +c 9 = function evaluation limit reached without other con- +c vergence (see iv(mxfcal)). +c 10 = iteration limit reached without other convergence +c (see iv(mxiter)). +c 11 = stopx returned .true. (external interrupt). see the +c usage notes below. +c 14 = storage has been allocated (after a call with +c iv(1) = 13). +c 17 = restart attempted with n changed. +c 18 = d has a negative component and iv(dtype) .le. 0. +c 19...43 = v(iv(1)) is out of range. +c 63 = f(x) cannot be computed at the initial x. +c 64 = bad parameters passed to assess (which should not +c occur). +c 65 = the gradient could not be computed at x (see calcg +c above). +c 67 = bad first parameter to deflt. +c 80 = iv(1) was out of range. +c 81 = n is not positive. +c iv(g)........ iv(28) is the starting subscript in v of the current +c gradient vector (the one corresponding to x). +c iv(lastiv)... iv(44) is the least acceptable value of liv. (it is +c only set if liv is at least 44.) +c iv(lastv).... iv(45) is the least acceptable value of lv. (it is +c only set if liv is large enough, at least iv(lastiv).) +c iv(nfcall)... iv(6) is the number of calls so far made on calcf (i.e., +c function evaluations). +c iv(ngcall)... iv(30) is the number of gradient evaluations (calls on +c calcg). +c iv(niter).... iv(31) is the number of iterations performed. +c +c *** (selected) v input values (from subroutine deflt) *** +c +c v(bias)..... v(43) is the bias parameter used in subroutine dbldog -- +c see that subroutine for details. default = 0.8. +c v(afctol)... v(31) is the absolute function convergence tolerance. +c if sumsl finds a point where the function value is less +c than v(afctol) in absolute value, and if sumsl does not +c return with iv(1) = 3, 4, or 5, then it returns with +c iv(1) = 6. this test can be turned off by setting +c v(afctol) to zero. default = max(10**-20, machep**2), +c where machep is the unit roundoff. +c v(dinit).... v(38), if nonnegative, is the value to which the scale +c vector d is initialized. default = -1. +c v(lmax0).... v(35) gives the maximum 2-norm allowed for d times the +c very first step that sumsl attempts. this parameter can +c markedly affect the performance of sumsl. +c v(lmaxs).... v(36) is used in testing for singular convergence -- if +c the function reduction predicted for a step of length +c bounded by v(lmaxs) is at most v(sctol) * abs(f0), where +c f0 is the function value at the start of the current +c iteration, and if sumsl does not return with iv(1) = 3, +c 4, 5, or 6, then it returns with iv(1) = 7. default = 1. +c v(rfctol)... v(32) is the relative function convergence tolerance. +c if the current model predicts a maximum possible function +c reduction (see v(nreduc)) of at most v(rfctol)*abs(f0) +c at the start of the current iteration, where f0 is the +c then current function value, and if the last step attempt- +c ed achieved no more than twice the predicted function +c decrease, then sumsl returns with iv(1) = 4 (or 5). +c default = max(10**-10, machep**(2/3)), where machep is +c the unit roundoff. +c v(sctol).... v(37) is the singular convergence tolerance -- see the +c description of v(lmaxs) above. +c v(tuner1)... v(26) helps decide when to check for false convergence. +c this is done if the actual function decrease from the +c current step is no more than v(tuner1) times its predict- +c ed value. default = 0.1. +c v(xctol).... v(33) is the x-convergence tolerance. if a newton step +c (see v(nreduc)) is tried that has v(reldx) .le. v(xctol) +c and if this step yields at most twice the predicted func- +c tion decrease, then sumsl returns with iv(1) = 3 (or 5). +c (see the description of v(reldx) below.) +c default = machep**0.5, where machep is the unit roundoff. +c v(xftol).... v(34) is the false convergence tolerance. if a step is +c tried that gives no more than v(tuner1) times the predict- +c ed function decrease and that has v(reldx) .le. v(xftol), +c and if sumsl does not return with iv(1) = 3, 4, 5, 6, or +c 7, then it returns with iv(1) = 8. (see the description +c of v(reldx) below.) default = 100*machep, where +c machep is the unit roundoff. +c v(*)........ deflt supplies to v a number of tuning constants, with +c which it should ordinarily be unnecessary to tinker. see +c section 17 of version 2.2 of the nl2sol usage summary +c (i.e., the appendix to ref. 1) for details on v(i), +c i = decfac, incfac, phmnfc, phmxfc, rdfcmn, rdfcmx, +c tuner2, tuner3, tuner4, tuner5. +c +c *** (selected) v output values *** +c +c v(dgnorm)... v(1) is the 2-norm of (diag(d)**-1)*g, where g is the +c most recently computed gradient. +c v(dstnrm)... v(2) is the 2-norm of diag(d)*step, where step is the +c current step. +c v(f)........ v(10) is the current function value. +c v(f0)....... v(13) is the function value at the start of the current +c iteration. +c v(nreduc)... v(6), if positive, is the maximum function reduction +c possible according to the current model, i.e., the func- +c tion reduction predicted for a newton step (i.e., +c step = -h**-1 * g, where g is the current gradient and +c h is the current hessian approximation). +c if v(nreduc) is negative, then it is the negative of +c the function reduction predicted for a step computed with +c a step bound of v(lmaxs) for use in testing for singular +c convergence. +c v(preduc)... v(7) is the function reduction predicted (by the current +c quadratic model) for the current step. this (divided by +c v(f0)) is used in testing for relative function +c convergence. +c v(reldx).... v(17) is the scaled relative change in x caused by the +c current step, computed as +c max(abs(d(i)*(x(i)-x0(i)), 1 .le. i .le. p) / +c max(d(i)*(abs(x(i))+abs(x0(i))), 1 .le. i .le. p), +c where x = x0 + step. +c +c------------------------------- notes ------------------------------- +c +c *** algorithm notes *** +c +c this routine uses a hessian approximation computed from the +c bfgs update (see ref 3). only a cholesky factor of the hessian +c approximation is stored, and this is updated using ideas from +c ref. 4. steps are computed by the double dogleg scheme described +c in ref. 2. the steps are assessed as in ref. 1. +c +c *** usage notes *** +c +c after a return with iv(1) .le. 11, it is possible to restart, +c i.e., to change some of the iv and v input values described above +c and continue the algorithm from the point where it was interrupt- +c ed. iv(1) should not be changed, nor should any entries of i +c and v other than the input values (those supplied by deflt). +c those who do not wish to write a calcg which computes the +c gradient analytically should call smsno rather than sumsl. +c smsno uses finite differences to compute an approximate gradient. +c those who would prefer to provide f and g (the function and +c gradient) by reverse communication rather than by writing subrou- +c tines calcf and calcg may call on sumit directly. see the com- +c ments at the beginning of sumit. +c those who use sumsl interactively may wish to supply their +c own stopx function, which should return .true. if the break key +c has been pressed since stopx was last invoked. this makes it +c possible to externally interrupt sumsl (which will return with +c iv(1) = 11 if stopx returns .true.). +c storage for g is allocated at the end of v. thus the caller +c may make v longer than specified above and may allow calcg to use +c elements of g beyond the first n as scratch storage. +c +c *** portability notes *** +c +c the sumsl distribution tape contains both single- and double- +c precision versions of the sumsl source code, so it should be un- +c necessary to change precisions. +c only the functions imdcon and rmdcon contain machine-dependent +c constants. to change from one machine to another, it should +c suffice to change the (few) relevant lines in these functions. +c intrinsic functions are explicitly declared. on certain com- +c puters (e.g. univac), it may be necessary to comment out these +c declarations. so that this may be done automatically by a simple +c program, such declarations are preceded by a comment having c/+ +c in columns 1-3 and blanks in columns 4-72 and are followed by +c a comment having c/ in columns 1 and 2 and blanks in columns 3-72. +c the sumsl source code is expressed in 1966 ansi standard +c fortran. it may be converted to fortran 77 by commenting out all +c lines that fall between a line having c/6 in columns 1-3 and a +c line having c/7 in columns 1-3 and by removing (i.e., replacing +c by a blank) the c in column 1 of the lines that follow the c/7 +c line and precede a line having c/ in columns 1-2 and blanks in +c columns 3-72. these changes convert some data statements into +c parameter statements, convert some variables from real to +c character*4, and make the data statements that initialize these +c variables use character strings delimited by primes instead +c of hollerith constants. (such variables and data statements +c appear only in modules itsum and parck. parameter statements +c appear nearly everywhere.) these changes also add save state- +c ments for variables given machine-dependent constants by rmdcon. +c +c *** references *** +c +c 1. dennis, j.e., gay, d.m., and welsch, r.e. (1981), algorithm 573 -- +c an adaptive nonlinear least-squares algorithm, acm trans. +c math. software 7, pp. 369-383. +c +c 2. dennis, j.e., and mei, h.h.w. (1979), two new unconstrained opti- +c mization algorithms which use function and gradient +c values, j. optim. theory applic. 28, pp. 453-482. +c +c 3. dennis, j.e., and more, j.j. (1977), quasi-newton methods, motiva- +c tion and theory, siam rev. 19, pp. 46-89. +c +c 4. goldfarb, d. (1976), factorized variable metric methods for uncon- +c strained optimization, math. comput. 30, pp. 796-811. +c +c *** general *** +c +c coded by david m. gay (winter 1980). revised summer 1982. +c this subroutine was written in connection with research +c supported in part by the national science foundation under +c grants mcs-7600324, dcr75-10143, 76-14311dss, mcs76-11989, +c and mcs-7906671. +c. +c +c---------------------------- declarations --------------------------- +c + external deflt, sumit +c +c deflt... supplies default iv and v input components. +c sumit... reverse-communication routine that carries out sumsl algo- +c rithm. +c + integer g1, iv1, nf + double precision f +c +c *** subscripts for iv *** +c + integer nextv, nfcall, nfgcal, g, toobig, vneed +c +c/6 +c data nextv/47/, nfcall/6/, nfgcal/7/, g/28/, toobig/2/, vneed/4/ +c/7 + parameter (nextv=47, nfcall=6, nfgcal=7, g=28, toobig=2, vneed=4) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + iv1 = iv(1) + if (iv1 .eq. 12 .or. iv1 .eq. 13) iv(vneed) = iv(vneed) + n + if (iv1 .eq. 14) go to 10 + if (iv1 .gt. 2 .and. iv1 .lt. 12) go to 10 + g1 = 1 + if (iv1 .eq. 12) iv(1) = 13 + go to 20 +c + 10 g1 = iv(g) +c + 20 call sumit(d, f, v(g1), iv, liv, lv, n, v, x) + if (iv(1) - 2) 30, 40, 50 +c + 30 nf = iv(nfcall) + call calcf(n, x, nf, f, uiparm, urparm, ufparm) + if (nf .le. 0) iv(toobig) = 1 + go to 20 +c + 40 call calcg(n, x, iv(nfgcal), v(g1), uiparm, urparm, ufparm) + go to 20 +c + 50 if (iv(1) .ne. 14) go to 999 +c +c *** storage allocation +c + iv(g) = iv(nextv) + iv(nextv) = iv(g) + n + if (iv1 .ne. 13) go to 10 +c + 999 return +c *** last card of sumsl follows *** + end + subroutine sumit(d, fx, g, iv, liv, lv, n, v, x) +c +c *** carry out sumsl (unconstrained minimization) iterations, using +c *** double-dogleg/bfgs steps. +c +c *** parameter declarations *** +c + integer liv, lv, n + integer iv(liv) + double precision d(n), fx, g(n), v(lv), x(n) +c +c-------------------------- parameter usage -------------------------- +c +c d.... scale vector. +c fx... function value. +c g.... gradient vector. +c iv... integer value array. +c liv.. length of iv (at least 60). +c lv... length of v (at least 71 + n*(n+13)/2). +c n.... number of variables (components in x and g). +c v.... floating-point value array. +c x.... vector of parameters to be optimized. +c +c *** discussion *** +c +c parameters iv, n, v, and x are the same as the corresponding +c ones to sumsl (which see), except that v can be shorter (since +c the part of v that sumsl uses for storing g is not needed). +c moreover, compared with sumsl, iv(1) may have the two additional +c output values 1 and 2, which are explained below, as is the use +c of iv(toobig) and iv(nfgcal). the value iv(g), which is an +c output value from sumsl (and smsno), is not referenced by +c sumit or the subroutines it calls. +c fx and g need not have been initialized when sumit is called +c with iv(1) = 12, 13, or 14. +c +c iv(1) = 1 means the caller should set fx to f(x), the function value +c at x, and call sumit again, having changed none of the +c other parameters. an exception occurs if f(x) cannot be +c (e.g. if overflow would occur), which may happen because +c of an oversized step. in this case the caller should set +c iv(toobig) = iv(2) to 1, which will cause sumit to ig- +c nore fx and try a smaller step. the parameter nf that +c sumsl passes to calcf (for possible use by calcg) is a +c copy of iv(nfcall) = iv(6). +c iv(1) = 2 means the caller should set g to g(x), the gradient vector +c of f at x, and call sumit again, having changed none of +c the other parameters except possibly the scale vector d +c when iv(dtype) = 0. the parameter nf that sumsl passes +c to calcg is iv(nfgcal) = iv(7). if g(x) cannot be +c evaluated, then the caller may set iv(nfgcal) to 0, in +c which case sumit will return with iv(1) = 65. +c. +c *** general *** +c +c coded by david m. gay (december 1979). revised sept. 1982. +c this subroutine was written in connection with research supported +c in part by the national science foundation under grants +c mcs-7600324 and mcs-7906671. +c +c (see sumsl for references.) +c +c+++++++++++++++++++++++++++ declarations ++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer dg1, dummy, g01, i, k, l, lstgst, nwtst1, step1, + 1 temp1, w, x01, z + double precision t +c +c *** constants *** +c + double precision half, negone, one, onep2, zero +c +c *** no intrinsic functions *** +c +c *** external functions and subroutines *** +c + external assst, dbdog, deflt, dotprd, itsum, litvmu, livmul, + 1 ltvmul, lupdat, lvmul, parck, reldst, stopx, vaxpy, + 2 vcopy, vscopy, vvmulp, v2norm, wzbfgs + logical stopx + double precision dotprd, reldst, v2norm +c +c assst.... assesses candidate step. +c dbdog.... computes double-dogleg (candidate) step. +c deflt.... supplies default iv and v input components. +c dotprd... returns inner product of two vectors. +c itsum.... prints iteration summary and info on initial and final x. +c litvmu... multiplies inverse transpose of lower triangle times vector. +c livmul... multiplies inverse of lower triangle times vector. +c ltvmul... multiplies transpose of lower triangle times vector. +c lupdt.... updates cholesky factor of hessian approximation. +c lvmul.... multiplies lower triangle times vector. +c parck.... checks validity of input iv and v values. +c reldst... computes v(reldx) = relative step size. +c stopx.... returns .true. if the break key has been pressed. +c vaxpy.... computes scalar times one vector plus another. +c vcopy.... copies one vector to another. +c vscopy... sets all elements of a vector to a scalar. +c vvmulp... multiplies vector by vector raised to power (componentwise). +c v2norm... returns the 2-norm of a vector. +c wzbfgs... computes w and z for lupdat corresponding to bfgs update. +c +c *** subscripts for iv and v *** +c + integer afctol + integer cnvcod, dg, dgnorm, dinit, dstnrm, dst0, f, f0, fdif, + 1 gthg, gtstep, g0, incfac, inith, irc, kagqt, lmat, lmax0, + 2 lmaxs, mode, model, mxfcal, mxiter, nextv, nfcall, nfgcal, + 3 ngcall, niter, nreduc, nwtstp, preduc, radfac, radinc, + 4 radius, rad0, reldx, restor, step, stglim, stlstg, toobig, + 5 tuner4, tuner5, vneed, xirc, x0 +c +c *** iv subscript values *** +c +c/6 +c data cnvcod/55/, dg/37/, g0/48/, inith/25/, irc/29/, kagqt/33/, +c 1 mode/35/, model/5/, mxfcal/17/, mxiter/18/, nfcall/6/, +c 2 nfgcal/7/, ngcall/30/, niter/31/, nwtstp/34/, radinc/8/, +c 3 restor/9/, step/40/, stglim/11/, stlstg/41/, toobig/2/, +c 4 vneed/4/, xirc/13/, x0/43/ +c/7 + parameter (cnvcod=55, dg=37, g0=48, inith=25, irc=29, kagqt=33, + 1 mode=35, model=5, mxfcal=17, mxiter=18, nfcall=6, + 2 nfgcal=7, ngcall=30, niter=31, nwtstp=34, radinc=8, + 3 restor=9, step=40, stglim=11, stlstg=41, toobig=2, + 4 vneed=4, xirc=13, x0=43) +c/ +c +c *** v subscript values *** +c +c/6 +c data afctol/31/ +c data dgnorm/1/, dinit/38/, dstnrm/2/, dst0/3/, f/10/, f0/13/, +c 1 fdif/11/, gthg/44/, gtstep/4/, incfac/23/, lmat/42/, +c 2 lmax0/35/, lmaxs/36/, nextv/47/, nreduc/6/, preduc/7/, +c 3 radfac/16/, radius/8/, rad0/9/, reldx/17/, tuner4/29/, +c 4 tuner5/30/ +c/7 + parameter (afctol=31) + parameter (dgnorm=1, dinit=38, dstnrm=2, dst0=3, f=10, f0=13, + 1 fdif=11, gthg=44, gtstep=4, incfac=23, lmat=42, + 2 lmax0=35, lmaxs=36, nextv=47, nreduc=6, preduc=7, + 3 radfac=16, radius=8, rad0=9, reldx=17, tuner4=29, + 4 tuner5=30) +c/ +c +c/6 +c data half/0.5d+0/, negone/-1.d+0/, one/1.d+0/, onep2/1.2d+0/, +c 1 zero/0.d+0/ +c/7 + parameter (half=0.5d+0, negone=-1.d+0, one=1.d+0, onep2=1.2d+0, + 1 zero=0.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c +C Following SAVE statement inserted. + save l + i = iv(1) + if (i .eq. 1) go to 50 + if (i .eq. 2) go to 60 +c +c *** check validity of iv and v input values *** +c + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + if (iv(1) .eq. 12 .or. iv(1) .eq. 13) + 1 iv(vneed) = iv(vneed) + n*(n+13)/2 + call parck(2, d, iv, liv, lv, n, v) + i = iv(1) - 2 + if (i .gt. 12) go to 999 + go to (180, 180, 180, 180, 180, 180, 120, 90, 120, 10, 10, 20), i +c +c *** storage allocation *** +c +10 l = iv(lmat) + iv(x0) = l + n*(n+1)/2 + iv(step) = iv(x0) + n + iv(stlstg) = iv(step) + n + iv(g0) = iv(stlstg) + n + iv(nwtstp) = iv(g0) + n + iv(dg) = iv(nwtstp) + n + iv(nextv) = iv(dg) + n + if (iv(1) .ne. 13) go to 20 + iv(1) = 14 + go to 999 +c +c *** initialization *** +c + 20 iv(niter) = 0 + iv(nfcall) = 1 + iv(ngcall) = 1 + iv(nfgcal) = 1 + iv(mode) = -1 + iv(model) = 1 + iv(stglim) = 1 + iv(toobig) = 0 + iv(cnvcod) = 0 + iv(radinc) = 0 + v(rad0) = zero + if (v(dinit) .ge. zero) call vscopy(n, d, v(dinit)) + if (iv(inith) .ne. 1) go to 40 +c +c *** set the initial hessian approximation to diag(d)**-2 *** +c + l = iv(lmat) + call vscopy(n*(n+1)/2, v(l), zero) + k = l - 1 + do 30 i = 1, n + k = k + i + t = d(i) + if (t .le. zero) t = one + v(k) = t + 30 continue +c +c *** compute initial function value *** +c + 40 iv(1) = 1 + go to 999 +c + 50 v(f) = fx + if (iv(mode) .ge. 0) go to 180 + iv(1) = 2 + if (iv(toobig) .eq. 0) go to 999 + iv(1) = 63 + go to 300 +c +c *** make sure gradient could be computed *** +c + 60 if (iv(nfgcal) .ne. 0) go to 70 + iv(1) = 65 + go to 300 +c + 70 dg1 = iv(dg) + call vvmulp(n, v(dg1), g, d, -1) + v(dgnorm) = v2norm(n, v(dg1)) +c +c *** test norm of gradient *** +c + if (v(dgnorm) .gt. v(afctol)) go to 75 + iv(irc) = 10 + iv(cnvcod) = iv(irc) - 4 +c + 75 if (iv(cnvcod) .ne. 0) go to 290 + if (iv(mode) .eq. 0) go to 250 +c +c *** allow first step to have scaled 2-norm at most v(lmax0) *** +c + v(radius) = v(lmax0) +c + iv(mode) = 0 +c +c +c----------------------------- main loop ----------------------------- +c +c +c *** print iteration summary, check iteration limit *** +c + 80 call itsum(d, g, iv, liv, lv, n, v, x) + 90 k = iv(niter) + if (k .lt. iv(mxiter)) go to 100 + iv(1) = 10 + go to 300 +c +c *** update radius *** +c + 100 iv(niter) = k + 1 + if(k.gt.0)v(radius) = v(radfac) * v(dstnrm) +c +c *** initialize for start of next iteration *** +c + g01 = iv(g0) + x01 = iv(x0) + v(f0) = v(f) + iv(irc) = 4 + iv(kagqt) = -1 +c +c *** copy x to x0, g to g0 *** +c + call vcopy(n, v(x01), x) + call vcopy(n, v(g01), g) +c +c *** check stopx and function evaluation limit *** +c +C AL 4/30/95 + dummy=iv(nfcall) + 110 if (.not. stopx(dummy)) go to 130 + iv(1) = 11 + go to 140 +c +c *** come here when restarting after func. eval. limit or stopx. +c + 120 if (v(f) .ge. v(f0)) go to 130 + v(radfac) = one + k = iv(niter) + go to 100 +c + 130 if (iv(nfcall) .lt. iv(mxfcal)) go to 150 + iv(1) = 9 + 140 if (v(f) .ge. v(f0)) go to 300 +c +c *** in case of stopx or function evaluation limit with +c *** improved v(f), evaluate the gradient at x. +c + iv(cnvcod) = iv(1) + go to 240 +c +c. . . . . . . . . . . . . compute candidate step . . . . . . . . . . +c + 150 step1 = iv(step) + dg1 = iv(dg) + nwtst1 = iv(nwtstp) + if (iv(kagqt) .ge. 0) go to 160 + l = iv(lmat) + call livmul(n, v(nwtst1), v(l), g) + v(nreduc) = half * dotprd(n, v(nwtst1), v(nwtst1)) + call litvmu(n, v(nwtst1), v(l), v(nwtst1)) + call vvmulp(n, v(step1), v(nwtst1), d, 1) + v(dst0) = v2norm(n, v(step1)) + call vvmulp(n, v(dg1), v(dg1), d, -1) + call ltvmul(n, v(step1), v(l), v(dg1)) + v(gthg) = v2norm(n, v(step1)) + iv(kagqt) = 0 + 160 call dbdog(v(dg1), lv, n, v(nwtst1), v(step1), v) + if (iv(irc) .eq. 6) go to 180 +c +c *** check whether evaluating f(x0 + step) looks worthwhile *** +c + if (v(dstnrm) .le. zero) go to 180 + if (iv(irc) .ne. 5) go to 170 + if (v(radfac) .le. one) go to 170 + if (v(preduc) .le. onep2 * v(fdif)) go to 180 +c +c *** compute f(x0 + step) *** +c + 170 x01 = iv(x0) + step1 = iv(step) + call vaxpy(n, x, one, v(step1), v(x01)) + iv(nfcall) = iv(nfcall) + 1 + iv(1) = 1 + iv(toobig) = 0 + go to 999 +c +c. . . . . . . . . . . . . assess candidate step . . . . . . . . . . . +c + 180 x01 = iv(x0) + v(reldx) = reldst(n, d, x, v(x01)) + call assst(iv, liv, lv, v) + step1 = iv(step) + lstgst = iv(stlstg) + if (iv(restor) .eq. 1) call vcopy(n, x, v(x01)) + if (iv(restor) .eq. 2) call vcopy(n, v(lstgst), v(step1)) + if (iv(restor) .ne. 3) go to 190 + call vcopy(n, v(step1), v(lstgst)) + call vaxpy(n, x, one, v(step1), v(x01)) + v(reldx) = reldst(n, d, x, v(x01)) +c + 190 k = iv(irc) + go to (200,230,230,230,200,210,220,220,220,220,220,220,280,250), k +c +c *** recompute step with changed radius *** +c + 200 v(radius) = v(radfac) * v(dstnrm) + go to 110 +c +c *** compute step of length v(lmaxs) for singular convergence test. +c + 210 v(radius) = v(lmaxs) + go to 150 +c +c *** convergence or false convergence *** +c + 220 iv(cnvcod) = k - 4 + if (v(f) .ge. v(f0)) go to 290 + if (iv(xirc) .eq. 14) go to 290 + iv(xirc) = 14 +c +c. . . . . . . . . . . . process acceptable step . . . . . . . . . . . +c + 230 if (iv(irc) .ne. 3) go to 240 + step1 = iv(step) + temp1 = iv(stlstg) +c +c *** set temp1 = hessian * step for use in gradient tests *** +c + l = iv(lmat) + call ltvmul(n, v(temp1), v(l), v(step1)) + call lvmul(n, v(temp1), v(l), v(temp1)) +c +c *** compute gradient *** +c + 240 iv(ngcall) = iv(ngcall) + 1 + iv(1) = 2 + go to 999 +c +c *** initializations -- g0 = g - g0, etc. *** +c + 250 g01 = iv(g0) + call vaxpy(n, v(g01), negone, v(g01), g) + step1 = iv(step) + temp1 = iv(stlstg) + if (iv(irc) .ne. 3) go to 270 +c +c *** set v(radfac) by gradient tests *** +c +c *** set temp1 = diag(d)**-1 * (hessian*step + (g(x0)-g(x))) *** +c + call vaxpy(n, v(temp1), negone, v(g01), v(temp1)) + call vvmulp(n, v(temp1), v(temp1), d, -1) +c +c *** do gradient tests *** +c + if (v2norm(n, v(temp1)) .le. v(dgnorm) * v(tuner4)) + 1 go to 260 + if (dotprd(n, g, v(step1)) + 1 .ge. v(gtstep) * v(tuner5)) go to 270 + 260 v(radfac) = v(incfac) +c +c *** update h, loop *** +c + 270 w = iv(nwtstp) + z = iv(x0) + l = iv(lmat) + call wzbfgs(v(l), n, v(step1), v(w), v(g01), v(z)) +c +c ** use the n-vectors starting at v(step1) and v(g01) for scratch.. + call lupdat(v(temp1), v(step1), v(l), v(g01), v(l), n, v(w), v(z)) + iv(1) = 2 + go to 80 +c +c. . . . . . . . . . . . . . misc. details . . . . . . . . . . . . . . +c +c *** bad parameters to assess *** +c + 280 iv(1) = 64 + go to 300 +c +c *** print summary of final iteration and other requested items *** +c + 290 iv(1) = iv(cnvcod) + iv(cnvcod) = 0 + 300 call itsum(d, g, iv, liv, lv, n, v, x) +c + 999 return +c +c *** last line of sumit follows *** + end + subroutine dbdog(dig, lv, n, nwtstp, step, v) +c +c *** compute double dogleg step *** +c +c *** parameter declarations *** +c + integer lv, n + double precision dig(n), nwtstp(n), step(n), v(lv) +c +c *** purpose *** +c +c this subroutine computes a candidate step (for use in an uncon- +c strained minimization code) by the double dogleg algorithm of +c dennis and mei (ref. 1), which is a variation on powell*s dogleg +c scheme (ref. 2, p. 95). +c +c-------------------------- parameter usage -------------------------- +c +c dig (input) diag(d)**-2 * g -- see algorithm notes. +c g (input) the current gradient vector. +c lv (input) length of v. +c n (input) number of components in dig, g, nwtstp, and step. +c nwtstp (input) negative newton step -- see algorithm notes. +c step (output) the computed step. +c v (i/o) values array, the following components of which are +c used here... +c v(bias) (input) bias for relaxed newton step, which is v(bias) of +c the way from the full newton to the fully relaxed newton +c step. recommended value = 0.8 . +c v(dgnorm) (input) 2-norm of diag(d)**-1 * g -- see algorithm notes. +c v(dstnrm) (output) 2-norm of diag(d) * step, which is v(radius) +c unless v(stppar) = 0 -- see algorithm notes. +c v(dst0) (input) 2-norm of diag(d) * nwtstp -- see algorithm notes. +c v(grdfac) (output) the coefficient of dig in the step returned -- +c step(i) = v(grdfac)*dig(i) + v(nwtfac)*nwtstp(i). +c v(gthg) (input) square-root of (dig**t) * (hessian) * dig -- see +c algorithm notes. +c v(gtstep) (output) inner product between g and step. +c v(nreduc) (output) function reduction predicted for the full newton +c step. +c v(nwtfac) (output) the coefficient of nwtstp in the step returned -- +c see v(grdfac) above. +c v(preduc) (output) function reduction predicted for the step returned. +c v(radius) (input) the trust region radius. d times the step returned +c has 2-norm v(radius) unless v(stppar) = 0. +c v(stppar) (output) code telling how step was computed... 0 means a +c full newton step. between 0 and 1 means v(stppar) of the +c way from the newton to the relaxed newton step. between +c 1 and 2 means a true double dogleg step, v(stppar) - 1 of +c the way from the relaxed newton to the cauchy step. +c greater than 2 means 1 / (v(stppar) - 1) times the cauchy +c step. +c +c------------------------------- notes ------------------------------- +c +c *** algorithm notes *** +c +c let g and h be the current gradient and hessian approxima- +c tion respectively and let d be the current scale vector. this +c routine assumes dig = diag(d)**-2 * g and nwtstp = h**-1 * g. +c the step computed is the same one would get by replacing g and h +c by diag(d)**-1 * g and diag(d)**-1 * h * diag(d)**-1, +c computing step, and translating step back to the original +c variables, i.e., premultiplying it by diag(d)**-1. +c +c *** references *** +c +c 1. dennis, j.e., and mei, h.h.w. (1979), two new unconstrained opti- +c mization algorithms which use function and gradient +c values, j. optim. theory applic. 28, pp. 453-482. +c 2. powell, m.j.d. (1970), a hybrid method for non-linear equations, +c in numerical methods for non-linear equations, edited by +c p. rabinowitz, gordon and breach, london. +c +c *** general *** +c +c coded by david m. gay. +c this subroutine was written in connection with research supported +c by the national science foundation under grants mcs-7600324 and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** functions and subroutines called *** +c + external dotprd, v2norm + double precision dotprd, v2norm +c +c dotprd... returns inner product of two vectors. +c v2norm... returns 2-norm of a vector. +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c-------------------------- local variables -------------------------- +c + integer i + double precision cfact, cnorm, ctrnwt, ghinvg, femnsq, gnorm, + 1 nwtnrm, relax, rlambd, t, t1, t2 + double precision half, one, two, zero +c +c *** v subscripts *** +c + integer bias, dgnorm, dstnrm, dst0, grdfac, gthg, gtstep, + 1 nreduc, nwtfac, preduc, radius, stppar +c +c *** data initializations *** +c +c/6 +c data half/0.5d+0/, one/1.d+0/, two/2.d+0/, zero/0.d+0/ +c/7 + parameter (half=0.5d+0, one=1.d+0, two=2.d+0, zero=0.d+0) +c/ +c +c/6 +c data bias/43/, dgnorm/1/, dstnrm/2/, dst0/3/, grdfac/45/, +c 1 gthg/44/, gtstep/4/, nreduc/6/, nwtfac/46/, preduc/7/, +c 2 radius/8/, stppar/5/ +c/7 + parameter (bias=43, dgnorm=1, dstnrm=2, dst0=3, grdfac=45, + 1 gthg=44, gtstep=4, nreduc=6, nwtfac=46, preduc=7, + 2 radius=8, stppar=5) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + nwtnrm = v(dst0) + rlambd = one + if (nwtnrm .gt. zero) rlambd = v(radius) / nwtnrm + gnorm = v(dgnorm) + ghinvg = two * v(nreduc) + v(grdfac) = zero + v(nwtfac) = zero + if (rlambd .lt. one) go to 30 +c +c *** the newton step is inside the trust region *** +c + v(stppar) = zero + v(dstnrm) = nwtnrm + v(gtstep) = -ghinvg + v(preduc) = v(nreduc) + v(nwtfac) = -one + do 20 i = 1, n + 20 step(i) = -nwtstp(i) + go to 999 +c + 30 v(dstnrm) = v(radius) + cfact = (gnorm / v(gthg))**2 +c *** cauchy step = -cfact * g. + cnorm = gnorm * cfact + relax = one - v(bias) * (one - gnorm*cnorm/ghinvg) + if (rlambd .lt. relax) go to 50 +c +c *** step is between relaxed newton and full newton steps *** +c + v(stppar) = one - (rlambd - relax) / (one - relax) + t = -rlambd + v(gtstep) = t * ghinvg + v(preduc) = rlambd * (one - half*rlambd) * ghinvg + v(nwtfac) = t + do 40 i = 1, n + 40 step(i) = t * nwtstp(i) + go to 999 +c + 50 if (cnorm .lt. v(radius)) go to 70 +c +c *** the cauchy step lies outside the trust region -- +c *** step = scaled cauchy step *** +c + t = -v(radius) / gnorm + v(grdfac) = t + v(stppar) = one + cnorm / v(radius) + v(gtstep) = -v(radius) * gnorm + v(preduc) = v(radius)*(gnorm - half*v(radius)*(v(gthg)/gnorm)**2) + do 60 i = 1, n + 60 step(i) = t * dig(i) + go to 999 +c +c *** compute dogleg step between cauchy and relaxed newton *** +c *** femur = relaxed newton step minus cauchy step *** +c + 70 ctrnwt = cfact * relax * ghinvg / gnorm +c *** ctrnwt = inner prod. of cauchy and relaxed newton steps, +c *** scaled by gnorm**-1. + t1 = ctrnwt - gnorm*cfact**2 +c *** t1 = inner prod. of femur and cauchy step, scaled by +c *** gnorm**-1. + t2 = v(radius)*(v(radius)/gnorm) - gnorm*cfact**2 + t = relax * nwtnrm + femnsq = (t/gnorm)*t - ctrnwt - t1 +c *** femnsq = square of 2-norm of femur, scaled by gnorm**-1. + t = t2 / (t1 + dsqrt(t1**2 + femnsq*t2)) +c *** dogleg step = cauchy step + t * femur. + t1 = (t - one) * cfact + v(grdfac) = t1 + t2 = -t * relax + v(nwtfac) = t2 + v(stppar) = two - t + v(gtstep) = t1*gnorm**2 + t2*ghinvg + v(preduc) = -t1*gnorm * ((t2 + one)*gnorm) + 1 - t2 * (one + half*t2)*ghinvg + 2 - half * (v(gthg)*t1)**2 + do 80 i = 1, n + 80 step(i) = t1*dig(i) + t2*nwtstp(i) +c + 999 return +c *** last line of dbdog follows *** + end + subroutine ltvmul(n, x, l, y) +c +c *** compute x = (l**t)*y, where l is an n x n lower +c *** triangular matrix stored compactly by rows. x and y may +c *** occupy the same storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) +c dimension l(n*(n+1)/2) + integer i, ij, i0, j + double precision yi, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + i0 = 0 + do 20 i = 1, n + yi = y(i) + x(i) = zero + do 10 j = 1, i + ij = i0 + j + x(j) = x(j) + yi*l(ij) + 10 continue + i0 = i0 + i + 20 continue + 999 return +c *** last card of ltvmul follows *** + end + subroutine lupdat(beta, gamma, l, lambda, lplus, n, w, z) +c +c *** compute lplus = secant update of l *** +c +c *** parameter declarations *** +c + integer n +cal double precision beta(n), gamma(n), l(1), lambda(n), lplus(1), + double precision beta(n), gamma(n), l(n*(n+1)/2), lambda(n), + 1 lplus(n*(n+1)/2),w(n), z(n) +c dimension l(n*(n+1)/2), lplus(n*(n+1)/2) +c +c-------------------------- parameter usage -------------------------- +c +c beta = scratch vector. +c gamma = scratch vector. +c l (input) lower triangular matrix, stored rowwise. +c lambda = scratch vector. +c lplus (output) lower triangular matrix, stored rowwise, which may +c occupy the same storage as l. +c n (input) length of vector parameters and order of matrices. +c w (input, destroyed on output) right singular vector of rank 1 +c correction to l. +c z (input, destroyed on output) left singular vector of rank 1 +c correction to l. +c +c------------------------------- notes ------------------------------- +c +c *** application and usage restrictions *** +c +c this routine updates the cholesky factor l of a symmetric +c positive definite matrix to which a secant update is being +c applied -- it computes a cholesky factor lplus of +c l * (i + z*w**t) * (i + w*z**t) * l**t. it is assumed that w +c and z have been chosen so that the updated matrix is strictly +c positive definite. +c +c *** algorithm notes *** +c +c this code uses recurrence 3 of ref. 1 (with d(j) = 1 for all j) +c to compute lplus of the form l * (i + z*w**t) * q, where q +c is an orthogonal matrix that makes the result lower triangular. +c lplus may have some negative diagonal elements. +c +c *** references *** +c +c 1. goldfarb, d. (1976), factorized variable metric methods for uncon- +c strained optimization, math. comput. 30, pp. 796-811. +c +c *** general *** +c +c coded by david m. gay (fall 1979). +c this subroutine was written in connection with research supported +c by the national science foundation under grants mcs-7600324 and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c-------------------------- local variables -------------------------- +c + integer i, ij, j, jj, jp1, k, nm1, np1 + double precision a, b, bj, eta, gj, lj, lij, ljj, nu, s, theta, + 1 wj, zj + double precision one, zero +c +c *** data initializations *** +c +c/6 +c data one/1.d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, zero=0.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + nu = one + eta = zero + if (n .le. 1) go to 30 + nm1 = n - 1 +c +c *** temporarily store s(j) = sum over k = j+1 to n of w(k)**2 in +c *** lambda(j). +c + s = zero + do 10 i = 1, nm1 + j = n - i + s = s + w(j+1)**2 + lambda(j) = s + 10 continue +c +c *** compute lambda, gamma, and beta by goldfarb*s recurrence 3. +c + do 20 j = 1, nm1 + wj = w(j) + a = nu*z(j) - eta*wj + theta = one + a*wj + s = a*lambda(j) + lj = dsqrt(theta**2 + a*s) + if (theta .gt. zero) lj = -lj + lambda(j) = lj + b = theta*wj + s + gamma(j) = b * nu / lj + beta(j) = (a - b*eta) / lj + nu = -nu / lj + eta = -(eta + (a**2)/(theta - lj)) / lj + 20 continue + 30 lambda(n) = one + (nu*z(n) - eta*w(n))*w(n) +c +c *** update l, gradually overwriting w and z with l*w and l*z. +c + np1 = n + 1 + jj = n * (n + 1) / 2 + do 60 k = 1, n + j = np1 - k + lj = lambda(j) + ljj = l(jj) + lplus(jj) = lj * ljj + wj = w(j) + w(j) = ljj * wj + zj = z(j) + z(j) = ljj * zj + if (k .eq. 1) go to 50 + bj = beta(j) + gj = gamma(j) + ij = jj + j + jp1 = j + 1 + do 40 i = jp1, n + lij = l(ij) + lplus(ij) = lj*lij + bj*w(i) + gj*z(i) + w(i) = w(i) + lij*wj + z(i) = z(i) + lij*zj + ij = ij + i + 40 continue + 50 jj = jj - j + 60 continue +c + 999 return +c *** last card of lupdat follows *** + end + subroutine lvmul(n, x, l, y) +c +c *** compute x = l*y, where l is an n x n lower triangular +c *** matrix stored compactly by rows. x and y may occupy the same +c *** storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) +c dimension l(n*(n+1)/2) + integer i, ii, ij, i0, j, np1 + double precision t, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + np1 = n + 1 + i0 = n*(n+1)/2 + do 20 ii = 1, n + i = np1 - ii + i0 = i0 - i + t = zero + do 10 j = 1, i + ij = i0 + j + t = t + l(ij)*y(j) + 10 continue + x(i) = t + 20 continue + 999 return +c *** last card of lvmul follows *** + end + subroutine vvmulp(n, x, y, z, k) +c +c *** set x(i) = y(i) * z(i)**k, 1 .le. i .le. n (for k = 1 or -1) *** +c + integer n, k + double precision x(n), y(n), z(n) + integer i +c + if (k .ge. 0) go to 20 + do 10 i = 1, n + 10 x(i) = y(i) / z(i) + go to 999 +c + 20 do 30 i = 1, n + 30 x(i) = y(i) * z(i) + 999 return +c *** last card of vvmulp follows *** + end + subroutine wzbfgs (l, n, s, w, y, z) +c +c *** compute y and z for lupdat corresponding to bfgs update. +c + integer n +cal double precision l(1), s(n), w(n), y(n), z(n) + double precision l(n*(n+1)/2), s(n), w(n), y(n), z(n) +c dimension l(n*(n+1)/2) +c +c-------------------------- parameter usage -------------------------- +c +c l (i/o) cholesky factor of hessian, a lower triang. matrix stored +c compactly by rows. +c n (input) order of l and length of s, w, y, z. +c s (input) the step just taken. +c w (output) right singular vector of rank 1 correction to l. +c y (input) change in gradients corresponding to s. +c z (output) left singular vector of rank 1 correction to l. +c +c------------------------------- notes ------------------------------- +c +c *** algorithm notes *** +c +c when s is computed in certain ways, e.g. by gqtstp or +c dbldog, it is possible to save n**2/2 operations since (l**t)*s +c or l*(l**t)*s is then known. +c if the bfgs update to l*(l**t) would reduce its determinant to +c less than eps times its old value, then this routine in effect +c replaces y by theta*y + (1 - theta)*l*(l**t)*s, where theta +c (between 0 and 1) is chosen to make the reduction factor = eps. +c +c *** general *** +c +c coded by david m. gay (fall 1979). +c this subroutine was written in connection with research supported +c by the national science foundation under grants mcs-7600324 and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** functions and subroutines called *** +c + external dotprd, livmul, ltvmul + double precision dotprd +c dotprd returns inner product of two vectors. +c livmul multiplies l**-1 times a vector. +c ltvmul multiplies l**t times a vector. +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c-------------------------- local variables -------------------------- +c + integer i + double precision cs, cy, eps, epsrt, one, shs, ys, theta +c +c *** data initializations *** +c +c/6 +c data eps/0.1d+0/, one/1.d+0/ +c/7 + parameter (eps=0.1d+0, one=1.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + call ltvmul(n, w, l, s) + shs = dotprd(n, w, w) + ys = dotprd(n, y, s) + if (ys .ge. eps*shs) go to 10 + theta = (one - eps) * shs / (shs - ys) + epsrt = dsqrt(eps) + cy = theta / (shs * epsrt) + cs = (one + (theta-one)/epsrt) / shs + go to 20 + 10 cy = one / (dsqrt(ys) * dsqrt(shs)) + cs = one / shs + 20 call livmul(n, z, l, y) + do 30 i = 1, n + 30 z(i) = cy * z(i) - cs * w(i) +c + 999 return +c *** last card of wzbfgs follows *** + end diff --git a/source/unres/src_Eshel/timing.F b/source/unres/src_Eshel/timing.F new file mode 100644 index 0000000..fb65430 --- /dev/null +++ b/source/unres/src_Eshel/timing.F @@ -0,0 +1,344 @@ +C $Date: 1994/10/05 16:41:52 $ +C $Revision: 2.2 $ +C +C +C + subroutine set_timers +c + implicit none + double precision tcpu + include 'COMMON.TIME1' +#ifdef MP + include 'mpif.h' +#endif +C Diminish the assigned time limit a little so that there is some time to +C end a batch job +c timlim=batime-150.0 +C Calculate the initial time, if it is not zero (e.g. for the SUN). + stime=tcpu() +#ifdef MPI + walltime=MPI_WTIME() + time_reduce=0.0d0 + time_allreduce=0.0d0 + time_bcast=0.0d0 + time_gather=0.0d0 + time_sendrecv=0.0d0 + time_scatter=0.0d0 + time_scatter_fmat=0.0d0 + time_scatter_ginv=0.0d0 + time_scatter_fmatmult=0.0d0 + time_scatter_ginvmult=0.0d0 + time_barrier_e=0.0d0 + time_barrier_g=0.0d0 + time_enecalc=0.0d0 + time_sumene=0.0d0 + time_lagrangian=0.0d0 + time_sumgradient=0.0d0 + time_intcartderiv=0.0d0 + time_inttocart=0.0d0 + time_ginvmult=0.0d0 + time_fricmatmult=0.0d0 + time_cartgrad=0.0d0 + time_bcastc=0.0d0 + time_bcast7=0.0d0 + time_bcastw=0.0d0 + time_intfcart=0.0d0 + time_vec=0.0d0 + time_mat=0.0d0 + time_fric=0.0d0 + time_stoch=0.0d0 + time_fricmatmult=0.0d0 + time_fsample=0.0d0 +#endif +cd print *,' in SET_TIMERS stime=',stime + return + end +C------------------------------------------------------------------------------ + logical function stopx(nf) +C This function returns .true. if one of the following reasons to exit SUMSL +C occurs. The "reason" code is stored in WHATSUP passed thru a COMMON block: +C +C... WHATSUP = 0 - go on, no reason to stop. Stopx will return .false. +C... 1 - Time up in current node; +C... 2 - STOP signal was received from another node because the +C... node's task was accomplished (parallel only); +C... -1 - STOP signal was received from another node because of error; +C... -2 - STOP signal was received from another node, because +C... the node's time was up. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer nf + logical ovrtim +#ifdef MP + include 'mpif.h' + include 'COMMON.INFO' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + integer Kwita + +cd print *,'Processor',MyID,' NF=',nf +#ifndef MPI + if (ovrtim()) then +C Finish if time is up. + stopx = .true. + WhatsUp=1 +#ifdef MPL + else if (mod(nf,100).eq.0) then +C Other processors might have finished. Check this every 100th function +C evaluation. +C Master checks if any other processor has sent accepted conformation(s) to it. + if (MyID.ne.MasterID) call receive_mcm_info + if (MyID.eq.MasterID) call receive_conf +cd print *,'Processor ',MyID,' is checking STOP: nf=',nf + call recv_stop_sig(Kwita) + if (Kwita.eq.-1) then + write (iout,'(a,i4,a,i5)') 'Processor', + & MyID,' has received STOP signal in STOPX; NF=',nf + write (*,'(a,i4,a,i5)') 'Processor', + & MyID,' has received STOP signal in STOPX; NF=',nf + stopx=.true. + WhatsUp=2 + elseif (Kwita.eq.-2) then + write (iout,*) + & 'Processor',MyID,' received TIMEUP-STOP signal in SUMSL.' + write (*,*) + & 'Processor',MyID,' received TIMEUP-STOP signal in SUMSL.' + WhatsUp=-2 + stopx=.true. + else if (Kwita.eq.-3) then + write (iout,*) + & 'Processor',MyID,' received ERROR-STOP signal in SUMSL.' + write (*,*) + & 'Processor',MyID,' received ERROR-STOP signal in SUMSL.' + WhatsUp=-1 + stopx=.true. + else + stopx=.false. + WhatsUp=0 + endif +#endif + else + stopx = .false. + WhatsUp=0 + endif +#else + stopx=.false. +#endif + +#ifdef OSF +c Check for FOUND_NAN flag + if (FOUND_NAN) then + write(iout,*)" *** stopx : Found a NaN" + stopx=.true. + endif +#endif + + return + end +C-------------------------------------------------------------------------- + logical function ovrtim() + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + real*8 tcpu +#ifdef MPI + include "mpif.h" + curtim = MPI_Wtime()-walltime +#else + curtim= tcpu() +#endif +C curtim is the current time in seconds. +c write (iout,*) "curtim",curtim," timlim",timlim," safety",safety + if (curtim .ge. timlim - safety) then + if (me.eq.king .or. .not. out1file) + & write (iout,'(a,f10.2,a,f10.2,a,f10.2,a)') + & "***************** Elapsed time (",curtim, + & " s) is within the safety limit (",safety, + & " s) of the allocated time (",timlim," s). Terminating." + ovrtim=.true. + else + ovrtim=.false. + endif + return + end +************************************************************************** + double precision function tcpu() + include 'COMMON.TIME1' +#ifdef ES9000 +**************************** +C Next definition for EAGLE (ibm-es9000) + real*8 micseconds + integer rcode + tcpu=cputime(micseconds,rcode) + tcpu=(micseconds/1.0E6) - stime +**************************** +#endif +#ifdef SUN +**************************** +C Next definitions for sun + REAL*8 ECPU,ETIME,ETCPU + dimension tarray(2) + tcpu=etime(tarray) + tcpu=tarray(1) +**************************** +#endif +#ifdef KSR +**************************** +C Next definitions for ksr +C this function uses the ksr timer ALL_SECONDS from the PMON library to +C return the elapsed time in seconds + tcpu= all_seconds() - stime +**************************** +#endif +#ifdef SGI +**************************** +C Next definitions for sgi + real timar(2), etime + seconds = etime(timar) +Cd print *,'seconds=',seconds,' stime=',stime +C usrsec = timar(1) +C syssec = timar(2) + tcpu=seconds - stime +**************************** +#endif + +#ifdef LINUX +**************************** +C Next definitions for sgi + real timar(2), etime + seconds = etime(timar) +Cd print *,'seconds=',seconds,' stime=',stime +C usrsec = timar(1) +C syssec = timar(2) + tcpu=seconds - stime +**************************** +#endif + + +#ifdef CRAY +**************************** +C Next definitions for Cray +C call date(curdat) +C curdat=curdat(1:9) +C call clock(curtim) +C curtim=curtim(1:8) + cpusec = second() + tcpu=cpusec - stime +**************************** +#endif +#ifdef AIX +**************************** +C Next definitions for RS6000 + integer*4 i1,mclock + i1 = mclock() + tcpu = (i1+0.0D0)/100.0D0 +#endif +#ifdef WINPGI +**************************** +c next definitions for windows NT Digital fortran + real time_real + call cpu_time(time_real) + tcpu = time_real +#endif +#ifdef WINIFL +**************************** +c next definitions for windows NT Digital fortran + real time_real + call cpu_time(time_real) + tcpu = time_real +#endif + + return + end +C--------------------------------------------------------------------------- + subroutine dajczas(rntime,hrtime,mintime,sectime) + include 'COMMON.IOUNITS' + real*8 rntime,hrtime,mintime,sectime + hrtime=rntime/3600.0D0 + hrtime=aint(hrtime) + mintime=aint((rntime-3600.0D0*hrtime)/60.0D0) + sectime=aint((rntime-3600.0D0*hrtime-60.0D0*mintime)+0.5D0) + if (sectime.eq.60.0D0) then + sectime=0.0D0 + mintime=mintime+1.0D0 + endif + ihr=hrtime + imn=mintime + isc=sectime + write (iout,328) ihr,imn,isc + 328 FORMAT(//'***** Computation time: ',I4 ,' hours ',I2 , + 1 ' minutes ', I2 ,' seconds *****') + return + end +C--------------------------------------------------------------------------- + subroutine print_detailed_timing + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.SETUP' +#ifdef MPI + time1=MPI_WTIME() + write (iout,'(80(1h=)/a/(80(1h=)))') + & "Details of FG communication time" + write (*,'(7(a40,1pe15.5/),40(1h-)/a40,1pe15.5/80(1h=))') + & "BROADCAST:",time_bcast,"REDUCE:",time_reduce, + & "GATHER:",time_gather, + & "SCATTER:",time_scatter,"SENDRECV:",time_sendrecv, + & "BARRIER ene",time_barrier_e, + & "BARRIER grad",time_barrier_g, + & "TOTAL:", + & time_bcast+time_reduce+time_gather+time_scatter+time_sendrecv + write (*,*) fg_rank,myrank, + & ': Total wall clock time',time1-walltime,' sec' + write (*,*) "Processor",fg_rank,myrank, + & ": BROADCAST time",time_bcast," REDUCE time", + & time_reduce," GATHER time",time_gather," SCATTER time", + & time_scatter, + & " SCATTER fmatmult",time_scatter_fmatmult, + & " SCATTER ginvmult",time_scatter_ginvmult, + & " SCATTER fmat",time_scatter_fmat, + & " SCATTER ginv",time_scatter_ginv, + & " SENDRECV",time_sendrecv, + & " BARRIER ene",time_barrier_e, + & " BARRIER GRAD",time_barrier_g, + & " BCAST7",time_bcast7," BCASTC",time_bcastc, + & " BCASTW",time_bcastw," ALLREDUCE",time_allreduce, + & " TOTAL", + & time_bcast+time_reduce+time_gather+time_scatter+ + & time_sendrecv+time_barrier+time_bcastc +#else + time1=tcpu() +#endif + write (*,*) "Processor",fg_rank,myrank," enecalc",time_enecalc + write (*,*) "Processor",fg_rank,myrank," sumene",time_sumene + write (*,*) "Processor",fg_rank,myrank," intfromcart", + & time_intfcart + write (*,*) "Processor",fg_rank,myrank," vecandderiv", + & time_vec + write (*,*) "Processor",fg_rank,myrank," setmatrices", + & time_mat + write (*,*) "Processor",fg_rank,myrank," ginvmult", + & time_ginvmult + write (*,*) "Processor",fg_rank,myrank," fricmatmult", + & time_fricmatmult + write (*,*) "Processor",fg_rank,myrank," inttocart", + & time_inttocart + write (*,*) "Processor",fg_rank,myrank," sumgradient", + & time_sumgradient + write (*,*) "Processor",fg_rank,myrank," intcartderiv", + & time_intcartderiv + if (fg_rank.eq.0) then + write (*,*) "Processor",fg_rank,myrank," lagrangian", + & time_lagrangian + write (*,*) "Processor",fg_rank,myrank," cartgrad", + & time_cartgrad + endif + return + end diff --git a/source/unres/src_Eshel/unres.F b/source/unres/src_Eshel/unres.F new file mode 100644 index 0000000..b039983 --- /dev/null +++ b/source/unres/src_Eshel/unres.F @@ -0,0 +1,210 @@ +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C U N R E S C +C C +C Version for use in parameter optimization on fixed set of decoys C +C C +C A. Liwo 12/14/13 C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.TIME1' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.REMD' + include 'COMMON.MD' + include 'COMMON.SBRIDGE' + double precision hrtime,mintime,sectime + double precision energia(0:n_ene) + +C Initializing variables, setting constants, translation of residue types +C to numeric types, etc. MUST be called. + call init_task +C Read force field parameters and job setup data + call readrtns +C +C +#ifdef MPI +With fine-graining energy, slaves compute only their energy chunks. + if (fg_rank.gt.0) then +C Fine-grain slaves just do energy and gradient components. + call ergastulum ! slave workhouse in Latin + else +#endif + if (indpdb.gt.0) then + do ifile=1,npdbfile + call pdbinput(ifile) + call exec_eeval_or_minim(energia(0)) + call statout(ifile,energia(0)) + enddo + else + call exec_eeval_or_minim(energia(0)) + call statout(1,energia(0)) + endif +#ifdef MPI + endif +C Finish task. + if (fg_rank.eq.0) call finish_task +#ifdef TIMING + call print_detailed_timing +#endif + call MPI_Finalize(ierr) + stop 'Bye Bye...' +#else + call dajczas(tcpu(),hrtime,mintime,sectime) + stop '********** Program terminated normally.' +#endif + end +c-------------------------------------------------------------------------- + subroutine exec_eeval_or_minim(energy) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.TIME1' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.REMD' + include 'COMMON.MD' + include 'COMMON.SBRIDGE' + include 'COMMON.ECOMPON' + common /srutu/ icall + double precision energy(0:n_ene) + double precision energy_long(0:n_ene),energy_short(0:n_ene) + double precision varia(maxvar) + if (indpdb.eq.0) call chainbuild +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif + do i=nnt+1,nct-1 + do j=1,3 + dc(j,i)=c(j,i+1)-c(j,i) + enddo + enddo + if (nnt.gt.1) then + do j=1,3 + dc(j,1)=dc(j,3) + c(j,1)=c(j,2)-dc(j,1) + enddo + endif + if (nct.lt.nres) then + do j=1,3 + dc(j,nres-1)=dc(j,nres-3) + c(j,nres)=c(j,nres)+dc(j,nres-1) + enddo + endif + call cartprint + call int_from_cart(.true.,.false.) + write (iout,*) "Time for energy evaluation",time_ene + +crc overlap test + if (overlapsc) then + print *, 'Calling OVERLAP_SC' + call overlap_sc(fail) + endif + + if (searchsc) then + call sc_move(2,nres-1,10,1d10,nft_sc,etot) + print *,'SC_move',nft_sc,etot + write(iout,*) 'SC_move',nft_sc,etot + endif + + call etotal(energy(0)) +#ifdef MPI + time_ene=MPI_Wtime()-time00 +#else + time_ene=tcpu()-time00 +#endif + if (regular) then + call gen_dist_constr + call regularize(nct-nnt+1,etot,rms,cref(1,nnt),iretcode) + call etotal(energy(0)) + energy(0)=energy(0)-energy(14) + etot=energy(0) + call enerprint(energy(0)) + call intout + if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + write (iout,'(a,i3)') 'SUMSL return code:',iretcode + else if (minim) then + print *, 'Calling MINIM_DC' +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + call minim_dc(etot,iretcode,nfun) + print *,'SUMSL return code is',iretcode,' eval ',nfun +#ifdef MPI + evals=nfun/(MPI_WTIME()-time1) +#else + evals=nfun/(tcpu()-time1) +#endif + print *,'# eval/s',evals + print *,'refstr=',refstr + call etotal(energy(0)) + etot = energy(0) + call enerprint(energy(0)) + + call intout + call briefout(0,etot) + if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + write (iout,'(a,i3)') 'SUMSL return code:',iretcode + write (iout,'(a,i20)') '# of energy evaluations:',nfun+1 + write (iout,'(a,f16.3)')'# of energy evaluations/sec:',evals + else + if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + endif + call enerprint(energy) +#define DEBUG +#ifdef DEBUG +c Check the correctness of energy components + evdw=0.0d0 + etor=0.0d0 + esccor=0.0d0 + do i=1,ntyp + do j=1,ntyp + evdw=evdw+vdwcompon(i,j) + etor=etor+torcompon(i,j) + esccor=esccor+sccorcompon(i,j) + enddo + enddo + ebe=0.0d0 + esc=0.0d0 + evdw2=0.0d0 + etord=0.0d0 + do i=1,ntyp + ebe=ebe+becompon(i) + esc=esc+sccompon(i) + evdw2=evdw2+vdw2compon(i) + etord=etord+tordcompon(i) + enddo + write (iout,'(a8,1pe15.6)') "EVDW",evdw,"EVDW2",EVDW2,"EBEND",ebe, + & "ESCLOC",esc,"ETOR",etor,"ETORD",etord,"ESCCOR",esccor +#endif +#undef DEBUG + if (outpdb) call pdbout(etot,titel(:32),ipdb) + if (outmol2) call mol2out(etot,titel(:32)) + return + end +c--------------------------------------------------------------------------- diff --git a/source/unres/src_Eshel/xdrf b/source/unres/src_Eshel/xdrf new file mode 120000 index 0000000..26825c5 --- /dev/null +++ b/source/unres/src_Eshel/xdrf @@ -0,0 +1 @@ +../../lib/xdrf \ No newline at end of file diff --git a/source/unres/src_MD-M/CMakeCache.txt b/source/unres/src_MD-M/CMakeCache.txt new file mode 100644 index 0000000..c27e7ad --- /dev/null +++ b/source/unres/src_MD-M/CMakeCache.txt @@ -0,0 +1,326 @@ +# This is the CMakeCache file. +# For build in directory: /users/adam/unres/source/unres/src_MD-M +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUI's for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//For backwards compatibility, what version of CMake commands and +// syntax should this version of CMake try to support. +CMAKE_BACKWARDS_COMPATIBILITY:STRING=2.4 + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING= + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler. +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g + +//C compiler. +CMAKE_C_COMPILER:FILEPATH=/usr/bin/gcc + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Fortran compiler. +CMAKE_Fortran_COMPILER:FILEPATH=/usr/bin/gfortran + +//Flags for Fortran compiler. +CMAKE_Fortran_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_Fortran_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_Fortran_FLAGS_MINSIZEREL:STRING=-Os + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_Fortran_FLAGS_RELEASE:STRING=-O3 + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_Fortran_FLAGS_RELWITHDEBINFO:STRING=-O2 -g + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/gmake + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=Project + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If true, cmake will use relative paths in makefiles and projects. +CMAKE_USE_RELATIVE_PATHS:BOOL=OFF + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Single output directory for building all executables. +EXECUTABLE_OUTPUT_PATH:PATH= + +//Single output directory for building all libraries. +LIBRARY_OUTPUT_PATH:PATH= + +//Value Computed by CMake +Project_BINARY_DIR:STATIC=/users/adam/unres/source/unres/src_MD-M + +//Value Computed by CMake +Project_SOURCE_DIR:STATIC=/users/adam/unres/source/unres/src_MD-M + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_BUILD_TOOL +CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1 +//What is the target build tool cmake is generating for. +CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/gmake +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/users/adam/unres/source/unres/src_MD-M +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=8 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=0 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +CMAKE_CXX_COMPILER_WORKS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +CMAKE_C_COMPILER_WORKS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Result of TRY_COMPILE +CMAKE_DETERMINE_CXX_ABI_COMPILED:INTERNAL=TRUE +//Result of TRY_COMPILE +CMAKE_DETERMINE_C_ABI_COMPILED:INTERNAL=TRUE +//Result of TRY_COMPILE +CMAKE_DETERMINE_Fortran_ABI_COMPILED:INTERNAL=TRUE +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_COMPILER +CMAKE_Fortran_COMPILER-ADVANCED:INTERNAL=1 +CMAKE_Fortran_COMPILER_WORKS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS +CMAKE_Fortran_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS_DEBUG +CMAKE_Fortran_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS_MINSIZEREL +CMAKE_Fortran_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS_RELEASE +CMAKE_Fortran_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_Fortran_FLAGS_RELWITHDEBINFO +CMAKE_Fortran_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Start directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/users/adam/unres/source/unres/src_MD-M +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/bin/uname +//ADVANCED property for variable: CMAKE_USE_RELATIVE_PATHS +CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 + diff --git a/source/unres/src_MD-M/CMakeFiles/CMakeCCompiler.cmake b/source/unres/src_MD-M/CMakeFiles/CMakeCCompiler.cmake new file mode 100644 index 0000000..418c356 --- /dev/null +++ b/source/unres/src_MD-M/CMakeFiles/CMakeCCompiler.cmake @@ -0,0 +1,41 @@ +SET(CMAKE_C_COMPILER "/usr/bin/gcc") +SET(CMAKE_C_COMPILER_ARG1 "") +SET(CMAKE_C_COMPILER_ID "GNU") +SET(CMAKE_C_PLATFORM_ID "Linux") +SET(CMAKE_AR "/usr/bin/ar") +SET(CMAKE_RANLIB "/usr/bin/ranlib") +SET(CMAKE_COMPILER_IS_GNUCC 1) +SET(CMAKE_C_COMPILER_LOADED 1) +SET(CMAKE_COMPILER_IS_MINGW ) +SET(CMAKE_COMPILER_IS_CYGWIN ) +IF(CMAKE_COMPILER_IS_CYGWIN) + SET(CYGWIN 1) + SET(UNIX 1) +ENDIF(CMAKE_COMPILER_IS_CYGWIN) + +SET(CMAKE_C_COMPILER_ENV_VAR "CC") + +IF(CMAKE_COMPILER_IS_MINGW) + SET(MINGW 1) +ENDIF(CMAKE_COMPILER_IS_MINGW) +SET(CMAKE_C_COMPILER_ID_RUN 1) +SET(CMAKE_C_SOURCE_FILE_EXTENSIONS c) +SET(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +SET(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +SET(CMAKE_C_SIZEOF_DATA_PTR "8") +SET(CMAKE_C_COMPILER_ABI "ELF") + +IF(CMAKE_C_SIZEOF_DATA_PTR) + SET(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +ENDIF(CMAKE_C_SIZEOF_DATA_PTR) + +IF(CMAKE_C_COMPILER_ABI) + SET(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +ENDIF(CMAKE_C_COMPILER_ABI) + +SET(CMAKE_C_HAS_ISYSROOT "") + +SET(CMAKE_C_IMPLICIT_LINK_LIBRARIES "c") +SET(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-redhat-linux/4.4.5;/usr/lib64;/lib64;/usr/lib") diff --git a/source/unres/src_MD-M/CMakeFiles/CMakeCXXCompiler.cmake b/source/unres/src_MD-M/CMakeFiles/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..bb4e208 --- /dev/null +++ b/source/unres/src_MD-M/CMakeFiles/CMakeCXXCompiler.cmake @@ -0,0 +1,42 @@ +SET(CMAKE_CXX_COMPILER "/usr/bin/c++") +SET(CMAKE_CXX_COMPILER_ARG1 "") +SET(CMAKE_CXX_COMPILER_ID "GNU") +SET(CMAKE_CXX_PLATFORM_ID "Linux") +SET(CMAKE_AR "/usr/bin/ar") +SET(CMAKE_RANLIB "/usr/bin/ranlib") +SET(CMAKE_COMPILER_IS_GNUCXX 1) +SET(CMAKE_CXX_COMPILER_LOADED 1) +SET(CMAKE_COMPILER_IS_MINGW ) +SET(CMAKE_COMPILER_IS_CYGWIN ) +IF(CMAKE_COMPILER_IS_CYGWIN) + SET(CYGWIN 1) + SET(UNIX 1) +ENDIF(CMAKE_COMPILER_IS_CYGWIN) + +SET(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +IF(CMAKE_COMPILER_IS_MINGW) + SET(MINGW 1) +ENDIF(CMAKE_COMPILER_IS_MINGW) +SET(CMAKE_CXX_COMPILER_ID_RUN 1) +SET(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;H;o;O;obj;OBJ;def;DEF;rc;RC) +SET(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm) +SET(CMAKE_CXX_LINKER_PREFERENCE 30) +SET(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +SET(CMAKE_CXX_SIZEOF_DATA_PTR "8") +SET(CMAKE_CXX_COMPILER_ABI "ELF") + +IF(CMAKE_CXX_SIZEOF_DATA_PTR) + SET(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +ENDIF(CMAKE_CXX_SIZEOF_DATA_PTR) + +IF(CMAKE_CXX_COMPILER_ABI) + SET(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +ENDIF(CMAKE_CXX_COMPILER_ABI) + +SET(CMAKE_CXX_HAS_ISYSROOT "") + +SET(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;c") +SET(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-redhat-linux/4.4.5;/usr/lib64;/lib64;/usr/lib") diff --git a/source/unres/src_MD-M/CMakeFiles/CMakeDetermineCompilerABI_C.bin b/source/unres/src_MD-M/CMakeFiles/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..a16edc4f2cb1a2dd6d91163aeca1f94f1b7e3cac GIT binary patch literal 6997 zcmcIoeQZkWOMy-=I1Vqx5D4kU1nr9xJF%%_XZAA+ z2-HlW9af-Cr)g!?#E`}&q;=D_KTx(xs}bu`q;+EL%Fv3Y49b*|u)L}hh_nl)u zzc}hNZP)TU_x$ep-E-f4_wzjK5475CHo?g*zARA7mMIc4oIw?cBA*2*`vS1- z*YuF&QbkUeA}v{Zh{uw7JAjAn{7)0N^U+wed)=BxW1+fOG@c%;8*Exvw{DF$mGCyo z_E$lL_==miJt?c^{-_2GeJ_DOeoHLx_{qh$zVoB&hcCXWFa6yw_D!8~{%tFNXXKT` zf3#}IB|i7Se3#R?@Q70=SO?-2@ZUSvckx$Ozje^(e|LJp`j_W7cE5My)h$=Ee}3!g ziA!JKRlE1uR}TL2*sY4OnzFG4ORk)ldglYAl}y-XcZm{wpHjFNaC|3g8UUb5)QBVV zx{8XvEAd;olNS60;YTfa5^#5kdiDWcEf(hI8>lh`;kiguiVNk6)cHFf0uAkN&N1+e zEEVDy$SQFwXZ5>*>`#$B>X^O>|7tN`4ADH7AUqWKqu&YgyOaucfJDC&R1Xbnv0LI5 zVvOv`TnJ6;>rceBlpaj#nkKX-_GumAzGzAhCw;MCDiux%7$c) zyf>kxq6fl>UM)1BC)uPYmDYNr@u<+++QB{)jce&tI0VI^pdK`8Fx!Hu4tjSg#bx0* zSclPCY!0+-@@b9UM(!{4Rma$AQe9mdppuxh0p?;d9U@Q_1V<$Q}=Lb<9&07zuf50+4eD zMs&~0z{o*QJ#<48yp~M){)Qf|fp)0FcXRr(*Kk{+ew}i`cN&5IzMD(mq8>E9vf^oXsvB3@I4)~vhDmQ|>3~~?1 zX^=WdT<0;_4s;0HV3lq8f^rw`d9{Gye-GHnwWYbD>Uq0w;hcS7066lnzCkGGH3L*R zhdMzH04~?C9Y@QapQBYM!{sm9UvM0A+ILm(9)(%Z1xdcL8b_Je=v&Al_q4S=awHx|8VWgjvoKLcbB(ImG=I45Z=0EoV+jGC-x`63H zLx>2i%ZzU)o%@9ObIG1{=uY`Q^<)qIBz0bkZjwHa%8CAe7kpl_I{K-p9h-f=_3o8$ zl33+l<6Yxj>u#)XsBdU!Xmqda2#4HiP&e?p##KUiQ~Ue%U^hrTX~+oYqH)+{281`B z(8J#5O>K30u#dF9c-q^Yj>2WLXABEeKdctiW+P@f@TvymnH!pT%L5ie3SC`*Q8 zK_pOaAf^ki+-AIbco6b(d-5g|a*OeXBU*1V*dNv+A>gtmyghm%nF5D~*xLhzP-n0| z+5-*~Pz^l1vTmau*uj95=Z-%WgL`w12YAcIY1KCds^iO=szD%|&s#Q0$g zpVzBM2|ljDR{jfsVW05&%Iouxg%2h&QMa-xaL+LFkJCDGocQj%rIBGipWD7|;b)1T zC4S)^Xz-cG)xKik^L{dhgBp_cV#5B7QXx)42HVg5&*%IL#9z&ZB(45WTljoGbW%rq zEPSi~GZy|zx@WE={y__$zaPU{;^Q2^#P?{vUt8O2<&Ogg-=Fz-V#G8?hM&g&J=mK0 zcwEHvCh@KQtol1(i(`-d^Zvy5e7?`~_+&n}>oRc7{`uVBMF#}72Q!&iXZcq^&3rx| zM2PP;X!$4eSYEgA`F?tY_}1@j)o%hH>*DtxrSr*A;`4iQ1K2O?w;_Y=uV;WH^S@}p z(H0ZSMUZFTvVb0A5i8z9+rw|7zuBS@yx>t-Z z61<)jrR&$l6eQ*UU*$G7dpgJhzFLke;|MVFSdVB@cb^uXU3JV+#!|; zo{z=$51Cb&H|D`YF-`jy8{qtMLOh6dmbH+vK_rLQYsSAI@tOV5B=MR3;0N3e@t~?X z3gik2<3To4`+45%CHy$8Gdv#$0mpiVEcMLR{=>4KYVk8m|Gy;hMdGAOfm|VdAF{R* z-|@$QOTXnx!5DI9;a{rX-UZwSaWRZ9VB-D#FOavvtMs*25w1y49(1Q>VPx# literal 0 HcmV?d00001 diff --git a/source/unres/src_MD-M/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin b/source/unres/src_MD-M/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..0ac3e129ea164d6d0046ca2027014a86bc1a3274 GIT binary patch literal 7283 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 ignore + arg [--no-add-needed] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [--build-id] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-o] ==> ignore + arg [cmTryCompileExec] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64] + arg [-L/lib/../lib64] ==> dir [/lib/../lib64] + arg [-L/usr/lib/../lib64] ==> dir [/usr/lib/../lib64] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../..] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../..] + arg [CMakeFiles/cmTryCompileExec.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crtn.o] ==> ignore + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64] ==> [/usr/lib64] + collapse dir [/lib/../lib64] ==> [/lib64] + collapse dir [/usr/lib/../lib64] ==> [/usr/lib64] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../..] ==> [/usr/lib] + implicit libs: [c] + implicit dirs: [/usr/lib/gcc/x86_64-redhat-linux/4.4.5;/usr/lib64;/lib64;/usr/lib] + + +Determining if the CXX compiler works passed with the following output: +Change Dir: /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/gmake "cmTryCompileExec/fast" +/usr/bin/gmake -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build +gmake[1]: Entering directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building CXX object CMakeFiles/cmTryCompileExec.dir/testCXXCompiler.cxx.o +/usr/bin/c++ -o CMakeFiles/cmTryCompileExec.dir/testCXXCompiler.cxx.o -c /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp/testCXXCompiler.cxx +Linking CXX executable cmTryCompileExec +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTryCompileExec.dir/testCXXCompiler.cxx.o -o cmTryCompileExec -rdynamic +gmake[1]: Leaving directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp' + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/gmake "cmTryCompileExec/fast" +/usr/bin/gmake -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build +gmake[1]: Entering directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building CXX object CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o +/usr/bin/c++ -o CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp +Linking CXX executable cmTryCompileExec +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1 +/usr/bin/c++ -v CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o -o cmTryCompileExec -rdynamic +Using built-in specs. +Target: x86_64-redhat-linux +Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux +Thread model: posix +gcc version 4.4.5 20101112 (Red Hat 4.4.5-2) (GCC) +COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/:/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec' '-rdynamic' '-shared-libgcc' '-mtune=generic' + /usr/libexec/gcc/x86_64-redhat-linux/4.4.5/collect2 --no-add-needed --eh-frame-hdr --build-id -m elf_x86_64 --hash-style=gnu -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../.. CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crtn.o +gmake[1]: Leaving directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp' + + +Parsed CXX implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:/usr/bin/gmake "cmTryCompileExec/fast"] + ignore line: [/usr/bin/gmake -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build] + ignore line: [gmake[1]: Entering directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp'] + ignore line: [/usr/bin/cmake -E cmake_progress_report /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp/CMakeFiles 1] + ignore line: [Building CXX object CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -o CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Linking CXX executable cmTryCompileExec] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o -o cmTryCompileExec -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [Target: x86_64-redhat-linux] + ignore line: [Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux] + ignore line: [Thread model: posix] + ignore line: [gcc version 4.4.5 20101112 (Red Hat 4.4.5-2) (GCC) ] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/:/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec' '-rdynamic' '-shared-libgcc' '-mtune=generic'] + link line: [ /usr/libexec/gcc/x86_64-redhat-linux/4.4.5/collect2 --no-add-needed --eh-frame-hdr --build-id -m elf_x86_64 --hash-style=gnu -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../.. CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crtn.o] + arg [/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/collect2] ==> ignore + arg [--no-add-needed] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [--build-id] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-o] ==> ignore + arg [cmTryCompileExec] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64] + arg [-L/lib/../lib64] ==> dir [/lib/../lib64] + arg [-L/usr/lib/../lib64] ==> dir [/usr/lib/../lib64] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../..] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../..] + arg [CMakeFiles/cmTryCompileExec.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crtn.o] ==> ignore + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64] ==> [/usr/lib64] + collapse dir [/lib/../lib64] ==> [/lib64] + collapse dir [/usr/lib/../lib64] ==> [/usr/lib64] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../..] ==> [/usr/lib] + implicit libs: [stdc++;m;c] + implicit dirs: [/usr/lib/gcc/x86_64-redhat-linux/4.4.5;/usr/lib64;/lib64;/usr/lib] + + +Compiling the Fortran compiler identification source file "CMakeFortranCompilerId.F" succeeded. +Compiler: /usr/bin/gfortran +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the Fortran compiler identification source "CMakeFortranCompilerId.F" produced "a.out" + +The Fortran compiler identification is GNU, found in "/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CompilerIdFortran/a.out" + +Determining if the Fortran compiler works passed with the following output: +Change Dir: /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/gmake "cmTryCompileExec/fast" +/usr/bin/gmake -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build +gmake[1]: Entering directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building Fortran object CMakeFiles/cmTryCompileExec.dir/testFortranCompiler.f.o +/usr/bin/gfortran -o CMakeFiles/cmTryCompileExec.dir/testFortranCompiler.f.o -c /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp/testFortranCompiler.f +Linking Fortran executable cmTryCompileExec +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1 +/usr/bin/gfortran CMakeFiles/cmTryCompileExec.dir/testFortranCompiler.f.o -o cmTryCompileExec -rdynamic +gmake[1]: Leaving directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp' + + +Detecting Fortran compiler ABI info compiled with the following output: +Change Dir: /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/gmake "cmTryCompileExec/fast" +/usr/bin/gmake -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build +gmake[1]: Entering directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building Fortran object CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o +/usr/bin/gfortran -o CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o -c /usr/share/cmake/Modules/CMakeFortranCompilerABI.F +Linking Fortran executable cmTryCompileExec +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1 +/usr/bin/gfortran -v CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o -o cmTryCompileExec -rdynamic +Driving: /usr/bin/gfortran -v CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o -o cmTryCompileExec -rdynamic -lgfortranbegin -lgfortran -lm -shared-libgcc +Using built-in specs. +Target: x86_64-redhat-linux +Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux +Thread model: posix +gcc version 4.4.5 20101112 (Red Hat 4.4.5-2) (GCC) +COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/:/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec' '-rdynamic' '-shared-libgcc' '-mtune=generic' + /usr/libexec/gcc/x86_64-redhat-linux/4.4.5/collect2 --no-add-needed --eh-frame-hdr --build-id -m elf_x86_64 --hash-style=gnu -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../.. CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o -lgfortranbegin -lgfortran -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crtn.o +gmake[1]: Leaving directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp' + + +Parsed Fortran implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:/usr/bin/gmake "cmTryCompileExec/fast"] + ignore line: [/usr/bin/gmake -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build] + ignore line: [gmake[1]: Entering directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp'] + ignore line: [/usr/bin/cmake -E cmake_progress_report /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp/CMakeFiles 1] + ignore line: [Building Fortran object CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o] + ignore line: [/usr/bin/gfortran -o CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o -c /usr/share/cmake/Modules/CMakeFortranCompilerABI.F] + ignore line: [Linking Fortran executable cmTryCompileExec] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1] + ignore line: [/usr/bin/gfortran -v CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o -o cmTryCompileExec -rdynamic ] + ignore line: [Driving: /usr/bin/gfortran -v CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o -o cmTryCompileExec -rdynamic -lgfortranbegin -lgfortran -lm -shared-libgcc] + ignore line: [Using built-in specs.] + ignore line: [Target: x86_64-redhat-linux] + ignore line: [Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux] + ignore line: [Thread model: posix] + ignore line: [gcc version 4.4.5 20101112 (Red Hat 4.4.5-2) (GCC) ] + ignore line: [COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/:/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec' '-rdynamic' '-shared-libgcc' '-mtune=generic'] + link line: [ /usr/libexec/gcc/x86_64-redhat-linux/4.4.5/collect2 --no-add-needed --eh-frame-hdr --build-id -m elf_x86_64 --hash-style=gnu -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o cmTryCompileExec /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../.. CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o -lgfortranbegin -lgfortran -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crtn.o] + arg [/usr/libexec/gcc/x86_64-redhat-linux/4.4.5/collect2] ==> ignore + arg [--no-add-needed] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [--build-id] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-o] ==> ignore + arg [cmTryCompileExec] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64] + arg [-L/lib/../lib64] ==> dir [/lib/../lib64] + arg [-L/usr/lib/../lib64] ==> dir [/usr/lib/../lib64] + arg [-L/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../..] ==> dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../..] + arg [CMakeFiles/cmTryCompileExec.dir/CMakeFortranCompilerABI.F.o] ==> ignore + arg [-lgfortranbegin] ==> lib [gfortranbegin] + arg [-lgfortran] ==> lib [gfortran] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64/crtn.o] ==> ignore + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] ==> [/usr/lib/gcc/x86_64-redhat-linux/4.4.5] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../../../lib64] ==> [/usr/lib64] + collapse dir [/lib/../lib64] ==> [/lib64] + collapse dir [/usr/lib/../lib64] ==> [/usr/lib64] + collapse dir [/usr/lib/gcc/x86_64-redhat-linux/4.4.5/../../..] ==> [/usr/lib] + implicit libs: [gfortranbegin;gfortran;m;c] + implicit dirs: [/usr/lib/gcc/x86_64-redhat-linux/4.4.5;/usr/lib64;/lib64;/usr/lib] + + +Determining if the Fortran compiler supports Fortran 90 passed with the following output: +Change Dir: /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/gmake "cmTryCompileExec/fast" +/usr/bin/gmake -f CMakeFiles/cmTryCompileExec.dir/build.make CMakeFiles/cmTryCompileExec.dir/build +gmake[1]: Entering directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building Fortran object CMakeFiles/cmTryCompileExec.dir/testFortranCompilerF90.f90.o +/usr/bin/gfortran -o CMakeFiles/cmTryCompileExec.dir/testFortranCompilerF90.f90.o -c /users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp/testFortranCompilerF90.f90 +Linking Fortran executable cmTryCompileExec +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec.dir/link.txt --verbose=1 +/usr/bin/gfortran CMakeFiles/cmTryCompileExec.dir/testFortranCompilerF90.f90.o -o cmTryCompileExec -rdynamic +gmake[1]: Leaving directory `/scheraga/users/adam/unres/source/unres/src_MD-M/CMakeFiles/CMakeTmp' + + diff --git a/source/unres/src_MD-M/CMakeFiles/CMakeSystem.cmake b/source/unres/src_MD-M/CMakeFiles/CMakeSystem.cmake new file mode 100644 index 0000000..5b0ab32 --- /dev/null +++ b/source/unres/src_MD-M/CMakeFiles/CMakeSystem.cmake @@ -0,0 +1,15 @@ + + +SET(CMAKE_SYSTEM "Linux-2.6.34.9-69.fc13.x86_64") +SET(CMAKE_SYSTEM_NAME "Linux") +SET(CMAKE_SYSTEM_VERSION "2.6.34.9-69.fc13.x86_64") +SET(CMAKE_SYSTEM_PROCESSOR "x86_64") + +SET(CMAKE_HOST_SYSTEM "Linux-2.6.34.9-69.fc13.x86_64") +SET(CMAKE_HOST_SYSTEM_NAME "Linux") +SET(CMAKE_HOST_SYSTEM_VERSION "2.6.34.9-69.fc13.x86_64") +SET(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + +SET(CMAKE_CROSSCOMPILING "FALSE") + +SET(CMAKE_SYSTEM_LOADED 1) diff --git a/source/unres/src_MD-M/CMakeFiles/CompilerIdC/CMakeCCompilerId.c b/source/unres/src_MD-M/CMakeFiles/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..f262e30 --- /dev/null +++ b/source/unres/src_MD-M/CMakeFiles/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,188 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + +#elif defined(__WATCOMC__) +# define COMPILER_ID "Watcom" + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + +#elif defined(__IBMC__) +# if defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" +# elif __IBMC__ >= 800 +# define COMPILER_ID "XL" +# else +# define COMPILER_ID "VisualAge" +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + +#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +/* Analog Devices C++ compiler for Blackfin, TigerSHARC and + SHARC (21000) DSPs */ +# define COMPILER_ID "ADSP" + +/* IAR Systems compiler for embedded systems. + http://www.iar.com + Not supported yet by CMake +#elif defined(__IAR_SYSTEMS_ICC__) +# define COMPILER_ID "IAR" */ + +/* sdcc, the small devices C compiler for embedded systems, + http://sdcc.sourceforge.net */ +#elif defined(SDCC) +# define COMPILER_ID "SDCC" + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" + +/* This compiler is either not known or is too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" + +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU) || defined(__HAIKU__) || defined(_HAIKU) +# define PLATFORM_ID "Haiku" +/* Haiku also defines __BEOS__ so we must + put it prior to the check for __BEOS__ +*/ + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; + + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + (void)argv; + return require; +} +#endif diff --git a/source/unres/src_MD-M/CMakeFiles/CompilerIdC/a.out b/source/unres/src_MD-M/CMakeFiles/CompilerIdC/a.out new file mode 100755 index 0000000000000000000000000000000000000000..6d52626c0b8ae4238890f65aa9dea580d74b1865 GIT binary patch literal 6478 zcmcIoZ){sv6+eDXQg3UMv}V zX~e&-YKYn;q4V6d&;ZN%kv33SV?fjG0@F5|1EJy}QL!+Ju?tS40ZM}4Dz8@Jb{>BteU6M=q}*QkmGV*9UH z2`VpgCl?!aB`GwdH~^ud_Y~@}i!AZ)iTL?wIyKVM{b)MTo=#;7)9ur}J?%Z+;e0mS zrTlNjW~ht1_dcx}lz6N|j%=^TKYdH8Kf5+@uK(7a8?TqfuUz^5clSg2Z=WGu`D5|F zPNWm8BmFR9WP4dM&GE@>#>`vsoMoDT-5RA{^nhtnnJXsasSNCnMR!Hau5ed)yK08| zF!Z zzOwyK4MC_pavAfMEjpHnpCFyTFIFm*&iA9m-#lv+-!*3cdVT*;bYXtJK?h^u+}nyQ zSV)!@Q1C{%Og4;C<56tDczNE^DsL+jWoLTYC|)^8f-_H)Q4R`UeCv&-VL-K4NbRMo zbHtsy<2Pon`ivcy@}aSoE&YJb&ijmFV-kfb>wlqyN{wG8l^vII@BXqef<+&hJACo{ z*w|ROWy^8u1L{4oUqd@&*IM_cg3!0X&rYMAipR+I+rQd8xBkaeg1VmfpwR!oEzjZ^L4^93Px z>XB~~L3}Azv_jWo#bcq{M)61pqjjw}w(Uw^@uO(*mT~SQf3*0=rO3TX#d!IBtF80T z^nGH*f5wWp`imd*Rn}iNX3t}cuIAn|N=HH%`gEu@R!W36#jq5Nm8{U#Sm{`(1H;lw zzEP^iA0xgA{V-;4SFDHLqGgBUd^LdIt%UKvT`7FX5w*YV(ig}V8Z|WLoTCdMx_5Bj zr4+wA{b2t!PB^fhcwN4kh~80mGS(?}`N zJf`G(@c{UyTYZ~XuL{tb)`l4UV<;OXfxhO}6Ix_Vlh%(Cw%$&Jr?KAYA=wwv^SRs!L0|9iJ%d;Y`nc|8$dXJbkd5CAhmKfosd#0Vd zCDU&{lzmwt+U zZ~u>b^mV_E2;h3A2srg=ZT9NFiWvDN{gie4kVoHcjqeD;Af>&;sXxW`r#$@^6&XLW zU%ckgFSCA`^=s#Uy9Lpc_P*uOmwjfA1J*2pOvS#yZ(xD^m-wINb?`Lnd&iH&PxMcF z^yOY4_l1xMGWFU&>(LK1=}I!dALJP83Gv#W#|rYF!-e;$VdQG}DsQ~J`U@!Q)Tfgr zr8&0$pY(r?vQB+ER#H06`d)ip{&y%#qT;{oTXMgXdmJ}c9lzq&Wz==rmwSQEhP?KK z7y6DzU(O8%3k0#=nM6-0-6ov&C-~ek!2&Y>qz%y%{yG*2lm5@J{tOFBKSkcFe-kUn zeuoG!6@9rcNj1q*61o=4Vp~;k_9HfQ&k15#^aLhe=8j-QJE&nyoA|?h9Lr(+i~kZA zI#1QJZ}7pa$@{YQ5~ zs_dto)?W_~fb1JiB|qE;vLCqd`>W?wH~s*~`t8P7gRIMLd`voz6oUBy77lV=A#>@R}Xix=fN8IiRb&$G-!YiD{g7~4(F>AhfkxR50=M)_90)L zI1C`J!5Ucf*rlfqAJqIO|0q3&f5K1lIwSLO8gXi8e}j&tT3X5f<0wM@mp$?Sroz|4 z4DVyo((4Le{vCgaIN2TcjGuFe*NfZlRXfYSBdx>q5_R0;&z%+UW(GP=%RFOe5Fb z0rovJQJ9=ODs~3;_A4`k2m1C5n8J}6Dc7v18>zAq*%N<08HwK%48Uoh2e zxeB}9ZOtcNFb^chQ+d43N7C_pKA8uW_rBxmy7M8|jPAo06RC_@$S27um+3@4Yfi*7 tiF6WcRQx3tRj1T-K9w2En(~H*qId&mKUIx9xPjgAq`Ic7H)RzR_!nABGR*)0 literal 0 HcmV?d00001 diff --git a/source/unres/src_MD-M/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp b/source/unres/src_MD-M/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..85081a3 --- /dev/null +++ b/source/unres/src_MD-M/CMakeFiles/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,175 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if defined(__COMO__) +# define COMPILER_ID "Comeau" + +#elif defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + +#elif defined(__WATCOMC__) +# define COMPILER_ID "Watcom" + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + +#elif defined(__IBMCPP__) +# if defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" +# elif __IBMCPP__ >= 800 +# define COMPILER_ID "XL" +# else +# define COMPILER_ID "VisualAge" +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + +#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +/* Analog Devices C++ compiler for Blackfin, TigerSHARC and + SHARC (21000) DSPs */ +# define COMPILER_ID "ADSP" + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" + +/* This compiler is either not known or is too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" + +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU) || defined(__HAIKU__) || defined(_HAIKU) +# define PLATFORM_ID "Haiku" +/* Haiku also defines __BEOS__ so we must + put it prior to the check for __BEOS__ +*/ + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; + + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + (void)argv; + return require; +} diff --git a/source/unres/src_MD-M/CMakeFiles/CompilerIdCXX/a.out b/source/unres/src_MD-M/CMakeFiles/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..da108299f42972fddd3e073fb77589191f6b3bcf GIT binary patch literal 6851 zcmcIoZ)_CT5r22*vkd`k97y=%mXmr^Ce#<(7}w!XyXI`zOOHP>PDDkL^>KH$5AL7t z_RyJ9mB^6#bR~6FK3Gkpy5Eo@HGE2uNZUiSr8H8TDj!0Xd~gv+PJosu4YDZVI`eks zZg+idK2&|u?#%q&%$s?$`)2pO9}EO{I~@+e%_+VmP)gS+5;E>W%q^87VZEYJDB`PP zy{HGo4VNN&kQyA*5)I9?k@Q?Z>yUR6;8YBTXsaO!rW_$s^jB>Pu?9WeV2DhG@JImd zFxE-xpKKVGIMWV_L*aPH4n?%PKz0|%jw#QJDbEk*hF2?%*XmS2LRmo~`sKY!Q5V~R zTY3cf5;~Psu~4s+gkZ{c&w(A8kj8%}9Ou*V*pZ&@r{j_Kcr2OAx959%+IzZv*_5wK z#@`IXVD9$pdtMI6`Dg(NeXoKGpC$Icdw1xA2kXB1y;q+2@K3!r|FS*tdh}|vrYv|uoqjSR|_))+yHhbFw0OG@SinR;opVcGb&6{z~Jwnq)6RD(@ z)k7Iw(}ecyacwX<8q4a@j6WXAW}{hD$>+6nG?PswL-CkCt{v|XFigT20l3j{Sj(c+ ziFlYtMxI7agknkIKXj;XS3v9ZZ4rBdfn9#B%h%=G%HcU>ULBA*%pK?9{kM+6>+cdL zNez34sUM--y4Vt2R6j%kT6)Q_r1);&INYWP$JZL4AGc`}&d&(@)QLNdbH{+0dw@4L zJXdw%ca2xdTerDAqP%ej+?zHiz@a>bCLhn1p>6C!8C`$;9*CWH1BJi7tQKyl6F2W2 z7z$i1&A1hzUcG!llB+{N=6(f=|C*XYpK8&4t@Xx;Ts*lu(E0CkxnNQT>i(W{5+}j*1M!ai+ zzV&y!%$sbGN5!kq>rRBiNirGS1$?2de?R@=;J$l z4u=Ce3-lDwdqAgwVrw;saGW?WC>;6bdKXrL^~)L>r{uE0ejKMCYyzm;x1#w~r+<09 zvmbPfI)||1gfw@sCDuQ*Jp^{<8Q@sma2)`=08~8pBloNI+6rZ&;m6L`T<{JYTER6K zyK$*tLmrzURb>OMu3=uwOmW`WSRORQiabp6GNNr%2bYtauU91Z`J-|QnPH~_chk4l zWyn}ZuuVD@Bx0$&3-ME;j}cu%bTv^X_?)oism^fDIt*BTPmsmBgzZU#hLIy*bNJZ*!~h(`_S2HxJaNeEwdJfVk<0M#=F9b+z*gfClK_>w6- z>VvOQyB-=PX*8Mh9m&Pu*B}-VK9t5n*)idZj3;3{gX$Th=Qw-~W2vM?(4a39jfc>H zxO7|>zF0B_cRiYi`v?fomx_e+knlyvw2@3G5!J>bV9S#5h4oY>3l0r(Gz^_EW+)L0 zgToXI12>->+Zg9a7PO&wB%(>36Zk*U^)NPGtk=#^6SX1DK$uKVz=v;SeI0tl{iNh<%7ZbO9s zdu!VVBCc(==k-5HK%UgGK46~Mp4Z_EfZ^I_d%^3C3If*;P>~JCFt?XMz_rWvyk5_d zJ=Yv?>2hS?8oReVr3pFeuK>R3e^{d?Abrt5G?;Y5j$tI=lx-t z6dO4)Gywjun%mDnF#G54O`ayS!mJED`)7Ct7_?_Mll2Nn@Es!iUMW>?oIgg+17o%? zk$s8my{t&o?jJWPX8Sp^pCkJ>Z1#5lC9VX(@O}6?;4Kj64CRN*QV-$$-@@_il;f~erNKq;VL8sibvGjMsy%aO0ADGp>#>eH z&H>(BBmQ5YzOzY8+4B5Li9ar8Y20cr(1`_Vsd$ z^v~P$KO_A=5>CU5`9;Pl177Q#)dLR#Nz+G z3&R1de`x=p77QF5!XsL(-y%KhH+4l)+Gsp=Box===1~jf@&Zql;!!;s@%3!k(krk- zi$(Gvb$1A3{~5_8665S=U|+vm_{$Hm4SmDjIPJzWX+<%gL~DWlFk&Q@)NciP%;va zLXUg~oR3OSa;qOpj-)g`w*yt!ol~5$hY$ILG4ZI}!q+-uR}|BMxjaCZSrh*O3Lkzn literal 0 HcmV?d00001 diff --git a/source/unres/src_MD-M/CMakeFiles/CompilerIdFortran/CMakeFortranCompilerId.F b/source/unres/src_MD-M/CMakeFiles/CompilerIdFortran/CMakeFortranCompilerId.F new file mode 100644 index 0000000..c92f127 --- /dev/null +++ b/source/unres/src_MD-M/CMakeFiles/CompilerIdFortran/CMakeFortranCompilerId.F @@ -0,0 +1,108 @@ + PROGRAM CMakeFortranCompilerId +#if 0 +! Identify the compiler +#endif +#if defined(__INTEL_COMPILER) || defined(__ICC) + PRINT *, 'INFO:compiler[Intel]' +#elif defined(__SUNPRO_F90) || defined(__SUNPRO_F95) + PRINT *, 'INFO:compiler[SunPro]' +#elif defined(__G95__) + PRINT *, 'INFO:compiler[G95]' +#elif defined(__GNUC__) + PRINT *, 'INFO:compiler[GNU]' +#elif defined(__IBMC__) +# if defined(__COMPILER_VER__) + PRINT *, 'INFO:compiler[zOS]' +# elif __IBMC__ >= 800 + PRINT *, 'INFO:compiler[XL]' +# else + PRINT *, 'INFO:compiler[VisualAge]' +# endif +#elif defined(__PGI) + PRINT *, 'INFO:compiler[PGI]' +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) + PRINT *, 'INFO:compiler[MIPSpro]' +# if 0 +! This compiler is either not known or is too old to define an +! identification macro. Try to identify the platform and guess that +! it is the native compiler. +# endif +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) + PRINT *, 'INFO:compiler[VisualAge]' +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) + PRINT *, 'INFO:compiler[MIPSpro]' +#elif defined(__hpux) || defined(__hpux__) + PRINT *, 'INFO:compiler[HP]' +#elif 1 +# if 0 +! The above 'elif 1' instead of 'else' is to work around a bug in the +! SGI preprocessor which produces both the __sgi and else blocks. +# endif + PRINT *, 'INFO:compiler[]' +#endif + +#if 0 +! Identify the platform +#endif +#if defined(__linux) || defined(__linux__) || defined(linux) + PRINT *, 'INFO:platform[Linux]' +#elif defined(__CYGWIN__) + PRINT *, 'INFO:platform[Cygwin]' +#elif defined(__MINGW32__) + PRINT *, 'INFO:platform[MinGW]' +#elif defined(__APPLE__) + PRINT *, 'INFO:platform[Darwin]' +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) + PRINT *, 'INFO:platform[Windows]' +#elif defined(__FreeBSD__) || defined(__FreeBSD) + PRINT *, 'INFO:platform[FreeBSD]' +#elif defined(__NetBSD__) || defined(__NetBSD) + PRINT *, 'INFO:platform[NetBSD]' +#elif defined(__OpenBSD__) || defined(__OPENBSD) + PRINT *, 'INFO:platform[OpenBSD]' +#elif defined(__sun) || defined(sun) + PRINT *, 'INFO:platform[SunOS]' +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) + PRINT *, 'INFO:platform[AIX]' +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) + PRINT *, 'INFO:platform[IRIX]' +#elif defined(__hpux) || defined(__hpux__) + PRINT *, 'INFO:platform[HP-UX]' +#elif defined(__HAIKU) || defined(__HAIKU__) || defined(_HAIKU) + PRINT *, 'INFO:platform[Haiku]' +# if 0 +! Haiku also defines __BEOS__ so we must +! put it prior to the check for __BEOS__ +# endif +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) + PRINT *, 'INFO:platform[BeOS]' +#elif defined(__QNX__) || defined(__QNXNTO__) + PRINT *, 'INFO:platform[QNX]' +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) + PRINT *, 'INFO:platform[Tru64]' +#elif defined(__riscos) || defined(__riscos__) + PRINT *, 'INFO:platform[RISCos]' +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) + PRINT *, 'INFO:platform[SINIX]' +#elif defined(__UNIX_SV__) + PRINT *, 'INFO:platform[UNIX_SV]' +#elif defined(__bsdos__) + PRINT *, 'INFO:platform[BSDOS]' +#elif defined(_MPRAS) || defined(MPRAS) + PRINT *, 'INFO:platform[MP-RAS]' +#elif defined(__osf) || defined(__osf__) + PRINT *, 'INFO:platform[OSF1]' +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) + PRINT *, 'INFO:platform[SCO_SV]' +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) + PRINT *, 'INFO:platform[ULTRIX]' +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) + PRINT *, 'INFO:platform[Xenix]' +#elif 1 +# if 0 +! The above 'elif 1' instead of 'else' is to work around a bug in the +! SGI preprocessor which produces both the __sgi and else blocks. +# endif + PRINT *, 'INFO:platform[]' +#endif + END diff --git a/source/unres/src_MD-M/CMakeFiles/CompilerIdFortran/a.out b/source/unres/src_MD-M/CMakeFiles/CompilerIdFortran/a.out new file mode 100755 index 0000000000000000000000000000000000000000..63aa73f1e59ad9dca8aa09c8136ee9d2041a6297 GIT binary patch literal 7916 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 XG7NdrQ3{oIeCu*~k)NRC?23N_dw!+8 literal 0 HcmV?d00001 diff --git a/source/unres/src_MD-M/CMakeFiles/cmake.check_cache b/source/unres/src_MD-M/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/source/unres/src_MD-M/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/source/unres/src_MD-M/energy_p_new_barrier.F.orig b/source/unres/src_MD-M/energy_p_new_barrier.F.orig new file mode 100644 index 0000000..ac5a20a --- /dev/null +++ b/source/unres/src_MD-M/energy_p_new_barrier.F.orig @@ -0,0 +1,8915 @@ + subroutine etotal(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" + double precision weights_(n_ene) +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene) + include 'COMMON.LOCAL' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' +#ifdef MPI +c print*,"ETOTAL Processor",fg_rank," absolute rank",myrank, +c & " nfgtasks",nfgtasks + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (fg_rank.eq.0) then + call MPI_Bcast(0,1,MPI_INTEGER,king,FG_COMM,IERROR) +c print *,"Processor",myrank," BROADCAST iorder" +C FG master sets up the WEIGHTS_ array which will be broadcast to the +C FG slaves as WEIGHTS array. + weights_(1)=wsc + weights_(2)=wscp + weights_(3)=welec + weights_(4)=wcorr + weights_(5)=wcorr5 + weights_(6)=wcorr6 + weights_(7)=wel_loc + weights_(8)=wturn3 + weights_(9)=wturn4 + weights_(10)=wturn6 + weights_(11)=wang + weights_(12)=wscloc + weights_(13)=wtor + weights_(14)=wtor_d + weights_(15)=wstrain + weights_(16)=wvdwpp + weights_(17)=wbond + weights_(18)=scal14 + weights_(21)=wsccor +C FG Master broadcasts the WEIGHTS_ array + call MPI_Bcast(weights_(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + else +C FG slaves receive the WEIGHTS array + call MPI_Bcast(weights(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + wsc=weights(1) + wscp=weights(2) + welec=weights(3) + wcorr=weights(4) + wcorr5=weights(5) + wcorr6=weights(6) + wel_loc=weights(7) + wturn3=weights(8) + wturn4=weights(9) + wturn6=weights(10) + wang=weights(11) + wscloc=weights(12) + wtor=weights(13) + wtor_d=weights(14) + wstrain=weights(15) + wvdwpp=weights(16) + wbond=weights(17) + scal14=weights(18) + wsccor=weights(21) + endif + time_Bcast=time_Bcast+MPI_Wtime()-time00 + time_Bcastw=time_Bcastw+MPI_Wtime()-time00 +c call chainbuild_cart + endif +c print *,'Processor',myrank,' calling etotal ipot=',ipot +c print *,'Processor',myrank,' nnt=',nnt,' nct=',nct +#else +c if (modecalc.eq.12.or.modecalc.eq.14) then +c call int_from_cart1(.false.) +c endif +#endif +#ifdef TIMING + time00=MPI_Wtime() +#endif +C +C Compute the side-chain and electrostatic interaction energy +C + goto (101,102,103,104,105,106) ipot +C Lennard-Jones potential. + 101 call elj(evdw) +cd print '(a)','Exit ELJ' + goto 107 +C Lennard-Jones-Kihara potential (shifted). + 102 call eljk(evdw) + goto 107 +C Berne-Pechukas potential (dilated LJ, angular dependence). + 103 call ebp(evdw) + goto 107 +C Gay-Berne potential (shifted LJ, angular dependence). + 104 call egb(evdw) + goto 107 +C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence). + 105 call egbv(evdw) + goto 107 +C Soft-sphere potential + 106 call e_softsphere(evdw) +C +C Calculate electrostatic (H-bonding) energy of the main chain. +C + 107 continue +c print *,"Processor",myrank," computed USCSC" +#ifdef TIMING + time01=MPI_Wtime() +#endif + call vec_and_deriv +#ifdef TIMING + time_vec=time_vec+MPI_Wtime()-time01 +#endif +c print *,"Processor",myrank," left VEC_AND_DERIV" + if (ipot.lt.6) then +#ifdef SPLITELE + if (welec.gt.0d0.or.wvdwpp.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#else + if (welec.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#endif + call eelec(ees,evdw1,eel_loc,eello_turn3,eello_turn4) + else + ees=0.0d0 + evdw1=0.0d0 + eel_loc=0.0d0 + eello_turn3=0.0d0 + eello_turn4=0.0d0 + endif + else +c write (iout,*) "Soft-spheer ELEC potential" + call eelec_soft_sphere(ees,evdw1,eel_loc,eello_turn3, + & eello_turn4) + endif +c print *,"Processor",myrank," computed UELEC" +C +C Calculate excluded-volume interaction energy between peptide groups +C and side chains. +C + if (ipot.lt.6) then + if(wscp.gt.0d0) then + call escp(evdw2,evdw2_14) + else + evdw2=0 + evdw2_14=0 + endif + else +c write (iout,*) "Soft-sphere SCP potential" + call escp_soft_sphere(evdw2,evdw2_14) + endif +c +c Calculate the bond-stretching energy +c + call ebond(estr) +C +C Calculate the disulfide-bridge and other energy and the contributions +C from other distance constraints. +cd print *,'Calling EHPB' + call edis(ehpb) +cd print *,'EHPB exitted succesfully.' +C +C Calculate the virtual-bond-angle energy. +C + if (wang.gt.0d0) then + call ebend(ebe) + else + ebe=0 + endif +c print *,"Processor",myrank," computed UB" +C +C Calculate the SC local energy. +C + call esc(escloc) +c print *,"Processor",myrank," computed USC" +C +C Calculate the virtual-bond torsional energy. +C +cd print *,'nterm=',nterm + if (wtor.gt.0) then + call etor(etors,edihcnstr) + else + etors=0 + edihcnstr=0 + endif +c print *,"Processor",myrank," computed Utor" +C +C 6/23/01 Calculate double-torsional energy +C + if (wtor_d.gt.0) then + call etor_d(etors_d) + else + etors_d=0 + endif +c print *,"Processor",myrank," computed Utord" +C +C 21/5/07 Calculate local sicdechain correlation energy +C + if (wsccor.gt.0.0d0) then + call eback_sc_corr(esccor) + else + esccor=0.0d0 + endif +c print *,"Processor",myrank," computed Usccorr" +C +C 12/1/95 Multi-body terms +C + n_corr=0 + n_corr1=0 + if ((wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 + & .or. wturn6.gt.0.0d0) .and. ipot.lt.6) then + call multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr,n_corr1) +cd write(2,*)'multibody_eello n_corr=',n_corr,' n_corr1=',n_corr1, +cd &" ecorr",ecorr," ecorr5",ecorr5," ecorr6",ecorr6," eturn6",eturn6 + else + ecorr=0.0d0 + ecorr5=0.0d0 + ecorr6=0.0d0 + eturn6=0.0d0 + endif + if ((wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) .and. ipot.lt.6) then + call multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) +cd write (iout,*) "multibody_hb ecorr",ecorr + endif +c print *,"Processor",myrank," computed Ucorr" +C +C If performing constraint dynamics, call the constraint energy +C after the equilibration time + if(usampl.and.totT.gt.eq_time) then + call EconstrQ + call Econstr_back + else + Uconst=0.0d0 + Uconst_back=0.0d0 + endif +#ifdef TIMING + time_enecalc=time_enecalc+MPI_Wtime()-time00 +#endif +c print *,"Processor",myrank," computed Uconstr" +#ifdef TIMING + time00=MPI_Wtime() +#endif +c +C Sum the energies +C + energia(1)=evdw +#ifdef SCP14 + energia(2)=evdw2-evdw2_14 + energia(18)=evdw2_14 +#else + energia(2)=evdw2 + energia(18)=0.0d0 +#endif +#ifdef SPLITELE + energia(3)=ees + energia(16)=evdw1 +#else + energia(3)=ees+evdw1 + energia(16)=0.0d0 +#endif + energia(4)=ecorr + energia(5)=ecorr5 + energia(6)=ecorr6 + energia(7)=eel_loc + energia(8)=eello_turn3 + energia(9)=eello_turn4 + energia(10)=eturn6 + energia(11)=ebe + energia(12)=escloc + energia(13)=etors + energia(14)=etors_d + energia(15)=ehpb + energia(19)=edihcnstr + energia(17)=estr + energia(20)=Uconst+Uconst_back + energia(21)=esccor +c print *," Processor",myrank," calls SUM_ENERGY" + call sum_energy(energia,.true.) +c print *," Processor",myrank," left SUM_ENERGY" +#ifdef TIMING + time_sumene=time_sumene+MPI_Wtime()-time00 +#endif + return + end +c------------------------------------------------------------------------------- + subroutine sum_energy(energia,reduce) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene),enebuff(0:n_ene+1) + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' + logical reduce +#ifdef MPI + if (nfgtasks.gt.1 .and. reduce) then +#ifdef DEBUG + write (iout,*) "energies before REDUCE" + call enerprint(energia) + call flush(iout) +#endif + do i=0,n_ene + enebuff(i)=energia(i) + enddo + time00=MPI_Wtime() + call MPI_Barrier(FG_COMM,IERR) + time_barrier_e=time_barrier_e+MPI_Wtime()-time00 + time00=MPI_Wtime() + call MPI_Reduce(enebuff(0),energia(0),n_ene+1, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) +#ifdef DEBUG + write (iout,*) "energies after REDUCE" + call enerprint(energia) + call flush(iout) +#endif + time_Reduce=time_Reduce+MPI_Wtime()-time00 + endif + if (fg_rank.eq.0) then +#endif + evdw=energia(1) +#ifdef SCP14 + evdw2=energia(2)+energia(18) + evdw2_14=energia(18) +#else + evdw2=energia(2) +#endif +#ifdef SPLITELE + ees=energia(3) + evdw1=energia(16) +#else + ees=energia(3) + evdw1=0.0d0 +#endif + ecorr=energia(4) + ecorr5=energia(5) + ecorr6=energia(6) + eel_loc=energia(7) + eello_turn3=energia(8) + eello_turn4=energia(9) + eturn6=energia(10) + ebe=energia(11) + escloc=energia(12) + etors=energia(13) + etors_d=energia(14) + ehpb=energia(15) + edihcnstr=energia(19) + estr=energia(17) + Uconst=energia(20) + esccor=energia(21) +#ifdef SPLITELE + etot=wsc*evdw+wscp*evdw2+welec*ees+wvdwpp*evdw1 + & +wang*ebe+wtor*etors+wscloc*escloc + & +wstrain*ehpb+wcorr*ecorr+wcorr5*ecorr5 + & +wcorr6*ecorr6+wturn4*eello_turn4+wturn3*eello_turn3 + & +wturn6*eturn6+wel_loc*eel_loc+edihcnstr+wtor_d*etors_d + & +wbond*estr+Uconst+wsccor*esccor +#else + etot=wsc*evdw+wscp*evdw2+welec*(ees+evdw1) + & +wang*ebe+wtor*etors+wscloc*escloc + & +wstrain*ehpb+wcorr*ecorr+wcorr5*ecorr5 + & +wcorr6*ecorr6+wturn4*eello_turn4+wturn3*eello_turn3 + & +wturn6*eturn6+wel_loc*eel_loc+edihcnstr+wtor_d*etors_d + & +wbond*estr+Uconst+wsccor*esccor +#endif + energia(0)=etot +c detecting NaNQ +#ifdef ISNAN +#ifdef AIX + if (isnan(etot).ne.0) energia(0)=1.0d+99 +#else + if (isnan(etot)) energia(0)=1.0d+99 +#endif +#else + i=0 +#ifdef WINPGI + idumm=proc_proc(etot,i) +#else + call proc_proc(etot,i) +#endif + if(i.eq.1)energia(0)=1.0d+99 +#endif +#ifdef MPI + endif +#endif + return + end +c------------------------------------------------------------------------------- + subroutine sum_gradient + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include 'mpif.h' + double precision gradbufc(3,maxres),gradbufx(3,maxres), + & glocbuf(4*maxres),gradbufc_sum(3,maxres) +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' + include 'COMMON.MAXGRAD' +#ifdef TIMING + time01=MPI_Wtime() +#endif +#ifdef DEBUG + write (iout,*) "sum_gradient gvdwc, gvdwx" + do i=1,nres + write (iout,'(i3,3f10.5,5x,3f10.5,5x,f10.5)') + & i,(gvdwx(j,i),j=1,3),(gvdwc(j,i),j=1,3) + enddo + call flush(iout) +#endif +#ifdef MPI +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (nfgtasks.gt.1 .and. fg_rank.eq.0) + & call MPI_Bcast(1,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif +C +C 9/29/08 AL Transform parts of gradients in site coordinates to the gradient +C in virtual-bond-vector coordinates +C +#ifdef DEBUG +c write (iout,*) "gel_loc gel_loc_long and gel_loc_loc" +c do i=1,nres-1 +c write (iout,'(i5,3f10.5,2x,3f10.5,2x,f10.5)') +c & i,(gel_loc(j,i),j=1,3),(gel_loc_long(j,i),j=1,3),gel_loc_loc(i) +c enddo +c write (iout,*) "gel_loc_tur3 gel_loc_turn4" +c do i=1,nres-1 +c write (iout,'(i5,3f10.5,2x,f10.5)') +c & i,(gcorr4_turn(j,i),j=1,3),gel_loc_turn4(i) +c enddo + write (iout,*) "gradcorr5 gradcorr5_long gradcorr5_loc" + do i=1,nres + write (iout,'(i3,3f10.5,5x,3f10.5,5x,f10.5)') + & i,(gradcorr5(j,i),j=1,3),(gradcorr5_long(j,i),j=1,3), + & g_corr5_loc(i) + enddo + call flush(iout) +#endif +#ifdef SPLITELE + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#else + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+ + & wbond*gradb(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#endif +#ifdef MPI + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +#ifdef DEBUG + write (iout,*) "gradbufc before allreduce" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + do i=1,nres + do j=1,3 + gradbufc_sum(j,i)=gradbufc(j,i) + enddo + enddo +c call MPI_AllReduce(gradbufc(1,1),gradbufc_sum(1,1),3*nres, +c & MPI_DOUBLE_PRECISION,MPI_SUM,FG_COMM,IERR) +c time_reduce=time_reduce+MPI_Wtime()-time00 +#ifdef DEBUG +c write (iout,*) "gradbufc_sum after allreduce" +c do i=1,nres +c write (iout,'(i3,3f10.5)') i,(gradbufc_sum(j,i),j=1,3) +c enddo +c call flush(iout) +#endif +#ifdef TIMING +c time_allreduce=time_allreduce+MPI_Wtime()-time00 +#endif + do i=nnt,nres + do k=1,3 + gradbufc(k,i)=0.0d0 + enddo + enddo +#ifdef DEBUG + write (iout,*) "igrad_start",igrad_start," igrad_end",igrad_end + write (iout,*) (i," jgrad_start",jgrad_start(i), + & " jgrad_end ",jgrad_end(i), + & i=igrad_start,igrad_end) +#endif +c +c Obsolete and inefficient code; we can make the effort O(n) and, therefore, +c do not parallelize this part. +c +c do i=igrad_start,igrad_end +c do j=jgrad_start(i),jgrad_end(i) +c do k=1,3 +c gradbufc(k,i)=gradbufc(k,i)+gradbufc_sum(k,j) +c enddo +c enddo +c enddo + do j=1,3 + gradbufc(j,nres-1)=gradbufc_sum(j,nres) + enddo + do i=nres-2,nnt,-1 + do j=1,3 + gradbufc(j,i)=gradbufc(j,i+1)+gradbufc_sum(j,i+1) + enddo + enddo +#ifdef DEBUG + write (iout,*) "gradbufc after summing" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + else +#endif +#ifdef DEBUG + write (iout,*) "gradbufc" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + do i=1,nres + do j=1,3 + gradbufc_sum(j,i)=gradbufc(j,i) + gradbufc(j,i)=0.0d0 + enddo + enddo + do j=1,3 + gradbufc(j,nres-1)=gradbufc_sum(j,nres) + enddo + do i=nres-2,nnt,-1 + do j=1,3 + gradbufc(j,i)=gradbufc(j,i+1)+gradbufc_sum(j,i+1) + enddo + enddo +c do i=nnt,nres-1 +c do k=1,3 +c gradbufc(k,i)=0.0d0 +c enddo +c do j=i+1,nres +c do k=1,3 +c gradbufc(k,i)=gradbufc(k,i)+gradbufc(k,j) +c enddo +c enddo +c enddo +#ifdef DEBUG + write (iout,*) "gradbufc after summing" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif +#ifdef MPI + endif +#endif + do k=1,3 + gradbufc(k,nres)=0.0d0 + enddo + do i=1,nct + do j=1,3 +#ifdef SPLITELE + gradc(j,i,icg)=gradbufc(j,i)+welec*gelc(j,i)+ + & wel_loc*gel_loc(j,i)+ + & 0.5d0*(wscp*gvdwc_scpp(j,i)+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i))+ + & wbond*gradb(j,i)+ + & wcorr*gradcorr(j,i)+ + & wturn3*gcorr3_turn(j,i)+ + & wturn4*gcorr4_turn(j,i)+ + & wcorr5*gradcorr5(j,i)+ + & wcorr6*gradcorr6(j,i)+ + & wturn6*gcorr6_turn(j,i)+ + & wsccor*gsccorc(j,i) + & +wscloc*gscloc(j,i) +#else + gradc(j,i,icg)=gradbufc(j,i)+welec*gelc(j,i)+ + & wel_loc*gel_loc(j,i)+ + & 0.5d0*(wscp*gvdwc_scpp(j,i)+ + & welec*gelc_long(j,i) + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i))+ + & wbond*gradb(j,i)+ + & wcorr*gradcorr(j,i)+ + & wturn3*gcorr3_turn(j,i)+ + & wturn4*gcorr4_turn(j,i)+ + & wcorr5*gradcorr5(j,i)+ + & wcorr6*gradcorr6(j,i)+ + & wturn6*gcorr6_turn(j,i)+ + & wsccor*gsccorc(j,i) + & +wscloc*gscloc(j,i) +#endif + gradx(j,i,icg)=wsc*gvdwx(j,i)+wscp*gradx_scp(j,i)+ + & wbond*gradbx(j,i)+ + & wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+ + & wsccor*gsccorx(j,i) + & +wscloc*gsclocx(j,i) + enddo + enddo +#ifdef DEBUG + write (iout,*) "gloc before adding corr" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif + do i=1,nres-3 + gloc(i,icg)=gloc(i,icg)+wcorr*gcorr_loc(i) + & +wcorr5*g_corr5_loc(i) + & +wcorr6*g_corr6_loc(i) + & +wturn4*gel_loc_turn4(i) + & +wturn3*gel_loc_turn3(i) + & +wturn6*gel_loc_turn6(i) + & +wel_loc*gel_loc_loc(i) + & +wsccor*gsccor_loc(i) + enddo +#ifdef DEBUG + write (iout,*) "gloc after adding corr" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif +#ifdef MPI + if (nfgtasks.gt.1) then + do j=1,3 + do i=1,nres + gradbufc(j,i)=gradc(j,i,icg) + gradbufx(j,i)=gradx(j,i,icg) + enddo + enddo + do i=1,4*nres + glocbuf(i)=gloc(i,icg) + enddo + time00=MPI_Wtime() + call MPI_Barrier(FG_COMM,IERR) + time_barrier_g=time_barrier_g+MPI_Wtime()-time00 + time00=MPI_Wtime() + call MPI_Reduce(gradbufc(1,1),gradc(1,1,icg),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + call MPI_Reduce(gradbufx(1,1),gradx(1,1,icg),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + call MPI_Reduce(glocbuf(1),gloc(1,icg),4*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + time_reduce=time_reduce+MPI_Wtime()-time00 +#ifdef DEBUG + write (iout,*) "gloc after reduce" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif + endif +#endif + if (gnorm_check) then +c +c Compute the maximum elements of the gradient +c + gvdwc_max=0.0d0 + gvdwc_scp_max=0.0d0 + gelc_max=0.0d0 + gvdwpp_max=0.0d0 + gradb_max=0.0d0 + ghpbc_max=0.0d0 + gradcorr_max=0.0d0 + gel_loc_max=0.0d0 + gcorr3_turn_max=0.0d0 + gcorr4_turn_max=0.0d0 + gradcorr5_max=0.0d0 + gradcorr6_max=0.0d0 + gcorr6_turn_max=0.0d0 + gsccorc_max=0.0d0 + gscloc_max=0.0d0 + gvdwx_max=0.0d0 + gradx_scp_max=0.0d0 + ghpbx_max=0.0d0 + gradxorr_max=0.0d0 + gsccorx_max=0.0d0 + gsclocx_max=0.0d0 + do i=1,nct + gvdwc_norm=dsqrt(scalar(gvdwc(1,i),gvdwc(1,i))) + if (gvdwc_norm.gt.gvdwc_max) gvdwc_max=gvdwc_norm + gvdwc_scp_norm=dsqrt(scalar(gvdwc_scp(1,i),gvdwc_scp(1,i))) + if (gvdwc_scp_norm.gt.gvdwc_scp_max) + & gvdwc_scp_max=gvdwc_scp_norm + gelc_norm=dsqrt(scalar(gelc(1,i),gelc(1,i))) + if (gelc_norm.gt.gelc_max) gelc_max=gelc_norm + gvdwpp_norm=dsqrt(scalar(gvdwpp(1,i),gvdwpp(1,i))) + if (gvdwpp_norm.gt.gvdwpp_max) gvdwpp_max=gvdwpp_norm + gradb_norm=dsqrt(scalar(gradb(1,i),gradb(1,i))) + if (gradb_norm.gt.gradb_max) gradb_max=gradb_norm + ghpbc_norm=dsqrt(scalar(ghpbc(1,i),ghpbc(1,i))) + if (ghpbc_norm.gt.ghpbc_max) ghpbc_max=ghpbc_norm + gradcorr_norm=dsqrt(scalar(gradcorr(1,i),gradcorr(1,i))) + if (gradcorr_norm.gt.gradcorr_max) gradcorr_max=gradcorr_norm + gel_loc_norm=dsqrt(scalar(gel_loc(1,i),gel_loc(1,i))) + if (gel_loc_norm.gt.gel_loc_max) gel_loc_max=gel_loc_norm + gcorr3_turn_norm=dsqrt(scalar(gcorr3_turn(1,i), + & gcorr3_turn(1,i))) + if (gcorr3_turn_norm.gt.gcorr3_turn_max) + & gcorr3_turn_max=gcorr3_turn_norm + gcorr4_turn_norm=dsqrt(scalar(gcorr4_turn(1,i), + & gcorr4_turn(1,i))) + if (gcorr4_turn_norm.gt.gcorr4_turn_max) + & gcorr4_turn_max=gcorr4_turn_norm + gradcorr5_norm=dsqrt(scalar(gradcorr5(1,i),gradcorr5(1,i))) + if (gradcorr5_norm.gt.gradcorr5_max) + & gradcorr5_max=gradcorr5_norm + gradcorr6_norm=dsqrt(scalar(gradcorr6(1,i),gradcorr6(1,i))) + if (gradcorr6_norm.gt.gradcorr6_max) gcorr6_max=gradcorr6_norm + gcorr6_turn_norm=dsqrt(scalar(gcorr6_turn(1,i), + & gcorr6_turn(1,i))) + if (gcorr6_turn_norm.gt.gcorr6_turn_max) + & gcorr6_turn_max=gcorr6_turn_norm + gsccorr_norm=dsqrt(scalar(gsccorc(1,i),gsccorc(1,i))) + if (gsccorr_norm.gt.gsccorr_max) gsccorr_max=gsccorr_norm + gscloc_norm=dsqrt(scalar(gscloc(1,i),gscloc(1,i))) + if (gscloc_norm.gt.gscloc_max) gscloc_max=gscloc_norm + gvdwx_norm=dsqrt(scalar(gvdwx(1,i),gvdwx(1,i))) + if (gvdwx_norm.gt.gvdwx_max) gvdwx_max=gvdwx_norm + gradx_scp_norm=dsqrt(scalar(gradx_scp(1,i),gradx_scp(1,i))) + if (gradx_scp_norm.gt.gradx_scp_max) + & gradx_scp_max=gradx_scp_norm + ghpbx_norm=dsqrt(scalar(ghpbx(1,i),ghpbx(1,i))) + if (ghpbx_norm.gt.ghpbx_max) ghpbx_max=ghpbx_norm + gradxorr_norm=dsqrt(scalar(gradxorr(1,i),gradxorr(1,i))) + if (gradxorr_norm.gt.gradxorr_max) gradxorr_max=gradxorr_norm + gsccorrx_norm=dsqrt(scalar(gsccorx(1,i),gsccorx(1,i))) + if (gsccorrx_norm.gt.gsccorrx_max) gsccorrx_max=gsccorrx_norm + gsclocx_norm=dsqrt(scalar(gsclocx(1,i),gsclocx(1,i))) + if (gsclocx_norm.gt.gsclocx_max) gsclocx_max=gsclocx_norm + enddo + if (gradout) then +#ifdef AIX + open(istat,file=statname,position="append") +#else + open(istat,file=statname,access="append") +#endif + write (istat,'(1h#,21f10.2)') gvdwc_max,gvdwc_scp_max, + & gelc_max,gvdwpp_max,gradb_max,ghpbc_max, + & gradcorr_max,gel_loc_max,gcorr3_turn_max,gcorr4_turn_max, + & gradcorr5_max,gradcorr6_max,gcorr6_turn_max,gsccorc_max, + & gscloc_max,gvdwx_max,gradx_scp_max,ghpbx_max,gradxorr_max, + & gsccorx_max,gsclocx_max + close(istat) + if (gvdwc_max.gt.1.0d4) then + write (iout,*) "gvdwc gvdwx gradb gradbx" + do i=nnt,nct + write(iout,'(i5,4(3f10.2,5x))') i,(gvdwc(j,i),gvdwx(j,i), + & gradb(j,i),gradbx(j,i),j=1,3) + enddo + call pdbout(0.0d0,'cipiszcze',iout) + call flush(iout) + endif + endif + endif +#ifdef DEBUG + write (iout,*) "gradc gradx gloc" + do i=1,nres + write (iout,'(i5,3f10.5,5x,3f10.5,5x,f10.5)') + & i,(gradc(j,i,icg),j=1,3),(gradx(j,i,icg),j=1,3),gloc(i,icg) + enddo +#endif +#ifdef TIMING + time_sumgradient=time_sumgradient+MPI_Wtime()-time01 +#endif + return + end +c------------------------------------------------------------------------------- + subroutine rescale_weights(t_bath) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + double precision kfac /2.4d0/ + double precision x,x2,x3,x4,x5,licznik /1.12692801104297249644/ +c facT=temp0/t_bath +c facT=2*temp0/(t_bath+temp0) + if (rescale_mode.eq.0) then + facT=1.0d0 + facT2=1.0d0 + facT3=1.0d0 + facT4=1.0d0 + facT5=1.0d0 + else if (rescale_mode.eq.1) then + facT=kfac/(kfac-1.0d0+t_bath/temp0) + facT2=kfac**2/(kfac**2-1.0d0+(t_bath/temp0)**2) + facT3=kfac**3/(kfac**3-1.0d0+(t_bath/temp0)**3) + facT4=kfac**4/(kfac**4-1.0d0+(t_bath/temp0)**4) + facT5=kfac**5/(kfac**5-1.0d0+(t_bath/temp0)**5) + else if (rescale_mode.eq.2) then + x=t_bath/temp0 + x2=x*x + x3=x2*x + x4=x3*x + x5=x4*x + facT=licznik/dlog(dexp(x)+dexp(-x)) + facT2=licznik/dlog(dexp(x2)+dexp(-x2)) + facT3=licznik/dlog(dexp(x3)+dexp(-x3)) + facT4=licznik/dlog(dexp(x4)+dexp(-x4)) + facT5=licznik/dlog(dexp(x5)+dexp(-x5)) + else + write (iout,*) "Wrong RESCALE_MODE",rescale_mode + write (*,*) "Wrong RESCALE_MODE",rescale_mode +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,IERROR) +#endif + stop 555 + endif + welec=weights(3)*fact + wcorr=weights(4)*fact3 + wcorr5=weights(5)*fact4 + wcorr6=weights(6)*fact5 + wel_loc=weights(7)*fact2 + wturn3=weights(8)*fact2 + wturn4=weights(9)*fact3 + wturn6=weights(10)*fact5 + wtor=weights(13)*fact + wtor_d=weights(14)*fact2 + wsccor=weights(21)*fact + + return + end +C------------------------------------------------------------------------ + subroutine enerprint(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.MD' + double precision energia(0:n_ene) + etot=energia(0) + evdw=energia(1) + evdw2=energia(2) +#ifdef SCP14 + evdw2=energia(2)+energia(18) +#else + evdw2=energia(2) +#endif + ees=energia(3) +#ifdef SPLITELE + evdw1=energia(16) +#endif + ecorr=energia(4) + ecorr5=energia(5) + ecorr6=energia(6) + eel_loc=energia(7) + eello_turn3=energia(8) + eello_turn4=energia(9) + eello_turn6=energia(10) + ebe=energia(11) + escloc=energia(12) + etors=energia(13) + etors_d=energia(14) + ehpb=energia(15) + edihcnstr=energia(19) + estr=energia(17) + Uconst=energia(20) + esccor=energia(21) +#ifdef SPLITELE + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec,evdw1,wvdwpp, + & estr,wbond,ebe,wang, + & escloc,wscloc,etors,wtor,etors_d,wtor_d,ehpb,wstrain, + & ecorr,wcorr, + & ecorr5,wcorr5,ecorr6,wcorr6,eel_loc,wel_loc,eello_turn3,wturn3, + & eello_turn4,wturn4,eello_turn6,wturn6,esccor,wsccor, + & edihcnstr,ebr*nss, + & Uconst,etot + 10 format (/'Virtual-chain energies:'// + & 'EVDW= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-SC)'/ + & 'EVDW2= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-p)'/ + & 'EES= ',1pE16.6,' WEIGHT=',1pD16.6,' (p-p)'/ + & 'EVDWPP=',1pE16.6,' WEIGHT=',1pD16.6,' (p-p VDW)'/ + & 'ESTR= ',1pE16.6,' WEIGHT=',1pD16.6,' (stretching)'/ + & 'EBE= ',1pE16.6,' WEIGHT=',1pD16.6,' (bending)'/ + & 'ESC= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC local)'/ + & 'ETORS= ',1pE16.6,' WEIGHT=',1pD16.6,' (torsional)'/ + & 'ETORSD=',1pE16.6,' WEIGHT=',1pD16.6,' (double torsional)'/ + & 'EHBP= ',1pE16.6,' WEIGHT=',1pD16.6, + & ' (SS bridges & dist. cnstr.)'/ + & 'ECORR4=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR5=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR6=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'EELLO= ',1pE16.6,' WEIGHT=',1pD16.6,' (electrostatic-local)'/ + & 'ETURN3=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 3rd order)'/ + & 'ETURN4=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 4th order)'/ + & 'ETURN6=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 6th order)'/ + & 'ESCCOR=',1pE16.6,' WEIGHT=',1pD16.6,' (backbone-rotamer corr)'/ + & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/ + & 'ESS= ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ + & 'UCONST= ',1pE16.6,' (Constraint energy)'/ + & 'ETOT= ',1pE16.6,' (total)') +#else + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec, + & estr,wbond,ebe,wang, + & escloc,wscloc,etors,wtor,etors_d,wtor_d,ehpb,wstrain, + & ecorr,wcorr, + & ecorr5,wcorr5,ecorr6,wcorr6,eel_loc,wel_loc,eello_turn3,wturn3, + & eello_turn4,wturn4,eello_turn6,wturn6,esccor,wsccro,edihcnstr, + & ebr*nss,Uconst,etot + 10 format (/'Virtual-chain energies:'// + & 'EVDW= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-SC)'/ + & 'EVDW2= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-p)'/ + & 'EES= ',1pE16.6,' WEIGHT=',1pD16.6,' (p-p)'/ + & 'ESTR= ',1pE16.6,' WEIGHT=',1pD16.6,' (stretching)'/ + & 'EBE= ',1pE16.6,' WEIGHT=',1pD16.6,' (bending)'/ + & 'ESC= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC local)'/ + & 'ETORS= ',1pE16.6,' WEIGHT=',1pD16.6,' (torsional)'/ + & 'ETORSD=',1pE16.6,' WEIGHT=',1pD16.6,' (double torsional)'/ + & 'EHBP= ',1pE16.6,' WEIGHT=',1pD16.6, + & ' (SS bridges & dist. cnstr.)'/ + & 'ECORR4=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR5=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR6=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'EELLO= ',1pE16.6,' WEIGHT=',1pD16.6,' (electrostatic-local)'/ + & 'ETURN3=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 3rd order)'/ + & 'ETURN4=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 4th order)'/ + & 'ETURN6=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 6th order)'/ + & 'ESCCOR=',1pE16.6,' WEIGHT=',1pD16.6,' (backbone-rotamer corr)'/ + & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/ + & 'ESS= ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ + & 'UCONST=',1pE16.6,' (Constraint energy)'/ + & 'ETOT= ',1pE16.6,' (total)') +#endif + return + end +C----------------------------------------------------------------------- + subroutine elj(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJ potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (accur=1.0d-10) + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.TORSION' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) +c write(iout,*)'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + if (itypi.eq.21) cycle + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C Change 12/1/95 + num_conti=0 +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) +cd write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint), +cd & 'iend=',iend(i,iint) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + if (itypj.eq.21) cycle + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi +C Change 12/1/95 to calculate four-body interactions + rij=xj*xj+yj*yj+zj*zj + rrij=1.0D0/rij +c write (iout,*)'i=',i,' j=',j,' itypi=',itypi,' itypj=',itypj + eps0ij=eps(itypi,itypj) + fac=rrij**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e1+e2 +cd sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +cd epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),6(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & restyp(itypi),i,restyp(itypj),j,aa(itypi,itypj), +cd & bb(itypi,itypj),1.0D0/dsqrt(rrij),evdwij,epsi,sigm, +cd & (c(k,i),k=1,3),(c(k,j),k=1,3) + evdw=evdw+evdwij +C +C Calculate the components of the gradient in DC and X +C + fac=-rrij*(e1+evdwij) + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad gvdwc(l,k)=gvdwc(l,k)+gg(l) +cgrad enddo +cgrad enddo +C +C 12/1/95, revised on 5/20/97 +C +C Calculate the contact function. The ith column of the array JCONT will +C contain the numbers of atoms that make contacts with the atom I (of numbers +C greater than I). The arrays FACONT and GACONT will contain the values of +C the contact function and its derivative. +C +C Uncomment next line, if the correlation interactions include EVDW explicitly. +c if (j.gt.i+1 .and. evdwij.le.0.0D0) then +C Uncomment next line, if the correlation interactions are contact function only + if (j.gt.i+1.and. eps0ij.gt.0.0D0) then + rij=dsqrt(rij) + sigij=sigma(itypi,itypj) + r0ij=rs0(itypi,itypj) +C +C Check whether the SC's are not too far to make a contact. +C + rcut=1.5d0*r0ij + call gcont(rij,rcut,1.0d0,0.2d0*rcut,fcont,fprimcont) +C Add a new contact, if the SC's are close enough, but not too close (ri' +cgrad do k=1,3 +cgrad ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) +cgrad enddo +cgrad endif +cgrad do k=1,3 +cgrad gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) +cgrad enddo +cgrad kstart=min0(i+1,j) +cgrad kend=max0(i-1,j-1) +cd write (iout,*) 'i=',i,' j=',j,' kstart=',kstart,' kend=',kend +cd write (iout,*) ggg(1),ggg(2),ggg(3) +cgrad do k=kstart,kend +cgrad do l=1,3 +cgrad gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + enddo + + enddo ! iint + enddo ! i + return + end +C----------------------------------------------------------------------------- + subroutine escp(evdw2,evdw2_14) +C +C This subroutine calculates the excluded-volume interaction energy between +C peptide-group centers and side chains and its gradient in virtual-bond and +C side-chain vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 +cd print '(a)','Enter ESCP' +cd write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e + do i=iatscp_s,iatscp_e + if (itype(i).eq.21 .or. itype(i+1).eq.21) cycle + iteli=itel(i) + xi=0.5D0*(c(1,i)+c(1,i+1)) + yi=0.5D0*(c(2,i)+c(2,i+1)) + zi=0.5D0*(c(3,i)+c(3,i+1)) + + do iint=1,nscp_gr(i) + + do j=iscpstart(i,iint),iscpend(i,iint) + itypj=itype(j) + if (itypj.eq.21) cycle +C Uncomment following three lines for SC-p interactions +c xj=c(1,nres+j)-xi +c yj=c(2,nres+j)-yi +c zj=c(3,nres+j)-zi +C Uncomment following three lines for Ca-p interactions + xj=c(1,j)-xi + yj=c(2,j)-yi + zj=c(3,j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + fac=rrij**expon2 + e1=fac*fac*aad(itypj,iteli) + e2=fac*bad(itypj,iteli) + if (iabs(j-i) .le. 2) then + e1=scal14*e1 + e2=scal14*e2 + evdw2_14=evdw2_14+e1+e2 + endif + evdwij=e1+e2 + evdw2=evdw2+evdwij + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw2',i,j,evdwij +C +C Calculate contributions to the gradient in the virtual-bond and SC vectors. +C + fac=-(evdwij+e1)*rrij + ggg(1)=xj*fac + ggg(2)=yj*fac + ggg(3)=zj*fac +cgrad if (j.lt.i) then +cd write (iout,*) 'ji' +cgrad do k=1,3 +cgrad ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +ccgrad gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) +cgrad enddo +cgrad endif +cgrad do k=1,3 +cgrad gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) +cgrad enddo +cgrad kstart=min0(i+1,j) +cgrad kend=max0(i-1,j-1) +cd write (iout,*) 'i=',i,' j=',j,' kstart=',kstart,' kend=',kend +cd write (iout,*) ggg(1),ggg(2),ggg(3) +cgrad do k=kstart,kend +cgrad do l=1,3 +cgrad gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + enddo + + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(j,i) + gvdwc_scpp(j,i)=expon*gvdwc_scpp(j,i) + gradx_scp(j,i)=expon*gradx_scp(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time the factor EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end +C-------------------------------------------------------------------------- + subroutine edis(ehpb) +C +C Evaluate bridge-strain energy and its gradient in virtual-bond and SC vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + dimension ggg(3) + ehpb=0.0D0 +cd write(iout,*)'edis: nhpb=',nhpb,' fbr=',fbr +cd write(iout,*)'link_start=',link_start,' link_end=',link_end + if (link_end.eq.0) return + do i=link_start,link_end +C If ihpb(i) and jhpb(i) > NRES, this is a SC-SC distance, otherwise a +C CA-CA distance used in regularization of structure. + ii=ihpb(i) + jj=jhpb(i) +C iii and jjj point to the residues for which the distance is assigned. + if (ii.gt.nres) then + iii=ii-nres + jjj=jj-nres + else + iii=ii + jjj=jj + endif +cd write (iout,*) "i",i," ii",ii," iii",iii," jj",jj," jjj",jjj +C 24/11/03 AL: SS bridges handled separately because of introducing a specific +C distance and angle dependent SS bond potential. + if (ii.gt.nres .and. itype(iii).eq.1 .and. itype(jjj).eq.1) then + call ssbond_ene(iii,jjj,eij) + ehpb=ehpb+2*eij +cd write (iout,*) "eij",eij + else +C Calculate the distance between the two points and its difference from the +C target distance. + dd=dist(ii,jj) + rdis=dd-dhpb(i) +C Get the force constant corresponding to this distance. + waga=forcon(i) +C Calculate the contribution to energy. + ehpb=ehpb+waga*rdis*rdis +C +C Evaluate gradient. +C + fac=waga*rdis/dd +cd print *,'i=',i,' ii=',ii,' jj=',jj,' dhpb=',dhpb(i),' dd=',dd, +cd & ' waga=',waga,' fac=',fac + do j=1,3 + ggg(j)=fac*(c(j,jj)-c(j,ii)) + enddo +cd print '(i3,3(1pe14.5))',i,(ggg(j),j=1,3) +C If this is a SC-SC distance, we need to calculate the contributions to the +C Cartesian gradient in the SC vectors (ghpbx). + if (iii.lt.ii) then + do j=1,3 + ghpbx(j,iii)=ghpbx(j,iii)-ggg(j) + ghpbx(j,jjj)=ghpbx(j,jjj)+ggg(j) + enddo + endif +cgrad do j=iii,jjj-1 +cgrad do k=1,3 +cgrad ghpbc(k,j)=ghpbc(k,j)+ggg(k) +cgrad enddo +cgrad enddo + do k=1,3 + ghpbc(k,jjj)=ghpbc(k,jjj)+ggg(k) + ghpbc(k,iii)=ghpbc(k,iii)-ggg(k) + enddo + endif + enddo + ehpb=0.5D0*ehpb + return + end +C-------------------------------------------------------------------------- + subroutine ssbond_ene(i,j,eij) +C +C Calculate the distance and angle dependent SS-bond potential energy +C using a free-energy function derived based on RHF/6-31G** ab initio +C calculations of diethyl disulfide. +C +C A. Liwo and U. Kozlowska, 11/24/03 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + double precision erij(3),dcosom1(3),dcosom2(3),gg(3) + itypi=itype(i) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(nres+i) + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(nres+j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + erij(1)=xj*rij + erij(2)=yj*rij + erij(3)=zj*rij + om1=dxi*erij(1)+dyi*erij(2)+dzi*erij(3) + om2=dxj*erij(1)+dyj*erij(2)+dzj*erij(3) + om12=dxi*dxj+dyi*dyj+dzi*dzj + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,nres+i)-om1*erij(k)) + dcosom2(k)=rij*(dc_norm(k,nres+j)-om2*erij(k)) + enddo + rij=1.0d0/rij + deltad=rij-d0cm + deltat1=1.0d0-om1 + deltat2=1.0d0+om2 + deltat12=om2-om1+2.0d0 + cosphi=om12-om1*om2 + eij=akcm*deltad*deltad+akth*(deltat1*deltat1+deltat2*deltat2) + & +akct*deltad*deltat12 + & +v1ss*cosphi+v2ss*cosphi*cosphi+v3ss*cosphi*cosphi*cosphi+ebr +c write(iout,*) i,j,"rij",rij,"d0cm",d0cm," akcm",akcm," akth",akth, +c & " akct",akct," deltad",deltad," deltat",deltat1,deltat2, +c & " deltat12",deltat12," eij",eij + ed=2*akcm*deltad+akct*deltat12 + pom1=akct*deltad + pom2=v1ss+2*v2ss*cosphi+3*v3ss*cosphi*cosphi + eom1=-2*akth*deltat1-pom1-om2*pom2 + eom2= 2*akth*deltat2+pom1-om1*pom2 + eom12=pom2 + do k=1,3 + ggk=ed*erij(k)+eom1*dcosom1(k)+eom2*dcosom2(k) + ghpbx(k,i)=ghpbx(k,i)-ggk + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + ghpbx(k,j)=ghpbx(k,j)+ggk + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + ghpbc(k,i)=ghpbc(k,i)-ggk + ghpbc(k,j)=ghpbc(k,j)+ggk + enddo +C +C Calculate the components of the gradient in DC and X +C +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad ghpbc(l,k)=ghpbc(l,k)+gg(l) +cgrad enddo +cgrad enddo + return + end +C-------------------------------------------------------------------------- + subroutine ebond(estr) +c +c Evaluate the energy of stretching of the CA-CA and CA-SC virtual bonds +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + double precision u(3),ud(3) + estr=0.0d0 + estr1=0.0d0 + do i=ibondp_start,ibondp_end + if (itype(i-1).eq.21 .or. itype(i).eq.21) then + estr1=estr1+gnmr1(vbld(i),-1.0d0,distchainmax) + do j=1,3 + gradb(j,i-1)=gnmr1prim(vbld(i),-1.0d0,distchainmax) + & *dc(j,i-1)/vbld(i) + enddo + if (energy_dec) write(iout,*) + & "estr1",i,gnmr1(vbld(i),-1.0d0,distchainmax) + else + diff = vbld(i)-vbldp0 + if (energy_dec) write (iout,*) + & "estr bb",i,vbld(i),vbldp0,diff,AKP*diff*diff + estr=estr+diff*diff + do j=1,3 + gradb(j,i-1)=AKP*diff*dc(j,i-1)/vbld(i) + enddo +c write (iout,'(i5,3f10.5)') i,(gradb(j,i-1),j=1,3) + endif + enddo + estr=0.5d0*AKP*estr+estr1 +c +c 09/18/07 AL: multimodal bond potential based on AM1 CA-SC PMF's included +c + do i=ibond_start,ibond_end + iti=itype(i) + if (iti.ne.10 .and. iti.ne.21) then + nbi=nbondterm(iti) + if (nbi.eq.1) then + diff=vbld(i+nres)-vbldsc0(1,iti) + if (energy_dec) write (iout,*) + & "estr sc",i,iti,vbld(i+nres),vbldsc0(1,iti),diff, + & AKSC(1,iti),AKSC(1,iti)*diff*diff + estr=estr+0.5d0*AKSC(1,iti)*diff*diff + do j=1,3 + gradbx(j,i)=AKSC(1,iti)*diff*dc(j,i+nres)/vbld(i+nres) + enddo + else + do j=1,nbi + diff=vbld(i+nres)-vbldsc0(j,iti) + ud(j)=aksc(j,iti)*diff + u(j)=abond0(j,iti)+0.5d0*ud(j)*diff + enddo + uprod=u(1) + do j=2,nbi + uprod=uprod*u(j) + enddo + usum=0.0d0 + usumsqder=0.0d0 + do j=1,nbi + uprod1=1.0d0 + uprod2=1.0d0 + do k=1,nbi + if (k.ne.j) then + uprod1=uprod1*u(k) + uprod2=uprod2*u(k)*u(k) + endif + enddo + usum=usum+uprod1 + usumsqder=usumsqder+ud(j)*uprod2 + enddo + estr=estr+uprod/usum + do j=1,3 + gradbx(j,i)=usumsqder/(usum*usum)*dc(j,i+nres)/vbld(i+nres) + enddo + endif + endif + enddo + return + end +#ifdef CRYST_THETA +C-------------------------------------------------------------------------- + subroutine ebend(etheta) +C +C Evaluate the virtual-bond-angle energy given the virtual-bond dihedral +C angles gamma and its derivatives in consecutive thetas and gammas. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it + double precision y(2),z(2) + delta=0.02d0*pi +c time11=dexp(-2*time) +c time12=1.0d0 + etheta=0.0D0 +c write (*,'(a,i2)') 'EBEND ICG=',icg + do i=ithet_start,ithet_end + if (itype(i-1).eq.21) cycle +C Zero the energy function and its derivative at 0 or pi. + call splinthet(theta(i),0.5d0*delta,ss,ssd) + it=itype(i-1) + if (i.gt.3 .and. itype(i-2).ne.21) then +#ifdef OSF + phii=phi(i) + if (phii.ne.phii) phii=150.0 +#else + phii=phi(i) +#endif + y(1)=dcos(phii) + y(2)=dsin(phii) + else + y(1)=0.0D0 + y(2)=0.0D0 + endif + if (i.lt.nres .and. itype(i).ne.21) then +#ifdef OSF + phii1=phi(i+1) + if (phii1.ne.phii1) phii1=150.0 + phii1=pinorm(phii1) + z(1)=cos(phii1) +#else + phii1=phi(i+1) + z(1)=dcos(phii1) +#endif + z(2)=dsin(phii1) + else + z(1)=0.0D0 + z(2)=0.0D0 + endif +C Calculate the "mean" value of theta from the part of the distribution +C dependent on the adjacent virtual-bond-valence angles (gamma1 & gamma2). +C In following comments this theta will be referred to as t_c. + thet_pred_mean=0.0d0 + do k=1,2 + athetk=athet(k,it) + bthetk=bthet(k,it) + thet_pred_mean=thet_pred_mean+athetk*y(k)+bthetk*z(k) + enddo + dthett=thet_pred_mean*ssd + thet_pred_mean=thet_pred_mean*ss+a0thet(it) +C Derivatives of the "mean" values in gamma1 and gamma2. + dthetg1=(-athet(1,it)*y(2)+athet(2,it)*y(1))*ss + dthetg2=(-bthet(1,it)*z(2)+bthet(2,it)*z(1))*ss + if (theta(i).gt.pi-delta) then + call theteng(pi-delta,thet_pred_mean,theta0(it),f0,fprim0, + & E_tc0) + call mixder(pi-delta,thet_pred_mean,theta0(it),fprim_tc0) + call theteng(pi,thet_pred_mean,theta0(it),f1,fprim1,E_tc1) + call spline1(theta(i),pi-delta,delta,f0,f1,fprim0,ethetai, + & E_theta) + call spline2(theta(i),pi-delta,delta,E_tc0,E_tc1,fprim_tc0, + & E_tc) + else if (theta(i).lt.delta) then + call theteng(delta,thet_pred_mean,theta0(it),f0,fprim0,E_tc0) + call theteng(0.0d0,thet_pred_mean,theta0(it),f1,fprim1,E_tc1) + call spline1(theta(i),delta,-delta,f0,f1,fprim0,ethetai, + & E_theta) + call mixder(delta,thet_pred_mean,theta0(it),fprim_tc0) + call spline2(theta(i),delta,-delta,E_tc0,E_tc1,fprim_tc0, + & E_tc) + else + call theteng(theta(i),thet_pred_mean,theta0(it),ethetai, + & E_theta,E_tc) + endif + etheta=etheta+ethetai + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'ebend',i,ethetai + if (i.gt.3) gloc(i-3,icg)=gloc(i-3,icg)+wang*E_tc*dthetg1 + if (i.lt.nres) gloc(i-2,icg)=gloc(i-2,icg)+wang*E_tc*dthetg2 + gloc(nphi+i-2,icg)=wang*(E_theta+E_tc*dthett) + enddo +C Ufff.... We've done all this!!! + return + end +C--------------------------------------------------------------------------- + subroutine theteng(thetai,thet_pred_mean,theta0i,ethetai,E_theta, + & E_tc) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it +C Calculate the contributions to both Gaussian lobes. +C 6/6/97 - Deform the Gaussians using the factor of 1/(1+time) +C The "polynomial part" of the "standard deviation" of this part of +C the distribution. + sig=polthet(3,it) + do j=2,0,-1 + sig=sig*thet_pred_mean+polthet(j,it) + enddo +C Derivative of the "interior part" of the "standard deviation of the" +C gamma-dependent Gaussian lobe in t_c. + sigtc=3*polthet(3,it) + do j=2,1,-1 + sigtc=sigtc*thet_pred_mean+j*polthet(j,it) + enddo + sigtc=sig*sigtc +C Set the parameters of both Gaussian lobes of the distribution. +C "Standard deviation" of the gamma-dependent Gaussian lobe (sigtc) + fac=sig*sig+sigc0(it) + sigcsq=fac+fac + sigc=1.0D0/sigcsq +C Following variable (sigsqtc) is -(1/2)d[sigma(t_c)**(-2))]/dt_c + sigsqtc=-4.0D0*sigcsq*sigtc +c print *,i,sig,sigtc,sigsqtc +C Following variable (sigtc) is d[sigma(t_c)]/dt_c + sigtc=-sigtc/(fac*fac) +C Following variable is sigma(t_c)**(-2) + sigcsq=sigcsq*sigcsq + sig0i=sig0(it) + sig0inv=1.0D0/sig0i**2 + delthec=thetai-thet_pred_mean + delthe0=thetai-theta0i + term1=-0.5D0*sigcsq*delthec*delthec + term2=-0.5D0*sig0inv*delthe0*delthe0 +C Following fuzzy logic is to avoid underflows in dexp and subsequent INFs and +C NaNs in taking the logarithm. We extract the largest exponent which is added +C to the energy (this being the log of the distribution) at the end of energy +C term evaluation for this virtual-bond angle. + if (term1.gt.term2) then + termm=term1 + term2=dexp(term2-termm) + term1=1.0d0 + else + termm=term2 + term1=dexp(term1-termm) + term2=1.0d0 + endif +C The ratio between the gamma-independent and gamma-dependent lobes of +C the distribution is a Gaussian function of thet_pred_mean too. + diffak=gthet(2,it)-thet_pred_mean + ratak=diffak/gthet(3,it)**2 + ak=dexp(gthet(1,it)-0.5D0*diffak*ratak) +C Let's differentiate it in thet_pred_mean NOW. + aktc=ak*ratak +C Now put together the distribution terms to make complete distribution. + termexp=term1+ak*term2 + termpre=sigc+ak*sig0i +C Contribution of the bending energy from this theta is just the -log of +C the sum of the contributions from the two lobes and the pre-exponential +C factor. Simple enough, isn't it? + ethetai=(-dlog(termexp)-termm+dlog(termpre)) +C NOW the derivatives!!! +C 6/6/97 Take into account the deformation. + E_theta=(delthec*sigcsq*term1 + & +ak*delthe0*sig0inv*term2)/termexp + E_tc=((sigtc+aktc*sig0i)/termpre + & -((delthec*sigcsq+delthec*delthec*sigsqtc)*term1+ + & aktc*term2)/termexp) + return + end +c----------------------------------------------------------------------------- + subroutine mixder(thetai,thet_pred_mean,theta0i,E_tc_t) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it + delthec=thetai-thet_pred_mean + delthe0=thetai-theta0i +C "Thank you" to MAPLE (probably spared one day of hand-differentiation). + t3 = thetai-thet_pred_mean + t6 = t3**2 + t9 = term1 + t12 = t3*sigcsq + t14 = t12+t6*sigsqtc + t16 = 1.0d0 + t21 = thetai-theta0i + t23 = t21**2 + t26 = term2 + t27 = t21*t26 + t32 = termexp + t40 = t32**2 + E_tc_t = -((sigcsq+2.D0*t3*sigsqtc)*t9-t14*sigcsq*t3*t16*t9 + & -aktc*sig0inv*t27)/t32+(t14*t9+aktc*t26)/t40 + & *(-t12*t9-ak*sig0inv*t27) + return + end +#else +C-------------------------------------------------------------------------- + subroutine ebend(etheta) +C +C Evaluate the virtual-bond-angle energy given the virtual-bond dihedral +C angles gamma and its derivatives in consecutive thetas and gammas. +C ab initio-derived potentials from +c Kozlowska et al., J. Phys.: Condens. Matter 19 (2007) 285203 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + double precision coskt(mmaxtheterm),sinkt(mmaxtheterm), + & cosph1(maxsingle),sinph1(maxsingle),cosph2(maxsingle), + & sinph2(maxsingle),cosph1ph2(maxdouble,maxdouble), + & sinph1ph2(maxdouble,maxdouble) + logical lprn /.false./, lprn1 /.false./ + etheta=0.0D0 + do i=ithet_start,ithet_end + if (itype(i-1).eq.21) cycle + dethetai=0.0d0 + dephii=0.0d0 + dephii1=0.0d0 + theti2=0.5d0*theta(i) + ityp2=ithetyp(itype(i-1)) + do k=1,nntheterm + coskt(k)=dcos(k*theti2) + sinkt(k)=dsin(k*theti2) + enddo + if (i.gt.3 .and. itype(i-2).ne.21) then +#ifdef OSF + phii=phi(i) + if (phii.ne.phii) phii=150.0 +#else + phii=phi(i) +#endif + ityp1=ithetyp(itype(i-2)) + do k=1,nsingle + cosph1(k)=dcos(k*phii) + sinph1(k)=dsin(k*phii) + enddo + else + phii=0.0d0 + ityp1=nthetyp+1 + do k=1,nsingle + cosph1(k)=0.0d0 + sinph1(k)=0.0d0 + enddo + endif + if (i.lt.nres .and. itype(i).ne.21) then +#ifdef OSF + phii1=phi(i+1) + if (phii1.ne.phii1) phii1=150.0 + phii1=pinorm(phii1) +#else + phii1=phi(i+1) +#endif + ityp3=ithetyp(itype(i)) + do k=1,nsingle + cosph2(k)=dcos(k*phii1) + sinph2(k)=dsin(k*phii1) + enddo + else + phii1=0.0d0 + ityp3=nthetyp+1 + do k=1,nsingle + cosph2(k)=0.0d0 + sinph2(k)=0.0d0 + enddo + endif + ethetai=aa0thet(ityp1,ityp2,ityp3) + do k=1,ndouble + do l=1,k-1 + ccl=cosph1(l)*cosph2(k-l) + ssl=sinph1(l)*sinph2(k-l) + scl=sinph1(l)*cosph2(k-l) + csl=cosph1(l)*sinph2(k-l) + cosph1ph2(l,k)=ccl-ssl + cosph1ph2(k,l)=ccl+ssl + sinph1ph2(l,k)=scl+csl + sinph1ph2(k,l)=scl-csl + enddo + enddo + if (lprn) then + write (iout,*) "i",i," ityp1",ityp1," ityp2",ityp2, + & " ityp3",ityp3," theti2",theti2," phii",phii," phii1",phii1 + write (iout,*) "coskt and sinkt" + do k=1,nntheterm + write (iout,*) k,coskt(k),sinkt(k) + enddo + endif + do k=1,ntheterm + ethetai=ethetai+aathet(k,ityp1,ityp2,ityp3)*sinkt(k) + dethetai=dethetai+0.5d0*k*aathet(k,ityp1,ityp2,ityp3) + & *coskt(k) + if (lprn) + & write (iout,*) "k",k," aathet",aathet(k,ityp1,ityp2,ityp3), + & " ethetai",ethetai + enddo + if (lprn) then + write (iout,*) "cosph and sinph" + do k=1,nsingle + write (iout,*) k,cosph1(k),sinph1(k),cosph2(k),sinph2(k) + enddo + write (iout,*) "cosph1ph2 and sinph2ph2" + do k=2,ndouble + do l=1,k-1 + write (iout,*) l,k,cosph1ph2(l,k),cosph1ph2(k,l), + & sinph1ph2(l,k),sinph1ph2(k,l) + enddo + enddo + write(iout,*) "ethetai",ethetai + endif + do m=1,ntheterm2 + do k=1,nsingle + aux=bbthet(k,m,ityp1,ityp2,ityp3)*cosph1(k) + & +ccthet(k,m,ityp1,ityp2,ityp3)*sinph1(k) + & +ddthet(k,m,ityp1,ityp2,ityp3)*cosph2(k) + & +eethet(k,m,ityp1,ityp2,ityp3)*sinph2(k) + ethetai=ethetai+sinkt(m)*aux + dethetai=dethetai+0.5d0*m*aux*coskt(m) + dephii=dephii+k*sinkt(m)*( + & ccthet(k,m,ityp1,ityp2,ityp3)*cosph1(k)- + & bbthet(k,m,ityp1,ityp2,ityp3)*sinph1(k)) + dephii1=dephii1+k*sinkt(m)*( + & eethet(k,m,ityp1,ityp2,ityp3)*cosph2(k)- + & ddthet(k,m,ityp1,ityp2,ityp3)*sinph2(k)) + if (lprn) + & write (iout,*) "m",m," k",k," bbthet", + & bbthet(k,m,ityp1,ityp2,ityp3)," ccthet", + & ccthet(k,m,ityp1,ityp2,ityp3)," ddthet", + & ddthet(k,m,ityp1,ityp2,ityp3)," eethet", + & eethet(k,m,ityp1,ityp2,ityp3)," ethetai",ethetai + enddo + enddo + if (lprn) + & write(iout,*) "ethetai",ethetai + do m=1,ntheterm3 + do k=2,ndouble + do l=1,k-1 + aux=ffthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)+ + & ffthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)+ + & ggthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l) + ethetai=ethetai+sinkt(m)*aux + dethetai=dethetai+0.5d0*m*coskt(m)*aux + dephii=dephii+l*sinkt(m)*( + & -ffthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)- + & ffthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)+ + & ggthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)) + dephii1=dephii1+(k-l)*sinkt(m)*( + & -ffthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)+ + & ffthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)- + & ggthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)) + if (lprn) then + write (iout,*) "m",m," k",k," l",l," ffthet", + & ffthet(l,k,m,ityp1,ityp2,ityp3), + & ffthet(k,l,m,ityp1,ityp2,ityp3)," ggthet", + & ggthet(l,k,m,ityp1,ityp2,ityp3), + & ggthet(k,l,m,ityp1,ityp2,ityp3)," ethetai",ethetai + write (iout,*) cosph1ph2(l,k)*sinkt(m), + & cosph1ph2(k,l)*sinkt(m), + & sinph1ph2(l,k)*sinkt(m),sinph1ph2(k,l)*sinkt(m) + endif + enddo + enddo + enddo +10 continue + if (lprn1) write (iout,'(i2,3f8.1,9h ethetai ,f10.5)') + & i,theta(i)*rad2deg,phii*rad2deg, + & phii1*rad2deg,ethetai + etheta=etheta+ethetai + if (i.gt.3) gloc(i-3,icg)=gloc(i-3,icg)+wang*dephii + if (i.lt.nres) gloc(i-2,icg)=gloc(i-2,icg)+wang*dephii1 + gloc(nphi+i-2,icg)=wang*dethetai + enddo + return + end +#endif +#ifdef CRYST_SC +c----------------------------------------------------------------------------- + subroutine esc(escloc) +C Calculate the local energy of a side chain and its derivatives in the +C corresponding virtual-bond valence angles THETA and the spherical angles +C ALPHA and OMEGA. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + double precision x(3),dersc(3),xemp(3),dersc0(3),dersc1(3), + & ddersc0(3),ddummy(3),xtemp(3),temp(3) + common /sccalc/ time11,time12,time112,theti,it,nlobit + delta=0.02d0*pi + escloc=0.0D0 +c write (iout,'(a)') 'ESC' + do i=loc_start,loc_end + it=itype(i) + if (it.eq.21) cycle + if (it.eq.10) goto 1 + nlobit=nlob(it) +c print *,'i=',i,' it=',it,' nlobit=',nlobit +c write (iout,*) 'i=',i,' ssa=',ssa,' ssad=',ssad + theti=theta(i+1)-pipol + x(1)=dtan(theti) + x(2)=alph(i) + x(3)=omeg(i) + + if (x(2).gt.pi-delta) then + xtemp(1)=x(1) + xtemp(2)=pi-delta + xtemp(3)=x(3) + call enesc(xtemp,escloci0,dersc0,ddersc0,.true.) + xtemp(2)=pi + call enesc(xtemp,escloci1,dersc1,ddummy,.false.) + call spline1(x(2),pi-delta,delta,escloci0,escloci1,dersc0(2), + & escloci,dersc(2)) + call spline2(x(2),pi-delta,delta,dersc0(1),dersc1(1), + & ddersc0(1),dersc(1)) + call spline2(x(2),pi-delta,delta,dersc0(3),dersc1(3), + & ddersc0(3),dersc(3)) + xtemp(2)=pi-delta + call enesc_bound(xtemp,esclocbi0,dersc0,dersc12,.true.) + xtemp(2)=pi + call enesc_bound(xtemp,esclocbi1,dersc1,chuju,.false.) + call spline1(x(2),pi-delta,delta,esclocbi0,esclocbi1, + & dersc0(2),esclocbi,dersc02) + call spline2(x(2),pi-delta,delta,dersc0(1),dersc1(1), + & dersc12,dersc01) + call splinthet(x(2),0.5d0*delta,ss,ssd) + dersc0(1)=dersc01 + dersc0(2)=dersc02 + dersc0(3)=0.0d0 + do k=1,3 + dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k) + enddo + dersc(2)=dersc(2)+ssd*(escloci-esclocbi) +c write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci, +c & esclocbi,ss,ssd + escloci=ss*escloci+(1.0d0-ss)*esclocbi +c escloci=esclocbi +c write (iout,*) escloci + else if (x(2).lt.delta) then + xtemp(1)=x(1) + xtemp(2)=delta + xtemp(3)=x(3) + call enesc(xtemp,escloci0,dersc0,ddersc0,.true.) + xtemp(2)=0.0d0 + call enesc(xtemp,escloci1,dersc1,ddummy,.false.) + call spline1(x(2),delta,-delta,escloci0,escloci1,dersc0(2), + & escloci,dersc(2)) + call spline2(x(2),delta,-delta,dersc0(1),dersc1(1), + & ddersc0(1),dersc(1)) + call spline2(x(2),delta,-delta,dersc0(3),dersc1(3), + & ddersc0(3),dersc(3)) + xtemp(2)=delta + call enesc_bound(xtemp,esclocbi0,dersc0,dersc12,.true.) + xtemp(2)=0.0d0 + call enesc_bound(xtemp,esclocbi1,dersc1,chuju,.false.) + call spline1(x(2),delta,-delta,esclocbi0,esclocbi1, + & dersc0(2),esclocbi,dersc02) + call spline2(x(2),delta,-delta,dersc0(1),dersc1(1), + & dersc12,dersc01) + dersc0(1)=dersc01 + dersc0(2)=dersc02 + dersc0(3)=0.0d0 + call splinthet(x(2),0.5d0*delta,ss,ssd) + do k=1,3 + dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k) + enddo + dersc(2)=dersc(2)+ssd*(escloci-esclocbi) +c write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci, +c & esclocbi,ss,ssd + escloci=ss*escloci+(1.0d0-ss)*esclocbi +c write (iout,*) escloci + else + call enesc(x,escloci,dersc,ddummy,.false.) + endif + + escloc=escloc+escloci + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'escloc',i,escloci +c write (iout,*) 'i=',i,' escloci=',escloci,' dersc=',dersc + + gloc(nphi+i-1,icg)=gloc(nphi+i-1,icg)+ + & wscloc*dersc(1) + gloc(ialph(i,1),icg)=wscloc*dersc(2) + gloc(ialph(i,1)+nside,icg)=wscloc*dersc(3) + 1 continue + enddo + return + end +C--------------------------------------------------------------------------- + subroutine enesc(x,escloci,dersc,ddersc,mixed) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /sccalc/ time11,time12,time112,theti,it,nlobit + double precision x(3),z(3),Ax(3,maxlob,-1:1),dersc(3),ddersc(3) + double precision contr(maxlob,-1:1) + logical mixed +c write (iout,*) 'it=',it,' nlobit=',nlobit + escloc_i=0.0D0 + do j=1,3 + dersc(j)=0.0D0 + if (mixed) ddersc(j)=0.0d0 + enddo + x3=x(3) + +C Because of periodicity of the dependence of the SC energy in omega we have +C to add up the contributions from x(3)-2*pi, x(3), and x(3+2*pi). +C To avoid underflows, first compute & store the exponents. + + do iii=-1,1 + + x(3)=x3+iii*dwapi + + do j=1,nlobit + do k=1,3 + z(k)=x(k)-censc(k,j,it) + enddo + do k=1,3 + Axk=0.0D0 + do l=1,3 + Axk=Axk+gaussc(l,k,j,it)*z(l) + enddo + Ax(k,j,iii)=Axk + enddo + expfac=0.0D0 + do k=1,3 + expfac=expfac+Ax(k,j,iii)*z(k) + enddo + contr(j,iii)=expfac + enddo ! j + + enddo ! iii + + x(3)=x3 +C As in the case of ebend, we want to avoid underflows in exponentiation and +C subsequent NaNs and INFs in energy calculation. +C Find the largest exponent + emin=contr(1,-1) + do iii=-1,1 + do j=1,nlobit + if (emin.gt.contr(j,iii)) emin=contr(j,iii) + enddo + enddo + emin=0.5D0*emin +cd print *,'it=',it,' emin=',emin + +C Compute the contribution to SC energy and derivatives + do iii=-1,1 + + do j=1,nlobit +#ifdef OSF + adexp=bsc(j,it)-0.5D0*contr(j,iii)+emin + if(adexp.ne.adexp) adexp=1.0 + expfac=dexp(adexp) +#else + expfac=dexp(bsc(j,it)-0.5D0*contr(j,iii)+emin) +#endif +cd print *,'j=',j,' expfac=',expfac + escloc_i=escloc_i+expfac + do k=1,3 + dersc(k)=dersc(k)+Ax(k,j,iii)*expfac + enddo + if (mixed) then + do k=1,3,2 + ddersc(k)=ddersc(k)+(-Ax(2,j,iii)*Ax(k,j,iii) + & +gaussc(k,2,j,it))*expfac + enddo + endif + enddo + + enddo ! iii + + dersc(1)=dersc(1)/cos(theti)**2 + ddersc(1)=ddersc(1)/cos(theti)**2 + ddersc(3)=ddersc(3) + + escloci=-(dlog(escloc_i)-emin) + do j=1,3 + dersc(j)=dersc(j)/escloc_i + enddo + if (mixed) then + do j=1,3,2 + ddersc(j)=(ddersc(j)/escloc_i+dersc(2)*dersc(j)) + enddo + endif + return + end +C------------------------------------------------------------------------------ + subroutine enesc_bound(x,escloci,dersc,dersc12,mixed) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /sccalc/ time11,time12,time112,theti,it,nlobit + double precision x(3),z(3),Ax(3,maxlob),dersc(3) + double precision contr(maxlob) + logical mixed + + escloc_i=0.0D0 + + do j=1,3 + dersc(j)=0.0D0 + enddo + + do j=1,nlobit + do k=1,2 + z(k)=x(k)-censc(k,j,it) + enddo + z(3)=dwapi + do k=1,3 + Axk=0.0D0 + do l=1,3 + Axk=Axk+gaussc(l,k,j,it)*z(l) + enddo + Ax(k,j)=Axk + enddo + expfac=0.0D0 + do k=1,3 + expfac=expfac+Ax(k,j)*z(k) + enddo + contr(j)=expfac + enddo ! j + +C As in the case of ebend, we want to avoid underflows in exponentiation and +C subsequent NaNs and INFs in energy calculation. +C Find the largest exponent + emin=contr(1) + do j=1,nlobit + if (emin.gt.contr(j)) emin=contr(j) + enddo + emin=0.5D0*emin + +C Compute the contribution to SC energy and derivatives + + dersc12=0.0d0 + do j=1,nlobit + expfac=dexp(bsc(j,it)-0.5D0*contr(j)+emin) + escloc_i=escloc_i+expfac + do k=1,2 + dersc(k)=dersc(k)+Ax(k,j)*expfac + enddo + if (mixed) dersc12=dersc12+(-Ax(2,j)*Ax(1,j) + & +gaussc(1,2,j,it))*expfac + dersc(3)=0.0d0 + enddo + + dersc(1)=dersc(1)/cos(theti)**2 + dersc12=dersc12/cos(theti)**2 + escloci=-(dlog(escloc_i)-emin) + do j=1,2 + dersc(j)=dersc(j)/escloc_i + enddo + if (mixed) dersc12=(dersc12/escloc_i+dersc(2)*dersc(1)) + return + end +#else +c---------------------------------------------------------------------------------- + subroutine esc(escloc) +C Calculate the local energy of a side chain and its derivatives in the +C corresponding virtual-bond valence angles THETA and the spherical angles +C ALPHA and OMEGA derived from AM1 all-atom calculations. +C added by Urszula Kozlowska. 07/11/2007 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.SCROT' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include 'COMMON.VECTORS' + double precision x_prime(3),y_prime(3),z_prime(3) + & , sumene,dsc_i,dp2_i,x(65), + & xx,yy,zz,sumene1,sumene2,sumene3,sumene4,s1,s1_6,s2,s2_6, + & de_dxx,de_dyy,de_dzz,de_dt + double precision s1_t,s1_6_t,s2_t,s2_6_t + double precision + & dXX_Ci1(3),dYY_Ci1(3),dZZ_Ci1(3),dXX_Ci(3), + & dYY_Ci(3),dZZ_Ci(3),dXX_XYZ(3),dYY_XYZ(3),dZZ_XYZ(3), + & dt_dCi(3),dt_dCi1(3) + common /sccalc/ time11,time12,time112,theti,it,nlobit + delta=0.02d0*pi + escloc=0.0D0 + do i=loc_start,loc_end + if (itype(i).eq.21) cycle + costtab(i+1) =dcos(theta(i+1)) + sinttab(i+1) =dsqrt(1-costtab(i+1)*costtab(i+1)) + cost2tab(i+1)=dsqrt(0.5d0*(1.0d0+costtab(i+1))) + sint2tab(i+1)=dsqrt(0.5d0*(1.0d0-costtab(i+1))) + cosfac2=0.5d0/(1.0d0+costtab(i+1)) + cosfac=dsqrt(cosfac2) + sinfac2=0.5d0/(1.0d0-costtab(i+1)) + sinfac=dsqrt(sinfac2) + it=itype(i) + if (it.eq.10) goto 1 +c +C Compute the axes of tghe local cartesian coordinates system; store in +c x_prime, y_prime and z_prime +c + do j=1,3 + x_prime(j) = 0.00 + y_prime(j) = 0.00 + z_prime(j) = 0.00 + enddo +C write(2,*) "dc_norm", dc_norm(1,i+nres),dc_norm(2,i+nres), +C & dc_norm(3,i+nres) + do j = 1,3 + x_prime(j) = (dc_norm(j,i) - dc_norm(j,i-1))*cosfac + y_prime(j) = (dc_norm(j,i) + dc_norm(j,i-1))*sinfac + enddo + do j = 1,3 + z_prime(j) = -uz(j,i-1) + enddo +c write (2,*) "i",i +c write (2,*) "x_prime",(x_prime(j),j=1,3) +c write (2,*) "y_prime",(y_prime(j),j=1,3) +c write (2,*) "z_prime",(z_prime(j),j=1,3) +c write (2,*) "xx",scalar(x_prime(1),x_prime(1)), +c & " xy",scalar(x_prime(1),y_prime(1)), +c & " xz",scalar(x_prime(1),z_prime(1)), +c & " yy",scalar(y_prime(1),y_prime(1)), +c & " yz",scalar(y_prime(1),z_prime(1)), +c & " zz",scalar(z_prime(1),z_prime(1)) +c +C Transform the unit vector of the ith side-chain centroid, dC_norm(*,i), +C to local coordinate system. Store in xx, yy, zz. +c + xx=0.0d0 + yy=0.0d0 + zz=0.0d0 + do j = 1,3 + xx = xx + x_prime(j)*dc_norm(j,i+nres) + yy = yy + y_prime(j)*dc_norm(j,i+nres) + zz = zz + z_prime(j)*dc_norm(j,i+nres) + enddo + + xxtab(i)=xx + yytab(i)=yy + zztab(i)=zz +C +C Compute the energy of the ith side cbain +C +c write (2,*) "xx",xx," yy",yy," zz",zz + it=itype(i) + do j = 1,65 + x(j) = sc_parmin(j,it) + enddo +#ifdef CHECK_COORD +Cc diagnostics - remove later + xx1 = dcos(alph(2)) + yy1 = dsin(alph(2))*dcos(omeg(2)) + zz1 = -dsin(alph(2))*dsin(omeg(2)) + write(2,'(3f8.1,3f9.3,1x,3f9.3)') + & alph(2)*rad2deg,omeg(2)*rad2deg,theta(3)*rad2deg,xx,yy,zz, + & xx1,yy1,zz1 +C," --- ", xx_w,yy_w,zz_w +c end diagnostics +#endif + sumene1= x(1)+ x(2)*xx+ x(3)*yy+ x(4)*zz+ x(5)*xx**2 + & + x(6)*yy**2+ x(7)*zz**2+ x(8)*xx*zz+ x(9)*xx*yy + & + x(10)*yy*zz + sumene2= x(11) + x(12)*xx + x(13)*yy + x(14)*zz + x(15)*xx**2 + & + x(16)*yy**2 + x(17)*zz**2 + x(18)*xx*zz + x(19)*xx*yy + & + x(20)*yy*zz + sumene3= x(21) +x(22)*xx +x(23)*yy +x(24)*zz +x(25)*xx**2 + & +x(26)*yy**2 +x(27)*zz**2 +x(28)*xx*zz +x(29)*xx*yy + & +x(30)*yy*zz +x(31)*xx**3 +x(32)*yy**3 +x(33)*zz**3 + & +x(34)*(xx**2)*yy +x(35)*(xx**2)*zz +x(36)*(yy**2)*xx + & +x(37)*(yy**2)*zz +x(38)*(zz**2)*xx +x(39)*(zz**2)*yy + & +x(40)*xx*yy*zz + sumene4= x(41) +x(42)*xx +x(43)*yy +x(44)*zz +x(45)*xx**2 + & +x(46)*yy**2 +x(47)*zz**2 +x(48)*xx*zz +x(49)*xx*yy + & +x(50)*yy*zz +x(51)*xx**3 +x(52)*yy**3 +x(53)*zz**3 + & +x(54)*(xx**2)*yy +x(55)*(xx**2)*zz +x(56)*(yy**2)*xx + & +x(57)*(yy**2)*zz +x(58)*(zz**2)*xx +x(59)*(zz**2)*yy + & +x(60)*xx*yy*zz + dsc_i = 0.743d0+x(61) + dp2_i = 1.9d0+x(62) + dscp1=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2tab(i+1)+yy*sint2tab(i+1))) + dscp2=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2tab(i+1)-yy*sint2tab(i+1))) + s1=(1+x(63))/(0.1d0 + dscp1) + s1_6=(1+x(64))/(0.1d0 + dscp1**6) + s2=(1+x(65))/(0.1d0 + dscp2) + s2_6=(1+x(65))/(0.1d0 + dscp2**6) + sumene = ( sumene3*sint2tab(i+1) + sumene1)*(s1+s1_6) + & + (sumene4*cost2tab(i+1) +sumene2)*(s2+s2_6) +c write(2,'(i2," sumene",7f9.3)') i,sumene1,sumene2,sumene3, +c & sumene4, +c & dscp1,dscp2,sumene +c sumene = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + escloc = escloc + sumene +c write (2,*) "i",i," escloc",sumene,escloc +#ifdef DEBUG +C +C This section to check the numerical derivatives of the energy of ith side +C chain in xx, yy, zz, and theta. Use the -DDEBUG compiler option or insert +C #define DEBUG in the code to turn it on. +C + write (2,*) "sumene =",sumene + aincr=1.0d-7 + xxsave=xx + xx=xx+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dxx_num=(sumenep-sumene)/aincr + xx=xxsave + write (2,*) "xx+ sumene from enesc=",sumenep + yysave=yy + yy=yy+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dyy_num=(sumenep-sumene)/aincr + yy=yysave + write (2,*) "yy+ sumene from enesc=",sumenep + zzsave=zz + zz=zz+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dzz_num=(sumenep-sumene)/aincr + zz=zzsave + write (2,*) "zz+ sumene from enesc=",sumenep + costsave=cost2tab(i+1) + sintsave=sint2tab(i+1) + cost2tab(i+1)=dcos(0.5d0*(theta(i+1)+aincr)) + sint2tab(i+1)=dsin(0.5d0*(theta(i+1)+aincr)) + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dt_num=(sumenep-sumene)/aincr + write (2,*) " t+ sumene from enesc=",sumenep + cost2tab(i+1)=costsave + sint2tab(i+1)=sintsave +C End of diagnostics section. +#endif +C +C Compute the gradient of esc +C + pom_s1=(1.0d0+x(63))/(0.1d0 + dscp1)**2 + pom_s16=6*(1.0d0+x(64))/(0.1d0 + dscp1**6)**2 + pom_s2=(1.0d0+x(65))/(0.1d0 + dscp2)**2 + pom_s26=6*(1.0d0+x(65))/(0.1d0 + dscp2**6)**2 + pom_dx=dsc_i*dp2_i*cost2tab(i+1) + pom_dy=dsc_i*dp2_i*sint2tab(i+1) + pom_dt1=-0.5d0*dsc_i*dp2_i*(xx*sint2tab(i+1)-yy*cost2tab(i+1)) + pom_dt2=-0.5d0*dsc_i*dp2_i*(xx*sint2tab(i+1)+yy*cost2tab(i+1)) + pom1=(sumene3*sint2tab(i+1)+sumene1) + & *(pom_s1/dscp1+pom_s16*dscp1**4) + pom2=(sumene4*cost2tab(i+1)+sumene2) + & *(pom_s2/dscp2+pom_s26*dscp2**4) + sumene1x=x(2)+2*x(5)*xx+x(8)*zz+ x(9)*yy + sumene3x=x(22)+2*x(25)*xx+x(28)*zz+x(29)*yy+3*x(31)*xx**2 + & +2*x(34)*xx*yy +2*x(35)*xx*zz +x(36)*(yy**2) +x(38)*(zz**2) + & +x(40)*yy*zz + sumene2x=x(12)+2*x(15)*xx+x(18)*zz+ x(19)*yy + sumene4x=x(42)+2*x(45)*xx +x(48)*zz +x(49)*yy +3*x(51)*xx**2 + & +2*x(54)*xx*yy+2*x(55)*xx*zz+x(56)*(yy**2)+x(58)*(zz**2) + & +x(60)*yy*zz + de_dxx =(sumene1x+sumene3x*sint2tab(i+1))*(s1+s1_6) + & +(sumene2x+sumene4x*cost2tab(i+1))*(s2+s2_6) + & +(pom1+pom2)*pom_dx +#ifdef DEBUG + write(2,*), "de_dxx = ", de_dxx,de_dxx_num +#endif +C + sumene1y=x(3) + 2*x(6)*yy + x(9)*xx + x(10)*zz + sumene3y=x(23) +2*x(26)*yy +x(29)*xx +x(30)*zz +3*x(32)*yy**2 + & +x(34)*(xx**2) +2*x(36)*yy*xx +2*x(37)*yy*zz +x(39)*(zz**2) + & +x(40)*xx*zz + sumene2y=x(13) + 2*x(16)*yy + x(19)*xx + x(20)*zz + sumene4y=x(43)+2*x(46)*yy+x(49)*xx +x(50)*zz + & +3*x(52)*yy**2+x(54)*xx**2+2*x(56)*yy*xx +2*x(57)*yy*zz + & +x(59)*zz**2 +x(60)*xx*zz + de_dyy =(sumene1y+sumene3y*sint2tab(i+1))*(s1+s1_6) + & +(sumene2y+sumene4y*cost2tab(i+1))*(s2+s2_6) + & +(pom1-pom2)*pom_dy +#ifdef DEBUG + write(2,*), "de_dyy = ", de_dyy,de_dyy_num +#endif +C + de_dzz =(x(24) +2*x(27)*zz +x(28)*xx +x(30)*yy + & +3*x(33)*zz**2 +x(35)*xx**2 +x(37)*yy**2 +2*x(38)*zz*xx + & +2*x(39)*zz*yy +x(40)*xx*yy)*sint2tab(i+1)*(s1+s1_6) + & +(x(4) + 2*x(7)*zz+ x(8)*xx + x(10)*yy)*(s1+s1_6) + & +(x(44)+2*x(47)*zz +x(48)*xx +x(50)*yy +3*x(53)*zz**2 + & +x(55)*xx**2 +x(57)*(yy**2)+2*x(58)*zz*xx +2*x(59)*zz*yy + & +x(60)*xx*yy)*cost2tab(i+1)*(s2+s2_6) + & + ( x(14) + 2*x(17)*zz+ x(18)*xx + x(20)*yy)*(s2+s2_6) +#ifdef DEBUG + write(2,*), "de_dzz = ", de_dzz,de_dzz_num +#endif +C + de_dt = 0.5d0*sumene3*cost2tab(i+1)*(s1+s1_6) + & -0.5d0*sumene4*sint2tab(i+1)*(s2+s2_6) + & +pom1*pom_dt1+pom2*pom_dt2 +#ifdef DEBUG + write(2,*), "de_dt = ", de_dt,de_dt_num +#endif +c +C + cossc=scalar(dc_norm(1,i),dc_norm(1,i+nres)) + cossc1=scalar(dc_norm(1,i-1),dc_norm(1,i+nres)) + cosfac2xx=cosfac2*xx + sinfac2yy=sinfac2*yy + do k = 1,3 + dt_dCi(k) = -(dc_norm(k,i-1)+costtab(i+1)*dc_norm(k,i))* + & vbld_inv(i+1) + dt_dCi1(k)= -(dc_norm(k,i)+costtab(i+1)*dc_norm(k,i-1))* + & vbld_inv(i) + pom=(dC_norm(k,i+nres)-cossc*dC_norm(k,i))*vbld_inv(i+1) + pom1=(dC_norm(k,i+nres)-cossc1*dC_norm(k,i-1))*vbld_inv(i) +c write (iout,*) "i",i," k",k," pom",pom," pom1",pom1, +c & " dt_dCi",dt_dCi(k)," dt_dCi1",dt_dCi1(k) +c write (iout,*) "dC_norm",(dC_norm(j,i),j=1,3), +c & (dC_norm(j,i-1),j=1,3)," vbld_inv",vbld_inv(i+1),vbld_inv(i) + dXX_Ci(k)=pom*cosfac-dt_dCi(k)*cosfac2xx + dXX_Ci1(k)=-pom1*cosfac-dt_dCi1(k)*cosfac2xx + dYY_Ci(k)=pom*sinfac+dt_dCi(k)*sinfac2yy + dYY_Ci1(k)=pom1*sinfac+dt_dCi1(k)*sinfac2yy + dZZ_Ci1(k)=0.0d0 + dZZ_Ci(k)=0.0d0 + do j=1,3 + dZZ_Ci(k)=dZZ_Ci(k)-uzgrad(j,k,2,i-1)*dC_norm(j,i+nres) + dZZ_Ci1(k)=dZZ_Ci1(k)-uzgrad(j,k,1,i-1)*dC_norm(j,i+nres) + enddo + + dXX_XYZ(k)=vbld_inv(i+nres)*(x_prime(k)-xx*dC_norm(k,i+nres)) + dYY_XYZ(k)=vbld_inv(i+nres)*(y_prime(k)-yy*dC_norm(k,i+nres)) + dZZ_XYZ(k)=vbld_inv(i+nres)*(z_prime(k)-zz*dC_norm(k,i+nres)) +c + dt_dCi(k) = -dt_dCi(k)/sinttab(i+1) + dt_dCi1(k)= -dt_dCi1(k)/sinttab(i+1) + enddo + + do k=1,3 + dXX_Ctab(k,i)=dXX_Ci(k) + dXX_C1tab(k,i)=dXX_Ci1(k) + dYY_Ctab(k,i)=dYY_Ci(k) + dYY_C1tab(k,i)=dYY_Ci1(k) + dZZ_Ctab(k,i)=dZZ_Ci(k) + dZZ_C1tab(k,i)=dZZ_Ci1(k) + dXX_XYZtab(k,i)=dXX_XYZ(k) + dYY_XYZtab(k,i)=dYY_XYZ(k) + dZZ_XYZtab(k,i)=dZZ_XYZ(k) + enddo + + do k = 1,3 +c write (iout,*) "k",k," dxx_ci1",dxx_ci1(k)," dyy_ci1", +c & dyy_ci1(k)," dzz_ci1",dzz_ci1(k) +c write (iout,*) "k",k," dxx_ci",dxx_ci(k)," dyy_ci", +c & dyy_ci(k)," dzz_ci",dzz_ci(k) +c write (iout,*) "k",k," dt_dci",dt_dci(k)," dt_dci", +c & dt_dci(k) +c write (iout,*) "k",k," dxx_XYZ",dxx_XYZ(k)," dyy_XYZ", +c & dyy_XYZ(k)," dzz_XYZ",dzz_XYZ(k) + gscloc(k,i-1)=gscloc(k,i-1)+de_dxx*dxx_ci1(k) + & +de_dyy*dyy_ci1(k)+de_dzz*dzz_ci1(k)+de_dt*dt_dCi1(k) + gscloc(k,i)=gscloc(k,i)+de_dxx*dxx_Ci(k) + & +de_dyy*dyy_Ci(k)+de_dzz*dzz_Ci(k)+de_dt*dt_dCi(k) + gsclocx(k,i)= de_dxx*dxx_XYZ(k) + & +de_dyy*dyy_XYZ(k)+de_dzz*dzz_XYZ(k) + enddo +c write(iout,*) "ENERGY GRAD = ", (gscloc(k,i-1),k=1,3), +c & (gscloc(k,i),k=1,3),(gsclocx(k,i),k=1,3) + +C to check gradient call subroutine check_grad + + 1 continue + enddo + return + end +c------------------------------------------------------------------------------ + double precision function enesc(x,xx,yy,zz,cost2,sint2) + implicit none + double precision x(65),xx,yy,zz,cost2,sint2,sumene1,sumene2, + & sumene3,sumene4,sumene,dsc_i,dp2_i,dscp1,dscp2,s1,s1_6,s2,s2_6 + sumene1= x(1)+ x(2)*xx+ x(3)*yy+ x(4)*zz+ x(5)*xx**2 + & + x(6)*yy**2+ x(7)*zz**2+ x(8)*xx*zz+ x(9)*xx*yy + & + x(10)*yy*zz + sumene2= x(11) + x(12)*xx + x(13)*yy + x(14)*zz + x(15)*xx**2 + & + x(16)*yy**2 + x(17)*zz**2 + x(18)*xx*zz + x(19)*xx*yy + & + x(20)*yy*zz + sumene3= x(21) +x(22)*xx +x(23)*yy +x(24)*zz +x(25)*xx**2 + & +x(26)*yy**2 +x(27)*zz**2 +x(28)*xx*zz +x(29)*xx*yy + & +x(30)*yy*zz +x(31)*xx**3 +x(32)*yy**3 +x(33)*zz**3 + & +x(34)*(xx**2)*yy +x(35)*(xx**2)*zz +x(36)*(yy**2)*xx + & +x(37)*(yy**2)*zz +x(38)*(zz**2)*xx +x(39)*(zz**2)*yy + & +x(40)*xx*yy*zz + sumene4= x(41) +x(42)*xx +x(43)*yy +x(44)*zz +x(45)*xx**2 + & +x(46)*yy**2 +x(47)*zz**2 +x(48)*xx*zz +x(49)*xx*yy + & +x(50)*yy*zz +x(51)*xx**3 +x(52)*yy**3 +x(53)*zz**3 + & +x(54)*(xx**2)*yy +x(55)*(xx**2)*zz +x(56)*(yy**2)*xx + & +x(57)*(yy**2)*zz +x(58)*(zz**2)*xx +x(59)*(zz**2)*yy + & +x(60)*xx*yy*zz + dsc_i = 0.743d0+x(61) + dp2_i = 1.9d0+x(62) + dscp1=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2+yy*sint2)) + dscp2=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2-yy*sint2)) + s1=(1+x(63))/(0.1d0 + dscp1) + s1_6=(1+x(64))/(0.1d0 + dscp1**6) + s2=(1+x(65))/(0.1d0 + dscp2) + s2_6=(1+x(65))/(0.1d0 + dscp2**6) + sumene = ( sumene3*sint2 + sumene1)*(s1+s1_6) + & + (sumene4*cost2 +sumene2)*(s2+s2_6) + enesc=sumene + return + end +#endif +c------------------------------------------------------------------------------ + subroutine gcont(rij,r0ij,eps0ij,delta,fcont,fprimcont) +C +C This procedure calculates two-body contact function g(rij) and its derivative: +C +C eps0ij ! x < -1 +C g(rij) = esp0ij*(-0.9375*x+0.625*x**3-0.1875*x**5) ! -1 =< x =< 1 +C 0 ! x > 1 +C +C where x=(rij-r0ij)/delta +C +C rij - interbody distance, r0ij - contact distance, eps0ij - contact energy +C + implicit none + double precision rij,r0ij,eps0ij,fcont,fprimcont + double precision x,x2,x4,delta +c delta=0.02D0*r0ij +c delta=0.2D0*r0ij + x=(rij-r0ij)/delta + if (x.lt.-1.0D0) then + fcont=eps0ij + fprimcont=0.0D0 + else if (x.le.1.0D0) then + x2=x*x + x4=x2*x2 + fcont=eps0ij*(x*(-0.9375D0+0.6250D0*x2-0.1875D0*x4)+0.5D0) + fprimcont=eps0ij * (-0.9375D0+1.8750D0*x2-0.9375D0*x4)/delta + else + fcont=0.0D0 + fprimcont=0.0D0 + endif + return + end +c------------------------------------------------------------------------------ + subroutine splinthet(theti,delta,ss,ssder) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + thetup=pi-delta + thetlow=delta + if (theti.gt.pipol) then + call gcont(theti,thetup,1.0d0,delta,ss,ssder) + else + call gcont(-theti,-thetlow,1.0d0,delta,ss,ssder) + ssder=-ssder + endif + return + end +c------------------------------------------------------------------------------ + subroutine spline1(x,x0,delta,f0,f1,fprim0,f,fprim) + implicit none + double precision x,x0,delta,f0,f1,fprim0,f,fprim + double precision ksi,ksi2,ksi3,a1,a2,a3 + a1=fprim0*delta/(f1-f0) + a2=3.0d0-2.0d0*a1 + a3=a1-2.0d0 + ksi=(x-x0)/delta + ksi2=ksi*ksi + ksi3=ksi2*ksi + f=f0+(f1-f0)*ksi*(a1+ksi*(a2+a3*ksi)) + fprim=(f1-f0)/delta*(a1+ksi*(2*a2+3*ksi*a3)) + return + end +c------------------------------------------------------------------------------ + subroutine spline2(x,x0,delta,f0x,f1x,fprim0x,fx) + implicit none + double precision x,x0,delta,f0x,f1x,fprim0x,fx + double precision ksi,ksi2,ksi3,a1,a2,a3 + ksi=(x-x0)/delta + ksi2=ksi*ksi + ksi3=ksi2*ksi + a1=fprim0x*delta + a2=3*(f1x-f0x)-2*fprim0x*delta + a3=fprim0x*delta-2*(f1x-f0x) + fx=f0x+a1*ksi+a2*ksi2+a3*ksi3 + return + end +C----------------------------------------------------------------------------- +#ifdef CRYST_TOR +C----------------------------------------------------------------------------- + subroutine etor(etors,edihcnstr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors=0.0D0 + do i=iphi_start,iphi_end + etors_ii=0.0D0 + if (itype(i-2).eq.21 .or. itype(i-1).eq.21 + & .or. itype(i).eq.21) cycle + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + phii=phi(i) + gloci=0.0D0 +C Proline-Proline pair is a special case... + if (itori.eq.3 .and. itori1.eq.3) then + if (phii.gt.-dwapi3) then + cosphi=dcos(3*phii) + fac=1.0D0/(1.0D0-cosphi) + etorsi=v1(1,3,3)*fac + etorsi=etorsi+etorsi + etors=etors+etorsi-v1(1,3,3) + if (energy_dec) etors_ii=etors_ii+etorsi-v1(1,3,3) + gloci=gloci-3*fac*etorsi*dsin(3*phii) + endif + do j=1,3 + v1ij=v1(j+1,itori,itori1) + v2ij=v2(j+1,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + if (energy_dec) etors_ii=etors_ii+ + & v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + else + do j=1,nterm_old + v1ij=v1(j,itori,itori1) + v2ij=v2(j,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + if (energy_dec) etors_ii=etors_ii+ + & v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + endif + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + 'etor',i,etors_ii + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1(j,itori,itori1),j=1,6),(v2(j,itori,itori1),j=1,6) + gloc(i-3,icg)=gloc(i-3,icg)+wtor*gloci +c write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg) + enddo +! 6/20/98 - dihedral angle constraints + edihcnstr=0.0d0 + do i=1,ndih_constr + itori=idih_constr(i) + phii=phi(itori) + difi=phii-phi0(i) + if (difi.gt.drange(i)) then + difi=difi-drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else if (difi.lt.-drange(i)) then + difi=difi+drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + endif +! write (iout,'(2i5,2f8.3,2e14.5)') i,itori,rad2deg*phii, +! & rad2deg*difi,0.25d0*ftors*difi**4,gloc(itori-3,icg) + enddo +! write (iout,*) 'edihcnstr',edihcnstr + return + end +c------------------------------------------------------------------------------ + subroutine etor_d(etors_d) + etors_d=0.0d0 + return + end +c---------------------------------------------------------------------------- +#else + subroutine etor(etors,edihcnstr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors=0.0D0 + do i=iphi_start,iphi_end + if (itype(i-2).eq.21 .or. itype(i-1).eq.21 + & .or. itype(i).eq.21) cycle + etors_ii=0.0D0 + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + phii=phi(i) + gloci=0.0D0 +C Regular cosine and sine terms + do j=1,nterm(itori,itori1) + v1ij=v1(j,itori,itori1) + v2ij=v2(j,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi + if (energy_dec) etors_ii=etors_ii+ + & v1ij*cosphi+v2ij*sinphi + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo +C Lorentz terms +C v1 +C E = SUM ----------------------------------- - v1 +C [v2 cos(phi/2)+v3 sin(phi/2)]^2 + 1 +C + cosphi=dcos(0.5d0*phii) + sinphi=dsin(0.5d0*phii) + do j=1,nlor(itori,itori1) + vl1ij=vlor1(j,itori,itori1) + vl2ij=vlor2(j,itori,itori1) + vl3ij=vlor3(j,itori,itori1) + pom=vl2ij*cosphi+vl3ij*sinphi + pom1=1.0d0/(pom*pom+1.0d0) + etors=etors+vl1ij*pom1 + if (energy_dec) etors_ii=etors_ii+ + & vl1ij*pom1 + pom=-pom*pom1*pom1 + gloci=gloci+vl1ij*(vl3ij*cosphi-vl2ij*sinphi)*pom + enddo +C Subtract the constant term + etors=etors-v0(itori,itori1) + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'etor',i,etors_ii-v0(itori,itori1) + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1(j,itori,itori1),j=1,6),(v2(j,itori,itori1),j=1,6) + gloc(i-3,icg)=gloc(i-3,icg)+wtor*gloci +c write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg) + enddo +! 6/20/98 - dihedral angle constraints + edihcnstr=0.0d0 +c do i=1,ndih_constr + do i=idihconstr_start,idihconstr_end + itori=idih_constr(i) + phii=phi(itori) + difi=pinorm(phii-phi0(i)) + if (difi.gt.drange(i)) then + difi=difi-drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else if (difi.lt.-drange(i)) then + difi=difi+drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else + difi=0.0 + endif +cd write (iout,'(2i5,4f8.3,2e14.5)') i,itori,rad2deg*phii, +cd & rad2deg*phi0(i), rad2deg*drange(i), +cd & rad2deg*difi,0.25d0*ftors*difi**4,gloc(itori-3,icg) + enddo +cd write (iout,*) 'edihcnstr',edihcnstr + return + end +c---------------------------------------------------------------------------- + subroutine etor_d(etors_d) +C 6/23/01 Compute double torsional energy + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors_d=0.0D0 + do i=iphid_start,iphid_end + if (itype(i-2).eq.21 .or. itype(i-1).eq.21 + & .or. itype(i).eq.21 .or. itype(i+1).eq.21) cycle + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + itori2=itortyp(itype(i)) + phii=phi(i) + phii1=phi(i+1) + gloci1=0.0D0 + gloci2=0.0D0 +C Regular cosine and sine terms + do j=1,ntermd_1(itori,itori1,itori2) + v1cij=v1c(1,j,itori,itori1,itori2) + v1sij=v1s(1,j,itori,itori1,itori2) + v2cij=v1c(2,j,itori,itori1,itori2) + v2sij=v1s(2,j,itori,itori1,itori2) + cosphi1=dcos(j*phii) + sinphi1=dsin(j*phii) + cosphi2=dcos(j*phii1) + sinphi2=dsin(j*phii1) + etors_d=etors_d+v1cij*cosphi1+v1sij*sinphi1+ + & v2cij*cosphi2+v2sij*sinphi2 + gloci1=gloci1+j*(v1sij*cosphi1-v1cij*sinphi1) + gloci2=gloci2+j*(v2sij*cosphi2-v2cij*sinphi2) + enddo + do k=2,ntermd_2(itori,itori1,itori2) + do l=1,k-1 + v1cdij = v2c(k,l,itori,itori1,itori2) + v2cdij = v2c(l,k,itori,itori1,itori2) + v1sdij = v2s(k,l,itori,itori1,itori2) + v2sdij = v2s(l,k,itori,itori1,itori2) + cosphi1p2=dcos(l*phii+(k-l)*phii1) + cosphi1m2=dcos(l*phii-(k-l)*phii1) + sinphi1p2=dsin(l*phii+(k-l)*phii1) + sinphi1m2=dsin(l*phii-(k-l)*phii1) + etors_d=etors_d+v1cdij*cosphi1p2+v2cdij*cosphi1m2+ + & v1sdij*sinphi1p2+v2sdij*sinphi1m2 + gloci1=gloci1+l*(v1sdij*cosphi1p2+v2sdij*cosphi1m2 + & -v1cdij*sinphi1p2-v2cdij*sinphi1m2) + gloci2=gloci2+(k-l)*(v1sdij*cosphi1p2-v2sdij*cosphi1m2 + & -v1cdij*sinphi1p2+v2cdij*sinphi1m2) + enddo + enddo + gloc(i-3,icg)=gloc(i-3,icg)+wtor_d*gloci1 + gloc(i-2,icg)=gloc(i-2,icg)+wtor_d*gloci2 + enddo + return + end +#endif +c------------------------------------------------------------------------------ + subroutine eback_sc_corr(esccor) +c 7/21/2007 Correlations between the backbone-local and side-chain-local +c conformational states; temporarily implemented as differences +c between UNRES torsional potentials (dependent on three types of +c residues) and the torsional potentials dependent on all 20 types +c of residues computed from AM1 energy surfaces of terminally-blocked +c amino-acid residues. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.SCCOR' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. +c write (iout,*) "EBACK_SC_COR",iphi_start,iphi_end,nterm_sccor + esccor=0.0D0 + do i=iphi_start,iphi_end + if (itype(i-2).eq.21 .or. itype(i-1).eq.21) cycle + esccor_ii=0.0D0 + itori=itype(i-2) + itori1=itype(i-1) + phii=phi(i) + gloci=0.0D0 + do j=1,nterm_sccor + v1ij=v1sccor(j,itori,itori1) + v2ij=v2sccor(j,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + esccor=esccor+v1ij*cosphi+v2ij*sinphi + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1sccor(j,itori,itori1),j=1,6),(v2sccor(j,itori,itori1),j=1,6) + gsccor_loc(i-3)=gsccor_loc(i-3)+gloci + enddo + return + end +c---------------------------------------------------------------------------- + subroutine multibody(ecorr) +C This subroutine calculates multi-body contributions to energy following +C the idea of Skolnick et al. If side chains I and J make a contact and +C at the same time side chains I+1 and J+1 make a contact, an extra +C contribution equal to sqrt(eps(i,j)*eps(i+1,j+1)) is added. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + +C Set lprn=.true. for debugging + lprn=.false. + + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(i2,20(1x,i2,f10.5))') + & i,(jcont(j,i),facont(j,i),j=1,num_cont(i)) + enddo + endif + ecorr=0.0D0 + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo + do i=nnt,nct-2 + + DO ISHIFT = 3,4 + + i1=i+ishift + num_conti=num_cont(i) + num_conti1=num_cont(i1) + do jj=1,num_conti + j=jcont(jj,i) + do kk=1,num_conti1 + j1=jcont(kk,i1) + if (j1.eq.j+ishift .or. j1.eq.j-ishift) then +cd write(iout,*)'i=',i,' j=',j,' i1=',i1,' j1=',j1, +cd & ' ishift=',ishift +C Contacts I--J and I+ISHIFT--J+-ISHIFT1 occur simultaneously. +C The system gains extra energy. + ecorr=ecorr+esccorr(i,j,i1,j1,jj,kk) + endif ! j1==j+-ishift + enddo ! kk + enddo ! jj + + ENDDO ! ISHIFT + + enddo ! i + return + end +c------------------------------------------------------------------------------ + double precision function esccorr(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + lprn=.false. + eij=facont(jj,i) + ekl=facont(kk,k) +cd write (iout,'(4i5,3f10.5)') i,j,k,l,eij,ekl,-eij*ekl +C Calculate the multi-body contribution to energy. +C Calculate multi-body contributions to the gradient. +cd write (iout,'(2(2i3,3f10.5))')i,j,(gacont(m,jj,i),m=1,3), +cd & k,l,(gacont(m,kk,k),m=1,3) + do m=1,3 + gx(m) =ekl*gacont(m,jj,i) + gx1(m)=eij*gacont(m,kk,k) + gradxorr(m,i)=gradxorr(m,i)-gx(m) + gradxorr(m,j)=gradxorr(m,j)+gx(m) + gradxorr(m,k)=gradxorr(m,k)-gx1(m) + gradxorr(m,l)=gradxorr(m,l)+gx1(m) + enddo + do m=i,j-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+gx(ll) + enddo + enddo + do m=k,l-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+gx1(ll) + enddo + enddo + esccorr=-eij*ekl + return + end +c------------------------------------------------------------------------------ + subroutine multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) +C This subroutine calculates multi-body contributions to hydrogen-bonding + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPI + include "mpif.h" + parameter (max_cont=maxconts) + parameter (max_dim=26) + integer source,CorrelType,CorrelID,CorrelType1,CorrelID1,Error + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer status(MPI_STATUS_SIZE),req(maxconts*2), + & status_array(MPI_STATUS_SIZE,maxconts*2) +#endif + include 'COMMON.SETUP' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.LOCAL' + double precision gx(3),gx1(3),time00 + logical lprn,ldone + +C Set lprn=.true. for debugging + lprn=.false. +#ifdef MPI + n_corr=0 + n_corr1=0 + if (nfgtasks.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values before RECEIVE:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + call flush(iout) + do i=1,ntask_cont_from + ncont_recv(i)=0 + enddo + do i=1,ntask_cont_to + ncont_sent(i)=0 + enddo +c write (iout,*) "ntask_cont_from",ntask_cont_from," ntask_cont_to", +c & ntask_cont_to +C Make the list of contacts to send to send to other procesors +c write (iout,*) "limits",max0(iturn4_end-1,iatel_s),iturn3_end +c call flush(iout) + do i=iturn3_start,iturn3_end +c write (iout,*) "make contact list turn3",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact(i,i+2,iturn3_sent_local(1,i)) + enddo + do i=iturn4_start,iturn4_end +c write (iout,*) "make contact list turn4",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact(i,i+3,iturn4_sent_local(1,i)) + enddo + do ii=1,nat_sent + i=iat_sent(ii) +c write (iout,*) "make contact list longrange",i,ii," num_cont", +c & num_cont_hb(i) + do j=1,num_cont_hb(i) + do k=1,4 + jjc=jcont_hb(j,i) + iproc=iint_sent_local(k,jjc,ii) +c write (iout,*) "i",i," j",j," k",k," jjc",jjc," iproc",iproc + if (iproc.gt.0) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=i + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=facont_hb(j,i) + zapas(4,nn,iproc)=ees0p(j,i) + zapas(5,nn,iproc)=ees0m(j,i) + zapas(6,nn,iproc)=gacont_hbr(1,j,i) + zapas(7,nn,iproc)=gacont_hbr(2,j,i) + zapas(8,nn,iproc)=gacont_hbr(3,j,i) + zapas(9,nn,iproc)=gacontm_hb1(1,j,i) + zapas(10,nn,iproc)=gacontm_hb1(2,j,i) + zapas(11,nn,iproc)=gacontm_hb1(3,j,i) + zapas(12,nn,iproc)=gacontp_hb1(1,j,i) + zapas(13,nn,iproc)=gacontp_hb1(2,j,i) + zapas(14,nn,iproc)=gacontp_hb1(3,j,i) + zapas(15,nn,iproc)=gacontm_hb2(1,j,i) + zapas(16,nn,iproc)=gacontm_hb2(2,j,i) + zapas(17,nn,iproc)=gacontm_hb2(3,j,i) + zapas(18,nn,iproc)=gacontp_hb2(1,j,i) + zapas(19,nn,iproc)=gacontp_hb2(2,j,i) + zapas(20,nn,iproc)=gacontp_hb2(3,j,i) + zapas(21,nn,iproc)=gacontm_hb3(1,j,i) + zapas(22,nn,iproc)=gacontm_hb3(2,j,i) + zapas(23,nn,iproc)=gacontm_hb3(3,j,i) + zapas(24,nn,iproc)=gacontp_hb3(1,j,i) + zapas(25,nn,iproc)=gacontp_hb3(2,j,i) + zapas(26,nn,iproc)=gacontp_hb3(3,j,i) + endif + enddo + enddo + enddo + if (lprn) then + write (iout,*) + & "Numbers of contacts to be sent to other processors", + & (ncont_sent(i),i=1,ntask_cont_to) + write (iout,*) "Contacts sent" + do ii=1,ntask_cont_to + nn=ncont_sent(ii) + iproc=itask_cont_to(ii) + write (iout,*) nn," contacts to processor",iproc, + & " of CONT_TO_COMM group" + do i=1,nn + write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) + enddo + enddo + call flush(iout) + endif + CorrelType=477 + CorrelID=fg_rank+1 + CorrelType1=478 + CorrelID1=nfgtasks+fg_rank+1 + ireq=0 +C Receive the numbers of needed contacts from other processors + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + ireq=ireq+1 + call MPI_Irecv(ncont_recv(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "IRECV ended" +c call flush(iout) +C Send the number of contacts needed by other processors + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + ireq=ireq+1 + call MPI_Isend(ncont_sent(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "ISEND ended" +c write (iout,*) "number of requests (nn)",ireq + call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) +c write (iout,*) +c & "Numbers of contacts to be received from other processors", +c & (ncont_recv(i),i=1,ntask_cont_from) +c call flush(iout) +C Receive contacts + ireq=0 + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + nn=ncont_recv(ii) +c write (iout,*) "Receiving",nn," contacts from processor",iproc, +c & " of CONT_TO_COMM group" + call flush(iout) + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Irecv(zapas_recv(1,1,ii),nn*max_dim, + & MPI_DOUBLE_PRECISION,iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) + endif + enddo +C Send the contacts to processors that need them + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + nn=ncont_sent(ii) +c write (iout,*) nn," contacts to processor",iproc, +c & " of CONT_TO_COMM group" + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Isend(zapas(1,1,ii),nn*max_dim,MPI_DOUBLE_PRECISION, + & iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) +c do i=1,nn +c write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) +c enddo + endif + enddo +c write (iout,*) "number of requests (contacts)",ireq +c write (iout,*) "req",(req(i),i=1,4) +c call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) + do iii=1,ntask_cont_from + iproc=itask_cont_from(iii) + nn=ncont_recv(iii) + if (lprn) then + write (iout,*) "Received",nn," contacts from processor",iproc, + & " of CONT_FROM_COMM group" + call flush(iout) + do i=1,nn + write(iout,'(2f5.0,4f10.5)')(zapas_recv(j,i,iii),j=1,5) + enddo + call flush(iout) + endif + do i=1,nn + ii=zapas_recv(1,i,iii) +c Flag the received contacts to prevent double-counting + jj=-zapas_recv(2,i,iii) +c write (iout,*) "iii",iii," i",i," ii",ii," jj",jj +c call flush(iout) + nnn=num_cont_hb(ii)+1 + num_cont_hb(ii)=nnn + jcont_hb(nnn,ii)=jj + facont_hb(nnn,ii)=zapas_recv(3,i,iii) + ees0p(nnn,ii)=zapas_recv(4,i,iii) + ees0m(nnn,ii)=zapas_recv(5,i,iii) + gacont_hbr(1,nnn,ii)=zapas_recv(6,i,iii) + gacont_hbr(2,nnn,ii)=zapas_recv(7,i,iii) + gacont_hbr(3,nnn,ii)=zapas_recv(8,i,iii) + gacontm_hb1(1,nnn,ii)=zapas_recv(9,i,iii) + gacontm_hb1(2,nnn,ii)=zapas_recv(10,i,iii) + gacontm_hb1(3,nnn,ii)=zapas_recv(11,i,iii) + gacontp_hb1(1,nnn,ii)=zapas_recv(12,i,iii) + gacontp_hb1(2,nnn,ii)=zapas_recv(13,i,iii) + gacontp_hb1(3,nnn,ii)=zapas_recv(14,i,iii) + gacontm_hb2(1,nnn,ii)=zapas_recv(15,i,iii) + gacontm_hb2(2,nnn,ii)=zapas_recv(16,i,iii) + gacontm_hb2(3,nnn,ii)=zapas_recv(17,i,iii) + gacontp_hb2(1,nnn,ii)=zapas_recv(18,i,iii) + gacontp_hb2(2,nnn,ii)=zapas_recv(19,i,iii) + gacontp_hb2(3,nnn,ii)=zapas_recv(20,i,iii) + gacontm_hb3(1,nnn,ii)=zapas_recv(21,i,iii) + gacontm_hb3(2,nnn,ii)=zapas_recv(22,i,iii) + gacontm_hb3(3,nnn,ii)=zapas_recv(23,i,iii) + gacontp_hb3(1,nnn,ii)=zapas_recv(24,i,iii) + gacontp_hb3(2,nnn,ii)=zapas_recv(25,i,iii) + gacontp_hb3(3,nnn,ii)=zapas_recv(26,i,iii) + enddo + enddo + call flush(iout) + if (lprn) then + write (iout,'(a)') 'Contact function values after receive:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + call flush(iout) + endif + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + ecorr=0.0D0 +C Remove the loop below after debugging !!! + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo +C Calculate the local-electrostatic correlation terms + do i=min0(iatel_s,iturn4_start),max0(iatel_e,iturn3_end) + i1=i+1 + num_conti=num_cont_hb(i) + num_conti1=num_cont_hb(i+1) + do jj=1,num_conti + j=jcont_hb(jj,i) + jp=iabs(j) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) + jp1=iabs(j1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if ((j.gt.0 .and. j1.gt.0 .or. j.gt.0 .and. j1.lt.0 + & .or. j.lt.0 .and. j1.gt.0) .and. + & (jp1.eq.jp+1 .or. jp1.eq.jp-1)) then +C Contacts I-J and (I+1)-(J+1) or (I+1)-(J-1) occur simultaneously. +C The system gains extra energy. + ecorr=ecorr+ehbcorr(i,jp,i+1,jp1,jj,kk,0.72D0,0.32D0) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'ecorrh',i,j,ehbcorr(i,j,i+1,j1,jj,kk,0.72D0,0.32D0) + n_corr=n_corr+1 + else if (j1.eq.j) then +C Contacts I-J and I-(J+1) occur simultaneously. +C The system loses extra energy. +c ecorr=ecorr+ehbcorr(i,j,i+1,j,jj,kk,0.60D0,-0.40D0) + endif + enddo ! kk + do kk=1,num_conti + j1=jcont_hb(kk,i) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if (j1.eq.j+1) then +C Contacts I-J and (I+1)-J occur simultaneously. +C The system loses extra energy. +c ecorr=ecorr+ehbcorr(i,j,i,j+1,jj,kk,0.60D0,-0.40D0) + endif ! j1==j+1 + enddo ! kk + enddo ! jj + enddo ! i + return + end +c------------------------------------------------------------------------------ + subroutine add_hb_contact(ii,jj,itask) + implicit real*8 (a-h,o-z) + include "DIMENSIONS" + include "COMMON.IOUNITS" + integer max_cont + integer max_dim + parameter (max_cont=maxconts) + parameter (max_dim=26) + include "COMMON.CONTACTS" + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer i,j,ii,jj,iproc,itask(4),nn +c write (iout,*) "itask",itask + do i=1,2 + iproc=itask(i) + if (iproc.gt.0) then + do j=1,num_cont_hb(ii) + jjc=jcont_hb(j,ii) +c write (iout,*) "i",ii," j",jj," jjc",jjc + if (jjc.eq.jj) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=ii + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=facont_hb(j,ii) + zapas(4,nn,iproc)=ees0p(j,ii) + zapas(5,nn,iproc)=ees0m(j,ii) + zapas(6,nn,iproc)=gacont_hbr(1,j,ii) + zapas(7,nn,iproc)=gacont_hbr(2,j,ii) + zapas(8,nn,iproc)=gacont_hbr(3,j,ii) + zapas(9,nn,iproc)=gacontm_hb1(1,j,ii) + zapas(10,nn,iproc)=gacontm_hb1(2,j,ii) + zapas(11,nn,iproc)=gacontm_hb1(3,j,ii) + zapas(12,nn,iproc)=gacontp_hb1(1,j,ii) + zapas(13,nn,iproc)=gacontp_hb1(2,j,ii) + zapas(14,nn,iproc)=gacontp_hb1(3,j,ii) + zapas(15,nn,iproc)=gacontm_hb2(1,j,ii) + zapas(16,nn,iproc)=gacontm_hb2(2,j,ii) + zapas(17,nn,iproc)=gacontm_hb2(3,j,ii) + zapas(18,nn,iproc)=gacontp_hb2(1,j,ii) + zapas(19,nn,iproc)=gacontp_hb2(2,j,ii) + zapas(20,nn,iproc)=gacontp_hb2(3,j,ii) + zapas(21,nn,iproc)=gacontm_hb3(1,j,ii) + zapas(22,nn,iproc)=gacontm_hb3(2,j,ii) + zapas(23,nn,iproc)=gacontm_hb3(3,j,ii) + zapas(24,nn,iproc)=gacontp_hb3(1,j,ii) + zapas(25,nn,iproc)=gacontp_hb3(2,j,ii) + zapas(26,nn,iproc)=gacontp_hb3(3,j,ii) + exit + endif + enddo + endif + enddo + return + end +c------------------------------------------------------------------------------ + subroutine multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr, + & n_corr1) +C This subroutine calculates multi-body contributions to hydrogen-bonding + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPI + include "mpif.h" + parameter (max_cont=maxconts) + parameter (max_dim=70) + integer source,CorrelType,CorrelID,CorrelType1,CorrelID1,Error + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer status(MPI_STATUS_SIZE),req(maxconts*2), + & status_array(MPI_STATUS_SIZE,maxconts*2) +#endif + include 'COMMON.SETUP' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.CONTROL' + double precision gx(3),gx1(3) + integer num_cont_hb_old(maxres) + logical lprn,ldone + double precision eello4,eello5,eelo6,eello_turn6 + external eello4,eello5,eello6,eello_turn6 +C Set lprn=.true. for debugging + lprn=.false. + eturn6=0.0d0 +#ifdef MPI + do i=1,nres + num_cont_hb_old(i)=num_cont_hb(i) + enddo + n_corr=0 + n_corr1=0 + if (nfgtasks.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values before RECEIVE:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + call flush(iout) + do i=1,ntask_cont_from + ncont_recv(i)=0 + enddo + do i=1,ntask_cont_to + ncont_sent(i)=0 + enddo +c write (iout,*) "ntask_cont_from",ntask_cont_from," ntask_cont_to", +c & ntask_cont_to +C Make the list of contacts to send to send to other procesors + do i=iturn3_start,iturn3_end +c write (iout,*) "make contact list turn3",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact_eello(i,i+2,iturn3_sent_local(1,i)) + enddo + do i=iturn4_start,iturn4_end +c write (iout,*) "make contact list turn4",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact_eello(i,i+3,iturn4_sent_local(1,i)) + enddo + do ii=1,nat_sent + i=iat_sent(ii) +c write (iout,*) "make contact list longrange",i,ii," num_cont", +c & num_cont_hb(i) + do j=1,num_cont_hb(i) + do k=1,4 + jjc=jcont_hb(j,i) + iproc=iint_sent_local(k,jjc,ii) +c write (iout,*) "i",i," j",j," k",k," jjc",jjc," iproc",iproc + if (iproc.ne.0) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=i + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=d_cont(j,i) + ind=3 + do kk=1,3 + ind=ind+1 + zapas(ind,nn,iproc)=grij_hb_cont(kk,j,i) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj(ll,kk,j,i) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj_der(mm,ll,kk,jj,j,i) + enddo + enddo + enddo + enddo + endif + enddo + enddo + enddo + if (lprn) then + write (iout,*) + & "Numbers of contacts to be sent to other processors", + & (ncont_sent(i),i=1,ntask_cont_to) + write (iout,*) "Contacts sent" + do ii=1,ntask_cont_to + nn=ncont_sent(ii) + iproc=itask_cont_to(ii) + write (iout,*) nn," contacts to processor",iproc, + & " of CONT_TO_COMM group" + do i=1,nn + write(iout,'(2f5.0,10f10.5)')(zapas(j,i,ii),j=1,10) + enddo + enddo + call flush(iout) + endif + CorrelType=477 + CorrelID=fg_rank+1 + CorrelType1=478 + CorrelID1=nfgtasks+fg_rank+1 + ireq=0 +C Receive the numbers of needed contacts from other processors + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + ireq=ireq+1 + call MPI_Irecv(ncont_recv(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "IRECV ended" +c call flush(iout) +C Send the number of contacts needed by other processors + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + ireq=ireq+1 + call MPI_Isend(ncont_sent(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "ISEND ended" +c write (iout,*) "number of requests (nn)",ireq + call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) +c write (iout,*) +c & "Numbers of contacts to be received from other processors", +c & (ncont_recv(i),i=1,ntask_cont_from) +c call flush(iout) +C Receive contacts + ireq=0 + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + nn=ncont_recv(ii) +c write (iout,*) "Receiving",nn," contacts from processor",iproc, +c & " of CONT_TO_COMM group" + call flush(iout) + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Irecv(zapas_recv(1,1,ii),nn*max_dim, + & MPI_DOUBLE_PRECISION,iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) + endif + enddo +C Send the contacts to processors that need them + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + nn=ncont_sent(ii) +c write (iout,*) nn," contacts to processor",iproc, +c & " of CONT_TO_COMM group" + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Isend(zapas(1,1,ii),nn*max_dim,MPI_DOUBLE_PRECISION, + & iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) +c do i=1,nn +c write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) +c enddo + endif + enddo +c write (iout,*) "number of requests (contacts)",ireq +c write (iout,*) "req",(req(i),i=1,4) +c call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) + do iii=1,ntask_cont_from + iproc=itask_cont_from(iii) + nn=ncont_recv(iii) + if (lprn) then + write (iout,*) "Received",nn," contacts from processor",iproc, + & " of CONT_FROM_COMM group" + call flush(iout) + do i=1,nn + write(iout,'(2f5.0,10f10.5)')(zapas_recv(j,i,iii),j=1,10) + enddo + call flush(iout) + endif + do i=1,nn + ii=zapas_recv(1,i,iii) +c Flag the received contacts to prevent double-counting + jj=-zapas_recv(2,i,iii) +c write (iout,*) "iii",iii," i",i," ii",ii," jj",jj +c call flush(iout) + nnn=num_cont_hb(ii)+1 + num_cont_hb(ii)=nnn + jcont_hb(nnn,ii)=jj + d_cont(nnn,ii)=zapas_recv(3,i,iii) + ind=3 + do kk=1,3 + ind=ind+1 + grij_hb_cont(kk,nnn,ii)=zapas_recv(ind,i,iii) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + a_chuj(ll,kk,nnn,ii)=zapas_recv(ind,i,iii) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + a_chuj_der(mm,ll,kk,jj,nnn,ii)=zapas_recv(ind,i,iii) + enddo + enddo + enddo + enddo + enddo + enddo + call flush(iout) + if (lprn) then + write (iout,'(a)') 'Contact function values after receive:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,5f6.3))') + & i,num_cont_hb(i),(jcont_hb(j,i),d_cont(j,i), + & ((a_chuj(ll,kk,j,i),ll=1,2),kk=1,2),j=1,num_cont_hb(i)) + enddo + call flush(iout) + endif + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,5f6.3))') + & i,num_cont_hb(i),(jcont_hb(j,i),d_cont(j,i), + & ((a_chuj(ll,kk,j,i),ll=1,2),kk=1,2),j=1,num_cont_hb(i)) + enddo + endif + ecorr=0.0D0 + ecorr5=0.0d0 + ecorr6=0.0d0 +C Remove the loop below after debugging !!! + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo +C Calculate the dipole-dipole interaction energies + if (wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0) then + do i=iatel_s,iatel_e+1 + num_conti=num_cont_hb(i) + do jj=1,num_conti + j=jcont_hb(jj,i) +#ifdef MOMENT + call dipole(i,j,jj) +#endif + enddo + enddo + endif +C Calculate the local-electrostatic correlation terms +c write (iout,*) "gradcorr5 in eello5 before loop" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + do i=min0(iatel_s,iturn4_start),max0(iatel_e+1,iturn3_end+1) +c write (iout,*) "corr loop i",i + i1=i+1 + num_conti=num_cont_hb(i) + num_conti1=num_cont_hb(i+1) + do jj=1,num_conti + j=jcont_hb(jj,i) + jp=iabs(j) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) + jp1=iabs(j1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk +c if (j1.eq.j+1 .or. j1.eq.j-1) then + if ((j.gt.0 .and. j1.gt.0 .or. j.gt.0 .and. j1.lt.0 + & .or. j.lt.0 .and. j1.gt.0) .and. + & (jp1.eq.jp+1 .or. jp1.eq.jp-1)) then +C Contacts I-J and (I+1)-(J+1) or (I+1)-(J-1) occur simultaneously. +C The system gains extra energy. + n_corr=n_corr+1 + sqd1=dsqrt(d_cont(jj,i)) + sqd2=dsqrt(d_cont(kk,i1)) + sred_geom = sqd1*sqd2 + IF (sred_geom.lt.cutoff_corr) THEN + call gcont(sred_geom,r0_corr,1.0D0,delt_corr, + & ekont,fprimcont) +cd write (iout,*) 'i=',i,' j=',jp,' i1=',i1,' j1=',jp1, +cd & ' jj=',jj,' kk=',kk + fac_prim1=0.5d0*sqd2/sqd1*fprimcont + fac_prim2=0.5d0*sqd1/sqd2*fprimcont + do l=1,3 + g_contij(l,1)=fac_prim1*grij_hb_cont(l,jj,i) + g_contij(l,2)=fac_prim2*grij_hb_cont(l,kk,i1) + enddo + n_corr1=n_corr1+1 +cd write (iout,*) 'sred_geom=',sred_geom, +cd & ' ekont=',ekont,' fprim=',fprimcont, +cd & ' fac_prim1',fac_prim1,' fac_prim2',fac_prim2 +cd write (iout,*) "g_contij",g_contij +cd write (iout,*) "grij_hb_cont i",grij_hb_cont(:,jj,i) +cd write (iout,*) "grij_hb_cont i1",grij_hb_cont(:,jj,i1) + call calc_eello(i,jp,i+1,jp1,jj,kk) + if (wcorr4.gt.0.0d0) + & ecorr=ecorr+eello4(i,jp,i+1,jp1,jj,kk) + if (energy_dec.and.wcorr4.gt.0.0d0) + 1 write (iout,'(a6,4i5,0pf7.3)') + 2 'ecorr4',i,j,i+1,j1,eello4(i,jp,i+1,jp1,jj,kk) +c write (iout,*) "gradcorr5 before eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + if (wcorr5.gt.0.0d0) + & ecorr5=ecorr5+eello5(i,jp,i+1,jp1,jj,kk) +c write (iout,*) "gradcorr5 after eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + if (energy_dec.and.wcorr5.gt.0.0d0) + 1 write (iout,'(a6,4i5,0pf7.3)') + 2 'ecorr5',i,j,i+1,j1,eello5(i,jp,i+1,jp1,jj,kk) +cd write(2,*)'wcorr6',wcorr6,' wturn6',wturn6 +cd write(2,*)'ijkl',i,jp,i+1,jp1 + if (wcorr6.gt.0.0d0 .and. (jp.ne.i+4 .or. jp1.ne.i+3 + & .or. wturn6.eq.0.0d0))then +cd write (iout,*) '******ecorr6: i,j,i+1,j1',i,j,i+1,j1 + ecorr6=ecorr6+eello6(i,jp,i+1,jp1,jj,kk) + if (energy_dec) write (iout,'(a6,4i5,0pf7.3)') + 1 'ecorr6',i,j,i+1,j1,eello6(i,jp,i+1,jp1,jj,kk) +cd write (iout,*) 'ecorr',ecorr,' ecorr5=',ecorr5, +cd & 'ecorr6=',ecorr6 +cd write (iout,'(4e15.5)') sred_geom, +cd & dabs(eello4(i,jp,i+1,jp1,jj,kk)), +cd & dabs(eello5(i,jp,i+1,jp1,jj,kk)), +cd & dabs(eello6(i,jp,i+1,jp1,jj,kk)) + else if (wturn6.gt.0.0d0 + & .and. (jp.eq.i+4 .and. jp1.eq.i+3)) then +cd write (iout,*) '******eturn6: i,j,i+1,j1',i,jip,i+1,jp1 + eturn6=eturn6+eello_turn6(i,jj,kk) + if (energy_dec) write (iout,'(a6,4i5,0pf7.3)') + 1 'eturn6',i,j,i+1,j1,eello_turn6(i,jj,kk) +cd write (2,*) 'multibody_eello:eturn6',eturn6 + endif + ENDIF +1111 continue + endif + enddo ! kk + enddo ! jj + enddo ! i + do i=1,nres + num_cont_hb(i)=num_cont_hb_old(i) + enddo +c write (iout,*) "gradcorr5 in eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + return + end +c------------------------------------------------------------------------------ + subroutine add_hb_contact_eello(ii,jj,itask) + implicit real*8 (a-h,o-z) + include "DIMENSIONS" + include "COMMON.IOUNITS" + integer max_cont + integer max_dim + parameter (max_cont=maxconts) + parameter (max_dim=70) + include "COMMON.CONTACTS" + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer i,j,ii,jj,iproc,itask(4),nn +c write (iout,*) "itask",itask + do i=1,2 + iproc=itask(i) + if (iproc.gt.0) then + do j=1,num_cont_hb(ii) + jjc=jcont_hb(j,ii) +c write (iout,*) "send turns i",ii," j",jj," jjc",jjc + if (jjc.eq.jj) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=ii + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=d_cont(j,ii) + ind=3 + do kk=1,3 + ind=ind+1 + zapas(ind,nn,iproc)=grij_hb_cont(kk,j,ii) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj(ll,kk,j,ii) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj_der(mm,ll,kk,jj,j,ii) + enddo + enddo + enddo + enddo + exit + endif + enddo + endif + enddo + return + end +c------------------------------------------------------------------------------ + double precision function ehbcorr(i,j,k,l,jj,kk,coeffp,coeffm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + lprn=.false. + eij=facont_hb(jj,i) + ekl=facont_hb(kk,k) + ees0pij=ees0p(jj,i) + ees0pkl=ees0p(kk,k) + ees0mij=ees0m(jj,i) + ees0mkl=ees0m(kk,k) + ekont=eij*ekl + ees=-(coeffp*ees0pij*ees0pkl+coeffm*ees0mij*ees0mkl) +cd ees=-(coeffp*ees0pkl+coeffm*ees0mkl) +C Following 4 lines for diagnostics. +cd ees0pkl=0.0D0 +cd ees0pij=1.0D0 +cd ees0mkl=0.0D0 +cd ees0mij=1.0D0 +c write (iout,'(2(a,2i3,a,f10.5,a,2f10.5),a,f10.5,a,$)') +c & 'Contacts ',i,j, +c & ' eij',eij,' eesij',ees0pij,ees0mij,' and ',k,l +c & ,' fcont ',ekl,' eeskl',ees0pkl,ees0mkl,' energy=',ekont*ees, +c & 'gradcorr_long' +C Calculate the multi-body contribution to energy. +c ecorr=ecorr+ekont*ees +C Calculate multi-body contributions to the gradient. + coeffpees0pij=coeffp*ees0pij + coeffmees0mij=coeffm*ees0mij + coeffpees0pkl=coeffp*ees0pkl + coeffmees0mkl=coeffm*ees0mkl + do ll=1,3 +cgrad ghalfi=ees*ekl*gacont_hbr(ll,jj,i) + gradcorr(ll,i)=gradcorr(ll,i)!+0.5d0*ghalfi + & -ekont*(coeffpees0pkl*gacontp_hb1(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb1(ll,jj,i)) + gradcorr(ll,j)=gradcorr(ll,j)!+0.5d0*ghalfi + & -ekont*(coeffpees0pkl*gacontp_hb2(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb2(ll,jj,i)) +cgrad ghalfk=ees*eij*gacont_hbr(ll,kk,k) + gradcorr(ll,k)=gradcorr(ll,k)!+0.5d0*ghalfk + & -ekont*(coeffpees0pij*gacontp_hb1(ll,kk,k)+ + & coeffmees0mij*gacontm_hb1(ll,kk,k)) + gradcorr(ll,l)=gradcorr(ll,l)!+0.5d0*ghalfk + & -ekont*(coeffpees0pij*gacontp_hb2(ll,kk,k)+ + & coeffmees0mij*gacontm_hb2(ll,kk,k)) + gradlongij=ees*ekl*gacont_hbr(ll,jj,i)- + & ekont*(coeffpees0pkl*gacontp_hb3(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb3(ll,jj,i)) + gradcorr_long(ll,j)=gradcorr_long(ll,j)+gradlongij + gradcorr_long(ll,i)=gradcorr_long(ll,i)-gradlongij + gradlongkl=ees*eij*gacont_hbr(ll,kk,k)- + & ekont*(coeffpees0pij*gacontp_hb3(ll,kk,k)+ + & coeffmees0mij*gacontm_hb3(ll,kk,k)) + gradcorr_long(ll,l)=gradcorr_long(ll,l)+gradlongkl + gradcorr_long(ll,k)=gradcorr_long(ll,k)-gradlongkl +c write (iout,'(2f10.5,2x,$)') gradlongij,gradlongkl + enddo +c write (iout,*) +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ +cgrad & ees*ekl*gacont_hbr(ll,jj,i)- +cgrad & ekont*(coeffp*ees0pkl*gacontp_hb3(ll,jj,i)+ +cgrad & coeffm*ees0mkl*gacontm_hb3(ll,jj,i)) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ +cgrad & ees*eij*gacont_hbr(ll,kk,k)- +cgrad & ekont*(coeffp*ees0pij*gacontp_hb3(ll,kk,k)+ +cgrad & coeffm*ees0mij*gacontm_hb3(ll,kk,k)) +cgrad enddo +cgrad enddo +c write (iout,*) "ehbcorr",ekont*ees + ehbcorr=ekont*ees + return + end +#ifdef MOMENT +C--------------------------------------------------------------------------- + subroutine dipole(i,j,jj) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + dimension dipi(2,2),dipj(2,2),dipderi(2),dipderj(2),auxvec(2), + & auxmat(2,2) + iti1 = itortyp(itype(i+1)) + if (j.lt.nres-1) then + itj1 = itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + do iii=1,2 + dipi(iii,1)=Ub2(iii,i) + dipderi(iii)=Ub2der(iii,i) + dipi(iii,2)=b1(iii,iti1) + dipj(iii,1)=Ub2(iii,j) + dipderj(iii)=Ub2der(iii,j) + dipj(iii,2)=b1(iii,itj1) + enddo + kkk=0 + do iii=1,2 + call matvec2(a_chuj(1,1,jj,i),dipj(1,iii),auxvec(1)) + do jjj=1,2 + kkk=kkk+1 + dip(kkk,jj,i)=scalar2(dipi(1,jjj),auxvec(1)) + enddo + enddo + do kkk=1,5 + do lll=1,3 + mmm=0 + do iii=1,2 + call matvec2(a_chuj_der(1,1,lll,kkk,jj,i),dipj(1,iii), + & auxvec(1)) + do jjj=1,2 + mmm=mmm+1 + dipderx(lll,kkk,mmm,jj,i)=scalar2(dipi(1,jjj),auxvec(1)) + enddo + enddo + enddo + enddo + call transpose2(a_chuj(1,1,jj,i),auxmat(1,1)) + call matvec2(auxmat(1,1),dipderi(1),auxvec(1)) + do iii=1,2 + dipderg(iii,jj,i)=scalar2(auxvec(1),dipj(1,iii)) + enddo + call matvec2(a_chuj(1,1,jj,i),dipderj(1),auxvec(1)) + do iii=1,2 + dipderg(iii+2,jj,i)=scalar2(auxvec(1),dipi(1,iii)) + enddo + return + end +#endif +C--------------------------------------------------------------------------- + subroutine calc_eello(i,j,k,l,jj,kk) +C +C This subroutine computes matrices and vectors needed to calculate +C the fourth-, fifth-, and sixth-order local-electrostatic terms. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision aa1(2,2),aa2(2,2),aa1t(2,2),aa2t(2,2), + & aa1tder(2,2,3,5),aa2tder(2,2,3,5),auxmat(2,2) + logical lprn + common /kutas/ lprn +cd write (iout,*) 'calc_eello: i=',i,' j=',j,' k=',k,' l=',l, +cd & ' jj=',jj,' kk=',kk +cd if (i.ne.2 .or. j.ne.4 .or. k.ne.3 .or. l.ne.5) return +cd write (iout,*) "a_chujij",((a_chuj(iii,jjj,jj,i),iii=1,2),jjj=1,2) +cd write (iout,*) "a_chujkl",((a_chuj(iii,jjj,kk,k),iii=1,2),jjj=1,2) + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=a_chuj(iii,jjj,jj,i) + aa2(iii,jjj)=a_chuj(iii,jjj,kk,k) + enddo + enddo + call transpose2(aa1(1,1),aa1t(1,1)) + call transpose2(aa2(1,1),aa2t(1,1)) + do kkk=1,5 + do lll=1,3 + call transpose2(a_chuj_der(1,1,lll,kkk,jj,i), + & aa1tder(1,1,lll,kkk)) + call transpose2(a_chuj_der(1,1,lll,kkk,kk,k), + & aa2tder(1,1,lll,kkk)) + enddo + enddo + if (l.eq.j+1) then +C parallel orientation of the two CA-CA-CA frames. + if (i.gt.1) then + iti=itortyp(itype(i)) + else + iti=ntortyp+1 + endif + itk1=itortyp(itype(k+1)) + itj=itortyp(itype(j)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +C A1 kernel(j+1) A2T +cd do iii=1,2 +cd write (iout,'(3f10.5,5x,3f10.5)') +cd & (EUg(iii,jjj,k),jjj=1,2),(EUg(iii,jjj,l),jjj=1,2) +cd enddo + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.false.,EUg(1,1,l),EUgder(1,1,l), + & AEA(1,1,1),AEAderg(1,1,1),AEAderx(1,1,1,1,1,1)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0) THEN + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.false.,EUgC(1,1,l),EUgCder(1,1,l), + & AECA(1,1,1),AECAderg(1,1,1),AECAderx(1,1,1,1,1,1)) + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.false.,Ug2DtEUg(1,1,l), + & Ug2DtEUgder(1,1,1,l),ADtEA(1,1,1),ADtEAderg(1,1,1,1), + & ADtEAderx(1,1,1,1,1,1)) + lprn=.false. + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.false.,DtUg2EUg(1,1,l), + & DtUg2EUgder(1,1,1,l),ADtEA1(1,1,1),ADtEA1derg(1,1,1,1), + & ADtEA1derx(1,1,1,1,1,1)) + ENDIF +C End 6-th order cumulants +cd lprn=.false. +cd if (lprn) then +cd write (2,*) 'In calc_eello6' +cd do iii=1,2 +cd write (2,*) 'iii=',iii +cd do kkk=1,5 +cd write (2,*) 'kkk=',kkk +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & ((ADtEA1derx(jjj,mmm,lll,kkk,iii,1),mmm=1,2),lll=1,3) +cd enddo +cd enddo +cd enddo +cd endif + call transpose2(EUgder(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,1,1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEA(1,1,1)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),EAEAderg(1,1,2,1)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & EAEAderx(1,1,lll,kkk,iii,1)) + enddo + enddo + enddo +C A1T kernel(i+1) A2 + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),1,.false.,EUg(1,1,k),EUgder(1,1,k), + & AEA(1,1,2),AEAderg(1,1,2),AEAderx(1,1,1,1,1,2)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0) THEN + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),1,.false.,EUgC(1,1,k),EUgCder(1,1,k), + & AECA(1,1,2),AECAderg(1,1,2),AECAderx(1,1,1,1,1,2)) + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),2,.false.,Ug2DtEUg(1,1,k), + & Ug2DtEUgder(1,1,1,k),ADtEA(1,1,2),ADtEAderg(1,1,1,2), + & ADtEAderx(1,1,1,1,1,2)) + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),2,.false.,DtUg2EUg(1,1,k), + & DtUg2EUgder(1,1,1,k),ADtEA1(1,1,2),ADtEA1derg(1,1,1,2), + & ADtEA1derx(1,1,1,1,1,2)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,l),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEAderg(1,1,1,2)) + call transpose2(EUg(1,1,l),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEA(1,1,2)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),EAEAderg(1,1,2,2)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & EAEAderx(1,1,lll,kkk,iii,2)) + enddo + enddo + enddo +C AEAb1 and AEAb2 +C Calculate the vectors and their derivatives in virtual-bond dihedral angles. +C They are needed only when the fifth- or the sixth-order cumulants are +C indluded. + IF (wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) THEN + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2(1,1,1)) + call matvec2(auxmat(1,1),Ub2der(1,i),AEAb2derg(1,2,1,1)) + call transpose2(AEAderg(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1derg(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2derg(1,1,1,1)) + call matvec2(AEA(1,1,1),b1(1,itk1),AEAb1(1,2,1)) + call matvec2(AEAderg(1,1,1),b1(1,itk1),AEAb1derg(1,2,1)) + call matvec2(AEA(1,1,1),Ub2(1,k+1),AEAb2(1,2,1)) + call matvec2(AEAderg(1,1,1),Ub2(1,k+1),AEAb2derg(1,1,2,1)) + call matvec2(AEA(1,1,1),Ub2der(1,k+1),AEAb2derg(1,2,2,1)) + call transpose2(AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j),AEAb2(1,1,2)) + call matvec2(auxmat(1,1),Ub2der(1,j),AEAb2derg(1,2,1,2)) + call transpose2(AEAderg(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj),AEAb1derg(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j),AEAb2derg(1,1,1,2)) + call matvec2(AEA(1,1,2),b1(1,itl1),AEAb1(1,2,2)) + call matvec2(AEAderg(1,1,2),b1(1,itl1),AEAb1derg(1,2,2)) + call matvec2(AEA(1,1,2),Ub2(1,l+1),AEAb2(1,2,2)) + call matvec2(AEAderg(1,1,2),Ub2(1,l+1),AEAb2derg(1,1,2,2)) + call matvec2(AEA(1,1,2),Ub2der(1,l+1),AEAb2derg(1,2,2,2)) +C Calculate the Cartesian derivatives of the vectors. + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti), + & AEAb1derx(1,lll,kkk,iii,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i), + & AEAb2derx(1,lll,kkk,iii,1,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & AEAb1derx(1,lll,kkk,iii,2,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),Ub2(1,k+1), + & AEAb2derx(1,lll,kkk,iii,2,1)) + call transpose2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj), + & AEAb1derx(1,lll,kkk,iii,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j), + & AEAb2derx(1,lll,kkk,iii,1,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,itl1), + & AEAb1derx(1,lll,kkk,iii,2,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),Ub2(1,l+1), + & AEAb2derx(1,lll,kkk,iii,2,2)) + enddo + enddo + enddo + ENDIF +C End vectors + else +C Antiparallel orientation of the two CA-CA-CA frames. + if (i.gt.1) then + iti=itortyp(itype(i)) + else + iti=ntortyp+1 + endif + itk1=itortyp(itype(k+1)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif +C A2 kernel(j-1)T A1T + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.true.,EUg(1,1,j),EUgder(1,1,j), + & AEA(1,1,1),AEAderg(1,1,1),AEAderx(1,1,1,1,1,1)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0 .or. (wturn6.gt.0.0d0 .and. + & j.eq.i+4 .and. l.eq.i+3)) THEN + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.true.,EUgC(1,1,j),EUgCder(1,1,j), + & AECA(1,1,1),AECAderg(1,1,1),AECAderx(1,1,1,1,1,1)) + call kernel(aa2(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.true.,Ug2DtEUg(1,1,j), + & Ug2DtEUgder(1,1,1,j),ADtEA(1,1,1),ADtEAderg(1,1,1,1), + & ADtEAderx(1,1,1,1,1,1)) + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.true.,DtUg2EUg(1,1,j), + & DtUg2EUgder(1,1,1,j),ADtEA1(1,1,1),ADtEA1derg(1,1,1,1), + & ADtEA1derx(1,1,1,1,1,1)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,1,1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEA(1,1,1)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),EAEAderg(1,1,2,1)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & EAEAderx(1,1,lll,kkk,iii,1)) + enddo + enddo + enddo +C A2T kernel(i+1)T A1 + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),1,.true.,EUg(1,1,k),EUgder(1,1,k), + & AEA(1,1,2),AEAderg(1,1,2),AEAderx(1,1,1,1,1,2)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0 .or. (wturn6.gt.0.0d0 .and. + & j.eq.i+4 .and. l.eq.i+3)) THEN + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),1,.true.,EUgC(1,1,k),EUgCder(1,1,k), + & AECA(1,1,2),AECAderg(1,1,2),AECAderx(1,1,1,1,1,2)) + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),2,.true.,Ug2DtEUg(1,1,k), + & Ug2DtEUgder(1,1,1,k),ADtEA(1,1,2),ADtEAderg(1,1,1,2), + & ADtEAderx(1,1,1,1,1,2)) + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),2,.true.,DtUg2EUg(1,1,k), + & DtUg2EUgder(1,1,1,k),ADtEA1(1,1,2),ADtEA1derg(1,1,1,2), + & ADtEA1derx(1,1,1,1,1,2)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,j),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,2,2)) + call transpose2(EUg(1,1,j),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEA(1,1,2)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),EAEAderg(1,1,2,2)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & EAEAderx(1,1,lll,kkk,iii,2)) + enddo + enddo + enddo +C AEAb1 and AEAb2 +C Calculate the vectors and their derivatives in virtual-bond dihedral angles. +C They are needed only when the fifth- or the sixth-order cumulants are +C indluded. + IF (wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 .or. + & (wturn6.gt.0.0d0 .and. j.eq.i+4 .and. l.eq.i+3)) THEN + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2(1,1,1)) + call matvec2(auxmat(1,1),Ub2der(1,i),AEAb2derg(1,2,1,1)) + call transpose2(AEAderg(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1derg(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2derg(1,1,1,1)) + call matvec2(AEA(1,1,1),b1(1,itk1),AEAb1(1,2,1)) + call matvec2(AEAderg(1,1,1),b1(1,itk1),AEAb1derg(1,2,1)) + call matvec2(AEA(1,1,1),Ub2(1,k+1),AEAb2(1,2,1)) + call matvec2(AEAderg(1,1,1),Ub2(1,k+1),AEAb2derg(1,1,2,1)) + call matvec2(AEA(1,1,1),Ub2der(1,k+1),AEAb2derg(1,2,2,1)) + call transpose2(AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj1),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l),AEAb2(1,1,2)) + call matvec2(auxmat(1,1),Ub2der(1,l),AEAb2derg(1,2,1,2)) + call transpose2(AEAderg(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itl),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l),AEAb2derg(1,1,1,2)) + call matvec2(AEA(1,1,2),b1(1,itj1),AEAb1(1,2,2)) + call matvec2(AEAderg(1,1,2),b1(1,itj1),AEAb1derg(1,2,2)) + call matvec2(AEA(1,1,2),Ub2(1,j),AEAb2(1,2,2)) + call matvec2(AEAderg(1,1,2),Ub2(1,j),AEAb2derg(1,1,2,2)) + call matvec2(AEA(1,1,2),Ub2der(1,j),AEAb2derg(1,2,2,2)) +C Calculate the Cartesian derivatives of the vectors. + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti), + & AEAb1derx(1,lll,kkk,iii,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i), + & AEAb2derx(1,lll,kkk,iii,1,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & AEAb1derx(1,lll,kkk,iii,2,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),Ub2(1,k+1), + & AEAb2derx(1,lll,kkk,iii,2,1)) + call transpose2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itl), + & AEAb1derx(1,lll,kkk,iii,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l), + & AEAb2derx(1,lll,kkk,iii,1,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,itj1), + & AEAb1derx(1,lll,kkk,iii,2,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),Ub2(1,j), + & AEAb2derx(1,lll,kkk,iii,2,2)) + enddo + enddo + enddo + ENDIF +C End vectors + endif + return + end +C--------------------------------------------------------------------------- + subroutine kernel(aa1,aa2t,aa1derx,aa2tderx,nderg,transp, + & KK,KKderg,AKA,AKAderg,AKAderx) + implicit none + integer nderg + logical transp + double precision aa1(2,2),aa2t(2,2),aa1derx(2,2,3,5), + & aa2tderx(2,2,3,5),KK(2,2),KKderg(2,2,nderg),AKA(2,2), + & AKAderg(2,2,nderg),AKAderx(2,2,3,5,2) + integer iii,kkk,lll + integer jjj,mmm + logical lprn + common /kutas/ lprn + call prodmat3(aa1(1,1),aa2t(1,1),KK(1,1),transp,AKA(1,1)) + do iii=1,nderg + call prodmat3(aa1(1,1),aa2t(1,1),KKderg(1,1,iii),transp, + & AKAderg(1,1,iii)) + enddo +cd if (lprn) write (2,*) 'In kernel' + do kkk=1,5 +cd if (lprn) write (2,*) 'kkk=',kkk + do lll=1,3 + call prodmat3(aa1derx(1,1,lll,kkk),aa2t(1,1), + & KK(1,1),transp,AKAderx(1,1,lll,kkk,1)) +cd if (lprn) then +cd write (2,*) 'lll=',lll +cd write (2,*) 'iii=1' +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & (AKAderx(jjj,mmm,lll,kkk,1),mmm=1,2) +cd enddo +cd endif + call prodmat3(aa1(1,1),aa2tderx(1,1,lll,kkk), + & KK(1,1),transp,AKAderx(1,1,lll,kkk,2)) +cd if (lprn) then +cd write (2,*) 'lll=',lll +cd write (2,*) 'iii=2' +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & (AKAderx(jjj,mmm,lll,kkk,2),mmm=1,2) +cd enddo +cd endif + enddo + enddo + return + end +C--------------------------------------------------------------------------- + double precision function eello4(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision pizda(2,2),ggg1(3),ggg2(3) +cd if (i.ne.1 .or. j.ne.5 .or. k.ne.2 .or.l.ne.4) then +cd eello4=0.0d0 +cd return +cd endif +cd print *,'eello4:',i,j,k,l,jj,kk +cd write (2,*) 'i',i,' j',j,' k',k,' l',l +cd call checkint4(i,j,k,l,jj,kk,eel4_num) +cold eij=facont_hb(jj,i) +cold ekl=facont_hb(kk,k) +cold ekont=eij*ekl + eel4=-EAEA(1,1,1)-EAEA(2,2,1) +cd eel41=-EAEA(1,1,2)-EAEA(2,2,2) + gcorr_loc(k-1)=gcorr_loc(k-1) + & -ekont*(EAEAderg(1,1,1,1)+EAEAderg(2,2,1,1)) + if (l.eq.j+1) then + gcorr_loc(l-1)=gcorr_loc(l-1) + & -ekont*(EAEAderg(1,1,2,1)+EAEAderg(2,2,2,1)) + else + gcorr_loc(j-1)=gcorr_loc(j-1) + & -ekont*(EAEAderg(1,1,2,1)+EAEAderg(2,2,2,1)) + endif + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=-EAEAderx(1,1,lll,kkk,iii,1) + & -EAEAderx(2,2,lll,kkk,iii,1) +cd derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd gcorr_loc(l-1)=0.0d0 +cd gcorr_loc(j-1)=0.0d0 +cd gcorr_loc(k-1)=0.0d0 +cd eel4=1.0d0 +cd write (iout,*)'Contacts have occurred for peptide groups', +cd & i,j,' fcont:',eij,' eij',' and ',k,l, +cd & ' fcont ',ekl,' eel4=',eel4,' eel4_num',16*eel4_num + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel4*g_contij(ll,1) +cgrad ggg2(ll)=eel4*g_contij(ll,2) + glongij=eel4*g_contij(ll,1)+ekont*derx(ll,1,1) + glongkl=eel4*g_contij(ll,2)+ekont*derx(ll,1,2) +cgrad ghalf=0.5d0*ggg1(ll) + gradcorr(ll,i)=gradcorr(ll,i)+ekont*derx(ll,2,1) + gradcorr(ll,i+1)=gradcorr(ll,i+1)+ekont*derx(ll,3,1) + gradcorr(ll,j)=gradcorr(ll,j)+ekont*derx(ll,4,1) + gradcorr(ll,j1)=gradcorr(ll,j1)+ekont*derx(ll,5,1) + gradcorr_long(ll,j)=gradcorr_long(ll,j)+glongij + gradcorr_long(ll,i)=gradcorr_long(ll,i)-glongij +cgrad ghalf=0.5d0*ggg2(ll) + gradcorr(ll,k)=gradcorr(ll,k)+ekont*derx(ll,2,2) + gradcorr(ll,k+1)=gradcorr(ll,k+1)+ekont*derx(ll,3,2) + gradcorr(ll,l)=gradcorr(ll,l)+ekont*derx(ll,4,2) + gradcorr(ll,l1)=gradcorr(ll,l1)+ekont*derx(ll,5,2) + gradcorr_long(ll,l)=gradcorr_long(ll,l)+glongkl + gradcorr_long(ll,k)=gradcorr_long(ll,k)-glongkl + enddo +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,gcorr_loc(iii) +cd enddo + eello4=ekont*eel4 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello4',ekont*eel4 + return + end +C--------------------------------------------------------------------------- + double precision function eello5(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision pizda(2,2),auxmat(2,2),auxmat1(2,2),vv(2) + double precision ggg1(3),ggg2(3) +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel chains C +C C +C o o o o C +C /l\ / \ \ / \ / \ / C +C / \ / \ \ / \ / \ / C +C j| o |l1 | o | o| o | | o |o C +C \ |/k\| |/ \| / |/ \| |/ \| C +C \i/ \ / \ / / \ / \ C +C o k1 o C +C (I) (II) (III) (IV) C +C C +C eello5_1 eello5_2 eello5_3 eello5_4 C +C C +C Antiparallel chains C +C C +C o o o o C +C /j\ / \ \ / \ / \ / C +C / \ / \ \ / \ / \ / C +C j1| o |l | o | o| o | | o |o C +C \ |/k\| |/ \| / |/ \| |/ \| C +C \i/ \ / \ / / \ / \ C +C o k1 o C +C (I) (II) (III) (IV) C +C C +C eello5_1 eello5_2 eello5_3 eello5_4 C +C C +C o denotes a local interaction, vertical lines an electrostatic interaction. C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd if (i.ne.2 .or. j.ne.6 .or. k.ne.3 .or. l.ne.5) then +cd eello5=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO5: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l + itk=itortyp(itype(k)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) + eello5_1=0.0d0 + eello5_2=0.0d0 + eello5_3=0.0d0 + eello5_4=0.0d0 +cd call checkint5(i,j,k,l,jj,kk,eel5_1_num,eel5_2_num, +cd & eel5_3_num,eel5_4_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=facont_hb(jj,i) +cd ekl=facont_hb(kk,k) +cd ekont=eij*ekl +cd write (iout,*)'Contacts have occurred for peptide groups', +cd & i,j,' fcont:',eij,' eij',' and ',k,l +cd goto 1111 +C Contribution from the graph I. +cd write (2,*) 'AEA ',AEA(1,1,1),AEA(2,1,1),AEA(1,2,1),AEA(2,2,1) +cd write (2,*) 'AEAb2',AEAb2(1,1,1),AEAb2(2,1,1) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_1=scalar2(AEAb2(1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i)) +C Explicit gradient in virtual-dihedral angles. + if (i.gt.1) g_corr5_loc(i-1)=g_corr5_loc(i-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,i))) + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(AEA(1,1,1),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2(1,1,1),Ub2der(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + call matmat2(AEAderg(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + if (l.eq.j+1) then + if (l.lt.nres-1) g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + else + if (j.lt.nres-1) g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + endif +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i)) + enddo + enddo + enddo +c goto 1112 +c1111 continue +C Contribution from graph II + call transpose2(EE(1,1,itk),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_2=scalar2(AEAb1(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,k)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + if (l.eq.j+1) then + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k))) + else + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k))) + endif +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k)) + enddo + enddo + enddo +cd goto 1112 +cd1111 continue + if (l.eq.j+1) then +cd goto 1110 +C Parallel orientation +C Contribution from graph III + call transpose2(EUg(1,1,l),auxmat(1,1)) + call matmat2(AEA(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_3=scalar2(AEAb2(1,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,j))) + call matmat2(AEAderg(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j))) + call transpose2(EUgder(1,1,l),auxmat1(1,1)) + call matmat2(AEA(1,1,2),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2(1,1,2),Ub2der(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j)) + enddo + enddo + enddo +cd goto 1112 +C Contribution from graph IV +cd1110 continue + call transpose2(EE(1,1,itl),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_4=scalar2(AEAb1(1,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,l)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l)) + enddo + enddo + enddo + else +C Antiparallel orientation +C Contribution from graph III +c goto 1110 + call transpose2(EUg(1,1,j),auxmat(1,1)) + call matmat2(AEA(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_3=scalar2(AEAb2(1,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,l))) + call matmat2(AEAderg(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l))) + call transpose2(EUgder(1,1,j),auxmat1(1,1)) + call matmat2(AEA(1,1,2),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2(1,1,2),Ub2der(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l)) + enddo + enddo + enddo +cd goto 1112 +C Contribution from graph IV +1110 continue + call transpose2(EE(1,1,itj),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_4=scalar2(AEAb1(1,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,j)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j)) + enddo + enddo + enddo + endif +1112 continue + eel5=eello5_1+eello5_2+eello5_3+eello5_4 +cd if (i.eq.2 .and. j.eq.8 .and. k.eq.3 .and. l.eq.7) then +cd write (2,*) 'ijkl',i,j,k,l +cd write (2,*) 'eello5_1',eello5_1,' eello5_2',eello5_2, +cd & ' eello5_3',eello5_3,' eello5_4',eello5_4 +cd endif +cd write(iout,*) 'eello5_1',eello5_1,' eel5_1_num',16*eel5_1_num +cd write(iout,*) 'eello5_2',eello5_2,' eel5_2_num',16*eel5_2_num +cd write(iout,*) 'eello5_3',eello5_3,' eel5_3_num',16*eel5_3_num +cd write(iout,*) 'eello5_4',eello5_4,' eel5_4_num',16*eel5_4_num + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 +cd write (2,*) 'eij',eij,' ekl',ekl,' ekont',ekont +C 2/11/08 AL Gradients over DC's connecting interacting sites will be +C summed up outside the subrouine as for the other subroutines +C handling long-range interactions. The old code is commented out +C with "cgrad" to keep track of changes. + do ll=1,3 +cgrad ggg1(ll)=eel5*g_contij(ll,1) +cgrad ggg2(ll)=eel5*g_contij(ll,2) + gradcorr5ij=eel5*g_contij(ll,1)+ekont*derx(ll,1,1) + gradcorr5kl=eel5*g_contij(ll,2)+ekont*derx(ll,1,2) +c write (iout,'(a,3i3,a,5f8.3,2i3,a,5f8.3,a,f8.3)') +c & "ecorr5",ll,i,j," derx",derx(ll,2,1),derx(ll,3,1),derx(ll,4,1), +c & derx(ll,5,1),k,l," derx",derx(ll,2,2),derx(ll,3,2), +c & derx(ll,4,2),derx(ll,5,2)," ekont",ekont +c write (iout,'(a,3i3,a,3f8.3,2i3,a,3f8.3)') +c & "ecorr5",ll,i,j," gradcorr5",g_contij(ll,1),derx(ll,1,1), +c & gradcorr5ij, +c & k,l," gradcorr5",g_contij(ll,2),derx(ll,1,2),gradcorr5kl +cold ghalf=0.5d0*eel5*ekl*gacont_hbr(ll,jj,i) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr5(ll,i)=gradcorr5(ll,i)+ekont*derx(ll,2,1) + gradcorr5(ll,i+1)=gradcorr5(ll,i+1)+ekont*derx(ll,3,1) + gradcorr5(ll,j)=gradcorr5(ll,j)+ekont*derx(ll,4,1) + gradcorr5(ll,j1)=gradcorr5(ll,j1)+ekont*derx(ll,5,1) + gradcorr5_long(ll,j)=gradcorr5_long(ll,j)+gradcorr5ij + gradcorr5_long(ll,i)=gradcorr5_long(ll,i)-gradcorr5ij +cold ghalf=0.5d0*eel5*eij*gacont_hbr(ll,kk,k) +cgrad ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gradcorr5(ll,k)=gradcorr5(ll,k)+ghalf+ekont*derx(ll,2,2) + gradcorr5(ll,k+1)=gradcorr5(ll,k+1)+ekont*derx(ll,3,2) + gradcorr5(ll,l)=gradcorr5(ll,l)+ghalf+ekont*derx(ll,4,2) + gradcorr5(ll,l1)=gradcorr5(ll,l1)+ekont*derx(ll,5,2) + gradcorr5_long(ll,l)=gradcorr5_long(ll,l)+gradcorr5kl + gradcorr5_long(ll,k)=gradcorr5_long(ll,k)-gradcorr5kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*ekl*gacont_hbr(ll,jj,i) +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*eij*gacont_hbr(ll,kk,k) +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +c1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr5_loc(iii) +cd enddo + eello5=ekont*eel5 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello5',ekont*eel5 + return + end +c-------------------------------------------------------------------------- + double precision function eello6(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision ggg1(3),ggg2(3) +cd if (i.ne.1 .or. j.ne.3 .or. k.ne.2 .or. l.ne.4) then +cd eello6=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO6: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l + eello6_1=0.0d0 + eello6_2=0.0d0 + eello6_3=0.0d0 + eello6_4=0.0d0 + eello6_5=0.0d0 + eello6_6=0.0d0 +cd call checkint6(i,j,k,l,jj,kk,eel6_1_num,eel6_2_num, +cd & eel6_3_num,eel6_4_num,eel6_5_num,eel6_6_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=facont_hb(jj,i) +cd ekl=facont_hb(kk,k) +cd ekont=eij*ekl +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 + if (l.eq.j+1) then + eello6_1=eello6_graph1(i,j,k,l,1,.false.) + eello6_2=eello6_graph1(j,i,l,k,2,.false.) + eello6_3=eello6_graph2(i,j,k,l,jj,kk,.false.) + eello6_4=eello6_graph4(i,j,k,l,jj,kk,1,.false.) + eello6_5=eello6_graph4(j,i,l,k,jj,kk,2,.false.) + eello6_6=eello6_graph3(i,j,k,l,jj,kk,.false.) + else + eello6_1=eello6_graph1(i,j,k,l,1,.false.) + eello6_2=eello6_graph1(l,k,j,i,2,.true.) + eello6_3=eello6_graph2(i,l,k,j,jj,kk,.true.) + eello6_4=eello6_graph4(i,j,k,l,jj,kk,1,.false.) + if (wturn6.eq.0.0d0 .or. j.ne.i+4) then + eello6_5=eello6_graph4(l,k,j,i,kk,jj,2,.true.) + else + eello6_5=0.0d0 + endif + eello6_6=eello6_graph3(i,l,k,j,jj,kk,.true.) + endif +C If turn contributions are considered, they will be handled separately. + eel6=eello6_1+eello6_2+eello6_3+eello6_4+eello6_5+eello6_6 +cd write(iout,*) 'eello6_1',eello6_1!,' eel6_1_num',16*eel6_1_num +cd write(iout,*) 'eello6_2',eello6_2!,' eel6_2_num',16*eel6_2_num +cd write(iout,*) 'eello6_3',eello6_3!,' eel6_3_num',16*eel6_3_num +cd write(iout,*) 'eello6_4',eello6_4!,' eel6_4_num',16*eel6_4_num +cd write(iout,*) 'eello6_5',eello6_5!,' eel6_5_num',16*eel6_5_num +cd write(iout,*) 'eello6_6',eello6_6!,' eel6_6_num',16*eel6_6_num +cd goto 1112 + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel6*g_contij(ll,1) +cgrad ggg2(ll)=eel6*g_contij(ll,2) +cold ghalf=0.5d0*eel6*ekl*gacont_hbr(ll,jj,i) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr6ij=eel6*g_contij(ll,1)+ekont*derx(ll,1,1) + gradcorr6kl=eel6*g_contij(ll,2)+ekont*derx(ll,1,2) + gradcorr6(ll,i)=gradcorr6(ll,i)+ekont*derx(ll,2,1) + gradcorr6(ll,i+1)=gradcorr6(ll,i+1)+ekont*derx(ll,3,1) + gradcorr6(ll,j)=gradcorr6(ll,j)+ekont*derx(ll,4,1) + gradcorr6(ll,j1)=gradcorr6(ll,j1)+ekont*derx(ll,5,1) + gradcorr6_long(ll,j)=gradcorr6_long(ll,j)+gradcorr6ij + gradcorr6_long(ll,i)=gradcorr6_long(ll,i)-gradcorr6ij +cgrad ghalf=0.5d0*ggg2(ll) +cold ghalf=0.5d0*eel6*eij*gacont_hbr(ll,kk,k) +cd ghalf=0.0d0 + gradcorr6(ll,k)=gradcorr6(ll,k)+ekont*derx(ll,2,2) + gradcorr6(ll,k+1)=gradcorr6(ll,k+1)+ekont*derx(ll,3,2) + gradcorr6(ll,l)=gradcorr6(ll,l)+ekont*derx(ll,4,2) + gradcorr6(ll,l1)=gradcorr6(ll,l1)+ekont*derx(ll,5,2) + gradcorr6_long(ll,l)=gradcorr6_long(ll,l)+gradcorr6kl + gradcorr6_long(ll,k)=gradcorr6_long(ll,k)-gradcorr6kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*ekl*gacont_hbr(ll,jj,i) +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*eij*gacont_hbr(ll,kk,k) +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + eello6=ekont*eel6 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello6',ekont*eel6 + return + end +c-------------------------------------------------------------------------- + double precision function eello6_graph1(i,j,k,l,imat,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vv(2),vv1(2),pizda(2,2),auxmat(2,2),pizda1(2,2) + logical swap + logical lprn + common /kutas/ lprn +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel Antiparallel C +C C +C o o C +C /l\ /j\ C +C / \ / \ C +C /| o | | o |\ C +C \ j|/k\| / \ |/k\|l / C +C \ / \ / \ / \ / C +C o o o o C +C i i C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + itk=itortyp(itype(k)) + s1= scalar2(AEAb1(1,2,imat),CUgb2(1,i)) + s2=-scalar2(AEAb2(1,1,imat),Ug2Db1t(1,k)) + s3= scalar2(AEAb2(1,1,imat),CUgb2(1,k)) + call transpose2(EUgC(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + s4=0.5d0*scalar2(vv1(1),Dtobr2(1,i)) + vv(1)=AEAb1(1,2,imat)*b1(1,itk)-AEAb1(2,2,imat)*b1(2,itk) + vv(2)=AEAb1(1,2,imat)*b1(2,itk)+AEAb1(2,2,imat)*b1(1,itk) + s5=scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4', s4,' s5',s5 + eello6_graph1=-0.5d0*(s1+s2+s3+s4+s5) + if (i.gt.1) g_corr6_loc(i-1)=g_corr6_loc(i-1) + & -0.5d0*ekont*(scalar2(AEAb1(1,2,imat),CUgb2der(1,i)) + & -scalar2(AEAb2derg(1,2,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,2,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2der(1,i)) + & +scalar2(vv(1),Dtobr2der(1,i))) + call matmat2(AEAderg(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + vv(1)=AEAb1derg(1,2,imat)*b1(1,itk)-AEAb1derg(2,2,imat)*b1(2,itk) + vv(2)=AEAb1derg(1,2,imat)*b1(2,itk)+AEAb1derg(2,2,imat)*b1(1,itk) + if (l.eq.j+1) then + g_corr6_loc(l-1)=g_corr6_loc(l-1) + & +ekont*(-0.5d0*(scalar2(AEAb1derg(1,2,imat),CUgb2(1,i)) + & -scalar2(AEAb2derg(1,1,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,1,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i))+scalar2(vv(1),Dtobr2(1,i)))) + else + g_corr6_loc(j-1)=g_corr6_loc(j-1) + & +ekont*(-0.5d0*(scalar2(AEAb1derg(1,2,imat),CUgb2(1,i)) + & -scalar2(AEAb2derg(1,1,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,1,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i))+scalar2(vv(1),Dtobr2(1,i)))) + endif + call transpose2(EUgCder(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + if (k.gt.1) g_corr6_loc(k-1)=g_corr6_loc(k-1) + & +ekont*(-0.5d0*(-scalar2(AEAb2(1,1,imat),Ug2Db1tder(1,k)) + & +scalar2(AEAb2(1,1,imat),CUgb2der(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i)))) + do iii=1,2 + if (swap) then + ind=3-iii + else + ind=iii + endif + do kkk=1,5 + do lll=1,3 + s1= scalar2(AEAb1derx(1,lll,kkk,iii,2,imat),CUgb2(1,i)) + s2=-scalar2(AEAb2derx(1,lll,kkk,iii,1,imat),Ug2Db1t(1,k)) + s3= scalar2(AEAb2derx(1,lll,kkk,iii,1,imat),CUgb2(1,k)) + call transpose2(EUgC(1,1,k),auxmat(1,1)) + call matmat2(AEAderx(1,1,lll,kkk,iii,imat),auxmat(1,1), + & pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + s4=0.5d0*scalar2(vv1(1),Dtobr2(1,i)) + vv(1)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(1,itk) + & -AEAb1derx(2,lll,kkk,iii,2,imat)*b1(2,itk) + vv(2)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(2,itk) + & +AEAb1derx(2,lll,kkk,iii,2,imat)*b1(1,itk) + s5=scalar2(vv(1),Dtobr2(1,i)) + derx(lll,kkk,ind)=derx(lll,kkk,ind)-0.5d0*(s1+s2+s3+s4+s5) + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello6_graph2(i,j,k,l,jj,kk,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + logical swap + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2), + & auxvec1(2),auxvec2(1),auxmat1(2,2) + logical lprn + common /kutas/ lprn +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel Antiparallel C +C C +C o o C +C \ /l\ /j\ / C +C \ / \ / \ / C +C o| o | | o |o C +C \ j|/k\| \ |/k\|l C +C \ / \ \ / \ C +C o o C +C i i C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd write (2,*) 'eello6_graph2: i,',i,' j',j,' k',k,' l',l +C AL 7/4/01 s1 would occur in the sixth-order moment, +C but not in a cluster cumulant +#ifdef MOMENT + s1=dip(1,jj,i)*dip(1,kk,k) +#endif + call matvec2(ADtEA1(1,1,1),Ub2(1,k),auxvec(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matvec2(ADtEA(1,1,2),Ub2(1,l),auxvec1(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec1(1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(ADtEA1(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 'eello6_graph2:','s1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + eello6_graph2=-(s1+s2+s3+s4) +#else + eello6_graph2=-(s2+s3+s4) +#endif +c eello6_graph2=-s3 +C Derivatives in gamma(i-1) + if (i.gt.1) then +#ifdef MOMENT + s1=dipderg(1,jj,i)*dip(1,kk,k) +#endif + s2=-0.5d0*scalar2(Ub2der(1,i),auxvec(1)) + call matvec2(ADtEAderg(1,1,1,2),Ub2(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + s4=-0.25d0*scalar2(vv(1),Dtobr2der(1,i)) +#ifdef MOMENT + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s2+s3+s4) +#endif +c g_corr6_loc(i-1)=g_corr6_loc(i-1)-s3 + endif +C Derivatives in gamma(k-1) +#ifdef MOMENT + s1=dip(1,jj,i)*dipderg(1,kk,k) +#endif + call matvec2(ADtEA1(1,1,1),Ub2der(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + call matvec2(ADtEAderg(1,1,2,2),Ub2(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(ADtEA1(1,1,1),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s2+s3+s4) +#endif +c g_corr6_loc(k-1)=g_corr6_loc(k-1)-s3 +C Derivatives in gamma(j-1) or gamma(l-1) + if (j.gt.1) then +#ifdef MOMENT + s1=dipderg(3,jj,i)*dip(1,kk,k) +#endif + call matvec2(ADtEA1derg(1,1,1,1),Ub2(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2der(1,j),auxvec1(1)) + call matmat2(ADtEA1derg(1,1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + if (swap) then + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*s1 + else + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*s1 + endif +#endif + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*(s2+s3+s4) +c g_corr6_loc(j-1)=g_corr6_loc(j-1)-s3 + endif +C Derivatives in gamma(l-1) or gamma(j-1) + if (l.gt.1) then +#ifdef MOMENT + s1=dip(1,jj,i)*dipderg(3,kk,k) +#endif + call matvec2(ADtEA1derg(1,1,2,1),Ub2(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + call matvec2(ADtEA(1,1,2),Ub2der(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + call matmat2(ADtEA1derg(1,1,2,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + if (swap) then + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*s1 + else + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*s1 + endif +#endif + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s3+s4) +c g_corr6_loc(l-1)=g_corr6_loc(l-1)-s3 + endif +C Cartesian derivatives. + if (lprn) then + write (2,*) 'In eello6_graph2' + do iii=1,2 + write (2,*) 'iii=',iii + do kkk=1,5 + write (2,*) 'kkk=',kkk + do jjj=1,2 + write (2,'(3(2f10.5),5x)') + & ((ADtEA1derx(jjj,mmm,lll,kkk,iii,1),mmm=1,2),lll=1,3) + enddo + enddo + enddo + endif + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + s1=dipderx(lll,kkk,1,jj,i)*dip(1,kk,k) + else + s1=dip(1,jj,i)*dipderx(lll,kkk,1,kk,k) + endif +#endif + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,1),Ub2(1,k), + & auxvec(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matvec2(ADtEAderx(1,1,lll,kkk,iii,2),Ub2(1,l), + & auxvec(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec(1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(ADtEA1derx(1,1,lll,kkk,iii,1),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (swap) then + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello6_graph3(i,j,k,l,jj,kk,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2) + logical swap +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel Antiparallel C +C C +C o o C +C /l\ / \ /j\ C +C / \ / \ / \ C +C /| o |o o| o |\ C +C j|/k\| / |/k\|l / C +C / \ / / \ / C +C / o / o C +C i i C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C 4/7/01 AL Component s1 was removed, because it pertains to the respective +C energy moment and not to the cluster cumulant. + iti=itortyp(itype(i)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + itk=itortyp(itype(k)) + itk1=itortyp(itype(k+1)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +#ifdef MOMENT + s1=dip(4,jj,i)*dip(4,kk,k) +#endif + call matvec2(AECA(1,1,1),b1(1,itk1),auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matvec2(AECA(1,1,2),b1(1,itl1),auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + call transpose2(EE(1,1,itk),auxmat(1,1)) + call matmat2(auxmat(1,1),AECA(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) +cd write (2,*) 'eello6_graph3:','s1',s1,' s2',s2,' s3',s3,' s4',s4, +cd & "sum",-(s2+s3+s4) +#ifdef MOMENT + eello6_graph3=-(s1+s2+s3+s4) +#else + eello6_graph3=-(s2+s3+s4) +#endif +c eello6_graph3=-s4 +C Derivatives in gamma(k-1) + call matvec2(AECAderg(1,1,2),b1(1,itl1),auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + s4=-0.25d0*scalar2(vv(1),Ctobrder(1,k)) + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s3+s4) +C Derivatives in gamma(l-1) + call matvec2(AECAderg(1,1,1),b1(1,itk1),auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matmat2(auxmat(1,1),AECAderg(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s4) +C Cartesian derivatives. + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + s1=dipderx(lll,kkk,4,jj,i)*dip(4,kk,k) + else + s1=dip(4,jj,i)*dipderx(lll,kkk,4,kk,k) + endif +#endif + call matvec2(AECAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matvec2(AECAderx(1,1,lll,kkk,iii,2),b1(1,itl1), + & auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + call matmat2(auxmat(1,1),AECAderx(1,1,lll,kkk,iii,1), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (swap) then + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif +c derx(lll,kkk,iii)=derx(lll,kkk,iii)-s4 + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello6_graph4(i,j,k,l,jj,kk,imat,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2), + & auxvec1(2),auxmat1(2,2) + logical swap +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel Antiparallel C +C C +C o o C +C /l\ / \ /j\ C +C / \ / \ / \ C +C /| o |o o| o |\ C +C \ j|/k\| \ |/k\|l C +C \ / \ \ / \ C +C o \ o \ C +C i i C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C 4/7/01 AL Component s1 was removed, because it pertains to the respective +C energy moment and not to the cluster cumulant. +cd write (2,*) 'eello_graph4: wturn6',wturn6 + iti=itortyp(itype(i)) + itj=itortyp(itype(j)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + itk=itortyp(itype(k)) + if (k.lt.nres-1) then + itk1=itortyp(itype(k+1)) + else + itk1=ntortyp+1 + endif + itl=itortyp(itype(l)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +cd write (2,*) 'eello6_graph4:','i',i,' j',j,' k',k,' l',l +cd write (2,*) 'iti',iti,' itj',itj,' itj1',itj1,' itk',itk, +cd & ' itl',itl,' itl1',itl1 +#ifdef MOMENT + if (imat.eq.1) then + s1=dip(3,jj,i)*dip(3,kk,k) + else + s1=dip(2,jj,j)*dip(2,kk,l) + endif +#endif + call matvec2(AECA(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1(1,1,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1(1,1,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(AECA(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 'eello6_graph4:','s1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + eello6_graph4=-(s1+s2+s3+s4) +#else + eello6_graph4=-(s2+s3+s4) +#endif +C Derivatives in gamma(i-1) + if (i.gt.1) then +#ifdef MOMENT + if (imat.eq.1) then + s1=dipderg(2,jj,i)*dip(3,kk,k) + else + s1=dipderg(4,jj,j)*dip(2,kk,l) + endif +#endif + s2=0.5d0*scalar2(Ub2der(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + s4=0.25d0*scalar2(vv(1),Dtobr2der(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +cd write (2,*) 'turn6 derivatives' +#ifdef MOMENT + gel_loc_turn6(i-1)=gel_loc_turn6(i-1)-ekont*(s1+s2+s3+s4) +#else + gel_loc_turn6(i-1)=gel_loc_turn6(i-1)-ekont*(s2+s3+s4) +#endif + else +#ifdef MOMENT + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s2+s3+s4) +#endif + endif + endif +C Derivatives in gamma(k-1) +#ifdef MOMENT + if (imat.eq.1) then + s1=dip(3,jj,i)*dipderg(2,kk,k) + else + s1=dip(2,jj,j)*dipderg(4,kk,l) + endif +#endif + call matvec2(AECA(1,1,imat),Ub2der(1,k),auxvec1(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec1(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(AECA(1,1,imat),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +#ifdef MOMENT + gel_loc_turn6(k-1)=gel_loc_turn6(k-1)-ekont*(s1+s2+s3+s4) +#else + gel_loc_turn6(k-1)=gel_loc_turn6(k-1)-ekont*(s2+s3+s4) +#endif + else +#ifdef MOMENT + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s2+s3+s4) +#endif + endif +C Derivatives in gamma(j-1) or gamma(l-1) + if (l.eq.j+1 .and. l.gt.1) then + call matvec2(AECAderg(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matmat2(AECAderg(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s4) + else if (j.gt.1) then + call matvec2(AECAderg(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matmat2(AECAderg(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then + gel_loc_turn6(j-1)=gel_loc_turn6(j-1)-ekont*(s2+s4) + else + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*(s2+s4) + endif + endif +C Cartesian derivatives. + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + if (imat.eq.1) then + s1=dipderx(lll,kkk,3,jj,i)*dip(3,kk,k) + else + s1=dipderx(lll,kkk,2,jj,j)*dip(2,kk,l) + endif + else + if (imat.eq.1) then + s1=dip(3,jj,i)*dipderx(lll,kkk,3,kk,k) + else + s1=dip(2,jj,j)*dipderx(lll,kkk,2,kk,l) + endif + endif +#endif + call matvec2(AECAderx(1,1,lll,kkk,iii,imat),Ub2(1,k), + & auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat), + & b1(1,itj1),auxvec(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec(1)) + else + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat), + & b1(1,itl1),auxvec(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec(1)) + endif + call matmat2(AECAderx(1,1,lll,kkk,iii,imat),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (swap) then + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +#ifdef MOMENT + derx_turn(lll,kkk,3-iii)=derx_turn(lll,kkk,3-iii) + & -(s1+s2+s4) +#else + derx_turn(lll,kkk,3-iii)=derx_turn(lll,kkk,3-iii) + & -(s2+s4) +#endif + derx_turn(lll,kkk,iii)=derx_turn(lll,kkk,iii)-s3 + else +#ifdef MOMENT + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-(s1+s2+s4) +#else + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-(s2+s4) +#endif + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif + else +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (l.eq.j+1) then + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + else + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + endif + endif + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello_turn6(i,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vtemp1(2),vtemp2(2),vtemp3(2),vtemp4(2), + & atemp(2,2),auxmat(2,2),achuj_temp(2,2),gtemp(2,2),gvec(2), + & ggg1(3),ggg2(3) + double precision vtemp1d(2),vtemp2d(2),vtemp3d(2),vtemp4d(2), + & atempd(2,2),auxmatd(2,2),achuj_tempd(2,2),gtempd(2,2),gvecd(2) +C 4/7/01 AL Components s1, s8, and s13 were removed, because they pertain to +C the respective energy moment and not to the cluster cumulant. + s1=0.0d0 + s8=0.0d0 + s13=0.0d0 +c + eello_turn6=0.0d0 + j=i+4 + k=i+1 + l=i+3 + iti=itortyp(itype(i)) + itk=itortyp(itype(k)) + itk1=itortyp(itype(k+1)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) +cd write (2,*) 'itk',itk,' itk1',itk1,' itl',itl,' itj',itj +cd write (2,*) 'i',i,' k',k,' j',j,' l',l +cd if (i.ne.1 .or. j.ne.3 .or. k.ne.2 .or. l.ne.4) then +cd eello6=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO6: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l +cd call checkint_turn6(i,jj,kk,eel_turn6_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx_turn(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 + eello6_5=eello6_graph4(l,k,j,i,kk,jj,2,.true.) +cd eello6_5=0.0d0 +cd write (2,*) 'eello6_5',eello6_5 +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matmat2(EUg(1,1,i+1),auxmat(1,1),auxmat(1,1)) + ss1=scalar2(Ub2(1,i+2),b1(1,itl)) + s1 = (auxmat(1,1)+auxmat(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1(1)) + call matvec2(AEA(1,1,1),vtemp1(1),vtemp1(1)) + s2 = scalar2(b1(1,itk),vtemp1(1)) +#ifdef MOMENT + call transpose2(AEA(1,1,2),atemp(1,1)) + call matmat2(atemp(1,1),EUg(1,1,i+4),atemp(1,1)) + call matvec2(Ug2(1,1,i+2),dd(1,1,itk1),vtemp2(1)) + s8 = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),Ub2(1,i+4),vtemp3(1)) + s12 = scalar2(Ub2(1,i+2),vtemp3(1)) +#ifdef MOMENT + call transpose2(a_chuj(1,1,kk,i+1),achuj_temp(1,1)) + call matmat2(achuj_temp(1,1),EUg(1,1,i+2),gtemp(1,1)) + call matmat2(gtemp(1,1),EUg(1,1,i+3),gtemp(1,1)) + call matvec2(a_chuj(1,1,jj,i),Ub2(1,i+4),vtemp4(1)) + ss13 = scalar2(b1(1,itk),vtemp4(1)) + s13 = (gtemp(1,1)+gtemp(2,2))*ss13 +#endif +c write (2,*) 's1,s2,s8,s12,s13',s1,s2,s8,s12,s13 +c s1=0.0d0 +c s2=0.0d0 +c s8=0.0d0 +c s12=0.0d0 +c s13=0.0d0 + eel_turn6 = eello6_5 - 0.5d0*(s1+s2+s12+s8+s13) +C Derivatives in gamma(i+2) + s1d =0.0d0 + s8d =0.0d0 +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmatd(1,1)) + call matmat2(EUgder(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 + call transpose2(AEAderg(1,1,2),atempd(1,1)) + call matmat2(atempd(1,1),EUg(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEAderg(1,1,2),auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 + gel_loc_turn6(i)=gel_loc_turn6(i)-0.5d0*ekont*(s1d+s8d+s12d) +C Derivatives in gamma(i+3) +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + ss1d=scalar2(Ub2der(1,i+2),b1(1,itl)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1d +#endif + call matvec2(EUgder(1,1,i+2),b1(1,itl),vtemp1d(1)) + call matvec2(AEA(1,1,1),vtemp1d(1),vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call matvec2(Ug2der(1,1,i+2),dd(1,1,itk1),vtemp2d(1)) + s8d = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,itl),vtemp2d(1)) +#endif + s12d = scalar2(Ub2der(1,i+2),vtemp3(1)) +#ifdef MOMENT + call matmat2(achuj_temp(1,1),EUgder(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUg(1,1,i+3),gtempd(1,1)) + s13d = (gtempd(1,1)+gtempd(2,2))*ss13 +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+1)=gel_loc_turn6(i+1) + & -0.5d0*ekont*(s1d+s2d+s8d+s12d+s13d) +#else + gel_loc_turn6(i+1)=gel_loc_turn6(i+1) + & -0.5d0*ekont*(s2d+s12d) +#endif +C Derivatives in gamma(i+4) + call matmat2(EUgder(1,1,i+3),AEA(1,1,2),auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +#ifdef MOMENT + call matmat2(achuj_temp(1,1),EUg(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUgder(1,1,i+3),gtempd(1,1)) + s13d = (gtempd(1,1)+gtempd(2,2))*ss13 +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +C s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+2)=gel_loc_turn6(i+2)-0.5d0*ekont*(s12d+s13d) +#else + gel_loc_turn6(i+2)=gel_loc_turn6(i+2)-0.5d0*ekont*(s12d) +#endif +C Derivatives in gamma(i+5) +#ifdef MOMENT + call transpose2(AEAderg(1,1,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1d(1)) + call matvec2(AEAderg(1,1,1),vtemp1d(1),vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call transpose2(AEA(1,1,2),atempd(1,1)) + call matmat2(atempd(1,1),EUgder(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matvec2(auxmat(1,1),Ub2der(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +#ifdef MOMENT + call matvec2(a_chuj(1,1,jj,i),Ub2der(1,i+4),vtemp4d(1)) + ss13d = scalar2(b1(1,itk),vtemp4d(1)) + s13d = (gtemp(1,1)+gtemp(2,2))*ss13d +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+3)=gel_loc_turn6(i+3) + & -0.5d0*ekont*(s1d+s2d+s8d+s12d+s13d) +#else + gel_loc_turn6(i+3)=gel_loc_turn6(i+3) + & -0.5d0*ekont*(s2d+s12d) +#endif +C Cartesian derivatives + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1(1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),vtemp1(1), + & vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call transpose2(AEAderx(1,1,lll,kkk,iii,2),atempd(1,1)) + call matmat2(atempd(1,1),EUg(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))* + & scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEAderx(1,1,lll,kkk,iii,2), + & auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + derx_turn(lll,kkk,iii) = derx_turn(lll,kkk,iii) + & - 0.5d0*(s1d+s2d) +#else + derx_turn(lll,kkk,iii) = derx_turn(lll,kkk,iii) + & - 0.5d0*s2d +#endif +#ifdef MOMENT + derx_turn(lll,kkk,3-iii) = derx_turn(lll,kkk,3-iii) + & - 0.5d0*(s8d+s12d) +#else + derx_turn(lll,kkk,3-iii) = derx_turn(lll,kkk,3-iii) + & - 0.5d0*s12d +#endif + enddo + enddo + enddo +#ifdef MOMENT + do kkk=1,5 + do lll=1,3 + call transpose2(a_chuj_der(1,1,lll,kkk,kk,i+1), + & achuj_tempd(1,1)) + call matmat2(achuj_tempd(1,1),EUg(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUg(1,1,i+3),gtempd(1,1)) + s13d=(gtempd(1,1)+gtempd(2,2))*ss13 + derx_turn(lll,kkk,2) = derx_turn(lll,kkk,2)-0.5d0*s13d + call matvec2(a_chuj_der(1,1,lll,kkk,jj,i),Ub2(1,i+4), + & vtemp4d(1)) + ss13d = scalar2(b1(1,itk),vtemp4d(1)) + s13d = (gtemp(1,1)+gtemp(2,2))*ss13d + derx_turn(lll,kkk,1) = derx_turn(lll,kkk,1)-0.5d0*s13d + enddo + enddo +#endif +cd write(iout,*) 'eel6_turn6',eel_turn6,' eel_turn6_num', +cd & 16*eel_turn6_num +cd goto 1112 + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel_turn6*g_contij(ll,1) +cgrad ggg2(ll)=eel_turn6*g_contij(ll,2) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gturn6ij=eel_turn6*g_contij(ll,1)+ekont*derx_turn(ll,1,1) + gturn6kl=eel_turn6*g_contij(ll,2)+ekont*derx_turn(ll,1,2) + gcorr6_turn(ll,i)=gcorr6_turn(ll,i)!+ghalf + & +ekont*derx_turn(ll,2,1) + gcorr6_turn(ll,i+1)=gcorr6_turn(ll,i+1)+ekont*derx_turn(ll,3,1) + gcorr6_turn(ll,j)=gcorr6_turn(ll,j)!+ghalf + & +ekont*derx_turn(ll,4,1) + gcorr6_turn(ll,j1)=gcorr6_turn(ll,j1)+ekont*derx_turn(ll,5,1) + gcorr6_turn_long(ll,j)=gcorr6_turn_long(ll,j)+gturn6ij + gcorr6_turn_long(ll,i)=gcorr6_turn_long(ll,i)-gturn6ij +cgrad ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gcorr6_turn(ll,k)=gcorr6_turn(ll,k)!+ghalf + & +ekont*derx_turn(ll,2,2) + gcorr6_turn(ll,k+1)=gcorr6_turn(ll,k+1)+ekont*derx_turn(ll,3,2) + gcorr6_turn(ll,l)=gcorr6_turn(ll,l)!+ghalf + & +ekont*derx_turn(ll,4,2) + gcorr6_turn(ll,l1)=gcorr6_turn(ll,l1)+ekont*derx_turn(ll,5,2) + gcorr6_turn_long(ll,l)=gcorr6_turn_long(ll,l)+gturn6kl + gcorr6_turn_long(ll,k)=gcorr6_turn_long(ll,k)-gturn6kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + eello_turn6=ekont*eel_turn6 +cd write (2,*) 'ekont',ekont +cd write (2,*) 'eel_turn6',ekont*eel_turn6 + return + end + +C----------------------------------------------------------------------------- + double precision function scalar(u,v) +!DIR$ INLINEALWAYS scalar +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::scalar +#endif + implicit none + double precision u(3),v(3) +cd double precision sc +cd integer i +cd sc=0.0d0 +cd do i=1,3 +cd sc=sc+u(i)*v(i) +cd enddo +cd scalar=sc + + scalar=u(1)*v(1)+u(2)*v(2)+u(3)*v(3) + return + end +crc------------------------------------------------- + SUBROUTINE MATVEC2(A1,V1,V2) +!DIR$ INLINEALWAYS MATVEC2 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::MATVEC2 +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A1(2,2),V1(2),V2(2) +c DO 1 I=1,2 +c VI=0.0 +c DO 3 K=1,2 +c 3 VI=VI+A1(I,K)*V1(K) +c Vaux(I)=VI +c 1 CONTINUE + + vaux1=a1(1,1)*v1(1)+a1(1,2)*v1(2) + vaux2=a1(2,1)*v1(1)+a1(2,2)*v1(2) + + v2(1)=vaux1 + v2(2)=vaux2 + END +C--------------------------------------- + SUBROUTINE MATMAT2(A1,A2,A3) +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::MATMAT2 +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A1(2,2),A2(2,2),A3(2,2) +c DIMENSION AI3(2,2) +c DO J=1,2 +c A3IJ=0.0 +c DO K=1,2 +c A3IJ=A3IJ+A1(I,K)*A2(K,J) +c enddo +c A3(I,J)=A3IJ +c enddo +c enddo + + ai3_11=a1(1,1)*a2(1,1)+a1(1,2)*a2(2,1) + ai3_12=a1(1,1)*a2(1,2)+a1(1,2)*a2(2,2) + ai3_21=a1(2,1)*a2(1,1)+a1(2,2)*a2(2,1) + ai3_22=a1(2,1)*a2(1,2)+a1(2,2)*a2(2,2) + + A3(1,1)=AI3_11 + A3(2,1)=AI3_21 + A3(1,2)=AI3_12 + A3(2,2)=AI3_22 + END + +c------------------------------------------------------------------------- + double precision function scalar2(u,v) +!DIR$ INLINEALWAYS scalar2 + implicit none + double precision u(2),v(2) + double precision sc + integer i + scalar2=u(1)*v(1)+u(2)*v(2) + return + end + +C----------------------------------------------------------------------------- + + subroutine transpose2(a,at) +!DIR$ INLINEALWAYS transpose2 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::transpose2 +#endif + implicit none + double precision a(2,2),at(2,2) + at(1,1)=a(1,1) + at(1,2)=a(2,1) + at(2,1)=a(1,2) + at(2,2)=a(2,2) + return + end +c-------------------------------------------------------------------------- + subroutine transpose(n,a,at) + implicit none + integer n,i,j + double precision a(n,n),at(n,n) + do i=1,n + do j=1,n + at(j,i)=a(i,j) + enddo + enddo + return + end +C--------------------------------------------------------------------------- + subroutine prodmat3(a1,a2,kk,transp,prod) +!DIR$ INLINEALWAYS prodmat3 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::prodmat3 +#endif + implicit none + integer i,j + double precision a1(2,2),a2(2,2),a2t(2,2),kk(2,2),prod(2,2) + logical transp +crc double precision auxmat(2,2),prod_(2,2) + + if (transp) then +crc call transpose2(kk(1,1),auxmat(1,1)) +crc call matmat2(a1(1,1),auxmat(1,1),auxmat(1,1)) +crc call matmat2(auxmat(1,1),a2(1,1),prod_(1,1)) + + prod(1,1)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(1,2))*a2(1,1) + & +(a1(1,1)*kk(2,1)+a1(1,2)*kk(2,2))*a2(2,1) + prod(1,2)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(1,2))*a2(1,2) + & +(a1(1,1)*kk(2,1)+a1(1,2)*kk(2,2))*a2(2,2) + prod(2,1)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(1,2))*a2(1,1) + & +(a1(2,1)*kk(2,1)+a1(2,2)*kk(2,2))*a2(2,1) + prod(2,2)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(1,2))*a2(1,2) + & +(a1(2,1)*kk(2,1)+a1(2,2)*kk(2,2))*a2(2,2) + + else +crc call matmat2(a1(1,1),kk(1,1),auxmat(1,1)) +crc call matmat2(auxmat(1,1),a2(1,1),prod_(1,1)) + + prod(1,1)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(2,1))*a2(1,1) + & +(a1(1,1)*kk(1,2)+a1(1,2)*kk(2,2))*a2(2,1) + prod(1,2)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(2,1))*a2(1,2) + & +(a1(1,1)*kk(1,2)+a1(1,2)*kk(2,2))*a2(2,2) + prod(2,1)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(2,1))*a2(1,1) + & +(a1(2,1)*kk(1,2)+a1(2,2)*kk(2,2))*a2(2,1) + prod(2,2)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(2,1))*a2(1,2) + & +(a1(2,1)*kk(1,2)+a1(2,2)*kk(2,2))*a2(2,2) + + endif +c call transpose2(a2(1,1),a2t(1,1)) + +crc print *,transp +crc print *,((prod_(i,j),i=1,2),j=1,2) +crc print *,((prod(i,j),i=1,2),j=1,2) + + return + end + diff --git a/source/unres/src_MD-NEWSC/CMakeLists.txt b/source/unres/src_MD-NEWSC/CMakeLists.txt new file mode 100644 index 0000000..a0353f4 --- /dev/null +++ b/source/unres/src_MD-NEWSC/CMakeLists.txt @@ -0,0 +1,398 @@ +# +# CMake project file for UNRES with MD for single chains +# + +enable_language (Fortran) + + +#================================ +# Set source file lists +#================================ +set(UNRES_MD_SRC0 + add.f + arcos.f + banach.f + blas.f + bond_move.f + cartder.F + cartprint.f + check_sc_distr.f + check_bond.f + chainbuild.F + checkder_p.F + compare_s1.F + contact.f + convert.f + cored.f + dihed_cons.F + djacob.f + econstr_local.F + eigen.f + elecont.f + energy_split-sep.F + entmcm.F + fitsq.f + gauss.f + gen_rand_conf.F + geomout.F + gnmr1.f + intcartderiv.F + initialize_p.F + int_to_cart.f + intcor.f + intlocal.f + kinetic_lesyng.f + lagrangian_lesyng.F + local_move.f + map.f + matmult.f + mc.F + mcm.F + MD_A-MTS.F + minimize_p.F + minim_mcmf.F + misc.f + moments.f + MP.F + MREMD.F + muca_md.f + parmread.F + pinorm.f + printmat.f + q_measure.F + randgens.f + rattle.F + readpdb.F + readrtns.F + refsys.f + regularize.F + rescode.f + rmdd.f + rmsd.F + sc_move.F + sort.f + stochfric.F + sumsld.f + surfatom.f + test.F + timing.F + thread.F + unres.F + ssMD.F +) + +if(Fortran_COMPILER_NAME STREQUAL "ifort") + set(UNRES_MD_SRC0 ${UNRES_MD_SRC0} prng.f ) +elseif(Fortran_COMPILER_NAME STREQUAL "mpif90") + set(UNRES_MD_SRC0 ${UNRES_MD_SRC0} prng.f ) +elseif(Fortran_COMPILER_NAME STREQUAL "f95") + set(UNRES_MD_SRC0 ${UNRES_MD_SRC0} prng.f ) +elseif(Fortran_COMPILER_NAME STREQUAL "gfortran") + set(UNRES_MD_SRC0 ${UNRES_MD_SRC0} prng.f ) +else() + set(UNRES_MD_SRC0 ${UNRES_MD_SRC0} prng_32.F ) +endif (Fortran_COMPILER_NAME STREQUAL "ifort") + + +set(UNRES_MD_SRC3 + energy_p_new_barrier.F + energy_p_new-sep_barrier.F + gradient_p.F ) + +set(UNRES_MD_PP_SRC + cartder.F + chainbuild.F + checkder_p.F + compare_s1.F + dihed_cons.F + econstr_local.F + energy_p_new_barrier.F + energy_p_new-sep_barrier.F + energy_split-sep.F + entmcm.F + gen_rand_conf.F + geomout.F + gradient_p.F + initialize_p.F + intcartderiv.F + lagrangian_lesyng.F + mc.F + mcm.F + MD_A-MTS.F + minimize_p.F + minim_mcmf.F + MP.F + MREMD.F + parmread.F + q_measure1.F + q_measure3.F + q_measure.F + rattle.F + readpdb.F + readrtns.F + regularize.F + rmsd.F + sc_move.F + stochfric.F + test.F + thread.F + timing.F + unres.F + proc_proc.c +) + + +if(NOT Fortran_COMPILER_NAME STREQUAL "ifort") + set(UNRES_MD_PP_SRC ${UNRES_MD_PP_SRC} prng_32.F) +endif(NOT Fortran_COMPILER_NAME STREQUAL "ifort") + +#================================================ +# Set comipiler flags for different sourcefiles +#================================================ +if (Fortran_COMPILER_NAME STREQUAL "ifort") + set(FFLAGS0 "-ip -w" ) + set(FFLAGS1 "-w -g -d2 -CA -CB" ) + set(FFLAGS2 "-w -g -00 ") + #set(FFLAGS3 "-c -w -O3 -ipo -ipo_obj -opt_report" ) + set(FFLAGS3 "-w -ipo " ) +elseif (Fortran_COMPILER_NAME STREQUAL "gfortran") + set(FFLAGS0 "-std=legacy -I. " ) + set(FFLAGS1 "-std=legacy -g -I. " ) + set(FFLAGS2 "-std=legacy -I. ") + #set(FFLAGS3 "-c -w -O3 -ipo -ipo_obj -opt_report" ) + set(FFLAGS3 "-std=legacy -I. " ) +endif (Fortran_COMPILER_NAME STREQUAL "ifort") + + +# Add MPI compiler flags +if(UNRES_WITH_MPI) + set(FFLAGS0 "${FFLAGS0} -I${MPIF_INCLUDE_DIRECTORIES}") + set(FFLAGS1 "${FFLAGS1} -I${MPIF_INCLUDE_DIRECTORIES}") + set(FFLAGS2 "${FFLAGS2} -I${MPIF_INCLUDE_DIRECTORIES}") + set(FFLAGS3 "${FFLAGS3} -I${MPIF_INCLUDE_DIRECTORIES}") +endif(UNRES_WITH_MPI) + +set_property(SOURCE ${UNRES_MD_SRC0} APPEND PROPERTY COMPILE_FLAGS ${FFLAGS0} ) +#set_property(SOURCE ${UNRES_MD_SRC1} PROPERTY COMPILE_FLAGS ${FFLAGS1} ) +#set_property(SOURCE ${UNRES_MD_SRC2} PROPERTY COMPILE_FLAGS ${FFLAGS2} ) +set_property(SOURCE ${UNRES_MD_SRC3} PROPERTY COMPILE_FLAGS ${FFLAGS3} ) + +#========================================= +# Settings for GAB force field +#========================================= +if(UNRES_MD_FF STREQUAL "GAB" ) + # set preprocesor flags + set(CPPFLAGS "PROCOR -DUNRES -DISNAN -DSPLITELE -DLANG0 -DCRYST_BOND -DCRYST_THETA -DCRYST_SC" ) + +#========================================= +# Settings for E0LL2Y force field +#========================================= +elseif(UNRES_MD_FF STREQUAL "E0LL2Y") + # set preprocesor flags + set(CPPFLAGS "PROCOR -DUNRES -DISNAN -DSPLITELE -DLANG0" ) +endif(UNRES_MD_FF STREQUAL "GAB") + +#========================================= +# System specific flags +#========================================= +if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set(CPPFLAGS "${CPPFLAGS} -DLINUX") +endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + +#========================================= +# Compiler specific flags +#========================================= + +if (Fortran_COMPILER_NAME STREQUAL "ifort") + # Add ifort preprocessor flags + set(CPPFLAGS "${CPPFLAGS} -DPGI") +elseif (Fortran_COMPILER_NAME STREQUAL "f95") + # Add new gfortran flags + set(CPPFLAGS "${CPPFLAGS} -DG77") +elseif (Fortran_COMPILER_NAME STREQUAL "gfortran") + # Add old gfortran flags + set(CPPFLAGS "${CPPFLAGS} -DG77") +endif (Fortran_COMPILER_NAME STREQUAL "ifort") + +#========================================= +# Add MPI preprocessor flags +#========================================= +if (UNRES_WITH_MPI) + set(CPPFLAGS "${CPPFLAGS} -DMP -DMPI") +endif(UNRES_WITH_MPI) + +#========================================= +# Apply preprocesor flags to *.F files +#========================================= +set_property(SOURCE ${UNRES_MD_PP_SRC} PROPERTY COMPILE_DEFINITIONS ${CPPFLAGS} ) + + +#======================================== +# Setting binary name +#======================================== +if(UNRES_WITH_MPI) + # binary with mpi + set(UNRES_BIN "unres_${Fortran_COMPILER_NAME}_MPICH_${UNRES_MD_FF}.exe") +else(UNRES_WITH_MPI) + # binary without mpi + set(UNRES_BIN "unres_${Fortran_COMPILER_NAME}_single_${UNRES_MD_FF}.exe") +endif(UNRES_WITH_MPI) + +#========================================= +# cinfo.f workaround for cmake +#========================================= +# get the current date +TODAY(DATE) +# generate cinfo.f + +set(CINFO "${CMAKE_CURRENT_BINARY_DIR}/cinfo.f") +FILE(WRITE ${CINFO} +"C CMake generated file + subroutine cinfo + include 'COMMON.IOUNITS' + write(iout,*)'++++ Compile info ++++' + write(iout,*)'Version ${UNRES_MAJOR}.${UNRES_MINOR} build ${UNRES_PATCH}' +") + +CINFO_FORMAT(${CINFO} "Compiled" "${DATE}" ) +CINFO_FORMAT(${CINFO} "Compiled by" "$ENV{USER}@$ENV{HOST}" ) +CINFO_FORMAT(${CINFO} "OS name:" "${CMAKE_SYSTEM_NAME}" ) +CINFO_FORMAT(${CINFO} "OS release:" "${CMAKE_SYSTEM}" ) +CINFO_FORMAT(${CINFO} "Fortran Compiler:" "${CMAKE_Fortran_COMPILER}" ) +CINFO_FORMAT(${CINFO} "MD Force field:" "${UNRES_MD_FF}" ) +CINFO_FORMAT(${CINFO} "CPPFLAGS =" "${CPPFLAGS}") + +FILE(APPEND ${CINFO} +" write(iout,*)'++++ End of compile info ++++' + return + end ") + +# add include path +set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/cinfo.f PROPERTY COMPILE_FLAGS "${FFLAGS0} -I${CMAKE_CURRENT_SOURCE_DIR}") + +#========================================= +# Set full unres MD sources +#========================================= +set(UNRES_MD_SRCS ${UNRES_MD_SRC0} ${UNRES_MD_SRC3} ${CMAKE_CURRENT_BINARY_DIR}/cinfo.f ) + + +#========================================= +# Build the binary +#========================================= +add_executable(UNRES_BIN-MD ${UNRES_MD_SRCS} ) +set_target_properties(UNRES_BIN-MD PROPERTIES OUTPUT_NAME ${UNRES_BIN}) +#set_property(TARGET ${UNRES_BIN} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/unres/MD ) +#add_dependencies (${UNRES_BIN} ${UNRES_XDRFLIB}) + + +#========================================= +# Link libraries +#========================================= +# link MPI library (libmpich.a) +if(UNRES_WITH_MPI) + target_link_libraries( UNRES_BIN-MD ${MPIF_LIBRARIES} ) +endif(UNRES_WITH_MPI) +# link libxdrf.a +#message("UNRES_XDRFLIB=${UNRES_XDRFLIB}") +target_link_libraries( UNRES_BIN-MD xdrf ) + +#========================================= +# TESTS +#========================================= + +#-- Copy all the data files from the test directory into the source directory +#SET(UNRES_TEST_FILES +# ala10.inp +# ) + +#FOREACH (UNRES_TEST_FILE ${UNRES_TEST_FILES}) +# SET (unres_test_dest "${CMAKE_CURRENT_BINARY_DIR}/${UNRES_TEST_FILE}") +# MESSAGE (STATUS " Copying ${UNRES_TEST_FILE} from ${CMAKE_SOURCE_DIR}/examples/unres/MD/ff_gab/${UNRES_TEST_FILE} to ${unres_test_dest}") +# ADD_CUSTOM_COMMAND ( +# TARGET ${UNRES_BIN} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/examples/unres/MD/ff_gab/${UNRES_TEST_FILE} ${unres_test_dest} +# ) +#ENDFOREACH (UNRES_TEST_FILE ${UNRES_TEST_FILES}) + +#========================================= +# Generate data test files +#========================================= +# test_single_ala.sh +#========================================= + +FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/scripts/test_single_ala.sh +"#!/bin/sh +export POT=GB +export PREFIX=ala10 +#----------------------------------------------------------------------------- +UNRES_BIN=./${UNRES_BIN} +#----------------------------------------------------------------------------- +DD=${CMAKE_SOURCE_DIR}/PARAM +export BONDPAR=$DD/bond.parm +export THETPAR=$DD/thetaml.5parm +export ROTPAR=$DD/scgauss.parm +export TORPAR=$DD/torsion_631Gdp.parm +export TORDPAR=$DD/torsion_double_631Gdp.parm +export ELEPAR=$DD/electr_631Gdp.parm +export SIDEPAR=$DD/sc_GB_opt.1gab_3S_qclass5no310-shan2-sc-16-10-8k +export FOURIER=$DD/fourier_opt.parm.1igd_hc_iter3_3 +export SCPPAR=$DD/scp.parm +export SCCORPAR=$DD/sccor_pdb_shelly.dat +export PATTERN=$DD/patterns.cart +#----------------------------------------------------------------------------- +$UNRES_BIN +") + +# +# File permissions workaround +# +FILE( COPY ${CMAKE_CURRENT_BINARY_DIR}/scripts/test_single_ala.sh + DESTINATION ${CMAKE_CURRENT_BINARY_DIR} + FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +) + + + +#========================================= +# ala10.inp +#========================================= + +file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/ala10.inp +"ala10 unblocked +SEED=-1111333 MD ONE_LETTER rescale_mode=2 +nstep=15000 ntwe=100 ntwx=1000 dt=0.1 lang=0 tbf t_bath=300 damax=1.0 & +reset_moment=1000 reset_vel=1000 +WLONG=1.35279 WSCP=1.59304 WELEC=0.71534 WBOND=1.00000 WANG=1.13873 & +WSCLOC=0.16258 WTOR=1.98599 WTORD=1.57069 WCORRH=0.42887 WCORR5=0.00000 & +WCORR6=0.00000 WEL_LOC=0.16036 WTURN3=1.68722 WTURN4=0.66230 WTURN6=0.00000 & +WVDWPP=0.11371 WHPB=1.00000 & +CUTOFF=7.00000 WCORR4=0.00000 +12 +XAAAAAAAAAAX + 0 + 0 + 90.0000 90.0000 90.0000 90.000 90.000 90.000 90.000 90.000 + 90.0000 90.0000 + 180.0000 180.0000 180.0000 180.000 180.000 180.000 180.000 180.000 + 180.0000 + 110.0000 110.0000 110.0000 100.000 110.000 100.000 110.000 110.000 + 110.0000 110.0000 + -120.0000 -120.0000 -120.000 -120.000 -120.000 -120.000 -120.000 -120.000 + -120.0000 -120.0000 +") + + +# Add tests + +if(NOT UNRES_WITH_MPI) + + add_test(NAME UNRES_MD_Ala10 COMMAND sh ${CMAKE_CURRENT_BINARY_DIR}/test_single_ala.sh ) + +else(NOT UNRES_WITH_MPI) + + + add_test(NAME UNRES_MD_MPI_Ala10 COMMAND mpiexec -boot ${CMAKE_CURRENT_BINARY_DIR}/test_single_ala.sh ) + +endif(NOT UNRES_WITH_MPI) + diff --git a/source/unres/src_MD-NEWSC/COMMON.BOUNDS b/source/unres/src_MD-NEWSC/COMMON.BOUNDS new file mode 100644 index 0000000..f3859ae --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.BOUNDS @@ -0,0 +1,2 @@ + double precision phibound(2,maxres) + common /bounds/ phibound diff --git a/source/unres/src_MD-NEWSC/COMMON.CACHE b/source/unres/src_MD-NEWSC/COMMON.CACHE new file mode 100644 index 0000000..8cb0cbc --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.CACHE @@ -0,0 +1,6 @@ + integer ncache,CachSrc(max_cache),isent(max_cache), + & iused(max_cache) + logical cache_update + double precision ecache(max_cache),xcache(maxvar,max_cache) + common /cache/ ecache,xcache,ncache,CachSrc,isent,iused, + & cache_update diff --git a/source/unres/src_MD-NEWSC/COMMON.CALC b/source/unres/src_MD-NEWSC/COMMON.CALC new file mode 100644 index 0000000..67b4bb9 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.CALC @@ -0,0 +1,15 @@ + integer i,j,k,l + double precision erij,rij,xj,yj,zj,dxi,dyi,dzi,dxj,dyj,dzj, + & chi1,chi2,chi12,chip1,chip2,chip12,alf1,alf2,alf12,om1,om2,om12, + & om1om2,chiom1,chiom2,chiom12,chipom1,chipom2,chipom12,eps1, + & faceps1,faceps1_inv,eps1_om12,facsig,sigsq,sigsq_om1,sigsq_om2, + & sigsq_om12,facp,facp_inv,facp1,eps2rt,eps2rt_om1,eps2rt_om2, + & eps2rt_om12,eps3rt,eom1,eom2,eom12,evdwij,eps2der,eps3der,sigder, + & dsci_inv,dscj_inv,gg + common /calc/ erij(3),rij,xj,yj,zj,dxi,dyi,dzi,dxj,dyj,dzj, + & chi1,chi2,chi12,chip1,chip2,chip12,alf1,alf2,alf12,om1,om2,om12, + & om1om2,chiom1,chiom2,chiom12,chipom1,chipom2,chipom12,eps1, + & faceps1,faceps1_inv,eps1_om12,facsig,sigsq,sigsq_om1,sigsq_om2, + & sigsq_om12,facp,facp_inv,facp1,eps2rt,eps2rt_om1,eps2rt_om2, + & eps2rt_om12,eps3rt,eom1,eom2,eom12,evdwij,eps2der,eps3der,sigder, + & dsci_inv,dscj_inv,gg(3),i,j diff --git a/source/unres/src_MD-NEWSC/COMMON.CHAIN b/source/unres/src_MD-NEWSC/COMMON.CHAIN new file mode 100644 index 0000000..6e19f8d --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.CHAIN @@ -0,0 +1,13 @@ + integer nres,nsup,nstart_sup,nz_start,nz_end,iz_sc, + & nres0,nstart_seq + double precision c,dc,dc_old,d_c_work,xloc,xrot,dc_norm,t,r, + & prod,rt,dc_work,cref,crefjlee,dc_norm2 + common /chain/ c(3,maxres2+2),dc(3,0:maxres2),dc_old(3,0:maxres2), + & xloc(3,maxres),xrot(3,maxres),dc_norm(3,0:maxres2), + & dc_norm2(3,0:maxres2), + & dc_work(MAXRES6),nres,nres0 + common /rotmat/ t(3,3,maxres),r(3,3,maxres),prod(3,3,maxres), + & rt(3,3,maxres) + common /refstruct/ cref(3,maxres2+2),crefjlee(3,maxres2+2), + & nsup,nstart_sup,nstart_seq + common /from_zscore/ nz_start,nz_end,iz_sc diff --git a/source/unres/src_MD-NEWSC/COMMON.CONTACTS b/source/unres/src_MD-NEWSC/COMMON.CONTACTS new file mode 100644 index 0000000..5b3a90d --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.CONTACTS @@ -0,0 +1,82 @@ +C Change 12/1/95 - common block CONTACTS1 included. + integer ncont,ncont_ref,icont,icont_ref,num_cont,jcont + double precision facont,gacont + common /contacts/ ncont,ncont_ref,icont(2,maxcont), + & icont_ref(2,maxcont) + common /contacts1/ facont(maxconts,maxres), + & gacont(3,maxconts,maxres), + & num_cont(maxres),jcont(maxconts,maxres) +C 12/26/95 - H-bonding contacts + common /contacts_hb/ + & gacontp_hb1(3,maxconts,maxres),gacontp_hb2(3,maxconts,maxres), + & gacontp_hb3(3,maxconts,maxres), + & gacontm_hb1(3,maxconts,maxres),gacontm_hb2(3,maxconts,maxres), + & gacontm_hb3(3,maxconts,maxres), + & gacont_hbr(3,maxconts,maxres), + & grij_hb_cont(3,maxconts,maxres), + & facont_hb(maxconts,maxres),ees0p(maxconts,maxres), + & ees0m(maxconts,maxres),d_cont(maxconts,maxres), + & num_cont_hb(maxres),jcont_hb(maxconts,maxres) +C 9/23/99 Added improper rotation matrices and matrices of dipole-dipole +C interactions +c 7/25/08 Commented out; not needed when cumulants used +C Interactions of pseudo-dipoles generated by loc-el interactions. +c double precision dip,dipderg,dipderx +c common /dipint/ dip(4,maxconts,maxres),dipderg(4,maxconts,maxres), +c & dipderx(3,5,4,maxconts,maxres) +C 10/30/99 Added other pre-computed vectors and matrices needed +C to calculate three - six-order el-loc correlation terms + double precision Ug,Ugder,Ug2,Ug2der,obrot,obrot2,obrot_der, + & obrot2_der,Ub2,Ub2der,mu,muder,EUg,EUgder,CUg,CUgder, + & DUg,DUgder,DtUg2,DtUg2der,Ctobr,Ctobrder,Dtobr2,Dtobr2der + common /rotat/ Ug(2,2,maxres),Ugder(2,2,maxres),Ug2(2,2,maxres), + & Ug2der(2,2,maxres),obrot(2,maxres),obrot2(2,maxres), + & obrot_der(2,maxres),obrot2_der(2,maxres) +C This common block contains vectors and matrices dependent on a single +C amino-acid residue. + common /precomp1/ mu(2,maxres),muder(2,maxres),Ub2(2,maxres), + & Ub2der(2,maxres),Ctobr(2,maxres),Ctobrder(2,maxres), + & Dtobr2(2,maxres),Dtobr2der(2,maxres), + & EUg(2,2,maxres),EUgder(2,2,maxres),CUg(2,2,maxres), + & CUgder(2,2,maxres),DUg(2,2,maxres),Dugder(2,2,maxres), + & DtUg2(2,2,maxres),DtUg2der(2,2,maxres) +C This common block contains vectors and matrices dependent on two +C consecutive amino-acid residues. + double precision Ug2Db1t,Ug2Db1tder,CUgb2,CUgb2der,EUgC, + & EUgCder,EUgD,EUgDder,DtUg2EUg,DtUg2EUgder + common /precomp2/ Ug2Db1t(2,maxres),Ug2Db1tder(2,maxres), + & CUgb2(2,maxres),CUgb2der(2,maxres),EUgC(2,2,maxres), + & EUgCder(2,2,maxres),EUgD(2,2,maxres),EUgDder(2,2,maxres), + & DtUg2EUg(2,2,maxres),Ug2DtEUg(2,2,maxres), + & Ug2DtEUgder(2,2,2,maxres),DtUg2EUgder(2,2,2,maxres) + double precision costab,sintab,costab2,sintab2 + common /rotat_old/ costab(maxres),sintab(maxres), + & costab2(maxres),sintab2(maxres) +C This common block contains dipole-interaction matrices and their +C Cartesian derivatives. + double precision a_chuj,a_chuj_der + common /dipmat/ a_chuj(2,2,maxconts,maxres), + & a_chuj_der(2,2,3,5,maxconts,maxres) + double precision AEA,AEAderg,AEAderx,AECA,AECAderg,AECAderx, + & ADtEA,ADtEAderg,ADtEAderx,AEAb1,AEAb1derg,AEAb1derx, + & AEAb2,AEAb2derg,AEAb2derx,g_contij,ekont + common /diploc/ AEA(2,2,2),AEAderg(2,2,2),AEAderx(2,2,3,5,2,2), + & EAEA(2,2,2), EAEAderg(2,2,2,2), EAEAderx(2,2,3,5,2,2), + & AECA(2,2,2),AECAderg(2,2,2),AECAderx(2,2,3,5,2,2), + & ADtEA(2,2,2),ADtEAderg(2,2,2,2),ADtEAderx(2,2,3,5,2,2), + & ADtEA1(2,2,2),ADtEA1derg(2,2,2,2),ADtEA1derx(2,2,3,5,2,2), + & AEAb1(2,2,2),AEAb1derg(2,2,2),AEAb1derx(2,3,5,2,2,2), + & AEAb2(2,2,2),AEAb2derg(2,2,2,2),AEAb2derx(2,3,5,2,2,2), + & g_contij(3,2),ekont +C 12/13/2008 (again Poland-Jaruzel war anniversary) +C RE: Parallelization of 4th and higher order loc-el correlations + integer ncont_sent,ncont_recv,iint_sent,iisent_local, + & itask_cont_from,itask_cont_to,ntask_cont_from,ntask_cont_to, + & nat_sent,iat_sent,iturn3_sent,iturn4_sent,iturn3_sent_local, + & iturn4_sent_local + common /contdistrib/ ncont_sent(maxres),ncont_recv(maxres), + & iint_sent(4,maxres,maxres),iint_sent_local(4,maxres,maxres), + & iturn3_sent(4,maxres),iturn4_sent(4,maxres), + & iturn3_sent_local(4,maxres),iturn4_sent_local(4,maxres), + & nat_sent,iat_sent(maxres),itask_cont_from(0:max_fg_procs-1), + & itask_cont_to(0:max_fg_procs-1),ntask_cont_from,ntask_cont_to diff --git a/source/unres/src_MD-NEWSC/COMMON.CONTACTS.moment b/source/unres/src_MD-NEWSC/COMMON.CONTACTS.moment new file mode 100644 index 0000000..d07a0f0 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.CONTACTS.moment @@ -0,0 +1,68 @@ +C Change 12/1/95 - common block CONTACTS1 included. + integer ncont,ncont_ref,icont,icont_ref,num_cont,jcont + double precision facont,gacont + common /contacts/ ncont,ncont_ref,icont(2,maxcont), + & icont_ref(2,maxcont) + common /contacts1/ facont(maxconts,maxres), + & gacont(3,maxconts,maxres), + & num_cont(maxres),jcont(maxconts,maxres) +C 12/26/95 - H-bonding contacts + common /contacts_hb/ + & gacontp_hb1(3,maxconts,maxres),gacontp_hb2(3,maxconts,maxres), + & gacontp_hb3(3,maxconts,maxres), + & gacontm_hb1(3,maxconts,maxres),gacontm_hb2(3,maxconts,maxres), + & gacontm_hb3(3,maxconts,maxres), + & gacont_hbr(3,maxconts,maxres), + & grij_hb_cont(3,maxconts,maxres), + & facont_hb(maxconts,maxres),ees0p(maxconts,maxres), + & ees0m(maxconts,maxres),d_cont(maxconts,maxres), + & num_cont_hb(maxres),jcont_hb(maxconts,maxres) +C 9/23/99 Added improper rotation matrices and matrices of dipole-dipole +C interactions +C Interactions of pseudo-dipoles generated by loc-el interactions. + double precision dip,dipderg,dipderx + common /dipint/ dip(4,maxconts,maxres),dipderg(4,maxconts,maxres), + & dipderx(3,5,4,maxconts,maxres) +C 10/30/99 Added other pre-computed vectors and matrices needed +C to calculate three - six-order el-loc correlation terms + double precision Ug,Ugder,Ug2,Ug2der,obrot,obrot2,obrot_der, + & obrot2_der,Ub2,Ub2der,mu,muder,EUg,EUgder,CUg,CUgder, + & DUg,DUgder,DtUg2,DtUg2der,Ctobr,Ctobrder,Dtobr2,Dtobr2der + common /rotat/ Ug(2,2,maxres),Ugder(2,2,maxres),Ug2(2,2,maxres), + & Ug2der(2,2,maxres),obrot(2,maxres),obrot2(2,maxres), + & obrot_der(2,maxres),obrot2_der(2,maxres) +C This common block contains vectors and matrices dependent on a single +C amino-acid residue. + common /precomp1/ Ub2(2,maxres),Ub2der(2,maxres),mu(2,maxres), + & EUg(2,2,maxres),EUgder(2,2,maxres),CUg(2,2,maxres), + & CUgder(2,2,maxres),DUg(2,2,maxres),Dugder(2,2,maxres), + & DtUg2(2,2,maxres),DtUg2der(2,2,maxres),Ctobr(2,maxres), + & Ctobrder(2,maxres),Dtobr2(2,maxres),Dtobr2der(2,maxres) +C This common block contains vectors and matrices dependent on two +C consecutive amino-acid residues. + double precision Ug2Db1t,Ug2Db1tder,CUgb2,CUgb2der,EUgC, + & EUgCder,EUgD,EUgDder,DtUg2EUg,DtUg2EUgder + common /precomp2/ Ug2Db1t(2,maxres),Ug2Db1tder(2,maxres), + & CUgb2(2,maxres),CUgb2der(2,maxres),EUgC(2,2,maxres), + & EUgCder(2,2,maxres),EUgD(2,2,maxres),EUgDder(2,2,maxres), + & DtUg2EUg(2,2,maxres),DtUg2EUgder(2,2,2,maxres), + & Ug2DtEUg(2,2,maxres),Ug2DtEUgder(2,2,2,maxres) + double precision costab,sintab,costab2,sintab2 + common /rotat_old/ costab(maxres),sintab(maxres), + & costab2(maxres),sintab2(maxres),muder(2,maxres) +C This common block contains dipole-interaction matrices and their +C Cartesian derivatives. + double precision a_chuj,a_chuj_der + common /dipmat/ a_chuj(2,2,maxconts,maxres), + & a_chuj_der(2,2,3,5,maxconts,maxres) + double precision AEA,AEAderg,AEAderx,AECA,AECAderg,AECAderx, + & ADtEA,ADtEAderg,ADtEAderx,AEAb1,AEAb1derg,AEAb1derx, + & AEAb2,AEAb2derg,AEAb2derx + common /diploc/ AEA(2,2,2),AEAderg(2,2,2),AEAderx(2,2,3,5,2,2), + & EAEA(2,2,2), EAEAderg(2,2,2,2), EAEAderx(2,2,3,5,2,2), + & AECA(2,2,2),AECAderg(2,2,2),AECAderx(2,2,3,5,2,2), + & ADtEA(2,2,2),ADtEAderg(2,2,2,2),ADtEAderx(2,2,3,5,2,2), + & ADtEA1(2,2,2),ADtEA1derg(2,2,2,2),ADtEA1derx(2,2,3,5,2,2), + & AEAb1(2,2,2),AEAb1derg(2,2,2),AEAb1derx(2,3,5,2,2,2), + & AEAb2(2,2,2),AEAb2derg(2,2,2,2),AEAb2derx(2,3,5,2,2,2), + & g_contij(3,2),ekont diff --git a/source/unres/src_MD-NEWSC/COMMON.CONTROL b/source/unres/src_MD-NEWSC/COMMON.CONTROL new file mode 100644 index 0000000..a816569 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.CONTROL @@ -0,0 +1,13 @@ + integer modecalc,iscode,indpdb,indback,indphi,iranconf,icheckgrad, + & inprint,i2ndstr,mucadyn,constr_dist, iprint, iint + logical minim,refstr,pdbref,outpdb,outmol2,overlapsc,energy_dec, + & sideadd,lsecondary,read_cart,unres_pdb, + & vdisulf,searchsc,lmuca,dccart,extconf,out1file, + & gnorm_check,gradout,split_ene + common /cntrl/ modecalc,iscode,indpdb,indback,indphi,iranconf, + & icheckgrad,minim,i2ndstr,refstr,pdbref,outpdb,outmol2,iprint, + & overlapsc,energy_dec,sideadd,lsecondary,read_cart,unres_pdb + & ,vdisulf,searchsc,lmuca,dccart,mucadyn,extconf,out1file, + & constr_dist,gnorm_check,gradout,split_ene +C... minim = .true. means DO minimization. +C... energy_dec = .true. means print energy decomposition matrix diff --git a/source/unres/src_MD-NEWSC/COMMON.DBASE b/source/unres/src_MD-NEWSC/COMMON.DBASE new file mode 100644 index 0000000..4f07780 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.DBASE @@ -0,0 +1,3 @@ + common /struct/ cart_base(3,maxres_base,maxseq),str_nam(maxseq), + & nres_base(3,maxseq),nseq + character*8 str_nam diff --git a/source/unres/src_MD-NEWSC/COMMON.DERIV b/source/unres/src_MD-NEWSC/COMMON.DERIV new file mode 100644 index 0000000..aff2747 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.DERIV @@ -0,0 +1,40 @@ + double precision dcdv,dxdv,dxds,gradx,gradc,gvdwc,gelc,gelc_long, + & gvdwpp,gel_loc,gel_loc_long,gvdwc_scpp, + & gradx_scp,gvdwc_scp,ghpbx,ghpbc,gloc,gloc_x,dtheta,dphi,dalpha, + & domega,gscloc,gsclocx,gradcorr,gradcorr_long,gradcorr5_long, + & gradcorr6_long,gcorr6_turn_long,gvdwcT,gvdwxT,gcdwx,gradxorr, + & gradcorr5, gradcorr6, gcorr3_turn, gcorr4_turn, gcorr6_turn, + & gradb, gradbx, gel_loc_loc, gel_loc_turn3, gel_loc_turn4, + & gel_loc_turn6, gsccor_loc, g_corr5_loc, g_corr6_loc, gsccorc, + & gsccorx, gvdwx, gcorr_loc + integer nfl,icg + common /derivatT/ gvdwcT(3,maxres),gvdwxT(3,maxres) + common /derivat/ dcdv(6,maxdim),dxdv(6,maxdim),dxds(6,maxres), + & gradx(3,maxres,2),gradc(3,maxres,2),gvdwx(3,maxres), + & gvdwc(3,maxres),gelc(3,maxres),gelc_long(3,maxres), + & gvdwpp(3,maxres),gvdwc_scpp(3,maxres), + & gradx_scp(3,maxres),gvdwc_scp(3,maxres),ghpbx(3,maxres), + & ghpbc(3,maxres),gloc(maxvar,2),gradcorr(3,maxres), + & gradcorr_long(3,maxres),gradcorr5_long(3,maxres), + & gradcorr6_long(3,maxres),gcorr6_turn_long(3,maxres), + & gradxorr(3,maxres),gradcorr5(3,maxres),gradcorr6(3,maxres), + & gloc_x(maxvar,2),gel_loc(3,maxres),gel_loc_long(3,maxres), + & gcorr3_turn(3,maxres), + & gcorr4_turn(3,maxres),gcorr6_turn(3,maxres),gradb(3,maxres), + & gradbx(3,maxres),gel_loc_loc(maxvar),gel_loc_turn3(maxvar), + & gel_loc_turn4(maxvar),gel_loc_turn6(maxvar),gcorr_loc(maxvar), + & g_corr5_loc(maxvar),g_corr6_loc(maxvar),gsccorc(3,maxres), + & gsccorx(3,maxres),gsccor_loc(maxres),dtheta(3,2,maxres), + & gscloc(3,maxres),gsclocx(3,maxres), + & dphi(3,3,maxres),dalpha(3,3,maxres),domega(3,3,maxres),nfl,icg + double precision derx,derx_turn + common /deriv_loc/ derx(3,5,2),derx_turn(3,5,2) + double precision dXX_C1tab(3,maxres),dYY_C1tab(3,maxres), + & dZZ_C1tab(3,maxres),dXX_Ctab(3,maxres),dYY_Ctab(3,maxres), + & dZZ_Ctab(3,maxres),dXX_XYZtab(3,maxres),dYY_XYZtab(3,maxres), + & dZZ_XYZtab(3,maxres) + common /deriv_scloc/ dXX_C1tab,dYY_C1tab,dZZ_C1tab,dXX_Ctab, + & dYY_Ctab,dZZ_Ctab,dXX_XYZtab,dYY_XYZtab,dZZ_XYZtab + integer igrad_start,igrad_end,jgrad_start(maxres), + & jgrad_end(maxres) + common /mpgrad/ igrad_start,igrad_end,jgrad_start,jgrad_end diff --git a/source/unres/src_MD-NEWSC/COMMON.DISTFIT b/source/unres/src_MD-NEWSC/COMMON.DISTFIT new file mode 100644 index 0000000..683228a --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.DISTFIT @@ -0,0 +1,14 @@ +c parameter (maxres22=maxres*(maxres+1)/2) + parameter (maxres22=1) + double precision w,d0,DRDG,DD,H,XX + integer nbfrag,bfrag,nhfrag,hfrag,bvar_frag,hvar_frag,nhpb0, + 1 lvar_frag,svar_frag,avar_frag + COMMON /c_frag/ nbfrag,bfrag(4,maxres/3),nhfrag,hfrag(2,maxres/3) +csa COMMON /frag/ bvar_frag(mxio,6),hvar_frag(mxio,3), +csa 1 lvar_frag(mxio,3),svar_frag(mxio,3), +csa 2 avar_frag(mxio,5) + COMMON /WAGI/ w(MAXRES22),d0(MAXRES22) + COMMON /POCHODNE/ NX,NY,DRDG(MAXRES22,MAXRES),DD(MAXRES22), + 1 H(MAXRES,MAXRES),XX(MAXRES) + COMMON /frozen/ mask(maxres) + COMMON /store0/ nhpb0 diff --git a/source/unres/src_MD-NEWSC/COMMON.EMP b/source/unres/src_MD-NEWSC/COMMON.EMP new file mode 100644 index 0000000..5a39536 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.EMP @@ -0,0 +1,126 @@ +c! Variable Declarations +c! Charge of i-th residue, charge of j-th residue,... + INTEGER Qi, Qj, Qij, ii, jj, itypi, itypj + +c! STUFF FROM EMOMO + +c! why do *I* have to declare those guys, when it is used throughout the whole code... + REAL*8 evdw, evdw_p, evdw_m + double precision xi, yi, zi, ctail(3,2), chead(3,2) +c! FOLLOWING ARE ***NOT*** in common block!!! +c! They are here just for their declarations + REAL*8 ecl,elj,equad,epol + INTEGER istate +c! intermediates + REAL*8 c1, c2, fac, pom +c! switch in the selector choosing which electrostatic energy/gradient function to call + INTEGER isel +c! sigma factors + REAL*8 sig, sig0ij, sig1, sig2 +c! intermediates related to distance + REAL*8 rij_shift, rrij, R1, R2, RR1, RR2 +c! intermediates related to angles + REAL*8 sinth1sq, sinth2sq +c! intermediates of Fgb + REAL*8 fgb, ee, ee1, ee2, eps0, pis + +c! squares of om1, om2 and om12 (those hold cosines of angles +c! theta) + REAL*8 sqom1, sqom2, sqom12 + +c! Geometry and general stuff +c! a12sq = ai*aj from fgb which is present in Egbpol/Fgbpol, +c! Epol/Gpol and others, ee is an intermediate. +c! three dimensions for X, Y and Z Cartesians + REAL*8 a12sq + +c! square distance and cartesian distances of polar/charged heads of sidechains + REAL*8 Rhead, Rhead_distance(3), Rhead_sq +c! square distance and cartesian distances of tail(hydrophobic centre of interaction) +c! of a given pair of sidechains + REAL*8 Rtail, Rtail_distance(3) +c! intermediates used in dXhead/dXtail + REAL*8 erhead(3), ertail(3), facd1, facd2, erdxi, erdxj + +c! unit vectors used to calculate R's + REAL*8 d1sq, d2sq, d1d2 + REAL*8 d1, d2 + +c! intermediates (hold different meanining in different places) + REAL*8 bat, hawk, eagle, condor, sparrow, rosella + REAL*8 tuna(3) + +c! holds 1/eps_in - 1/eps_out which appears in EGBpol Makowski et al JPCB 2011 +c! p. 6122 + REAL*8 eps_inout_fac, eps_in + +c! DERIVATIVES +c! intermediates + Real*8 dFdR, dFdL, dFdOM1, dFdOM2, dFdOM12 +c! Kronecker Delta used for dXhead/dXtail derivatives + Real*8 kro_delta +c! Gcl + REAL*8 Gelconst + REAL*8 dGCLdR, dGCLdOM1, dGCLdOM2, dGCLdOM12 + +c! Ggbpol +c! energy + REAL*8 Egb, dGGBdFGB, dGGBdR + REAL*8 dFGBdR, alphapol1, alphapol2 + +c! Gpol + REAL*8 fgb1, fgb2 + REAL*8 dPOLdOM1, dPOLdOM2, dPOLdR1, dPOLdR2 + REAL*8 dFGBdOM1, dFGBdOM2, dFGBdR1, dFGBdR2 + REAL*8 dPOLdFGB1, dPOLdFGB2, MomoFac1, MomoFac2 + REAL*8 erhead_tail(3,2) + +c! Gisocav + REAL*8 Fisocav, dGCVdR +c! alpha parameters for Fisocav/Gisocav + REAL*8 al1, al2, al3, al4, csig + +c! Gcav +c! energy + REAL*8 Fcav +c! alphas from the equation + REAL*8 b1, b2, b3, b4 +c! intermediates + Real*8 chif, lambf, chilambf + REAL*8 top, bot, dtop, dbot, botsq + REAL*8 chis1, chis2, chis12 +c! final value + REAL*8 dCAVdOM1, dCAVdOM2, dCAVdOM12 + +c! Gquad stuff +c! intermediates + REAL*8 wqd, w1, w2, beta1 +c! final value + REAl*8 dQUADdR, dQUADdOM1, dQUADdOM2, dQUADdOM12 + +c! Glj +c! parameter, radial derivative + REAL*8 eps_head, dGLJdR + +c! Sum of states + REAL*8 BetaT, eheadtail, weightbol, sumweight +c! this thing holds intermediates and final value +c! (dimensions, gvdw(c/x)(i/j),intermediate(1) or final(2)) + REAL*8 gheadtail(3,4,2) + +c! Now Commonize what we need to + COMMON /emp/ Qi, Qj, Qij, ii, jj, itypi, itypj, xi, yi, zi + & , sqom1, sqom2, sqom12, chead, ctail + & , al1, al2, al3, al4 + & , b1, b2, b3, b4 + & , Rhead, Rhead_distance, Rtail, Rtail_distance + & , R1, R2, RR1, RR2 + & , d1sq, d2sq, d1, d2, d1d2 + & , eps_inout_fac, eps_in, wqd, eps_head, a12sq + & , chis1, chis2, chis12, sig1, sig2, sig0ij + & , BetaT + & , dFdR, dFdL, dFdOM1, dFdOM2, dFdOM12 + & , dCAVdOM1, dCAVdOM2, dCAVdOM12 + & , dGCLdOM1, dGCLdOM2, dGCLdOM12 + & , dPOLdOM1, dPOLdOM2 + & , dQUADdR, dQUADdOM1, dQUADdOM2, dQUADdOM12 \ No newline at end of file diff --git a/source/unres/src_MD-NEWSC/COMMON.FFIELD b/source/unres/src_MD-NEWSC/COMMON.FFIELD new file mode 100644 index 0000000..c8dd212 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.FFIELD @@ -0,0 +1,26 @@ +C----------------------------------------------------------------------- +C The following COMMON block selects the type of the force field used in +C calculations and defines weights of various energy terms. +C 12/1/95 wcorr added +C----------------------------------------------------------------------- + integer n_ene_comp,rescale_mode + common /ffield/ wsc,wscp,welec,wbond,wstrain,wtor,wtor_d,wang, + & wscloc,wcorr,wcorr4,wcorr5,wcorr6,wsccor,wel_loc,wturn3,wturn4, + & wturn6,wvdwpp,wsct,weights(n_ene),temp0, + & scal14,cutoff_corr,delt_corr,r0_corr,ipot,n_ene_comp, + & rescale_mode + common /potentials/ potname(6) + character*3 potname +C----------------------------------------------------------------------- +C wlong,welec,wtor,wang,wscloc are the weight of the energy terms +C corresponding to side-chain, electrostatic, torsional, valence-angle, +C and local side-chain terms. +C +C IPOT determines which SC...SC interaction potential will be used: +C 1 - LJ: 2n-n Lennard-Jones +C 2 - LJK: 2n-n Kihara type (shifted Lennard-Jones) +C 3 - BP; Berne-Pechukas (angular dependence) +C 4 - GB; Gay-Berne (angular dependence) +C 5 - GBV; Gay-Berne-Vorobjev; angularly-dependent Kihara potential +C 6 - MM; Momo's physics-based potentials +C------------------------------------------------------------------------ diff --git a/source/unres/src_MD-NEWSC/COMMON.GEO b/source/unres/src_MD-NEWSC/COMMON.GEO new file mode 100644 index 0000000..8cfbbde --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.GEO @@ -0,0 +1,2 @@ + double precision pi,dwapi,pipol,pi3,dwapi3,deg2rad,rad2deg,angmin + common /geo/ pi,dwapi,pipol,pi3,dwapi3,deg2rad,rad2deg,angmin diff --git a/source/unres/src_MD-NEWSC/COMMON.HAIRPIN b/source/unres/src_MD-NEWSC/COMMON.HAIRPIN new file mode 100644 index 0000000..f103268 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.HAIRPIN @@ -0,0 +1,5 @@ + integer nharp_seed(max_seed),nharp_tot, + & iharp_seed(4,maxres/3,max_seed),iharp_use(0:4,maxres/3,max_seed), + & nharp_use(max_seed) + common /spinka/ nharp_seed,nharp_tot,iharp_seed,iharp_use, + & nharp_use diff --git a/source/unres/src_MD-NEWSC/COMMON.HEADER b/source/unres/src_MD-NEWSC/COMMON.HEADER new file mode 100644 index 0000000..7154812 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.HEADER @@ -0,0 +1,2 @@ + character*80 titel + common /header/ titel diff --git a/source/unres/src_MD-NEWSC/COMMON.INFO b/source/unres/src_MD-NEWSC/COMMON.INFO new file mode 100644 index 0000000..4f63708 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.INFO @@ -0,0 +1,21 @@ +c NPROCS - total number of processors; +c MyID - processor's ID; +c MasterID - master processor's ID. + integer MyId,AllGrp,DontCare,MasterId,WhatsUp,ifinish + logical koniec + integer tag,status(MPI_STATUS_SIZE) + common /info/ myid,masterid,allgrp,dontcare, + & koniec(0:maxprocs-1),WhatsUp,ifinish(maxprocs-1) +c... 5/12/96 - added variables for collective communication +c FGPROCS - Number of fine-grain processors per coarse-grain task; +c NCTASKS - Number of coarse-grain tasks; +c MYGROUP - label of the processor's FG group id; +c BOSSID - ID of group's master; +c FGLIST - list of group's FG processors. +c MSGLEN_VAR - length of the vector of variables passed to the fine-grain +c slave processors + integer fgprocs,nctasks,mygroup,bossid,cglabel, + & cglist(max_cg_procs),cgGroupID,fglist(max_fg_procs), + & fgGroupID,MyRank + common /info1/ fgprocs,nctasks,mygroup,bossid,cglabel,cglist, + & cgGroupID,fglist,fgGroupID,MyRank,msglen_var diff --git a/source/unres/src_MD-NEWSC/COMMON.INTERACT b/source/unres/src_MD-NEWSC/COMMON.INTERACT new file mode 100644 index 0000000..9ac2c8b --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.INTERACT @@ -0,0 +1,45 @@ + double precision aa,bb,augm,aad,bad,app,bpp,ale6,ael3,ael6, + & chis,alphasur,sigmap1,sigmap2,alphiso,rborn,sigiso1,sigiso2, + & sig0head,epshead,wquad,dhead,dtail,wqdip,alphapol,wstate, + & epsintab,eps_out + integer expon,expon2 + integer nnt,nct,nint_gr,istart,iend,itype,itel,itypro, + & ielstart,ielend,ielstart_vdw,ielend_vdw,nscp_gr,iscpstart, + & iscpend,iatsc_s,iatsc_e, + & iatel_s,iatel_e,iatscp_s,iatscp_e,iatel_s_vdw,iatel_e_vdw, + & ispp,iscp,nstate,icharge + common /interact/aa(ntyp,ntyp),bb(ntyp,ntyp),augm(ntyp,ntyp), + & chis(ntyp,ntyp),alphasur(4,ntyp,ntyp),sigmap1(ntyp,ntyp), + & sigmap2(ntyp,ntyp),alphiso(4,ntyp,ntyp),alphapol(ntyp,ntyp), + & rborn(ntyp,ntyp),sigiso1(ntyp,ntyp),sigiso2(ntyp,ntyp), + & epshead(ntyp,ntyp),wquad(ntyp,ntyp),dhead(2,2,ntyp,ntyp), + & dtail(2,ntyp,ntyp),wqdip(2,ntyp,ntyp),epsintab(ntyp,ntyp), + & eps_out,wstate(4,ntyp,ntyp),sig0head(ntyp,ntyp), + & aad(ntyp,2),bad(ntyp,2),app(2,2),bpp(2,2),ael6(2,2),ael3(2,2), + & expon,expon2,nnt,nct,nint_gr(maxres),istart(maxres,maxint_gr), + & iend(maxres,maxint_gr),itype(maxres),itel(maxres),itypro, + & ielstart(maxres),ielend(maxres),ielstart_vdw(maxres), + & ielend_vdw(maxres),nscp_gr(maxres), + & iscpstart(maxres,maxint_gr),iscpend(maxres,maxint_gr), + & iatsc_s,iatsc_e,iatel_s,iatel_e,iatel_s_vdw,iatel_e_vdw, + & iatscp_s,iatscp_e,ispp,iscp,nstate(ntyp,ntyp) +C 12/1/95 Array EPS included in the COMMON block. + double precision eps,sigma,sigmaii,rs0,chi,chip,alp,sigma0,sigii, + & rr0,r0,r0e,r0d,rpp,epp,elpp6,elpp3,eps_scp,rscp,chipp + common /body/eps(ntyp,ntyp),sigma(0:ntyp1,0:ntyp1), + & sigmaii(ntyp,ntyp), + & icharge(ntyp), + & rs0(ntyp,ntyp),chi(ntyp,ntyp),chipp(ntyp,ntyp),chip(ntyp), + & alp(ntyp),sigma0(ntyp), + & sigii(ntyp),rr0(ntyp),r0(ntyp,ntyp),r0e(ntyp,ntyp),r0d(ntyp,2), + & rpp(2,2),epp(2,2),elpp6(2,2),elpp3(2,2),eps_scp(20,2),rscp(20,2) +c 12/5/03 modified 09/18/03 Bond stretching parameters. + double precision vbldp0,vbldsc0,akp,aksc,abond0 + integer nbondterm + common /stretch/ vbldp0,vbldsc0(maxbondterm,ntyp),akp, + & aksc(maxbondterm,ntyp),abond0(maxbondterm,ntyp),nbondterm(ntyp) + double precision wdti,wdti2,wdti4,wdti8, + & wdtii,wdtii2,wdtii4,wdtii8 + common /nosehoover_dt/ + & wdti(maxyosh),wdti2(maxyosh),wdti4(maxyosh),wdti8(maxyosh), + & wdtii(maxyosh),wdtii2(maxyosh),wdtii4(maxyosh),wdtii8(maxyosh) diff --git a/source/unres/src_MD-NEWSC/COMMON.IOUNITS b/source/unres/src_MD-NEWSC/COMMON.IOUNITS new file mode 100644 index 0000000..49b6db3 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.IOUNITS @@ -0,0 +1,69 @@ +C----------------------------------------------------------------------- +C I/O units used by the program +C----------------------------------------------------------------------- +C 9/18/99 - unit ifourier and filename fouriername included to identify +C the file from which the coefficients of second-order Fourier expansion +C of the local-interaction energy are read. +C 8/9/01 - file for SCP interaction constants named scpname (unit iscpp) +C included. +C----------------------------------------------------------------------- +C General I/O units & files + integer inp,iout,igeom,intin,ipdb,imol2,ipdbin,ithep,irotam, + & itorp,itordp,ifourier,ielep,isidep,iscpp,icbase,istat, + & ientin,ientout,izs1,isecpred,ibond,irest2,iifrag,icart, + & irest1,isccor,ithep_pdb,irotam_pdb + common /iounits/ inp,iout,igeom,intin,ipdb,imol2,ipdbin,ithep, + & irotam,itorp,itordp,ifourier,ielep,isidep,iscpp,icbase, + & istat,ientin,ientout,izs1,isecpred,ibond,irest2,iifrag, + & icart,irest1,isccor,ithep_pdb,irotam_pdb + character*256 outname,intname,pdbname,mol2name,statname,intinname, + & entname,prefix,secpred,rest2name,qname,cartname,tmpdir, + & mremd_rst_name,curdir,pref_orig + character*4 liczba + common /fnames/ outname,intname,pdbname,mol2name,statname, + & intinname,entname,prefix,pot,secpred,rest2name,qname, + & cartname,tmpdir,mremd_rst_name,curdir,pref_orig,liczba +C CSA I/O units & files + character*256 csa_rbank,csa_seed,csa_history,csa_bank, + & csa_bank1,csa_alpha,csa_alpha1,csa_bankt,csa_int, + & csa_bank_reminimized,csa_native_int,csa_in + common /csafiles/ csa_rbank,csa_seed,csa_history,csa_bank, + & csa_bank1,csa_alpha,csa_alpha1,csa_bankt,csa_int, + & csa_bank_reminimized,csa_native_int,csa_in + integer icsa_rbank,icsa_seed,icsa_history,icsa_bank, + & icsa_bank1,icsa_alpha,icsa_alpha1,icsa_bankt,icsa_int, + & icsa_bank_reminimized,icsa_native_int,icsa_in,icsa_pdb + common /csaunits/ icsa_rbank,icsa_seed,icsa_history,icsa_bank, + & icsa_bank1,icsa_alpha,icsa_alpha1,icsa_bankt,icsa_int, + & icsa_bank_reminimized,icsa_native_int,icsa_in,icsa_pdb +C Parameter files + character*256 bondname,thetname,rotname,torname,tordname, + & fouriername,elename,sidename,scpname,sccorname,patname, + & thetname_pdb,rotname_pdb + common /parfiles/ bondname,thetname,rotname,torname,tordname, + & fouriername,elename,sidename,scpname,sccorname,patname, + & thetname_pdb,rotname_pdb + character*3 pot +C----------------------------------------------------------------------- +C INP - main input file +C IOUT - list file +C IGEOM - geometry output in the form of virtual-chain internal coordinates +C INTIN - geometry input (for multiple conformation processing) in int. coords. +C IPDB - Cartesian-coordinate output in PDB format +C IMOL2 - Cartesian-coordinate output in Tripos mol2 format +C IPDBIN - PDB input file +C ITHEP - virtual-bond torsional angle parametrs +C IROTAM - side-chain geometry and local-interaction parameters +C ITORP - torsional parameters +C ITORDP - double torsional parameters +C IFOURIER - coefficients of the expansion of local-interaction energy +C IELEP - electrostatic-interaction parameters +C ISIDEP - side-chain interaction parameters. +C ISCPP - SCp interaction parameters. +C IBOND - virtual-bond constant parameters and moments of inertia. +C ISCCOR - parameters of the potential of SCCOR term +C ICBASE - data base with Cartesian coords of known structures. +C ISTAT - energies and other conf. characteristics from an MCM run. +C IENTIN - entropy from preceeding simulation(s) to be read in. +C SECPRED - SECONDARY STRUCTURE PREDICTION for dihedral constraint generation. +C----------------------------------------------------------------------- diff --git a/source/unres/src_MD-NEWSC/COMMON.LANGEVIN b/source/unres/src_MD-NEWSC/COMMON.LANGEVIN new file mode 100644 index 0000000..6a703e2 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.LANGEVIN @@ -0,0 +1,21 @@ + double precision friction(3,0:MAXRES2),stochforc(3,0:MAXRES2), + & fricmat(MAXRES2,MAXRES2),fric_work(MAXRES6), + & stoch_work(MAXRES6), + & fricgam(MAXRES6),fricvec(MAXRES2,MAXRES2), + & pfric_mat(MAXRES2,MAXRES2),vfric_mat(MAXRES2,MAXRES2), + & afric_mat(MAXRES2,MAXRES2),prand_mat(MAXRES2,MAXRES2), + & vrand_mat1(MAXRES2,MAXRES2),vrand_mat2(MAXRES2,MAXRES2), + & pfric0_mat(MAXRES2,MAXRES2,0:maxflag_stoch), + & afric0_mat(MAXRES2,MAXRES2,0:maxflag_stoch), + & vfric0_mat(MAXRES2,MAXRES2,0:maxflag_stoch), + & prand0_mat(MAXRES2,MAXRES2,0:maxflag_stoch), + & vrand0_mat1(MAXRES2,MAXRES2,0:maxflag_stoch), + & vrand0_mat2(MAXRES2,MAXRES2,0:maxflag_stoch), + & mt1(maxres2,maxres2),mt2(maxres2,maxres2),mt3(maxres2,maxres2) + logical flag_stoch(0:maxflag_stoch) + common /langforc/ friction,stochforc, + & fricmat,fric_work,fricgam,stoch_work,fricvec,vrand_mat1, + & vrand_mat2,prand_mat,vfric_mat,afric_mat,pfric_mat, + & pfric0_mat,afric0_mat,vfric0_mat,prand0_mat,vrand0_mat1, + & vrand0_mat2,flag_stoch + common /langmat/ mt1,mt2,mt3 diff --git a/source/unres/src_MD-NEWSC/COMMON.LANGEVIN.lang0 b/source/unres/src_MD-NEWSC/COMMON.LANGEVIN.lang0 new file mode 100644 index 0000000..354a0c4 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.LANGEVIN.lang0 @@ -0,0 +1,11 @@ + double precision friction(3,0:MAXRES2),stochforc(3,0:MAXRES2), + & fricmat(MAXRES2,MAXRES2),fric_work(MAXRES6), + & stoch_work(MAXRES6), + & fricgam(MAXRES6),fricvec(MAXRES2,MAXRES2) + logical flag_stoch(0:maxflag_stoch) + common /langforc/ friction,stochforc, + & fricmat,fric_work,fricgam,stoch_work,fricvec,vrand_mat1, + & vrand_mat2,prand_mat,vfric_mat,afric_mat,pfric_mat, + & pfric0_mat,afric0_mat,vfric0_mat,prand0_mat,vrand0_mat1, + & vrand0_mat2,flag_stoch + common /langmat/ mt1,mt2,mt3 diff --git a/source/unres/src_MD-NEWSC/COMMON.LOCAL b/source/unres/src_MD-NEWSC/COMMON.LOCAL new file mode 100644 index 0000000..a3f68dc --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.LOCAL @@ -0,0 +1,55 @@ + double precision a0thet,athet,bthet,polthet,gthet,theta0,sig0, + & sigc0,dsc,dsc_inv,bsc,censc,gaussc,dsc0 + integer nlob +C Parameters of the virtual-bond-angle probability distribution + common /thetas/ a0thet(ntyp),athet(2,ntyp),bthet(2,ntyp), + & polthet(0:3,ntyp),gthet(3,ntyp),theta0(ntyp),sig0(ntyp), + & sigc0(ntyp) +C Parameters of the side-chain probability distribution + common /sclocal/ dsc(ntyp1),dsc_inv(ntyp1),bsc(maxlob,ntyp), + & censc(3,maxlob,ntyp),gaussc(3,3,maxlob,ntyp),dsc0(ntyp1), + & nlob(ntyp1) +C Parameters of ab initio-derived potential of virtual-bond-angle bending + integer nthetyp,ntheterm,ntheterm2,ntheterm3,nsingle,ndouble, + & ithetyp(ntyp1),nntheterm + double precision aa0thet(maxthetyp1,maxthetyp1,maxthetyp1), + & aathet(maxtheterm,maxthetyp1,maxthetyp1,maxthetyp1), + & bbthet(maxsingle,maxtheterm2,maxthetyp1,maxthetyp1,maxthetyp1), + & ccthet(maxsingle,maxtheterm2,maxthetyp1,maxthetyp1,maxthetyp1), + & ddthet(maxsingle,maxtheterm2,maxthetyp1,maxthetyp1,maxthetyp1), + & eethet(maxsingle,maxtheterm2,maxthetyp1,maxthetyp1,maxthetyp1), + & ffthet(maxdouble,maxdouble,maxtheterm3,maxthetyp1,maxthetyp1, + & maxthetyp1), + & ggthet(maxdouble,maxdouble,maxtheterm3,maxthetyp1,maxthetyp1, + & maxthetyp1) + common /theta_abinitio/aa0thet,aathet,bbthet,ccthet,ddthet,eethet, + & ffthet, + & ggthet,ithetyp,nthetyp,ntheterm,ntheterm2,ntheterm3,nsingle, + & ndouble,nntheterm +C Virtual-bond lenghts + double precision vbl,vblinv,vblinv2,vbl_cis,vbl0,vbld_inv + integer loc_start,loc_end,ithet_start,ithet_end,iphi_start, + & iphi_end,iphid_start,iphid_end,itau_start,itau_end,ibond_start, + & ibond_end, + & ibondp_start,ibondp_end,ivec_start,ivec_end,iset_start,iset_end, + & iturn3_start,iturn3_end,iturn4_start,iturn4_end,iint_start, + & iint_end,iphi1_start,iphi1_end, + & ibond_displ(0:max_fg_procs-1),ibond_count(0:max_fg_procs-1), + & ithet_displ(0:max_fg_procs-1),ithet_count(0:max_fg_procs-1), + & iphi_displ(0:max_fg_procs-1),iphi_count(0:max_fg_procs-1), + & iphi1_displ(0:max_fg_procs-1),iphi1_count(0:max_fg_procs-1), + & ivec_displ(0:max_fg_procs-1),ivec_count(0:max_fg_procs-1), + & iset_displ(0:max_fg_procs-1),iset_count(0:max_fg_procs-1), + & iint_count(0:max_fg_procs-1),iint_displ(0:max_fg_procs-1) + common /peptbond/ vbl,vblinv,vblinv2,vbl_cis,vbl0 + common /indices/ loc_start,loc_end,ithet_start,ithet_end, + & iphi_start,iphi_end,iphid_start,iphid_end,itau_start,itau_end, + & ibond_start,ibond_end, + & ibondp_start,ibondp_end,ivec_start,ivec_end,iset_start,iset_end, + & iturn3_start,iturn3_end,iturn4_start,iturn4_end,iint_start, + & iint_end,iphi1_start,iphi1_end,iint_count,iint_displ,ivec_displ, + & ivec_count,iset_displ, + & iset_count,ibond_displ,ibond_count,ithet_displ,ithet_count, + & iphi_displ,iphi_count,iphi1_displ,iphi1_count +C Inverses of the actual virtual bond lengths + common /invlen/ vbld_inv(maxres2) diff --git a/source/unres/src_MD-NEWSC/COMMON.LOCMOVE b/source/unres/src_MD-NEWSC/COMMON.LOCMOVE new file mode 100644 index 0000000..211516d --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.LOCMOVE @@ -0,0 +1,19 @@ +c Variables (set in init routine) never modified by local_move + integer init_called + logical locmove_output + double precision min_theta, max_theta + double precision dmin2,dmax2 + double precision flag,small,small2 + + common /loc_const/ init_called,locmove_output,min_theta, + + max_theta,dmin2,dmax2,flag,small,small2 + +c Workspace for local_move + integer a_n,b_n,res_n + double precision a_ang,b_ang,res_ang + logical a_tab,b_tab,res_tab + + common /loc_work/ res_ang(0:11),a_ang(0:7),b_ang(0:3), + + res_n,res_tab(0:2,0:2,0:11), + + a_n,a_tab(0:2,0:7), + + b_n,b_tab(0:2,0:3) diff --git a/source/unres/src_MD-NEWSC/COMMON.MAP b/source/unres/src_MD-NEWSC/COMMON.MAP new file mode 100644 index 0000000..77e97e7 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.MAP @@ -0,0 +1,4 @@ + integer nmap,res1,res2,nstep + double precision ang_from,ang_to + common /mapp/ ang_from(maxvar),ang_to(maxvar),nmap,kang(maxvar), + & res1(maxvar),res2(maxvar),nstep(maxvar) diff --git a/source/unres/src_MD-NEWSC/COMMON.MAXGRAD b/source/unres/src_MD-NEWSC/COMMON.MAXGRAD new file mode 100644 index 0000000..285241a --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.MAXGRAD @@ -0,0 +1,12 @@ + double precision + & gvdwc_max,gvdwc_scp_max,gelc_max,gvdwpp_max,gradb_max,ghpbc_max, + & gradcorr_max,gel_loc_max,gcorr3_turn_max,gcorr4_turn_max, + & gradcorr5_max,gradcorr6_max,gcorr6_turn_max,gsccorc_max, + & gscloc_max,gvdwx_max,gradx_scp_max,ghpbx_max,gradxorr_max, + & gsccorx_max,gsclocx_max + common /maxgrad/ + & gvdwc_max,gvdwc_scp_max,gelc_max,gvdwpp_max,gradb_max,ghpbc_max, + & gradcorr_max,gel_loc_max,gcorr3_turn_max,gcorr4_turn_max, + & gradcorr5_max,gradcorr6_max,gcorr6_turn_max,gsccorc_max, + & gscloc_max,gvdwx_max,gradx_scp_max,ghpbx_max,gradxorr_max, + & gsccorx_max,gsclocx_max diff --git a/source/unres/src_MD-NEWSC/COMMON.MCE b/source/unres/src_MD-NEWSC/COMMON.MCE new file mode 100644 index 0000000..2d79184 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.MCE @@ -0,0 +1,13 @@ + double precision entropy(-max_ene-4:max_ene),nminima(maxsave), + & nhist(-max_ene:max_ene) + logical ent_read,multican + common /mce/ entropy,emin,emax,nhist,nminima,ent_read,multican, + & indminn,indmaxx + integer npool + double precision xpool,epool,pool_fraction + common /pool/ xpool(maxvar,max_pool),epool(max_pool), + & pool_fraction,npool + integer save_frequency,message_frequency,pool_read_freq, + & pool_save_freq,print_freq + common /mce_counters/ save_frequency,message_frequency, + & pool_read_freq,pool_save_freq,print_freq diff --git a/source/unres/src_MD-NEWSC/COMMON.MCM b/source/unres/src_MD-NEWSC/COMMON.MCM new file mode 100644 index 0000000..576f912 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.MCM @@ -0,0 +1,70 @@ +C... Following COMMON block contains general variables controlling the MC/MCM +C... procedure +c----------------------------------------------------------------------------- + double precision Tcur,Tmin,Tmax,TstepH,TstepC,RanFract, + & overlap_cut,e_up,delte + integer nstepH,nstepC,maxacc,maxgen,maxtrial,maxtrial_iter, + & maxrepm,ngen,ntrial,ntherm,nrepm,neneval,nsave,maxoverlap, + & nsave_part,max_mcm_it,nsweep,print_mc + logical print_stat,print_int + common /mcm/ Tcur,Tmin,Tmax,TstepH,TstepC,Rbol,betbol,RanFract, + & overlap_cut,e_up,delte, + & nstepH,nstepC,maxacc,maxgen,maxtrial,maxtrial_iter,maxrepm, + & maxoverlap,ntrial,max_mcm_it, + & ngen,ntherm,nrepm,neneval,nsave,nsave_part(max_cg_procs),nsweep, + & print_mc,print_stat,print_int +c----------------------------------------------------------------------------- +C... The meaning of the above variables is as follows: +C... Tcur,Tmin,Tmax - Current,minimum and maximum temperature, respectively; +C... NstepC,NStepH - Number of cooling and heating steps, respectively; +C... TstepH,TstepC - factors by which T is multiplied in order to be +C... increased or decreased. +C... betbol - Boltzmann's inverse temperature (1/(Rbol*Tcur)); +C... Rbol - the gas constant; +C... RanFract - the chance that a new conformation will be random-generated; +C... maxacc - maximum number of accepted conformations; +C... maxgen,ngen - Maximum and current number of generated conformations; +C... maxtrial,ntrial - maximum number of trials before temperature is increased +C... and current number of trials, respectively; +C... maxrepm,nrepm - maximum number of allowed minima repetition and current +C... number of minima repetitions, respectively; +C... maxoverlap - max. # of overlapping confs generated in a single iteration; +C... neneval - number of energy evaluations; +C... nsave - number of confs. in the backup array; +C... nsweep - the number of macroiterations in generating the distributions. +c------------------------------------------------------------------------------ +C... Following COMMON block contains variables controlling motion. +c------------------------------------------------------------------------------ + double precision sumpro_type,sumpro_bond + integer koniecl, Nbm,MaxSideMove,nmove,moves(-1:MaxMoveType+1), + & moves_acc(-1:MaxMoveType+1),nacc_tot,nacc_part(0:MaxProcs) + common /move/ sumpro_type(0:MaxMoveType),sumpro_bond(0:maxres), + & koniecl,Nbm,MaxSideMove,nmove,nbond_move(maxres), + & nbond_acc(maxres),moves,moves_acc + common /accept_stats/ nacc_tot,nacc_part + integer nwindow,winstart,winend,winlen + common /windows/ nwindow,winstart(maxres),winend(maxres), + & winlen(maxres) + character*16 MovTypID + common /moveID/ MovTypID(-1:MaxMoveType+1) +c------------------------------------------------------------------------------ +C... koniecl - the number of bonds to be considered "end bonds" subjected to +C... end moves; +C... Nbm - The maximum length of N-bond segment to be moved; +C... MaxSideMove - maximum number of side chains subjected to local moves +C... simultaneously; +C... nmove - the current number of attempted moves; +C... nbond_move(*) array that stores the total numbers of 2-bond,3-bond,... +C... moves; +C... nendmove - number of endmoves; +C... nbackmove - number of backbone moves; +C... nsidemove - number of local side chain moves; +C... sumpro_type(*) - array that stores the lower and upper boundary of the +C... random-number range that determines the type of move +C... (N-bond, backbone or side chain); +C... sumpro_bond(*) - array that stores the probabilities to perform bond +C... moves of consecutive segment length. +C... winstart(*) - the starting position of the perturbation window; +C... winend(*) - the end position of the perturbation window; +C... winlen(*) - length of the perturbation window; +C... nwindow - the number of perturbation windows (0 - entire chain). diff --git a/source/unres/src_MD-NEWSC/COMMON.MD b/source/unres/src_MD-NEWSC/COMMON.MD new file mode 100644 index 0000000..40131bd --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.MD @@ -0,0 +1,77 @@ + double precision gcart, gxcart, gradcag,gradxag + common /mdgrad/ gcart(3,0:MAXRES), gxcart(3,0:MAXRES), + & gradcag(3,MAXRES),gradxag(3,MAXRES) + integer dimen,dimen1, dimen3, ifrag(2,50,maxprocs/20), + & ipair(2,100,maxprocs/20),iset, + & mset(maxprocs/20),nset + double precision IP,ISC(ntyp+1),mp, + & msc(ntyp+1),d_t_work(MAXRES6), + & d_t_work_new(MAXRES6),d_t(3,0:MAXRES2),d_t_new(3,0:MAXRES2), + & d_af_work(MAXRES6),d_as_work(MAXRES6), + & d_t_old(3,0:MAXRES2),d_a_old(3,0:MAXRES2),d_a_short(3,0:MAXRES2), + & Gmat(MAXRES2,MAXRES2),Ginv(MAXRES2,MAXRES2),A(MAXRES2,MAXRES2), + & d_a(3,0:MAXRES2),d_a_work(6*MAXRES),kinetic_force(MAXRES6), + & Gsqrp(MAXRES2,MAXRES2),Gsqrm(MAXRES2,MAXRES2), + & vtot(MAXRES2),Gvec(maxres2,maxres2),Geigen(maxres2) + double precision v_ini,d_time,d_time0,t_bath,tau_bath, + & EK,potE,potEcomp(0:n_ene+4),totE,totT,amax,kinetic_T,dvmax,damax, + & edriftmax, + & eq_time,wfrag(50,maxprocs/20),wpair(100,maxprocs/20), + & qfrag(50),qpair(100), + & qinfrag(50,maxprocs/20),qinpair(100,maxprocs/20), + & Ucdfrag,Ucdpair,dUdconst(3,0:MAXRES),Uconst, + & dUdxconst(3,0:MAXRES),dqwol(3,0:MAXRES),dxqwol(3,0:MAXRES), + & utheta(maxfrag_back),ugamma(maxfrag_back),uscdiff(maxfrag_back), + & dutheta(maxres),dugamma(maxres),duscdiff(3,maxres), + & duscdiffx(3,maxres),wfrag_back(3,maxfrag_back,maxprocs/20), + & uconst_back + integer n_timestep,ntwx,ntwe,lang,count_reset_moment, + & count_reset_vel,reset_fricmat,nfrag,npair,nfrag_back, + & ifrag_back(3,maxfrag_back,maxprocs/20),ntime_split,ntime_split0, + & maxtime_split + integer nresn,nyosh,nnos + double precision glogs,qmass,vlogs,xlogs + logical large,print_compon,tbf,rest,reset_moment,reset_vel, + & surfarea,rattle,usampl,mdpdb,RESPA,tnp,tnp1,tnh,xiresp + integer igmult_start,igmult_end,my_ng_count,ng_start,ng_counts, + & nginv_start,nginv_counts,myginv_ng_count + common /back_constr/ uconst_back,utheta,ugamma,uscdiff, + & dutheta,dugamma,duscdiff,duscdiffx, + & wfrag_back,nfrag_back,ifrag_back + common /qmeas/ qfrag,qpair,qinfrag,qinpair,wfrag,wpair,eq_time, + & Ucdfrag,Ucdpair,dUdconst,dUdxconst,dqwol,dxqwol,Uconst, + & iset,mset,nset,usampl,ifrag,ipair,npair,nfrag + common /mdpar/ v_ini,d_time,d_time0,scal_fric, + & t_bath,tau_bath,dvmax,damax,n_timestep,mdpdb, + & ntime_split,ntime_split0,maxtime_split, + & ntwx,ntwe,large,print_compon,tbf,rest,tnp,tnp1,tnh + common /MDcalc/ totT,totE,potE,potEcomp,EK,amax,edriftmax, + & kinetic_T + common /lagrange/ d_t,d_t_old,d_t_new,d_t_work, + & d_t_work_new,d_a,d_a_old,d_a_work,d_af_work,d_as_work,d_a_short, + & kinetic_force, + & A,Ginv,Gmat,Gvec,Geigen,Gsqrp,Gsqrm, + & vtot,dimen,dimen1,dimen3,lang, + & reset_moment,reset_vel,count_reset_moment,count_reset_vel, + & rattle,RESPA + common /inertia/ IP,ISC,MP,MSC + double precision scal_fric,rwat,etawat,gamp, + & gamsc(ntyp),stdfp,stdfsc(ntyp),stdforcp(MAXRES), + & stdforcsc(MAXRES),pstok,restok(ntyp+1),cPoise,Rb + common /langevin/ pstok,restok,gamp,gamsc, + & stdfp,stdfsc,stdforcp,stdforcsc,rwat,etawat,cPoise,Rb,surfarea, + & reset_fricmat + common /mdpmpi/ igmult_start,igmult_end,my_ng_count, + & myginv_ng_count, + & ng_start(0:MaxProcs-1),ng_counts(0:MaxProcs-1), + & nginv_start(0:MaxProcs),nginv_counts(0:MaxProcs-1) + double precision pi_np,pistar,s_np,s12_np,Q_np,E_old,H0,E_long, + & sold_np,d_t_half,Csplit,hhh + common /nosepoincare/ pi_np,pistar,s_np,s12_np,Q_np,E_old,H0, + & E_long,sold_np,d_t_half(3,0:MAXRES2),Csplit,hhh + common /nosehoover/ glogs(maxmnh),qmass(maxmnh), + & vlogs(maxmnh),xlogs(maxmnh), + & nresn,nyosh,nnos,xiresp + integer hmc,hmc_acc + double precision dc_hmc,hmc_etot,totThmc + common /hmc_md/ dc_hmc(3,0:maxres2),hmc_etot,totThmc,hmc,hmc_acc diff --git a/source/unres/src_MD-NEWSC/COMMON.MINIM b/source/unres/src_MD-NEWSC/COMMON.MINIM new file mode 100644 index 0000000..e44f9cd --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.MINIM @@ -0,0 +1,5 @@ + double precision tolf,rtolf + integer maxfun,maxmin,minfun,minmin, + & print_min_ini,print_min_stat,print_min_res + common /minimm/ tolf,rtolf,maxfun,maxmin,minfun,minmin, + & print_min_ini,print_min_stat,print_min_res diff --git a/source/unres/src_MD-NEWSC/COMMON.MUCA b/source/unres/src_MD-NEWSC/COMMON.MUCA new file mode 100644 index 0000000..7529c15 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.MUCA @@ -0,0 +1,10 @@ + double precision emuca(4*maxres),nemuca(4*maxres), + & nemuca2(4*maxres),elow,ehigh,factor, + & elowi(maxprocs),ehighi(maxprocs),hbin, + & hist(4*maxres),factor_min + integer nmuca,imtime,muca_smooth + common /double_muca/ emuca,nemuca, + & nemuca2,elow,ehigh,factor,hbin,hist,factor_min + common /integer_muca/ nmuca,imtime,muca_smooth + common /mucarem/ elowi,ehighi + diff --git a/source/unres/src_MD-NEWSC/COMMON.NAMES b/source/unres/src_MD-NEWSC/COMMON.NAMES new file mode 100644 index 0000000..e6f926b --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.NAMES @@ -0,0 +1,7 @@ + character*3 restyp + character*1 onelet + common /names/ restyp(ntyp+1),onelet(ntyp+1) + character*10 ename,wname + integer nprint_ene,print_order + common /namterm/ ename(n_ene),wname(n_ene),nprint_ene, + & print_order(n_ene) diff --git a/source/unres/src_MD-NEWSC/COMMON.REMD b/source/unres/src_MD-NEWSC/COMMON.REMD new file mode 100644 index 0000000..b283b5b --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.REMD @@ -0,0 +1,36 @@ + integer nrep,nstex,hremd + logical remd_tlist,remd_mlist,mremdsync,restart1file,traj1file + double precision retmin,retmax,remd_t(maxprocs) + double precision hweights(maxprocs/20,n_ene) + integer remd_m(maxprocs),i_sync_step + integer*2 i2rep(0:maxprocs),i2set(0:maxprocs) + integer*2 ifirst(maxprocs) + integer*2 nupa(0:maxprocs/4,0:maxprocs), + & ndowna(0:maxprocs/4,0:maxprocs) + real t_restart1(5,maxprocs) + integer iset_restart1(maxprocs) + logical t_exchange_only + common /remdcommon/ nrep,nstex,retmin,retmax,remd_t,remd_tlist, + & remd_mlist,remd_m,mremdsync,restart1file, + & traj1file,i_sync_step,t_exchange_only + common /hamilt_remd/ hweights,hremd + common /remdrestart/ i2rep,i2set,ifirst,nupa,ndowna,t_restart1, + & iset_restart1 + real totT_cache,EK_cache,potE_cache,t_bath_cache,Uconst_cache, + & qfrag_cache,qpair_cache,c_cache,uscdiff_cache, + & ugamma_cache,utheta_cache + integer ntwx_cache,ii_write,max_cache_traj_use + common /traj1cache/ totT_cache(max_cache_traj), + & EK_cache(max_cache_traj), + & potE_cache(max_cache_traj), + & t_bath_cache(max_cache_traj), + & Uconst_cache(max_cache_traj), + & qfrag_cache(50,max_cache_traj), + & qpair_cache(100,max_cache_traj), + & ugamma_cache(maxfrag_back,max_cache_traj), + & utheta_cache(maxfrag_back,max_cache_traj), + & uscdiff_cache(maxfrag_back,max_cache_traj), + & c_cache(3,maxres2+2,max_cache_traj), + & iset_cache(max_cache_traj),ntwx_cache, + & ii_write,max_cache_traj_use + diff --git a/source/unres/src_MD-NEWSC/COMMON.SBRIDGE b/source/unres/src_MD-NEWSC/COMMON.SBRIDGE new file mode 100644 index 0000000..91dd2cd --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.SBRIDGE @@ -0,0 +1,17 @@ + double precision ss_depth,ebr,d0cm,akcm,akth,akct,v1ss,v2ss,v3ss + integer ns,nss,nfree,iss + common /sbridge/ ss_depth,ebr,d0cm,akcm,akth,akct,v1ss,v2ss,v3ss, + & ns,nss,nfree,iss(maxss) + double precision dhpb,dhpb1,forcon + integer ihpb,jhpb,nhpb,idssb,jdssb + common /links/ dhpb(maxdim),dhpb1(maxdim),forcon(maxdim), + & ihpb(maxdim),jhpb(maxdim),ibecarb(maxdim),nhpb + double precision weidis + common /restraints/ weidis + integer link_start,link_end + common /links_split/ link_start,link_end + double precision Ht,dyn_ssbond_ij + logical dyn_ss,dyn_ss_mask + common /dyn_ssbond/ dyn_ssbond_ij(maxres,maxres), + & idssb(maxdim),jdssb(maxdim), + & Ht,dyn_ss,dyn_ss_mask(maxres) diff --git a/source/unres/src_MD-NEWSC/COMMON.SCCOR b/source/unres/src_MD-NEWSC/COMMON.SCCOR new file mode 100644 index 0000000..395e4e2 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.SCCOR @@ -0,0 +1,17 @@ +cc Parameters of the SCCOR term + double precision v1sccor,v2sccor,vlor1sccor, + & vlor2sccor,vlor3sccor,gloc_sc, + & dcostau,dsintau,dtauangle,dcosomicron, + & domicron + integer nterm_sccor,isccortyp,nsccortyp,nlor_sccor + common/sccor/v1sccor(maxterm_sccor,3,20,20), + & v2sccor(maxterm_sccor,3,20,20), + & vlor1sccor(maxterm_sccor,20,20), + & vlor2sccor(maxterm_sccor,20,20), + & vlor3sccor(maxterm_sccor,20,20),gloc_sc(3,0:maxres2,10), + & v0sccor(ntyp,ntyp), + & dcostau(3,3,3,maxres2),dsintau(3,3,3,maxres2), + & dtauangle(3,3,3,maxres2),dcosomicron(3,3,3,maxres2), + & domicron(3,3,3,maxres2), + & nterm_sccor(ntyp,ntyp),isccortyp(ntyp),nsccortyp, + & nlor_sccor(ntyp,ntyp) diff --git a/source/unres/src_MD-NEWSC/COMMON.SCROT b/source/unres/src_MD-NEWSC/COMMON.SCROT new file mode 100644 index 0000000..2da7b8f --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.SCROT @@ -0,0 +1,3 @@ +C Parameters of the SC rotamers (local) term + double precision sc_parmin + common/scrot/sc_parmin(maxsccoef,20) diff --git a/source/unres/src_MD-NEWSC/COMMON.SETUP b/source/unres/src_MD-NEWSC/COMMON.SETUP new file mode 100644 index 0000000..5039116 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.SETUP @@ -0,0 +1,21 @@ + integer king,idint,idreal,idchar,is_done + parameter (king=0,idint=1105,idreal=1729,idchar=1597,is_done=1) + integer me,cg_rank,fg_rank,fg_rank1,nodes,Nprocs,nfgtasks,kolor, + & koniec(0:maxprocs-1),WhatsUp,ifinish(maxprocs-1),CG_COMM,FG_COMM, + & FG_COMM1,CONT_FROM_COMM,CONT_TO_COMM,lentyp(0:maxprocs-1), + & kolor1,key1,nfgtasks1,MyRank, + & max_gs_size + logical yourjob, finished, cgdone + common/setup/me,MyRank,cg_rank,fg_rank,fg_rank1,nodes,Nprocs, + & nfgtasks,nfgtasks1, + & max_gs_size,kolor,koniec,WhatsUp,ifinish,CG_COMM,FG_COMM, + & FG_COMM1,CONT_FROM_COMM,CONT_TO_COMM,lentyp + integer MPI_UYZ,MPI_UYZGRAD,MPI_MU,MPI_MAT1,MPI_MAT2, + & MPI_THET,MPI_GAM, + & MPI_ROTAT1(0:1),MPI_ROTAT2(0:1),MPI_ROTAT_OLD(0:1), + & MPI_PRECOMP11(0:1),MPI_PRECOMP12(0:1),MPI_PRECOMP22(0:1), + & MPI_PRECOMP23(0:1) + common /types/ MPI_UYZ,MPI_UYZGRAD,MPI_MU,MPI_MAT1,MPI_MAT2, + & MPI_THET,MPI_GAM, + & MPI_ROTAT1,MPI_ROTAT2,MPI_ROTAT_OLD,MPI_PRECOMP11,MPI_PRECOMP12, + & MPI_PRECOMP22,MPI_PRECOMP23 diff --git a/source/unres/src_MD-NEWSC/COMMON.SPLITELE b/source/unres/src_MD-NEWSC/COMMON.SPLITELE new file mode 100644 index 0000000..a2f0447 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.SPLITELE @@ -0,0 +1,2 @@ + double precision r_cut,rlamb + common /splitele/ r_cut,rlamb diff --git a/source/unres/src_MD-NEWSC/COMMON.THREAD b/source/unres/src_MD-NEWSC/COMMON.THREAD new file mode 100644 index 0000000..5c814cc --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.THREAD @@ -0,0 +1,7 @@ + integer nthread,nexcl,iexam,ipatt + double precision ener0,ener,max_time_for_thread, + & ave_time_for_thread + common /thread/ nthread,nexcl,iexam(2,maxthread), + & ipatt(2,maxthread) + common /thread1/ ener0(n_ene+2,maxthread),ener(n_ene+2,maxthread), + & max_time_for_thread,ave_time_for_thread diff --git a/source/unres/src_MD-NEWSC/COMMON.TIME1 b/source/unres/src_MD-NEWSC/COMMON.TIME1 new file mode 100644 index 0000000..d6203a6 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.TIME1 @@ -0,0 +1,28 @@ + DOUBLE PRECISION BATIME,TIMLIM,STIME,PREVTIM,SAFETY + DOUBLE PRECISION WALLTIME + INTEGER ISTOP +c FOUND_NAN - set by calcf to stop sumsl via stopx + logical FOUND_NAN + COMMON/TIME1/STIME,TIMLIM,BATIME,PREVTIM,SAFETY,WALLTIME + COMMON/STOPTIM/ISTOP + common /sumsl_flag/ FOUND_NAN + double precision t_init,t_MDsetup,t_langsetup,t_MD, + & t_enegrad,t_sdsetup,time_bcast,time_reduce,time_gather, + & time_sendrecv,time_barrier_e,time_barrier_g,time_scatter, + & t_eelecij,time_bcast7,time_bcastc,time_bcastw,time_allreduce, + & time_enecalc,time_sumene,time_lagrangian,time_cartgrad, + & time_sumgradient,time_intcartderiv,time_inttocart,time_intfcart, + & time_vec,time_mat,time_ginvmult,time_fricmatmult,time_fric, + & time_scatter_fmat,time_scatter_ginv, + & time_fsample,time_scatter_fmatmult,time_scatter_ginvmult, + & time_stoch,t_eshort,t_elong,t_etotal + common /timing/ t_init,t_MDsetup,t_langsetup, + & t_MD,t_enegrad,t_sdsetup,time_bcast,time_reduce,time_gather, + & time_sendrecv,time_scatter,time_barrier_e,time_barrier_g, + & time_bcast7,time_bcastc,time_bcastw,time_allreduce, + & t_eelecij,time_enecalc,time_sumene,time_lagrangian,time_cartgrad, + & time_sumgradient,time_intcartderiv,time_inttocart,time_intfcart, + & time_vec,time_mat,time_ginvmult,time_fricmatmult,time_fric, + & time_fsample,time_scatter_fmatmult,time_scatter_ginvmult, + & time_scatter_fmat,time_scatter_ginv, + & time_stoch,t_eshort,t_elong,t_etotal diff --git a/source/unres/src_MD-NEWSC/COMMON.TORCNSTR b/source/unres/src_MD-NEWSC/COMMON.TORCNSTR new file mode 100644 index 0000000..e4af17c --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.TORCNSTR @@ -0,0 +1,6 @@ + integer ndih_constr,idih_constr(maxdih_constr) + integer ndih_nconstr,idih_nconstr(maxdih_constr) + integer idihconstr_start,idihconstr_end + double precision phi0(maxdih_constr),drange(maxdih_constr),ftors + common /torcnstr/ phi0,drange,ftors,ndih_constr,idih_constr, + & ndih_nconstr,idih_nconstr,idihconstr_start,idihconstr_end diff --git a/source/unres/src_MD-NEWSC/COMMON.TORSION b/source/unres/src_MD-NEWSC/COMMON.TORSION new file mode 100644 index 0000000..6b6605f --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.TORSION @@ -0,0 +1,23 @@ +C Torsional constants of the rotation about virtual-bond dihedral angles + double precision v1,v2,vlor1,vlor2,vlor3,v0 + integer itortyp,ntortyp,nterm,nlor,nterm_old + common/torsion/v0(maxtor,maxtor),v1(maxterm,maxtor,maxtor), + & v2(maxterm,maxtor,maxtor),vlor1(maxlor,maxtor,maxtor), + & vlor2(maxlor,maxtor,maxtor),vlor3(maxlor,maxtor,maxtor), + & itortyp(ntyp),ntortyp,nterm(maxtor,maxtor),nlor(maxtor,maxtor) + & ,nterm_old +C 6/23/01 - constants for double torsionals + double precision v1c,v1s,v2c,v2s + integer ntermd_1,ntermd_2 + common /torsiond/ v1c(2,maxtermd_1,maxtor,maxtor,maxtor), + & v1s(2,maxtermd_1,maxtor,maxtor,maxtor), + & v2c(maxtermd_2,maxtermd_2,maxtor,maxtor,maxtor), + & v2s(maxtermd_2,maxtermd_2,maxtor,maxtor,maxtor), + & ntermd_1(maxtor,maxtor,maxtor),ntermd_2(maxtor,maxtor,maxtor) +C 9/18/99 - added Fourier coeffficients of the expansion of local energy +C surface + double precision b1,b2,cc,dd,ee,ctilde,dtilde,b2tilde + integer nloctyp + common/fourier/ b1(2,maxtor),b2(2,maxtor),cc(2,2,maxtor), + & dd(2,2,maxtor),ee(2,2,maxtor),ctilde(2,2,maxtor), + & dtilde(2,2,maxtor),b1tilde(2,maxtor),nloctyp diff --git a/source/unres/src_MD-NEWSC/COMMON.VAR b/source/unres/src_MD-NEWSC/COMMON.VAR new file mode 100644 index 0000000..edc81d7 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.VAR @@ -0,0 +1,21 @@ +C Store the geometric variables in the following COMMON block. + integer ntheta,nphi,nside,nvar,Origin,nstore,ialph,ivar, + & mask_theta,mask_phi,mask_side + double precision theta,phi,alph,omeg,varsave,esave,varall,vbld, + & thetaref,phiref,costtab,sinttab,cost2tab,sint2tab, + & xxtab,yytab,zztab,xxref,yyref,zzref,tauangle,omicron + common /var/ theta(maxres),phi(maxres),alph(maxres),omeg(maxres), + & omicron(2,maxres),tauangle(3,maxres), + & vbld(2*maxres),thetaref(maxres),phiref(maxres), + & costtab(maxres), sinttab(maxres), cost2tab(maxres), + & sint2tab(maxres),xxtab(maxres),yytab(maxres), + & zztab(maxres),xxref(maxres),yyref(maxres),zzref(maxres), + & ialph(maxres,2),ivar(4*maxres2),ntheta,nphi,nside,nvar +C Store the angles and variables corresponding to old conformations (for use +C in MCM). + common /oldgeo/ varsave(maxvar,maxsave),esave(maxsave), + & Origin(maxsave),nstore +C freeze some variables + logical mask_r + common /restr/ varall(maxvar),mask_r,mask_theta(maxres), + & mask_phi(maxres),mask_side(maxres) diff --git a/source/unres/src_MD-NEWSC/COMMON.VECTORS b/source/unres/src_MD-NEWSC/COMMON.VECTORS new file mode 100644 index 0000000..d880c24 --- /dev/null +++ b/source/unres/src_MD-NEWSC/COMMON.VECTORS @@ -0,0 +1,3 @@ + common /vectors/ uy(3,maxres),uz(3,maxres), + & uygrad(3,3,2,maxres),uzgrad(3,3,2,maxres) + diff --git a/source/unres/src_MD-NEWSC/DIMENSIONS b/source/unres/src_MD-NEWSC/DIMENSIONS new file mode 100644 index 0000000..5151ff7 --- /dev/null +++ b/source/unres/src_MD-NEWSC/DIMENSIONS @@ -0,0 +1,139 @@ +******************************************************************************** +* Settings for the program of united-residue peptide simulation in real space * +* * +* ------- As of 6/23/01 ----------- * +* * +******************************************************************************** +C Max. number of processors. + integer maxprocs + parameter (maxprocs=2048) +C Max. number of fine-grain processors + integer max_fg_procs +c parameter (max_fg_procs=maxprocs) + parameter (max_fg_procs=512) +C Max. number of coarse-grain processors + integer max_cg_procs + parameter (max_cg_procs=maxprocs) +C Max. number of AA residues + integer maxres + parameter (maxres=800) +C Appr. max. number of interaction sites + integer maxres2,maxres6,mmaxres2 + parameter (maxres2=2*maxres,maxres6=6*maxres) + parameter (mmaxres2=(maxres2*(maxres2+1)/2)) +C Max. number of variables + integer maxvar + parameter (maxvar=6*maxres) +C Max. number of groups of interactions that a given SC is involved in + integer maxint_gr + parameter (maxint_gr=2) +C Max. number of derivatives of virtual-bond and side-chain vectors in theta +C or phi. + integer maxdim + parameter (maxdim=(maxres-1)*(maxres-2)/2) +C Max. number of SC contacts + integer maxcont + parameter (maxcont=12*maxres) +C Max. number of contacts per residue + integer maxconts + parameter (maxconts=maxres/4) +c parameter (maxconts=50) +C Number of AA types (at present only natural AA's will be handled + integer ntyp,ntyp1 + parameter (ntyp=20,ntyp1=ntyp+1) +C Max. number of types of dihedral angles & multiplicity of torsional barriers +C and the number of terms in double torsionals + integer maxtor,maxterm,maxlor,maxtermd_1,maxtermd_2 + parameter (maxtor=4,maxterm=10,maxlor=3,maxtermd_1=8,maxtermd_2=8) +C Max. number of residue types and parameters in expressions for +C virtual-bond angle bending potentials + integer maxthetyp,maxthetyp1,maxtheterm,maxtheterm2,maxtheterm3, + & maxsingle,maxdouble,mmaxtheterm + parameter (maxthetyp=3,maxthetyp1=maxthetyp+1,maxtheterm=20, + & maxtheterm2=6,maxtheterm3=4,maxsingle=6,maxdouble=4, + & mmaxtheterm=maxtheterm) +c Max number of torsional terms in SCCOR + integer maxterm_sccor + parameter (maxterm_sccor=6) +C Max. number of lobes in SC distribution + integer maxlob + parameter (maxlob=4) +C Max. number of S-S bridges + integer maxss + parameter (maxss=20) +C Max. number of dihedral angle constraints + integer maxdih_constr + parameter (maxdih_constr=maxres) +C Max. number of patterns in the pattern database + integer maxseq + parameter (maxseq=10) +C Max. number of residues in a peptide in the database + integer maxres_base + parameter (maxres_base=10) +C Max. number of threading attempts + integer maxthread + parameter (maxthread=20) +C Max. number of move types in MCM + integer maxmovetype + parameter (maxmovetype=4) +C Max. number of stored confs. in MC/MCM simulation + integer maxsave + parameter (maxsave=20) +C Max. number of energy intervals + integer max_ene + parameter (max_ene=10) +C Max. number of conformations in Master's cache array + integer max_cache + parameter (max_cache=10) +C Max. number of conformations in the pool + integer max_pool + parameter (max_pool=10) +C Number of energy components + integer n_ene,n_ene2 + parameter (n_ene=23,n_ene2=2*n_ene) +C Number of threads in deformation + integer max_thread,max_thread2 + parameter (max_thread=4,max_thread2=2*max_thread) +C Number of structures to compare at t=0 + integer max_threadss,max_threadss2 + parameter (max_threadss=8,max_threadss2=2*max_threadss) +C Maxmimum number of angles per residue + integer mxang + parameter (mxang=4) +C Maximum number of groups of angles + integer mxgr + parameter (mxgr=2*maxres) +C Maximum number of chains + integer mxch + parameter (mxch=1) +csaC Maximum number of generated conformations +csa integer mxio +csa parameter (mxio=2) +csaC Maximum number of n7 generated conformations +csa integer mxio2 +csa parameter (mxio2=2) +csaC Maximum number of moves (n1-n8) +csa integer mxmv +csa parameter (mxmv=18) +csaC Maximum number of seed +csa integer max_seed +csa parameter (max_seed=1) +C Maximum number of timesteps for which stochastic MD matrices can be stored + integer maxflag_stoch + parameter (maxflag_stoch=0) +C Maximum number of backbone fragments in restraining + integer maxfrag_back + parameter (maxfrag_back=4) +C Maximum number of SC local term fitting function coefficiants + integer maxsccoef + parameter (maxsccoef=65) +C Maximum number of terms in SC bond-stretching potential + integer maxbondterm + parameter (maxbondterm=3) +C Maximum number of conformation stored in cache on each CPU before sending +C to master; depends on nstex / ntwx ratio + integer max_cache_traj + parameter (max_cache_traj=10) +C Nose-Hoover chain - chain length and order of Yoshida algorithm + integer maxmnh,maxyosh + parameter(maxmnh=10,maxyosh=5) diff --git a/source/unres/src_MD-NEWSC/DIMENSIONS.2100 b/source/unres/src_MD-NEWSC/DIMENSIONS.2100 new file mode 100644 index 0000000..ea1d287 --- /dev/null +++ b/source/unres/src_MD-NEWSC/DIMENSIONS.2100 @@ -0,0 +1,80 @@ +******************************************************************************** +* Settings for the program of united-residue peptide simulation in real space * +* * +* ------- As of 6/23/01 ----------- * +* * +******************************************************************************** +C Max. number of processors. + parameter (maxprocs=2100) +C Max. number of fine-grain processors + parameter (max_fg_procs=maxprocs) +C Max. number of coarse-grain processors + parameter (max_cg_procs=maxprocs) +C Max. number of AA residues + parameter (maxres=150) +C Appr. max. number of interaction sites + parameter (maxres2=2*maxres,maxres6=6*maxres) + parameter (mmaxres6=(maxres6*(maxres6+1)/2)) +C Max. number of variables + parameter (maxvar=6*maxres) +C Max. number of groups of interactions that a given SC is involved in + parameter (maxint_gr=2) +C Max. number of derivatives of virtual-bond and side-chain vectors in theta +C or phi. + parameter (maxdim=(maxres-1)*(maxres-2)/2) +C Max. number of SC contacts + parameter (maxcont=12*maxres) +C Max. number of contacts per residue + parameter (maxconts=maxres) +C Number of AA types (at present only natural AA's will be handled + parameter (ntyp=20,ntyp1=ntyp+1) +C Max. number of types of dihedral angles & multiplicity of torsional barriers +C and the number of terms in double torsionals + parameter (maxtor=4,maxterm=10,maxlor=3,maxtermd_1=8,maxtermd_2=8) +C Max. number of lobes in SC distribution + parameter (maxlob=4) +C Max. number of S-S bridges + parameter (maxss=20) +C Max. number of dihedral angle constraints + parameter (maxdih_constr=maxres) +C Max. number of patterns in the pattern database + parameter (maxseq=10) +C Max. number of residues in a peptide in the database + parameter (maxres_base=10) +C Max. number of threading attempts + parameter (maxthread=20) +C Max. number of move types in MCM + parameter (maxmovetype=4) +C Max. number of stored confs. in MC/MCM simulation + parameter (maxsave=20) +C Max. number of energy intervals + parameter (max_ene=10) +C Max. number of conformations in Master's cache array + parameter (max_cache=10) +C Max. number of conformations in the pool + parameter (max_pool=10) +C Number of energy components + parameter (n_ene=21,n_ene2=2*n_ene) +C Number of threads in deformation + integer max_thread,max_thread2 + parameter (max_thread=4,max_thread2=2*max_thread) +C Number of structures to compare at t=0 + integer max_threadss,max_threadss2 + parameter (max_threadss=8,max_threadss2=2*max_threadss) +C Maxmimum number of angles per residue + parameter (mxang=4) +C Maximum number of groups of angles + parameter (mxgr=2*maxres) +C Maximum number of chains + parameter (mxch=1) +C Maximum number of generated conformations + parameter (mxio=2) +C Maximum number of n7 generated conformations + parameter (mxio2=2) +C Maximum number of moves (n1-n8) + parameter (mxmv=18) +C Maximum number of seed + parameter (max_seed=1) +C Maximum number of timesteps for which stochastic MD matrices can be stored + integer maxflag_stoch + parameter (maxflag_stoch=0) diff --git a/source/unres/src_MD-NEWSC/DIMENSIONS.4100 b/source/unres/src_MD-NEWSC/DIMENSIONS.4100 new file mode 100644 index 0000000..a4558b9 --- /dev/null +++ b/source/unres/src_MD-NEWSC/DIMENSIONS.4100 @@ -0,0 +1,80 @@ +******************************************************************************** +* Settings for the program of united-residue peptide simulation in real space * +* * +* ------- As of 6/23/01 ----------- * +* * +******************************************************************************** +C Max. number of processors. + parameter (maxprocs=4100) +C Max. number of fine-grain processors + parameter (max_fg_procs=maxprocs) +C Max. number of coarse-grain processors + parameter (max_cg_procs=maxprocs) +C Max. number of AA residues + parameter (maxres=150) +C Appr. max. number of interaction sites + parameter (maxres2=2*maxres,maxres6=6*maxres) + parameter (mmaxres6=(maxres6*(maxres6+1)/2)) +C Max. number of variables + parameter (maxvar=6*maxres) +C Max. number of groups of interactions that a given SC is involved in + parameter (maxint_gr=2) +C Max. number of derivatives of virtual-bond and side-chain vectors in theta +C or phi. + parameter (maxdim=(maxres-1)*(maxres-2)/2) +C Max. number of SC contacts + parameter (maxcont=12*maxres) +C Max. number of contacts per residue + parameter (maxconts=maxres) +C Number of AA types (at present only natural AA's will be handled + parameter (ntyp=20,ntyp1=ntyp+1) +C Max. number of types of dihedral angles & multiplicity of torsional barriers +C and the number of terms in double torsionals + parameter (maxtor=4,maxterm=10,maxlor=3,maxtermd_1=8,maxtermd_2=8) +C Max. number of lobes in SC distribution + parameter (maxlob=4) +C Max. number of S-S bridges + parameter (maxss=20) +C Max. number of dihedral angle constraints + parameter (maxdih_constr=maxres) +C Max. number of patterns in the pattern database + parameter (maxseq=10) +C Max. number of residues in a peptide in the database + parameter (maxres_base=10) +C Max. number of threading attempts + parameter (maxthread=20) +C Max. number of move types in MCM + parameter (maxmovetype=4) +C Max. number of stored confs. in MC/MCM simulation + parameter (maxsave=20) +C Max. number of energy intervals + parameter (max_ene=10) +C Max. number of conformations in Master's cache array + parameter (max_cache=10) +C Max. number of conformations in the pool + parameter (max_pool=10) +C Number of energy components + parameter (n_ene=21,n_ene2=2*n_ene) +C Number of threads in deformation + integer max_thread,max_thread2 + parameter (max_thread=4,max_thread2=2*max_thread) +C Number of structures to compare at t=0 + integer max_threadss,max_threadss2 + parameter (max_threadss=8,max_threadss2=2*max_threadss) +C Maxmimum number of angles per residue + parameter (mxang=4) +C Maximum number of groups of angles + parameter (mxgr=2*maxres) +C Maximum number of chains + parameter (mxch=1) +C Maximum number of generated conformations + parameter (mxio=2) +C Maximum number of n7 generated conformations + parameter (mxio2=2) +C Maximum number of moves (n1-n8) + parameter (mxmv=18) +C Maximum number of seed + parameter (max_seed=1) +C Maximum number of timesteps for which stochastic MD matrices can be stored + integer maxflag_stoch + parameter (maxflag_stoch=0) diff --git a/source/unres/src_MD-NEWSC/MD_A-MTS.F b/source/unres/src_MD-NEWSC/MD_A-MTS.F new file mode 100644 index 0000000..95f174d --- /dev/null +++ b/source/unres/src_MD-NEWSC/MD_A-MTS.F @@ -0,0 +1,3461 @@ + subroutine MD +c------------------------------------------------ +c The driver for molecular dynamics subroutines +c------------------------------------------------ + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" + integer IERROR,ERRCODE +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision cm(3),L(3),vcm(3) +#ifdef VOUT + double precision v_work(maxres6),v_transf(maxres6) +#endif + integer ilen,rstcount + external ilen + character*50 tytul + common /gucio/ cm + integer itime +c +#ifdef MPI + if (ilen(tmpdir).gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_" + & //liczba(:ilen(liczba))//'.rst') +#else + if (ilen(tmpdir).gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_"//'.rst') +#endif + t_MDsetup=0.0d0 + t_langsetup=0.0d0 + t_MD=0.0d0 + t_enegrad=0.0d0 + t_sdsetup=0.0d0 + write (iout,'(20(1h=),a20,20(1h=))') "MD calculation started" +#ifdef MPI + tt0=MPI_Wtime() +#else + tt0 = tcpu() +#endif +c Determine the inverse of the inertia matrix. + call setup_MD_matrices +c Initialize MD + call init_MD +#ifdef MPI + t_MDsetup = MPI_Wtime()-tt0 +#else + t_MDsetup = tcpu()-tt0 +#endif + rstcount=0 +c Entering the MD loop +#ifdef MPI + tt0 = MPI_Wtime() +#else + tt0 = tcpu() +#endif + if (lang.eq.2 .or. lang.eq.3) then +#ifndef LANG0 + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif + do i=1,dimen3 + do j=1,dimen3 + pfric0_mat(i,j,0)=pfric_mat(i,j) + afric0_mat(i,j,0)=afric_mat(i,j) + vfric0_mat(i,j,0)=vfric_mat(i,j) + prand0_mat(i,j,0)=prand_mat(i,j) + vrand0_mat1(i,j,0)=vrand_mat1(i,j) + vrand0_mat2(i,j,0)=vrand_mat2(i,j) + enddo + enddo + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo +#else + write (iout,*) + & "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0" +#ifdef MPI + call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) +#endif + stop +#endif + else if (lang.eq.1 .or. lang.eq.4) then + call setup_fricmat + endif +#ifdef MPI + t_langsetup=MPI_Wtime()-tt0 + tt0=MPI_Wtime() +#else + t_langsetup=tcpu()-tt0 + tt0=tcpu() +#endif + do itime=1,n_timestep + rstcount=rstcount+1 + if (lang.gt.0 .and. surfarea .and. + & mod(itime,reset_fricmat).eq.0) then + if (lang.eq.2 .or. lang.eq.3) then +#ifndef LANG0 + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif + do i=1,dimen3 + do j=1,dimen3 + pfric0_mat(i,j,0)=pfric_mat(i,j) + afric0_mat(i,j,0)=afric_mat(i,j) + vfric0_mat(i,j,0)=vfric_mat(i,j) + prand0_mat(i,j,0)=prand_mat(i,j) + vrand0_mat1(i,j,0)=vrand_mat1(i,j) + vrand0_mat2(i,j,0)=vrand_mat2(i,j) + enddo + enddo + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo +#endif + else if (lang.eq.1 .or. lang.eq.4) then + call setup_fricmat + endif + write (iout,'(a,i10)') + & "Friction matrix reset based on surface area, itime",itime + endif + if (reset_vel .and. tbf .and. lang.eq.0 + & .and. mod(itime,count_reset_vel).eq.0) then + call random_vel + write(iout,'(a,f20.2)') + & "Velocities reset to random values, time",totT + do i=0,2*nres + do j=1,3 + d_t_old(j,i)=d_t(j,i) + enddo + enddo + endif + if (reset_moment .and. mod(itime,count_reset_moment).eq.0) then + call inertia_tensor + call vcm_vel(vcm) + do j=1,3 + d_t(j,0)=d_t(j,0)-vcm(j) + enddo + call kinetic(EK) + kinetic_T=2.0d0/(dimen3*Rb)*EK + scalfac=dsqrt(T_bath/kinetic_T) + write(iout,'(a,f20.2)') "Momenta zeroed out, time",totT + do i=0,2*nres + do j=1,3 + d_t_old(j,i)=scalfac*d_t(j,i) + enddo + enddo + endif + if (lang.ne.4) then + if (RESPA) then +c Time-reversible RESPA algorithm +c (Tuckerman et al., J. Chem. Phys., 97, 1990, 1992) + call RESPA_step(itime) + else +c Variable time step algorithm. + call velverlet_step(itime) + endif + else +#ifdef BROWN + call brown_step(itime) +#else + print *,"Brown dynamics not here!" +#ifdef MPI + call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) +#endif + stop +#endif + endif + if (ntwe.ne.0) then + if (mod(itime,ntwe).eq.0) call statout(itime) +#ifdef VOUT + do j=1,3 + v_work(j)=d_t(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + ind=ind+1 + v_work(ind)=d_t(j,i) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + ind=ind+1 + v_work(ind)=d_t(j,i+nres) + enddo + endif + enddo + + write (66,'(80f10.5)') + & ((d_t(j,i),j=1,3),i=0,nres-1),((d_t(j,i+nres),j=1,3),i=1,nres) + do i=1,ind + v_transf(i)=0.0d0 + do j=1,ind + v_transf(i)=v_transf(i)+gvec(j,i)*v_work(j) + enddo + v_transf(i)= v_transf(i)*dsqrt(geigen(i)) + enddo + write (67,'(80f10.5)') (v_transf(i),i=1,ind) +#endif + endif + if (mod(itime,ntwx).eq.0) then + write (tytul,'("time",f8.2)') totT + if(mdpdb) then + call pdbout(potE,tytul,ipdb) + else + call cartout(totT) + endif + endif + if (rstcount.eq.1000.or.itime.eq.n_timestep) then + open(irest2,file=rest2name,status='unknown') + write(irest2,*) totT,EK,potE,totE,t_bath + do i=1,2*nres + write (irest2,'(3e15.5)') (d_t(j,i),j=1,3) + enddo + do i=1,2*nres + write (irest2,'(3e15.5)') (dc(j,i),j=1,3) + enddo + close(irest2) + rstcount=0 + endif + enddo +#ifdef MPI + t_MD=MPI_Wtime()-tt0 +#else + t_MD=tcpu()-tt0 +#endif + write (iout,'(//35(1h=),a10,35(1h=)/10(/a40,1pe15.5))') + & ' Timing ', + & 'MD calculations setup:',t_MDsetup, + & 'Energy & gradient evaluation:',t_enegrad, + & 'Stochastic MD setup:',t_langsetup, + & 'Stochastic MD step setup:',t_sdsetup, + & 'MD steps:',t_MD + write (iout,'(/28(1h=),a25,27(1h=))') + & ' End of MD calculation ' +#ifdef TIMING_ENE + write (iout,*) "time for etotal",t_etotal," elong",t_elong, + & " eshort",t_eshort + write (iout,*) "time_fric",time_fric," time_stoch",time_stoch, + & " time_fricmatmult",time_fricmatmult," time_fsample ", + & time_fsample +#endif + return + end +c------------------------------------------------------------------------------- + subroutine velverlet_step(itime) +c------------------------------------------------------------------------------- +c Perform a single velocity Verlet step; the time step can be rescaled if +c increments in accelerations exceed the threshold +c------------------------------------------------------------------------------- + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer ierror,ierrcode +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + include 'COMMON.MUCA' + double precision vcm(3),incr(3) + double precision cm(3),L(3) + integer ilen,count,rstcount + external ilen + character*50 tytul + integer maxcount_scale /20/ + common /gucio/ cm + double precision stochforcvec(MAXRES6) + common /stochcalc/ stochforcvec + integer itime + logical scale + double precision HNose1,HNose,HNose_nh,H,vtnp(maxres6) + double precision vtnp_(maxres6),vtnp_a(maxres6) +c + scale=.true. + icount_scale=0 + if (lang.eq.1) then + call sddir_precalc + else if (lang.eq.2 .or. lang.eq.3) then +#ifndef LANG0 + call stochastic_force(stochforcvec) +#else + write (iout,*) + & "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0" +#ifdef MPI + call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) +#endif + stop +#endif + endif + itime_scal=0 + do while (scale) + icount_scale=icount_scale+1 + if (icount_scale.gt.maxcount_scale) then + write (iout,*) + & "ERROR: too many attempts at scaling down the time step. ", + & "amax=",amax,"epdrift=",epdrift, + & "damax=",damax,"edriftmax=",edriftmax, + & "d_time=",d_time + call flush(iout) +#ifdef MPI + call MPI_Abort(MPI_COMM_WORLD,IERROR,IERRCODE) +#endif + stop + endif +c First step of the velocity Verlet algorithm + if (lang.eq.2) then +#ifndef LANG0 + call sd_verlet1 +#endif + else if (lang.eq.3) then +#ifndef LANG0 + call sd_verlet1_ciccotti +#endif + else if (lang.eq.1) then + call sddir_verlet1 + else if (tnp1) then + call tnp1_step1 + else if (tnp) then + call tnp_step1 + else + if (tnh) then + call nhcint(EK,scale_nh,wdti,wdti2,wdti4,wdti8) + do i=0,2*nres + do j=1,3 + d_t_old(j,i)=d_t_old(j,i)*scale_nh + enddo + enddo + endif + call verlet1 + endif +c Build the chain from the newly calculated coordinates + call chainbuild_cart + if (rattle) call rattle1 + if (ntwe.ne.0) then + if (large.and. mod(itime,ntwe).eq.0) then + write (iout,*) "Cartesian and internal coordinates: step 1" + call cartprint + call intout + write (iout,*) "dC" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3), + & (dc(j,i+nres),j=1,3) + enddo + write (iout,*) "Accelerations" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3), + & (d_a(j,i+nres),j=1,3) + enddo + write (iout,*) "Velocities, step 1" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3), + & (d_t(j,i+nres),j=1,3) + enddo + endif + endif +#ifdef MPI + tt0 = MPI_Wtime() +#else + tt0 = tcpu() +#endif +c Calculate energy and forces + call zerograd + call etotal(potEcomp) +#ifdef TIMING_ENE +#ifdef MPI + t_etotal=t_etotal+MPI_Wtime()-tt0 +#else + t_etotal=t_etotal+tcpu()-tt0 +#endif +#endif + E_old=potE + potE=potEcomp(0)-potEcomp(20) + call cartgrad +c Get the new accelerations + call lagrangian +#ifdef MPI + t_enegrad=t_enegrad+MPI_Wtime()-tt0 +#else + t_enegrad=t_enegrad+tcpu()-tt0 +#endif +c Determine maximum acceleration and scale down the timestep if needed + call max_accel + amax=amax/(itime_scal+1)**2 + call predict_edrift(epdrift) + if (amax/(itime_scal+1).gt.damax .or. epdrift.gt.edriftmax) then +c Maximum acceleration or maximum predicted energy drift exceeded, rescale the time step + scale=.true. + ifac_time=dmax1(dlog(amax/damax),dlog(epdrift/edriftmax)) + & /dlog(2.0d0)+1 + itime_scal=itime_scal+ifac_time +c fac_time=dmin1(damax/amax,0.5d0) + fac_time=0.5d0**ifac_time + d_time=d_time*fac_time + if (lang.eq.2 .or. lang.eq.3) then +#ifndef LANG0 +c write (iout,*) "Calling sd_verlet_setup: 1" +c Rescale the stochastic forces and recalculate or restore +c the matrices of tinker integrator + if (itime_scal.gt.maxflag_stoch) then + if (large) write (iout,'(a,i5,a)') + & "Calculate matrices for stochastic step;", + & " itime_scal ",itime_scal + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif + write (iout,'(2a,i3,a,i3,1h.)') + & "Warning: cannot store matrices for stochastic", + & " integration because the index",itime_scal, + & " is greater than",maxflag_stoch + write (iout,'(2a)')"Increase MAXFLAG_STOCH or use direct", + & " integration Langevin algorithm for better efficiency." + else if (flag_stoch(itime_scal)) then + if (large) write (iout,'(a,i5,a,l1)') + & "Restore matrices for stochastic step; itime_scal ", + & itime_scal," flag ",flag_stoch(itime_scal) + do i=1,dimen3 + do j=1,dimen3 + pfric_mat(i,j)=pfric0_mat(i,j,itime_scal) + afric_mat(i,j)=afric0_mat(i,j,itime_scal) + vfric_mat(i,j)=vfric0_mat(i,j,itime_scal) + prand_mat(i,j)=prand0_mat(i,j,itime_scal) + vrand_mat1(i,j)=vrand0_mat1(i,j,itime_scal) + vrand_mat2(i,j)=vrand0_mat2(i,j,itime_scal) + enddo + enddo + else + if (large) write (iout,'(2a,i5,a,l1)') + & "Calculate & store matrices for stochastic step;", + & " itime_scal ",itime_scal," flag ",flag_stoch(itime_scal) + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif + flag_stoch(ifac_time)=.true. + do i=1,dimen3 + do j=1,dimen3 + pfric0_mat(i,j,itime_scal)=pfric_mat(i,j) + afric0_mat(i,j,itime_scal)=afric_mat(i,j) + vfric0_mat(i,j,itime_scal)=vfric_mat(i,j) + prand0_mat(i,j,itime_scal)=prand_mat(i,j) + vrand0_mat1(i,j,itime_scal)=vrand_mat1(i,j) + vrand0_mat2(i,j,itime_scal)=vrand_mat2(i,j) + enddo + enddo + endif + fac_time=1.0d0/dsqrt(fac_time) + do i=1,dimen3 + stochforcvec(i)=fac_time*stochforcvec(i) + enddo +#endif + else if (lang.eq.1) then +c Rescale the accelerations due to stochastic forces + fac_time=1.0d0/dsqrt(fac_time) + do i=1,dimen3 + d_as_work(i)=d_as_work(i)*fac_time + enddo + endif + if (large) write (iout,'(a,i10,a,f8.6,a,i3,a,i3)') + & "itime",itime," Timestep scaled down to ", + & d_time," ifac_time",ifac_time," itime_scal",itime_scal + else +c Second step of the velocity Verlet algorithm + if (lang.eq.2) then +#ifndef LANG0 + call sd_verlet2 +#endif + else if (lang.eq.3) then +#ifndef LANG0 + call sd_verlet2_ciccotti +#endif + else if (lang.eq.1) then + call sddir_verlet2 + else if (tnp1) then + call tnp1_step2 + else if (tnp) then + call tnp_step2 + else + call verlet2 + if (tnh) then + call kinetic(EK) + call nhcint(EK,scale_nh,wdti,wdti2,wdti4,wdti8) + do i=0,2*nres + do j=1,3 + d_t(j,i)=d_t(j,i)*scale_nh + enddo + enddo + endif + endif + if (rattle) call rattle2 + totT=totT+d_time + if (d_time.ne.d_time0) then + d_time=d_time0 +#ifndef LANG0 + if (lang.eq.2 .or. lang.eq.3) then + if (large) write (iout,'(a)') + & "Restore original matrices for stochastic step" +c write (iout,*) "Calling sd_verlet_setup: 2" +c Restore the matrices of tinker integrator if the time step has been restored + do i=1,dimen3 + do j=1,dimen3 + pfric_mat(i,j)=pfric0_mat(i,j,0) + afric_mat(i,j)=afric0_mat(i,j,0) + vfric_mat(i,j)=vfric0_mat(i,j,0) + prand_mat(i,j)=prand0_mat(i,j,0) + vrand_mat1(i,j)=vrand0_mat1(i,j,0) + vrand_mat2(i,j)=vrand0_mat2(i,j,0) + enddo + enddo + endif +#endif + endif + scale=.false. + endif + enddo +c Calculate the kinetic and the total energy and the kinetic temperature + if (tnp .or. tnp1) then + do i=0,2*nres + do j=1,3 + d_t_old(j,i)=d_t(j,i) + d_t(j,i)=d_t(j,i)/s_np + enddo + enddo + endif + call kinetic(EK) + totE=EK+potE +c diagnostics +c call kinetic1(EK1) +c write (iout,*) "step",itime," EK",EK," EK1",EK1 +c end diagnostics +c Couple the system to Berendsen bath if needed + if (tbf .and. lang.eq.0) then + call verlet_bath + endif + kinetic_T=2.0d0/(dimen3*Rb)*EK +c Backup the coordinates, velocities, and accelerations + do i=0,2*nres + do j=1,3 + dc_old(j,i)=dc(j,i) + if(.not.(tnp .or. tnp1)) d_t_old(j,i)=d_t(j,i) + d_a_old(j,i)=d_a(j,i) + enddo + enddo + if (ntwe.ne.0) then + if (mod(itime,ntwe).eq.0) then + + if(tnp .or. tnp1) then + HNose1=Hnose(EK,s_np,potE,pi_np,Q_np,t_bath,dimen3) + H=(HNose1-H0)*s_np +cd write (iout,'(a,10f)') "hhh",EK,s_np,potE,pi_np,H0 +cd & ,EK+potE+pi_np**2/(2*Q_np)+dimen3*0.001986d0*t_bath*log(s_np) +cd write (iout,*) "HHH H=",H,abs(HNose1-H0)/H0 + hhh=h + endif + + if(tnh) then + HNose1=Hnose_nh(EK,potE) + H=HNose1-H0 + hhh=h +cd write (iout,*) "HHH H=",H,abs(HNose1-H0)/H0 + endif + + if (large) then + itnp=0 + do j=1,3 + itnp=itnp+1 + vtnp(itnp)=d_t(j,0) + enddo + do i=nnt,nct-1 + do j=1,3 + itnp=itnp+1 + vtnp(itnp)=d_t(j,i) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + itnp=itnp+1 + vtnp(itnp)=d_t(j,inres) + enddo + endif + enddo + +c Transform velocities from UNRES coordinate space to cartesian and Gvec +c eigenvector space + + do i=1,dimen3 + vtnp_(i)=0.0d0 + vtnp_a(i)=0.0d0 + do j=1,dimen3 + vtnp_(i)=vtnp_(i)+Gvec(j,i)*vtnp(j) + vtnp_a(i)=vtnp_a(i)+A(i,j)*vtnp(j) + enddo + vtnp_(i)=vtnp_(i)*dsqrt(geigen(i)) + enddo + + do i=1,dimen3 + write (iout,'("WWW",i3,3f10.5)') i,vtnp(i),vtnp_(i),vtnp_a(i) + enddo + + write (iout,*) "Velocities, step 2" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3), + & (d_t(j,i+nres),j=1,3) + enddo + endif + endif + endif + return + end +c------------------------------------------------------------------------------- + subroutine RESPA_step(itime) +c------------------------------------------------------------------------------- +c Perform a single RESPA step. +c------------------------------------------------------------------------------- + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer IERROR,ERRCODE +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision energia_short(0:n_ene), + & energia_long(0:n_ene) + double precision cm(3),L(3),vcm(3),incr(3) + double precision dc_old0(3,0:maxres2),d_t_old0(3,0:maxres2), + & d_a_old0(3,0:maxres2) + integer ilen,count,rstcount + external ilen + character*50 tytul + integer maxcount_scale /10/ + common /gucio/ cm,energia_short + double precision stochforcvec(MAXRES6) + common /stochcalc/ stochforcvec + integer itime + logical scale + double precision vtnp(maxres6), vtnp_(maxres6), vtnp_a(maxres6) + common /cipiszcze/ itt + itt=itime + if (ntwe.ne.0) then + if (large.and. mod(itime,ntwe).eq.0) then + write (iout,*) "***************** RESPA itime",itime + write (iout,*) "Cartesian and internal coordinates: step 0" +c call cartprint + call pdbout(0.0d0,"cipiszcze",iout) + call intout + write (iout,*) "Accelerations from long-range forces" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3), + & (d_a(j,i+nres),j=1,3) + enddo + write (iout,*) "Velocities, step 0" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3), + & (d_t(j,i+nres),j=1,3) + enddo + endif + endif +c +c Perform the initial RESPA step (increment velocities) +c write (iout,*) "*********************** RESPA ini" + if (tnp1) then + call tnp_respa_step1 + else if (tnp) then + call tnp_respa_step1 + else + if (tnh.and..not.xiresp) then + call nhcint(EK,scale_nh,wdti,wdti2,wdti4,wdti8) + do i=0,2*nres + do j=1,3 + d_t(j,i)=d_t(j,i)*scale_nh + enddo + enddo + endif + call RESPA_vel + endif + +cd if(tnp .or. tnp1) then +cd write (iout,'(a,3f)') "EE1 NP S, pi",totT, s_np, pi_np +cd endif + + if (ntwe.ne.0) then + if (mod(itime,ntwe).eq.0 .and. large) then + write (iout,*) "Velocities, end" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3), + & (d_t(j,i+nres),j=1,3) + enddo + endif + endif +c Compute the short-range forces +#ifdef MPI + tt0 =MPI_Wtime() +#else + tt0 = tcpu() +#endif +C 7/2/2009 commented out +c call zerograd +c call etotal_short(energia_short) + if (tnp.or.tnp1) potE=energia_short(0) +c call cartgrad +c call lagrangian +C 7/2/2009 Copy accelerations due to short-lange forces from previous MD step + do i=0,2*nres + do j=1,3 + d_a(j,i)=d_a_short(j,i) + enddo + enddo + if (ntwe.ne.0) then + if (large.and. mod(itime,ntwe).eq.0) then + write (iout,*) "energia_short",energia_short(0) + write (iout,*) "Accelerations from short-range forces" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3), + & (d_a(j,i+nres),j=1,3) + enddo + endif + endif +#ifdef MPI + t_enegrad=t_enegrad+MPI_Wtime()-tt0 +#else + t_enegrad=t_enegrad+tcpu()-tt0 +#endif + do i=0,2*nres + do j=1,3 + dc_old(j,i)=dc(j,i) + if(.not.(tnp .or. tnp1)) d_t_old(j,i)=d_t(j,i) + d_a_old(j,i)=d_a(j,i) + enddo + enddo +c 6/30/08 A-MTS: attempt at increasing the split number + do i=0,2*nres + do j=1,3 + dc_old0(j,i)=dc_old(j,i) + d_t_old0(j,i)=d_t_old(j,i) + d_a_old0(j,i)=d_a_old(j,i) + enddo + enddo + if (ntime_split.gt.ntime_split0) ntime_split=ntime_split/2 + if (ntime_split.lt.ntime_split0) ntime_split=ntime_split0 +c + scale=.true. + d_time0=d_time + do while (scale) + + scale=.false. +c write (iout,*) "itime",itime," ntime_split",ntime_split +c Split the time step + d_time=d_time0/ntime_split +c Perform the short-range RESPA steps (velocity Verlet increments of +c positions and velocities using short-range forces) +c write (iout,*) "*********************** RESPA split" + do itsplit=1,ntime_split + if (lang.eq.1) then + call sddir_precalc + else if (lang.eq.2 .or. lang.eq.3) then +#ifndef LANG0 + call stochastic_force(stochforcvec) +#else + write (iout,*) + & "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0" +#ifdef MPI + call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) +#endif + stop +#endif + endif +c First step of the velocity Verlet algorithm + if (lang.eq.2) then +#ifndef LANG0 + call sd_verlet1 +#endif + else if (lang.eq.3) then +#ifndef LANG0 + call sd_verlet1_ciccotti +#endif + else if (lang.eq.1) then + call sddir_verlet1 + else if (tnp1) then + call tnp1_respa_i_step1 + else if (tnp) then + call tnp_respa_i_step1 + else + if (tnh.and.xiresp) then + call kinetic(EK) + call nhcint(EK,scale_nh,wdtii,wdtii2,wdtii4,wdtii8) + do i=0,2*nres + do j=1,3 + d_t_old(j,i)=d_t_old(j,i)*scale_nh + enddo + enddo +cd write(iout,*) "SSS1",itsplit,EK,scale_nh + endif + call verlet1 + endif +c Build the chain from the newly calculated coordinates + call chainbuild_cart + if (rattle) call rattle1 + if (ntwe.ne.0) then + if (large.and. mod(itime,ntwe).eq.0) then + write (iout,*) "***** ITSPLIT",itsplit + write (iout,*) "Cartesian and internal coordinates: step 1" + call pdbout(0.0d0,"cipiszcze",iout) +c call cartprint + call intout + write (iout,*) "Velocities, step 1" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3), + & (d_t(j,i+nres),j=1,3) + enddo + endif + endif +#ifdef MPI + tt0 = MPI_Wtime() +#else + tt0 = tcpu() +#endif +c Calculate energy and forces + call zerograd + call etotal_short(energia_short) + E_old=potE + potE=energia_short(0) +#ifdef TIMING_ENE +#ifdef MPI + t_eshort=t_eshort+MPI_Wtime()-tt0 +#else + t_eshort=t_eshort+tcpu()-tt0 +#endif +#endif + call cartgrad +c Get the new accelerations + call lagrangian +C 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array + do i=0,2*nres + do j=1,3 + d_a_short(j,i)=d_a(j,i) + enddo + enddo + if (ntwe.ne.0) then + if (large.and. mod(itime,ntwe).eq.0) then + write (iout,*)"energia_short",energia_short(0) + write (iout,*) "Accelerations from short-range forces" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3), + & (d_a(j,i+nres),j=1,3) + enddo + endif + endif +c 6/30/08 A-MTS +c Determine maximum acceleration and scale down the timestep if needed + call max_accel + amax=amax/ntime_split**2 + call predict_edrift(epdrift) + if (ntwe.gt.0 .and. large .and. mod(itime,ntwe).eq.0) + & write (iout,*) "amax",amax," damax",damax, + & " epdrift",epdrift," epdriftmax",epdriftmax +c Exit loop and try with increased split number if the change of +c acceleration is too big + if (amax.gt.damax .or. epdrift.gt.edriftmax) then + if (ntime_split.lt.maxtime_split) then + scale=.true. + ntime_split=ntime_split*2 + do i=0,2*nres + do j=1,3 + dc_old(j,i)=dc_old0(j,i) + d_t_old(j,i)=d_t_old0(j,i) + d_a_old(j,i)=d_a_old0(j,i) + enddo + enddo + write (iout,*) "acceleration/energy drift too large",amax, + & epdrift," split increased to ",ntime_split," itime",itime, + & " itsplit",itsplit + exit + else + write (iout,*) + & "Uh-hu. Bumpy landscape. Maximum splitting number", + & maxtime_split, + & " already reached!!! Trying to carry on!" + endif + endif +#ifdef MPI + t_enegrad=t_enegrad+MPI_Wtime()-tt0 +#else + t_enegrad=t_enegrad+tcpu()-tt0 +#endif +c Second step of the velocity Verlet algorithm + if (lang.eq.2) then +#ifndef LANG0 + call sd_verlet2 +#endif + else if (lang.eq.3) then +#ifndef LANG0 + call sd_verlet2_ciccotti +#endif + else if (lang.eq.1) then + call sddir_verlet2 + else if (tnp1) then + call tnp1_respa_i_step2 + else if (tnp) then + call tnp_respa_i_step2 + else + call verlet2 + if (tnh.and.xiresp) then + call kinetic(EK) + call nhcint(EK,scale_nh,wdtii,wdtii2,wdtii4,wdtii8) + do i=0,2*nres + do j=1,3 + d_t(j,i)=d_t(j,i)*scale_nh + enddo + enddo +cd write(iout,*) "SSS2",itsplit,EK,scale_nh + endif + endif + if (rattle) call rattle2 +c Backup the coordinates, velocities, and accelerations + if (tnp .or. tnp1) then + do i=0,2*nres + do j=1,3 + d_t_old(j,i)=d_t(j,i) + if (tnp) d_t(j,i)=d_t(j,i)/s_np + if (tnp1) d_t(j,i)=d_t(j,i)/s_np + enddo + enddo + endif + + do i=0,2*nres + do j=1,3 + dc_old(j,i)=dc(j,i) + if(.not.(tnp .or. tnp1)) d_t_old(j,i)=d_t(j,i) + d_a_old(j,i)=d_a(j,i) + enddo + enddo + enddo + + enddo ! while scale + +c Restore the time step + d_time=d_time0 +c Compute long-range forces +#ifdef MPI + tt0 =MPI_Wtime() +#else + tt0 = tcpu() +#endif + call zerograd + call etotal_long(energia_long) + E_long=energia_long(0) + potE=energia_short(0)+energia_long(0) +#ifdef TIMING_ENE +#ifdef MPI + t_elong=t_elong+MPI_Wtime()-tt0 +#else + t_elong=t_elong+tcpu()-tt0 +#endif +#endif + call cartgrad + call lagrangian +#ifdef MPI + t_enegrad=t_enegrad+MPI_Wtime()-tt0 +#else + t_enegrad=t_enegrad+tcpu()-tt0 +#endif +c Compute accelerations from long-range forces + if (ntwe.ne.0) then + if (large.and. mod(itime,ntwe).eq.0) then + write (iout,*) "energia_long",energia_long(0) + write (iout,*) "Cartesian and internal coordinates: step 2" +c call cartprint + call pdbout(0.0d0,"cipiszcze",iout) + call intout + write (iout,*) "Accelerations from long-range forces" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3), + & (d_a(j,i+nres),j=1,3) + enddo + write (iout,*) "Velocities, step 2" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3), + & (d_t(j,i+nres),j=1,3) + enddo + endif + endif +c Compute the final RESPA step (increment velocities) +c write (iout,*) "*********************** RESPA fin" + if (tnp1) then + call tnp_respa_step2 + else if (tnp) then + call tnp_respa_step2 + else + call RESPA_vel + if (tnh.and..not.xiresp) then + call kinetic(EK) + call nhcint(EK,scale_nh,wdti,wdti2,wdti4,wdti8) + do i=0,2*nres + do j=1,3 + d_t(j,i)=d_t(j,i)*scale_nh + enddo + enddo + endif + endif + + if (tnp .or. tnp1) then + do i=0,2*nres + do j=1,3 + d_t(j,i)=d_t_old(j,i)/s_np + enddo + enddo + endif + +c Compute the complete potential energy + do i=0,n_ene + potEcomp(i)=energia_short(i)+energia_long(i) + enddo + potE=potEcomp(0)-potEcomp(20) +c potE=energia_short(0)+energia_long(0) + totT=totT+d_time +c Calculate the kinetic and the total energy and the kinetic temperature + call kinetic(EK) + totE=EK+potE +c Couple the system to Berendsen bath if needed + if (tbf .and. lang.eq.0) then + call verlet_bath + endif + kinetic_T=2.0d0/(dimen3*Rb)*EK +c Backup the coordinates, velocities, and accelerations + if (ntwe.ne.0) then + if (mod(itime,ntwe).eq.0 .and. large) then + write (iout,*) "Velocities, end" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3), + & (d_t(j,i+nres),j=1,3) + enddo + endif + + if (mod(itime,ntwe).eq.0) then + + if(tnp .or. tnp1) then +#ifndef G77 + write (iout,'(a3,7f20.10)') "TTT",EK,s_np,potE,pi_np,Csplit, + & E_long,energia_short(0) +#else + write (iout,'(a3,7f20.10)') "TTT",EK,s_np,potE,pi_np,Csplit, + & E_long,energia_short(0) +#endif + HNose1=Hnose(EK,s_np,potE,pi_np,Q_np,t_bath,dimen3) + H=(HNose1-H0)*s_np +cd write (iout,'(a,10f)') "hhh",EK,s_np,potE,pi_np,H0 +cd & ,EK+potE+pi_np**2/(2*Q_np)+dimen3*0.001986d0*t_bath*log(s_np) +cd write (iout,*) "HHH H=",H,abs(HNose1-H0)/H0 + hhh=h +cd write (iout,'(a,3f)') "EE2 NP S, pi",totT, s_np, pi_np + endif + + if(tnh) then + HNose1=Hnose_nh(EK,potE) + H=HNose1-H0 +cd write (iout,*) "HHH H=",H,abs(HNose1-H0)/H0 + hhh=h + endif + + + if (large) then + itnp=0 + do j=1,3 + itnp=itnp+1 + vtnp(itnp)=d_t(j,0) + enddo + do i=nnt,nct-1 + do j=1,3 + itnp=itnp+1 + vtnp(itnp)=d_t(j,i) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + itnp=itnp+1 + vtnp(itnp)=d_t(j,inres) + enddo + endif + enddo + +c Transform velocities from UNRES coordinate space to cartesian and Gvec +c eigenvector space + + do i=1,dimen3 + vtnp_(i)=0.0d0 + vtnp_a(i)=0.0d0 + do j=1,dimen3 + vtnp_(i)=vtnp_(i)+Gvec(j,i)*vtnp(j) + vtnp_a(i)=vtnp_a(i)+A(i,j)*vtnp(j) + enddo + vtnp_(i)=vtnp_(i)*dsqrt(geigen(i)) + enddo + + do i=1,dimen3 + write (iout,'("WWW",i3,3f10.5)') i,vtnp(i),vtnp_(i),vtnp_a(i) + enddo + + endif + endif + endif + + + return + end +c--------------------------------------------------------------------- + subroutine RESPA_vel +c First and last RESPA step (incrementing velocities using long-range +c forces). + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + do j=1,3 + d_t(j,0)=d_t(j,0)+0.5d0*d_a(j,0)*d_time + enddo + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t(j,i)+0.5d0*d_a(j,i)*d_time + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t(j,inres)=d_t(j,inres)+0.5d0*d_a(j,inres)*d_time + enddo + endif + enddo + return + end +c----------------------------------------------------------------- + subroutine verlet1 +c Applying velocity Verlet algorithm - step 1 to coordinates + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision adt,adt2 + +#ifdef DEBUG + write (iout,*) "VELVERLET1 START: DC" + do i=0,nres + write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3), + & (dc(j,i+nres),j=1,3) + enddo +#endif + do j=1,3 + adt=d_a_old(j,0)*d_time + adt2=0.5d0*adt + dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time + d_t_new(j,0)=d_t_old(j,0)+adt2 + d_t(j,0)=d_t_old(j,0)+adt + enddo + do i=nnt,nct-1 + do j=1,3 + adt=d_a_old(j,i)*d_time + adt2=0.5d0*adt + dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time + d_t_new(j,i)=d_t_old(j,i)+adt2 + d_t(j,i)=d_t_old(j,i)+adt + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + adt=d_a_old(j,inres)*d_time + adt2=0.5d0*adt + dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time + d_t_new(j,inres)=d_t_old(j,inres)+adt2 + d_t(j,inres)=d_t_old(j,inres)+adt + enddo + endif + enddo +#ifdef DEBUG + write (iout,*) "VELVERLET1 END: DC" + do i=0,nres + write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3), + & (dc(j,i+nres),j=1,3) + enddo +#endif + return + end +c--------------------------------------------------------------------- + subroutine verlet2 +c Step 2 of the velocity Verlet algorithm: update velocities + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + do j=1,3 + d_t(j,0)=d_t_new(j,0)+0.5d0*d_a(j,0)*d_time + enddo + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t_new(j,i)+0.5d0*d_a(j,i)*d_time + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t(j,inres)=d_t_new(j,inres)+0.5d0*d_a(j,inres)*d_time + enddo + endif + enddo + return + end +c----------------------------------------------------------------- + subroutine sddir_precalc +c Applying velocity Verlet algorithm - step 1 to coordinates + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision stochforcvec(MAXRES6) + common /stochcalc/ stochforcvec +c +c Compute friction and stochastic forces +c +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif + call friction_force +#ifdef MPI + time_fric=time_fric+MPI_Wtime()-time00 + time00=MPI_Wtime() +#else + time_fric=time_fric+tcpu()-time00 + time00=tcpu() +#endif + call stochastic_force(stochforcvec) +#ifdef MPI + time_stoch=time_stoch+MPI_Wtime()-time00 +#else + time_stoch=time_stoch+tcpu()-time00 +#endif +c +c Compute the acceleration due to friction forces (d_af_work) and stochastic +c forces (d_as_work) +c + call ginv_mult(fric_work, d_af_work) + call ginv_mult(stochforcvec, d_as_work) + return + end +c--------------------------------------------------------------------- + subroutine sddir_verlet1 +c Applying velocity Verlet algorithm - step 1 to velocities + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' +c Revised 3/31/05 AL: correlation between random contributions to +c position and velocity increments included. + double precision sqrt13 /0.57735026918962576451d0/ ! 1/sqrt(3) + double precision adt,adt2 +c +c Add the contribution from BOTH friction and stochastic force to the +c coordinates, but ONLY the contribution from the friction forces to velocities +c + do j=1,3 + adt=(d_a_old(j,0)+d_af_work(j))*d_time + adt2=0.5d0*adt+sqrt13*d_as_work(j)*d_time + dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time + d_t_new(j,0)=d_t_old(j,0)+0.5d0*adt + d_t(j,0)=d_t_old(j,0)+adt + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + adt=(d_a_old(j,i)+d_af_work(ind+j))*d_time + adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time + dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time + d_t_new(j,i)=d_t_old(j,i)+0.5d0*adt + d_t(j,i)=d_t_old(j,i)+adt + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + adt=(d_a_old(j,inres)+d_af_work(ind+j))*d_time + adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time + dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time + d_t_new(j,inres)=d_t_old(j,inres)+0.5d0*adt + d_t(j,inres)=d_t_old(j,inres)+adt + enddo + ind=ind+3 + endif + enddo + return + end +c--------------------------------------------------------------------- + subroutine sddir_verlet2 +c Calculating the adjusted velocities for accelerations + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision stochforcvec(MAXRES6),d_as_work1(MAXRES6) + double precision cos60 /0.5d0/, sin60 /0.86602540378443864676d0/ +c Revised 3/31/05 AL: correlation between random contributions to +c position and velocity increments included. +c The correlation coefficients are calculated at low-friction limit. +c Also, friction forces are now not calculated with new velocities. + +c call friction_force + call stochastic_force(stochforcvec) +c +c Compute the acceleration due to friction forces (d_af_work) and stochastic +c forces (d_as_work) +c + call ginv_mult(stochforcvec, d_as_work1) + +c +c Update velocities +c + do j=1,3 + d_t(j,0)=d_t_new(j,0)+(0.5d0*(d_a(j,0)+d_af_work(j)) + & +sin60*d_as_work(j)+cos60*d_as_work1(j))*d_time + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t_new(j,i)+(0.5d0*(d_a(j,i)+d_af_work(ind+j)) + & +sin60*d_as_work(ind+j)+cos60*d_as_work1(ind+j))*d_time + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t(j,inres)=d_t_new(j,inres)+(0.5d0*(d_a(j,inres) + & +d_af_work(ind+j))+sin60*d_as_work(ind+j) + & +cos60*d_as_work1(ind+j))*d_time + enddo + ind=ind+3 + endif + enddo + return + end +c--------------------------------------------------------------------- + subroutine max_accel +c +c Find the maximum difference in the accelerations of the the sites +c at the beginning and the end of the time step. +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + double precision aux(3),accel(3),accel_old(3),dacc + do j=1,3 +c aux(j)=d_a(j,0)-d_a_old(j,0) + accel_old(j)=d_a_old(j,0) + accel(j)=d_a(j,0) + enddo + amax=0.0d0 + do i=nnt,nct +c Backbone + if (i.lt.nct) then +c 7/3/08 changed to asymmetric difference + do j=1,3 +c accel(j)=aux(j)+0.5d0*(d_a(j,i)-d_a_old(j,i)) + accel_old(j)=accel_old(j)+0.5d0*d_a_old(j,i) + accel(j)=accel(j)+0.5d0*d_a(j,i) +c if (dabs(accel(j)).gt.amax) amax=dabs(accel(j)) + if (dabs(accel(j)).gt.dabs(accel_old(j))) then + dacc=dabs(accel(j)-accel_old(j)) + if (dacc.gt.amax) amax=dacc + endif + enddo + endif + enddo +c Side chains + do j=1,3 +c accel(j)=aux(j) + accel_old(j)=d_a_old(j,0) + accel(j)=d_a(j,0) + enddo + if (nnt.eq.2) then + do j=1,3 + accel_old(j)=accel_old(j)+d_a_old(j,1) + accel(j)=accel(j)+d_a(j,1) + enddo + endif + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 +c accel(j)=accel(j)+d_a(j,i+nres)-d_a_old(j,i+nres) + accel_old(j)=accel_old(j)+d_a_old(j,i+nres) + accel(j)=accel(j)+d_a(j,i+nres) + enddo + endif + do j=1,3 +c if (dabs(accel(j)).gt.amax) amax=dabs(accel(j)) + if (dabs(accel(j)).gt.dabs(accel_old(j))) then + dacc=dabs(accel(j)-accel_old(j)) + if (dacc.gt.amax) amax=dacc + endif + enddo + do j=1,3 + accel_old(j)=accel_old(j)+d_a_old(j,i) + accel(j)=accel(j)+d_a(j,i) +c aux(j)=aux(j)+d_a(j,i)-d_a_old(j,i) + enddo + enddo + return + end +c--------------------------------------------------------------------- + subroutine predict_edrift(epdrift) +c +c Predict the drift of the potential energy +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.MUCA' + double precision epdrift,epdriftij +c Drift of the potential energy + epdrift=0.0d0 + do i=nnt,nct +c Backbone + if (i.lt.nct) then + do j=1,3 + epdriftij=dabs((d_a(j,i)-d_a_old(j,i))*gcart(j,i)) + if (lmuca) epdriftij=epdriftij*factor +c write (iout,*) "back",i,j,epdriftij + if (epdriftij.gt.epdrift) epdrift=epdriftij + enddo + endif +c Side chains + if (itype(i).ne.10) then + do j=1,3 + epdriftij= + & dabs((d_a(j,i+nres)-d_a_old(j,i+nres))*gxcart(j,i)) + if (lmuca) epdriftij=epdriftij*factor +c write (iout,*) "side",i,j,epdriftij + if (epdriftij.gt.epdrift) epdrift=epdriftij + enddo + endif + enddo + epdrift=0.5d0*epdrift*d_time*d_time +c write (iout,*) "epdrift",epdrift + return + end +c----------------------------------------------------------------------- + subroutine verlet_bath +c +c Coupling to the thermostat by using the Berendsen algorithm +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision T_half,fact +c + T_half=2.0d0/(dimen3*Rb)*EK + fact=dsqrt(1.0d0+(d_time/tau_bath)*(t_bath/T_half-1.0d0)) +c write(iout,*) "T_half", T_half +c write(iout,*) "EK", EK +c write(iout,*) "fact", fact + do j=1,3 + d_t(j,0)=fact*d_t(j,0) + enddo + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=fact*d_t(j,i) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t(j,inres)=fact*d_t(j,inres) + enddo + endif + enddo + return + end +c--------------------------------------------------------- + subroutine init_MD +c Set up the initial conditions of a MD simulation + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MP + include 'mpif.h' + character*16 form + integer IERROR,ERRCODE +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.REMD' + real*8 energia_long(0:n_ene), + & energia_short(0:n_ene),vcm(3),incr(3),E_short + double precision cm(3),L(3),xv,sigv,lowb,highb + double precision varia(maxvar) + character*256 qstr + integer ilen + external ilen + character*50 tytul + logical file_exist + common /gucio/ cm + d_time0=d_time +c write(iout,*) "d_time", d_time +c Compute the standard deviations of stochastic forces for Langevin dynamics +c if the friction coefficients do not depend on surface area + if (lang.gt.0 .and. .not.surfarea) then + do i=nnt,nct-1 + stdforcp(i)=stdfp*dsqrt(gamp) + enddo + do i=nnt,nct + stdforcsc(i)=stdfsc(itype(i))*dsqrt(gamsc(itype(i))) + enddo + endif +c Open the pdb file for snapshotshots +#ifdef MPI + if(mdpdb) then + if (ilen(tmpdir).gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// + & liczba(:ilen(liczba))//".pdb") + open(ipdb, + & file=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) + & //".pdb") + else +#ifdef NOXDR + if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file)) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// + & liczba(:ilen(liczba))//".x") + cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) + & //".x" +#else + if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file)) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// + & liczba(:ilen(liczba))//".cx") + cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) + & //".cx" +#endif + endif +#else + if(mdpdb) then + if (ilen(tmpdir).gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.pdb") + open(ipdb,file=prefix(:ilen(prefix))//"_MD.pdb") + else + if (ilen(tmpdir).gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.cx") + cartname=prefix(:ilen(prefix))//"_MD.cx" + endif +#endif + if (usampl) then + write (qstr,'(256(1h ))') + ipos=1 + do i=1,nfrag + iq = qinfrag(i,iset)*10 + iw = wfrag(i,iset)/100 + if (iw.gt.0) then + if(me.eq.king.or..not.out1file) + & write (iout,*) "Frag",qinfrag(i,iset),wfrag(i,iset),iq,iw + write (qstr(ipos:ipos+6),'(2h_f,i1,1h_,i1,1h_,i1)') i,iq,iw + ipos=ipos+7 + endif + enddo + do i=1,npair + iq = qinpair(i,iset)*10 + iw = wpair(i,iset)/100 + if (iw.gt.0) then + if(me.eq.king.or..not.out1file) + & write (iout,*) "Pair",i,qinpair(i,iset),wpair(i,iset),iq,iw + write (qstr(ipos:ipos+6),'(2h_p,i1,1h_,i1,1h_,i1)') i,iq,iw + ipos=ipos+7 + endif + enddo +c pdbname=pdbname(:ilen(pdbname)-4)//qstr(:ipos-1)//'.pdb' +#ifdef NOXDR +c cartname=cartname(:ilen(cartname)-2)//qstr(:ipos-1)//'.x' +#else +c cartname=cartname(:ilen(cartname)-3)//qstr(:ipos-1)//'.cx' +#endif +c statname=statname(:ilen(statname)-5)//qstr(:ipos-1)//'.stat' + endif + icg=1 + if (rest) then + if (restart1file) then + if (me.eq.king) + & inquire(file=mremd_rst_name,exist=file_exist) + write (*,*) me," Before broadcast: file_exist",file_exist +#ifdef MPI + call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM, + & IERR) + write (*,*) me," After broadcast: file_exist",file_exist +#endif +c inquire(file=mremd_rst_name,exist=file_exist) + if(me.eq.king.or..not.out1file) + & write(iout,*) "Initial state read by master and distributed" + else + if (ilen(tmpdir).gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_' + & //liczba(:ilen(liczba))//'.rst') + inquire(file=rest2name,exist=file_exist) + endif + if(file_exist) then + if(.not.restart1file) then + if(me.eq.king.or..not.out1file) + & write(iout,*) "Initial state will be read from file ", + & rest2name(:ilen(rest2name)) + call readrst + endif + call rescale_weights(t_bath) + else + if(me.eq.king.or..not.out1file)then + if (restart1file) then + write(iout,*) "File ",mremd_rst_name(:ilen(mremd_rst_name)), + & " does not exist" + else + write(iout,*) "File ",rest2name(:ilen(rest2name)), + & " does not exist" + endif + write(iout,*) "Initial velocities randomly generated" + endif + call random_vel + totT=0.0d0 + endif + else +c Generate initial velocities + if(me.eq.king.or..not.out1file) + & write(iout,*) "Initial velocities randomly generated" + call random_vel + totT=0.0d0 + endif +c rest2name = prefix(:ilen(prefix))//'.rst' + if(me.eq.king.or..not.out1file)then + write (iout,*) "Initial velocities" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3), + & (d_t(j,i+nres),j=1,3) + enddo + call flush(iout) +c Zeroing the total angular momentum of the system + write(iout,*) "Calling the zero-angular + & momentum subroutine" + endif + call inertia_tensor +c Getting the potential energy and forces and velocities and accelerations + call vcm_vel(vcm) +c write (iout,*) "velocity of the center of the mass:" +c write (iout,*) (vcm(j),j=1,3) + do j=1,3 + d_t(j,0)=d_t(j,0)-vcm(j) + enddo +c Removing the velocity of the center of mass + call vcm_vel(vcm) + if(me.eq.king.or..not.out1file)then + write (iout,*) "vcm right after adjustment:" + write (iout,*) (vcm(j),j=1,3) + call flush(iout) + endif + if (.not.rest) then + call chainbuild + if(iranconf.ne.0) then + if (overlapsc) then + print *, 'Calling OVERLAP_SC' + call overlap_sc(fail) + endif + + if (searchsc) then + call sc_move(2,nres-1,10,1d10,nft_sc,etot) + print *,'SC_move',nft_sc,etot + if(me.eq.king.or..not.out1file) + & write(iout,*) 'SC_move',nft_sc,etot + endif + + if(dccart)then + print *, 'Calling MINIM_DC' + call minim_dc(etot,iretcode,nfun) + else + call geom_to_var(nvar,varia) + print *,'Calling MINIMIZE.' + call minimize(etot,varia,iretcode,nfun) + call var_to_geom(nvar,varia) + endif + if(me.eq.king.or..not.out1file) + & write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun + endif + endif + call chainbuild_cart + call kinetic(EK) + if (tbf) then + call verlet_bath + endif + kinetic_T=2.0d0/(dimen3*Rb)*EK + if(me.eq.king.or..not.out1file)then + call cartprint + call intout + endif +#ifdef MPI + tt0=MPI_Wtime() +#else + tt0=tcpu() +#endif + call zerograd + call etotal(potEcomp) +#ifdef TIMING_ENE +#ifdef MPI + t_etotal=t_etotal+MPI_Wtime()-tt0 +#else + t_etotal=t_etotal+tcpu()-tt0 +#endif +#endif + potE=potEcomp(0) + + if(tnp .or. tnp1) then + s_np=1.0 + pi_np=0.0 + HNose1=Hnose(EK,s_np,potE,pi_np,Q_np,t_bath,dimen3) + H0=Hnose1 + write(iout,*) 'H0= ',H0 + endif + + if(tnh) then + HNose1=Hnose_nh(EK,potE) + H0=HNose1 + write (iout,*) 'H0= ',H0 + endif + + if (hmc.gt.0) then + hmc_acc=0 + hmc_etot=potE+EK + if(me.eq.king.or..not.out1file) + & write(iout,*) 'HMC',hmc_etot,potE,EK + do i=1,2*nres + do j=1,3 + dc_hmc(j,i)=dc(j,i) + enddo + enddo + endif + + call cartgrad + call lagrangian + call max_accel + if (amax*d_time .gt. dvmax) then + d_time=d_time*dvmax/amax + if(me.eq.king.or..not.out1file) write (iout,*) + & "Time step reduced to",d_time, + & " because of too large initial acceleration." + endif + if(me.eq.king.or..not.out1file)then + write(iout,*) "Potential energy and its components" + call enerprint(potEcomp) +c write(iout,*) (potEcomp(i),i=0,n_ene) + endif + potE=potEcomp(0)-potEcomp(20) + totE=EK+potE + itime=0 + if (ntwe.ne.0) call statout(itime) + if(me.eq.king.or..not.out1file) + & write (iout,'(/a/3(a25,1pe14.5/))') "Initial:", + & " Kinetic energy",EK," potential energy",potE, + & " total energy",totE," maximum acceleration ", + & amax + if (large) then + write (iout,*) "Initial coordinates" + do i=1,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(c(j,i),j=1,3), + & (c(j,i+nres),j=1,3) + enddo + write (iout,*) "Initial dC" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3), + & (dc(j,i+nres),j=1,3) + enddo + write (iout,*) "Initial velocities" + write (iout,"(13x,' backbone ',23x,' side chain')") + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3), + & (d_t(j,i+nres),j=1,3) + enddo + write (iout,*) "Initial accelerations" + do i=0,nres +c write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3), + write (iout,'(i3,3f15.10,3x,3f15.10)') i,(d_a(j,i),j=1,3), + & (d_a(j,i+nres),j=1,3) + enddo + endif + do i=0,2*nres + do j=1,3 + dc_old(j,i)=dc(j,i) + d_t_old(j,i)=d_t(j,i) + d_a_old(j,i)=d_a(j,i) + enddo +c write (iout,*) "dc_old",i,(dc_old(j,i),j=1,3) + enddo + if (RESPA) then +#ifdef MPI + tt0 =MPI_Wtime() +#else + tt0 = tcpu() +#endif + call zerograd + call etotal_short(energia_short) +#ifdef TIMING_ENE +#ifdef MPI + t_eshort=t_eshort+MPI_Wtime()-tt0 +#else + t_eshort=t_eshort+tcpu()-tt0 +#endif +#endif + + if(tnp .or. tnp1) then + E_short=energia_short(0) + HNose1=Hnose(EK,s_np,E_short,pi_np,Q_np,t_bath,dimen3) + Csplit=Hnose1 +c Csplit =110 +c_new_var_csplit Csplit=H0-E_long +c Csplit = H0-energia_short(0) + write(iout,*) 'Csplit= ',Csplit + endif + + + call cartgrad + call lagrangian + if(.not.out1file .and. large) then + write (iout,*) "energia_long",energia_long(0), + & " energia_short",energia_short(0), + & " total",energia_long(0)+energia_short(0) + write (iout,*) "Initial fast-force accelerations" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3), + & (d_a(j,i+nres),j=1,3) + enddo + endif +C 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array + do i=0,2*nres + do j=1,3 + d_a_short(j,i)=d_a(j,i) + enddo + enddo +#ifdef MPI + tt0=MPI_Wtime() +#else + tt0=tcpu() +#endif + call zerograd + call etotal_long(energia_long) +#ifdef TIMING_ENE +#ifdef MPI + t_elong=t_elong+MPI_Wtime()-tt0 +#else + t_elong=t_elong+tcpu()-tt0 +#endif +#endif + call cartgrad + call lagrangian + if(.not.out1file .and. large) then + write (iout,*) "energia_long",energia_long(0) + write (iout,*) "Initial slow-force accelerations" + do i=0,nres + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3), + & (d_a(j,i+nres),j=1,3) + enddo + endif +#ifdef MPI + t_enegrad=t_enegrad+MPI_Wtime()-tt0 +#else + t_enegrad=t_enegrad+tcpu()-tt0 +#endif + endif + + + + return + end +c----------------------------------------------------------- + subroutine random_vel + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision xv,sigv,lowb,highb +c Generate random velocities from Gaussian distribution of mean 0 and std of KT/m +c First generate velocities in the eigenspace of the G matrix +c write (iout,*) "Calling random_vel dimen dimen3",dimen,dimen3 +c call flush(iout) +c write (iout,*) "RANDOM_VEL dimen",dimen + xv=0.0d0 + ii=0 + do i=1,dimen + do k=1,3 + ii=ii+1 + sigv=dsqrt((Rb*t_bath)/geigen(i)) + lowb=-5*sigv + highb=5*sigv + d_t_work_new(ii)=anorm_distr(xv,sigv,lowb,highb) +c write (iout,*) "i",i," ii",ii," geigen",geigen(i), +c & " d_t_work_new",d_t_work_new(ii) + enddo + enddo + call flush(iout) +c diagnostics +c Ek1=0.0d0 +c ii=0 +c do i=1,dimen +c do k=1,3 +c ii=ii+1 +c Ek1=Ek1+0.5d0*geigen(i)*d_t_work_new(ii)**2 +c enddo +c enddo +c write (iout,*) "Ek from eigenvectors",Ek1 +c end diagnostics +c Transform velocities to UNRES coordinate space + do k=0,2 + do i=1,dimen + ind=(i-1)*3+k+1 + d_t_work(ind)=0.0d0 + do j=1,dimen + d_t_work(ind)=d_t_work(ind) + & +Gvec(i,j)*d_t_work_new((j-1)*3+k+1) + enddo +c write (iout,*) "i",i," ind",ind," d_t_work",d_t_work(ind) +c call flush(iout) + enddo + enddo +c Transfer to the d_t vector + do j=1,3 + d_t(j,0)=d_t_work(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + ind=ind+1 + d_t(j,i)=d_t_work(ind) + enddo + enddo +c do i=0,nres-1 +c write (iout,*) "d_t",i,(d_t(j,i),j=1,3) +c enddo +c call flush(iout) + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + ind=ind+1 + d_t(j,i+nres)=d_t_work(ind) + enddo + endif + enddo +c call kinetic(EK) +c write (iout,*) "Kinetic energy",Ek,EK1," kinetic temperature", +c & 2.0d0/(dimen3*Rb)*EK,2.0d0/(dimen3*Rb)*EK1 +c call flush(iout) + return + end +#ifndef LANG0 +c----------------------------------------------------------- + subroutine sd_verlet_p_setup +c Sets up the parameters of stochastic Verlet algorithm + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision emgdt(MAXRES6), + & pterm,vterm,rho,rhoc,vsig, + & pfric_vec(MAXRES6),vfric_vec(MAXRES6), + & afric_vec(MAXRES6),prand_vec(MAXRES6), + & vrand_vec1(MAXRES6),vrand_vec2(MAXRES6) + logical lprn /.false./ + double precision zero /1.0d-8/, gdt_radius /0.05d0/ + double precision ktm +#ifdef MPI + tt0 = MPI_Wtime() +#else + tt0 = tcpu() +#endif +c +c AL 8/17/04 Code adapted from tinker +c +c Get the frictional and random terms for stochastic dynamics in the +c eigenspace of mass-scaled UNRES friction matrix +c + do i = 1, dimen + gdt = fricgam(i) * d_time +c +c Stochastic dynamics reduces to simple MD for zero friction +c + if (gdt .le. zero) then + pfric_vec(i) = 1.0d0 + vfric_vec(i) = d_time + afric_vec(i) = 0.5d0 * d_time * d_time + prand_vec(i) = 0.0d0 + vrand_vec1(i) = 0.0d0 + vrand_vec2(i) = 0.0d0 +c +c Analytical expressions when friction coefficient is large +c + else + if (gdt .ge. gdt_radius) then + egdt = dexp(-gdt) + pfric_vec(i) = egdt + vfric_vec(i) = (1.0d0-egdt) / fricgam(i) + afric_vec(i) = (d_time-vfric_vec(i)) / fricgam(i) + pterm = 2.0d0*gdt - 3.0d0 + (4.0d0-egdt)*egdt + vterm = 1.0d0 - egdt**2 + rho = (1.0d0-egdt)**2 / sqrt(pterm*vterm) +c +c Use series expansions when friction coefficient is small +c + else + gdt2 = gdt * gdt + gdt3 = gdt * gdt2 + gdt4 = gdt2 * gdt2 + gdt5 = gdt2 * gdt3 + gdt6 = gdt3 * gdt3 + gdt7 = gdt3 * gdt4 + gdt8 = gdt4 * gdt4 + gdt9 = gdt4 * gdt5 + afric_vec(i) = (gdt2/2.0d0 - gdt3/6.0d0 + gdt4/24.0d0 + & - gdt5/120.0d0 + gdt6/720.0d0 + & - gdt7/5040.0d0 + gdt8/40320.0d0 + & - gdt9/362880.0d0) / fricgam(i)**2 + vfric_vec(i) = d_time - fricgam(i)*afric_vec(i) + pfric_vec(i) = 1.0d0 - fricgam(i)*vfric_vec(i) + pterm = 2.0d0*gdt3/3.0d0 - gdt4/2.0d0 + & + 7.0d0*gdt5/30.0d0 - gdt6/12.0d0 + & + 31.0d0*gdt7/1260.0d0 - gdt8/160.0d0 + & + 127.0d0*gdt9/90720.0d0 + vterm = 2.0d0*gdt - 2.0d0*gdt2 + 4.0d0*gdt3/3.0d0 + & - 2.0d0*gdt4/3.0d0 + 4.0d0*gdt5/15.0d0 + & - 4.0d0*gdt6/45.0d0 + 8.0d0*gdt7/315.0d0 + & - 2.0d0*gdt8/315.0d0 + 4.0d0*gdt9/2835.0d0 + rho = sqrt(3.0d0) * (0.5d0 - 3.0d0*gdt/16.0d0 + & - 17.0d0*gdt2/1280.0d0 + & + 17.0d0*gdt3/6144.0d0 + & + 40967.0d0*gdt4/34406400.0d0 + & - 57203.0d0*gdt5/275251200.0d0 + & - 1429487.0d0*gdt6/13212057600.0d0) + end if +c +c Compute the scaling factors of random terms for the nonzero friction case +c + ktm = 0.5d0*d_time/fricgam(i) + psig = dsqrt(ktm*pterm) / fricgam(i) + vsig = dsqrt(ktm*vterm) + rhoc = dsqrt(1.0d0 - rho*rho) + prand_vec(i) = psig + vrand_vec1(i) = vsig * rho + vrand_vec2(i) = vsig * rhoc + end if + end do + if (lprn) then + write (iout,*) + & "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,", + & " vrand_vec2" + do i=1,dimen + write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i), + & afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i) + enddo + endif +c +c Transform from the eigenspace of mass-scaled friction matrix to UNRES variables +c +#ifndef LANG0 + call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat) + call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat) + call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat) + call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat) + call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec1,vrand_mat1) + call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2) +#endif +#ifdef MPI + t_sdsetup=t_sdsetup+MPI_Wtime() +#else + t_sdsetup=t_sdsetup+tcpu()-tt0 +#endif + return + end +c------------------------------------------------------------- + subroutine eigtransf1(n,ndim,ab,d,c) + implicit none + integer n,ndim + double precision ab(ndim,ndim,n),c(ndim,n),d(ndim) + integer i,j,k + do i=1,n + do j=1,n + c(i,j)=0.0d0 + do k=1,n + c(i,j)=c(i,j)+ab(k,j,i)*d(k) + enddo + enddo + enddo + return + end +c------------------------------------------------------------- + subroutine eigtransf(n,ndim,a,b,d,c) + implicit none + integer n,ndim + double precision a(ndim,n),b(ndim,n),c(ndim,n),d(ndim) + integer i,j,k + do i=1,n + do j=1,n + c(i,j)=0.0d0 + do k=1,n + c(i,j)=c(i,j)+a(i,k)*b(k,j)*d(k) + enddo + enddo + enddo + return + end +c------------------------------------------------------------- + subroutine sd_verlet1 +c Applying stochastic velocity Verlet algorithm - step 1 to velocities + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision stochforcvec(MAXRES6) + common /stochcalc/ stochforcvec + logical lprn /.false./ + +c write (iout,*) "dc_old" +c do i=0,nres +c write (iout,'(i5,3f10.5,5x,3f10.5)') +c & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3) +c enddo + do j=1,3 + dc_work(j)=dc_old(j,0) + d_t_work(j)=d_t_old(j,0) + d_a_work(j)=d_a_old(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + dc_work(ind+j)=dc_old(j,i) + d_t_work(ind+j)=d_t_old(j,i) + d_a_work(ind+j)=d_a_old(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + dc_work(ind+j)=dc_old(j,i+nres) + d_t_work(ind+j)=d_t_old(j,i+nres) + d_a_work(ind+j)=d_a_old(j,i+nres) + enddo + ind=ind+3 + endif + enddo +#ifndef LANG0 + if (lprn) then + write (iout,*) + & "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,", + & " vrand_mat2" + do i=1,dimen + do j=1,dimen + write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j), + & vfric_mat(i,j),afric_mat(i,j), + & prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j) + enddo + enddo + endif + do i=1,dimen + ddt1=0.0d0 + ddt2=0.0d0 + do j=1,dimen + dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j) + & +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j) + ddt1=ddt1+pfric_mat(i,j)*d_t_work(j) + ddt2=ddt2+vfric_mat(i,j)*d_a_work(j) + enddo + d_t_work_new(i)=ddt1+0.5d0*ddt2 + d_t_work(i)=ddt1+ddt2 + enddo +#endif + do j=1,3 + dc(j,0)=dc_work(j) + d_t(j,0)=d_t_work(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + dc(j,i)=dc_work(ind+j) + d_t(j,i)=d_t_work(ind+j) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + dc(j,inres)=dc_work(ind+j) + d_t(j,inres)=d_t_work(ind+j) + enddo + ind=ind+3 + endif + enddo + return + end +c-------------------------------------------------------------------------- + subroutine sd_verlet2 +c Calculating the adjusted velocities for accelerations + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision stochforcvec(MAXRES6),stochforcvecV(MAXRES6) + common /stochcalc/ stochforcvec +c +c Compute the stochastic forces which contribute to velocity change +c + call stochastic_force(stochforcvecV) + +#ifndef LANG0 + do i=1,dimen + ddt1=0.0d0 + ddt2=0.0d0 + do j=1,dimen + ddt1=ddt1+vfric_mat(i,j)*d_a_work(j) + ddt2=ddt2+vrand_mat1(i,j)*stochforcvec(j)+ + & vrand_mat2(i,j)*stochforcvecV(j) + enddo + d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2 + enddo +#endif + do j=1,3 + d_t(j,0)=d_t_work(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t_work(ind+j) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t(j,inres)=d_t_work(ind+j) + enddo + ind=ind+3 + endif + enddo + return + end +c----------------------------------------------------------- + subroutine sd_verlet_ciccotti_setup +c Sets up the parameters of stochastic velocity Verlet algorithmi; Ciccotti's +c version + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision emgdt(MAXRES6), + & pterm,vterm,rho,rhoc,vsig, + & pfric_vec(MAXRES6),vfric_vec(MAXRES6), + & afric_vec(MAXRES6),prand_vec(MAXRES6), + & vrand_vec1(MAXRES6),vrand_vec2(MAXRES6) + logical lprn /.false./ + double precision zero /1.0d-8/, gdt_radius /0.05d0/ + double precision ktm +#ifdef MPI + tt0 = MPI_Wtime() +#else + tt0 = tcpu() +#endif +c +c AL 8/17/04 Code adapted from tinker +c +c Get the frictional and random terms for stochastic dynamics in the +c eigenspace of mass-scaled UNRES friction matrix +c + do i = 1, dimen + write (iout,*) "i",i," fricgam",fricgam(i) + gdt = fricgam(i) * d_time +c +c Stochastic dynamics reduces to simple MD for zero friction +c + if (gdt .le. zero) then + pfric_vec(i) = 1.0d0 + vfric_vec(i) = d_time + afric_vec(i) = 0.5d0*d_time*d_time + prand_vec(i) = afric_vec(i) + vrand_vec2(i) = vfric_vec(i) +c +c Analytical expressions when friction coefficient is large +c + else + egdt = dexp(-gdt) + pfric_vec(i) = egdt + vfric_vec(i) = dexp(-0.5d0*gdt)*d_time + afric_vec(i) = 0.5d0*dexp(-0.25d0*gdt)*d_time*d_time + prand_vec(i) = afric_vec(i) + vrand_vec2(i) = vfric_vec(i) +c +c Compute the scaling factors of random terms for the nonzero friction case +c +c ktm = 0.5d0*d_time/fricgam(i) +c psig = dsqrt(ktm*pterm) / fricgam(i) +c vsig = dsqrt(ktm*vterm) +c prand_vec(i) = psig*afric_vec(i) +c vrand_vec2(i) = vsig*vfric_vec(i) + end if + end do + if (lprn) then + write (iout,*) + & "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,", + & " vrand_vec2" + do i=1,dimen + write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i), + & afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i) + enddo + endif +c +c Transform from the eigenspace of mass-scaled friction matrix to UNRES variables +c + call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat) + call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat) + call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat) + call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat) + call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2) +#ifdef MPI + t_sdsetup=t_sdsetup+MPI_Wtime() +#else + t_sdsetup=t_sdsetup+tcpu()-tt0 +#endif + return + end +c------------------------------------------------------------- + subroutine sd_verlet1_ciccotti +c Applying stochastic velocity Verlet algorithm - step 1 to velocities + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision stochforcvec(MAXRES6) + common /stochcalc/ stochforcvec + logical lprn /.false./ + +c write (iout,*) "dc_old" +c do i=0,nres +c write (iout,'(i5,3f10.5,5x,3f10.5)') +c & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3) +c enddo + do j=1,3 + dc_work(j)=dc_old(j,0) + d_t_work(j)=d_t_old(j,0) + d_a_work(j)=d_a_old(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + dc_work(ind+j)=dc_old(j,i) + d_t_work(ind+j)=d_t_old(j,i) + d_a_work(ind+j)=d_a_old(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + dc_work(ind+j)=dc_old(j,i+nres) + d_t_work(ind+j)=d_t_old(j,i+nres) + d_a_work(ind+j)=d_a_old(j,i+nres) + enddo + ind=ind+3 + endif + enddo + +#ifndef LANG0 + if (lprn) then + write (iout,*) + & "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,", + & " vrand_mat2" + do i=1,dimen + do j=1,dimen + write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j), + & vfric_mat(i,j),afric_mat(i,j), + & prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j) + enddo + enddo + endif + do i=1,dimen + ddt1=0.0d0 + ddt2=0.0d0 + do j=1,dimen + dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j) + & +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j) + ddt1=ddt1+pfric_mat(i,j)*d_t_work(j) + ddt2=ddt2+vfric_mat(i,j)*d_a_work(j) + enddo + d_t_work_new(i)=ddt1+0.5d0*ddt2 + d_t_work(i)=ddt1+ddt2 + enddo +#endif + do j=1,3 + dc(j,0)=dc_work(j) + d_t(j,0)=d_t_work(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + dc(j,i)=dc_work(ind+j) + d_t(j,i)=d_t_work(ind+j) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + dc(j,inres)=dc_work(ind+j) + d_t(j,inres)=d_t_work(ind+j) + enddo + ind=ind+3 + endif + enddo + return + end +c-------------------------------------------------------------------------- + subroutine sd_verlet2_ciccotti +c Calculating the adjusted velocities for accelerations + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision stochforcvec(MAXRES6),stochforcvecV(MAXRES6) + common /stochcalc/ stochforcvec +c +c Compute the stochastic forces which contribute to velocity change +c + call stochastic_force(stochforcvecV) +#ifndef LANG0 + do i=1,dimen + ddt1=0.0d0 + ddt2=0.0d0 + do j=1,dimen + + ddt1=ddt1+vfric_mat(i,j)*d_a_work(j) +c ddt2=ddt2+vrand_mat2(i,j)*stochforcvecV(j) + ddt2=ddt2+vrand_mat2(i,j)*stochforcvec(j) + enddo + d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2 + enddo +#endif + do j=1,3 + d_t(j,0)=d_t_work(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t_work(ind+j) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t(j,inres)=d_t_work(ind+j) + enddo + ind=ind+3 + endif + enddo + return + end +#endif +c------------------------------------------------------ + double precision function HNose(ek,s,e,pi,Q,t_bath,dimenl) + implicit none + double precision ek,s,e,pi,Q,t_bath,Rb + integer dimenl + Rb=0.001986d0 + HNose=ek+e+pi**2/(2*Q)+dimenl*Rb*t_bath*log(s) +c print '(6f15.5,i5,a2,2f15.5)',ek,s,e,pi,Q,t_bath,dimenl,"--", +c & pi**2/(2*Q),dimenl*Rb*t_bath*log(s) + return + end +c----------------------------------------------------------------- + double precision function HNose_nh(eki,e) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MD' + HNose_nh=eki+e+dimen3*Rb*t_bath*xlogs(1)+qmass(1)*vlogs(1)**2/2 + do i=2,nnos + HNose_nh=HNose_nh+qmass(i)*vlogs(i)**2/2+Rb*t_bath*xlogs(i) + enddo +c write(4,'(5e15.5)') +c & vlogs(1),xlogs(1),HNose,eki,e + return + end +c----------------------------------------------------------------- + SUBROUTINE NHCINT(akin,scale,wdti,wdti2,wdti4,wdti8) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MD' + double precision akin,gnkt,dt,aa,gkt,scale + double precision wdti(maxyosh),wdti2(maxyosh), + & wdti4(maxyosh),wdti8(maxyosh) + integer i,iresn,iyosh,inos,nnos1 + + dt=d_time + nnos1=nnos+1 + GKT = Rb*t_bath + GNKT = dimen3*GKT + akin=akin*2 + + +C THIS ROUTINE DOES THE NOSE-HOOVER PART OF THE +C INTEGRATION FROM t=0 TO t=DT/2 +C GET THE TOTAL KINETIC ENERGY + SCALE = 1.D0 +c CALL GETKINP(MASS,VX,VY,VZ,AKIN) +C UPDATE THE FORCES + GLOGS(1) = (AKIN - GNKT)/QMASS(1) +C START THE MULTIPLE TIME STEP PROCEDURE + DO IRESN = 1,NRESN + DO IYOSH = 1,NYOSH +C UPDATE THE THERMOSTAT VELOCITIES + VLOGS(NNOS) = VLOGS(NNOS) + GLOGS(NNOS)*WDTI4(IYOSH) + DO INOS = 1,NNOS-1 + AA = EXP(-WDTI8(IYOSH)*VLOGS(NNOS1-INOS) ) + VLOGS(NNOS-INOS) = VLOGS(NNOS-INOS)*AA*AA + & + WDTI4(IYOSH)*GLOGS(NNOS-INOS)*AA + ENDDO +C UPDATE THE PARTICLE VELOCITIES + AA = EXP(-WDTI2(IYOSH)*VLOGS(1) ) + SCALE = SCALE*AA +C UPDATE THE FORCES + GLOGS(1) = (SCALE*SCALE*AKIN - GNKT)/QMASS(1) +C UPDATE THE THERMOSTAT POSITIONS + DO INOS = 1,NNOS + XLOGS(INOS) = XLOGS(INOS) + VLOGS(INOS)*WDTI2(IYOSH) + ENDDO +C UPDATE THE THERMOSTAT VELOCITIES + DO INOS = 1,NNOS-1 + AA = EXP(-WDTI8(IYOSH)*VLOGS(INOS+1) ) + VLOGS(INOS) = VLOGS(INOS)*AA*AA + & + WDTI4(IYOSH)*GLOGS(INOS)*AA + GLOGS(INOS+1) = (QMASS(INOS)*VLOGS(INOS)*VLOGS(INOS) + & -GKT)/QMASS(INOS+1) + ENDDO + VLOGS(NNOS) = VLOGS(NNOS) + GLOGS(NNOS)*WDTI4(IYOSH) + ENDDO + ENDDO +C UPDATE THE PARTICLE VELOCITIES +c outside of this subroutine +c DO I = 1,N +c VX(I) = VX(I)*SCALE +c VY(I) = VY(I)*SCALE +c VZ(I) = VZ(I)*SCALE +c ENDDO + RETURN + END +c----------------------------------------------------------------- + subroutine tnp1_respa_i_step1 +c Applying Nose-Poincare algorithm - step 1 to coordinates +c JPSJ 70 75 (2001) S. Nose +c +c d_t is not updated here +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision adt,adt2,tmp + + tmp=1+pi_np/(2*Q_np)*0.5*d_time + s12_np=s_np*tmp**2 + pistar=pi_np/tmp + s12_dt=d_time/s12_np + d_time_s12=d_time*0.5*s12_np + + do j=1,3 + d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s12 + dc(j,0)=dc_old(j,0)+d_t_new(j,0)*s12_dt + enddo + do i=nnt,nct-1 + do j=1,3 + d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s12 + dc(j,i)=dc_old(j,i)+d_t_new(j,i)*s12_dt + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s12 + dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*s12_dt + enddo + endif + enddo + return + end +c--------------------------------------------------------------------- + subroutine tnp1_respa_i_step2 +c Step 2 of the velocity Verlet algorithm: update velocities + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + + double precision d_time_s12 + + do i=0,2*nres + do j=1,3 + d_t(j,i)=d_t_new(j,i) + enddo + enddo + + call kinetic(EK) + EK=EK/s12_np**2 + + d_time_s12=0.5d0*s12_np*d_time + + do j=1,3 + d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s12 + enddo + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s12 + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s12 + enddo + endif + enddo + + pistar=pistar+(EK-0.5*(E_old+potE) + & -dimen3*Rb*t_bath*log(s12_np)+Csplit-dimen3*Rb*t_bath)*d_time + tmp=1+pistar/(2*Q_np)*0.5*d_time + s_np=s12_np*tmp**2 + pi_np=pistar/tmp + + return + end +c------------------------------------------------------- + + subroutine tnp1_step1 +c Applying Nose-Poincare algorithm - step 1 to coordinates +c JPSJ 70 75 (2001) S. Nose +c +c d_t is not updated here +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision adt,adt2,tmp + + tmp=1+pi_np/(2*Q_np)*0.5*d_time + s12_np=s_np*tmp**2 + pistar=pi_np/tmp + s12_dt=d_time/s12_np + d_time_s12=d_time*0.5*s12_np + + do j=1,3 + d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s12 + dc(j,0)=dc_old(j,0)+d_t_new(j,0)*s12_dt + enddo + do i=nnt,nct-1 + do j=1,3 + d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s12 + dc(j,i)=dc_old(j,i)+d_t_new(j,i)*s12_dt + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s12 + dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*s12_dt + enddo + endif + enddo + return + end +c--------------------------------------------------------------------- + subroutine tnp1_step2 +c Step 2 of the velocity Verlet algorithm: update velocities + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + + double precision d_time_s12 + + do i=0,2*nres + do j=1,3 + d_t(j,i)=d_t_new(j,i) + enddo + enddo + + call kinetic(EK) + EK=EK/s12_np**2 + + d_time_s12=0.5d0*s12_np*d_time + + do j=1,3 + d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s12 + enddo + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s12 + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s12 + enddo + endif + enddo + +cd write(iout,*) 'pistar',pistar,EK,E_old,potE,s12_np + pistar=pistar+(EK-0.5*(E_old+potE) + & -dimen3*Rb*t_bath*log(s12_np)+H0-dimen3*Rb*t_bath)*d_time + tmp=1+pistar/(2*Q_np)*0.5*d_time + s_np=s12_np*tmp**2 + pi_np=pistar/tmp + + return + end + +c----------------------------------------------------------------- + subroutine tnp_respa_i_step1 +c Applying Nose-Poincare algorithm - step 1 to coordinates +c J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird +c +c d_t is not updated here, it is destroyed +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision C_np,d_time_s,tmp,d_time_ss + + d_time_s=d_time*0.5*s_np +ct2 d_time_s=d_time*0.5*s12_np + + do j=1,3 + d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s + enddo + do i=nnt,nct-1 + do j=1,3 + d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s + enddo + endif + enddo + + do i=0,2*nres + do j=1,3 + d_t(j,i)=d_t_new(j,i) + enddo + enddo + + call kinetic(EK) + EK=EK/s_np**2 + + C_np=0.5*d_time*(dimen3*Rb*t_bath*(1.0+log(s_np))-EK+potE-Csplit) + & -pi_np + + pistar=-2.0*C_np/(1.0+sqrt(1.0-C_np*d_time/Q_np)) + tmp=0.5*d_time*pistar/Q_np + s12_np=s_np*(1.0+tmp)/(1.0-tmp) + + d_time_ss=0.5*d_time*(1.0/s12_np+1.0/s_np) +ct2 d_time_ss=d_time/s12_np +c d_time_ss=0.5*d_time*(1.0/sold_np+1.0/s_np) + + do j=1,3 + dc(j,0)=dc_old(j,0)+d_t_new(j,0)*d_time_ss + enddo + do i=nnt,nct-1 + do j=1,3 + dc(j,i)=dc_old(j,i)+d_t_new(j,i)*d_time_ss + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*d_time_ss + enddo + endif + enddo + + return + end +c--------------------------------------------------------------------- + + subroutine tnp_respa_i_step2 +c Step 2 of the velocity Verlet algorithm: update velocities + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + + double precision d_time_s + + EK=EK*(s_np/s12_np)**2 + HNose1=Hnose(EK,s12_np,potE,pistar,Q_np,t_bath,dimen3) + pi_np=pistar+0.5*d_time*(2*EK-dimen3*Rb*t_bath + & -HNose1+Csplit) + +cr print '(a,5f)','i_step2',EK,potE,HNose1,pi_np,E_long + d_time_s=d_time*0.5*s12_np +c d_time_s=d_time*0.5*s_np + + do j=1,3 + d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s + enddo + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s + enddo + endif + enddo + + s_np=s12_np + + return + end +c----------------------------------------------------------------- + subroutine tnp_respa_step1 +c Applying Nose-Poincare algorithm - step 1 to vel for RESPA +c J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird +c +c d_t is not updated here, it is destroyed +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision C_np,d_time_s,tmp,d_time_ss + double precision energia(0:n_ene) + + d_time_s=d_time*0.5*s_np + + do j=1,3 + d_t_old(j,0)=d_t_old(j,0)+d_a(j,0)*d_time_s + enddo + do i=nnt,nct-1 + do j=1,3 + d_t_old(j,i)=d_t_old(j,i)+d_a(j,i)*d_time_s + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t_old(j,inres)=d_t_old(j,inres)+d_a(j,inres)*d_time_s + enddo + endif + enddo + + +c C_np=0.5*d_time*(dimen3*Rb*t_bath*(1.0+log(s_np))-EK+potE-H0) +c & -pi_np +c +c pistar=-2.0*C_np/(1.0+sqrt(1.0-C_np*d_time/Q_np)) +c tmp=0.5*d_time*pistar/Q_np +c s12_np=s_np*(1.0+tmp)/(1.0-tmp) +c write(iout,*) 'tnp_respa_step1',s_np,s12_np,EK,potE,C_np,pistar,tmp + +ct1 pi_np=pistar +c sold_np=s_np +c s_np=s12_np + +c------------------------------------- +c test of reviewer's comment + pi_np=pi_np-0.5*d_time*(E_long+Csplit-H0) +cr print '(a,3f)','1 pi_np,s_np',pi_np,s_np,E_long +c------------------------------------- + + return + end +c--------------------------------------------------------------------- + subroutine tnp_respa_step2 +c Step 2 of the velocity Verlet algorithm: update velocities for RESPA + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + + double precision d_time_s + +ct1 s12_np=s_np +ct2 pistar=pi_np + +ct call kinetic(EK) +ct HNose1=Hnose(EK,s12_np,potE,pistar,Q_np,t_bath,dimen3) +ct pi_np=pistar+0.5*d_time*(2*EK-dimen3*Rb*t_bath) +ct & -0.5*d_time*(HNose1-H0) + +c------------------------------------- +c test of reviewer's comment + pi_np=pi_np-0.5*d_time*(E_long+Csplit-H0) +cr print '(a,3f)','2 pi_np,s_np',pi_np,s_np,E_long +c------------------------------------- + d_time_s=d_time*0.5*s_np + + do j=1,3 + d_t_old(j,0)=d_t_old(j,0)+d_a(j,0)*d_time_s + enddo + do i=nnt,nct-1 + do j=1,3 + d_t_old(j,i)=d_t_old(j,i)+d_a(j,i)*d_time_s + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t_old(j,inres)=d_t_old(j,inres)+d_a(j,inres)*d_time_s + enddo + endif + enddo + +cd s_np=s12_np + + return + end +c--------------------------------------------------------------------- + subroutine tnp_step1 +c Applying Nose-Poincare algorithm - step 1 to coordinates +c J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird +c +c d_t is not updated here, it is destroyed +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision C_np,d_time_s,tmp,d_time_ss + + d_time_s=d_time*0.5*s_np + + do j=1,3 + d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s + enddo + do i=nnt,nct-1 + do j=1,3 + d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s + enddo + endif + enddo + + do i=0,2*nres + do j=1,3 + d_t(j,i)=d_t_new(j,i) + enddo + enddo + + call kinetic(EK) + EK=EK/s_np**2 + + C_np=0.5*d_time*(dimen3*Rb*t_bath*(1.0+log(s_np))-EK+potE-H0) + & -pi_np + + pistar=-2.0*C_np/(1.0+sqrt(1.0-C_np*d_time/Q_np)) + tmp=0.5*d_time*pistar/Q_np + s12_np=s_np*(1.0+tmp)/(1.0-tmp) +c write(iout,*) 'tnp_step1',s_np,s12_np,EK,potE,C_np,pistar,tmp + + d_time_ss=0.5*d_time*(1.0/s12_np+1.0/s_np) + + do j=1,3 + dc(j,0)=dc_old(j,0)+d_t_new(j,0)*d_time_ss + enddo + do i=nnt,nct-1 + do j=1,3 + dc(j,i)=dc_old(j,i)+d_t_new(j,i)*d_time_ss + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*d_time_ss + enddo + endif + enddo + + return + end +c----------------------------------------------------------------- + subroutine tnp_step2 +c Step 2 of the velocity Verlet algorithm: update velocities + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + + double precision d_time_s + + EK=EK*(s_np/s12_np)**2 + HNose1=Hnose(EK,s12_np,potE,pistar,Q_np,t_bath,dimen3) + pi_np=pistar+0.5*d_time*(2*EK-dimen3*Rb*t_bath) + & -0.5*d_time*(HNose1-H0) + +cd write(iout,'(a,4f)') 'mmm',EK,potE,HNose1,pi_np + d_time_s=d_time*0.5*s12_np + + do j=1,3 + d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s + enddo + do i=nnt,nct-1 + do j=1,3 + d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + inres=i+nres + do j=1,3 + d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s + enddo + endif + enddo + + s_np=s12_np + + return + end + + subroutine hmc_test(itime) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.MD' + include 'COMMON.CHAIN' + + hmc_acc=hmc_acc+1 + delta=-(potE+EK-hmc_etot)/(Rb*t_bath) + if (delta .lt. -50.0d0) then + delta=0.0d0 + else + delta=dexp(delta) + endif + xxx=ran_number(0.0d0,1.0d0) + + if (me.eq.king .or. .not. out1file) + & write(iout,'(a8,i5,6f10.4)') + & 'HMC',itime,potE+EK,potE,EK,hmc_etot,delta,xxx + + if (delta .le. xxx) then + do i=1,2*nres + do j=1,3 + dc(j,i)=dc_hmc(j,i) + enddo + enddo + itime=itime-hmc + totT=totThmc + else + if (me.eq.king .or. .not. out1file) + & write(iout,*) 'HMC accepting new' + totThmc=totT + do i=1,2*nres + do j=1,3 + dc_hmc(j,i)=dc(j,i) + enddo + enddo + endif + + call chainbuild_cart + call random_vel + do i=0,2*nres + do j=1,3 + d_t_old(j,i)=d_t(j,i) + enddo + enddo + call kinetic(EK) + kinetic_T=2.0d0/(dimen3*Rb)*EK + call etotal(potEcomp) + potE=potEcomp(0) + hmc_etot=potE+EK + if (me.eq.king .or. .not. out1file) + & write(iout,'(a8,i5,3f10.4)')'HMC new',itime,potE+EK,potE,EK + + + return + end diff --git a/source/unres/src_MD-NEWSC/MP.F b/source/unres/src_MD-NEWSC/MP.F new file mode 100644 index 0000000..b08897c --- /dev/null +++ b/source/unres/src_MD-NEWSC/MP.F @@ -0,0 +1,516 @@ +#ifdef MPI + subroutine init_task + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + logical lprn /.false./ +c real*8 text1 /'group_i '/,text2/'group_f '/, +c & text3/'initialb'/,text4/'initiale'/, +c & text5/'openb'/,text6/'opene'/ + integer cgtasks(0:max_cg_procs) + character*3 cfgprocs + integer cg_size,fg_size,fg_size1 +c start parallel processing +c print *,'Initializing MPI' + call mpi_init(ierr) + if (ierr.ne.0) then + print *, ' cannot initialize MPI' + stop + endif +c determine # of nodes and current node + call MPI_Comm_rank( MPI_COMM_WORLD, me, ierr ) + if (ierr.ne.0) then + print *, ' cannot determine rank of all processes' + call MPI_Finalize( MPI_COMM_WORLD, IERR ) + stop + endif + call MPI_Comm_size( MPI_Comm_world, nodes, ierr ) + if (ierr.ne.0) then + print *, ' cannot determine number of processes' + stop + endif + Nprocs=nodes + MyRank=me +C Determine the number of "fine-grain" tasks + call getenv_loc("FGPROCS",cfgprocs) + read (cfgprocs,'(i3)') nfgtasks + if (nfgtasks.eq.0) nfgtasks=1 + call getenv_loc("MAXGSPROCS",cfgprocs) + read (cfgprocs,'(i3)') max_gs_size + if (max_gs_size.eq.0) max_gs_size=2 + if (lprn) + & print *,"Processor",me," nfgtasks",nfgtasks, + & " max_gs_size",max_gs_size + if (nfgtasks.eq.1) then + CG_COMM = MPI_COMM_WORLD + fg_size=1 + fg_rank=0 + nfgtasks1=1 + fg_rank1=0 + else + nodes=nprocs/nfgtasks + if (nfgtasks*nodes.ne.nprocs) then + write (*,'(a)') 'ERROR: Number of processors assigned', + & ' to coarse-grained tasks must be divisor', + & ' of the total number of processors.' + call MPI_Finalize( MPI_COMM_WORLD, IERR ) + stop + endif +C Put the ranks of coarse-grain processes in one table and create +C the respective communicator. The processes with ranks "in between" +C the ranks of CG processes will perform fine graining for the CG +C process with the next lower rank. + do i=0,nprocs-1,nfgtasks + cgtasks(i/nfgtasks)=i + enddo + if (lprn) then + print*,"Processor",me," cgtasks",(cgtasks(i),i=0,nodes-1) +c print "(a,i5,a)","Processor",myrank," Before MPI_Comm_group" + endif +c call memmon_print_usage() + call MPI_Comm_group(MPI_COMM_WORLD,world_group,IERR) + call MPI_Group_incl(world_group,nodes,cgtasks,cg_group,IERR) + call MPI_Comm_create(MPI_COMM_WORLD,cg_group,CG_COMM,IERR) + call MPI_Group_rank(cg_group,me,ierr) + call MPI_Group_free(world_group,ierr) + call MPI_Group_free(cg_group,ierr) +c print "(a,i5,a)","Processor",myrank," After MPI_Comm_group" +c call memmon_print_usage() + if (me.ne.MPI_UNDEFINED) call MPI_Comm_Rank(CG_COMM,me,ierr) + if (lprn) print *," Processor",myrank," CG rank",me +C Create communicators containig processes doing "fine grain" tasks. +C The processes within each FG_COMM should have fast communication. + kolor=MyRank/nfgtasks + key=mod(MyRank,nfgtasks) + call MPI_Comm_split(MPI_COMM_WORLD,kolor,key,FG_COMM,ierr) + call MPI_Comm_size(FG_COMM,fg_size,ierr) + if (fg_size.ne.nfgtasks) then + write (*,*) "OOOOps... the number of fg tasks is",fg_size, + & " but",nfgtasks," was requested. MyRank=",MyRank + endif + call MPI_Comm_rank(FG_COMM,fg_rank,ierr) + if (fg_size.gt.max_gs_size) then + kolor1=fg_rank/max_gs_size + key1=mod(fg_rank,max_gs_size) + call MPI_Comm_split(FG_COMM,kolor1,key1,FG_COMM1,ierr) + call MPI_Comm_size(FG_COMM1,nfgtasks1,ierr) + call MPI_Comm_rank(FG_COMM1,fg_rank1,ierr) + else + FG_COMM1=FG_COMM + nfgtasks1=nfgtasks + fg_rank1=fg_rank + endif + endif + if (fg_rank.eq.0) then + write (*,*) "Processor",MyRank," out of",nprocs, + & " rank in CG_COMM",me," size of CG_COMM",nodes, + & " size of FG_COMM",fg_size, + & " rank in FG_COMM1",fg_rank1," size of FG_COMM1",nfgtasks1 + else + write (*,*) "Processor",MyRank," out of",nprocs, + & " rank in FG_COMM",fg_rank," size of FG_COMM",fg_size, + & " rank in FG_COMM1",fg_rank1," size of FG_COMM1",nfgtasks1 + endif +C Initialize other variables. +c print '(a)','Before initialize' +c call memmon_print_usage() + call initialize +c print '(a,i5,a)','Processor',myrank,' After initialize' +c call memmon_print_usage() +C Open task-dependent files. +c print '(a,i5,a)','Processor',myrank,' Before openunits' +c call memmon_print_usage() + call openunits +c print '(a,i5,a)','Processor',myrank,' After openunits' +c call memmon_print_usage() + if (me.eq.king .or. fg_rank.eq.0 .and. .not. out1file) + & write (iout,'(80(1h*)/a/80(1h*))') + & 'United-residue force field calculation - parallel job.' +c print *,"Processor",myrank," exited OPENUNITS" + return + end +C----------------------------------------------------------------------------- + subroutine finish_task + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.REMD' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TIME1' + include 'COMMON.MD' + integer ilen + external ilen +c + call MPI_Barrier(CG_COMM,ierr) + if (nfgtasks.gt.1) + & call MPI_Bcast(-1,1,MPI_INTEGER,king,FG_COMM,IERROR) + time1=MPI_WTIME() + if (me.eq.king .or. .not. out1file) then + write (iout,'(a,i4,a)') 'CG processor',me,' is finishing work.' + write (iout,*) 'Total wall clock time',time1-walltime,' sec' + if (nfgtasks.gt.1) then + write (iout,'(80(1h=)/a/(80(1h=)))') + & "Details of FG communication time" + write (iout,'(7(a40,1pe15.5/),40(1h-)/a40,1pe15.5/80(1h=))') + & "BROADCAST:",time_bcast,"REDUCE:",time_reduce, + & "GATHER:",time_gather, + & "SCATTER:",time_scatter,"SENDRECV:",time_sendrecv, + & "BARRIER ene",time_barrier_e, + & "BARRIER grad",time_barrier_g,"TOTAL:", + & time_bcast+time_reduce+time_gather+time_scatter+time_sendrecv + & +time_barrier_e+time_barrier_g + write (*,*) 'Total wall clock time',time1-walltime,' sec' + write (*,*) "Processor",me," BROADCAST time",time_bcast, + & " REDUCE time", + & time_reduce," GATHER time",time_gather," SCATTER time", + & time_scatter," SENDRECV",time_sendrecv, + & " BARRIER ene",time_barrier_e," BARRIER grad",time_barrier_g + endif + endif + write (*,'(a,i4,a)') 'CG processor',me,' is finishing work.' + if (ilen(tmpdir).gt.0) then + write (*,*) "Processor",me, + & ": moving output files to the parent directory..." + close(inp) + close(istat,status='keep') + if (ntwe.gt.0) call move_from_tmp(statname) + close(irest2,status='keep') + if (modecalc.eq.12.or. + & (modecalc.eq.14 .and. .not.restart1file)) then + call move_from_tmp(rest2name) + else if (modecalc.eq.14.and. me.eq.king) then + call move_from_tmp(mremd_rst_name) + endif + if (mdpdb) then + close(ipdb,status='keep') + call move_from_tmp(pdbname) + else if (me.eq.king .or. .not.traj1file) then + close(icart,status='keep') + call move_from_tmp(cartname) + endif + if (me.eq.king .or. .not. out1file) then + close (iout,status='keep') + call move_from_tmp(outname) + endif + endif + return + end +c------------------------------------------------------------------------- + subroutine pattern_receive + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SETUP' + include 'COMMON.THREAD' + include 'COMMON.IOUNITS' + integer tag,status(MPI_STATUS_SIZE) + integer source,ThreadType + logical flag + ThreadType=45 + source=mpi_any_source + call mpi_iprobe(source,ThreadType, + & CG_COMM,flag,status,ierr) + do while (flag) + write (iout,*) 'Processor ',Me,' is receiving threading', + & ' pattern from processor',status(mpi_source) + write (*,*) 'Processor ',Me,' is receiving threading', + & ' pattern from processor',status(mpi_source) + nexcl=nexcl+1 + call mpi_irecv(iexam(1,nexcl),2,mpi_integer,status(mpi_source), + & ThreadType, CG_COMM,ireq,ierr) + write (iout,*) 'Received pattern:',nexcl,iexam(1,nexcl), + & iexam(2,nexcl) + source=mpi_any_source + call mpi_iprobe(source,ThreadType, + & CG_COMM,flag,status,ierr) + enddo + return + end +c---------------------------------------------------------------------------- + subroutine pattern_send + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.INFO' + include 'COMMON.THREAD' + include 'COMMON.IOUNITS' + integer source,ThreadType,ireq + ThreadType=45 + do iproc=0,nprocs-1 + if (iproc.ne.me .and. .not.Koniec(iproc) ) then + call mpi_isend(iexam(1,nexcl),2,mpi_integer,iproc, + & ThreadType, CG_COMM, ireq, ierr) + write (iout,*) 'CG processor ',me,' has sent pattern ', + & 'to processor',iproc + write (*,*) 'CG processor ',me,' has sent pattern ', + & 'to processor',iproc + write (iout,*) 'Pattern:',nexcl,iexam(1,nexcl),iexam(2,nexcl) + endif + enddo + return + end +c----------------------------------------------------------------------------- + subroutine send_stop_sig(Kwita) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.INFO' + include 'COMMON.IOUNITS' + integer StopType,StopId,iproc,Kwita,NBytes + StopType=66 +c Kwita=-1 +C print *,'CG processor',me,' StopType=',StopType + Koniec(me)=.true. + if (me.eq.king) then +C Master sends the STOP signal to everybody. + write (iout,'(a,a)') + & 'Master is sending STOP signal to other processors.' + do iproc=1,nprocs-1 + print *,'Koniec(',iproc,')=',Koniec(iproc) + if (.not. Koniec(iproc)) then + call mpi_send(Kwita,1,mpi_integer,iproc,StopType, + & mpi_comm_world,ierr) + write (iout,*) 'Iproc=',iproc,' StopID=',StopID + write (*,*) 'Iproc=',iproc,' StopID=',StopID + endif + enddo + else +C Else send the STOP signal to Master. + call mpi_send(Kwita,1,mpi_integer,MasterID,StopType, + & mpi_comm_world,ierr) + write (iout,*) 'CG processor=',me,' StopID=',StopID + write (*,*) 'CG processor=',me,' StopID=',StopID + endif + return + end +c----------------------------------------------------------------------------- + subroutine recv_stop_sig(Kwita) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.INFO' + include 'COMMON.IOUNITS' + integer source,StopType,StopId,iproc,Kwita + logical flag + StopType=66 + Kwita=0 + source=mpi_any_source +c print *,'CG processor:',me,' StopType=',StopType + call mpi_iprobe(source,StopType, + & mpi_comm_world,flag,status,ierr) + do while (flag) + Koniec(status(mpi_source))=.true. + write (iout,*) 'CG processor ',me,' is receiving STOP signal', + & ' from processor',status(mpi_source) + write (*,*) 'CG processor ',me,' is receiving STOP signal', + & ' from processor',status(mpi_source) + call mpi_irecv(Kwita,1,mpi_integer,status(mpi_source),StopType, + & mpi_comm_world,ireq,ierr) + call mpi_iprobe(source,StopType, + & mpi_comm_world,flag,status,ierr) + enddo + return + end +c----------------------------------------------------------------------------- + subroutine send_MCM_info(ione) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SETUP' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + integer tag,status(MPI_STATUS_SIZE) + integer MCM_info_Type,MCM_info_ID,iproc,one,NBytes + common /aaaa/ isend,irecv + integer nsend + save nsend + nsend=nsend+1 + MCM_info_Type=77 +cd write (iout,'(a,i4,a)') 'CG Processor',me, +cd & ' is sending MCM info to Master.' + write (*,'(a,i4,a,i8)') 'CG processor',me, + & ' is sending MCM info to Master, MCM_info_ID=',MCM_info_ID + call mpi_isend(ione,1,mpi_integer,MasterID, + & MCM_info_Type,mpi_comm_world, MCM_info_ID, ierr) +cd write (iout,*) 'CG processor',me,' has sent info to the master;', +cd & ' MCM_info_ID=',MCM_info_ID + write (*,*) 'CG processor',me,' has sent info to the master;', + & ' MCM_info_ID=',MCM_info_ID,' ierr ',ierr + isend=0 + irecv=0 + return + end +c---------------------------------------------------------------------------- + subroutine receive_MCM_info + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SETUP' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + integer tag,status(MPI_STATUS_SIZE) + integer source,MCM_info_Type,MCM_info_ID,iproc,ione + logical flag + MCM_info_Type=77 + source=mpi_any_source +c print *,'source=',source,' dontcare=',dontcare + call mpi_iprobe(source,MCM_info_Type, + & mpi_comm_world,flag,status,ierr) + do while (flag) + source=status(mpi_source) + itask=source/fgProcs+1 +cd write (iout,*) 'Master is receiving MCM info from processor ', +cd & source,' itask',itask + write (*,*) 'Master is receiving MCM info from processor ', + & source,' itask',itask + call mpi_irecv(ione,1,mpi_integer,source,MCM_info_type, + & mpi_comm_world,MCM_info_ID,ierr) +cd write (iout,*) 'Received from processor',source,' IONE=',ione + write (*,*) 'Received from processor',source,' IONE=',ione + nacc_tot=nacc_tot+1 + if (ione.eq.2) nsave_part(itask)=nsave_part(itask)+1 +cd print *,'nsave_part(',itask,')=',nsave_part(itask) +cd write (iout,*) 'Nacc_tot=',Nacc_tot +cd write (*,*) 'Nacc_tot=',Nacc_tot + source=mpi_any_source + call mpi_iprobe(source,MCM_info_Type, + & mpi_comm_world,flag,status,ierr) + enddo + return + end +c--------------------------------------------------------------------------- + subroutine send_thread_results + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SETUP' + include 'COMMON.THREAD' + include 'COMMON.IOUNITS' + integer tag,status(MPI_STATUS_SIZE) + integer ibuffer(2*maxthread+2),ThreadType,ThreadID,EnerType, + & EnerID,msglen,nbytes + double precision buffer(20*maxthread+2) + ThreadType=444 + EnerType=555 + ipatt(1,nthread+1)=nthread + ipatt(2,nthread+1)=nexcl + do i=1,nthread + do j=1,n_ene + ener(j,i+nthread)=ener0(j,i) + enddo + enddo + ener(1,2*nthread+1)=max_time_for_thread + ener(2,2*nthread+1)=ave_time_for_thread +C Send the IPATT array + write (iout,*) 'CG processor',me, + & ' is sending IPATT array to master: NTHREAD=',nthread + write (*,*) 'CG processor',me, + & ' is sending IPATT array to master: NTHREAD=',nthread + msglen=2*nthread+2 + call mpi_send(ipatt(1,1),msglen,MPI_INTEGER,MasterID, + & ThreadType,mpi_comm_world,ierror) + write (iout,*) 'CG processor',me, + & ' has sent IPATT array to master MSGLEN',msglen + write (*,*) 'CG processor',me, + & ' has sent IPATT array to master MSGLEN',msglen +C Send the energies. + msglen=n_ene2*nthread+2 + write (iout,*) 'CG processor',me,' is sending energies to master.' + write (*,*) 'CG processor',me,' is sending energies to master.' + call mpi_send(ener(1,1),msglen,MPI_DOUBLE_PRECISION,MasterID, + & EnerType,mpi_comm_world,ierror) + write (iout,*) 'CG processor',me,' has sent energies to master.' + write (*,*) 'CG processor',me,' has sent energies to master.' + return + end +c---------------------------------------------------------------------------- + subroutine receive_thread_results(iproc) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.INFO' + include 'COMMON.THREAD' + include 'COMMON.IOUNITS' + integer ibuffer(2*maxthread+2),ThreadType,ThreadID,EnerType, + & EnerID,ReadyType,ReadyID,Ready,msglen,nbytes,nthread_temp + double precision buffer(20*maxthread+2),max_time_for_thread_t, + & ave_time_for_thread_t + logical flag + ThreadType=444 + EnerType=555 +C Receive the IPATT array + call mpi_probe(iproc,ThreadType, + & mpi_comm_world,status,ierr) + call MPI_GET_COUNT(STATUS, MPI_INTEGER, MSGLEN, IERROR) + write (iout,*) 'Master is receiving IPATT array from processor:', + & iproc,' MSGLEN',msglen + write (*,*) 'Master is receiving IPATT array from processor:', + & iproc,' MSGLEN',msglen + call mpi_recv(ipatt(1,nthread+1),msglen,mpi_integer,iproc, + & ThreadType, + & mpi_comm_world,status,ierror) + write (iout,*) 'Master has received IPATT array from processor:', + & iproc,' MSGLEN=',msglen + write (*,*) 'Master has received IPATT array from processor:', + & iproc,' MSGLEN=',msglen + nthread_temp=ipatt(1,nthread+msglen/2) + nexcl_temp=ipatt(2,nthread+msglen/2) +C Receive the energies. + call mpi_probe(iproc,EnerType, + & mpi_comm_world,status,ierr) + call MPI_GET_COUNT(STATUS, MPI_DOUBLE_PRECISION, MSGLEN, IERROR) + write (iout,*) 'Master is receiving energies from processor:', + & iproc,' MSGLEN=',MSGLEN + write (*,*) 'Master is receiving energies from processor:', + & iproc,' MSGLEN=',MSGLEN + call mpi_recv(ener(1,nthread+1),msglen, + & MPI_DOUBLE_PRECISION,iproc, + & EnerType,MPI_COMM_WORLD,status,ierror) + write (iout,*) 'Msglen=',Msglen + write (*,*) 'Msglen=',Msglen + write (iout,*) 'Master has received energies from processor',iproc + write (*,*) 'Master has received energies from processor',iproc + write (iout,*) 'NTHREAD_TEMP=',nthread_temp,' NEXCL=',nexcl_temp + write (*,*) 'NTHREAD_TEMP=',nthread_temp,' NEXCL=',nexcl_temp + do i=1,nthread_temp + do j=1,n_ene + ener0(j,nthread+i)=ener(j,nthread+nthread_temp+i) + enddo + enddo + max_time_for_thread_t=ener(1,nthread+2*nthread_temp+1) + ave_time_for_thread_t=ener(2,nthread+2*nthread_temp+1) + write (iout,*) 'MAX_TIME_FOR_THREAD:',max_time_for_thread_t + write (iout,*) 'AVE_TIME_FOR_THREAD:',ave_time_for_thread_t + write (*,*) 'MAX_TIME_FOR_THREAD:',max_time_for_thread_t + write (*,*) 'AVE_TIME_FOR_THREAD:',ave_time_for_thread_t + if (max_time_for_thread_t.gt.max_time_for_thread) + & max_time_for_thread=max_time_for_thread_t + ave_time_for_thread=(nthread*ave_time_for_thread+ + & nthread_temp*ave_time_for_thread_t)/(nthread+nthread_temp) + nthread=nthread+nthread_temp + return + end +#else + subroutine init_task + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SETUP' + me=0 + myrank=0 + fg_rank=0 + fg_size=1 + nodes=1 + nprocs=1 + call initialize + call openunits + write (iout,'(80(1h*)/a/80(1h*))') + & 'United-residue force field calculation - serial job.' + return + end +#endif diff --git a/source/unres/src_MD-NEWSC/MREMD.F b/source/unres/src_MD-NEWSC/MREMD.F new file mode 100644 index 0000000..576e43d --- /dev/null +++ b/source/unres/src_MD-NEWSC/MREMD.F @@ -0,0 +1,2102 @@ +#ifdef MPI + subroutine MREMD + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.MUCA' + integer ERRCODE + double precision cm(3),L(3),vcm(3) + double precision energia(0:n_ene) + double precision remd_t_bath(maxprocs) + integer iremd_iset(maxprocs) + integer*2 i_index + & (maxprocs/4,maxprocs/20,maxprocs/200,maxprocs/200) + double precision remd_ene(0:n_ene+4,maxprocs),t_bath_old + integer iremd_acc(maxprocs),iremd_tot(maxprocs) + integer iremd_acc_usa(maxprocs),iremd_tot_usa(maxprocs) + integer ilen,rstcount + external ilen + character*50 tytul + common /gucio/ cm + integer itime +cold integer nup(0:maxprocs),ndown(0:maxprocs) + integer rep2i(0:maxprocs),ireqi(maxprocs) + integer icache_all(maxprocs) + integer status(MPI_STATUS_SIZE),statusi(MPI_STATUS_SIZE,maxprocs) + logical synflag,end_of_run,file_exist /.false./,ovrtim + real ene_tol /1.0e-5/ + +cdeb imin_itime_old=0 + ntwx_cache=0 + time00=MPI_WTIME() + time01=time00 + if(me.eq.king.or..not.out1file) then + write (iout,*) 'MREMD',nodes,'time before',time00-walltime + write (iout,*) "NREP=",nrep + endif + + synflag=.false. + if (ilen(tmpdir).gt.0 .and. (me.eq.king)) then + call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_mremd.rst") + endif + mremd_rst_name=prefix(:ilen(prefix))//"_mremd.rst" + +cd print *,'MREMD',nodes +cd print *,'mmm',me,remd_mlist,(remd_m(i),i=1,nrep) +cde write (iout,*) "Start MREMD: me",me," t_bath",t_bath + + if(hremd.gt.0) then + nset=hremd + do i=1,nset + mset(i)=1 + enddo + endif + + k=0 + rep2i(k)=-1 + do il=1,max0(nset,1) + do il1=1,max0(mset(il),1) + do i=1,nrep + iremd_acc(i)=0 + iremd_acc_usa(i)=0 + iremd_tot(i)=0 + do j=1,remd_m(i) + i2rep(k)=i + i2set(k)=il + rep2i(i)=k + k=k+1 + i_index(i,j,il,il1)=k + enddo + enddo + enddo + enddo + + if(me.eq.king.or..not.out1file) then + write(iout,*) "i2rep",(i2rep(i),i=0,nodes-1) + write(iout,*) "i2set",(i2set(i),i=0,nodes-1) + write(iout,*) "i,j,il,il1,i_index(i,j,il,il1)" + do il=1,nset + do il1=1,mset(il) + do i=1,nrep + do j=1,remd_m(i) + write(iout,*) i,j,il,il1,i_index(i,j,il,il1) + enddo + enddo + enddo + enddo + endif + +c print *,'i2rep',me,i2rep(me) +c print *,'rep2i',(rep2i(i),i=0,nrep) + +cold if (i2rep(me).eq.nrep) then +cold nup(0)=0 +cold else +cold nup(0)=remd_m(i2rep(me)+1) +cold k=rep2i(int(i2rep(me)))+1 +cold do i=1,nup(0) +cold nup(i)=k +cold k=k+1 +cold enddo +cold endif + +cd print '(i4,a4,100i4)',me,' nup',(nup(i),i=0,nup(0)) + +cold if (i2rep(me).eq.1) then +cold ndown(0)=0 +cold else +cold ndown(0)=remd_m(i2rep(me)-1) +cold k=rep2i(i2rep(me)-2)+1 +cold do i=1,ndown(0) +cold ndown(i)=k +cold k=k+1 +cold enddo +cold endif + +cd print '(i4,a6,100i4)',me,' ndown',(ndown(i),i=0,ndown(0)) + + + write (*,*) "Processor",me," rest",rest," + & restart1fie",restart1file + if(rest.and.restart1file) then + if (me.eq.king) + & inquire(file=mremd_rst_name,exist=file_exist) +cd write (*,*) me," Before broadcast: file_exist",file_exist + call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM, + & IERR) +cd write (*,*) me," After broadcast: file_exist",file_exist + if(file_exist) then + if(me.eq.king.or..not.out1file) + & write (iout,*) 'Master is reading restart1file' + call read1restart(i_index) + else + if(me.eq.king.or..not.out1file) + & write (iout,*) 'WARNING : no restart1file' + endif + + if(me.eq.king.or..not.out1file) then + write(iout,*) "i2set",(i2set(i),i=0,nodes-1) + write(iout,*) "i_index" + do il=1,nset + do il1=1,mset(il) + do i=1,nrep + do j=1,remd_m(i) + write(iout,*) i,j,il,il1,i_index(i,j,il,il1) + enddo + enddo + enddo + enddo + endif + endif + + if(me.eq.king) then + if (rest.and..not.restart1file) + & inquire(file=mremd_rst_name,exist=file_exist) + if(.not.file_exist.and.rest.and..not.restart1file) + & write(iout,*) 'WARNING : no restart file',mremd_rst_name + IF (rest.and.file_exist.and..not.restart1file) THEN + write (iout,*) 'Master is reading restart file', + & mremd_rst_name + open(irest2,file=mremd_rst_name,status='unknown') + read (irest2,*) + read (irest2,*) (i2rep(i),i=0,nodes-1) + read (irest2,*) + read (irest2,*) (ifirst(i),i=1,remd_m(1)) + do il=1,nodes + read (irest2,*) + read (irest2,*) nupa(0,il),(nupa(i,il),i=1,nupa(0,il)) + read (irest2,*) + read (irest2,*) ndowna(0,il), + & (ndowna(i,il),i=1,ndowna(0,il)) + enddo + if(usampl.or.hremd.gt.0) then + read (irest2,*) + read (irest2,*) nset + read (irest2,*) + read (irest2,*) (mset(i),i=1,nset) + read (irest2,*) + read (irest2,*) (i2set(i),i=0,nodes-1) + read (irest2,*) + do il=1,nset + do il1=1,mset(il) + do i=1,nrep + read(irest2,*) (i_index(i,j,il,il1),j=1,remd_m(i)) + enddo + enddo + enddo + + write(iout,*) "i2set",(i2set(i),i=0,nodes-1) + write(iout,*) "i_index" + do il=1,nset + do il1=1,mset(il) + do i=1,nrep + do j=1,remd_m(i) + write(iout,*) i,j,il,il1,i_index(i,j,il,il1) + enddo + enddo + enddo + enddo + endif + + close(irest2) + + write (iout,'(a6,1000i5)') "i2rep",(i2rep(i),i=0,nodes-1) + write (iout,'(a6,1000i5)') "ifirst", + & (ifirst(i),i=1,remd_m(1)) + do il=1,nodes + write (iout,'(a6,i4,a1,100i4)') "nupa",il,":", + & (nupa(i,il),i=1,nupa(0,il)) + write (iout,'(a6,i4,a1,100i4)') "ndowna",il,":", + & (ndowna(i,il),i=1,ndowna(0,il)) + enddo + ELSE IF (.not.(rest.and.file_exist)) THEN + do il=1,remd_m(1) + ifirst(il)=il + enddo + + do il=1,nodes + if (i2rep(il-1).eq.nrep) then + nupa(0,il)=0 + else + nupa(0,il)=remd_m(i2rep(il-1)+1) + k=rep2i(int(i2rep(il-1)))+1 + do i=1,nupa(0,il) + nupa(i,il)=k+1 + k=k+1 + enddo + endif + if (i2rep(il-1).eq.1) then + ndowna(0,il)=0 + else + ndowna(0,il)=remd_m(i2rep(il-1)-1) + k=rep2i(i2rep(il-1)-2)+1 + do i=1,ndowna(0,il) + ndowna(i,il)=k+1 + k=k+1 + enddo + endif + enddo + + write (iout,'(a6,100i4)') "ifirst", + & (ifirst(i),i=1,remd_m(1)) + do il=1,nodes + write (iout,'(a6,i4,a1,100i4)') "nupa",il,":", + & (nupa(i,il),i=1,nupa(0,il)) + write (iout,'(a6,i4,a1,100i4)') "ndowna",il,":", + & (ndowna(i,il),i=1,ndowna(0,il)) + enddo + + ENDIF + endif +c +c t_bath=retmin+(retmax-retmin)*me/(nodes-1) + if(.not.(rest.and.file_exist.and.restart1file)) then + if (me .eq. king) then + t_bath=retmin + else + t_bath=retmin+(retmax-retmin)*exp(float(i2rep(me)-nrep)) + endif +cd print *,'ttt',me,remd_tlist,(remd_t(i),i=1,nrep) + if (remd_tlist) t_bath=remd_t(int(i2rep(me))) + + endif + if(usampl.or.hremd.gt.0) then + iset=i2set(me) + if (hremd.gt.0) call set_hweights(iset) + if(me.eq.king.or..not.out1file) + & write(iout,*) me,"iset=",iset,"t_bath=",t_bath + endif +c + stdfp=dsqrt(2*Rb*t_bath/d_time) + do i=1,ntyp + stdfsc(i)=dsqrt(2*Rb*t_bath/d_time) + enddo + +c print *,'irep',me,t_bath + if (.not.rest) then + if (me.eq.king .or. .not. out1file) + & write (iout,'(a60,f10.5)') "REMD Temperature:",t_bath + call rescale_weights(t_bath) + endif + + +c------copy MD-------------- +c The driver for molecular dynamics subroutines +c------------------------------------------------ + t_MDsetup=0.0d0 + t_langsetup=0.0d0 + t_MD=0.0d0 + t_enegrad=0.0d0 + t_sdsetup=0.0d0 + if(me.eq.king.or..not.out1file) + & write (iout,'(20(1h=),a20,20(1h=))') "MD calculation started" +#ifdef MPI + tt0 = MPI_Wtime() +#else + tt0 = tcpu() +#endif +c Determine the inverse of the inertia matrix. + call setup_MD_matrices +c Initialize MD + call init_MD + if (rest) then + if (me.eq.king .or. .not. out1file) + & write (iout,'(a60,f10.5)') "REMD restart Temperature:",t_bath + stdfp=dsqrt(2*Rb*t_bath/d_time) + do i=1,ntyp + stdfsc(i)=dsqrt(2*Rb*t_bath/d_time) + enddo + if (lang.gt.0 .and. .not.surfarea) then + do i=nnt,nct-1 + stdforcp(i)=stdfp*dsqrt(gamp) + enddo + do i=nnt,nct + stdforcsc(i)=stdfsc(itype(i))*dsqrt(gamsc(itype(i))) + enddo + elseif (lang.gt.0 .and. surfarea ) then + call setup_fricmat + endif + call rescale_weights(t_bath) + endif + +#ifdef MPI + t_MDsetup = MPI_Wtime()-tt0 +#else + t_MDsetup = tcpu()-tt0 +#endif + rstcount=0 +c Entering the MD loop +#ifdef MPI + tt0 = MPI_Wtime() +#else + tt0 = tcpu() +#endif + if (lang.eq.2 .or. lang.eq.3) then +#ifndef LANG0 + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif + do i=1,dimen + do j=1,dimen + pfric0_mat(i,j,0)=pfric_mat(i,j) + afric0_mat(i,j,0)=afric_mat(i,j) + vfric0_mat(i,j,0)=vfric_mat(i,j) + prand0_mat(i,j,0)=prand_mat(i,j) + vrand0_mat1(i,j,0)=vrand_mat1(i,j) + vrand0_mat2(i,j,0)=vrand_mat2(i,j) + enddo + enddo + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo +#else + write (iout,*) + & "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0" +#ifdef MPI + call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) +#endif + stop +#endif + else if (lang.eq.1 .or. lang.eq.4) then + call setup_fricmat + endif + time00=MPI_WTIME() + if (me.eq.king .or. .not. out1file) + & write(iout,*) 'Setup time',time00-walltime +ctime call flush(iout) +#ifdef MPI + t_langsetup=MPI_Wtime()-tt0 + tt0=MPI_Wtime() +#else + t_langsetup=tcpu()-tt0 + tt0=tcpu() +#endif + itime=0 + end_of_run=.false. + do while(.not.end_of_run) + itime=itime+1 + if(itime.eq.n_timestep.and.me.eq.king) end_of_run=.true. + if(mremdsync.and.itime.eq.n_timestep) end_of_run=.true. + rstcount=rstcount+1 + if (lang.gt.0 .and. surfarea .and. + & mod(itime,reset_fricmat).eq.0) then + if (lang.eq.2 .or. lang.eq.3) then +#ifndef LANG0 + call setup_fricmat + if (lang.eq.2) then + call sd_verlet_p_setup + else + call sd_verlet_ciccotti_setup + endif + do i=1,dimen + do j=1,dimen + pfric0_mat(i,j,0)=pfric_mat(i,j) + afric0_mat(i,j,0)=afric_mat(i,j) + vfric0_mat(i,j,0)=vfric_mat(i,j) + prand0_mat(i,j,0)=prand_mat(i,j) + vrand0_mat1(i,j,0)=vrand_mat1(i,j) + vrand0_mat2(i,j,0)=vrand_mat2(i,j) + enddo + enddo + flag_stoch(0)=.true. + do i=1,maxflag_stoch + flag_stoch(i)=.false. + enddo +#endif + else if (lang.eq.1 .or. lang.eq.4) then + call setup_fricmat + endif + write (iout,'(a,i10)') + & "Friction matrix reset based on surface area, itime",itime + endif + if (reset_vel .and. tbf .and. lang.eq.0 + & .and. mod(itime,count_reset_vel).eq.0) then + call random_vel + if (me.eq.king .or. .not. out1file) + & write(iout,'(a,f20.2)') + & "Velocities reset to random values, time",totT + do i=0,2*nres + do j=1,3 + d_t_old(j,i)=d_t(j,i) + enddo + enddo + endif + if (reset_moment .and. mod(itime,count_reset_moment).eq.0) then + call inertia_tensor + call vcm_vel(vcm) + do j=1,3 + d_t(j,0)=d_t(j,0)-vcm(j) + enddo + call kinetic(EK) + kinetic_T=2.0d0/(dimen3*Rb)*EK + scalfac=dsqrt(T_bath/kinetic_T) +cd write(iout,'(a,f20.2)') "Momenta zeroed out, time",totT + do i=0,2*nres + do j=1,3 + d_t_old(j,i)=scalfac*d_t(j,i) + enddo + enddo + endif + if (lang.ne.4) then + if (RESPA) then +c Time-reversible RESPA algorithm +c (Tuckerman et al., J. Chem. Phys., 97, 1990, 1992) + call RESPA_step(itime) + else +c Variable time step algorithm. + call velverlet_step(itime) + endif + else +#ifdef BROWN + call brown_step(itime) +#else + print *,"Brown dynamics not here!" +#ifdef MPI + call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) +#endif + stop +#endif + endif + if(hmc.gt.0 .and. mod(itime,hmc).eq.0) then + call statout(itime) + call hmc_test(itime) + endif + if(ntwe.ne.0) then + if (mod(itime,ntwe).eq.0) call statout(itime) + endif + if (mod(itime,ntwx).eq.0.and..not.traj1file) then + write (tytul,'("time",f8.2," temp",f8.1)') totT,t_bath + if(mdpdb) then + call pdbout(potE,tytul,ipdb) + else + call cartout(totT) + endif + endif + if (mod(itime,ntwx).eq.0.and.traj1file) then + if(ntwx_cache.lt.max_cache_traj_use) then + ntwx_cache=ntwx_cache+1 + else + if (max_cache_traj_use.ne.1) + & print *,itime,"processor ",me," over cache ",ntwx_cache + do i=1,ntwx_cache-1 + + totT_cache(i)=totT_cache(i+1) + EK_cache(i)=EK_cache(i+1) + potE_cache(i)=potE_cache(i+1) + t_bath_cache(i)=t_bath_cache(i+1) + Uconst_cache(i)=Uconst_cache(i+1) + iset_cache(i)=iset_cache(i+1) + + do ii=1,nfrag + qfrag_cache(ii,i)=qfrag_cache(ii,i+1) + enddo + do ii=1,npair + qpair_cache(ii,i)=qpair_cache(ii,i+1) + enddo + do ii=1,nfrag_back + utheta_cache(ii,i)=utheta_cache(ii,i+1) + ugamma_cache(ii,i)=ugamma_cache(ii,i+1) + uscdiff_cache(ii,i)=uscdiff_cache(ii,i+1) + enddo + + + do ii=1,nres*2 + do j=1,3 + c_cache(j,ii,i)=c_cache(j,ii,i+1) + enddo + enddo + enddo + endif + + totT_cache(ntwx_cache)=totT + EK_cache(ntwx_cache)=EK + potE_cache(ntwx_cache)=potE + t_bath_cache(ntwx_cache)=t_bath + Uconst_cache(ntwx_cache)=Uconst + iset_cache(ntwx_cache)=iset + + do i=1,nfrag + qfrag_cache(i,ntwx_cache)=qfrag(i) + enddo + do i=1,npair + qpair_cache(i,ntwx_cache)=qpair(i) + enddo + do i=1,nfrag_back + utheta_cache(i,ntwx_cache)=utheta(i) + ugamma_cache(i,ntwx_cache)=ugamma(i) + uscdiff_cache(i,ntwx_cache)=uscdiff(i) + enddo + + do i=1,nres*2 + do j=1,3 + c_cache(j,i,ntwx_cache)=c(j,i) + enddo + enddo + + endif + if ((rstcount.eq.1000.or.itime.eq.n_timestep) + & .and..not.restart1file) then + + if(me.eq.king) then + open(irest1,file=mremd_rst_name,status='unknown') + write (irest1,*) "i2rep" + write (irest1,*) (i2rep(i),i=0,nodes-1) + write (irest1,*) "ifirst" + write (irest1,*) (ifirst(i),i=1,remd_m(1)) + do il=1,nodes + write (irest1,*) "nupa",il + write (irest1,*) nupa(0,il),(nupa(i,il),i=1,nupa(0,il)) + write (irest1,*) "ndowna",il + write (irest1,*) ndowna(0,il), + & (ndowna(i,il),i=1,ndowna(0,il)) + enddo + if(usampl.or.hremd.gt.0) then + write (irest1,*) "nset" + write (irest1,*) nset + write (irest1,*) "mset" + write (irest1,*) (mset(i),i=1,nset) + write (irest1,*) "i2set" + write (irest1,*) (i2set(i),i=0,nodes-1) + write (irest1,*) "i_index" + do il=1,nset + do il1=1,mset(il) + do i=1,nrep + write(irest1,*) (i_index(i,j,il,il1),j=1,remd_m(i)) + enddo + enddo + enddo + + endif + close(irest1) + endif + open(irest2,file=rest2name,status='unknown') + write(irest2,*) totT,EK,potE,totE,t_bath + do i=1,2*nres + write (irest2,'(3e15.5)') (d_t(j,i),j=1,3) + enddo + do i=1,2*nres + write (irest2,'(3e15.5)') (dc(j,i),j=1,3) + enddo + if(usampl.or.hremd.gt.0) then + write (irest2,*) iset + endif + close(irest2) + rstcount=0 + endif + +c REMD - exchange +c forced synchronization + if (mod(itime,i_sync_step).eq.0 .and. me.ne.king + & .and. .not. mremdsync) then + synflag=.false. + call mpi_iprobe(0,101,CG_COMM,synflag,status,ierr) + if (synflag) then + call mpi_recv(itime_master, 1, MPI_INTEGER, + & 0,101,CG_COMM, status, ierr) + call mpi_barrier(CG_COMM, ierr) +cdeb if (out1file.or.traj1file) then +cdeb call mpi_gather(itime,1,mpi_integer, +cdeb & icache_all,1,mpi_integer,king, +cdeb & CG_COMM,ierr) + if(traj1file) + & call mpi_gather(ntwx_cache,1,mpi_integer, + & icache_all,1,mpi_integer,king, + & CG_COMM,ierr) + if (.not.out1file) + & write(iout,*) 'REMD synchro at',itime_master,itime + if (itime_master.ge.n_timestep .or. ovrtim()) + & end_of_run=.true. +ctime call flush(iout) + endif + endif + +c REMD - exchange + if ((mod(itime,nstex).eq.0.and.me.eq.king + & .or.end_of_run.and.me.eq.king ) + & .and. .not. mremdsync ) then + synflag=.true. + time01_=MPI_WTIME() + do i=1,nodes-1 + call mpi_isend(itime,1,MPI_INTEGER,i,101, + & CG_COMM, ireqi(i), ierr) +cd write(iout,*) 'REMD synchro with',i +cd call flush(iout) + enddo + call mpi_waitall(nodes-1,ireqi,statusi,ierr) + call mpi_barrier(CG_COMM, ierr) + time01=MPI_WTIME() + write(iout,*) 'REMD synchro at',itime,'time=',time01-time01_ + if (out1file.or.traj1file) then +cdeb call mpi_gather(itime,1,mpi_integer, +cdeb & itime_all,1,mpi_integer,king, +cdeb & CG_COMM,ierr) +cdeb write(iout,'(a19,8000i8)') ' REMD synchro itime', +cdeb & (itime_all(i),i=1,nodes) + if(traj1file) then +cdeb imin_itime=itime_all(1) +cdeb do i=2,nodes +cdeb if(itime_all(i).lt.imin_itime) imin_itime=itime_all(i) +cdeb enddo +cdeb ii_write=(imin_itime-imin_itime_old)/ntwx +cdeb imin_itime_old=int(imin_itime/ntwx)*ntwx +cdeb write(iout,*) imin_itime,imin_itime_old,ii_write + call mpi_gather(ntwx_cache,1,mpi_integer, + & icache_all,1,mpi_integer,king, + & CG_COMM,ierr) +c write(iout,'(a19,8000i8)') ' ntwx_cache', +c & (icache_all(i),i=1,nodes) + ii_write=icache_all(1) + do i=2,nodes + if(icache_all(i).lt.ii_write) ii_write=icache_all(i) + enddo +c write(iout,*) "MIN ii_write=",ii_write + endif + endif +ctime call flush(iout) + endif + if(mremdsync .and. mod(itime,nstex).eq.0) then + synflag=.true. + if (me.eq.king .or. .not. out1file) + & write(iout,*) 'REMD synchro at',itime + + if(traj1file) then + call mpi_gather(ntwx_cache,1,mpi_integer, + & icache_all,1,mpi_integer,king, + & CG_COMM,ierr) + if (me.eq.king) then + write(iout,'(a19,8000i8)') ' ntwx_cache', + & (icache_all(i),i=1,nodes) + ii_write=icache_all(1) + do i=2,nodes + if(icache_all(i).lt.ii_write) ii_write=icache_all(i) + enddo + write(iout,*) "MIN ii_write=",ii_write + endif + endif +ctest call flush(iout) + endif + if (synflag) then +c Update the time safety limiy + if (time001-time00.gt.safety) then + safety=time001-time00+600 + if (me.eq.king .or. .not. out1file) + & write (iout,*) "****** SAFETY increased to",safety," s" + endif + if (ovrtim()) end_of_run=.true. + endif + if(synflag.and..not.end_of_run) then + time02=MPI_WTIME() + synflag=.false. + +c write(iout,*) 'REMD before',me,t_bath + +c call mpi_gather(t_bath,1,mpi_double_precision, +c & remd_t_bath,1,mpi_double_precision,king, +c & CG_COMM,ierr) + potEcomp(n_ene+1)=t_bath + t_bath_old=t_bath + if (usampl) then + potEcomp(n_ene+2)=iset + if (iset.lt.nset) then + i_set_temp=iset + iset=iset+1 + call EconstrQ + potEcomp(n_ene+3)=Uconst + iset=i_set_temp + endif + if (iset.gt.1) then + i_set_temp=iset + iset=iset-1 + call EconstrQ + potEcomp(n_ene+4)=Uconst + iset=i_set_temp + endif + endif + if(hremd.gt.0) potEcomp(n_ene+2)=iset + call mpi_gather(potEcomp(0),n_ene+5,mpi_double_precision, + & remd_ene(0,1),n_ene+5,mpi_double_precision,king, + & CG_COMM,ierr) + if(lmuca) then + call mpi_gather(elow,1,mpi_double_precision, + & elowi,1,mpi_double_precision,king, + & CG_COMM,ierr) + call mpi_gather(ehigh,1,mpi_double_precision, + & ehighi,1,mpi_double_precision,king, + & CG_COMM,ierr) + endif + + time03=MPI_WTIME() + if (me.eq.king .or. .not. out1file) then + write(iout,*) 'REMD gather times=',time03-time01 + & ,time03-time02 + endif + + if (restart1file) call write1rst(i_index) + + time04=MPI_WTIME() + if (me.eq.king .or. .not. out1file) then + write(iout,*) 'REMD writing rst time=',time04-time03 + endif + + if (traj1file) call write1traj +cd debugging +cdeb call mpi_gather(ntwx_cache,1,mpi_integer, +cdeb & icache_all,1,mpi_integer,king, +cdeb & CG_COMM,ierr) +cdeb write(iout,'(a19,8000i8)') ' ntwx_cache after traj1file', +cdeb & (icache_all(i),i=1,nodes) +cd end + + + time05=MPI_WTIME() + if (me.eq.king .or. .not. out1file) then + write(iout,*) 'REMD writing traj time=',time05-time04 +ctime call flush(iout) + endif + + + if (me.eq.king) then + do i=1,nodes + remd_t_bath(i)=remd_ene(n_ene+1,i) + iremd_iset(i)=remd_ene(n_ene+2,i) + enddo +#ifdef DEBUG + if(lmuca) then +co write(iout,*) 'REMD exchange temp,ene,elow,ehigh' + do i=1,nodes + write(iout,'(i4,4f12.5)') i,remd_t_bath(i),remd_ene(0,i), + & elowi(i),ehighi(i) + enddo + else + write(iout,*) 'REMD exchange temp,ene' + do i=1,nodes + write(iout,'(i4,2f12.5)') i,remd_t_bath(i),remd_ene(0,i) + write(iout,'(6f12.5)') (remd_ene(j,i),j=1,n_ene) + enddo + endif +#endif +c------------------------------------- + IF(.not.usampl.and.hremd.eq.0) THEN +#ifdef DEBUG + write (iout,*) "Enter exchnge, remd_m",remd_m(1), + & " nodes",nodes +ctime call flush(iout) + write (iout,*) "remd_m(1)",remd_m(1) +#endif + do irr=1,remd_m(1) + i=ifirst(iran_num(1,remd_m(1))) +#ifdef DEBUG + write (iout,*) "i",i +#endif +ctime call flush(iout) + + do ii=1,nodes-1 + +#ifdef DEBUG + write (iout,*) "i",i," nupa(0,i)",int(nupa(0,i)) +#endif + if(i.gt.0.and.nupa(0,i).gt.0) then + iex=i +c if (i.eq.1 .and. int(nupa(0,i)).eq.1) then +c write (iout,*) +c & "CHUJ ABSOLUTNY!!! No way to sample a distinct replica in MREMD" +c call flush(iout) +c call MPI_Abort(MPI_COMM_WORLD,ERRCODE,ierr) +c endif +c do while (iex.eq.i) +c write (iout,*) "upper",nupa(int(nupa(0,i)),i) + iex=nupa(iran_num(1,int(nupa(0,i))),i) +c enddo +c write (iout,*) "nupa(0,i)",nupa(0,i)," iex",iex + if (lmuca) then + call muca_delta(remd_t_bath,remd_ene,i,iex,delta) + else +c Swap temperatures between conformations i and iex with recalculating the free energies +c following temperature changes. + ene_iex_iex=remd_ene(0,iex) + ene_i_i=remd_ene(0,i) +c write (iout,*) "i",i," ene_i_i",ene_i_i, +c & " iex",iex," ene_iex_iex",ene_iex_iex +c write (iout,*) "rescaling weights with temperature", +c & remd_t_bath(i) +c call flush(iout) + call rescale_weights(remd_t_bath(i)) + +c write (iout,*) "0,iex",remd_t_bath(i) +c call enerprint(remd_ene(0,iex)) + + call sum_energy(remd_ene(0,iex),.false.) + ene_iex_i=remd_ene(0,iex) +c write (iout,*) "ene_iex_i",remd_ene(0,iex) + +c write (iout,*) "0,i",remd_t_bath(i) +c call enerprint(remd_ene(0,i)) + + call sum_energy(remd_ene(0,i),.false.) +c write (iout,*) "ene_i_i",remd_ene(0,i) +c call flush(iout) +c write (iout,*) "rescaling weights with temperature", +c & remd_t_bath(iex) + if (abs(ene_i_i-remd_ene(0,i)).gt.ene_tol) then + write (iout,*) "ERROR: inconsistent energies:",i, + & ene_i_i,remd_ene(0,i) + endif + call rescale_weights(remd_t_bath(iex)) + +c write (iout,*) "0,i",remd_t_bath(iex) +c call enerprint(remd_ene(0,i)) + + call sum_energy(remd_ene(0,i),.false.) +c write (iout,*) "ene_i_iex",remd_ene(0,i) +c call flush(iout) + ene_i_iex=remd_ene(0,i) + +c write (iout,*) "0,iex",remd_t_bath(iex) +c call enerprint(remd_ene(0,iex)) + + call sum_energy(remd_ene(0,iex),.false.) + if (abs(ene_iex_iex-remd_ene(0,iex)).gt.ene_tol) then + write (iout,*) "ERROR: inconsistent energies:",iex, + & ene_iex_iex,remd_ene(0,iex) + endif +c write (iout,*) "ene_iex_iex",remd_ene(0,iex) +c write (iout,*) "i",i," iex",iex +c write (iout,'(4(a,e15.5))') "ene_i_i",ene_i_i, +c & " ene_i_iex",ene_i_iex, +c & " ene_iex_i",ene_iex_i," ene_iex_iex",ene_iex_iex +c call flush(iout) + delta=(ene_iex_iex-ene_i_iex)/(Rb*remd_t_bath(iex))- + & (ene_iex_i-ene_i_i)/(Rb*remd_t_bath(i)) + delta=-delta +c write(iout,*) 'delta',delta +c delta=(remd_t_bath(i)-remd_t_bath(iex))* +c & (remd_ene(i)-remd_ene(iex))/Rb/ +c & (remd_t_bath(i)*remd_t_bath(iex)) + endif + if (delta .gt. 50.0d0) then + delta=0.0d0 + else +#ifdef OSF + if(isnan(delta))then + delta=0.0d0 + else if (delta.lt.-50.0d0) then + delta=dexp(50.0d0) + else + delta=dexp(-delta) + endif +#else + delta=dexp(-delta) +#endif + endif + iremd_tot(int(i2rep(i-1)))=iremd_tot(int(i2rep(i-1)))+1 + xxx=ran_number(0.0d0,1.0d0) +c write(iout,'(2i4,a6,2f12.5)') i,iex,' delta',delta,xxx +c call flush(iout) + if (delta .gt. xxx) then + tmp=remd_t_bath(i) + remd_t_bath(i)=remd_t_bath(iex) + remd_t_bath(iex)=tmp + remd_ene(0,i)=ene_i_iex + remd_ene(0,iex)=ene_iex_i + if(lmuca) then + tmp=elowi(i) + elowi(i)=elowi(iex) + elowi(iex)=tmp + tmp=ehighi(i) + ehighi(i)=ehighi(iex) + ehighi(iex)=tmp + endif + + + do k=0,nodes + itmp=nupa(k,i) + nupa(k,i)=nupa(k,iex) + nupa(k,iex)=itmp + itmp=ndowna(k,i) + ndowna(k,i)=ndowna(k,iex) + ndowna(k,iex)=itmp + enddo + do il=1,nodes + if (ifirst(il).eq.i) ifirst(il)=iex + do k=1,nupa(0,il) + if (nupa(k,il).eq.i) then + nupa(k,il)=iex + elseif (nupa(k,il).eq.iex) then + nupa(k,il)=i + endif + enddo + do k=1,ndowna(0,il) + if (ndowna(k,il).eq.i) then + ndowna(k,il)=iex + elseif (ndowna(k,il).eq.iex) then + ndowna(k,il)=i + endif + enddo + enddo + + iremd_acc(int(i2rep(i-1)))=iremd_acc(int(i2rep(i-1)))+1 + itmp=i2rep(i-1) + i2rep(i-1)=i2rep(iex-1) + i2rep(iex-1)=itmp + +c write(iout,*) 'exchange',i,iex +c write (iout,'(a8,100i4)') "@ ifirst", +c & (ifirst(k),k=1,remd_m(1)) +c do il=1,nodes +c write (iout,'(a8,i4,a1,100i4)') "@ nupa",il,":", +c & (nupa(k,il),k=1,nupa(0,il)) +c write (iout,'(a8,i4,a1,100i4)') "@ ndowna",il,":", +c & (ndowna(k,il),k=1,ndowna(0,il)) +c enddo +c call flush(iout) + + else + remd_ene(0,iex)=ene_iex_iex + remd_ene(0,i)=ene_i_i + i=iex + endif + endif + enddo + enddo +cd write (iout,*) "exchange completed" +cd call flush(iout) + ELSEIF (usampl) THEN + do ii=1,nodes +cd write(iout,*) "########",ii + + i_temp=iran_num(1,nrep) + i_mult=iran_num(1,remd_m(i_temp)) + i_iset=iran_num(1,nset) + i_mset=iran_num(1,mset(i_iset)) + i=i_index(i_temp,i_mult,i_iset,i_mset) + +cd write(iout,*) "i=",i,i_temp,i_mult,i_iset,i_mset + + if(t_exchange_only)then + i_dir=1 + else + i_dir=iran_num(1,3) + endif +cd write(iout,*) "i_dir=",i_dir + + if(i_dir.eq.1 .and. remd_m(i_temp+1).gt.0 )then + + i_temp1=i_temp+1 + i_mult1=iran_num(1,remd_m(i_temp1)) + i_iset1=i_iset + i_mset1=iran_num(1,mset(i_iset1)) + iex=i_index(i_temp1,i_mult1,i_iset1,i_mset1) + + elseif(i_dir.eq.2 .and. mset(i_iset+1).gt.0)then + + i_temp1=i_temp + i_mult1=iran_num(1,remd_m(i_temp1)) + i_iset1=i_iset+1 + i_mset1=iran_num(1,mset(i_iset1)) + iex=i_index(i_temp1,i_mult1,i_iset1,i_mset1) + econstr_temp_i=remd_ene(20,i) + econstr_temp_iex=remd_ene(20,iex) + remd_ene(20,i)=remd_ene(n_ene+3,i) + remd_ene(20,iex)=remd_ene(n_ene+4,iex) + + elseif(remd_m(i_temp+1).gt.0.and.mset(i_iset+1).gt.0)then + + i_temp1=i_temp+1 + i_mult1=iran_num(1,remd_m(i_temp1)) + i_iset1=i_iset+1 + i_mset1=iran_num(1,mset(i_iset1)) + iex=i_index(i_temp1,i_mult1,i_iset1,i_mset1) + econstr_temp_i=remd_ene(20,i) + econstr_temp_iex=remd_ene(20,iex) + remd_ene(20,i)=remd_ene(n_ene+3,i) + remd_ene(20,iex)=remd_ene(n_ene+4,iex) + + else + goto 444 + endif + +cd write(iout,*) "iex=",iex,i_temp1,i_mult1,i_iset1,i_mset1 +ctime call flush(iout) + +c Swap temperatures between conformations i and iex with recalculating the free energies +c following temperature changes. + ene_iex_iex=remd_ene(0,iex) + ene_i_i=remd_ene(0,i) +co write (iout,*) "rescaling weights with temperature", +co & remd_t_bath(i) + call rescale_weights(remd_t_bath(i)) + + call sum_energy(remd_ene(0,iex),.false.) + ene_iex_i=remd_ene(0,iex) +cd write (iout,*) "ene_iex_i",remd_ene(0,iex) +c call sum_energy(remd_ene(0,i),.false.) +cd write (iout,*) "ene_i_i",remd_ene(0,i) +c write (iout,*) "rescaling weights with temperature", +c & remd_t_bath(iex) +c if (real(ene_i_i).ne.real(remd_ene(0,i))) then +c write (iout,*) "ERROR: inconsistent energies:",i, +c & ene_i_i,remd_ene(0,i) +c endif + call rescale_weights(remd_t_bath(iex)) + call sum_energy(remd_ene(0,i),.false.) +cd write (iout,*) "ene_i_iex",remd_ene(0,i) + ene_i_iex=remd_ene(0,i) +c call sum_energy(remd_ene(0,iex),.false.) +c if (real(ene_iex_iex).ne.real(remd_ene(0,iex))) then +c write (iout,*) "ERROR: inconsistent energies:",iex, +c & ene_iex_iex,remd_ene(0,iex) +c endif +cd write (iout,*) "ene_iex_iex",remd_ene(0,iex) +c write (iout,*) "i",i," iex",iex +cd write (iout,'(4(a,e15.5))') "ene_i_i",ene_i_i, +cd & " ene_i_iex",ene_i_iex, +cd & " ene_iex_i",ene_iex_i," ene_iex_iex",ene_iex_iex + delta=(ene_iex_iex-ene_i_iex)/(Rb*remd_t_bath(iex))- + & (ene_iex_i-ene_i_i)/(Rb*remd_t_bath(i)) + delta=-delta +cd write(iout,*) 'delta',delta +c delta=(remd_t_bath(i)-remd_t_bath(iex))* +c & (remd_ene(i)-remd_ene(iex))/Rb/ +c & (remd_t_bath(i)*remd_t_bath(iex)) + if (delta .gt. 50.0d0) then + delta=0.0d0 + else + delta=dexp(-delta) + endif + if (i_dir.eq.1.or.i_dir.eq.3) + & iremd_tot(int(i2rep(i-1)))=iremd_tot(int(i2rep(i-1)))+1 + if (i_dir.eq.2.or.i_dir.eq.3) + & iremd_tot_usa(int(i2set(i-1)))= + & iremd_tot_usa(int(i2set(i-1)))+1 + xxx=ran_number(0.0d0,1.0d0) +cd write(iout,'(2i4,a6,2f12.5)') i,iex,' delta',delta,xxx + if (delta .gt. xxx) then + tmp=remd_t_bath(i) + remd_t_bath(i)=remd_t_bath(iex) + remd_t_bath(iex)=tmp + + itmp=iremd_iset(i) + iremd_iset(i)=iremd_iset(iex) + iremd_iset(iex)=itmp + + remd_ene(0,i)=ene_i_iex + remd_ene(0,iex)=ene_iex_i + + if (i_dir.eq.1.or.i_dir.eq.3) + & iremd_acc(int(i2rep(i-1)))=iremd_acc(int(i2rep(i-1)))+1 + + itmp=i2rep(i-1) + i2rep(i-1)=i2rep(iex-1) + i2rep(iex-1)=itmp + + if (i_dir.eq.2.or.i_dir.eq.3) + & iremd_acc_usa(int(i2set(i-1)))= + & iremd_acc_usa(int(i2set(i-1)))+1 + + itmp=i2set(i-1) + i2set(i-1)=i2set(iex-1) + i2set(iex-1)=itmp + + itmp=i_index(i_temp,i_mult,i_iset,i_mset) + i_index(i_temp,i_mult,i_iset,i_mset)= + & i_index(i_temp1,i_mult1,i_iset1,i_mset1) + i_index(i_temp1,i_mult1,i_iset1,i_mset1)=itmp + + else + remd_ene(0,iex)=ene_iex_iex + remd_ene(0,i)=ene_i_i + remd_ene(20,iex)=econstr_temp_iex + remd_ene(20,i)=econstr_temp_i + endif + +cd do il=1,nset +cd do il1=1,mset(il) +cd do i=1,nrep +cd do j=1,remd_m(i) +cd write(iout,*) i,j,il,il1,i_index(i,j,il,il1) +cd enddo +cd enddo +cd enddo +cd enddo + + 444 continue + + enddo + + ELSEIF (hremd.gt.0) THEN + do ii=1,nodes +cd write(iout,*) "########",ii + + i_temp=iran_num(1,nrep) + i_mult=iran_num(1,remd_m(i_temp)) + i_iset=iran_num(1,nset) + i_mset=1 + i=i_index(i_temp,i_mult,i_iset,i_mset) + +cd write(iout,*) "i=",i,i_temp,i_mult,i_iset,i_mset + + if(t_exchange_only)then + i_dir=1 + else + i_dir=iran_num(1,3) + endif + +cd write(iout,*) "i_dir=",i_dir + + if(i_dir.eq.1 .and. remd_m(i_temp+1).gt.0 )then + + i_temp1=i_temp+1 + i_mult1=iran_num(1,remd_m(i_temp1)) + i_iset1=i_iset + i_mset1=1 + iex=i_index(i_temp1,i_mult1,i_iset1,i_mset1) + + elseif(i_dir.eq.2)then + + i_temp1=i_temp + i_mult1=iran_num(1,remd_m(i_temp1)) + i_iset1=iran_num(1,hremd) + do while(i_iset1.eq.i_iset) + i_iset1=iran_num(1,hremd) + enddo + i_mset1=1 + iex=i_index(i_temp1,i_mult1,i_iset1,i_mset1) + + elseif(remd_m(i_temp+1).gt.0)then + + i_temp1=i_temp+1 + i_mult1=iran_num(1,remd_m(i_temp1)) + i_iset1=iran_num(1,hremd) + do while(i_iset1.eq.i_iset) + i_iset1=iran_num(1,hremd) + enddo + i_mset1=1 + iex=i_index(i_temp1,i_mult1,i_iset1,i_mset1) + + else + goto 445 + endif + +cd write(iout,*) "iex=",iex,i_temp1,i_mult1,i_iset1,i_mset1 +ctime call flush(iout) + +c Swap temperatures between conformations i and iex with recalculating the free energies +c following temperature changes. + ene_iex_iex=remd_ene(0,iex) + ene_i_i=remd_ene(0,i) + + call set_hweights(i_iset) + call rescale_weights(remd_t_bath(i)) + call sum_energy(remd_ene(0,iex),.false.) + ene_iex_i=remd_ene(0,iex) + + call set_hweights(i_iset1) + call rescale_weights(remd_t_bath(iex)) + call sum_energy(remd_ene(0,i),.false.) + ene_i_iex=remd_ene(0,i) + +cd write(iout,*) ene_iex_iex,ene_i_i,ene_iex_i,ene_i_iex + + delta=(ene_iex_iex-ene_i_iex)/(Rb*remd_t_bath(iex))- + & (ene_iex_i-ene_i_i)/(Rb*remd_t_bath(i)) + delta=-delta + + if (delta .gt. 50.0d0) then + delta=0.0d0 + else + delta=dexp(-delta) + endif + + if (i_dir.eq.1.or.i_dir.eq.3) + & iremd_tot(int(i2rep(i-1)))=iremd_tot(int(i2rep(i-1)))+1 + if (i_dir.eq.2.or.i_dir.eq.3) + & iremd_tot_usa(int(i2set(i-1)))= + & iremd_tot_usa(int(i2set(i-1)))+1 + xxx=ran_number(0.0d0,1.0d0) +cd write(iout,'(2i4,a6,2f12.5)') i,iex,' delta',delta,xxx + if (delta .gt. xxx) then + +cd write (iout,*) "exchange" + tmp=remd_t_bath(i) + remd_t_bath(i)=remd_t_bath(iex) + remd_t_bath(iex)=tmp + + itmp=iremd_iset(i) + iremd_iset(i)=iremd_iset(iex) + iremd_iset(iex)=itmp + + remd_ene(0,i)=ene_i_iex + remd_ene(0,iex)=ene_iex_i + + if (i_dir.eq.1.or.i_dir.eq.3) + & iremd_acc(int(i2rep(i-1)))=iremd_acc(int(i2rep(i-1)))+1 + + itmp=i2rep(i-1) + i2rep(i-1)=i2rep(iex-1) + i2rep(iex-1)=itmp + + if (i_dir.eq.2.or.i_dir.eq.3) + & iremd_acc_usa(int(i2set(i-1)))= + & iremd_acc_usa(int(i2set(i-1)))+1 + + itmp=i2set(i-1) + i2set(i-1)=i2set(iex-1) + i2set(iex-1)=itmp + + itmp=i_index(i_temp,i_mult,i_iset,i_mset) + i_index(i_temp,i_mult,i_iset,i_mset)= + & i_index(i_temp1,i_mult1,i_iset1,i_mset1) + i_index(i_temp1,i_mult1,i_iset1,i_mset1)=itmp + +cd do il=1,nset +cd do il1=1,mset(il) +cd do i=1,nrep +cd do j=1,remd_m(i) +cd write(iout,*) i,j,il,il1,i_index(i,j,il,il1) +cd enddo +cd enddo +cd enddo +cd enddo + + else + remd_ene(0,iex)=ene_iex_iex + remd_ene(0,i)=ene_i_i + endif + + + + 445 continue + + enddo + + ENDIF + +c------------------------------------- + write (iout,*) "NREP",nrep + do i=1,nrep + if(iremd_tot(i).ne.0) + & write(iout,'(a3,i4,2f12.5,i5)') 'ACC',i,remd_t(i) + & ,iremd_acc(i)/(1.0*iremd_tot(i)),iremd_tot(i) + enddo + + if(usampl) then + do i=1,nset + if(iremd_tot_usa(i).ne.0) + & write(iout,'(a10,i4,f12.5,i8)') 'ACC_usampl',i, + & iremd_acc_usa(i)/(1.0*iremd_tot_usa(i)),iremd_tot_usa(i) + enddo + endif + + if(hremd.gt.0) then + do i=1,nset + if(iremd_tot_usa(i).ne.0) + & write(iout,'(a10,i4,f12.5,i8)') 'ACC_hremd',i, + & iremd_acc_usa(i)/(1.0*iremd_tot_usa(i)),iremd_tot_usa(i) + enddo + endif + + +ctime call flush(iout) + +cd write (iout,'(a6,100i4)') "ifirst", +cd & (ifirst(i),i=1,remd_m(1)) +cd do il=1,nodes +cd write (iout,'(a5,i4,a1,100i4)') "nup",il,":", +cd & (nupa(i,il),i=1,nupa(0,il)) +cd write (iout,'(a5,i4,a1,100i4)') "ndown",il,":", +cd & (ndowna(i,il),i=1,ndowna(0,il)) +cd enddo + endif + + time06=MPI_WTIME() +cd write (iout,*) "Before scatter" +cd call flush(iout) + call mpi_scatter(remd_t_bath,1,mpi_double_precision, + & t_bath,1,mpi_double_precision,king, + & CG_COMM,ierr) +cd write (iout,*) "After scatter" +cd call flush(iout) + if(usampl.or.hremd.gt.0) + & call mpi_scatter(iremd_iset,1,mpi_integer, + & iset,1,mpi_integer,king, + & CG_COMM,ierr) + + time07=MPI_WTIME() + if (me.eq.king .or. .not. out1file) then + write(iout,*) 'REMD scatter time=',time07-time06 + endif + + if(lmuca) then + call mpi_scatter(elowi,1,mpi_double_precision, + & elow,1,mpi_double_precision,king, + & CG_COMM,ierr) + call mpi_scatter(ehighi,1,mpi_double_precision, + & ehigh,1,mpi_double_precision,king, + & CG_COMM,ierr) + endif + + if(hremd.gt.0) call set_hweights(iset) + call rescale_weights(t_bath) +co write (iout,*) "Processor",me, +co & " rescaling weights with temperature",t_bath + + stdfp=dsqrt(2*Rb*t_bath/d_time) + do i=1,ntyp + stdfsc(i)=dsqrt(2*Rb*t_bath/d_time) + enddo + if (lang.gt.0) then + do i=nnt,nct-1 + stdforcp(i)=stdforcp(i)*sqrt(t_bath/t_bath_old) + enddo + do i=nnt,nct + stdforcsc(i)=stdforcsc(i)*sqrt(t_bath/t_bath_old) + enddo + endif +cde write(iout,*) 'REMD after',me,t_bath + time08=MPI_WTIME() + if (me.eq.king .or. .not. out1file) then + write(iout,*) 'REMD exchange time=',time08-time02 +ctime call flush(iout) + endif + endif + enddo + + if (restart1file) then + if (me.eq.king .or. .not. out1file) + & write(iout,*) 'writing restart at the end of run' + call write1rst(i_index) + endif + + if (traj1file) call write1traj +cd debugging +cdeb call mpi_gather(ntwx_cache,1,mpi_integer, +cdeb & icache_all,1,mpi_integer,king, +cdeb & CG_COMM,ierr) +cdeb write(iout,'(a40,8000i8)') +cdeb & ' ntwx_cache after traj1file at the end', +cdeb & (icache_all(i),i=1,nodes) +cd end + + +#ifdef MPI + t_MD=MPI_Wtime()-tt0 +#else + t_MD=tcpu()-tt0 +#endif + if (me.eq.king .or. .not. out1file) then + write (iout,'(//35(1h=),a10,35(1h=)/10(/a40,1pe15.5))') + & ' Timing ', + & 'MD calculations setup:',t_MDsetup, + & 'Energy & gradient evaluation:',t_enegrad, + & 'Stochastic MD setup:',t_langsetup, + & 'Stochastic MD step setup:',t_sdsetup, + & 'MD steps:',t_MD + write (iout,'(/28(1h=),a25,27(1h=))') + & ' End of MD calculation ' + if(hmc.gt.0) write (iout,*) 'HMC acceptance ratio', + & n_timestep*1.0d0/hmc/hmc_acc + endif + return + end + +c----------------------------------------------------------------------- + subroutine write1rst(i_index) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.SBRIDGE' + include 'COMMON.INTERACT' + + real d_restart1(3,2*maxres*maxprocs),r_d(3,2*maxres), + & d_restart2(3,2*maxres*maxprocs) + real t5_restart1(5) + integer iret,itmp + integer*2 i_index + & (maxprocs/4,maxprocs/20,maxprocs/200,maxprocs/200) + common /przechowalnia/ d_restart1,d_restart2 + + t5_restart1(1)=totT + t5_restart1(2)=EK + t5_restart1(3)=potE + t5_restart1(4)=t_bath + t5_restart1(5)=Uconst + + call mpi_gather(t5_restart1,5,mpi_real, + & t_restart1,5,mpi_real,king,CG_COMM,ierr) + + + do i=1,2*nres + do j=1,3 + r_d(j,i)=d_t(j,i) + enddo + enddo + call mpi_gather(r_d,3*2*nres,mpi_real, + & d_restart1,3*2*nres,mpi_real,king, + & CG_COMM,ierr) + + + do i=1,2*nres + do j=1,3 + r_d(j,i)=dc(j,i) + enddo + enddo + call mpi_gather(r_d,3*2*nres,mpi_real, + & d_restart2,3*2*nres,mpi_real,king, + & CG_COMM,ierr) + + if(me.eq.king) then +#ifdef AIX + call xdrfopen_(ixdrf,mremd_rst_name, "w", iret) + do i=0,nodes-1 + call xdrfint_(ixdrf, i2rep(i), iret) + enddo + do i=1,remd_m(1) + call xdrfint_(ixdrf, ifirst(i), iret) + enddo + do il=1,nodes + do i=0,nupa(0,il) + call xdrfint_(ixdrf, nupa(i,il), iret) + enddo + + do i=0,ndowna(0,il) + call xdrfint_(ixdrf, ndowna(i,il), iret) + enddo + enddo + + do il=1,nodes + do j=1,4 + call xdrffloat_(ixdrf, t_restart1(j,il), iret) + enddo + enddo + + do il=0,nodes-1 + do i=1,2*nres + do j=1,3 + call xdrffloat_(ixdrf, d_restart1(j,i+2*nres*il), iret) + enddo + enddo + enddo + do il=0,nodes-1 + do i=1,2*nres + do j=1,3 + call xdrffloat_(ixdrf, d_restart2(j,i+2*nres*il), iret) + enddo + enddo + enddo + + if(usampl) then + call xdrfint_(ixdrf, nset, iret) + do i=1,nset + call xdrfint_(ixdrf,mset(i), iret) + enddo + do i=0,nodes-1 + call xdrfint_(ixdrf,i2set(i), iret) + enddo + do il=1,nset + do il1=1,mset(il) + do i=1,nrep + do j=1,remd_m(i) + itmp=i_index(i,j,il,il1) + call xdrfint_(ixdrf,itmp, iret) + enddo + enddo + enddo + enddo + + endif + call xdrfclose_(ixdrf, iret) +#else + call xdrfopen(ixdrf,mremd_rst_name, "w", iret) + do i=0,nodes-1 + call xdrfint(ixdrf, i2rep(i), iret) + enddo + do i=1,remd_m(1) + call xdrfint(ixdrf, ifirst(i), iret) + enddo + do il=1,nodes + do i=0,nupa(0,il) + call xdrfint(ixdrf, nupa(i,il), iret) + enddo + + do i=0,ndowna(0,il) + call xdrfint(ixdrf, ndowna(i,il), iret) + enddo + enddo + + do il=1,nodes + do j=1,4 + call xdrffloat(ixdrf, t_restart1(j,il), iret) + enddo + enddo + + do il=0,nodes-1 + do i=1,2*nres + do j=1,3 + call xdrffloat(ixdrf, d_restart1(j,i+2*nres*il), iret) + enddo + enddo + enddo + do il=0,nodes-1 + do i=1,2*nres + do j=1,3 + call xdrffloat(ixdrf, d_restart2(j,i+2*nres*il), iret) + enddo + enddo + enddo + + + if(usampl) then + call xdrfint(ixdrf, nset, iret) + do i=1,nset + call xdrfint(ixdrf,mset(i), iret) + enddo + do i=0,nodes-1 + call xdrfint(ixdrf,i2set(i), iret) + enddo + do il=1,nset + do il1=1,mset(il) + do i=1,nrep + do j=1,remd_m(i) + itmp=i_index(i,j,il,il1) + call xdrfint(ixdrf,itmp, iret) + enddo + enddo + enddo + enddo + + endif + call xdrfclose(ixdrf, iret) +#endif + endif + return + end + + + subroutine write1traj + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.SBRIDGE' + include 'COMMON.INTERACT' + + real t5_restart1(5) + integer iret,itmp + real xcoord(3,maxres2+2),prec + real r_qfrag(50),r_qpair(100) + real r_utheta(50),r_ugamma(100),r_uscdiff(100) + real p_qfrag(50*maxprocs),p_qpair(100*maxprocs) + real p_utheta(50*maxprocs),p_ugamma(100*maxprocs), + & p_uscdiff(100*maxprocs) + real p_c(3,(maxres2+2)*maxprocs),r_c(3,maxres2+2) + common /przechowalnia/ p_c + + call mpi_bcast(ii_write,1,mpi_integer, + & king,CG_COMM,ierr) + +c debugging + print *,'traj1file',me,ii_write,ntwx_cache +c end debugging + +#ifdef AIX + if(me.eq.king) call xdrfopen_(ixdrf,cartname, "a", iret) +#else + if(me.eq.king) call xdrfopen(ixdrf,cartname, "a", iret) +#endif + do ii=1,ii_write + t5_restart1(1)=totT_cache(ii) + t5_restart1(2)=EK_cache(ii) + t5_restart1(3)=potE_cache(ii) + t5_restart1(4)=t_bath_cache(ii) + t5_restart1(5)=Uconst_cache(ii) + call mpi_gather(t5_restart1,5,mpi_real, + & t_restart1,5,mpi_real,king,CG_COMM,ierr) + + call mpi_gather(iset_cache(ii),1,mpi_integer, + & iset_restart1,1,mpi_integer,king,CG_COMM,ierr) + + do i=1,nfrag + r_qfrag(i)=qfrag_cache(i,ii) + enddo + do i=1,npair + r_qpair(i)=qpair_cache(i,ii) + enddo + do i=1,nfrag_back + r_utheta(i)=utheta_cache(i,ii) + r_ugamma(i)=ugamma_cache(i,ii) + r_uscdiff(i)=uscdiff_cache(i,ii) + enddo + + call mpi_gather(r_qfrag,nfrag,mpi_real, + & p_qfrag,nfrag,mpi_real,king, + & CG_COMM,ierr) + call mpi_gather(r_qpair,npair,mpi_real, + & p_qpair,npair,mpi_real,king, + & CG_COMM,ierr) + call mpi_gather(r_utheta,nfrag_back,mpi_real, + & p_utheta,nfrag_back,mpi_real,king, + & CG_COMM,ierr) + call mpi_gather(r_ugamma,nfrag_back,mpi_real, + & p_ugamma,nfrag_back,mpi_real,king, + & CG_COMM,ierr) + call mpi_gather(r_uscdiff,nfrag_back,mpi_real, + & p_uscdiff,nfrag_back,mpi_real,king, + & CG_COMM,ierr) + +#ifdef DEBUG + write (iout,*) "p_qfrag" + do i=1,nodes + write (iout,*) i,(p_qfrag((i-1)*nfrag+j),j=1,nfrag) + enddo + write (iout,*) "p_qpair" + do i=1,nodes + write (iout,*) i,(p_qpair((i-1)*npair+j),j=1,npair) + enddo +ctime call flush(iout) +#endif + do i=1,nres*2 + do j=1,3 + r_c(j,i)=c_cache(j,i,ii) + enddo + enddo + + call mpi_gather(r_c,3*2*nres,mpi_real, + & p_c,3*2*nres,mpi_real,king, + & CG_COMM,ierr) + + if(me.eq.king) then +#ifdef AIX + do il=1,nodes + call xdrffloat_(ixdrf, real(t_restart1(1,il)), iret) + call xdrffloat_(ixdrf, real(t_restart1(3,il)), iret) + call xdrffloat_(ixdrf, real(t_restart1(5,il)), iret) + call xdrffloat_(ixdrf, real(t_restart1(4,il)), iret) + call xdrfint_(ixdrf, nss, iret) + do j=1,nss + call xdrfint_(ixdrf, ihpb(j), iret) + call xdrfint_(ixdrf, jhpb(j), iret) + enddo + call xdrfint_(ixdrf, nfrag+npair+3*nfrag_back, iret) + call xdrfint_(ixdrf, iset_restart1(il), iret) + do i=1,nfrag + call xdrffloat_(ixdrf, p_qfrag(i+(il-1)*nfrag), iret) + enddo + do i=1,npair + call xdrffloat_(ixdrf, p_qpair(i+(il-1)*npair), iret) + enddo + do i=1,nfrag_back + call xdrffloat_(ixdrf, p_utheta(i+(il-1)*nfrag_back), iret) + call xdrffloat_(ixdrf, p_ugamma(i+(il-1)*nfrag_back), iret) + call xdrffloat_(ixdrf, p_uscdiff(i+(il-1)*nfrag_back), iret) + enddo + prec=10000.0 + do i=1,nres + do j=1,3 + xcoord(j,i)=p_c(j,i+(il-1)*nres*2) + enddo + enddo + do i=nnt,nct + do j=1,3 + xcoord(j,nres+i-nnt+1)=p_c(j,i+nres+(il-1)*nres*2) + enddo + enddo + itmp=nres+nct-nnt+1 + call xdrf3dfcoord_(ixdrf, xcoord, itmp, prec, iret) + enddo +#else + do il=1,nodes + call xdrffloat(ixdrf, real(t_restart1(1,il)), iret) + call xdrffloat(ixdrf, real(t_restart1(3,il)), iret) + call xdrffloat(ixdrf, real(t_restart1(5,il)), iret) + call xdrffloat(ixdrf, real(t_restart1(4,il)), iret) + call xdrfint(ixdrf, nss, iret) + do j=1,nss + call xdrfint(ixdrf, ihpb(j), iret) + call xdrfint(ixdrf, jhpb(j), iret) + enddo + call xdrfint(ixdrf, nfrag+npair+3*nfrag_back, iret) + call xdrfint(ixdrf, iset_restart1(il), iret) + do i=1,nfrag + call xdrffloat(ixdrf, p_qfrag(i+(il-1)*nfrag), iret) + enddo + do i=1,npair + call xdrffloat(ixdrf, p_qpair(i+(il-1)*npair), iret) + enddo + do i=1,nfrag_back + call xdrffloat(ixdrf, p_utheta(i+(il-1)*nfrag_back), iret) + call xdrffloat(ixdrf, p_ugamma(i+(il-1)*nfrag_back), iret) + call xdrffloat(ixdrf, p_uscdiff(i+(il-1)*nfrag_back), iret) + enddo + prec=10000.0 + do i=1,nres + do j=1,3 + xcoord(j,i)=p_c(j,i+(il-1)*nres*2) + enddo + enddo + do i=nnt,nct + do j=1,3 + xcoord(j,nres+i-nnt+1)=p_c(j,i+nres+(il-1)*nres*2) + enddo + enddo + itmp=nres+nct-nnt+1 + call xdrf3dfcoord(ixdrf, xcoord, itmp, prec, iret) + enddo +#endif + endif + enddo +#ifdef AIX + if(me.eq.king) call xdrfclose_(ixdrf, iret) +#else + if(me.eq.king) call xdrfclose(ixdrf, iret) +#endif + do i=1,ntwx_cache-ii_write + + totT_cache(i)=totT_cache(ii_write+i) + EK_cache(i)=EK_cache(ii_write+i) + potE_cache(i)=potE_cache(ii_write+i) + t_bath_cache(i)=t_bath_cache(ii_write+i) + Uconst_cache(i)=Uconst_cache(ii_write+i) + iset_cache(i)=iset_cache(ii_write+i) + + do ii=1,nfrag + qfrag_cache(ii,i)=qfrag_cache(ii,ii_write+i) + enddo + do ii=1,npair + qpair_cache(ii,i)=qpair_cache(ii,ii_write+i) + enddo + do ii=1,nfrag_back + utheta_cache(ii,i)=utheta_cache(ii,ii_write+i) + ugamma_cache(ii,i)=ugamma_cache(ii,ii_write+i) + uscdiff_cache(ii,i)=uscdiff_cache(ii,ii_write+i) + enddo + + do ii=1,nres*2 + do j=1,3 + c_cache(j,ii,i)=c_cache(j,ii,ii_write+i) + enddo + enddo + enddo + ntwx_cache=ntwx_cache-ii_write + return + end + + + subroutine read1restart(i_index) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.SBRIDGE' + include 'COMMON.INTERACT' + real d_restart1(3,2*maxres*maxprocs),r_d(3,2*maxres), + & t5_restart1(5) + integer*2 i_index + & (maxprocs/4,maxprocs/20,maxprocs/200,maxprocs/200) + common /przechowalnia/ d_restart1 + write (*,*) "Processor",me," called read1restart" + + if(me.eq.king)then + open(irest2,file=mremd_rst_name,status='unknown') + read(irest2,*,err=334) i + write(iout,*) "Reading old rst in ASCI format" + close(irest2) + call read1restart_old + return + 334 continue +#ifdef AIX + call xdrfopen_(ixdrf,mremd_rst_name, "r", iret) + + do i=0,nodes-1 + call xdrfint_(ixdrf, i2rep(i), iret) + enddo + do i=1,remd_m(1) + call xdrfint_(ixdrf, ifirst(i), iret) + enddo + do il=1,nodes + call xdrfint_(ixdrf, nupa(0,il), iret) + do i=1,nupa(0,il) + call xdrfint_(ixdrf, nupa(i,il), iret) + enddo + + call xdrfint_(ixdrf, ndowna(0,il), iret) + do i=1,ndowna(0,il) + call xdrfint_(ixdrf, ndowna(i,il), iret) + enddo + enddo + do il=1,nodes + do j=1,4 + call xdrffloat_(ixdrf, t_restart1(j,il), iret) + enddo + enddo +#else + call xdrfopen(ixdrf,mremd_rst_name, "r", iret) + + do i=0,nodes-1 + call xdrfint(ixdrf, i2rep(i), iret) + enddo + do i=1,remd_m(1) + call xdrfint(ixdrf, ifirst(i), iret) + enddo + do il=1,nodes + call xdrfint(ixdrf, nupa(0,il), iret) + do i=1,nupa(0,il) + call xdrfint(ixdrf, nupa(i,il), iret) + enddo + + call xdrfint(ixdrf, ndowna(0,il), iret) + do i=1,ndowna(0,il) + call xdrfint(ixdrf, ndowna(i,il), iret) + enddo + enddo + do il=1,nodes + do j=1,4 + call xdrffloat(ixdrf, t_restart1(j,il), iret) + enddo + enddo +#endif + endif + call mpi_scatter(t_restart1,5,mpi_real, + & t5_restart1,5,mpi_real,king,CG_COMM,ierr) + totT=t5_restart1(1) + EK=t5_restart1(2) + potE=t5_restart1(3) + t_bath=t5_restart1(4) + + if(me.eq.king)then + do il=0,nodes-1 + do i=1,2*nres +c read(irest2,'(3e15.5)') +c & (d_restart1(j,i+2*nres*il),j=1,3) + do j=1,3 +#ifdef AIX + call xdrffloat_(ixdrf, d_restart1(j,i+2*nres*il), iret) +#else + call xdrffloat(ixdrf, d_restart1(j,i+2*nres*il), iret) +#endif + enddo + enddo + enddo + endif + call mpi_scatter(d_restart1,3*2*nres,mpi_real, + & r_d,3*2*nres,mpi_real,king,CG_COMM,ierr) + + do i=1,2*nres + do j=1,3 + d_t(j,i)=r_d(j,i) + enddo + enddo + if(me.eq.king)then + do il=0,nodes-1 + do i=1,2*nres +c read(irest2,'(3e15.5)') +c & (d_restart1(j,i+2*nres*il),j=1,3) + do j=1,3 +#ifdef AIX + call xdrffloat_(ixdrf, d_restart1(j,i+2*nres*il), iret) +#else + call xdrffloat(ixdrf, d_restart1(j,i+2*nres*il), iret) +#endif + enddo + enddo + enddo + endif + call mpi_scatter(d_restart1,3*2*nres,mpi_real, + & r_d,3*2*nres,mpi_real,king,CG_COMM,ierr) + do i=1,2*nres + do j=1,3 + dc(j,i)=r_d(j,i) + enddo + enddo + + + if(usampl) then +#ifdef AIX + if(me.eq.king)then + call xdrfint_(ixdrf, nset, iret) + do i=1,nset + call xdrfint_(ixdrf,mset(i), iret) + enddo + do i=0,nodes-1 + call xdrfint_(ixdrf,i2set(i), iret) + enddo + do il=1,nset + do il1=1,mset(il) + do i=1,nrep + do j=1,remd_m(i) + call xdrfint_(ixdrf,itmp, iret) + i_index(i,j,il,il1)=itmp + enddo + enddo + enddo + enddo + endif +#else + if(me.eq.king)then + call xdrfint(ixdrf, nset, iret) + do i=1,nset + call xdrfint(ixdrf,mset(i), iret) + enddo + do i=0,nodes-1 + call xdrfint(ixdrf,i2set(i), iret) + enddo + do il=1,nset + do il1=1,mset(il) + do i=1,nrep + do j=1,remd_m(i) + call xdrfint(ixdrf,itmp, iret) + i_index(i,j,il,il1)=itmp + enddo + enddo + enddo + enddo + endif +#endif + call mpi_scatter(i2set,1,mpi_integer, + & iset,1,mpi_integer,king, + & CG_COMM,ierr) + + endif + + + if(me.eq.king) close(irest2) + return + end + + subroutine read1restart_old + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.SBRIDGE' + include 'COMMON.INTERACT' + real d_restart1(3,2*maxres*maxprocs),r_d(3,2*maxres), + & t5_restart1(5) + common /przechowalnia/ d_restart1 + if(me.eq.king)then + open(irest2,file=mremd_rst_name,status='unknown') + read (irest2,*) (i2rep(i),i=0,nodes-1) + read (irest2,*) (ifirst(i),i=1,remd_m(1)) + do il=1,nodes + read (irest2,*) nupa(0,il),(nupa(i,il),i=1,nupa(0,il)) + read (irest2,*) ndowna(0,il), + & (ndowna(i,il),i=1,ndowna(0,il)) + enddo + do il=1,nodes + read(irest2,*) (t_restart1(j,il),j=1,4) + enddo + endif + call mpi_scatter(t_restart1,5,mpi_real, + & t5_restart1,5,mpi_real,king,CG_COMM,ierr) + totT=t5_restart1(1) + EK=t5_restart1(2) + potE=t5_restart1(3) + t_bath=t5_restart1(4) + + if(me.eq.king)then + do il=0,nodes-1 + do i=1,2*nres + read(irest2,'(3e15.5)') + & (d_restart1(j,i+2*nres*il),j=1,3) + enddo + enddo + endif + call mpi_scatter(d_restart1,3*2*nres,mpi_real, + & r_d,3*2*nres,mpi_real,king,CG_COMM,ierr) + + do i=1,2*nres + do j=1,3 + d_t(j,i)=r_d(j,i) + enddo + enddo + if(me.eq.king)then + do il=0,nodes-1 + do i=1,2*nres + read(irest2,'(3e15.5)') + & (d_restart1(j,i+2*nres*il),j=1,3) + enddo + enddo + endif + call mpi_scatter(d_restart1,3*2*nres,mpi_real, + & r_d,3*2*nres,mpi_real,king,CG_COMM,ierr) + do i=1,2*nres + do j=1,3 + dc(j,i)=r_d(j,i) + enddo + enddo + if(me.eq.king) close(irest2) + return + end +c------------------------------------------------------------------- + subroutine set_hweights(iiset) + implicit real*8 (a-h,o-z) + integer i + include 'DIMENSIONS' + include 'COMMON.FFIELD' + include 'COMMON.REMD' + + do i=1,n_ene + weights(i)=hweights(iiset,i) + enddo + + wsc =weights(1) + wscp =weights(2) + welec =weights(3) + wcorr =weights(4) + wcorr5 =weights(5) + wcorr6 =weights(6) + wel_loc=weights(7) + wturn3 =weights(8) + wturn4 =weights(9) + wturn6 =weights(10) + wang =weights(11) + wscloc =weights(12) + wtor =weights(13) + wtor_d =weights(14) + wstrain=weights(15) + wvdwpp =weights(16) + wbond =weights(17) + scal14 =weights(18) + wsccor =weights(21) + + return + end +#endif diff --git a/source/unres/src_MD-NEWSC/Makefile b/source/unres/src_MD-NEWSC/Makefile new file mode 120000 index 0000000..8453cdd --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile @@ -0,0 +1 @@ +Makefile_MPICH_ifort \ No newline at end of file diff --git a/source/unres/src_MD-NEWSC/Makefile-intrepid-with-tau b/source/unres/src_MD-NEWSC/Makefile-intrepid-with-tau new file mode 100644 index 0000000..eae1cc5 --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile-intrepid-with-tau @@ -0,0 +1,154 @@ +# +FC1=/bgsys/drivers/ppcfloor/comm/bin/mpixlf77 +FC=tau_f90.sh +OPT = -O3 -qarch=450 -qtune=450 -qfixed +#OPT = -O3 -qarch=450 -qtune=450 -qdebug=function_trace -qfixed +#OPT = -O -qarch=450 -qtune=450 -qfixed +#-Minline=name:scalar2,scalar,transpose2,matvec2,prodmat3 \ +#-Mprefetch=distance:8,nta + +#OPT = -O0 -C -g -qarch=450 -qtune=450 -qfixed +OPT1 = -O0 -g -qarch=450 -qtune=450 -qfixed +OPT2 = -O2 -qarch=450 -qtune=450 -qfixed +#OPT2 = -O2 -qarch=450 -qtune=450 -qdebug=function_trace -qfixed +#OPT2 = ${OPT} +OPTE = -O4 -qarch=450 -qtune=450 -qfixed +#OPTE = -O4 -qarch=450 -qtune=450 -qdebug=function_trace -qfixed +#OPTE=${OPT} + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c ${OPT1} -I$(INSTALL_DIR)/include +FFLAGS2 = -c ${OPT2} -I$(INSTALL_DIR)/include +FFLAGSE = -c ${OPTE} -I$(INSTALL_DIR)/include + +BIN = ../bin/unres_MD_Tc_procor-newparm-gnivpar-O4-test.exe +#LIBS = xdrf/libxdrf.a /home/liwo/UNRES/LIB/libmemmon.a +LIBS = xdrf/libxdrf.a + +CPPFLAGS = -WF,-DAIX -WF,-DISNAN -WF,-DUNRES -WF,-DMP -WF,-DMPI -WF,-DPGI \ + -WF,-DSPLITELE -WF,-DPROCOR -WF,-DAMD64 -WF,-DLANG0 + +ARCH = LINUX +PP = /lib/cpp -P + + +all: unres + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns_CSA.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new.o \ + energy_p_new-sep.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + together.o csa.o minim_jlee.o shift.o diff12.o bank.o newconf.o ran.o \ + indexx.o MP.o compare_s1.o prng.o \ + test.o banach.o distfit.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o + +unres: ${object} + ${CC} -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} --print-map ${object} cinfo.o ${LIBS} -o ${BIN} + + +clean: + /bin/rm *.o; /bin/rm *.pp.* + +newconf.o: newconf.f + ${FC} ${FFLAGS} ${CPPFLAGS} newconf.f + +bank.o: bank.F + ${FC} ${FFLAGS} ${CPPFLAGS} bank.F + +diff12.o: diff12.f + ${FC} ${FFLAGS} ${CPPFLAGS} diff12.f + +csa.o: csa.f + ${FC} ${FFLAGS} ${CPPFLAGS} csa.f + +shift.o: shift.F + ${FC} ${FFLAGS} ${CPPFLAGS} shift.F + +ran.o: ran.f + ${FC} ${FFLAGS} ${CPPFLAGS} ran.f + +together.o: together.F + ${FC} ${FFLAGS} ${CPPFLAGS} together.F + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.f + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.f + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS1} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS1} ${CPPFLAGS} rmdd.f + +eigen.o : eigen.f + ${FC} ${FFLAGS1} ${CPPFLAGS} eigen.f + +blas.o : blas.f + ${FC} ${FFLAGS1} ${CPPFLAGS} blas.f + +add.o : add.f + ${FC} ${FFLAGS1} ${CPPFLAGS} add.f + +energy_p_new.o : energy_p_new.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new.F + +energy_p_new-sep.o : energy_p_new-sep.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new-sep.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +compinfo: compinfo.o + ${CC} ${CFLAGS} compfinfo.c + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c + +prng_32.o: prng_32.F + ${FC} -qfixed -O0 prng_32.F + +prng.o: prng.f + ${FC1} ${FFLAGS} prng.f + +readrtns_CSA.o: readrtns_CSA.F + ${FC1} ${FFLAGS} ${CPPFLAGS} readrtns_CSA.F + +gen_rand_conf.o: gen_rand_conf.F + ${FC1} ${FFLAGS} ${CPPFLAGS} gen_rand_conf.F diff --git a/source/unres/src_MD-NEWSC/Makefile.tau-mpi-f77-pdt b/source/unres/src_MD-NEWSC/Makefile.tau-mpi-f77-pdt new file mode 100644 index 0000000..c8dc5fe --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile.tau-mpi-f77-pdt @@ -0,0 +1,860 @@ +#**************************************************************************** +#* TAU Portable Profiling Package ** +#* http://www.cs.uoregon.edu/research/tau ** +#**************************************************************************** +#* Copyright 1997-2002 ** +#* Department of Computer and Information Science, University of Oregon ** +#* Advanced Computing Laboratory, Los Alamos National Laboratory ** +#**************************************************************************** +####################################################################### +## pC++/Sage++ Copyright (C) 1993,1995 ## +## Indiana University University of Oregon University of Rennes ## +####################################################################### + +####################################################################### +# This is a sample Makefile that contains the Profiling and Tracing +# options. Makefiles of other applications and libraries (not included +# in this distribution) should include this Makefile. +# It defines the following variables that should be added to CFLAGS +# TAU_INCLUDE - Include path for tau headers +# TAU_DEFS - Defines that are needed for tracing and profiling only. +# And for linking add to LIBS +# TAU_LIBS - TAU Tracing and Profiling library libprof.a +# +# When the user needs to turn off tracing and profiling and run the +# application without any runtime overhead of instrumentation, simply +# remove TAUDEFS and TAULIBS from CFLAGS and LIBS respectively but keep +# TAUINC. +####################################################################### + +########### Automatically modified by the configure script ############ +CONFIG_ARCH=bgp +TAU_ARCH=bgp +CONFIG_CC=bgxlc_r +CONFIG_CXX=bgxlC_r +TAU_CC_FE=$(CONFIG_CC) +TAU_CXX_FE=$(CONFIG_CXX) + +# Front end C/C++ Compilers +#BGL#TAU_CC_FE=xlc #ENDIF# +#BGL#TAU_CXX_FE=xlC #ENDIF# +TAU_CC_FE=xlc #ENDIF##BGP# +TAU_CXX_FE=xlC #ENDIF##BGP# +#CATAMOUNT#TAU_CC_FE=gcc #ENDIF# +#CATAMOUNT#TAU_CXX_FE=g++ #ENDIF# +#SC_GFORTRAN#TAU_CC_FE=gcc #ENDIF# +#SC_GFORTRAN#TAU_CXX_FE=g++ #ENDIF# +#SC_PATHSCALE#TAU_CC_FE=gcc #ENDIF# +#SC_PATHSCALE#TAU_CXX_FE=g++ #ENDIF# + +PCXX_OPT=-g +USER_OPT= +EXTRADIR=/opt/ibmcmp/xlf/bg/11.1/bin/.. +EXTRADIRCXX=/opt/ibmcmp/vacpp/bg/9.0/bin/.. +TAUROOT=/soft/apps/tau/tau_latest +TULIPDIR= +TAUEXTRASHLIBOPTS= +TAUGCCLIBOPTS= +TAUGCCLIBDIR= +TAUGFORTRANLIBDIR= +PCLDIR= +PAPIDIR= +PAPISUBDIR= +CHARMDIR= +PDTDIR=/soft/apps/tau/pdtoolkit-3.12 +PDTCOMPDIR= +DYNINSTDIR= +JDKDIR= +SLOG2DIR= +OPARIDIR= +TAU_OPARI_TOOL= +EPILOGDIR= +EPILOGBINDIR= +EPILOGINCDIR= +EPILOGLIBDIR= +EPILOGEXTRALINKCMD= +VAMPIRTRACEDIR= +KTAU_INCDIR= +KTAU_INCUSERDIR= +KTAU_LIB= +KTAU_KALLSYMS_PATH= +PYTHON_INCDIR= +PYTHON_LIBDIR= +PERFINCDIR= +PERFLIBDIR= +PERFLIBRARY= +TAU_SHMEM_INC= +TAU_SHMEM_LIB= +TAU_CONFIG=-mpi-pdt +TAU_MPI_INC=-I/bgsys/drivers/ppcfloor/comm/include +TAU_MPI_LIB=-L/soft/apps/tau/tau_latest/bgp/lib -lTauMpi$(TAU_CONFIG) -L/bgsys/drivers/ppcfloor/comm/lib +TAU_MPI_FLIB=-lfmpich.cnk -L/soft/apps/tau/tau_latest/bgp/lib -lTauMpi$(TAU_CONFIG) -L/bgsys/drivers/ppcfloor/comm/lib +TAU_MPILIB_DIR=/bgsys/drivers/ppcfloor/comm/lib +TAU_MPI_NOWRAP_LIB= -L/bgsys/drivers/ppcfloor/comm/lib +TAU_MPI_NOWRAP_FLIB=-lfmpich.cnk -L/bgsys/drivers/ppcfloor/comm/lib +FULL_CXX=mpixlcxx_r +FULL_CC=mpixlc_r +TAU_PREFIX_INSTALL_DIR=/soft/apps/tau/tau_latest + +TAU_BIN_DIR=$(TAU_PREFIX_INSTALL_DIR)/$(CONFIG_ARCH)/bin +TAU_INC_DIR=$(TAU_PREFIX_INSTALL_DIR)/include +TAU_LIB_DIR=$(TAU_PREFIX_INSTALL_DIR)/$(CONFIG_ARCH)/lib + +####################################################################### + +#OPARI#TAU_OPARI_TOOL=$(TAU_BIN_DIR)/opari #ENDIF# +#ENABLE64BIT#ABI = -64 #ENDIF# +#ENABLEN32BIT#ABI = -n32 #ENDIF# +#ENABLE32BIT#ABI = -32 #ENDIF# + +####################################################################### +#SP1#IBM_XLC_ABI = -q32 #ENDIF# +#SP1#IBM_GNU_ABI = -maix32 #ENDIF# +#IBM64#IBM_XLC_ABI = -q64 #ENDIF# +#IBM64#IBM_GNU_ABI = -maix64 #ENDIF# +#IBM64LINUX#IBM_XLC_ABI = -q64 #ENDIF# +#IBM64LINUX#IBM_GNU_ABI = -m64 #ENDIF# +#SUNX86_64#SUN_GNU_ABI = -m64 #ENDIF# +#SUNX86_64#SUN_CC_ABI = -xarch=amd64 #ENDIF# +#MIPS32LINUX#SC_GNU_ABI = -mabi=n32 #ENDIF# +#MIPS32LINUX#SC_PATH_ABI = -n32 #ENDIF# +#MIPS64LINUX#SC_GNU_ABI = -mabi=64 #ENDIF# +#MIPS64LINUX#SC_PATH_ABI = -64 #ENDIF# +#GNU#SC_ABI = $(SC_GNU_ABI) #ENDIF# +#USE_PATHCC#SC_ABI = $(SC_PATH_ABI) #ENDIF# +#MIPS32#ABI = $(SC_ABI) #ENDIF# +#MIPS64#ABI = $(SC_ABI) #ENDIF# + +IBM_ABI = $(IBM_XLC_ABI) #ENDIF##USE_IBMXLC# +#GNU#IBM_ABI = $(IBM_GNU_ABI) #ENDIF# +#SP1# ABI = $(IBM_ABI) #ENDIF# +#PPC64# ABI = $(IBM_ABI) #ENDIF# +#SOLARIS64#SUN_GNU_ABI = -mcpu=v9 -m64 #ENDIF# +#SOLARIS64#SUN_CC_ABI = -xarch=v9 -xcode=pic32 #ENDIF# +#SOL2CC#SUN_ABI = $(SUN_CC_ABI) #ENDIF# +#GNU#SUN_ABI = $(SUN_GNU_ABI) #ENDIF# +#SOL2#ABI = $(SUN_ABI) #ENDIF# +#SUNX86_64#ABI = $(SUN_ABI) #ENDIF# +#FORCEIA32#ABI = -m32#ENDIF# +####################################################################### +F90_ABI = $(ABI) +#IBM64_FORTRAN#F90_ABI = -q64 #ENDIF# +####################################################################### + +############# Standard Defines ############## +TAU_CC = $(CONFIG_CC) $(ABI) $(ISA) +TAU_CXX = $(CONFIG_CXX) $(ABI) $(ISA) $(USER_OPT) +TAU_RUN_CC = $(FULL_CC) $(ABI) $(ISA) +TAU_RUN_CXX = $(FULL_CXX) $(ABI) $(ISA) +TAU_INSTALL = /bin/cp +TAU_SHELL = /bin/sh +LSX = .a +############################################# +# JAVA DEFAULT ARCH +############################################# +JDKARCH = linux +#COMPAQ_ALPHA#JDKARCH = alpha #ENDIF# +#SOL2#JDKARCH = solaris #ENDIF# +#SGIMP#JDKARCH = irix #ENDIF# +#SP1#JDKARCH = aix #ENDIF# +#T3E#JDKARCH = cray #ENDIF# +############################################# +# JAVA OBJECTS +############################################# +#JAVA#TAU_JAVA_O = TauJava.o TauJAPI.o #ENDIF# +#JAVA#TAUJAPI = Profile.class #ENDIF# + + +############################################# +# OpenMP OBJECTS +############################################# +#OPENMP#OPENMP_O = OpenMPLayer.o #ENDIF# + +############################################# +# Opari OBJECTS +############################################# +#OPARI#OPARI_O = TauOpari.o #ENDIF# +#KOJAKOPARI#OPARI_O = TauKojakOpari.o #ENDIF# +#EPILOG#OPARI_O = #ENDIF# +#VAMPIRTRACE#OPARI_O = #ENDIF# +#GNU#OPARI_O = #ENDIF# + +############################################# +# CallPath OBJECTS +############################################# +#PROFILECALLPATH#CALLPATH_O = TauCallPath.o #ENDIF# +#PROFILEPARAM#PARAM_O = ProfileParam.o #ENDIF# + +############################################# +# Python Binding OBJECTS +############################################# +#PYTHON#PYTHON_O = PyGroups.o PyExceptions.o PyDatabase.o PyBindings.o PyTimer.o PyTau.o #ENDIF# + +############################################# +# DYNINST DEFAULT ARCH +############################################# +DYNINST_PLATFORM = $(PLATFORM) + + +#PCL##include $(TAU_INC_DIR)/makefiles/PCLMakefile.stub #ENDIF# + +############# OpenMP Fortran Option ######## +#OPENMP#TAU_F90_OPT = -mp #ENDIF# +#SOL2CC_OPENMP#TAU_F90_OPT = -xopenmp #ENDIF# +#SUNCC_OPENMP#TAU_F90_OPT = -xopenmp=parallel #ENDIF# +#COMPAQCXX_OPENMP#TAU_F90_OPT = -omp #ENDIF# +#IBMXLC_OPENMP#TAU_F90_OPT = -qsmp=omp #ENDIF# +#GUIDE#TAU_F90_OPT = #ENDIF# +#PGIOPENMP#TAU_F90_OPT = -mp #ENDIF# +#INTELOPENMP#TAU_F90_OPT = -openmp #ENDIF# +#HITACHI_OPENMP#TAU_F90_OPT = #ENDIF# + +TAU_R =_r #ENDIF##THREADSAFE_COMPILERS# + +############# Fortran Compiler ############# +#GNU_FORTRAN#TAU_F90 = g77 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#GNU_GFORTRAN#TAU_F90 = gfortran $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#G95_FORTRAN#TAU_F90 = g95 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#SC_GFORTRAN#TAU_F90 = scgfortran $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#SGI_FORTRAN#TAU_F90 = f90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +TAU_F90 = xlf77$(TAU_R) $(F90_ABI) $(TAU_F90_OPT) #ENDIF##IBM_FORTRAN# +TAU_F90 = mpixlf77$(TAU_R) $(F90_ABI) $(TAU_F90_OPT) #ENDIF##BGP# +#BGL#TAU_F90 = blrts_xlf90$(TAU_R) $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#IBM64_FORTRAN#TAU_F90 = xlf90$(TAU_R) $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#IBMXLFAPPLE#TAU_F90 = xlf90$(TAU_R) $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#CRAY_FORTRAN#TAU_F90 = f90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#CRAY_X1_FORTRAN#TAU_F90 = ftn $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#PGI_FORTRAN#TAU_F90 = pgf90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#CRAYCNL#TAU_F90 = ftn $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#PGI_CATAMOUNT#TAU_F90 = qk-pgf90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#ABSOFT_FORTRAN#TAU_F90 = f90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#LAHEY_FORTRAN#TAU_F90 = lf95 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#LAHEY64_FORTRAN#TAU_F90 = lf95 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#NAGWARE_FORTRAN#TAU_F90 = f95 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#FUJITSU_FORTRAN#TAU_F90 = F90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#FUJITSU_SOLARIS#TAU_F90 = f90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#SUN_FORTRAN#TAU_F90 = f90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#COMPAQ_FORTRAN#TAU_F90 = f90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#KAI_FORTRAN#TAU_F90 = guidef90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#HP_FORTRAN#TAU_F90 = f90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#HITACHI_FORTRAN#TAU_F90 = f90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#INTEL_FORTRAN#TAU_F90 = efc $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#INTEL32_FORTRAN#TAU_F90 = ifc $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#INTELIFORT#TAU_F90 = ifort $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#PATHSCALE_FORTRAN#TAU_F90 = pathf90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#SC_PATHSCALE#TAU_F90 = scpathf95 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#OPEN64ORC_FORTRAN#TAU_F90 = orf90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# +#NEC_FORTRAN#TAU_F90 = f90 $(F90_ABI) $(TAU_F90_OPT) #ENDIF# + + +############# Portable F90 Options ############# +#IBM64_FORTRAN#TAU_F90_FIXED = -qfixed #ENDIF# +TAU_F90_FIXED = -qfixed #ENDIF##IBM_FORTRAN# +TAU_F90_SUFFIX = -qsuffix=f=f90 #ENDIF##IBM_FORTRAN# +#IBMXLFAPPLE#TAU_F90_FIXED = -qfixed #ENDIF# +#IBMXLFAPPLE#TAU_F90_SUFFIX = -qsuffix=f=f90 #ENDIF# +#IBM64_FORTRAN#TAU_F90_SUFFIX = -qsuffix=f=f90 #ENDIF# + +############# Profiling Options ############# +PROFILEOPT1 = -DPROFILING_ON #ENDIF##PROFILE# +#PCL#PROFILEOPT3 = -DTAU_PCL -I$(PCLDIR)/include #ENDIF# +#PAPI#PROFILEOPT3 = -DTAU_PAPI -I$(PAPIDIR)/src -I$(PAPIDIR)/include #ENDIF# +#PCL#PCL_O = PclLayer.o #ENDIF# +#PAPI#PAPI_O = PapiLayer.o #ENDIF# +#MULTIPLECOUNTERS#MULT_O = MultipleCounters.o #ENDIF# +#PROFILECALLS#PROFILEOPT4 = -DPROFILE_CALLS #ENDIF# +#PROFILESTATS#PROFILEOPT5 = -DPROFILE_STATS #ENDIF# +#DEBUGPROF#PROFILEOPT6 = -DDEBUG_PROF #ENDIF# +PROFILEOPT7 = -DTAU_STDCXXLIB #ENDIF##STDCXXLIB# +#CRAYX1CC#PROFILEOPT7 = #ENDIF# +#CRAYCC#PROFILEOPT7 = #ENDIF# +#INTELTFLOP#PROFILEOPT8 = -DPOOMA_TFLOP #ENDIF# +#NORTTI#PROFILEOPT9 = -DNO_RTTI #ENDIF# +#RTTI#PROFILEOPT9 = -DRTTI #ENDIF# +#GNU#PROFILEOPT10 = -DTAU_GNU -DTAU_DOT_H_LESS_HEADERS -fPIC #ENDIF# +#APPLECXX#PROFILEOPT10 = -DTAU_GNU -DTAU_DOT_H_LESS_HEADERS -fPIC #ENDIF# +#SOL2CC#PROFILEOPT10 = -DTAU_SOL2CC -DTAU_DOT_H_LESS_HEADERS #ENDIF# +#SUNCC#PROFILEOPT10 = -DTAU_SOL2CC -DTAU_DOT_H_LESS_HEADERS #ENDIF# +#USE_PATHCC#PROFILEOPT10 = -DTAU_DOT_H_LESS_HEADERS -fPIC -DTAU_PATHSCALE #ENDIF# +#OPEN64ORC#PROFILEOPT10 = -DTAU_DOT_H_LESS_HEADERS -DTAU_OPEN64ORC -fpic #ENDIF# +#CALLSTACK#PROFILEOPT11 = -DPROFILE_CALLSTACK #ENDIF# +#PGI1.7#PROFILEOPT12 = -DPGI #ENDIF# +#CRAYKAI#PROFILEOPT12 = -DCRAYKAI #ENDIF# +#HP_FORTRAN#PROFILEOPT12 = -DHP_FORTRAN #ENDIF# +#CRAYCC#PROFILEOPT13 = -h instantiate=used -DCRAYCC -DTAU_DOT_H_LESS_HEADERS #ENDIF# +#CRAYX1CC#PROFILEOPT13 = -DTAU_DOT_H_LESS_HEADERS #ENDIF# +#SGICC#TAU_CXX = $(CONFIG_CXX) $(ABI) $(ISA) $(USER_OPT) -LANG:std #ENDIF# +#INTELCXXLIBICC#TAU_CXX = $(CONFIG_CXX) $(ABI) $(ISA) $(USER_OPT) -cxxlib-icc #ENDIF# +#PTHREAD_AVAILABLE#PROFILEOPT15 = -DPTHREADS #ENDIF# +#COMPAQCXX_PTHREAD#PROFILEOPT15 = -DPTHREADS -pthread #ENDIF# +#TAU_SPROC#PROFILEOPT15 = -DTAU_SPROC #ENDIF# +#TAU_PAPI_THREADS#PROFILEOPT15 = -DTAU_PAPI_THREADS #ENDIF# +#TULIPTHREADS#PROFILEOPT16 = -DTULIPTHREADS #ENDIF# +#TRACE#TRACEOPT = -DTRACING_ON #ENDIF# +#TRACE#EVENTS_O = Tracer.o #ENDIF# +#KTAU#KTAU_O = TauKtau.o KtauProfiler.o KtauSymbols.o #ENDIF# +#KTAU_MERGE#KTAU_MERGE_O = KtauFuncInfo.o KtauMergeInfo.o ktau_syscall.o #ENDIF# +#KTAU_SHCTR#KTAU_SHCTR_O = KtauCounters.o #ENDIF# +#MPITRACE#TRACEOPT = -DTAU_MPITRACE -DTRACING_ON #ENDIF# +#MPITRACE#EVENTS_O = Tracer.o #ENDIF# +#MUSE#MUSE_O = TauMuse.o TauMuseFilters.o TauMuseHandlers.o TauMusePackages.o #ENDIF# +#MUSE_EVENT#MUSE_O = TauMuse.o TauMuseFilters.o TauMuseHandlers.o TauMusePackages.o #ENDIF# +#MUSE_MULTIPLE#MUSE_O = TauMuse.o TauMuseFilters.o TauMuseHandlers.o TauMusePackages.o #ENDIF# +#COMPENSATE#COMPENSATE_O = TauCompensate.o #ENDIF# +#PTHREAD_AVAILABLE#THR_O = PthreadLayer.o #ENDIF# +#TAU_PAPI_THREADS#THR_O = PapiThreadLayer.o #ENDIF# +#TAU_SPROC#THR_O = SprocLayer.o #ENDIF# +#JAVA#THR_O = JavaThreadLayer.o #ENDIF# +#TULIPTHREADS#THR_O = TulipThreadLayer.o #ENDIF# +#LINUXTIMERS#PLATFORM_O = TauLinuxTimers.o #ENDIF# +#TULIPTHREADS#PROFILEOPT17 = -I$(TULIPDIR)/include -I$(TULIPDIR)/Tuliplib #ENDIF# +#SMARTS#PROFILEOPT17 = -I$(TULIPDIR)/include -I$(TULIPDIR)/lib -I$(TULIPDIR)/machine-specific/$(HOSTTYPE) #ENDIF# +#SMARTS#PROFILEOPT18 = -DSMARTS #ENDIF# +#KAI#PROFILEOPT19 = -DKAI -DTAU_DOT_H_LESS_HEADERS #ENDIF# +#USE_DECCXX#PROFILEOPT19 = -DTAU_DOT_H_LESS_HEADERS #ENDIF# +#SGICC#PROFILEOPT19 = -DTAU_DOT_H_LESS_HEADERS #ENDIF# +#USE_INTELCXX#PROFILEOPT19 = -DTAU_DOT_H_LESS_HEADERS -fPIC #ENDIF# +#USE_NECCXX#PROFILEOPT19 = -DTAU_DOT_H_LESS_HEADERS #ENDIF# +#PGI#PROFILEOPT19 = -DTAU_DOT_H_LESS_HEADERS -fPIC #ENDIF# +#ACC#PROFILEOPT19 = -AA +z -DTAU_DOT_H_LESS_HEADERS -DTAU_HPUX #ENDIF# +#FUJITSU#PROFILEOPT19 = -DFUJITSU -DTAU_DOT_H_LESS_HEADERS #ENDIF# +#KAINOEX#PROFILEOPT20 = --no_exceptions #ENDIF# +#SGICCNOEX#PROFILEOPT20 = -LANG:exceptions=off #ENDIF# +#HPGNU#PROFILEOPT21 = -fPIC #ENDIF# +#HITACHI#PROFILEOPT21 = -DTAU_HITACHI #ENDIF# +#SP1#PROFILEOPT21 = -D_POSIX_SOURCE -DTAU_AIX #ENDIF# +#PPC64#TAU_PIC_PROFILEOPT21 = -qpic=large #ENDIF# +#BGL#TAU_PIC_PROFILEOPT21 = #ENDIF# +PROFILEOPT21 = -DTAU_DOT_H_LESS_HEADERS -DTAU_XLC $(TAU_PIC_PROFILEOPT21) #ENDIF##USE_IBMXLC# +#IBMXLCAPPLE#PROFILEOPT21 = -DTAU_DOT_H_LESS_HEADERS -DTAU_XLC -DTAU_APPLE_XLC #ENDIF# +#PCLPTHREAD#PROFILEOPT22 = -DPCL_MUTEX_LOCK #ENDIF# +#JAVA#PROFILEOPT23 = -DJAVA #ENDIF# +#MONITOR#PROFILEOPT24 = -DMONITORING_ON #ENDIF# +#JAVA#PROFILEOPT25 = -I$(JDKDIR)/include -I$(JDKDIR)/include/$(JDKARCH) #ENDIF# +PROFILEOPT26 = -DTAU_MPI #ENDIF##MPI# +PROFILEOPT26 = -DTAU_MPI -DTAU_MPI_THREADED #ENDIF##MPI_THREADED# +#OPENMP#PROFILEOPT27 = -mp -DTAU_OPENMP#ENDIF# +#GNU#PROFILEOPT27 = #ENDIF# +#SOL2CC_OPENMP#PROFILEOPT27 = -xopenmp -DTAU_OPENMP#ENDIF# +#SUNCC_OPENMP#PROFILEOPT27 = -xopenmp=parallel -DTAU_OPENMP#ENDIF# +#SUNCC_OPENMP#PROFILEOPT27 = -xopenmp=parallel -DTAU_OPENMP#ENDIF# +#HITACHI_OPENMP#PROFILEOPT27 = -DTAU_OPENMP#ENDIF# +#COMPAQCXX_OPENMP#PROFILEOPT27 = -omp -DTAU_OPENMP#ENDIF# +#IBMXLC_OPENMP#PROFILEOPT27 = -qsmp=omp -DTAU_OPENMP #ENDIF# +#OPEN64_OPENMP#PROFILEOPT27 = -mp -DTAU_OPENMP #ENDIF# +#GUIDE#PROFILEOPT27 = -DTAU_OPENMP #ENDIF# +#PGIOPENMP#PROFILEOPT27 = -mp -D_OPENMP -DTAU_OPENMP -U_RWSTD_MULTI_THREAD -U_REENTRANT #ENDIF# +#INTELOPENMP#PROFILEOPT27 = -openmp -DTAU_OPENMP #ENDIF# +#GNUOPENMP#PROFILEOPT27 = -fopenmp -DTAU_OPENMP #ENDIF# +#OPARI#PROFILEOPT28 = -I$(OPARIDIR)/lib -I$(OPARIDIR)/include #ENDIF# +#OPARI_REGION#PROFILEOPT28 = -DTAU_OPARI_REGION -I$(OPARIDIR)/lib -I$(OPARIDIR)/include #ENDIF# +#OPARI_CONSTRUCT#PROFILEOPT28 = -DTAU_OPARI_CONSTRUCT -I$(OPARIDIR)/lib -I$(OPARIDIR)/include #ENDIF# +#MULTIPLECOUNTERS#PROFILEOPT29 = -DTAU_MULTIPLE_COUNTERS #ENDIF# +#SGITIMERS#PROFILEOPT30 = -DSGI_TIMERS #ENDIF# +#BGLTIMERS#PROFILEOPT30 = -DBGL_TIMERS -I/bgl/BlueLight/ppcfloor/bglsys/include #ENDIF# +#BGPTIMERS#PROFILEOPT30 = -DBGP_TIMERS -I/bgsys/drivers/ppcfloor/arch/include/common -I/bgsys/drivers/ppcfloor/arch/include -I/bgsys/drivers/ppcfloor/arch/include/spi #ENDIF# +#CRAYTIMERS#PROFILEOPT30 = -DCRAY_TIMERS #ENDIF# +#LINUXTIMERS#PROFILEOPT31 = -DTAU_LINUX_TIMERS #ENDIF# +#ALPHATIMERS#PROFILEOPT31 = -DTAU_ALPHA_TIMERS #ENDIF# +#CPUTIME#PROFILEOPT32 = -DCPU_TIME #ENDIF# +#PAPIWALLCLOCK#PROFILEOPT33 = -DTAU_PAPI_WALLCLOCKTIME #ENDIF# +#PAPIVIRTUAL#PROFILEOPT34 = -DTAU_PAPI_VIRTUAL #ENDIF# +#SGICOUNTERS#PROFILEOPT35 = -DSGI_HW_COUNTERS #ENDIF# +#EPILOG#PROFILEOPT36 = -DTAU_EPILOG -I$(EPILOGINCDIR) #ENDIF# +#SCALASCA#PROFILEOPT36 = -DTAU_SCALASCA -DTAU_EPILOG -I$(EPILOGINCDIR) #ENDIF# +#VAMPIRTRACEINTS#TAU_VAMPIRTRACEOPTS = -DTAU_64BITTYPES_NEEDED -DHAVE_INTTYPES_H #ENDIF# +#VAMPIRTRACE#PROFILEOPT36 = -DTAU_VAMPIRTRACE -I$(VAMPIRTRACEDIR)/vtlib -I$(VAMPIRTRACEDIR)/include $(TAU_VAMPIRTRACEOPTS)#ENDIF# +#PROFILECALLPATH#PROFILEOPT36 = -DTAU_CALLPATH #ENDIF# +#PROFILEPHASE#PROFILEOPT36 = -DTAU_CALLPATH -DTAU_PROFILEPHASE#ENDIF# +#PYTHON#PROFILEOPT37 = -I$(PYTHON_INCDIR) #ENDIF# +#NOCOMM#PROFILEOPT38 = -DTAU_NOCOMM #ENDIF# +#MUSE#PROFILEOPT39 = -DTAU_MUSE #ENDIF# +#SETNODE0#PROFILEOPT40 = -DTAU_SETNODE0 #ENDIF# +#COMPENSATE#PROFILEOPT41 = -DTAU_COMPENSATE #ENDIF# +#MUSE_EVENT#PROFILEOPT42 = -DTAU_MUSE_EVENT #ENDIF# +#MUSE_MULTIPLE#PROFILEOPT43 = -DTAU_MUSE_MULTIPLE #ENDIF# +#DYNINST41##PROFILEOPT44 = -DTAU_DYNINST41BUGFIX #ENDIF# +# DyninstAPI v4.2.1 fixes the bug, so we don't need OPT44 anymore +#PROFILEMEMORY#PROFILEOPT45 = -DTAU_PROFILEMEMORY #ENDIF# +PROFILEOPT46 = -DTAU_MPIGREQUEST #ENDIF##MPIGREQUEST# +#MPIOREQUEST#PROFILEOPT47 = -DTAU_MPIOREQUEST #ENDIF# +PROFILEOPT48 = -DTAU_MPIDATAREP #ENDIF##MPIDATAREP# +PROFILEOPT49 = -DTAU_MPIERRHANDLER #ENDIF##MPIERRHANDLER# +#CATAMOUNT#PROFILEOPT50 = -DTAU_CATAMOUNT #ENDIF# +#MPICONSTCHAR#PROFILEOPT51 = -DTAU_MPICONSTCHAR #ENDIF# +PROFILEOPT52 = -DTAU_MPIATTRFUNCTION #ENDIF##MPIATTR# +PROFILEOPT53 = -DTAU_MPITYPEEX #ENDIF##MPITYPEEX# +PROFILEOPT54 = -DTAU_MPIADDERROR #ENDIF##MPIADDERROR# +#MPINEEDSTATUSCONV#PROFILEOPT55 = -DTAU_MPI_NEEDS_STATUS #ENDIF# + +#DEPTHLIMIT#PROFILEOPT56 = -DTAU_DEPTH_LIMIT #ENDIF# +#TAU_CHARM#PROFILEOPT57 = -DTAU_CHARM -I$(CHARMDIR)/include #ENDIF# +#PROFILEHEADROOM#PROFILEOPT58 = -DTAU_PROFILEHEADROOM #ENDIF# +#JAVACPUTIME#PROFILEOPT59 = -DJAVA_CPU_TIME #ENDIF# +PROFILEOPT60 = -DTAU_LARGEFILE -D_LARGEFILE64_SOURCE #ENDIF##TAU_LARGEFILE# +PROFILEOPT60 = -DTAU_LARGEFILE -D_LARGEFILE64_SOURCE -D__xlc__ #ENDIF##BGP# +# Omit the -D_LARGETFILE64_SOURCE till we can check the IBM crash +#SHMEM#PROFILEOPT61 = -DTAU_SHMEM #ENDIF# +#KTAU#PROFILEOPT62 = -DTAUKTAU -DKTAU_USER_SRC_COMPILE -I$(KTAU_INCDIR) -I$(KTAU_INCUSERDIR) -DKTAU_INCUSERDIR=\"$(KTAU_INCUSERDIR)\" -DKTAU_KALLSYMS_PATH=\"$(KTAU_KALLSYMS_PATH)\" #ENDIF# +#KTAU_MERGE#PROFILEOPT63 = -DTAUKTAU_MERGE -DKTAU_USER_SRC_COMPILE -I$(KTAU_INCDIR) -DKTAU_INCUSERDIR=\"$(KTAU_INCUSERDIR)\" -DKTAU_KALLSYMS_PATH=\"$(KTAU_KALLSYMS_PATH)\" #ENDIF# +#FREEBSD#PROFILEOPT64 = -DTAU_FREEBSD #ENDIF# +#PROFILEPARAM#PROFILEOPT65 = -DTAU_PROFILEPARAM #ENDIF# +#IBMMPI#PROFILEOPT66 = -DTAU_IBM_MPI #ENDIF# +#WEAKMPIINIT#PROFILEOPT67 = -DTAU_WEAK_MPI_INIT #ENDIF# +#LAMPI#PROFILEOPT68 = -DTAU_LAMPI #ENDIF# +#MPICH_IGNORE_CXX_SEEK#PROFILEOPT68 = -DMPICH_IGNORE_CXX_SEEK #ENDIF# +PROFILEOPT68 = -DMPICH_IGNORE_CXX_SEEK #ENDIF##BGP# +#MPICH2_MPI_INPLACE#PROFILEOPT73 = -DTAU_MPICH2_MPI_IN_PLACE #ENDIF# + + +############# RENCI Scalable Trace Lib Options ############# +STFF_DIR= +SDDF_DIR= +#RENCI_STFF#PROFILEOPT69 = -DRENCI_STFF -I$(STFF_DIR)/include #ENDIF# +#RENCI_STFF#TAU_LINKER_OPT11 = -L$(STFF_DIR)/lib -lstff -L$(SDDF_DIR)/lib -lPablo $(TAU_MPI_LIB) #ENDIF# +#RENCI_STFF#RENCI_STFF_O = RenciSTFF.o #ENDIF# + +############# KTAU (again) ############# +#KTAU_SHCTR#PROFILEOPT70 = -DTAUKTAU_SHCTR -DKTAU_USER_SRC_COMPILE -I$(KTAU_INCDIR) -DKTAU_INCUSERDIR=\"$(KTAU_INCUSERDIR)\" -DKTAU_KALLSYMS_PATH=\"$(KTAU_KALLSYMS_PATH)\" #ENDIF# +#KTAU#TAU_LINKER_OPT12 = -L$(KTAU_LIB) -lktau #ENDIF# + +#MIPS32LINUX#PROFILEOPT71 = -D_ABIN32=2 -D_MIPS_SIM=_ABIN32 #ENDIF# + +#BGL#PROFILEOPT72 = -DTAU_BGL -I/bgl/BlueLight/ppcfloor/bglsys/include #ENDIF# +PROFILEOPT72 = -DTAU_BGP -I/bgsys/drivers/ppcfloor/arch/include/common -I/bgsys/drivers/ppcfloor/arch/include -I/bgsys/drivers/ppcfloor/arch/include/spi #ENDIF##BGP# + +#For F90 support for all platforms +FWRAPPER = TauFMpi.o +MPI2EXTENSIONS = TauMpiExtensions.o #ENDIF##MPI2# +MPI2EXTENSIONS = #ENDIF##BGP# +#CRAYX1CC#MPI2EXTENSIONS = #ENDIF# + +#SGICOUNTERS#LEXTRA = -lperfex #ENDIF# +#ALPHATIMERS#LEXTRA = -lrt #ENDIF# +#SOL2#PCL_EXTRA_LIBS = -lcpc #ENDIF# +#PCL#LEXTRA = -L$(PCLDIR)/lib -lpcl $(PCL_EXTRA_LIBS) #ENDIF# +#PAPI#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi.a #ENDIF# +#IA64PAPI#LEXTRA = -L$(PAPIDIR)/$(PAPISUBDIR) -lpapi #ENDIF# +#Due to some problems with older versions of libpfm, we are using the static lib +#IA64PAPI#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi.a #ENDIF# +#PAPIPFM##LEXTRA = -L$(PAPIDIR)/$(PAPISUBDIR) -lpfm -lpapi -lpfm #ENDIF# +#X86_64PAPI#LEXTRA = -L$(PAPIDIR)/$(PAPISUBDIR)/ -L$(PAPIDIR)/lib64/ -lpapi -lperfctr #ENDIF# +#SOL2PAPI#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi.a -lcpc #ENDIF# +#IBMPAPI#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi.a -L/usr/lpp/pmtoolkit/lib -L/usr/pmapi/lib -lpmapi#ENDIF# +#PPC64PAPI#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi.a #ENDIF# +#BGLPAPI_RTS#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi.rts.a -L/bgl/BlueLight/ppcfloor/bglsys/lib -lbgl_perfctr.rts -lrts.rts -ldevices.rts #ENDIF# +#BGLPAPI#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi.a -L/bgl/BlueLight/ppcfloor/bglsys/lib -lbgl_perfctr.rts -lrts.rts -ldevices.rts #ENDIF# +#BGPPAPI#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi.a -L/bgsys/drivers/ppcfloor/runtime/SPI -lSPI.cna #ENDIF# +#IBM64PAPI#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi64.a -L/usr/lpp/pmtoolkit/lib -L/usr/pmapi/lib -lpmapi #ENDIF# +#IBM64PAPILINUX#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi.a #ENDIF# +#SGI64PAPI#LEXTRA = -L$(PAPIDIR)/$(PAPISUBDIR) -lpapi64 #ENDIF# +#ALPHAPAPI#LEXTRA = $(PAPIDIR)/$(PAPISUBDIR)/libpapi.a /usr/lib/dcpi/dadd.a -lclu -lrt #ENDIF# + +TAU_PAPI_EXTRA_FLAGS = $(LEXTRA) +#IA64PAPI#TAU_PAPI_EXTRA_FLAGS = -L$(PAPIDIR)/$(PAPISUBDIR) -lpapi #ENDIF# + + +# By default make TAU_PAPI_RPATH null. Support it on a compiler by compiler basis. +#PAPI###TAU_PAPI_RPATH = -rpath $(PAPIDIR)/$(PAPISUBDIR) #ENDIF# +#PAPI##TAU_PAPI_RPATH = #ENDIF# +#PPC64PAPI#TAU_PAPI_RPATH = #ENDIF# +#BGLPAPI#TAU_PAPI_RPATH = #ENDIF# +#BGPPAPI#TAU_PAPI_RPATH = #ENDIF# +#USE_INTELCXX#TAU_PAPI_RPATH = #ENDIF# +#CRAYX1CC#TAU_PAPI_RPATH = #ENDIF# +#PGI#TAU_PAPI_RPATH = -R$(PAPIDIR)/$(PAPISUBDIR) #ENDIF# +#GNU#TAU_PAPI_RPATH = -Wl,-rpath $(PAPIDIR)/$(PAPISUBDIR) #ENDIF# +#USE_PATHCC#TAU_PAPI_RPATH = #ENDIF# + +# if the user has specified -cc=gcc -c++=g++ -fortran=intel, we shouldn't use -rpath +# because they are likely going to link with ifort +#INTEL32_FORTRAN#TAU_PAPI_RPATH = #ENDIF# +#SOL2PAPI#TAU_PAPI_RPATH = #ENDIF# +#IBMPAPI#TAU_PAPI_RPATH = #ENDIF# +#IBM64PAPI#TAU_PAPI_RPATH = #ENDIF# +#PAPI#TAU_LINKER_OPT1 = $(TAU_PAPI_RPATH) #ENDIF# + +#PTHREAD_AVAILABLE#LEXTRA1 = -lpthread #ENDIF# +#TULIPTHREADS#LEXTRA1 = -L$(TULIPDIR)/Tuliplib -ltulip #ENDIF# +#SMARTS##include $(TAU_INC_DIR)/makefiles/GNUmakefile-$(HOSTTYPE) #ENDIF# +#SMARTS#LEXTRA1 = $(LSMARTS) #ENDIF# + +TAU_GCCLIB = -lgcc_s +TAU_GCCLIB = #ENDIF##BGP# +#INTEL32_ON_64#TAU_GCCLIB = -lgcc #ENDIF# +#FREEBSD#TAU_GCCLIB = -lgcc #ENDIF# +#BGL#TAU_GCCLIB = -lgcc #ENDIF# +#GNU#TAU_FORTRANLIBS = -L$(TAUGCCLIBDIR) $(TAUGCCLIBOPTS) -lstdc++ $(TAU_GCCLIB) #ENDIF# +#OPEN64ORC_FORTRAN#TAU_FORTRANLIBS = -lfortran -lffio #ENDIF# +#PATHSCALE_FORTRAN#TAU_FORTRANLIBS = -lpathfstart -lpathfortran #ENDIF# +#SC_PATHSCALE#TAU_FORTRANLIBS = -lpathfstart -lpathfortran #ENDIF# +#NAGWARE_FORTRAN#TAU_FORTRANLIBS = $(EXTRADIR)/lib/quickfit.o -L$(EXTRADIR)/lib -lf96 #ENDIF# +#G95_FORTRAN#TAU_FORTRANLIBS = -L$(EXTRADIR) -lf95 #ENDIF# +#GNU_FORTRAN#TAU_FORTRANLIBS = -lg2c #ENDIF# +#GNU_GFORTRAN#TAU_FORTRANLIBS = -L$(TAUGFORTRANLIBDIR) -lgfortran -lgfortranbegin #ENDIF# +#SC_GFORTRAN#TAU_FORTRANLIBS = -lgfortran -lgfortranbegin #ENDIF# +#SGI_FORTRAN#TAU_FORTRANLIBS = -lfortran -lftn #ENDIF# +TAU_IBM_FORTRANLIBS = -bh:4 -bpT:0x10000000 -bpD:0x20000000 /lib/crt0.o -lxlf90 -lm -lc #ENDIF##USE_IBMXLC# +#GNU#TAU_IBM_FORTRANLIBS = -Wl,-bh:4 -Wl,-bpT:0x10000000 -Wl,-bpD:0x20000000 /lib/crt0.o -lxlf90 -lm -lc #ENDIF# +#KAI#TAU_IBM_FORTRANLIBS = --backend -bh:4 --backend -bpT:0x10000000 --backend -bpD:0x20000000 /lib/crt0.o -lxlf90 -lm -lc #ENDIF# +TAU_FORTRANLIBS = $(TAU_IBM_FORTRANLIBS) #ENDIF##IBM_FORTRAN# + +TAU_IBM64_FORTRANLIBS = -bh:4 -bpT:0x10000000 -bpD:0x20000000 -b64 /lib/crt0_64.o -lxlf90 -lm -lc #ENDIF##USE_IBMXLC# +#GNU#TAU_IBM64_FORTRANLIBS = -Wl,-bh:4 -Wl,-bpT:0x10000000 -Wl,-bpD:0x20000000 -Wl,-b64 /lib/crt0_64.o -lxlf90 -lm -lc #ENDIF# +#KAI#TAU_IBM64_FORTRANLIBS = --backend -bh:4 --backend -bpT:0x10000000 --backend -bpD:0x20000000 --backend -b64 /lib/crt0_64.o -lxlf90 -lm -lc #ENDIF# +#IBM64_FORTRAN#TAU_FORTRANLIBS = $(TAU_IBM64_FORTRANLIBS) #ENDIF# +#IBM64_FORTRAN#TAU_FORLIBDIR=lib64 #ENDIF# +TAU_FORLIBDIR=lib #ENDIF##IBM_FORTRAN# +#BGL#TAU_FORLIBDIR=blrts_dev_lib #ENDIF# +TAU_FORLIBDIR=bglib #ENDIF##BGP# +#PPC64#TAU_FORTRANLIBS = -L$(EXTRADIR)/$(TAU_FORLIBDIR) -lxlf90 -lxlfmath -lxl #ENDIF# +#BGL#TAU_FORTRANLIBS = -L$(EXTRADIR)/$(TAU_FORLIBDIR) -L$(EXTRADIR)/blrts_lib -lxlf90 -lxlfmath -lxl #ENDIF# + +TAU_BGL_OMP_SERIAL= -lxlomp_ser #ENDIF##BGP# +#OPENMP#TAU_BGL_OMP_SERIAL= #ENDIF# +TAU_OMP_SERIAL=$(TAU_BGL_OMP_SERIAL) #ENDIF##BGP# +TAU_FORTRANLIBS = -L$(EXTRADIR)/$(TAU_FORLIBDIR) -lxlf90 -lxlfmath $(TAU_OMP_SERIAL) #ENDIF##BGP# + +#IBMXLFAPPLE#TAU_FORTRANLIBS = -L$(EXTRADIR)/lib -lxlf90 -lxlfmath -lxl #ENDIF# + +#CRAY_FORTRAN#TAU_FORTRANLIBS = #ENDIF# +#CRAY_X1_FORTRAN#TAU_FORTRANLIBS = #ENDIF# +#PGI_FORTRAN#TAU_FORTRANLIBS = $(EXTRADIR)/lib/f90main.o -lpgf90 -lpgf90rtl -lpgf90_rpm1 -lpgf902 -lpgftnrtl -lrt #ENDIF# +#HP_FORTRAN#TAU_FORTRANLIBS = -L$(EXTRADIR)/lib/pa2.0 -lF90 -lcl #ENDIF# +#INTEL_FORTRAN#TAU_FORTRANLIBS = -lcprts -lPEPCF90 #ENDIF# +#INTEL32_FORTRAN#TAU_FORTRANLIBS = -lcprts -lCEPCF90 -lF90 #ENDIF# +#INTELIFORT#TAU_FORTRANLIBS = -lcprts #ENDIF# +#INTEL81FIX#TAU_FORTRANLIBS = -L$(TAUGCCLIBDIR) $(TAUGCCLIBOPTS) -lstdc++ $(TAU_GCCLIB) -lcxa -lunwind -L$(EXTRADIR)/lib -lifcore $(EXTRADIR)/lib/for_main.o #ENDIF# +#INTEL10FIX#TAU_FORTRANLIBS = -L$(TAUGCCLIBDIR) $(TAUGCCLIBOPTS) -lstdc++ $(TAU_GCCLIB) -L$(EXTRADIR)/lib -lifcore $(EXTRADIR)/lib/for_main.o #ENDIF# +#INTELCXXLIBICC#TAU_FORTRANLIBS = -lcprts -L$(EXTRADIR)/lib -lifcore $(EXTRADIR)/lib/for_main.o #ENDIF# +#PGI1.7#LEXTRA = -lstd -lstrm#ENDIF# +#PGI1.7#TAUHELPER = $(TAUROOT)/src/Profile/TauPGIHelper.cpp #ENDIF# +# LINKER OPTIONS +TAU_LINKER_OPT2 = $(LEXTRA) + + +#ACC#TAUHELPER = -AA #ENDIF# +#FUJITSU_FORTRAN#TAU_FORTRANLIBS = $(EXTRADIR)/lib/fj90rt0.o -L$(EXTRADIR)/lib -lfj9i6 -lfj9f6 -lfj9e6 #ENDIF# +#FUJITSU_SOLARIS#TAU_FORTRANLIBS = $(EXTRADIR)/lib/fj90rt0.o -L$(EXTRADIR)/lib -lfj90l -lfj90f #ENDIF# +#SUN_FORTRAN#TAU_FORTRANLIBS = -lfui -lfsumai -lfprodai -lfminlai -lfmaxlai -lfminvai -lfmaxvai -lfsu -lsunmath #ENDIF# +#SUN_FORTRAN#TAU_FORTRANLIBS_SUN_OPTERON = -lfsu -lsunmath #ENDIF# +#SUN_FORTRAN#TAU_FORTRANLIBS_SUNCC = -lfsu #ENDIF# +#SUN386I#TAU_FORTRANLIBS = $(TAU_FORTRANLIBS_SUN_OPTERON) #ENDIF# +#SUNX86_64#TAU_FORTRANLIBS = $(TAU_FORTRANLIBS_SUN_OPTERON) #ENDIF# +#SUNCC#TAU_FORTRANLIBS = $(TAU_FORTRANLIBS_SUNCC) #ENDIF# +#SOL2#EXTRALIBS = -lsocket -lnsl #ENDIF# +#SUN386I#EXTRALIBS = -lsocket -lnsl -lrt #ENDIF# +#SUNX86_64#EXTRALIBS = -lsocket -lnsl -lrt #ENDIF# +#COMPAQ_FORTRAN#TAU_FORTRANLIBS = $(EXTRADIR)/lib/cmplrs/fort90/for_main.o -L$(EXTRADIR)/lib -L$(EXTRADIR)/lib/cmplrs/fort90 -L$(EXTRADIR)/lib/cmplrs/fort90 -lUfor -lfor -lFutil -lm -lmld -lexc -lc #ENDIF# +#ABSOFT_FORTRAN#TAU_FORTRANLIBS = -L$(EXTRADIR)/lib -lfio -lf90math -lU77 -lf77math -lfio #ENDIF# +#LAHEY_FORTRAN#TAU_FORTRANLIBS = $(EXTRADIR)/lib/fj90rt0.o -L$(EXTRADIR)/lib -lfj9i6 -lfj9f6 -lfj9e6 -lfccx86_6a #ENDIF# +#LAHEY64_FORTRAN#TAU_FORTRANLIBS = $(EXTRADIR)/lib64/fj90rt0.o -L$(EXTRADIR)/lib64 -lfj90f -lfj90i -lelf #ENDIF# +#HITACHI_FORTRAN#TAU_FORTRANLIBS = -lf90 -lhf90math #ENDIF# +#NEC_FORTRAN#TAU_FORTRANLIBS = -f90lib #ENDIF# +#COMPAQ_GUIDEF90#TAU_FORTRANLIBS = $(EXTRADIR)/lib/cmplrs/fort90/for_main.o -lfor #ENDIF# + + +#HITACHI#TAU_HITACHI_EXTRA = -L/usr/local/lib -llrz32 #ENDIF# + +## To use the standard F90 linker instead of TAU_LINKER + TAU_FORTRANLIBS, add +#GNU#TAU_CXXLIBS = -L$(TAUGCCLIBDIR) $(TAUGCCLIBOPTS) -lstdc++ $(TAU_GCCLIB) #ENDIF# +#GNU#TAU_GNUCXXLIBS = -L$(TAUGCCLIBDIR) -lstdc++ $(TAU_GCCLIB) #ENDIF# +#OPEN64ORC#TAU_CXXLIBS = -lstdc++ #ENDIF# +#PATHSCALE_FORTRAN#TAU_CXXLIBS = -lstdc++ #ENDIF# +#LAHEY_FORTRAN#TAU_CXXLIBS = $(TAU_GNUCXXLIBS) /usr/lib/libc.a #ENDIF# +#NAGWARE_FORTRAN#TAU_CXXLIBS = $(TAU_GNUCXXLIBS) /usr/lib/libc.a #ENDIF# +#PGI#TAU_CXXLIBS = -lstd -lC #ENDIF# +#CRAYCNL#TAU_CXXLIBS = -L$(EXTRADIR)/lib -lstd -lC -lpgc #ENDIF# +#CRAYX1CC#TAU_CXXLIBS = -L/opt/ctl/CC/CC/lib -lC #ENDIF# + +TAU_SGI_INIT = /usr/lib32/c++init.o +#ENABLE64BIT#TAU_SGI_INIT = /usr/lib64/c++init.o #ENDIF# +#ENABLEN32BIT#TAU_SGI_INIT = /usr/lib32/c++init.o #ENDIF# +#ENABLE32BIT#TAU_SGI_INIT = /usr/lib/c++init.o #ENDIF# + +#SGICC#TAU_CXXLIBS = $(TAU_SGI_INIT) -lC #ENDIF# +#APPLECXX#TAU_CXXLIBS = -lstd -lC #ENDIF# +#SOL2#TAU_CXXLIBS = -lCstd -lCrun #ENDIF# +#SOL2CC#TAU_CXXLIBS_SUN_OPTERON = -lCstd -lCrun -lm #ENDIF# +#SUNCC#TAU_CXXLIBS_SUNCC = -lCstd -lCrun #ENDIF# +#SUN386I#TAU_CXXLIBS = $(TAU_CXXLIBS_SUN_OPTERON) #ENDIF# +#SUNCC#TAU_CXXLIBS = $(TAU_CXXLIBS_SUNCC) #ENDIF# +#SUNX86_64#TAU_CXXLIBS = $(TAU_CXXLIBS_SUN_OPTERON) #ENDIF# +#FUJITSU_SOLARIS#TAU_CXXLIBS = -lstd -lstdm #ENDIF# +#PPC64#TAU_XLCLIBS = -L$(EXTRADIRCXX)/$(TAU_FORLIBDIR) -libmc++ -lstdc++ #ENDIF# +#IBMXLCAPPLE#TAU_FORLIBDIR =lib #ENDIF# +#IBMXLCAPPLE#TAU_XLCLIBS = -L$(EXTRADIRCXX)/$(TAU_FORLIBDIR) -libmc++ -lstdc++ #ENDIF# +#BGL#TAU_XLCLIBS = -L$(EXTRADIRCXX)/blrts_dev_lib -L$(EXTRADIRCXX)/blrts_lib -libmc++ -L/bgl/BlueLight/ppcfloor/blrts-gnu/powerpc-bgl-blrts-gnu/lib -lstdc++ #ENDIF# +TAU_XLCLIBS = -L$(EXTRADIRCXX)/bglib -libmc++ -lstdc++ #ENDIF##BGP# +#SP1#TAU_XLCLIBS = -lC #ENDIF# +TAU_CXXLIBS = $(TAU_XLCLIBS) #ENDIF##USE_IBMXLC# +#USE_DECCXX#TAU_CXXLIBS = -lcxxstd -lcxx #ENDIF# +#USE_INTELCXX#TAU_CXXLIBS_INTEL = -lcprts -lPEPCF90 #ENDIF# +#USE_INTELCXX#TAU_CXXLIBS_INTEL = -lcprts #ENDIF# +#INTELIFORT#TAU_CXXLIBS_INTEL = -lcprts #ENDIF# +#INTEL81FIX#TAU_CXXLIBS_INTEL = -L$(TAUGCCLIBDIR) $(TAUGCCLIBOPTS) -lstdc++ $(TAU_GCCLIB) -lcxa -lunwind#ENDIF# +#INTEL10FIX#TAU_CXXLIBS_INTEL = -L$(TAUGCCLIBDIR) $(TAUGCCLIBOPTS) -lstdc++ $(TAU_GCCLIB) #ENDIF# +#INTELCXXLIBICC#TAU_CXXLIBS_INTEL = -lcprts #ENDIF# +#USE_INTELCXX#TAU_CXXLIBS = $(TAU_CXXLIBS_INTEL) #ENDIF# +#APPLECXX#TAU_CXXLIBS = -lstdc++ -L$(TAUGCCLIBDIR) $(TAUGCCLIBOPTS) -lgcc_s.1 -lSystemStubs #ENDIF# + +# EXTERNAL PACKAGES: VAMPIRTRACE +#VAMPIRTRACE#TAU_LINKER_OPT3 = -L$(VAMPIRTRACEDIR)/lib -L$(VAMPIRTRACEDIR)/vtlib -lvt -lotf -lz $(TAU_HITACHI_EXTRA) #ENDIF# +#VAMPIRTRACEMPI#TAU_LINKER_OPT3 = -L$(VAMPIRTRACEDIR)/lib -L$(VAMPIRTRACEDIR)/vtlib -lvt.mpi -lotf -lz $(TAU_HITACHI_EXTRA) #ENDIF# +#VAMPIRTRACEOMPI#TAU_LINKER_OPT3 = -L$(VAMPIRTRACEDIR)/lib -L$(VAMPIRTRACEDIR)/vtlib -lvt.ompi -lotf -lz $(TAU_HITACHI_EXTRA) #ENDIF# +#VAMPIRTRACEOMP#TAU_LINKER_OPT3 = -L$(VAMPIRTRACEDIR)/lib -L$(VAMPIRTRACEDIR)/vtlib -lvt.omp -lotf -lz $(TAU_HITACHI_EXTRA) #ENDIF# + +# EXTERNAL PACKAGES: EPILOG +#SCALASCA#TAU_ELG_SERIAL_SUFFIX =.ser #ENDIF# +#EPILOG#TAU_LINKER_OPT3 = -L$(EPILOGLIBDIR) -lelg$(TAU_ELG_SERIAL_SUFFIX) $(EPILOGEXTRALINKCMD) $(TAU_HITACHI_EXTRA) #ENDIF# +#EPILOGMPI#TAU_LINKER_OPT3 = -L$(EPILOGLIBDIR) -lelg.mpi $(EPILOGEXTRALINKCMD) $(TAU_HITACHI_EXTRA) #ENDIF# +#EPILOGOMPI#TAU_LINKER_OPT3 = -L$(EPILOGLIBDIR) -lelg.ompi $(EPILOGEXTRALINKCMD) $(TAU_HITACHI_EXTRA) #ENDIF# +#EPILOGOMP#TAU_LINKER_OPT3 = -L$(EPILOGLIBDIR) -lelg.omp $(EPILOGEXTRALINKCMD) $(TAU_HITACHI_EXTRA) #ENDIF# + +# When using shared, we don't want -lelg.mpi or -lvt.mpi showing up +#FORCESHARED#TAU_LINKER_OPT3=#ENDIF# + +TAU_LINKER_OPT4 = $(LEXTRA1) +#HITACHI_OPENMP#TAU_LINKER_OPT4 = -lcompas -lpthreads -lc_r #ENDIF# +#OPENMP#TAU_LINKER_OPT5 = -mp #ENDIF# +#SOL2CC_OPENMP#TAU_LINKER_OPT5 = -xopenmp #ENDIF# +#SUNCC_OPENMP#TAU_LINKER_OPT5 = -xopenmp=parallel #ENDIF# +#GNU#TAU_LINKER_OPT5 = #ENDIF# +#COMPAQCXX_OPENMP#TAU_LINKER_OPT5 = -omp #ENDIF# +#IBMXLC_OPENMP#TAU_LINKER_OPT5 = -qsmp=omp #ENDIF# +#OPEN64_OPENMP#TAU_LINKER_OPT5 = -mp #ENDIF# +#GUIDE#TAU_LINKER_OPT5 = #ENDIF# +#PGIOPENMP#TAU_LINKER_OPT5 = -mp #ENDIF# +#INTELOPENMP#TAU_LINKER_OPT5 = -openmp #ENDIF# + +# MALLINFO needs -lmalloc on sgi, sun +#SGIMP#TAU_LINKER_OPT6 = -lmalloc #ENDIF# +#SOL2#TAU_LINKER_OPT6 = #ENDIF# +#SUN386I#TAU_LINKER_OPT6 = -lmalloc #ENDIF# +#SUNX86_64#TAU_LINKER_OPT6 = -lmalloc #ENDIF# + +# We need -lCio with SGI CC 7.4+ +#SGICC#TAU_LINKER_OPT7 = -lCio #ENDIF# + +# charm +#TAU_CHARM#TAU_LINKER_OPT8 = -lconv-core #ENDIF# + +# extra libs +#SUN386I#TAU_LINKER_OPT9 = $(EXTRALIBS) #ENDIF# +#SUNX86_64#TAU_LINKER_OPT9 = $(EXTRALIBS) #ENDIF# +#SOL2#TAU_LINKER_OPT9 = $(ExTRALIBS) #ENDIF# + +#BGL#TAU_LINKER_OPT10 = -L/bgl/BlueLight/ppcfloor/bglsys/lib -lrts.rts #ENDIF# + +TAU_IBM_PYTHON_SHFLAG = -Wl,-bI:$(PYTHON_LIBDIR)/config/python.exp -Wl,-einitpytau#ENDIF##USE_IBMXLC# +#GNU#TAU_IBM_PYTHON_SHFLAG = -Wl,-bI:$(PYTHON_LIBDIR)/config/python.exp -Wl,-einitpytau#ENDIF# +#KAI#TAU_IBM_PYTHON_SHFLAG = --backend -Wl,-bI:$(PYTHON_LIBDIR)/config/python.exp --backend -Wl,-einitpytau#ENDIF# +#ACC#TAU_HPUX_PYTHON_SHFLAG = -lstd_v2 -lCsup_v2 -lm -lcl -lc #ENDIF# + +TAU_IBM_LD_FLAGS = -binitfini:poe_remote_main #ENDIF##USE_IBMXLC# +#GNU#TAU_IBM_LD_FLAGS = -Wl,-binitfini:poe_remote_main #ENDIF# +#KAI#TAU_IBM_LD_FLAGS = --backend -binitfini:poe_remote_main #ENDIF# + + +#PYTHON#TAU_IBM_SHFLAGS = $(TAU_IBM_PYTHON_SHFLAG) #ENDIF# +#PYTHON#TAU_HPUX_SHFLAGS = $(TAU_HPUX_PYTHON_SHFLAG) #ENDIF# +#SP1#TAU_EXTRA_LIBRARY_FLAGS = $(TAU_IBM_SHFLAGS) #ENDIF# +#SOL2#TAU_EXTRA_LIBRARY_FLAGS = #ENDIF# +#SGIMP#TAU_EXTRA_LIBRARY_FLAGS = -lmalloc #ENDIF# +#HP#TAU_EXTRA_LIBRARY_FLAGS = $(TAU_HPUX_SHFLAGS) #ENDIF# + +TAU_MPI_WRAPPER_LIB= -L$(TAU_LIB_DIR) -lTauMpi$(TAU_CONFIG) #ENDIF##MPI# +#EPILOGMPI#TAU_MPI_WRAPPER_LIB= #ENDIF# +#EPILOGOMPI#TAU_MPI_WRAPPER_LIB= #ENDIF# + +############################################## +# Build TAU_LINKER_SHOPTS +#GNU#TAU_IBM_LINKER_SHOPTS=-Wl,-brtl -Wl,-bexpall #ENDIF# +TAU_IBM_LINKER_SHOPTS= -brtl -bexpall #ENDIF##USE_IBMXLC# +#KAI#TAU_IBM_LINKER_SHOPTS= --backend -brtl #ENDIF# +#SP1#TAU_LINKER_SHOPTS= $(TAU_IBM_LINKER_SHOPTS) #ENDIF# + +############################################## +# MPI _r suffix check (as in libmpi_r) +#MPI_R_SUFFIX#TAU_MPI_R_SUFFIX=_r #ENDIF# + +############################################## +# Flags to build a shared object: TAU_SHFLAGS +#GNU#AR_SHFLAGS = -shared #ENDIF# +#PGI#AR_SHFLAGS = -shared #ENDIF# +#SGICC#AR_SHFLAGS = -shared #ENDIF# +#APPLECXX#AR_SHFLAGS = -dynamiclib -flat_namespace -undefined suppress #ENDIF# +#SOL2#AR_SHFLAGS = -G #ENDIF# +#SUN386I#AR_SHFLAGS = -G #ENDIF# +#SUNX86_64#AR_SHFLAGS = -G #ENDIF# +AR_SHFLAGS = -G #ENDIF##USE_IBMXLC# +#USE_DECCXX#AR_SHFLAGS = -shared #ENDIF# +#USE_INTELCXX#AR_SHFLAGS = -shared #ENDIF# +#ACC#AR_SHFLAGS = -b #ENDIF# +TAU_SHFLAGS = $(AR_SHFLAGS) -o + +############# RANLIB Options ############# +TAU_RANLIB = echo "Built" +#APPLECXX#TAU_RANLIB = ranlib #ENDIF# +#IBMXLCAPPLE#TAU_RANLIB = ranlib #ENDIF# + +############################################## +TAU_AR = ar #ENDIF# +#SP1#TAU_AR = ar -X32 #ENDIF# +#IBM64#TAU_AR = ar -X64 #ENDIF# +#PPC64#TAU_AR = ar #ENDIF# +#IBM64LINUX#TAU_AR = ar #ENDIF# + + +############################################## +# PDT OPTIONS +# You can specify -pdtcompdir=intel -pdtarchdir=x86_64 +# If nothing is specified, PDTARCHDIR uses TAU_ARCH +PDTARCHDIRORIG=$(TAU_ARCH) +PDTARCHITECTURE=x86_64 +PDTARCHDIRFINAL=$(PDTARCHDIRORIG) +#PDTARCHITECTURE#PDTARCHDIRFINAL=$(PDTARCHITECTURE)#ENDIF# +PDTARCHDIR=$(PDTARCHDIRFINAL) +#PDTARCH#PDTARCHDIR=$(PDTARCHDIRFINAL)/$(PDTCOMPDIR)#ENDIF# + + +############################################## + +PROFILEOPTS = $(PROFILEOPT1) $(PROFILEOPT2) $(PROFILEOPT3) $(PROFILEOPT4) \ + $(PROFILEOPT5) $(PROFILEOPT6) $(PROFILEOPT7) $(PROFILEOPT8) \ + $(PROFILEOPT9) $(PROFILEOPT10) $(PROFILEOPT11) $(PROFILEOPT12) \ + $(PROFILEOPT13) $(PROFILEOPT14) $(PROFILEOPT15) $(PROFILEOPT16) \ + $(PROFILEOPT17) $(PROFILEOPT18) $(PROFILEOPT19) $(PROFILEOPT20) \ + $(PROFILEOPT21) $(PROFILEOPT22) $(PROFILEOPT23) $(PROFILEOPT24) \ + $(PROFILEOPT25) $(PROFILEOPT26) $(PROFILEOPT27) $(PROFILEOPT28) \ + $(PROFILEOPT29) $(PROFILEOPT30) $(PROFILEOPT31) $(PROFILEOPT32) \ + $(PROFILEOPT33) $(PROFILEOPT34) $(PROFILEOPT35) $(PROFILEOPT36) \ + $(PROFILEOPT37) $(PROFILEOPT38) $(PROFILEOPT39) $(PROFILEOPT40) \ + $(PROFILEOPT41) $(PROFILEOPT42) $(PROFILEOPT43) $(PROFILEOPT44) \ + $(PROFILEOPT45) $(PROFILEOPT46) $(PROFILEOPT47) $(PROFILEOPT48) \ + $(PROFILEOPT49) $(PROFILEOPT50) $(PROFILEOPT51) $(PROFILEOPT52) \ + $(PROFILEOPT53) $(PROFILEOPT54) $(PROFILEOPT55) $(PROFILEOPT56) \ + $(PROFILEOPT57) $(PROFILEOPT58) $(PROFILEOPT59) $(PROFILEOPT60) \ + $(PROFILEOPT61) $(PROFILEOPT62) $(PROFILEOPT63) $(PROFILEOPT64) \ + $(PROFILEOPT65) $(PROFILEOPT66) $(PROFILEOPT67) $(PROFILEOPT68) \ + $(PROFILEOPT69) $(PROFILEOPT70) $(PROFILEOPT71) $(PROFILEOPT72) \ + $(PROFILEOPT73) $(PROFILEOPT74) $(PROFILEOPT75) $(PROFILEOPT76) \ + $(TRACEOPT) + +############################################## + +TAU_LINKER_OPTS = $(TAU_LINKER_OPT1) $(TAU_LINKER_OPT2) $(TAU_LINKER_OPT3) \ + $(TAU_LINKER_OPT4) $(TAU_LINKER_OPT5) $(TAU_LINKER_OPT6) \ + $(TAU_LINKER_OPT7) $(TAU_LINKER_OPT8) $(TAU_LINKER_OPT9) \ + $(TAU_LINKER_OPT10) $(TAU_LINKER_OPT11) $(TAU_LINKER_OPT12) + +############################################## + +############# TAU Fortran #################### +TAU_LINKER=$(TAU_CXX) +#INTEL_FORTRAN##TAU_LINKER=$(TAU_F90) #ENDIF# +#INTEL32_FORTRAN##TAU_LINKER=$(TAU_F90) #ENDIF# +# Intel efc compiler acts as a linker - NO. Let C++ be the linker. + +############################################## +############# TAU Options #################### +TAUDEFS = $(PROFILEOPTS) + +TAUINC = -I$(TAU_INC_DIR) + +TAULIBS = $(TAUHELPER) -L$(TAU_LIB_DIR) -ltau$(TAU_CONFIG) $(TAU_LINKER_OPTS) + +TAUMPILIBS = $(TAU_MPI_LIB) + +TAUMPIFLIBS = $(TAU_MPI_FLIB) + +### ACL S/W requirement +TAU_DEFS = $(TAUDEFS) + +TAU_INCLUDE = -I$(TAU_INC_DIR) +#PERFLIB#TAU_INCLUDE = -I$(PERFINCDIR) #ENDIF# +#PERFLIB#TAU_DEFS = #ENDIF# +#PERFLIB#TAU_COMPILER_EXTRA_OPTIONS=-optTau=-p #ENDIF# + +TAU_INCLUDE_MEMORY = -I$(TAU_INC_DIR)/Memory +#IBMXLCAPPLE#TAU_INCLUDE_MEMORY = -I$(TAU_INC_DIR)/MemoryWrapper #ENDIF# +#APPLECXX#TAU_INCLUDE_MEMORY = -I$(TAU_INC_DIR)/MemoryWrapper #ENDIF# + +TAU_LIBS = $(TAUHELPER) -L$(TAU_LIB_DIR) -ltau$(TAU_CONFIG) $(TAU_LINKER_OPTS) +#PERFLIB#TAU_LIBS = #ENDIF# + +TAU_SHLIBS = $(TAUHELPER) -L$(TAU_LIB_DIR) -lTAUsh$(TAU_CONFIG) $(TAU_LINKER_OPTS) $(TAU_LINKER_SHOPTS) $(TAU_MPI_LIB) +#PERFLIB#TAU_SHLIBS = #ENDIF# +TAU_EXLIBS = $(TAUHELPER) -L$(TAU_LIB_DIR) -lTAU $(TAU_LINKER_OPTS) $(TAU_LINKER_SHOPTS) $(TAU_MPI_LIB) + +TAU_SHLIBS_NOSHOPTS = $(TAUHELPER) -L$(TAU_LIB_DIR) -lTAUsh$(TAU_CONFIG) $(TAU_LINKER_OPTS) + +TAU_DISABLE = $(TAUHELPER) -L$(TAU_LIB_DIR) -lTauDisable + +TAU_MPI_INCLUDE = $(TAU_MPI_INC) + +TAU_MPI_LIBS = $(TAU_MPI_LIB) + +TAU_MPI_FLIBS = $(TAU_MPI_FLIB) + +## TAU TRACE INPUT LIBRARY (can build a trace converter using TAU TIL) +TAU_TRACE_INPUT_LIB = -L$(TAU_LIB_DIR) -lTAU_traceinput$(TAU_CONFIG) + +## Don't include -lpthread or -lsmarts. Let app. do that. +############################################# +## IBM SPECIFIC CHANGES TO TAU_MPI_LIBS +#SP1#TAU_MPI_LDFLAGS = $(TAU_IBM_LD_FLAGS) #ENDIF# +TAU_LDFLAGS = $(TAU_MPI_LDFLAGS) #ENDIF##MPI# +#SP1#TAU_IBM_MPI_LIBS = $(TAU_MPI_LIB) -L$(TAU_MPILIB_DIR)/ip -lvtd$(TAU_MPI_R_SUFFIX) #ENDIF# +#SP1#TAU_IBM_FMPI_LIBS = $(TAU_MPI_FLIB) -L$(TAU_MPILIB_DIR)/ip -lvtd$(TAU_MPI_R_SUFFIX) #ENDIF# +#SP1#TAU_MPI_LIBS_FLAGS= $(TAU_IBM_MPI_LIBS) #ENDIF# +#SP1#TAU_MPI_FLIBS_FLAGS = $(TAU_IBM_MPI_FLIBS) #ENDIF# +TAU_MPI_LIBS_FLAGS = $(TAU_MPI_LIB) #ENDIF##MPI# +TAU_MPI_FLIBS_FLAGS = $(TAU_MPI_FLIB) #ENDIF##MPI# +TAU_MPI_LIBS = $(TAU_MPI_LIBS_FLAGS) #ENDIF##MPI# +TAU_MPI_FLIBS = $(TAU_MPI_FLIBS_FLAGS) #ENDIF##MPI# + +#SP1#TAUMPILIBS = $(TAU_MPI_LIBS) #ENDIF# +#SP1#TAUMPIFLIBS = $(TAU_MPI_FLIBS) #ENDIF# +############################################# +#SHMEM#TAU_SHMEM_OBJS = TauShmemCray.o #ENDIF# +#SP1#TAU_SHMEM_OBJS = TauShmemTurbo.o #ENDIF# +#GPSHMEM#TAU_SHMEM_OBJS = TauShmemGpshmem.o #ENDIF# + +TAU_SHMEM_INCLUDE = $(TAU_SHMEM_INC) + +TAU_SHMEM_LIBS = -L$(TAU_PREFIX_INSTALL_DIR)/$(CONFIG_ARCH)/ -lTauShmem$(TAU_CONFIG) $(TAU_SHMEM_LIB) +############################################# +# TAU COMPILER SHELL SCRIPT OPTIONS +TAUCOMPILEROPTS= -optPdtDir="$(PDTDIR)/${PDTARCHDIR}"\ + -optPdtCOpts="$(TAU_INCLUDE) $(TAU_DEFS) $(TAU_MPI_INCLUDE)"\ + -optPdtCxxOpts="$(TAU_INCLUDE) $(TAU_DEFS) $(TAU_MPI_INCLUDE)"\ + -optTauInstr="$(TAU_BIN_DIR)/tau_instrumentor" \ + -optNoMpi \ + -optOpariDir="$(OPARIDIR)" -optOpariTool="$(TAU_OPARI_TOOL)" \ + -optTauCC="$(TAU_CC)" \ + -optTauIncludes="$(TAU_INCLUDE) $(TAU_MPI_INCLUDE)" \ + -optTauDefs="$(TAU_DEFS)" \ + -optTauCompile="$(TAU_INCLUDE) $(TAU_MPI_INCLUDE) $(TAU_DEFS) "\ + -optLinking="$(TAU_MPI_FLIBS) $(TAU_LIBS) $(TAU_LDFLAGS) $(TAU_CXXLIBS)"\ + -optSharedLinking="$(TAU_MPI_FLIBS) $(TAU_EXLIBS) $(TAU_LDFLAGS) $(TAU_CXXLIBS)"\ + $(TAU_COMPILER_EXTRA_OPTIONS) \ + -optIncludeMemory="$(TAU_INCLUDE_MEMORY)" +############################################# + +TAU_SHAREDLIBS=$(TAUHELPER) -L$(TAU_LIB_DIR) -lTAU $(TAU_LINKER_OPTS) $(TAU_LINKER_SHOPTS) +SHAREDEXTRAS= +#FORCESHARED#SHAREDEXTRAS=-optSharedLinkReset="$(TAU_SHAREDLIBS) $(TAU_LDFLAGS) $(TAU_CXXLIBS) $(TAU_MPI_NOWRAP_FLIB)" -optShared #ENDIF# +TAU_COMPILER=$(TAU_BIN_DIR)/tau_compiler.sh $(TAUCOMPILEROPTS) $(SHAREDEXTRAS) +############################################# +# These options could be included in the application Makefile as +#CFLAGS = $(TAUDEFS) $(TAUINC) +# +#LIBS = $(TAULIBS) +# +# To run the application without Profiling/Tracing use +#CFLAGS = $(TAUINC) +# Don't use TAUDEFS but do include TAUINC +# Also ignore TAULIBS when Profiling/Tracing is not used. +############################################# + diff --git a/source/unres/src_MD-NEWSC/Makefile_MPICH_ifort b/source/unres/src_MD-NEWSC/Makefile_MPICH_ifort new file mode 100644 index 0000000..b215a6a --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_MPICH_ifort @@ -0,0 +1,127 @@ +################################################################### +INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh + + +FC= ifort + +OPT = -O3 -ip + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -g -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -g -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -O3 -ipo -opt_report -I$(INSTALL_DIR)/include + + +LIBS = -L$(INSTALL_DIR)/lib -lmpich xdrf/libxdrf.a + +ARCH = LINUX +PP = /lib/cpp -P + + +all: no_option + @echo "give optin GAB or E0LL2Y" + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new_barrier.o \ + energy_p_new-sep_barrier.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + MP.o compare_s1.o prng.o \ + banach.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o test.o ssMD.o + +no_option: + +GAB: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN -DMP -DMPI \ + -DSPLITELE -DLANG0 -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +GAB: BIN = ../../../bin/unres/MD/unres_ifort_MPICH_MM-KB.exe +GAB: ${object} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + +E0LL2Y: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN -DMP -DMPI \ + -DSPLITELE -DLANG0 +E0LL2Y: BIN = ../../../bin/unres/MD/unres_ifort_MPICH_MM-PH.exe +E0LL2Y: ${object} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + +xdrf/libxdrf.a: + cd xdrf && make + + +clean: + /bin/rm -f *.o && /bin/rm -f compinfo && cd xdrf && make clean + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.F + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.F + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS1} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f + +energy_p_new_barrier.o : energy_p_new_barrier.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new_barrier.F + +gradient_p.o : gradient_p.F + ${FC} ${FFLAGSE} ${CPPFLAGS} gradient_p.F + +energy_p_new-sep_barrier.o : energy_p_new-sep_barrier.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new-sep_barrier.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +MD_A-MTS.o : MD_A-MTS.F + ${FC} ${FFLAGSE} ${CPPFLAGS} MD_A-MTS.F + +blas.o : blas.f + ${FC} ${FFLAGS1} blas.f + +add.o : add.f + ${FC} ${FFLAGS1} add.f + +eigen.o : eigen.f + ${FC} ${FFLAGS2} eigen.f + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-NEWSC/Makefile_MPICH_ifort_09_05_2013 b/source/unres/src_MD-NEWSC/Makefile_MPICH_ifort_09_05_2013 new file mode 100644 index 0000000..92617a5 --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_MPICH_ifort_09_05_2013 @@ -0,0 +1,127 @@ +################################################################### +INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh + + +FC= ifort + +OPT = -O3 -ip + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -g -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -g -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -O3 -ipo -opt_report -I$(INSTALL_DIR)/include + + +LIBS = -L$(INSTALL_DIR)/lib -lmpich xdrf/libxdrf.a + +ARCH = LINUX +PP = /lib/cpp -P + + +all: no_option + @echo "give optin GAB or E0LL2Y" + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new_barrier.o \ + energy_p_new-sep_barrier.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + MP.o compare_s1.o prng.o \ + banach.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o test.o ssMD.o + +no_option: + +GAB: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN -DMP -DMPI \ + -DSPLITELE -DLANG0 -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +GAB: BIN = ../bin/unres_ifort_MPICH_GAB.exe +GAB: ${object} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + +E0LL2Y: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN -DMP -DMPI \ + -DSPLITELE -DLANG0 +E0LL2Y: BIN = ../bin/unres_ifort_MPICH_E0LL2Y.exe +E0LL2Y: ${object} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + +xdrf/libxdrf.a: + cd xdrf && make + + +clean: + /bin/rm -f *.o && /bin/rm -f compinfo && cd xdrf && make clean + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.F + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.F + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS1} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f + +energy_p_new_barrier.o : energy_p_new_barrier.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new_barrier.F + +gradient_p.o : gradient_p.F + ${FC} ${FFLAGSE} ${CPPFLAGS} gradient_p.F + +energy_p_new-sep_barrier.o : energy_p_new-sep_barrier.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new-sep_barrier.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +MD_A-MTS.o : MD_A-MTS.F + ${FC} ${FFLAGSE} ${CPPFLAGS} MD_A-MTS.F + +blas.o : blas.f + ${FC} ${FFLAGS1} blas.f + +add.o : add.f + ${FC} ${FFLAGS1} add.f + +eigen.o : eigen.f + ${FC} ${FFLAGS2} eigen.f + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-NEWSC/Makefile_aix_xlf b/source/unres/src_MD-NEWSC/Makefile_aix_xlf new file mode 100644 index 0000000..b226425 --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_aix_xlf @@ -0,0 +1,113 @@ +CPPFLAGS = -WF,-DUNRES -WF,-DMP -WF,-DMPI -WF,-DSPLITELE -WF,-DISNAN -WF,-DAIX +#-DPROCOR +## -DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +INSTALL_DIR = +# +FC= mpxlf90 -qfixed -w + +OPT = -q64 + +FFLAGS = -c ${OPT} -O3 +FFLAGS1 = -c ${OPT} -O2 +FFLAGS2 = -c ${OPT} -O +FFLAGSE = -c ${OPT} -O4 + + +BIN = ${HOME}/UNRES/bin/unres_MD.exe +LIBS = -qipa + +ARCH = LINUX +PP = /lib/cpp -P + +all: unresCSA + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns_CSA.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new_barrier.o \ + energy_p_new-sep_barrier.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + together.o csa.o minim_jlee.o shift.o diff12.o bank.o newconf.o ran.o \ + indexx.o MP.o compare_s1.o prng_32.o \ + test.o banach.o distfit.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o + + +unresCSA: ${objectCSA} + cc -o compinfo compinfo.c + ./compinfo + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${objectCSA} cinfo.o ${LIBS} -o ${BIN} + + +clean: + /bin/rm *.o + /bin/rm *.il + +newconf.o: newconf.f + ${FC} ${FFLAGS} ${CPPFLAGS} newconf.f + +bank.o: bank.F + ${FC} ${FFLAGS} ${CPPFLAGS} bank.F + +diff12.o: diff12.f + ${FC} ${FFLAGS} ${CPPFLAGS} diff12.f + +csa.o: csa.f + ${FC} ${FFLAGS} ${CPPFLAGS} csa.f + +shift.o: shift.F + ${FC} ${FFLAGS} ${CPPFLAGS} shift.F + +ran.o: ran.f + ${FC} ${FFLAGS} ${CPPFLAGS} ran.f + +together.o: together.F + ${FC} ${FFLAGS} ${CPPFLAGS} together.F + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.f + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.f + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f + +energy_p_new.o : energy_p_new.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new.F diff --git a/source/unres/src_MD-NEWSC/Makefile_bigben b/source/unres/src_MD-NEWSC/Makefile_bigben new file mode 100644 index 0000000..261dd8e --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_bigben @@ -0,0 +1,138 @@ +# +FC= ftn +OPT = -fast \ +-Minline=name:scalar2,scalar,transpose2,matvec2,prodmat3 \ +-Mprefetch=distance:8,nta + +#OPT = -C -g +#OPT1 = -g -fast +OPT1 = ${OPT} +OPT2 = -fast +OPT2 = ${OPT} +OPTE = ${OPT} + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c ${OPT1} -I$(INSTALL_DIR)/include +FFLAGS2 = -c ${OPT2} -I$(INSTALL_DIR)/include +FFLAGSE = ${FFLAGS} + +CFLAGS = -DSGI -c + +BIN = ../bin/unres_MD_Tc_procor-newmat-novec-noparint_barrier_corr-split.exe +LIBS = xdrf/libxdrf.a + +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI -DPGI \ + -DSPLITELE -DPROCOR -DAMD64 -DLANG0 \ +#-DTIMING \ +# -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +#-DPARVEC #-DPARINT -DPARINTDER + +ARCH = LINUX +PP = /lib/cpp -P + + +all: unres + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns_CSA.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new_barrier.o \ + energy_p_new-sep_barrier.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + together.o csa.o minim_jlee.o shift.o diff12.o bank.o newconf.o ran.o \ + indexx.o MP.o compare_s1.o prng.o \ + test.o banach.o distfit.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o + +unres: ${object} proc_proc.o + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} proc_proc.o cinfo.o ${LIBS} -o ${BIN} + + +clean: + /bin/rm *.o + +newconf.o: newconf.f + ${FC} ${FFLAGS} ${CPPFLAGS} newconf.f + +bank.o: bank.F + ${FC} ${FFLAGS} ${CPPFLAGS} bank.F + +diff12.o: diff12.f + ${FC} ${FFLAGS} ${CPPFLAGS} diff12.f + +csa.o: csa.f + ${FC} ${FFLAGS} ${CPPFLAGS} csa.f + +shift.o: shift.F + ${FC} ${FFLAGS} ${CPPFLAGS} shift.F + +ran.o: ran.f + ${FC} ${FFLAGS} ${CPPFLAGS} ran.f + +together.o: together.F + ${FC} ${FFLAGS} ${CPPFLAGS} together.F + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.f + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.f + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS1} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f + +energy_p_new.o : energy_p_new.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new.F + +energy_p_new-sep.o : energy_p_new-sep.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new-sep.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +blas.o : blas.f + ${FC} ${FFLAGS1} blas.f + +add.o : add.f + ${FC} ${FFLAGS1} add.f + +eigen.o : eigen.f + ${FC} ${FFLAGS1} eigen.f + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-NEWSC/Makefile_bigben-oldparm b/source/unres/src_MD-NEWSC/Makefile_bigben-oldparm new file mode 100644 index 0000000..87d66c7 --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_bigben-oldparm @@ -0,0 +1,136 @@ +# +FC= ftn +OPT = -fast \ +-Minline=name:scalar2,scalar,transpose2,matvec2,prodmat3 \ +-Mprefetch=distance:8,nta + +#OPT = -C -g +#OPT1 = -g -fast +OPT1 = -fast +OPT2 = -fast +OPT2 = ${OPT} +OPTE = ${OPT} + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c ${OPT1} -I$(INSTALL_DIR)/include +FFLAGS2 = -c ${OPT2} -I$(INSTALL_DIR)/include +FFLAGSE = ${FFLAGS} + +CFLAGS = -DSGI -c + +BIN = ../bin/unres_MD_Tc_procor-newmat-matgather-oldparm.exe +LIBS = xdrf/libxdrf.a + +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI -DPGI \ + -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -DPARVEC -DPARINT -DPARINTDER \ + -DCRYST_BOND -DCRYST_THETA -DCRYST_SC + +ARCH = LINUX +PP = /lib/cpp -P + + +all: unres + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns_CSA.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new.o \ + energy_p_new-sep.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + together.o csa.o minim_jlee.o shift.o diff12.o bank.o newconf.o ran.o \ + indexx.o MP.o compare_s1.o prng.o \ + test.o banach.o distfit.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o + +unres: ${object} proc_proc.o + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} proc_proc.o cinfo.o ${LIBS} -o ${BIN} + + +clean: + /bin/rm *.o + +newconf.o: newconf.f + ${FC} ${FFLAGS} ${CPPFLAGS} newconf.f + +bank.o: bank.F + ${FC} ${FFLAGS} ${CPPFLAGS} bank.F + +diff12.o: diff12.f + ${FC} ${FFLAGS} ${CPPFLAGS} diff12.f + +csa.o: csa.f + ${FC} ${FFLAGS} ${CPPFLAGS} csa.f + +shift.o: shift.F + ${FC} ${FFLAGS} ${CPPFLAGS} shift.F + +ran.o: ran.f + ${FC} ${FFLAGS} ${CPPFLAGS} ran.f + +together.o: together.F + ${FC} ${FFLAGS} ${CPPFLAGS} together.F + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.f + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.f + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS1} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f + +energy_p_new.o : energy_p_new.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new.F + +energy_p_new-sep.o : energy_p_new-sep.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new-sep.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +blas.o : blas.f + ${FC} ${FFLAGS1} blas.f + +add.o : add.f + ${FC} ${FFLAGS1} add.f + +eigen.o : eigen.f + ${FC} ${FFLAGS1} eigen.f + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-NEWSC/Makefile_bigben-tau b/source/unres/src_MD-NEWSC/Makefile_bigben-tau new file mode 100644 index 0000000..ee02905 --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_bigben-tau @@ -0,0 +1,137 @@ +# +#FC= ftn +TAU_MAKEFILE=/usr/local/packages/TAU-2.17/tau-2.17/xt3/lib/Makefile.tau-mpi-pdt-pgi +FC=tau_f90.sh +OPT = -fast \ +-Minline=name:scalar2,scalar,transpose2,matvec2,prodmat3 \ +-Mprefetch=distance:8,nta + +#OPT = -C -g +#OPT1 = -g -fast +OPT1 = -fast +OPT2 = -fast +OPT2 = ${OPT} +OPTE = ${OPT} + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c ${OPT1} -I$(INSTALL_DIR)/include +FFLAGS2 = -c ${OPT2} -I$(INSTALL_DIR)/include +FFLAGSE = ${FFLAGS} + +CFLAGS = -DSGI -c + +BIN = ../bin/unres_MD_Tc_procor-newmat-noparint-barrier-tau.exe +LIBS = xdrf/libxdrf.a + +CPPFLAGS = -DLINUX -DUNRES -DMP -DMPI -DPGI \ + -DSPLITELE -DPROCOR -DAMD64 -DLANG0 -DPARVEC + +ARCH = LINUX +PP = /lib/cpp -P + + +all: unres + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns_CSA.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new_barrier.o \ + energy_p_new-sep.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + together.o csa.o minim_jlee.o shift.o diff12.o bank.o newconf.o ran.o \ + indexx.o MP.o compare_s1.o prng.o \ + test.o banach.o distfit.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o + +unres: ${object} proc_proc.o + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} proc_proc.o cinfo.o ${LIBS} -o ${BIN} + + +clean: + /bin/rm *.o *.pp.[fF] *.pp.inst.[fF] + +newconf.o: newconf.f + ${FC} ${FFLAGS} ${CPPFLAGS} newconf.f + +bank.o: bank.F + ${FC} ${FFLAGS} ${CPPFLAGS} bank.F + +diff12.o: diff12.f + ${FC} ${FFLAGS} ${CPPFLAGS} diff12.f + +csa.o: csa.f + ${FC} ${FFLAGS} ${CPPFLAGS} csa.f + +shift.o: shift.F + ${FC} ${FFLAGS} ${CPPFLAGS} shift.F + +ran.o: ran.f + ${FC} ${FFLAGS} ${CPPFLAGS} ran.f + +together.o: together.F + ${FC} ${FFLAGS} ${CPPFLAGS} together.F + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.f + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.f + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS1} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f + +energy_p_new.o : energy_p_new.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new.F + +energy_p_new-sep.o : energy_p_new-sep.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new-sep.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +blas.o : blas.f + ${FC} ${FFLAGS1} blas.f + +add.o : add.f + ${FC} ${FFLAGS1} add.f + +eigen.o : eigen.f + ${FC} ${FFLAGS1} eigen.f + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-NEWSC/Makefile_galera b/source/unres/src_MD-NEWSC/Makefile_galera new file mode 100644 index 0000000..899ec63 --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_galera @@ -0,0 +1,147 @@ +CPPFLAGS = -DPROCOR -DLINUX -DUNRES -DMP -DMPI -DPGI -DISNAN \ + -DSPLITELE -DAMD64 -DLANG0 +# -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +#-DCRYST_TOR +# -DPROCOR +# -DTSCSC +#-DTIMING \ +# -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +# -DMOMENT +#-DPARVEC +#-DPARINT -DPARINTDER + +#INSTALL_DIR = /users/local/mpi64/mpich-1.2.7p1/ +#INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh +#INSTALL_DIR = /users/software/mpich2.x86_64/ +#INSTALL_DIR = /opt/mpi/mvapich2 +INSTALL_DIR = /opt/mpi/mvapich + +FC= ifort +FCL= ${INSTALL_DIR}/bin/mpif77 + +OPT = -O3 -ip -w -xHost + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -w -g -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -w -xHost -O3 -ipo -ipo_obj -no-prec-div -opt_report -I$(INSTALL_DIR)/include + + +BIN = ../bin/unres_Tc_procor_new_em64_hremd_mpich1.exe +LIBS = -L$(INSTALL_DIR)/lib -lmpich xdrf_em64/libxdrf.a -lpthread + +ARCH = LINUX +PP = /lib/cpp -P + + +all: unres + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns_CSA.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new_barrier.o \ + energy_p_new-sep_barrier.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + together.o csa.o minim_jlee.o shift.o diff12.o bank.o newconf.o ran.o \ + indexx.o MP.o compare_s1.o prng_32.o \ + test.o banach.o distfit.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o + +unres: ${object} + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FCL} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + + +clean: + /bin/rm *.o *.il + +newconf.o: newconf.f + ${FC} ${FFLAGS} ${CPPFLAGS} newconf.f + +bank.o: bank.F + ${FC} ${FFLAGS} ${CPPFLAGS} bank.F + +diff12.o: diff12.f + ${FC} ${FFLAGS} ${CPPFLAGS} diff12.f + +csa.o: csa.f + ${FC} ${FFLAGS} ${CPPFLAGS} csa.f + +shift.o: shift.F + ${FC} ${FFLAGS} ${CPPFLAGS} shift.F + +ran.o: ran.f + ${FC} ${FFLAGS} ${CPPFLAGS} ran.f + +together.o: together.F + ${FC} ${FFLAGS} ${CPPFLAGS} together.F + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.F + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.F + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS1} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f + +energy_p_new_barrier.o : energy_p_new_barrier.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new_barrier.F + +gradient_p.o : gradient_p.F + ${FC} ${FFLAGSE} ${CPPFLAGS} gradient_p.F + +energy_p_new-sep_barrier.o : energy_p_new-sep_barrier.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new-sep_barrier.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +MD_A-MTS.o : MD_A-MTS.F + ${FC} ${FFLAGSE} ${CPPFLAGS} MD_A-MTS.F + +blas.o : blas.f + ${FC} ${FFLAGS1} blas.f + +add.o : add.f + ${FC} ${FFLAGS1} add.f + +eigen.o : eigen.f + ${FC} ${FFLAGS2} eigen.f + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-NEWSC/Makefile_gitdefault b/source/unres/src_MD-NEWSC/Makefile_gitdefault new file mode 100644 index 0000000..c928a62 --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_gitdefault @@ -0,0 +1,127 @@ +################################################################### +INSTALL_DIR = /users/software/mpich-1.2.7p1_intel-10.1_em64_ssh + + +FC= ifort + +OPT = -O3 -ip + +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -g -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -g -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -O3 -ipo -opt_report -I$(INSTALL_DIR)/include + + +LIBS = -L$(INSTALL_DIR)/lib -lmpich xdrf/libxdrf.a + +ARCH = LINUX +PP = /lib/cpp -P + + +all: no_option + @echo "give optin GAB or E0LL2Y" + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new_barrier.o \ + energy_p_new-sep_barrier.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + MP.o compare_s1.o prng.o \ + banach.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o test.o ssMD.o + +no_option: + +GAB: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN -DMP -DMPI \ + -DSPLITELE -DLANG0 -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +GAB: BIN = ../../../bin/unres/MD/unres_ifort_MPICH_GAB.exe +GAB: ${object} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + +E0LL2Y: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN -DMP -DMPI \ + -DSPLITELE -DLANG0 +E0LL2Y: BIN = ../../../bin/unres/MD/unres_ifort_MPICH_E0LL2Y.exe +E0LL2Y: ${object} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + +xdrf/libxdrf.a: + cd xdrf && make + + +clean: + /bin/rm -f *.o && /bin/rm -f compinfo && cd xdrf && make clean + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.F + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.F + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS1} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f + +energy_p_new_barrier.o : energy_p_new_barrier.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new_barrier.F + +gradient_p.o : gradient_p.F + ${FC} ${FFLAGSE} ${CPPFLAGS} gradient_p.F + +energy_p_new-sep_barrier.o : energy_p_new-sep_barrier.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new-sep_barrier.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +MD_A-MTS.o : MD_A-MTS.F + ${FC} ${FFLAGSE} ${CPPFLAGS} MD_A-MTS.F + +blas.o : blas.f + ${FC} ${FFLAGS1} blas.f + +add.o : add.f + ${FC} ${FFLAGS1} add.f + +eigen.o : eigen.f + ${FC} ${FFLAGS2} eigen.f + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-NEWSC/Makefile_intrepid b/source/unres/src_MD-NEWSC/Makefile_intrepid new file mode 100644 index 0000000..2b57f9e --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_intrepid @@ -0,0 +1,151 @@ +# +FC=/bgsys/drivers/ppcfloor/comm/bin/mpixlf77 +OPT = -O4 -qarch=450 -qtune=450 +#OPT = -O3 -qarch=450 -qtune=450 -qdebug=function_trace +#OPT = -O -qarch=450 -qtune=450 +#OPT = -O0 -C -g -qarch=450 -qtune=450 #-qdebug=function_trace +#-Minline=name:scalar2,scalar,transpose2,matvec2,prodmat3 \ +#-Mprefetch=distance:8,nta + +#OPT1 = -O -g -qarch=450 -qtune=450 +#OPT1 = -O -g -qarch=450 -qtune=450 -qdebug=function_trace +OPT1 = ${OPT} +#OPT2 = -O2 -qarch=450 -qtune=450 +#OPT2 = -O2 -qarch=450 -qtune=450 -qdebug=function_trace +OPT2 = ${OPT} +#OPTE = -O4 -qarch=450 -qtune=450 +#OPTE = -O4 -qarch=450 -qtune=450 +OPTE=${OPT} + +CFLAGS = -c +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c ${OPT1} -I$(INSTALL_DIR)/include +FFLAGS2 = -c ${OPT2} -I$(INSTALL_DIR)/include +FFLAGSE = -c ${OPTE} -I$(INSTALL_DIR)/include + +BIN = ../bin/unres_MD_Tc_procor-newparm-O4-parcorr.exe +#BIN = ../bin/unres_MD_Tc_procor-newparm-O4-PARINT-parcorr.exe +#BIN = ../bin/unres_MD_Tc_procor-newparm-parvecmatint-O4-notau1.exe +#BIN = ../bin/unres_MD_Tc_procor-newparm-O4-notau1.exe +#LIBS = xdrf/libxdrf.a /home/liwo/UNRES/LIB/libmemmon.a +LIBS = xdrf/libxdrf.a + +CPPFLAGS = -WF,-DAIX -WF,-DISNAN -WF,-DUNRES -WF,-DMP -WF,-DMPI -WF,-DPGI \ + -WF,-DSPLITELE -WF,-DPROCOR -WF,-DAMD64 -WF,-DLANG0 +#-WF,-DPARINT -WF,-DPARINTDER +#-WF,-DPARVEC -WF,-DPARMAT -WF,-DMATGATHER + +ARCH = LINUX +PP = /lib/cpp -P + + +all: unres + +obj: ${object} + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns_CSA.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new_barrier.o \ + energy_p_new-sep_barrier.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + together.o csa.o minim_jlee.o shift.o diff12.o bank.o newconf.o ran.o \ + indexx.o MP.o compare_s1.o prng.o \ + test.o banach.o distfit.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o + +unres: ${object} + ${CC} -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + + +clean: + /bin/rm *.o + +newconf.o: newconf.f + ${FC} ${FFLAGS} ${CPPFLAGS} newconf.f + +bank.o: bank.F + ${FC} ${FFLAGS} ${CPPFLAGS} bank.F + +diff12.o: diff12.f + ${FC} ${FFLAGS} ${CPPFLAGS} diff12.f + +csa.o: csa.f + ${FC} ${FFLAGS} ${CPPFLAGS} csa.f + +shift.o: shift.F + ${FC} ${FFLAGS} ${CPPFLAGS} shift.F + +ran.o: ran.f + ${FC} ${FFLAGS} ${CPPFLAGS} ran.f + +together.o: together.F + ${FC} ${FFLAGS} ${CPPFLAGS} together.F + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.f + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.f + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS1} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f + +eigen.o : eigen.f + ${FC} ${FFLAGS1} ${CPPFLAGS} eigen.f + +blas.o : blas.f + ${FC} ${FFLAGS1} ${CPPFLAGS} blas.f + +add.o : add.f + ${FC} ${FFLAGS1} ${CPPFLAGS} add.f + +energy_p_new.o : energy_p_new.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new.F + +energy_p_new-sep.o : energy_p_new-sep.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new-sep.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c + +compinfo: compinfo.c + ${CC} ${CFLAGS} compinfo.c diff --git a/source/unres/src_MD-NEWSC/Makefile_single_gfortran b/source/unres/src_MD-NEWSC/Makefile_single_gfortran new file mode 100644 index 0000000..3ef2052 --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_single_gfortran @@ -0,0 +1,130 @@ +FC= gfortran +FFLAGS = -c ${OPT} -I. +FFLAGS1 = -c ${OPT1} -I. + +CC = cc + +CFLAGS = -DLINUX -DPGI -c + +OPT = -O -fbounds-check -g +OPT1 = -g + +#OPT = -fbounds-check -g +#OPT1 = -g + +# -Mvect <---slows down +# -Minline=name:matmat2 <---false convergence + +LIBS = -Lxdrf -lxdrf +#-DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +ARCH = LINUX +PP = /lib/cpp -P + +all: + @echo "Specify force field: GAB or E0LL2Y" + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new_barrier.o \ + energy_p_new-sep_barrier.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + MP.o compare_s1.o prng_32.o \ + banach.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o test.o ssMD.o + +GAB: CPPFLAGS = -DPROCOR -DLINUX -DUNRES -DISNAN \ + -DSPLITELE -DLANG0 -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +GAB: BIN = ../../../bin/unres/MD/unres_gfortran_single_GAB.exe +GAB: ${object} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + +E0LL2Y: CPPFLAGS = -DPROCOR -DLINUX -DUNRES -DISNAN \ + -DSPLITELE -DLANG0 +E0LL2Y: BIN = ../../../bin/unres/MD/unres_gfortran_single_E0LL2Y.exe +E0LL2Y: ${object} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + +xdrf/libxdrf.a: + cd xdrf && make + +clean: + /bin/rm -f *.o && /bin/rm -f compinfo && cd xdrf && make clean + +newconf.o: newconf.F + ${FC} ${FFLAGS} ${CPPFLAGS} newconf.F + +bank.o: bank.F + ${FC} ${FFLAGS} ${CPPFLAGS} bank.F + +diff12.o: diff12.f + ${FC} ${FFLAGS} ${CPPFLAGS} diff12.f + +csa.o: csa.f + ${FC} ${FFLAGS1} ${CPPFLAGS} csa.f + +shift.o: shift.F + ${FC} ${FFLAGS1} ${CPPFLAGS} shift.F + +ran.o: ran.f + ${FC} ${FFLAGS1} ${CPPFLAGS} ran.f + +together.o: together.F + ${FC} ${FFLAGS} ${CPPFLAGS} together.F + +fitsq.o: fitsq.f + ${FC} ${FFLAGS1} ${CPPFLAGS} fitsq.f + +rmsd.o: rmsd.F + ${FC} ${FFLAGS1} ${CPPFLAGS} rmsd.F + +contact.o: contact.f + ${FC} ${FFLAGS1} ${CPPFLAGS} contact.f + +minim_jlee.o: minim_jlee.F + ${FC} ${FFLAGS1} ${CPPFLAGS} minim_jlee.F + +minimize_p.o: minimize_p.F + ${FC} ${FFLAGS1} ${CPPFLAGS} minimize_p.F + +gen_rand_conf.o: gen_rand_conf.F + ${FC} ${FFLAGS} ${CPPFLAGS} gen_rand_conf.F + + +test.o: test.F + ${FC} ${FFLAGS1} ${CPPFLAGS} test.F + +elecont.o: elecont.f + ${FC} ${FFLAGS} ${CPPFLAGS} elecont.f + +eigen.o: eigen.f + ${FC} ${FFLAGS1} eigen.f + +blas.o: blas.f + ${FC} ${FFLAGS1} blas.f + +add.o: add.f + ${FC} ${FFLAGS1} add.f + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-NEWSC/Makefile_single_ifort b/source/unres/src_MD-NEWSC/Makefile_single_ifort new file mode 100644 index 0000000..03ad1e7 --- /dev/null +++ b/source/unres/src_MD-NEWSC/Makefile_single_ifort @@ -0,0 +1,127 @@ +FC = ifort +FFLAGS = -c ${OPT} -I$(INSTALL_DIR)/include +FFLAGS1 = -c -w -g -d2 -CA -CB -I$(INSTALL_DIR)/include +FFLAGS2 = -c -w -g -O0 -I$(INSTALL_DIR)/include +FFLAGSE = -c -w -O3 -ipo -ipo_obj -opt_report -I$(INSTALL_DIR)/include + +CC = cc + +CFLAGS = -DLINUX -DPGI -c + +OPT = -O3 -ip -w + +# -Mvect <---slows down +# -Minline=name:matmat2 <---false convergence + +LIBS = -Lxdrf -lxdrf +#-DMOMENT +#-DCO_BIAS +#-DCRYST_TOR +#-DDEBUG + +ARCH = LINUX +PP = /lib/cpp -P + +all: + @echo "Specify force field: GAB or E0LL2Y" + +.SUFFIXES: .F +.F.o: + ${FC} ${FFLAGS} ${CPPFLAGS} $*.F + +object = unres.o arcos.o cartprint.o chainbuild.o convert.o initialize_p.o \ + matmult.o readrtns.o parmread.o gen_rand_conf.o printmat.o map.o \ + pinorm.o randgens.o rescode.o intcor.o timing.o misc.o intlocal.o \ + cartder.o checkder_p.o econstr_local.o energy_p_new_barrier.o \ + energy_p_new-sep_barrier.o gradient_p.o minimize_p.o sumsld.o \ + cored.o rmdd.o geomout.o readpdb.o regularize.o thread.o fitsq.o mcm.o \ + mc.o bond_move.o refsys.o check_sc_distr.o check_bond.o contact.o djacob.o \ + eigen.o blas.o add.o entmcm.o minim_mcmf.o \ + MP.o compare_s1.o prng.o \ + banach.o rmsd.o elecont.o dihed_cons.o \ + sc_move.o local_move.o \ + intcartderiv.o lagrangian_lesyng.o\ + stochfric.o kinetic_lesyng.o MD_A-MTS.o moments.o int_to_cart.o \ + surfatom.o sort.o muca_md.o MREMD.o rattle.o gauss.o energy_split-sep.o \ + q_measure.o gnmr1.o test.o ssMD.o + +GAB: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN \ + -DSPLITELE -DLANG0 -DCRYST_BOND -DCRYST_THETA -DCRYST_SC +GAB: BIN = ../../../bin/unres/MD/unres_ifort_single_MM-KB.exe +GAB: ${object} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + +E0LL2Y: CPPFLAGS = -DPROCOR -DLINUX -DPGI -DUNRES -DISNAN \ + -DSPLITELE -DLANG0 +E0LL2Y: BIN = ../../../bin/unres/MD/unres_ifort_single_MM-PH.exe +E0LL2Y: ${object} xdrf/libxdrf.a + cc -o compinfo compinfo.c + ./compinfo | true + ${FC} ${FFLAGS} cinfo.f + ${FC} ${OPT} ${object} cinfo.o ${LIBS} -o ${BIN} + +xdrf/libxdrf.a: + cd xdrf && make + +clean: + /bin/rm -f *.o && /bin/rm -f compinfo && cd xdrf && make clean + +test.o: test.F + ${FC} ${FFLAGS} ${CPPFLAGS} test.F + +chainbuild.o: chainbuild.F + ${FC} ${FFLAGS} ${CPPFLAGS} chainbuild.F + +matmult.o: matmult.f + ${FC} ${FFLAGS} ${CPPFLAGS} matmult.f + +parmread.o : parmread.F + ${FC} ${FFLAGS} ${CPPFLAGS} parmread.F + +intcor.o : intcor.f + ${FC} ${FFLAGS} ${CPPFLAGS} intcor.f + +cartder.o : cartder.F + ${FC} ${FFLAGS} ${CPPFLAGS} cartder.F + +readpdb.o : readpdb.F + ${FC} ${FFLAGS2} ${CPPFLAGS} readpdb.F + +sumsld.o : sumsld.f + ${FC} ${FFLAGS} ${CPPFLAGS} sumsld.f + +cored.o : cored.f + ${FC} ${FFLAGS1} ${CPPFLAGS} cored.f + +rmdd.o : rmdd.f + ${FC} ${FFLAGS} ${CPPFLAGS} rmdd.f + +energy_p_new_barrier.o : energy_p_new_barrier.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new_barrier.F + +gradient_p.o : gradient_p.F + ${FC} ${FFLAGSE} ${CPPFLAGS} gradient_p.F + +energy_p_new-sep_barrier.o : energy_p_new-sep_barrier.F + ${FC} ${FFLAGSE} ${CPPFLAGS} energy_p_new-sep_barrier.F + +lagrangian_lesyng.o : lagrangian_lesyng.F + ${FC} ${FFLAGSE} ${CPPFLAGS} lagrangian_lesyng.F + +MD_A-MTS.o : MD_A-MTS.F + ${FC} ${FFLAGSE} ${CPPFLAGS} MD_A-MTS.F + +blas.o : blas.f + ${FC} ${FFLAGS1} blas.f + +add.o : add.f + ${FC} ${FFLAGS1} add.f + +eigen.o : eigen.f + ${FC} ${FFLAGS2} eigen.f + +proc_proc.o: proc_proc.c + ${CC} ${CFLAGS} proc_proc.c diff --git a/source/unres/src_MD-NEWSC/README b/source/unres/src_MD-NEWSC/README new file mode 100644 index 0000000..2b1d2be --- /dev/null +++ b/source/unres/src_MD-NEWSC/README @@ -0,0 +1,2 @@ +The program will fail if there is no "Makefile" file. +You must copy (cp MakeXXXX Makefile) or use a symbolic link (ln -s MakeXXXX Makefile) before compiling. diff --git a/source/unres/src_MD-NEWSC/add.f b/source/unres/src_MD-NEWSC/add.f new file mode 100644 index 0000000..fd91a70 --- /dev/null +++ b/source/unres/src_MD-NEWSC/add.f @@ -0,0 +1,28 @@ + SUBROUTINE ABRT + STOP 'IN ABRT' + END +C*MODULE MTHLIB *DECK VCLR + SUBROUTINE VCLR(A,INCA,N) +C + IMPLICIT DOUBLE PRECISION(A-H,O-Z) +C + DIMENSION A(*) +C + PARAMETER (ZERO=0.0D+00) +C +C ----- ZERO OUT VECTOR -A-, USING INCREMENT -INCA- ----- +C + IF (INCA .NE. 1) GO TO 200 + DO 110 L=1,N + A(L) = ZERO + 110 CONTINUE + RETURN +C + 200 CONTINUE + LA=1-INCA + DO 210 L=1,N + LA=LA+INCA + A(LA) = ZERO + 210 CONTINUE + RETURN + END diff --git a/source/unres/src_MD-NEWSC/arcos.f b/source/unres/src_MD-NEWSC/arcos.f new file mode 100644 index 0000000..f054118 --- /dev/null +++ b/source/unres/src_MD-NEWSC/arcos.f @@ -0,0 +1,9 @@ + FUNCTION ARCOS(X) + implicit real*8 (a-h,o-z) + include 'COMMON.GEO' + IF (DABS(X).LT.1.0D0) GOTO 1 + ARCOS=PIPOL*(1.0d0-DSIGN(1.0D0,X)) + RETURN + 1 ARCOS=DACOS(X) + RETURN + END diff --git a/source/unres/src_MD-NEWSC/banach.f b/source/unres/src_MD-NEWSC/banach.f new file mode 100644 index 0000000..7c43d77 --- /dev/null +++ b/source/unres/src_MD-NEWSC/banach.f @@ -0,0 +1,99 @@ +C +C********************** + SUBROUTINE BANACH(N,NMAX,A,X,osob) +C********************** +C Banachiewicz + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A(NMAX,NMAX),X(NMAX),D(MAXRES6) + COMMON /BANII/ D + logical osob + osob=.false. + if (dabs(a(1,1)).lt.1.0d-15) then + osob=.true. + return + endif + D(1)=1./A(1,1) + DO 80 I=2,N + A(I,1)=A(1,I) + DO 81 J=2,I-1 + XX=A(J,I) + DO 82 K=1,J-1 + XX=XX-A(I,K)*A(J,K) + 82 CONTINUE + A(I,J)=XX + 81 CONTINUE + XX=A(I,I) + JJJJ=I-1 + DO 83 J=1,JJJJ + AIJ=A(I,J) + AIJD=AIJ*D(J) + A(I,J)=AIJD + XX=XX-AIJ*AIJD + 83 CONTINUE + if (dabs(xx).lt.1.0d-15) then + osob=.true. + return + endif + D(I)=1./XX + 80 CONTINUE +C + CALL BANAII(N,NMAX,A,X) + RETURN + END +C************************ + SUBROUTINE BANAII(N,NMAX,A,X) +C************************ + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A(NMAX,NMAX),X(NMAX),D(MAXRES6) + COMMON /BANII/ D + DO 90 I=1,N + Z=X(I) + JJJJ=I-1 + DO 91 J=JJJJ,1,-1 + Z=Z-A(I,J)*X(J) + 91 CONTINUE + X(I)=Z + 90 CONTINUE + DO 92 I=N,1,-1 + Z=X(I)*D(I) + JJJJ=I+1 + DO 93 J=JJJJ,N + Z=Z-A(J,I)*X(J) + 93 CONTINUE + X(I)=Z + 92 CONTINUE + RETURN + END +C + SUBROUTINE MATINVERT(N,NMAX,A,A1,osob) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A(NMAX,NMAX),A1(NMAX,NMAX),D(MAXRES6) + COMMON /BANII/ D + DIMENSION X(NMAX) + logical osob + DO I=1,N + X(I)=0.0 + ENDDO + X(1)=1.0 + CALL BANACH(N,NMAX,A,X,osob) + if (osob) return + DO I=1,N + A1(I,1)=X(I) + ENDDO + DO I=2,N + DO J=1,N + X(J)=0.0 + ENDDO + X(I)=1.0 + CALL BANAII(N,NMAX,A,X) + DO J=1,N + A1(J,I)=X(J) + ENDDO + ENDDO + RETURN + END + + diff --git a/source/unres/src_MD-NEWSC/blas.f b/source/unres/src_MD-NEWSC/blas.f new file mode 100644 index 0000000..142d821 --- /dev/null +++ b/source/unres/src_MD-NEWSC/blas.f @@ -0,0 +1,575 @@ +C 10 NOV 94 - MWS - DNRM2: REMOVE FTNCHECK WARNINGS +C 11 JUN 94 - MWS - INCLUDE A COPY OF DGEMV (LEVEL TWO ROUTINE) +C 11 AUG 87 - MWS - SANITIZE FLOATING POINT CONSTANTS IN DNRM2 +C 26 MAR 87 - MWS - USE GENERIC SIGN IN DROTG +C 28 NOV 86 - STE - SUPPLY ALL LEVEL ONE BLAS +C 7 JUL 86 - JAB - SANITIZE FLOATING POINT CONSTANTS +C +C BASIC LINEAR ALGEBRA SUBPROGRAMS (BLAS) FROM LINPACK (LEVEL 1) +C +C THIS MODULE SHOULD BE COMPILED ONLY IF SPECIALLY CODED +C VERSIONS OF THESE ROUTINES ARE NOT AVAILABLE ON THE TARGET MACHINE +C +C*MODULE BLAS1 *DECK DASUM + DOUBLE PRECISION FUNCTION DASUM(N,DX,INCX) +C +C TAKES THE SUM OF THE ABSOLUTE VALUES. +C JACK DONGARRA, LINPACK, 3/11/78. +C + DOUBLE PRECISION DX(1),DTEMP + INTEGER I,INCX,M,MP1,N,NINCX +C + DASUM = 0.0D+00 + DTEMP = 0.0D+00 + IF(N.LE.0)RETURN + IF(INCX.EQ.1)GO TO 20 +C +C CODE FOR INCREMENT NOT EQUAL TO 1 +C + NINCX = N*INCX + DO 10 I = 1,NINCX,INCX + DTEMP = DTEMP + ABS(DX(I)) + 10 CONTINUE + DASUM = DTEMP + RETURN +C +C CODE FOR INCREMENT EQUAL TO 1 +C +C +C CLEAN-UP LOOP +C + 20 M = MOD(N,6) + IF( M .EQ. 0 ) GO TO 40 + DO 30 I = 1,M + DTEMP = DTEMP + ABS(DX(I)) + 30 CONTINUE + IF( N .LT. 6 ) GO TO 60 + 40 MP1 = M + 1 + DO 50 I = MP1,N,6 + DTEMP = DTEMP + ABS(DX(I)) + ABS(DX(I + 1)) + ABS(DX(I + 2)) + * + ABS(DX(I + 3)) + ABS(DX(I + 4)) + ABS(DX(I + 5)) + 50 CONTINUE + 60 DASUM = DTEMP + RETURN + END +C*MODULE BLAS1 *DECK DAXPY + SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION DX(1),DY(1) +C +C CONSTANT TIMES A VECTOR PLUS A VECTOR. +C DY(I) = DY(I) + DA * DX(I) +C USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE. +C JACK DONGARRA, LINPACK, 3/11/78. +C + IF(N.LE.0)RETURN + IF (DA .EQ. 0.0D+00) 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 + DY(IY) = DY(IY) + DA*DX(IX) + 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,4) + IF( M .EQ. 0 ) GO TO 40 + DO 30 I = 1,M + DY(I) = DY(I) + DA*DX(I) + 30 CONTINUE + IF( N .LT. 4 ) RETURN + 40 MP1 = M + 1 + DO 50 I = MP1,N,4 + DY(I) = DY(I) + DA*DX(I) + DY(I + 1) = DY(I + 1) + DA*DX(I + 1) + DY(I + 2) = DY(I + 2) + DA*DX(I + 2) + DY(I + 3) = DY(I + 3) + DA*DX(I + 3) + 50 CONTINUE + RETURN + END +C*MODULE BLAS1 *DECK DCOPY + SUBROUTINE DCOPY(N,DX,INCX,DY,INCY) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION DX(*),DY(*) +C +C COPIES A VECTOR. +C DY(I) <== DX(I) +C USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE. +C JACK DONGARRA, LINPACK, 3/11/78. +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 +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 + DY(IY) = DX(IX) + 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,7) + IF( M .EQ. 0 ) GO TO 40 + DO 30 I = 1,M + DY(I) = DX(I) + 30 CONTINUE + IF( N .LT. 7 ) RETURN + 40 MP1 = M + 1 + DO 50 I = MP1,N,7 + DY(I) = DX(I) + DY(I + 1) = DX(I + 1) + DY(I + 2) = DX(I + 2) + DY(I + 3) = DX(I + 3) + DY(I + 4) = DX(I + 4) + DY(I + 5) = DX(I + 5) + DY(I + 6) = DX(I + 6) + 50 CONTINUE + RETURN + END +C*MODULE BLAS1 *DECK DDOT + DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION DX(1),DY(1) +C +C FORMS THE DOT PRODUCT OF TWO VECTORS. +C DOT = DX(I) * DY(I) +C USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE. +C JACK DONGARRA, LINPACK, 3/11/78. +C + DDOT = 0.0D+00 + DTEMP = 0.0D+00 + 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 + DTEMP = DTEMP + DX(IX)*DY(IY) + IX = IX + INCX + IY = IY + INCY + 10 CONTINUE + DDOT = DTEMP + RETURN +C +C CODE FOR BOTH INCREMENTS EQUAL TO 1 +C +C +C CLEAN-UP LOOP +C + 20 M = MOD(N,5) + IF( M .EQ. 0 ) GO TO 40 + DO 30 I = 1,M + DTEMP = DTEMP + DX(I)*DY(I) + 30 CONTINUE + IF( N .LT. 5 ) GO TO 60 + 40 MP1 = M + 1 + DO 50 I = MP1,N,5 + DTEMP = DTEMP + DX(I)*DY(I) + DX(I + 1)*DY(I + 1) + + * DX(I + 2)*DY(I + 2) + DX(I + 3)*DY(I + 3) + DX(I + 4)*DY(I + 4) + 50 CONTINUE + 60 DDOT = DTEMP + RETURN + END +C*MODULE BLAS1 *DECK DNRM2 + DOUBLE PRECISION FUNCTION DNRM2 ( N, DX, INCX) + INTEGER NEXT + DOUBLE PRECISION DX(1), CUTLO, CUTHI, HITEST, SUM, XMAX,ZERO,ONE + DATA ZERO, ONE /0.0D+00, 1.0D+00/ +C +C EUCLIDEAN NORM OF THE N-VECTOR STORED IN DX() WITH STORAGE +C INCREMENT INCX . +C IF N .LE. 0 RETURN WITH RESULT = 0. +C IF N .GE. 1 THEN INCX MUST BE .GE. 1 +C +C C.L.LAWSON, 1978 JAN 08 +C +C FOUR PHASE METHOD USING TWO BUILT-IN CONSTANTS THAT ARE +C HOPEFULLY APPLICABLE TO ALL MACHINES. +C CUTLO = MAXIMUM OF SQRT(U/EPS) OVER ALL KNOWN MACHINES. +C CUTHI = MINIMUM OF SQRT(V) OVER ALL KNOWN MACHINES. +C WHERE +C EPS = SMALLEST NO. SUCH THAT EPS + 1. .GT. 1. +C U = SMALLEST POSITIVE NO. (UNDERFLOW LIMIT) +C V = LARGEST NO. (OVERFLOW LIMIT) +C +C BRIEF OUTLINE OF ALGORITHM.. +C +C PHASE 1 SCANS ZERO COMPONENTS. +C MOVE TO PHASE 2 WHEN A COMPONENT IS NONZERO AND .LE. CUTLO +C MOVE TO PHASE 3 WHEN A COMPONENT IS .GT. CUTLO +C MOVE TO PHASE 4 WHEN A COMPONENT IS .GE. CUTHI/M +C WHERE M = N FOR X() REAL AND M = 2*N FOR COMPLEX. +C +C VALUES FOR CUTLO AND CUTHI.. +C FROM THE ENVIRONMENTAL PARAMETERS LISTED IN THE IMSL CONVERTER +C DOCUMENT THE LIMITING VALUES ARE AS FOLLOWS.. +C CUTLO, S.P. U/EPS = 2**(-102) FOR HONEYWELL. CLOSE SECONDS ARE +C UNIVAC AND DEC AT 2**(-103) +C THUS CUTLO = 2**(-51) = 4.44089E-16 +C CUTHI, S.P. V = 2**127 FOR UNIVAC, HONEYWELL, AND DEC. +C THUS CUTHI = 2**(63.5) = 1.30438E19 +C CUTLO, D.P. U/EPS = 2**(-67) FOR HONEYWELL AND DEC. +C THUS CUTLO = 2**(-33.5) = 8.23181D-11 +C CUTHI, D.P. SAME AS S.P. CUTHI = 1.30438D+19 +C DATA CUTLO, CUTHI / 8.232D-11, 1.304D+19 / +C DATA CUTLO, CUTHI / 4.441E-16, 1.304E19 / + DATA CUTLO, CUTHI / 8.232D-11, 1.304D+19 / +C + J=0 + IF(N .GT. 0) GO TO 10 + DNRM2 = ZERO + GO TO 300 +C + 10 ASSIGN 30 TO NEXT + SUM = ZERO + NN = N * INCX +C BEGIN MAIN LOOP + I = 1 + 20 GO TO NEXT,(30, 50, 70, 110) + 30 IF( ABS(DX(I)) .GT. CUTLO) GO TO 85 + ASSIGN 50 TO NEXT + XMAX = ZERO +C +C PHASE 1. SUM IS ZERO +C + 50 IF( DX(I) .EQ. ZERO) GO TO 200 + IF( ABS(DX(I)) .GT. CUTLO) GO TO 85 +C +C PREPARE FOR PHASE 2. + ASSIGN 70 TO NEXT + GO TO 105 +C +C PREPARE FOR PHASE 4. +C + 100 I = J + ASSIGN 110 TO NEXT + SUM = (SUM / DX(I)) / DX(I) + 105 XMAX = ABS(DX(I)) + GO TO 115 +C +C PHASE 2. SUM IS SMALL. +C SCALE TO AVOID DESTRUCTIVE UNDERFLOW. +C + 70 IF( ABS(DX(I)) .GT. CUTLO ) GO TO 75 +C +C COMMON CODE FOR PHASES 2 AND 4. +C IN PHASE 4 SUM IS LARGE. SCALE TO AVOID OVERFLOW. +C + 110 IF( ABS(DX(I)) .LE. XMAX ) GO TO 115 + SUM = ONE + SUM * (XMAX / DX(I))**2 + XMAX = ABS(DX(I)) + GO TO 200 +C + 115 SUM = SUM + (DX(I)/XMAX)**2 + GO TO 200 +C +C +C PREPARE FOR PHASE 3. +C + 75 SUM = (SUM * XMAX) * XMAX +C +C +C FOR REAL OR D.P. SET HITEST = CUTHI/N +C FOR COMPLEX SET HITEST = CUTHI/(2*N) +C + 85 HITEST = CUTHI/N +C +C PHASE 3. SUM IS MID-RANGE. NO SCALING. +C + DO 95 J =I,NN,INCX + IF(ABS(DX(J)) .GE. HITEST) GO TO 100 + 95 SUM = SUM + DX(J)**2 + DNRM2 = SQRT( SUM ) + GO TO 300 +C + 200 CONTINUE + I = I + INCX + IF ( I .LE. NN ) GO TO 20 +C +C END OF MAIN LOOP. +C +C COMPUTE SQUARE ROOT AND ADJUST FOR SCALING. +C + DNRM2 = XMAX * SQRT(SUM) + 300 CONTINUE + RETURN + END +C*MODULE BLAS1 *DECK DROT + SUBROUTINE DROT (N,DX,INCX,DY,INCY,C,S) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION DX(1),DY(1) +C +C APPLIES A PLANE ROTATION. +C DX(I) = C*DX(I) + S*DY(I) +C DY(I) = -S*DX(I) + C*DY(I) +C JACK DONGARRA, LINPACK, 3/11/78. +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 + DTEMP = C*DX(IX) + S*DY(IY) + DY(IY) = C*DY(IY) - S*DX(IX) + DX(IX) = DTEMP + IX = IX + INCX + IY = IY + INCY + 10 CONTINUE + RETURN +C +C CODE FOR BOTH INCREMENTS EQUAL TO 1 +C + 20 DO 30 I = 1,N + DTEMP = C*DX(I) + S*DY(I) + DY(I) = C*DY(I) - S*DX(I) + DX(I) = DTEMP + 30 CONTINUE + RETURN + END +C*MODULE BLAS1 *DECK DROTG + SUBROUTINE DROTG(DA,DB,C,S) +C +C CONSTRUCT GIVENS PLANE ROTATION. +C JACK DONGARRA, LINPACK, 3/11/78. +C + DOUBLE PRECISION DA,DB,C,S,ROE,SCALE,R,Z + DOUBLE PRECISION ZERO, ONE +C + PARAMETER (ZERO=0.0D+00, ONE=1.0D+00) +C +C----------------------------------------------------------------------- +C +C + ROE = DB + IF( ABS(DA) .GT. ABS(DB) ) ROE = DA + SCALE = ABS(DA) + ABS(DB) + IF( SCALE .NE. ZERO ) GO TO 10 + C = ONE + S = ZERO + R = ZERO + GO TO 20 +C + 10 R = SCALE*SQRT((DA/SCALE)**2 + (DB/SCALE)**2) + R = SIGN(ONE,ROE)*R + C = DA/R + S = DB/R + 20 Z = ONE + IF( ABS(DA) .GT. ABS(DB) ) Z = S + IF( ABS(DB) .GE. ABS(DA) .AND. C .NE. ZERO ) Z = ONE/C + DA = R + DB = Z + RETURN + END +C*MODULE BLAS1 *DECK DSCAL + SUBROUTINE DSCAL(N,DA,DX,INCX) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION DX(1) +C +C SCALES A VECTOR BY A CONSTANT. +C DX(I) = DA * DX(I) +C USES UNROLLED LOOPS FOR INCREMENT EQUAL TO ONE. +C JACK DONGARRA, LINPACK, 3/11/78. +C + IF(N.LE.0)RETURN + IF(INCX.EQ.1)GO TO 20 +C +C CODE FOR INCREMENT NOT EQUAL TO 1 +C + NINCX = N*INCX + DO 10 I = 1,NINCX,INCX + DX(I) = DA*DX(I) + 10 CONTINUE + RETURN +C +C CODE FOR INCREMENT EQUAL TO 1 +C +C +C CLEAN-UP LOOP +C + 20 M = MOD(N,5) + IF( M .EQ. 0 ) GO TO 40 + DO 30 I = 1,M + DX(I) = DA*DX(I) + 30 CONTINUE + IF( N .LT. 5 ) RETURN + 40 MP1 = M + 1 + DO 50 I = MP1,N,5 + DX(I) = DA*DX(I) + DX(I + 1) = DA*DX(I + 1) + DX(I + 2) = DA*DX(I + 2) + DX(I + 3) = DA*DX(I + 3) + DX(I + 4) = DA*DX(I + 4) + 50 CONTINUE + RETURN + END +C*MODULE BLAS1 *DECK DSWAP + SUBROUTINE DSWAP (N,DX,INCX,DY,INCY) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION DX(1),DY(1) +C +C INTERCHANGES TWO VECTORS. +C DX(I) <==> DY(I) +C USES UNROLLED LOOPS FOR INCREMENTS EQUAL ONE. +C JACK DONGARRA, LINPACK, 3/11/78. +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 + DTEMP = DX(IX) + DX(IX) = DY(IY) + DY(IY) = DTEMP + 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 + DTEMP = DX(I) + DX(I) = DY(I) + DY(I) = DTEMP + 30 CONTINUE + IF( N .LT. 3 ) RETURN + 40 MP1 = M + 1 + DO 50 I = MP1,N,3 + DTEMP = DX(I) + DX(I) = DY(I) + DY(I) = DTEMP + DTEMP = DX(I + 1) + DX(I + 1) = DY(I + 1) + DY(I + 1) = DTEMP + DTEMP = DX(I + 2) + DX(I + 2) = DY(I + 2) + DY(I + 2) = DTEMP + 50 CONTINUE + RETURN + END +C*MODULE BLAS1 *DECK IDAMAX + INTEGER FUNCTION IDAMAX(N,DX,INCX) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION DX(1) +C +C FINDS THE INDEX OF ELEMENT HAVING MAX. ABSOLUTE VALUE. +C JACK DONGARRA, LINPACK, 3/11/78. +C + IDAMAX = 0 + IF( N .LT. 1 ) RETURN + IDAMAX = 1 + IF(N.EQ.1)RETURN + IF(INCX.EQ.1)GO TO 20 +C +C CODE FOR INCREMENT NOT EQUAL TO 1 +C + IX = 1 + RMAX = ABS(DX(1)) + IX = IX + INCX + DO 10 I = 2,N + IF(ABS(DX(IX)).LE.RMAX) GO TO 5 + IDAMAX = I + RMAX = ABS(DX(IX)) + 5 IX = IX + INCX + 10 CONTINUE + RETURN +C +C CODE FOR INCREMENT EQUAL TO 1 +C + 20 RMAX = ABS(DX(1)) + DO 30 I = 2,N + IF(ABS(DX(I)).LE.RMAX) GO TO 30 + IDAMAX = I + RMAX = ABS(DX(I)) + 30 CONTINUE + RETURN + END +C*MODULE BLAS *DECK DGEMV + SUBROUTINE DGEMV(FORMA,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + CHARACTER*1 FORMA + DIMENSION A(LDA,*),X(*),Y(*) + PARAMETER (ZERO=0.0D+00, ONE=1.0D+00) +C +C CLONE OF -DGEMV- WRITTEN BY MIKE SCHMIDT +C + LOCY = 1 + IF(FORMA.EQ.'T') GO TO 200 +C +C Y = ALPHA * A * X + BETA * Y +C + IF(ALPHA.EQ.ONE .AND. BETA.EQ.ZERO) THEN + DO 110 I=1,M + Y(LOCY) = DDOT(N,A(I,1),LDA,X,INCX) + LOCY = LOCY+INCY + 110 CONTINUE + ELSE + DO 120 I=1,M + Y(LOCY) = ALPHA*DDOT(N,A(I,1),LDA,X,INCX) + BETA*Y(LOCY) + LOCY = LOCY+INCY + 120 CONTINUE + END IF + RETURN +C +C Y = ALPHA * A-TRANSPOSE * X + BETA * Y +C + 200 CONTINUE + IF(ALPHA.EQ.ONE .AND. BETA.EQ.ZERO) THEN + DO 210 I=1,N + Y(LOCY) = DDOT(M,A(1,I),1,X,INCX) + LOCY = LOCY+INCY + 210 CONTINUE + ELSE + DO 220 I=1,N + Y(LOCY) = ALPHA*DDOT(M,A(1,I),1,X,INCX) + BETA*Y(LOCY) + LOCY = LOCY+INCY + 220 CONTINUE + END IF + RETURN + END diff --git a/source/unres/src_MD-NEWSC/bond_move.f b/source/unres/src_MD-NEWSC/bond_move.f new file mode 100644 index 0000000..4843f60 --- /dev/null +++ b/source/unres/src_MD-NEWSC/bond_move.f @@ -0,0 +1,124 @@ + subroutine bond_move(nbond,nstart,psi,lprint,error) +C Move NBOND fragment starting from the CA(nstart) by angle PSI. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer nbond,nstart + double precision psi + logical fail,error,lprint + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.MCM' + dimension x(3),e(3,3),e1(3),e2(3),e3(3),rot(3,3),trans(3,3) + error=.false. + nend=nstart+nbond + if (print_mc.gt.2) then + write (iout,*) 'nstart=',nstart,' nend=',nend,' nbond=',nbond + write (iout,*) 'psi=',psi + write (iout,'(a)') 'Original coordinates of the fragment' + do i=nstart,nend + write (iout,'(i5,3f10.5)') i,(c(j,i),j=1,3) + enddo + endif + if (nstart.lt.1 .or. nend .gt.nres .or. nbond.lt.2 .or. + & nbond.ge.nres-1) then + write (iout,'(a)') 'Bad data in BOND_MOVE.' + error=.true. + return + endif +C Generate the reference system. + i2=nend + i3=nstart + i4=nstart+1 + call refsys(i2,i3,i4,e1,e2,e3,error) +C Return, if couldn't define the reference system. + if (error) return +C Compute the transformation matrix. + cospsi=dcos(psi) + sinpsi=dsin(psi) + rot(1,1)=1.0D0 + rot(1,2)=0.0D0 + rot(1,3)=0.0D0 + rot(2,1)=0.0D0 + rot(2,2)=cospsi + rot(2,3)=-sinpsi + rot(3,1)=0.0D0 + rot(3,2)=sinpsi + rot(3,3)=cospsi + do i=1,3 + e(1,i)=e1(i) + e(2,i)=e2(i) + e(3,i)=e3(i) + enddo + + if (print_mc.gt.2) then + write (iout,'(a)') 'Reference system and matrix r:' + do i=1,3 + write(iout,'(i5,2(3f10.5,5x))')i,(e(i,j),j=1,3),(rot(i,j),j=1,3) + enddo + endif + + call matmult(rot,e,trans) + do i=1,3 + do j=1,3 + e(i,1)=e1(i) + e(i,2)=e2(i) + e(i,3)=e3(i) + enddo + enddo + call matmult(e,trans,trans) + + if (lprint) then + write (iout,'(a)') 'The trans matrix:' + do i=1,3 + write (iout,'(i5,3f10.5)') i,(trans(i,j),j=1,3) + enddo + endif + + do i=nstart,nend + do j=1,3 + rij=c(j,nstart) + do k=1,3 + rij=rij+trans(j,k)*(c(k,i)-c(k,nstart)) + enddo + x(j)=rij + enddo + do j=1,3 + c(j,i)=x(j) + enddo + enddo + + if (lprint) then + write (iout,'(a)') 'Rotated coordinates of the fragment' + do i=nstart,nend + write (iout,'(i5,3f10.5)') i,(c(j,i),j=1,3) + enddo + endif + +c call int_from_cart(.false.,lprint) + if (nstart.gt.1) then + theta(nstart+1)=alpha(nstart-1,nstart,nstart+1) + phi(nstart+2)=beta(nstart-1,nstart,nstart+1,nstart+2) + if (nstart.gt.2) phi(nstart+1)= + & beta(nstart-2,nstart-1,nstart,nstart+1) + endif + if (nend.lt.nres) then + theta(nend+1)=alpha(nend-1,nend,nend+1) + phi(nend+1)=beta(nend-2,nend-1,nend,nend+1) + if (nend.lt.nres-1) phi(nend+2)= + & beta(nend-1,nend,nend+1,nend+2) + endif + if (print_mc.gt.2) then + write (iout,'(/a,i3,a,i3,a/)') + & 'Moved internal coordinates of the ',nstart,'-',nend, + & ' fragment:' + do i=nstart+1,nstart+2 + write (iout,'(i5,2f10.5)') i,rad2deg*theta(i),rad2deg*phi(i) + enddo + do i=nend+1,nend+2 + write (iout,'(i5,2f10.5)') i,rad2deg*theta(i),rad2deg*phi(i) + enddo + endif + return + end diff --git a/source/unres/src_MD-NEWSC/build.txt b/source/unres/src_MD-NEWSC/build.txt new file mode 100644 index 0000000..a5eba7c --- /dev/null +++ b/source/unres/src_MD-NEWSC/build.txt @@ -0,0 +1 @@ +cmake /users/czarek/UNRES/GIT/unres/ -DMPIF_LOCAL_DIR=/users/software/mpich-1.2.7p1_intel-10.1_em64_ssh \ No newline at end of file diff --git a/source/unres/src_MD-NEWSC/cartder.F b/source/unres/src_MD-NEWSC/cartder.F new file mode 100644 index 0000000..e2e8c1a --- /dev/null +++ b/source/unres/src_MD-NEWSC/cartder.F @@ -0,0 +1,314 @@ + subroutine cartder +*********************************************************************** +* This subroutine calculates the derivatives of the consecutive virtual +* bond vectors and the SC vectors in the virtual-bond angles theta and +* virtual-torsional angles phi, as well as the derivatives of SC vectors +* in the angles alpha and omega, describing the location of a side chain +* in its local coordinate system. +* +* The derivatives are stored in the following arrays: +* +* DDCDV - the derivatives of virtual-bond vectors DC in theta and phi. +* The structure is as follows: +* +* dDC(x,2)/dT(3),...,dDC(z,2)/dT(3),0, 0, 0 +* dDC(x,3)/dT(4),...,dDC(z,3)/dT(4),dDC(x,3)/dP(4),dDC(y,4)/dP(4),dDC(z,4)/dP(4) +* . . . . . . . . . . . . . . . . . . +* dDC(x,N-1)/dT(4),...,dDC(z,N-1)/dT(4),dDC(x,N-1)/dP(4),dDC(y,N-1)/dP(4),dDC(z,N-1)/dP(4) +* . +* . +* . +* dDC(x,N-1)/dT(N),...,dDC(z,N-1)/dT(N),dDC(x,N-1)/dP(N),dDC(y,N-1)/dP(N),dDC(z,N-1)/dP(N) +* +* DXDV - the derivatives of the side-chain vectors in theta and phi. +* The structure is same as above. +* +* DCDS - the derivatives of the side chain vectors in the local spherical +* andgles alph and omega: +* +* dX(x,2)/dA(2),dX(y,2)/dA(2),dX(z,2)/dA(2),dX(x,2)/dO(2),dX(y,2)/dO(2),dX(z,2)/dO(2) +* dX(x,3)/dA(3),dX(y,3)/dA(3),dX(z,3)/dA(3),dX(x,3)/dO(3),dX(y,3)/dO(3),dX(z,3)/dO(3) +* . +* . +* . +* dX(x,N-1)/dA(N-1),dX(y,N-1)/dA(N-1),dX(z,N-1)/dA(N-1),dX(x,N-1)/dO(N-1),dX(y,N-1)/dO(N-1),dX(z,N-1)/dO(N-1) +* +* Version of March '95, based on an early version of November '91. +* +*********************************************************************** + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + dimension drt(3,3,maxres),rdt(3,3,maxres),dp(3,3),temp(3,3), + & fromto(3,3,maxdim),prordt(3,3,maxres),prodrt(3,3,maxres) + dimension xx(3),xx1(3) +c common /przechowalnia/ fromto +* get the position of the jth ijth fragment of the chain coordinate system +* in the fromto array. + indmat(i,j)=((2*(nres-2)-i)*(i-1))/2+j-1 +* +* calculate the derivatives of transformation matrix elements in theta +* + do i=1,nres-2 + rdt(1,1,i)=-rt(1,2,i) + rdt(1,2,i)= rt(1,1,i) + rdt(1,3,i)= 0.0d0 + rdt(2,1,i)=-rt(2,2,i) + rdt(2,2,i)= rt(2,1,i) + rdt(2,3,i)= 0.0d0 + rdt(3,1,i)=-rt(3,2,i) + rdt(3,2,i)= rt(3,1,i) + rdt(3,3,i)= 0.0d0 + enddo +* +* derivatives in phi +* + do i=2,nres-2 + drt(1,1,i)= 0.0d0 + drt(1,2,i)= 0.0d0 + drt(1,3,i)= 0.0d0 + drt(2,1,i)= rt(3,1,i) + drt(2,2,i)= rt(3,2,i) + drt(2,3,i)= rt(3,3,i) + drt(3,1,i)=-rt(2,1,i) + drt(3,2,i)=-rt(2,2,i) + drt(3,3,i)=-rt(2,3,i) + enddo +* +* generate the matrix products of type r(i)t(i)...r(j)t(j) +* + do i=2,nres-2 + ind=indmat(i,i+1) + do k=1,3 + do l=1,3 + temp(k,l)=rt(k,l,i) + enddo + enddo + do k=1,3 + do l=1,3 + fromto(k,l,ind)=temp(k,l) + enddo + enddo + do j=i+1,nres-2 + ind=indmat(i,j+1) + do k=1,3 + do l=1,3 + dpkl=0.0d0 + do m=1,3 + dpkl=dpkl+temp(k,m)*rt(m,l,j) + enddo + dp(k,l)=dpkl + fromto(k,l,ind)=dpkl + enddo + enddo + do k=1,3 + do l=1,3 + temp(k,l)=dp(k,l) + enddo + enddo + enddo + enddo +* +* Calculate derivatives. +* + ind1=0 + do i=1,nres-2 + ind1=ind1+1 +* +* Derivatives of DC(i+1) in theta(i+2) +* + do j=1,3 + do k=1,2 + dpjk=0.0D0 + do l=1,3 + dpjk=dpjk+prod(j,l,i)*rdt(l,k,i) + enddo + dp(j,k)=dpjk + prordt(j,k,i)=dp(j,k) + enddo + dp(j,3)=0.0D0 + dcdv(j,ind1)=vbld(i+1)*dp(j,1) + enddo +* +* Derivatives of SC(i+1) in theta(i+2) +* + xx1(1)=-0.5D0*xloc(2,i+1) + xx1(2)= 0.5D0*xloc(1,i+1) + do j=1,3 + xj=0.0D0 + do k=1,2 + xj=xj+r(j,k,i)*xx1(k) + enddo + xx(j)=xj + enddo + do j=1,3 + rj=0.0D0 + do k=1,3 + rj=rj+prod(j,k,i)*xx(k) + enddo + dxdv(j,ind1)=rj + enddo +* +* Derivatives of SC(i+1) in theta(i+3). The have to be handled differently +* than the other off-diagonal derivatives. +* + do j=1,3 + dxoiij=0.0D0 + do k=1,3 + dxoiij=dxoiij+dp(j,k)*xrot(k,i+2) + enddo + dxdv(j,ind1+1)=dxoiij + enddo +cd print *,ind1+1,(dxdv(j,ind1+1),j=1,3) +* +* Derivatives of DC(i+1) in phi(i+2) +* + do j=1,3 + do k=1,3 + dpjk=0.0 + do l=2,3 + dpjk=dpjk+prod(j,l,i)*drt(l,k,i) + enddo + dp(j,k)=dpjk + prodrt(j,k,i)=dp(j,k) + enddo + dcdv(j+3,ind1)=vbld(i+1)*dp(j,1) + enddo +* +* Derivatives of SC(i+1) in phi(i+2) +* + xx(1)= 0.0D0 + xx(3)= xloc(2,i+1)*r(2,2,i)+xloc(3,i+1)*r(2,3,i) + xx(2)=-xloc(2,i+1)*r(3,2,i)-xloc(3,i+1)*r(3,3,i) + do j=1,3 + rj=0.0D0 + do k=2,3 + rj=rj+prod(j,k,i)*xx(k) + enddo + dxdv(j+3,ind1)=-rj + enddo +* +* Derivatives of SC(i+1) in phi(i+3). +* + do j=1,3 + dxoiij=0.0D0 + do k=1,3 + dxoiij=dxoiij+dp(j,k)*xrot(k,i+2) + enddo + dxdv(j+3,ind1+1)=dxoiij + enddo +* +* Calculate the derivatives of DC(i+1) and SC(i+1) in theta(i+3) thru +* theta(nres) and phi(i+3) thru phi(nres). +* + do j=i+1,nres-2 + ind1=ind1+1 + ind=indmat(i+1,j+1) +cd print *,'i=',i,' j=',j,' ind=',ind,' ind1=',ind1 + do k=1,3 + do l=1,3 + tempkl=0.0D0 + do m=1,2 + tempkl=tempkl+prordt(k,m,i)*fromto(m,l,ind) + enddo + temp(k,l)=tempkl + enddo + enddo +cd print '(9f8.3)',((fromto(k,l,ind),l=1,3),k=1,3) +cd print '(9f8.3)',((prod(k,l,i),l=1,3),k=1,3) +cd print '(9f8.3)',((temp(k,l),l=1,3),k=1,3) +* Derivatives of virtual-bond vectors in theta + do k=1,3 + dcdv(k,ind1)=vbld(i+1)*temp(k,1) + enddo +cd print '(3f8.3)',(dcdv(k,ind1),k=1,3) +* Derivatives of SC vectors in theta + do k=1,3 + dxoijk=0.0D0 + do l=1,3 + dxoijk=dxoijk+temp(k,l)*xrot(l,j+2) + enddo + dxdv(k,ind1+1)=dxoijk + enddo +* +*--- Calculate the derivatives in phi +* + do k=1,3 + do l=1,3 + tempkl=0.0D0 + do m=1,3 + tempkl=tempkl+prodrt(k,m,i)*fromto(m,l,ind) + enddo + temp(k,l)=tempkl + enddo + enddo + do k=1,3 + dcdv(k+3,ind1)=vbld(i+1)*temp(k,1) + enddo + do k=1,3 + dxoijk=0.0D0 + do l=1,3 + dxoijk=dxoijk+temp(k,l)*xrot(l,j+2) + enddo + dxdv(k+3,ind1+1)=dxoijk + enddo + enddo + enddo +* +* Derivatives in alpha and omega: +* + do i=2,nres-1 +c dsci=dsc(itype(i)) + dsci=vbld(i+nres) +#ifdef OSF + alphi=alph(i) + omegi=omeg(i) + if(alphi.ne.alphi) alphi=100.0 + if(omegi.ne.omegi) omegi=-100.0 +#else + alphi=alph(i) + omegi=omeg(i) +#endif +cd print *,'i=',i,' dsci=',dsci,' alphi=',alphi,' omegi=',omegi + cosalphi=dcos(alphi) + sinalphi=dsin(alphi) + cosomegi=dcos(omegi) + sinomegi=dsin(omegi) + temp(1,1)=-dsci*sinalphi + temp(2,1)= dsci*cosalphi*cosomegi + temp(3,1)=-dsci*cosalphi*sinomegi + temp(1,2)=0.0D0 + temp(2,2)=-dsci*sinalphi*sinomegi + temp(3,2)=-dsci*sinalphi*cosomegi + theta2=pi-0.5D0*theta(i+1) + cost2=dcos(theta2) + sint2=dsin(theta2) + jjj=0 +cd print *,((temp(l,k),l=1,3),k=1,2) + do j=1,2 + xp=temp(1,j) + yp=temp(2,j) + xxp= xp*cost2+yp*sint2 + yyp=-xp*sint2+yp*cost2 + zzp=temp(3,j) + xx(1)=xxp + xx(2)=yyp*r(2,2,i-1)+zzp*r(2,3,i-1) + xx(3)=yyp*r(3,2,i-1)+zzp*r(3,3,i-1) + do k=1,3 + dj=0.0D0 + do l=1,3 + dj=dj+prod(k,l,i-1)*xx(l) + enddo + dxds(jjj+k,i)=dj + enddo + jjj=jjj+3 + enddo + enddo + return + end + diff --git a/source/unres/src_MD-NEWSC/cartprint.f b/source/unres/src_MD-NEWSC/cartprint.f new file mode 100644 index 0000000..d79409e --- /dev/null +++ b/source/unres/src_MD-NEWSC/cartprint.f @@ -0,0 +1,19 @@ + subroutine cartprint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + write (iout,100) + do i=1,nres + write (iout,110) restyp(itype(i)),i,c(1,i),c(2,i), + & c(3,i),c(1,nres+i),c(2,nres+i),c(3,nres+i) + enddo + 100 format (//' alpha-carbon coordinates ', + & ' centroid coordinates'/ + 1 ' ', 6X,'X',11X,'Y',11X,'Z', + & 10X,'X',11X,'Y',11X,'Z') + 110 format (a,'(',i3,')',6f12.5) + return + end diff --git a/source/unres/src_MD-NEWSC/chainbuild.F b/source/unres/src_MD-NEWSC/chainbuild.F new file mode 100644 index 0000000..45a1a53 --- /dev/null +++ b/source/unres/src_MD-NEWSC/chainbuild.F @@ -0,0 +1,274 @@ + subroutine chainbuild +C +C Build the virtual polypeptide chain. Side-chain centroids are moveable. +C As of 2/17/95. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + logical lprn +C Set lprn=.true. for debugging + lprn = .false. +C +C Define the origin and orientation of the coordinate system and locate the +C first three CA's and SC(2). +C + call orig_frame +* +* Build the alpha-carbon chain. +* + do i=4,nres + call locate_next_res(i) + enddo +C +C First and last SC must coincide with the corresponding CA. +C + do j=1,3 + dc(j,nres+1)=0.0D0 + dc_norm(j,nres+1)=0.0D0 + dc(j,nres+nres)=0.0D0 + dc_norm(j,nres+nres)=0.0D0 + c(j,nres+1)=c(j,1) + c(j,nres+nres)=c(j,nres) + enddo +* +* Temporary diagnosis +* + if (lprn) then + + call cartprint + write (iout,'(/a)') 'Recalculated internal coordinates' + do i=2,nres-1 + do j=1,3 + c(j,maxres2)=0.5D0*(c(j,i-1)+c(j,i+1)) + enddo + be=0.0D0 + if (i.gt.3) be=rad2deg*beta(i-3,i-2,i-1,i) + be1=rad2deg*beta(nres+i,i,maxres2,i+1) + alfai=0.0D0 + if (i.gt.2) alfai=rad2deg*alpha(i-2,i-1,i) + write (iout,1212) restyp(itype(i)),i,dist(i-1,i), + & alfai,be,dist(nres+i,i),rad2deg*alpha(nres+i,i,maxres2),be1 + enddo + 1212 format (a3,'(',i3,')',2(f10.5,2f10.2)) + + endif + + return + end +c------------------------------------------------------------------------- + subroutine orig_frame +C +C Define the origin and orientation of the coordinate system and locate +C the first three atoms. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.VAR' + cost=dcos(theta(3)) + sint=dsin(theta(3)) + t(1,1,1)=-cost + t(1,2,1)=-sint + t(1,3,1)= 0.0D0 + t(2,1,1)=-sint + t(2,2,1)= cost + t(2,3,1)= 0.0D0 + t(3,1,1)= 0.0D0 + t(3,2,1)= 0.0D0 + t(3,3,1)= 1.0D0 + r(1,1,1)= 1.0D0 + r(1,2,1)= 0.0D0 + r(1,3,1)= 0.0D0 + r(2,1,1)= 0.0D0 + r(2,2,1)= 1.0D0 + r(2,3,1)= 0.0D0 + r(3,1,1)= 0.0D0 + r(3,2,1)= 0.0D0 + r(3,3,1)= 1.0D0 + do i=1,3 + do j=1,3 + rt(i,j,1)=t(i,j,1) + enddo + enddo + do i=1,3 + do j=1,3 + prod(i,j,1)=0.0D0 + prod(i,j,2)=t(i,j,1) + enddo + prod(i,i,1)=1.0D0 + enddo + c(1,1)=0.0D0 + c(2,1)=0.0D0 + c(3,1)=0.0D0 + c(1,2)=vbld(2) + c(2,2)=0.0D0 + c(3,2)=0.0D0 + dc(1,0)=0.0d0 + dc(2,0)=0.0D0 + dc(3,0)=0.0D0 + dc(1,1)=vbld(2) + dc(2,1)=0.0D0 + dc(3,1)=0.0D0 + dc_norm(1,0)=0.0D0 + dc_norm(2,0)=0.0D0 + dc_norm(3,0)=0.0D0 + dc_norm(1,1)=1.0D0 + dc_norm(2,1)=0.0D0 + dc_norm(3,1)=0.0D0 + do j=1,3 + dc_norm(j,2)=prod(j,1,2) + dc(j,2)=vbld(3)*prod(j,1,2) + c(j,3)=c(j,2)+dc(j,2) + enddo + call locate_side_chain(2) + return + end +c----------------------------------------------------------------------------- + subroutine locate_next_res(i) +C +C Locate CA(i) and SC(i-1) +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' +C +C Define the rotation matrices corresponding to CA(i) +C +#ifdef OSF + theti=theta(i) + if (theti.ne.theti) theti=100.0 + phii=phi(i) + if (phii.ne.phii) phii=180.0 +#else + theti=theta(i) + phii=phi(i) +#endif + cost=dcos(theti) + sint=dsin(theti) + cosphi=dcos(phii) + sinphi=dsin(phii) +* Define the matrices of the rotation about the virtual-bond valence angles +* theta, T(i,j,k), virtual-bond dihedral angles gamma (miscalled PHI in this +* program), R(i,j,k), and, the cumulative matrices of rotation RT + t(1,1,i-2)=-cost + t(1,2,i-2)=-sint + t(1,3,i-2)= 0.0D0 + t(2,1,i-2)=-sint + t(2,2,i-2)= cost + t(2,3,i-2)= 0.0D0 + t(3,1,i-2)= 0.0D0 + t(3,2,i-2)= 0.0D0 + t(3,3,i-2)= 1.0D0 + r(1,1,i-2)= 1.0D0 + r(1,2,i-2)= 0.0D0 + r(1,3,i-2)= 0.0D0 + r(2,1,i-2)= 0.0D0 + r(2,2,i-2)=-cosphi + r(2,3,i-2)= sinphi + r(3,1,i-2)= 0.0D0 + r(3,2,i-2)= sinphi + r(3,3,i-2)= cosphi + rt(1,1,i-2)=-cost + rt(1,2,i-2)=-sint + rt(1,3,i-2)=0.0D0 + rt(2,1,i-2)=sint*cosphi + rt(2,2,i-2)=-cost*cosphi + rt(2,3,i-2)=sinphi + rt(3,1,i-2)=-sint*sinphi + rt(3,2,i-2)=cost*sinphi + rt(3,3,i-2)=cosphi + call matmult(prod(1,1,i-2),rt(1,1,i-2),prod(1,1,i-1)) + do j=1,3 + dc_norm(j,i-1)=prod(j,1,i-1) + dc(j,i-1)=vbld(i)*prod(j,1,i-1) + c(j,i)=c(j,i-1)+dc(j,i-1) + enddo +cd print '(2i3,2(3f10.5,5x))', i-1,i,(dc(j,i-1),j=1,3),(c(j,i),j=1,3) +C +C Now calculate the coordinates of SC(i-1) +C + call locate_side_chain(i-1) + return + end +c----------------------------------------------------------------------------- + subroutine locate_side_chain(i) +C +C Locate the side-chain centroid i, 1 < i < NRES. Put in C(*,NRES+i). +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + dimension xx(3) + +c dsci=dsc(itype(i)) +c dsci_inv=dsc_inv(itype(i)) + dsci=vbld(i+nres) + dsci_inv=vbld_inv(i+nres) +#ifdef OSF + alphi=alph(i) + omegi=omeg(i) + if (alphi.ne.alphi) alphi=100.0 + if (omegi.ne.omegi) omegi=-100.0 +#else + alphi=alph(i) + omegi=omeg(i) +#endif + cosalphi=dcos(alphi) + sinalphi=dsin(alphi) + cosomegi=dcos(omegi) + sinomegi=dsin(omegi) + xp= dsci*cosalphi + yp= dsci*sinalphi*cosomegi + zp=-dsci*sinalphi*sinomegi +* Now we have to rotate the coordinate system by 180-theta(i)/2 so as to get its +* X-axis aligned with the vector DC(*,i) + theta2=pi-0.5D0*theta(i+1) + cost2=dcos(theta2) + sint2=dsin(theta2) + xx(1)= xp*cost2+yp*sint2 + xx(2)=-xp*sint2+yp*cost2 + xx(3)= zp +cd print '(a3,i3,3f10.5,5x,3f10.5)',restyp(itype(i)),i, +cd & xp,yp,zp,(xx(k),k=1,3) + do j=1,3 + xloc(j,i)=xx(j) + enddo +* Bring the SC vectors to the common coordinate system. + xx(1)=xloc(1,i) + xx(2)=xloc(2,i)*r(2,2,i-1)+xloc(3,i)*r(2,3,i-1) + xx(3)=xloc(2,i)*r(3,2,i-1)+xloc(3,i)*r(3,3,i-1) + do j=1,3 + xrot(j,i)=xx(j) + enddo + do j=1,3 + rj=0.0D0 + do k=1,3 + rj=rj+prod(j,k,i-1)*xx(k) + enddo + dc(j,nres+i)=rj + dc_norm(j,nres+i)=rj*dsci_inv + c(j,nres+i)=c(j,i)+rj + enddo + return + end diff --git a/source/unres/src_MD-NEWSC/change.awk b/source/unres/src_MD-NEWSC/change.awk new file mode 100644 index 0000000..d192a6e --- /dev/null +++ b/source/unres/src_MD-NEWSC/change.awk @@ -0,0 +1,11 @@ +{ + if($0==" include 'COMMON.LANGEVIN'") { + print "#ifndef LANG0" + print " include 'COMMON.LANGEVIN'" + print "#else" + print " include 'COMMON.LANGEVIN.lang0'" + print "#endif" + }else{ + print $0 + } +} diff --git a/source/unres/src_MD-NEWSC/check_bond.f b/source/unres/src_MD-NEWSC/check_bond.f new file mode 100644 index 0000000..c8a4ad1 --- /dev/null +++ b/source/unres/src_MD-NEWSC/check_bond.f @@ -0,0 +1,20 @@ + subroutine check_bond +C Subroutine is checking if the fitted function which describs sc_rot_pot +C is correct, printing, alpha,beta, energy, data - for some known theta. +C theta angle is read from the input file. Sc_rot_pot are printed +C for the second residue in sequance. + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.CHAIN' + double precision energia(0:n_ene) + it=itype(2) + do i=1,101 + vbld(nres+2)=0.5d0+0.05d0*(i-1) + call chainbuild + call etotal(energia) + write (2,*) vbld(nres+2),energia(17) + enddo + return + end diff --git a/source/unres/src_MD-NEWSC/check_sc_distr.f b/source/unres/src_MD-NEWSC/check_sc_distr.f new file mode 100644 index 0000000..db2ed1b --- /dev/null +++ b/source/unres/src_MD-NEWSC/check_sc_distr.f @@ -0,0 +1,43 @@ + subroutine check_sc_distr + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.TIME1' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + logical fail + double precision varia(maxvar) + double precision hrtime,mintime,sectime + parameter (MaxSample=10000000,delt=1.0D0/MaxSample) + dimension prob(0:72,0:90) + dV=2.0D0*5.0D0*deg2rad*deg2rad + print *,'dv=',dv + do 10 it=1,1 + if (it.eq.10) goto 10 + open (20,file=restyp(it)//'_distr.sdc',status='unknown') + call gen_side(it,90.0D0*deg2rad,al,om,fail) + close (20) + goto 10 + open (20,file=restyp(it)//'_distr1.sdc',status='unknown') + do i=0,90 + do j=0,72 + prob(j,i)=0.0D0 + enddo + enddo + do isample=1,MaxSample + call gen_side(it,90.0D0*deg2rad,al,om) + indal=rad2deg*al/2 + indom=(rad2deg*om+180.0D0)/5 + prob(indom,indal)=prob(indom,indal)+delt + enddo + do i=45,90 + do j=0,72 + write (20,'(2f10.3,1pd15.5)') 2*i+0.0D0,5*j-180.0D0, + & prob(j,i)/dV + enddo + enddo + 10 continue + return + end diff --git a/source/unres/src_MD-NEWSC/checkder_p.F b/source/unres/src_MD-NEWSC/checkder_p.F new file mode 100644 index 0000000..4d0379e --- /dev/null +++ b/source/unres/src_MD-NEWSC/checkder_p.F @@ -0,0 +1,713 @@ + subroutine check_cartgrad +C Check the gradient of Cartesian coordinates in internal coordinates. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.DERIV' + include 'COMMON.SCCOR' + dimension temp(6,maxres),xx(3),gg(3) + indmat(i,j)=((2*(nres-2)-i)*(i-1))/2+j-1 +* +* Check the gradient of the virtual-bond and SC vectors in the internal +* coordinates. +* + aincr=1.0d-7 + aincr2=5.0d-8 + call cartder + write (iout,'(a)') '**************** dx/dalpha' + write (iout,'(a)') + do i=2,nres-1 + alphi=alph(i) + alph(i)=alph(i)+aincr + do k=1,3 + temp(k,i)=dc(k,nres+i) + enddo + call chainbuild + do k=1,3 + gg(k)=(dc(k,nres+i)-temp(k,i))/aincr + xx(k)=dabs((gg(k)-dxds(k,i))/(aincr*dabs(dxds(k,i))+aincr)) + enddo + write (iout,'(i4,3e15.6/4x,3e15.6,3f9.3)') + & i,(gg(k),k=1,3),(dxds(k,i),k=1,3),(xx(k),k=1,3) + write (iout,'(a)') + alph(i)=alphi + call chainbuild + enddo + write (iout,'(a)') + write (iout,'(a)') '**************** dx/domega' + write (iout,'(a)') + do i=2,nres-1 + omegi=omeg(i) + omeg(i)=omeg(i)+aincr + do k=1,3 + temp(k,i)=dc(k,nres+i) + enddo + call chainbuild + do k=1,3 + gg(k)=(dc(k,nres+i)-temp(k,i))/aincr + xx(k)=dabs((gg(k)-dxds(k+3,i))/ + & (aincr*dabs(dxds(k+3,i))+aincr)) + enddo + write (iout,'(i4,3e15.6/4x,3e15.6,3f9.3)') + & i,(gg(k),k=1,3),(dxds(k+3,i),k=1,3),(xx(k),k=1,3) + write (iout,'(a)') + omeg(i)=omegi + call chainbuild + enddo + write (iout,'(a)') + write (iout,'(a)') '**************** dx/dtheta' + write (iout,'(a)') + do i=3,nres + theti=theta(i) + theta(i)=theta(i)+aincr + do j=i-1,nres-1 + do k=1,3 + temp(k,j)=dc(k,nres+j) + enddo + enddo + call chainbuild + do j=i-1,nres-1 + ii = indmat(i-2,j) +c print *,'i=',i-2,' j=',j-1,' ii=',ii + do k=1,3 + gg(k)=(dc(k,nres+j)-temp(k,j))/aincr + xx(k)=dabs((gg(k)-dxdv(k,ii))/ + & (aincr*dabs(dxdv(k,ii))+aincr)) + enddo + write (iout,'(2i4,3e14.6/8x,3e14.6,3f9.3)') + & i,j,(gg(k),k=1,3),(dxdv(k,ii),k=1,3),(xx(k),k=1,3) + write(iout,'(a)') + enddo + write (iout,'(a)') + theta(i)=theti + call chainbuild + enddo + write (iout,'(a)') '***************** dx/dphi' + write (iout,'(a)') + do i=4,nres + phi(i)=phi(i)+aincr + do j=i-1,nres-1 + do k=1,3 + temp(k,j)=dc(k,nres+j) + enddo + enddo + call chainbuild + do j=i-1,nres-1 + ii = indmat(i-2,j) +c print *,'ii=',ii + do k=1,3 + gg(k)=(dc(k,nres+j)-temp(k,j))/aincr + xx(k)=dabs((gg(k)-dxdv(k+3,ii))/ + & (aincr*dabs(dxdv(k+3,ii))+aincr)) + enddo + write (iout,'(2i4,3e14.6/8x,3e14.6,3f9.3)') + & i,j,(gg(k),k=1,3),(dxdv(k+3,ii),k=1,3),(xx(k),k=1,3) + write(iout,'(a)') + enddo + phi(i)=phi(i)-aincr + call chainbuild + enddo + write (iout,'(a)') '****************** ddc/dtheta' + do i=1,nres-2 + thet=theta(i+2) + theta(i+2)=thet+aincr + do j=i,nres + do k=1,3 + temp(k,j)=dc(k,j) + enddo + enddo + call chainbuild + do j=i+1,nres-1 + ii = indmat(i,j) +c print *,'ii=',ii + do k=1,3 + gg(k)=(dc(k,j)-temp(k,j))/aincr + xx(k)=dabs((gg(k)-dcdv(k,ii))/ + & (aincr*dabs(dcdv(k,ii))+aincr)) + enddo + write (iout,'(2i4,3e14.6/8x,3e14.6,3f9.3)') + & i,j,(gg(k),k=1,3),(dcdv(k,ii),k=1,3),(xx(k),k=1,3) + write (iout,'(a)') + enddo + do j=1,nres + do k=1,3 + dc(k,j)=temp(k,j) + enddo + enddo + theta(i+2)=thet + enddo + write (iout,'(a)') '******************* ddc/dphi' + do i=1,nres-3 + phii=phi(i+3) + phi(i+3)=phii+aincr + do j=1,nres + do k=1,3 + temp(k,j)=dc(k,j) + enddo + enddo + call chainbuild + do j=i+2,nres-1 + ii = indmat(i+1,j) +c print *,'ii=',ii + do k=1,3 + gg(k)=(dc(k,j)-temp(k,j))/aincr + xx(k)=dabs((gg(k)-dcdv(k+3,ii))/ + & (aincr*dabs(dcdv(k+3,ii))+aincr)) + enddo + write (iout,'(2i4,3e14.6/8x,3e14.6,3f9.3)') + & i,j,(gg(k),k=1,3),(dcdv(k+3,ii),k=1,3),(xx(k),k=1,3) + write (iout,'(a)') + enddo + do j=1,nres + do k=1,3 + dc(k,j)=temp(k,j) + enddo + enddo + phi(i+3)=phii + enddo + return + end +C---------------------------------------------------------------------------- + subroutine check_ecart +C Check the gradient of the energy in Cartesian coordinates. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CONTACTS' + include 'COMMON.SCCOR' + common /srutu/ icall + dimension ggg(6),cc(3),xx(3),ddc(3),ddx(3),x(maxvar),g(maxvar) + dimension grad_s(6,maxres) + double precision energia(0:n_ene),energia1(0:n_ene) + integer uiparm(1) + double precision urparm(1) + external fdum + icg=1 + nf=0 + nfl=0 + call zerograd + aincr=1.0D-7 + print '(a)','CG processor',me,' calling CHECK_CART.' + nf=0 + icall=0 + call geom_to_var(nvar,x) + call etotal(energia(0)) + etot=energia(0) + call enerprint(energia(0)) + call gradient(nvar,x,nf,g,uiparm,urparm,fdum) + icall =1 + do i=1,nres + write (iout,'(i5,3f10.5)') i,(gradxorr(j,i),j=1,3) + enddo + do i=1,nres + do j=1,3 + grad_s(j,i)=gradc(j,i,icg) + grad_s(j+3,i)=gradx(j,i,icg) + enddo + enddo + call flush(iout) + write (iout,'(/a/)') 'Gradient in virtual-bond and SC vectors' + do i=1,nres + do j=1,3 + xx(j)=c(j,i+nres) + ddc(j)=dc(j,i) + ddx(j)=dc(j,i+nres) + enddo + do j=1,3 + dc(j,i)=dc(j,i)+aincr + do k=i+1,nres + c(j,k)=c(j,k)+aincr + c(j,k+nres)=c(j,k+nres)+aincr + enddo + call etotal(energia1(0)) + etot1=energia1(0) + ggg(j)=(etot1-etot)/aincr + dc(j,i)=ddc(j) + do k=i+1,nres + c(j,k)=c(j,k)-aincr + c(j,k+nres)=c(j,k+nres)-aincr + enddo + enddo + do j=1,3 + c(j,i+nres)=c(j,i+nres)+aincr + dc(j,i+nres)=dc(j,i+nres)+aincr + call etotal(energia1(0)) + etot1=energia1(0) + ggg(j+3)=(etot1-etot)/aincr + c(j,i+nres)=xx(j) + dc(j,i+nres)=ddx(j) + enddo + write (iout,'(i3,6(1pe12.5)/3x,6(1pe12.5)/)') + & i,(ggg(k),k=1,6),(grad_s(k,i),k=1,6) + enddo + return + end +c---------------------------------------------------------------------------- + subroutine check_ecartint +C Check the gradient of the energy in Cartesian coordinates. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CONTACTS' + include 'COMMON.MD' + include 'COMMON.LOCAL' + include 'COMMON.SPLITELE' + include 'COMMON.SCCOR' + common /srutu/ icall + dimension ggg(6),ggg1(6),cc(3),xx(3),ddc(3),ddx(3),x(maxvar), + & g(maxvar) + dimension dcnorm_safe(3),dxnorm_safe(3) + dimension grad_s(6,0:maxres),grad_s1(6,0:maxres) + double precision phi_temp(maxres),theta_temp(maxres), + & alph_temp(maxres),omeg_temp(maxres) + double precision energia(0:n_ene),energia1(0:n_ene) + integer uiparm(1) + double precision urparm(1) + external fdum + r_cut=2.0d0 + rlambd=0.3d0 + icg=1 + nf=0 + nfl=0 + call intout +c call intcartderiv +c call checkintcartgrad + call zerograd + aincr=1.0D-5 + write(iout,*) 'Calling CHECK_ECARTINT.' + nf=0 + icall=0 + call geom_to_var(nvar,x) + if (.not.split_ene) then + call etotal(energia(0)) +c do i=1,nres +c write (iout,*) "atu?", gloc_sc(1,i,icg),gloc(i,icg) +c enddo + etot=energia(0) + call enerprint(energia(0)) + call flush(iout) + write (iout,*) "enter cartgrad" +c do i=1,nres +c write (iout,*) gloc_sc(1,i,icg) +c enddo + call flush(iout) + call cartgrad + write (iout,*) "exit cartgrad" + call flush(iout) + icall =1 + do i=1,nres + write (iout,'(i5,3f10.5)') i,(gradxorr(j,i),j=1,3) + enddo + do j=1,3 + grad_s(j,0)=gcart(j,0) + enddo + do i=1,nres + do j=1,3 + grad_s(j,i)=gcart(j,i) + grad_s(j+3,i)=gxcart(j,i) + enddo + enddo + else +!- split gradient check + call zerograd + call etotal_long(energia(0)) + call enerprint(energia(0)) + call flush(iout) + write (iout,*) "enter cartgrad" + call flush(iout) + call cartgrad + write (iout,*) "exit cartgrad" + call flush(iout) + icall =1 + write (iout,*) "longrange grad" + do i=1,nres + write (iout,'(i5,3f10.5,5x,3f10.5)') i,(gcart(j,i),j=1,3), + & (gxcart(j,i),j=1,3) + enddo + do j=1,3 + grad_s(j,0)=gcart(j,0) + enddo + do i=1,nres + do j=1,3 + grad_s(j,i)=gcart(j,i) + grad_s(j+3,i)=gxcart(j,i) + enddo + enddo + call zerograd + call etotal_short(energia(0)) + call enerprint(energia(0)) +c do i=1,nres +c write (iout,*) gloc_sc(1,i,icg) +c enddo + call flush(iout) + write (iout,*) "enter cartgrad" + call flush(iout) + call cartgrad + write (iout,*) "exit cartgrad" + call flush(iout) + icall =1 + write (iout,*) "shortrange grad" + do i=1,nres + write (iout,'(i5,3f10.5,5x,3f10.5)') i,(gcart(j,i),j=1,3), + & (gxcart(j,i),j=1,3) + enddo + do j=1,3 + grad_s1(j,0)=gcart(j,0) + enddo + do i=1,nres + do j=1,3 + grad_s1(j,i)=gcart(j,i) + grad_s1(j+3,i)=gxcart(j,i) + enddo + enddo + endif + write (iout,'(/a/)') 'Gradient in virtual-bond and SC vectors' + do i=0,nres + do j=1,3 + xx(j)=c(j,i+nres) + ddc(j)=dc(j,i) + ddx(j)=dc(j,i+nres) + do k=1,3 + dcnorm_safe(k)=dc_norm(k,i) + dxnorm_safe(k)=dc_norm(k,i+nres) + enddo + enddo + do j=1,3 + dc(j,i)=ddc(j)+aincr + call chainbuild_cart +#ifdef MPI +c Broadcast the order to compute internal coordinates to the slaves. +c if (nfgtasks.gt.1) +c & call MPI_Bcast(6,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif +c call int_from_cart1(.false.) + if (.not.split_ene) then + call etotal(energia1(0)) + etot1=energia1(0) + else +!- split gradient + call etotal_long(energia1(0)) + etot11=energia1(0) + call etotal_short(energia1(0)) + etot12=energia1(0) +c write (iout,*) "etot11",etot11," etot12",etot12 + endif +!- end split gradient +c write(iout,'(2i5,2(a,f15.10))')i,j," etot",etot," etot1",etot1 + dc(j,i)=ddc(j)-aincr + call chainbuild_cart +c call int_from_cart1(.false.) + if (.not.split_ene) then + call etotal(energia1(0)) + etot2=energia1(0) + ggg(j)=(etot1-etot2)/(2*aincr) + else +!- split gradient + call etotal_long(energia1(0)) + etot21=energia1(0) + ggg(j)=(etot11-etot21)/(2*aincr) + call etotal_short(energia1(0)) + etot22=energia1(0) + ggg1(j)=(etot12-etot22)/(2*aincr) +!- end split gradient +c write (iout,*) "etot21",etot21," etot22",etot22 + endif +c write(iout,'(2i5,2(a,f15.10))')i,j," etot",etot," etot2",etot2 + dc(j,i)=ddc(j) + call chainbuild_cart + enddo + do j=1,3 + dc(j,i+nres)=ddx(j)+aincr + call chainbuild_cart +c write (iout,*) "i",i," j",j," dxnorm+ and dxnorm" +c write (iout,'(3f15.10)') (dc_norm(k,i+nres),k=1,3) +c write (iout,'(3f15.10)') (dxnorm_safe(k),k=1,3) +c write (iout,*) "dxnormnorm",dsqrt( +c & dc_norm(1,i+nres)**2+dc_norm(2,i+nres)**2+dc_norm(3,i+nres)**2) +c write (iout,*) "dxnormnormsafe",dsqrt( +c & dxnorm_safe(1)**2+dxnorm_safe(2)**2+dxnorm_safe(3)**2) +c write (iout,*) + if (.not.split_ene) then + call etotal(energia1(0)) + etot1=energia1(0) + else +!- split gradient + call etotal_long(energia1(0)) + etot11=energia1(0) + call etotal_short(energia1(0)) + etot12=energia1(0) + endif +!- end split gradient +c write(iout,'(2i5,2(a,f15.10))')i,j," etot",etot," etot1",etot1 + dc(j,i+nres)=ddx(j)-aincr + call chainbuild_cart +c write (iout,*) "i",i," j",j," dxnorm- and dxnorm" +c write (iout,'(3f15.10)') (dc_norm(k,i+nres),k=1,3) +c write (iout,'(3f15.10)') (dxnorm_safe(k),k=1,3) +c write (iout,*) +c write (iout,*) "dxnormnorm",dsqrt( +c & dc_norm(1,i+nres)**2+dc_norm(2,i+nres)**2+dc_norm(3,i+nres)**2) +c write (iout,*) "dxnormnormsafe",dsqrt( +c & dxnorm_safe(1)**2+dxnorm_safe(2)**2+dxnorm_safe(3)**2) + if (.not.split_ene) then + call etotal(energia1(0)) + etot2=energia1(0) + ggg(j+3)=(etot1-etot2)/(2*aincr) + else +!- split gradient + call etotal_long(energia1(0)) + etot21=energia1(0) + ggg(j+3)=(etot11-etot21)/(2*aincr) + call etotal_short(energia1(0)) + etot22=energia1(0) + ggg1(j+3)=(etot12-etot22)/(2*aincr) +!- end split gradient + endif +c write(iout,'(2i5,2(a,f15.10))')i,j," etot",etot," etot2",etot2 + dc(j,i+nres)=ddx(j) + call chainbuild_cart + enddo + write (iout,'(i3,6(1pe12.5)/3x,6(1pe12.5)/3x,6(1pe12.5)/)') + & i,(ggg(k),k=1,6),(grad_s(k,i),k=1,6),(ggg(k)/grad_s(k,i),k=1,6) + if (split_ene) then + write (iout,'(i3,6(1pe12.5)/3x,6(1pe12.5)/3x,6(1pe12.5)/)') + & i,(ggg1(k),k=1,6),(grad_s1(k,i),k=1,6),(ggg1(k)/grad_s1(k,i), + & k=1,6) + write (iout,'(i3,6(1pe12.5)/3x,6(1pe12.5)/3x,6(1pe12.5)/)') + & i,(ggg(k)+ggg1(k),k=1,6),(grad_s(k,i)+grad_s1(k,i),k=1,6), + & ((ggg(k)+ggg1(k))/(grad_s(k,i)+grad_s1(k,i)),k=1,6) + endif + enddo + return + end +c------------------------------------------------------------------------- + subroutine int_from_cart1(lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer ierror +#endif + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.SETUP' + include 'COMMON.TIME1' + logical lprn + if (lprn) write (iout,'(/a)') 'Recalculated internal coordinates' +#ifdef TIMING + time01=MPI_Wtime() +#endif +#if defined(PARINT) && defined(MPI) + do i=iint_start,iint_end+1 +#else + do i=2,nres +#endif + dnorm1=dist(i-1,i) + dnorm2=dist(i,i+1) + do j=1,3 + c(j,maxres2)=0.5D0*(2*c(j,i)+(c(j,i-1)-c(j,i))/dnorm1 + & +(c(j,i+1)-c(j,i))/dnorm2) + enddo + be=0.0D0 + if (i.gt.2) then + if (i.le.nres) phi(i+1)=beta(i-2,i-1,i,i+1) + if ((itype(i).ne.10).and.(itype(i-1).ne.10)) then + tauangle(3,i+1)=beta(i+nres-1,i-1,i,i+nres) + endif + if (itype(i-1).ne.10) then + tauangle(1,i+1)=beta(i-1+nres,i-1,i,i+1) + omicron(1,i)=alpha(i-2,i-1,i-1+nres) + omicron(2,i)=alpha(i-1+nres,i-1,i) + endif + if (itype(i).ne.10) then + tauangle(2,i+1)=beta(i-2,i-1,i,i+nres) + endif + endif + omeg(i)=beta(nres+i,i,maxres2,i+1) + alph(i)=alpha(nres+i,i,maxres2) + theta(i+1)=alpha(i-1,i,i+1) + vbld(i)=dist(i-1,i) + vbld_inv(i)=1.0d0/vbld(i) + vbld(nres+i)=dist(nres+i,i) + if (itype(i).ne.10) then + vbld_inv(nres+i)=1.0d0/vbld(nres+i) + else + vbld_inv(nres+i)=0.0d0 + endif + enddo + +#if defined(PARINT) && defined(MPI) + if (nfgtasks1.gt.1) then +cd write(iout,*) "iint_start",iint_start," iint_count", +cd & (iint_count(i),i=0,nfgtasks-1)," iint_displ", +cd & (iint_displ(i),i=0,nfgtasks-1) +cd write (iout,*) "Gather vbld backbone" +cd call flush(iout) + time00=MPI_Wtime() + call MPI_Allgatherv(vbld(iint_start),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,vbld(1),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather vbld_inv" +cd call flush(iout) + call MPI_Allgatherv(vbld_inv(iint_start),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,vbld_inv(1),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather vbld side chain" +cd call flush(iout) + call MPI_Allgatherv(vbld(iint_start+nres),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,vbld(nres+1),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather vbld_inv side chain" +cd call flush(iout) + call MPI_Allgatherv(vbld_inv(iint_start+nres), + & iint_count(fg_rank1),MPI_DOUBLE_PRECISION,vbld_inv(nres+1), + & iint_count(0),iint_displ(0),MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather theta" +cd call flush(iout) + call MPI_Allgatherv(theta(iint_start+1),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,theta(2),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather phi" +cd call flush(iout) + call MPI_Allgatherv(phi(iint_start+1),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,phi(2),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +#ifdef CRYST_SC +cd write (iout,*) "Gather alph" +cd call flush(iout) + call MPI_Allgatherv(alph(iint_start),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,alph(1),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +cd write (iout,*) "Gather omeg" +cd call flush(iout) + call MPI_Allgatherv(omeg(iint_start),iint_count(fg_rank1), + & MPI_DOUBLE_PRECISION,omeg(1),iint_count(0),iint_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) +#endif + time_gather=time_gather+MPI_Wtime()-time00 + endif +#endif + do i=1,nres-1 + do j=1,3 + dc_norm(j,i)=dc(j,i)*vbld_inv(i+1) + enddo + enddo + do i=2,nres-1 + do j=1,3 + dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres) + enddo + enddo + if (lprn) then + do i=2,nres + write (iout,1212) restyp(itype(i)),i,vbld(i), + &rad2deg*theta(i),rad2deg*phi(i),vbld(nres+i), + &rad2deg*alph(i),rad2deg*omeg(i) + enddo + endif + 1212 format (a3,'(',i3,')',2(f15.10,2f10.2)) +#ifdef TIMING + time_intfcart=time_intfcart+MPI_Wtime()-time01 +#endif + return + end +c---------------------------------------------------------------------------- + subroutine check_eint +C Check the gradient of energy in internal coordinates. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.GEO' + common /srutu/ icall + dimension x(maxvar),gana(maxvar),gg(maxvar) + integer uiparm(1) + double precision urparm(1) + double precision energia(0:n_ene),energia1(0:n_ene), + & energia2(0:n_ene) + character*6 key + external fdum + call zerograd + aincr=1.0D-7 + print '(a)','Calling CHECK_INT.' + nf=0 + nfl=0 + icg=1 + call geom_to_var(nvar,x) + call var_to_geom(nvar,x) + call chainbuild + icall=1 + print *,'ICG=',ICG + call etotal(energia(0)) + etot = energia(0) + call enerprint(energia(0)) + print *,'ICG=',ICG +#ifdef MPL + if (MyID.ne.BossID) then + call mp_bcast(x(1),8*(nvar+3),BossID,fgGroupID) + nf=x(nvar+1) + nfl=x(nvar+2) + icg=x(nvar+3) + endif +#endif + nf=1 + nfl=3 +cd write (iout,'(10f8.3)') (rad2deg*x(i),i=1,nvar) + call gradient(nvar,x,nf,gana,uiparm,urparm,fdum) +cd write (iout,'(i3,1pe14.4)') (i,gana(i),i=1,nvar) + icall=1 + do i=1,nvar + xi=x(i) + x(i)=xi-0.5D0*aincr + call var_to_geom(nvar,x) + call chainbuild + call etotal(energia1(0)) + etot1=energia1(0) + x(i)=xi+0.5D0*aincr + call var_to_geom(nvar,x) + call chainbuild + call etotal(energia2(0)) + etot2=energia2(0) + gg(i)=(etot2-etot1)/aincr + write (iout,*) i,etot1,etot2 + x(i)=xi + enddo + write (iout,'(/2a)')' Variable Numerical Analytical', + & ' RelDiff*100% ' + do i=1,nvar + if (i.le.nphi) then + ii=i + key = ' phi' + else if (i.le.nphi+ntheta) then + ii=i-nphi + key=' theta' + else if (i.le.nphi+ntheta+nside) then + ii=i-(nphi+ntheta) + key=' alpha' + else + ii=i-(nphi+ntheta+nside) + key=' omega' + endif + write (iout,'(i3,a,i3,3(1pd16.6))') + & i,key,ii,gg(i),gana(i), + & 100.0D0*dabs(gg(i)-gana(i))/(dabs(gana(i))+aincr) + enddo + return + end diff --git a/source/unres/src_MD-NEWSC/compare_s1.F b/source/unres/src_MD-NEWSC/compare_s1.F new file mode 100644 index 0000000..300e7ed --- /dev/null +++ b/source/unres/src_MD-NEWSC/compare_s1.F @@ -0,0 +1,188 @@ + subroutine compare_s1(n_thr,num_thread_save,energyx,x, + & icomp,enetbss,coordss,rms_d,modif,iprint) +C This subroutine compares the new conformation, whose variables are in X +C with the previously accumulated conformations whose energies and variables +C are stored in ENETBSS and COORDSS, respectively. The meaning of other +C variables is as follows: +C +C N_THR - on input the previous # of accumulated confs, on output the current +C # of accumulated confs. +C N_REPEAT - an array that indicates how many times the structure has already +C been used to start the reversed-reversing procedure. Addition of +C a new structure replacement of a structure with a similar, but +C lower-energy structure resets the respective entry in N_REPEAT to zero +C I9 - output unit +C ENERGYX,X - the energy and variables of the new conformations. +C ICOMP - comparison result: +C 0 - the new structure is similar to one of the previous ones and does +C not have a remarkably lower energy and is therefore rejected; +C 1 - the new structure is different and is added to the set, because +C there is still room in the COORDSS and ENETBSS arrays; +C 2 - the new structure is different, but higher in energy than any +C previous one and is therefore rejected +C 3 - there is no more room in the COORDSS and ENETBSS arrays, but +C the new structure is lower in energy than at least the highest- +C energy previous structure and therefore replaces it. +C 9 - the new structure is similar to a number of previous structures, +C but has a remarkably lower energy than any of them; therefore +C replaces all these structures; +C MODIF - a logical variable that shows whether to include the new structure +C in the set of accumulated structures + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' +crc include 'COMMON.DEFORM' + include 'COMMON.IOUNITS' +#ifdef UNRES + include 'COMMON.CHAIN' +#endif + + dimension x(maxvar) + dimension x1(maxvar) + double precision przes(3),obrot(3,3) + integer list(max_thread) + logical non_conv,modif + double precision enetbss(max_threadss) + double precision coordss(maxvar,max_threadss) + + nlist=0 +#ifdef UNRES + call var_to_geom(nvar,x) + call chainbuild + do k=1,2*nres + do kk=1,3 + cref(kk,k)=c(kk,k) + enddo + enddo +#endif +c write(iout,*)'*ene=',energyx + j=0 + enex_jp=-1.0d+99 + do i=1,n_thr + do k=1,nvar + x1(k)=coordss(k,i) + enddo + if (iprint.gt.3) then + write (iout,*) 'Compare_ss, i=',i + write (iout,*) 'New structure Energy:',energyx + write (iout,'(10f8.3)') (rad2deg*x(k),k=1,nvar) + write (iout,*) 'Template structure Energy:',enetbss(i) + write (iout,'(10f8.3)') (rad2deg*x1(k),k=1,nvar) + endif + +#ifdef UNRES + call var_to_geom(nvar,x1) + call chainbuild +cd write(iout,*)'C and CREF' +cd write(iout,'(i5,3f10.5,5x,3f10.5)')(k,(c(j,k),j=1,3), +cd & (cref(j,k),j=1,3),k=1,nres) + call fitsq(roznica,c(1,1),cref(1,1),nres,przes,obrot,non_conv) + if (non_conv) then + print *,'Problems in FITSQ!!!' + print *,'X' + print '(10f8.3)',(x(k),k=1,nvar) + print *,'X1' + print '(10f8.3)',(x1(k),k=1,nvar) + print *,'C and CREF' + print '(i5,3f10.5,5x,3f10.5)',(k,(c(j,k),j=1,3), + & (cref(j,k),j=1,3),k=1,nres) + endif + roznica=dsqrt(dabs(roznica)) + iresult = 1 + if (roznica.lt.rms_d) iresult = 0 +#else + energyy=enetbss(i) + call cmprs(x,x1,roznica,energyx,energyy,iresult) +#endif + if (iprint.gt.1) write(iout,'(i5,f10.6,$)') i,roznica +c print '(i5,f8.3)',i,roznica + if(iresult.eq.0) then + nlist = nlist + 1 + list(nlist)=i + if (iprint.gt.1) write(iout,*) + if(energyx.ge.enetbss(i)) then + if (iprint.gt.1) + & write(iout,*)'s*>> structure rejected - same as nr ',i, + & ' RMS',roznica + minimize_s_flag=0 + icomp=0 + go to 1106 + endif + endif + if(energyx.lt.enetbss(i).and.enex_jp.lt.enetbss(i))then + j=i + enex_jp=enetbss(i) + endif + enddo + if (iprint.gt.1) write(iout,*) + if(nlist.gt.0) then + if (modif) then + if (iprint.gt.1) + & write(iout,'(a,i3,$)')'s*>> structure accepted1 - repl nr ', + & list(1) + else + if (iprint.gt.1) + & write(iout,'(a,i3)') + & 's*>> structure accepted1 - would repl nr ',list(1) + endif + icomp=9 + if (.not. modif) goto 1106 + j=list(1) + enetbss(j)=energyx + do i=1,nvar + coordss(i,j)=x(i) + enddo + do j=2,nlist + if (iprint.gt.1) write(iout,'(i3,$)')list(j) + do kk=list(j)+1,nlist + enetbss(kk-1)=enetbss(kk) + do i=1,nvar + coordss(i,kk-1)=coordss(i,kk) + enddo + enddo + enddo + if (iprint.gt.1) write(iout,*) + go to 1106 + endif + if(n_thr.lt.num_thread_save) then + icomp=1 + if (modif) then + if (iprint.gt.1) + & write(iout,*)'s*>> structure accepted - add with nr ',n_thr+1 + else + if (iprint.gt.1) + & write(iout,*)'s*>> structure accepted - would add with nr ', + & n_thr+1 + goto 1106 + endif + n_thr=n_thr+1 + enetbss(n_thr)=energyx + do i=1,nvar + coordss(i,n_thr)=x(i) + enddo + else + if(j.eq.0) then + if (iprint.gt.1) + & write(iout,*)'s*>> structure rejected - too high energy' + icomp=2 + go to 1106 + end if + icomp=3 + if (modif) then + if (iprint.gt.1) + & write(iout,*)'s*>> structure accepted - repl nr ',j + else + if (iprint.gt.1) + & write(iout,*)'s*>> structure accepted - would repl nr ',j + goto 1106 + endif + enetbss(j)=energyx + do i=1,nvar + coordss(i,j)=x(i) + enddo + end if + +1106 continue + return + end diff --git a/source/unres/src_MD-NEWSC/compinfo.c b/source/unres/src_MD-NEWSC/compinfo.c new file mode 100644 index 0000000..e28f686 --- /dev/null +++ b/source/unres/src_MD-NEWSC/compinfo.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include + +main() +{ +FILE *in, *in1, *out; +int i,j,k,iv1,iv2,iv3; +char *p1,buf[500],buf1[500],buf2[100],buf3[100]; +struct utsname Name; +time_t Tp; + +in=fopen("cinfo.f","r"); +out=fopen("cinfo.f.new","w"); +if (fgets(buf,498,in) != NULL) + fprintf(out,"C DO NOT EDIT THIS FILE - IT HAS BEEN GENERATED BY COMPINFO.C\n"); +if (fgets(buf,498,in) != NULL) + sscanf(&buf[1],"%d %d %d",&iv1,&iv2,&iv3); +iv3++; +fprintf(out,"C %d %d %d\n",iv1,iv2,iv3); +fprintf(out," subroutine cinfo\n"); +fprintf(out," include 'COMMON.IOUNITS'\n"); +fprintf(out," write(iout,*)'++++ Compile info ++++'\n"); +fprintf(out," write(iout,*)'Version %d.%-d build %d'\n",iv1,iv2,iv3); +uname(&Name); +time(&Tp); +system("whoami > tmptmp"); +in1=fopen("tmptmp","r"); +if (fscanf(in1,"%s",buf1) != EOF) +{ +p1=ctime(&Tp); +p1[strlen(p1)-1]='\0'; +fprintf(out," write(iout,*)'compiled %s'\n",p1); +fprintf(out," write(iout,*)'compiled by %s@%s'\n",buf1,Name.nodename); +fprintf(out," write(iout,*)'OS name: %s '\n",Name.sysname); +fprintf(out," write(iout,*)'OS release: %s '\n",Name.release); +fprintf(out," write(iout,*)'OS version:',\n"); +fprintf(out," & ' %s '\n",Name.version); +fprintf(out," write(iout,*)'flags:'\n"); +} +system("rm tmptmp"); +fclose(in1); +in1=fopen("Makefile","r"); +while(fgets(buf,498,in1) != NULL) + { + if((p1=strchr(buf,'=')) != NULL && buf[0] != '#') + { + buf[strlen(buf)-1]='\0'; + if(strlen(buf) > 49) + { + buf[47]='\0'; + strcat(buf,"..."); + } + else + { + while(buf[strlen(buf)-1]=='\\') + { + strcat(buf,"\\"); + fprintf(out," write(iout,*)'%s'\n",buf); + if (fgets(buf,498,in1) != NULL) + buf[strlen(buf)-1]='\0'; + if(strlen(buf) > 49) + { + buf[47]='\0'; + strcat(buf,"..."); + } + } + } + + fprintf(out," write(iout,*)'%s'\n",buf); + } + } +fprintf(out," write(iout,*)'++++ End of compile info ++++'\n"); +fprintf(out," return\n"); +fprintf(out," end\n"); +fclose(out); +fclose(in1); +fclose(in); +system("mv cinfo.f.new cinfo.f"); +} diff --git a/source/unres/src_MD-NEWSC/contact.f b/source/unres/src_MD-NEWSC/contact.f new file mode 100644 index 0000000..a244d86 --- /dev/null +++ b/source/unres/src_MD-NEWSC/contact.f @@ -0,0 +1,195 @@ + subroutine contact(lprint,ncont,icont,co) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + real*8 facont /1.569D0/ ! facont = (2/(1-sqrt(1-1/4)))**(1/6) + integer ncont,icont(2,maxcont) + logical lprint + ncont=0 + kkk=3 + do i=nnt+kkk,nct + iti=itype(i) + do j=nnt,i-kkk + itj=itype(j) + if (ipot.ne.4) then +c rcomp=sigmaii(iti,itj)+1.0D0 + rcomp=facont*sigmaii(iti,itj) + else +c rcomp=sigma(iti,itj)+1.0D0 + rcomp=facont*sigma(iti,itj) + endif +c rcomp=6.5D0 +c print *,'rcomp=',rcomp,' dist=',dist(nres+i,nres+j) + if (dist(nres+i,nres+j).lt.rcomp) then + ncont=ncont+1 + icont(1,ncont)=i + icont(2,ncont)=j + endif + enddo + enddo + if (lprint) then + write (iout,'(a)') 'Contact map:' + do i=1,ncont + i1=icont(1,i) + i2=icont(2,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4)') + & i,restyp(it1),i1,restyp(it2),i2 + enddo + endif + co = 0.0d0 + do i=1,ncont + co = co + dfloat(iabs(icont(1,i)-icont(2,i))) + enddo + co = co / (nres*ncont) + return + end +c---------------------------------------------------------------------------- + double precision function contact_fract(ncont,ncont_ref, + & icont,icont_ref) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + integer ncont,ncont_ref,icont(2,maxcont),icont_ref(2,maxcont) + nmatch=0 +c print *,'ncont=',ncont,' ncont_ref=',ncont_ref +c write (iout,'(20i4)') (icont_ref(1,i),i=1,ncont_ref) +c write (iout,'(20i4)') (icont_ref(2,i),i=1,ncont_ref) +c write (iout,'(20i4)') (icont(1,i),i=1,ncont) +c write (iout,'(20i4)') (icont(2,i),i=1,ncont) + do i=1,ncont + do j=1,ncont_ref + if (icont(1,i).eq.icont_ref(1,j) .and. + & icont(2,i).eq.icont_ref(2,j)) nmatch=nmatch+1 + enddo + enddo +c print *,' nmatch=',nmatch +c contact_fract=dfloat(nmatch)/dfloat(max0(ncont,ncont_ref)) + contact_fract=dfloat(nmatch)/dfloat(ncont_ref) + return + end +c---------------------------------------------------------------------------- + double precision function contact_fract_nn(ncont,ncont_ref, + & icont,icont_ref) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + integer ncont,ncont_ref,icont(2,maxcont),icont_ref(2,maxcont) + nmatch=0 +c print *,'ncont=',ncont,' ncont_ref=',ncont_ref +c write (iout,'(20i4)') (icont_ref(1,i),i=1,ncont_ref) +c write (iout,'(20i4)') (icont_ref(2,i),i=1,ncont_ref) +c write (iout,'(20i4)') (icont(1,i),i=1,ncont) +c write (iout,'(20i4)') (icont(2,i),i=1,ncont) + do i=1,ncont + do j=1,ncont_ref + if (icont(1,i).eq.icont_ref(1,j) .and. + & icont(2,i).eq.icont_ref(2,j)) nmatch=nmatch+1 + enddo + enddo +c print *,' nmatch=',nmatch +c contact_fract=dfloat(nmatch)/dfloat(max0(ncont,ncont_ref)) + contact_fract_nn=dfloat(ncont-nmatch)/dfloat(ncont) + return + end +c---------------------------------------------------------------------------- + subroutine hairpin(lprint,nharp,iharp) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + integer ncont,icont(2,maxcont) + integer nharp,iharp(4,maxres/3) + logical lprint,not_done + real*8 rcomp /6.0d0/ + ncont=0 + kkk=0 +c print *,'nnt=',nnt,' nct=',nct + do i=nnt,nct-3 + do k=1,3 + c(k,2*nres+1)=0.5d0*(c(k,i)+c(k,i+1)) + enddo + do j=i+2,nct-1 + do k=1,3 + c(k,2*nres+2)=0.5d0*(c(k,j)+c(k,j+1)) + enddo + if (dist(2*nres+1,2*nres+2).lt.rcomp) then + ncont=ncont+1 + icont(1,ncont)=i + icont(2,ncont)=j + endif + enddo + enddo + if (lprint) then + write (iout,'(a)') 'PP contact map:' + do i=1,ncont + i1=icont(1,i) + i2=icont(2,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4)') + & i,restyp(it1),i1,restyp(it2),i2 + enddo + endif +c finding hairpins + nharp=0 + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if (j1.eq.i1+2 .and. i1.gt.nnt .and. j1.lt.nct) then +c write (iout,*) "found turn at ",i1,j1 + ii1=i1 + jj1=j1 + not_done=.true. + do while (not_done) + i1=i1-1 + j1=j1+1 + do j=1,ncont + if (i1.eq.icont(1,j) .and. j1.eq.icont(2,j)) goto 10 + enddo + not_done=.false. + 10 continue +c write (iout,*) i1,j1,not_done + enddo + i1=i1+1 + j1=j1-1 + if (j1-i1.gt.4) then + nharp=nharp+1 + iharp(1,nharp)=i1 + iharp(2,nharp)=j1 + iharp(3,nharp)=ii1 + iharp(4,nharp)=jj1 +c write (iout,*)'nharp',nharp,' iharp',(iharp(k,nharp),k=1,4) + endif + endif + enddo +c do i=1,nharp +c write (iout,*)'i',i,' iharp',(iharp(k,i),k=1,4) +c enddo + if (lprint) then + write (iout,*) "Hairpins:" + do i=1,nharp + i1=iharp(1,i) + j1=iharp(2,i) + ii1=iharp(3,i) + jj1=iharp(4,i) + write (iout,*) + write (iout,'(20(a,i3,1x))') (restyp(itype(k)),k,k=i1,ii1) + write (iout,'(20(a,i3,1x))') (restyp(itype(k)),k,k=j1,jj1,-1) +c do k=jj1,j1,-1 +c write (iout,'(a,i3,$)') restyp(itype(k)),k +c enddo + enddo + endif + return + end +c---------------------------------------------------------------------------- + diff --git a/source/unres/src_MD-NEWSC/convert.f b/source/unres/src_MD-NEWSC/convert.f new file mode 100644 index 0000000..dc0cccd --- /dev/null +++ b/source/unres/src_MD-NEWSC/convert.f @@ -0,0 +1,196 @@ + subroutine geom_to_var(n,x) +C +C Transfer the geometry parameters to the variable array. +C The positions of variables are as follows: +C 1. Virtual-bond torsional angles: 1 thru nres-3 +C 2. Virtual-bond valence angles: nres-2 thru 2*nres-5 +C 3. The polar angles alpha of local SC orientation: 2*nres-4 thru +C 2*nres-4+nside +C 4. The torsional angles omega of SC orientation: 2*nres-4+nside+1 +C thru 2*nre-4+2*nside +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + double precision x(n) +cd print *,'nres',nres,' nphi',nphi,' ntheta',ntheta,' nvar',nvar + do i=4,nres + x(i-3)=phi(i) +cd print *,i,i-3,phi(i) + enddo + if (n.eq.nphi) return + do i=3,nres + x(i-2+nphi)=theta(i) +cd print *,i,i-2+nphi,theta(i) + enddo + if (n.eq.nphi+ntheta) return + do i=2,nres-1 + if (ialph(i,1).gt.0) then + x(ialph(i,1))=alph(i) + x(ialph(i,1)+nside)=omeg(i) +cd print *,i,ialph(i,1),ialph(i,1)+nside,alph(i),omeg(i) + endif + enddo + return + end +C-------------------------------------------------------------------- + subroutine var_to_geom(n,x) +C +C Update geometry parameters according to the variable array. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + dimension x(n) + logical change,reduce + change=reduce(x) + if (n.gt.nphi+ntheta) then + do i=1,nside + ii=ialph(i,2) + alph(ii)=x(nphi+ntheta+i) + omeg(ii)=pinorm(x(nphi+ntheta+nside+i)) + enddo + endif + do i=4,nres + phi(i)=x(i-3) + enddo + if (n.eq.nphi) return + do i=3,nres + theta(i)=x(i-2+nphi) + if (theta(i).eq.pi) theta(i)=0.99d0*pi + x(i-2+nphi)=theta(i) + enddo + return + end +c------------------------------------------------------------------------- + logical function convert_side(alphi,omegi) + implicit none + double precision alphi,omegi + double precision pinorm + include 'COMMON.GEO' + convert_side=.false. +C Apply periodicity restrictions. + if (alphi.gt.pi) then + alphi=dwapi-alphi + omegi=pinorm(omegi+pi) + convert_side=.true. + endif + return + end +c------------------------------------------------------------------------- + logical function reduce(x) +C +C Apply periodic restrictions to variables. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + logical zm,zmiana,convert_side + dimension x(nvar) + zmiana=.false. + do i=4,nres + x(i-3)=pinorm(x(i-3)) + enddo + if (nvar.gt.nphi+ntheta) then + do i=1,nside + ii=nphi+ntheta+i + iii=ii+nside + x(ii)=thetnorm(x(ii)) + x(iii)=pinorm(x(iii)) +C Apply periodic restrictions. + zm=convert_side(x(ii),x(iii)) + zmiana=zmiana.or.zm + enddo + endif + if (nvar.eq.nphi) return + do i=3,nres + ii=i-2+nphi + iii=i-3 + x(ii)=dmod(x(ii),dwapi) +C Apply periodic restrictions. + if (x(ii).gt.pi) then + zmiana=.true. + x(ii)=dwapi-x(ii) + if (iii.gt.0) x(iii)=pinorm(x(iii)+pi) + if (i.lt.nres) x(iii+1)=pinorm(x(iii+1)+pi) + ii=ialph(i-1,1) + if (ii.gt.0) then + x(ii)=dmod(pi-x(ii),dwapi) + x(ii+nside)=pinorm(-x(ii+nside)) + zm=convert_side(x(ii),x(ii+nside)) + endif + else if (x(ii).lt.-pi) then + zmiana=.true. + x(ii)=dwapi+x(ii) + ii=ialph(i-1,1) + if (ii.gt.0) then + x(ii)=dmod(pi-x(ii),dwapi) + x(ii+nside)=pinorm(-pi-x(ii+nside)) + zm=convert_side(x(ii),x(ii+nside)) + endif + else if (x(ii).lt.0.0d0) then + zmiana=.true. + x(ii)=-x(ii) + if (iii.gt.0) x(iii)=pinorm(x(iii)+pi) + if (i.lt.nres) x(iii+1)=pinorm(x(iii+1)+pi) + ii=ialph(i-1,1) + if (ii.gt.0) then + x(ii+nside)=pinorm(-x(ii+nside)) + zm=convert_side(x(ii),x(ii+nside)) + endif + endif + enddo + reduce=zmiana + return + end +c-------------------------------------------------------------------------- + double precision function thetnorm(x) +C This function puts x within [0,2Pi]. + implicit none + double precision x,xx + include 'COMMON.GEO' + xx=dmod(x,dwapi) + if (xx.lt.0.0d0) xx=xx+dwapi + if (xx.gt.0.9999d0*pi) xx=0.9999d0*pi + thetnorm=xx + return + end +C-------------------------------------------------------------------- + subroutine var_to_geom_restr(n,xx) +C +C Update geometry parameters according to the variable array. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + dimension x(maxvar),xx(maxvar) + logical change,reduce + + call xx2x(x,xx) + change=reduce(x) + do i=1,nside + ii=ialph(i,2) + alph(ii)=x(nphi+ntheta+i) + omeg(ii)=pinorm(x(nphi+ntheta+nside+i)) + enddo + do i=4,nres + phi(i)=x(i-3) + enddo + do i=3,nres + theta(i)=x(i-2+nphi) + if (theta(i).eq.pi) theta(i)=0.99d0*pi + x(i-2+nphi)=theta(i) + enddo + return + end +c------------------------------------------------------------------------- diff --git a/source/unres/src_MD-NEWSC/cored.f b/source/unres/src_MD-NEWSC/cored.f new file mode 100644 index 0000000..1cf25e5 --- /dev/null +++ b/source/unres/src_MD-NEWSC/cored.f @@ -0,0 +1,3151 @@ + subroutine assst(iv, liv, lv, v) +c +c *** assess candidate step (***sol version 2.3) *** +c + integer liv, l + integer iv(liv) + double precision v(lv) +c +c *** purpose *** +c +c this subroutine is called by an unconstrained minimization +c routine to assess the next candidate step. it may recommend one +c of several courses of action, such as accepting the step, recom- +c puting it using the same or a new quadratic model, or halting due +c to convergence or false convergence. see the return code listing +c below. +c +c-------------------------- parameter usage -------------------------- +c +c iv (i/o) integer parameter and scratch vector -- see description +c below of iv values referenced. +c liv (in) length of iv array. +c lv (in) length of v array. +c v (i/o) real parameter and scratch vector -- see description +c below of v values referenced. +c +c *** iv values referenced *** +c +c iv(irc) (i/o) on input for the first step tried in a new iteration, +c iv(irc) should be set to 3 or 4 (the value to which it is +c set when step is definitely to be accepted). on input +c after step has been recomputed, iv(irc) should be +c unchanged since the previous return of assst. +c on output, iv(irc) is a return code having one of the +c following values... +c 1 = switch models or try smaller step. +c 2 = switch models or accept step. +c 3 = accept step and determine v(radfac) by gradient +c tests. +c 4 = accept step, v(radfac) has been determined. +c 5 = recompute step (using the same model). +c 6 = recompute step with radius = v(lmaxs) but do not +c evaulate the objective function. +c 7 = x-convergence (see v(xctol)). +c 8 = relative function convergence (see v(rfctol)). +c 9 = both x- and relative function convergence. +c 10 = absolute function convergence (see v(afctol)). +c 11 = singular convergence (see v(lmaxs)). +c 12 = false convergence (see v(xftol)). +c 13 = iv(irc) was out of range on input. +c return code i has precdence over i+1 for i = 9, 10, 11. +c iv(mlstgd) (i/o) saved value of iv(model). +c iv(model) (i/o) on input, iv(model) should be an integer identifying +c the current quadratic model of the objective function. +c if a previous step yielded a better function reduction, +c then iv(model) will be set to iv(mlstgd) on output. +c iv(nfcall) (in) invocation count for the objective function. +c iv(nfgcal) (i/o) value of iv(nfcall) at step that gave the biggest +c function reduction this iteration. iv(nfgcal) remains +c unchanged until a function reduction is obtained. +c iv(radinc) (i/o) the number of radius increases (or minus the number +c of decreases) so far this iteration. +c iv(restor) (out) set to 1 if v(f) has been restored and x should be +c restored to its initial value, to 2 if x should be saved, +c to 3 if x should be restored from the saved value, and to +c 0 otherwise. +c iv(stage) (i/o) count of the number of models tried so far in the +c current iteration. +c iv(stglim) (in) maximum number of models to consider. +c iv(switch) (out) set to 0 unless a new model is being tried and it +c gives a smaller function value than the previous model, +c in which case assst sets iv(switch) = 1. +c iv(toobig) (in) is nonzero if step was too big (e.g. if it caused +c overflow). +c iv(xirc) (i/o) value that iv(irc) would have in the absence of +c convergence, false convergence, and oversized steps. +c +c *** v values referenced *** +c +c v(afctol) (in) absolute function convergence tolerance. if the +c absolute value of the current function value v(f) is less +c than v(afctol), then assst returns with iv(irc) = 10. +c v(decfac) (in) factor by which to decrease radius when iv(toobig) is +c nonzero. +c v(dstnrm) (in) the 2-norm of d*step. +c v(dstsav) (i/o) value of v(dstnrm) on saved step. +c v(dst0) (in) the 2-norm of d times the newton step (when defined, +c i.e., for v(nreduc) .ge. 0). +c v(f) (i/o) on both input and output, v(f) is the objective func- +c tion value at x. if x is restored to a previous value, +c then v(f) is restored to the corresponding value. +c v(fdif) (out) the function reduction v(f0) - v(f) (for the output +c value of v(f) if an earlier step gave a bigger function +c decrease, and for the input value of v(f) otherwise). +c v(flstgd) (i/o) saved value of v(f). +c v(f0) (in) objective function value at start of iteration. +c v(gtslst) (i/o) value of v(gtstep) on saved step. +c v(gtstep) (in) inner product between step and gradient. +c v(incfac) (in) minimum factor by which to increase radius. +c v(lmaxs) (in) maximum reasonable step size (and initial step bound). +c if the actual function decrease is no more than twice +c what was predicted, if a return with iv(irc) = 7, 8, 9, +c or 10 does not occur, if v(dstnrm) .gt. v(lmaxs), and if +c v(preduc) .le. v(sctol) * abs(v(f0)), then assst re- +c turns with iv(irc) = 11. if so doing appears worthwhile, +c then assst repeats this test with v(preduc) computed for +c a step of length v(lmaxs) (by a return with iv(irc) = 6). +c v(nreduc) (i/o) function reduction predicted by quadratic model for +c newton step. if assst is called with iv(irc) = 6, i.e., +c if v(preduc) has been computed with radius = v(lmaxs) for +c use in the singular convervence test, then v(nreduc) is +c set to -v(preduc) before the latter is restored. +c v(plstgd) (i/o) value of v(preduc) on saved step. +c v(preduc) (i/o) function reduction predicted by quadratic model for +c current step. +c v(radfac) (out) factor to be used in determining the new radius, +c which should be v(radfac)*dst, where dst is either the +c output value of v(dstnrm) or the 2-norm of +c diag(newd)*step for the output value of step and the +c updated version, newd, of the scale vector d. for +c iv(irc) = 3, v(radfac) = 1.0 is returned. +c v(rdfcmn) (in) minimum value for v(radfac) in terms of the input +c value of v(dstnrm) -- suggested value = 0.1. +c v(rdfcmx) (in) maximum value for v(radfac) -- suggested value = 4.0. +c v(reldx) (in) scaled relative change in x caused by step, computed +c (e.g.) by function reldst as +c max (d(i)*abs(x(i)-x0(i)), 1 .le. i .le. p) / +c max (d(i)*(abs(x(i))+abs(x0(i))), 1 .le. i .le. p). +c v(rfctol) (in) relative function convergence tolerance. if the +c actual function reduction is at most twice what was pre- +c dicted and v(nreduc) .le. v(rfctol)*abs(v(f0)), then +c assst returns with iv(irc) = 8 or 9. +c v(stppar) (in) marquardt parameter -- 0 means full newton step. +c v(tuner1) (in) tuning constant used to decide if the function +c reduction was much less than expected. suggested +c value = 0.1. +c v(tuner2) (in) tuning constant used to decide if the function +c reduction was large enough to accept step. suggested +c value = 10**-4. +c v(tuner3) (in) tuning constant used to decide if the radius +c should be increased. suggested value = 0.75. +c v(xctol) (in) x-convergence criterion. if step is a newton step +c (v(stppar) = 0) having v(reldx) .le. v(xctol) and giving +c at most twice the predicted function decrease, then +c assst returns iv(irc) = 7 or 9. +c v(xftol) (in) false convergence tolerance. if step gave no or only +c a small function decrease and v(reldx) .le. v(xftol), +c then assst returns with iv(irc) = 12. +c +c------------------------------- notes ------------------------------- +c +c *** application and usage restrictions *** +c +c this routine is called as part of the nl2sol (nonlinear +c least-squares) package. it may be used in any unconstrained +c minimization solver that uses dogleg, goldfeld-quandt-trotter, +c or levenberg-marquardt steps. +c +c *** algorithm notes *** +c +c see (1) for further discussion of the assessing and model +c switching strategies. while nl2sol considers only two models, +c assst is designed to handle any number of models. +c +c *** usage notes *** +c +c on the first call of an iteration, only the i/o variables +c step, x, iv(irc), iv(model), v(f), v(dstnrm), v(gtstep), and +c v(preduc) need have been initialized. between calls, no i/o +c values execpt step, x, iv(model), v(f) and the stopping toler- +c ances should be changed. +c after a return for convergence or false convergence, one can +c change the stopping tolerances and call assst again, in which +c case the stopping tests will be repeated. +c +c *** references *** +c +c (1) dennis, j.e., jr., gay, d.m., and welsch, r.e. (1981), +c an adaptive nonlinear least-squares algorithm, +c acm trans. math. software, vol. 7, no. 3. +c +c (2) powell, m.j.d. (1970) a fortran subroutine for solving +c systems of nonlinear algebraic equations, in numerical +c methods for nonlinear algebraic equations, edited by +c p. rabinowitz, gordon and breach, london. +c +c *** history *** +c +c john dennis designed much of this routine, starting with +c ideas in (2). roy welsch suggested the model switching strategy. +c david gay and stephen peters cast this subroutine into a more +c portable form (winter 1977), and david gay cast it into its +c present form (fall 1978). +c +c *** general *** +c +c this subroutine was written in connection with research +c supported by the national science foundation under grants +c mcs-7600324, dcr75-10143, 76-14311dss, mcs76-11989, and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** no external functions and subroutines *** +c +c *** intrinsic functions *** +c/+ + double precision dabs, dmax1 +c/ +c *** no common blocks *** +c +c-------------------------- local variables -------------------------- +c + logical goodx + integer i, nfc + double precision emax, emaxs, gts, rfac1, xmax + double precision half, one, onep2, two, zero +c +c *** subscripts for iv and v *** +c + integer afctol, decfac, dstnrm, dstsav, dst0, f, fdif, flstgd, f0, + 1 gtslst, gtstep, incfac, irc, lmaxs, mlstgd, model, nfcall, + 2 nfgcal, nreduc, plstgd, preduc, radfac, radinc, rdfcmn, + 3 rdfcmx, reldx, restor, rfctol, sctol, stage, stglim, + 4 stppar, switch, toobig, tuner1, tuner2, tuner3, xctol, + 5 xftol, xirc +c +c *** data initializations *** +c +c/6 +c data half/0.5d+0/, one/1.d+0/, onep2/1.2d+0/, two/2.d+0/, +c 1 zero/0.d+0/ +c/7 + parameter (half=0.5d+0, one=1.d+0, onep2=1.2d+0, two=2.d+0, + 1 zero=0.d+0) +c/ +c +c/6 +c data irc/29/, mlstgd/32/, model/5/, nfcall/6/, nfgcal/7/, +c 1 radinc/8/, restor/9/, stage/10/, stglim/11/, switch/12/, +c 2 toobig/2/, xirc/13/ +c/7 + parameter (irc=29, mlstgd=32, model=5, nfcall=6, nfgcal=7, + 1 radinc=8, restor=9, stage=10, stglim=11, switch=12, + 2 toobig=2, xirc=13) +c/ +c/6 +c data afctol/31/, decfac/22/, dstnrm/2/, dst0/3/, dstsav/18/, +c 1 f/10/, fdif/11/, flstgd/12/, f0/13/, gtslst/14/, gtstep/4/, +c 2 incfac/23/, lmaxs/36/, nreduc/6/, plstgd/15/, preduc/7/, +c 3 radfac/16/, rdfcmn/24/, rdfcmx/25/, reldx/17/, rfctol/32/, +c 4 sctol/37/, stppar/5/, tuner1/26/, tuner2/27/, tuner3/28/, +c 5 xctol/33/, xftol/34/ +c/7 + parameter (afctol=31, decfac=22, dstnrm=2, dst0=3, dstsav=18, + 1 f=10, fdif=11, flstgd=12, f0=13, gtslst=14, gtstep=4, + 2 incfac=23, lmaxs=36, nreduc=6, plstgd=15, preduc=7, + 3 radfac=16, rdfcmn=24, rdfcmx=25, reldx=17, rfctol=32, + 4 sctol=37, stppar=5, tuner1=26, tuner2=27, tuner3=28, + 5 xctol=33, xftol=34) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + nfc = iv(nfcall) + iv(switch) = 0 + iv(restor) = 0 + rfac1 = one + goodx = .true. + i = iv(irc) + if (i .ge. 1 .and. i .le. 12) + 1 go to (20,30,10,10,40,280,220,220,220,220,220,170), i + iv(irc) = 13 + go to 999 +c +c *** initialize for new iteration *** +c + 10 iv(stage) = 1 + iv(radinc) = 0 + v(flstgd) = v(f0) + if (iv(toobig) .eq. 0) go to 110 + iv(stage) = -1 + iv(xirc) = i + go to 60 +c +c *** step was recomputed with new model or smaller radius *** +c *** first decide which *** +c + 20 if (iv(model) .ne. iv(mlstgd)) go to 30 +c *** old model retained, smaller radius tried *** +c *** do not consider any more new models this iteration *** + iv(stage) = iv(stglim) + iv(radinc) = -1 + go to 110 +c +c *** a new model is being tried. decide whether to keep it. *** +c + 30 iv(stage) = iv(stage) + 1 +c +c *** now we add the possibiltiy that step was recomputed with *** +c *** the same model, perhaps because of an oversized step. *** +c + 40 if (iv(stage) .gt. 0) go to 50 +c +c *** step was recomputed because it was too big. *** +c + if (iv(toobig) .ne. 0) go to 60 +c +c *** restore iv(stage) and pick up where we left off. *** +c + iv(stage) = -iv(stage) + i = iv(xirc) + go to (20, 30, 110, 110, 70), i +c + 50 if (iv(toobig) .eq. 0) go to 70 +c +c *** handle oversize step *** +c + if (iv(radinc) .gt. 0) go to 80 + iv(stage) = -iv(stage) + iv(xirc) = iv(irc) +c + 60 v(radfac) = v(decfac) + iv(radinc) = iv(radinc) - 1 + iv(irc) = 5 + iv(restor) = 1 + go to 999 +c + 70 if (v(f) .lt. v(flstgd)) go to 110 +c +c *** the new step is a loser. restore old model. *** +c + if (iv(model) .eq. iv(mlstgd)) go to 80 + iv(model) = iv(mlstgd) + iv(switch) = 1 +c +c *** restore step, etc. only if a previous step decreased v(f). +c + 80 if (v(flstgd) .ge. v(f0)) go to 110 + iv(restor) = 1 + v(f) = v(flstgd) + v(preduc) = v(plstgd) + v(gtstep) = v(gtslst) + if (iv(switch) .eq. 0) rfac1 = v(dstnrm) / v(dstsav) + v(dstnrm) = v(dstsav) + nfc = iv(nfgcal) + goodx = .false. +c + 110 v(fdif) = v(f0) - v(f) + if (v(fdif) .gt. v(tuner2) * v(preduc)) go to 140 + if(iv(radinc).gt.0) go to 140 +c +c *** no (or only a trivial) function decrease +c *** -- so try new model or smaller radius +c + if (v(f) .lt. v(f0)) go to 120 + iv(mlstgd) = iv(model) + v(flstgd) = v(f) + v(f) = v(f0) + iv(restor) = 1 + go to 130 + 120 iv(nfgcal) = nfc + 130 iv(irc) = 1 + if (iv(stage) .lt. iv(stglim)) go to 160 + iv(irc) = 5 + iv(radinc) = iv(radinc) - 1 + go to 160 +c +c *** nontrivial function decrease achieved *** +c + 140 iv(nfgcal) = nfc + rfac1 = one + v(dstsav) = v(dstnrm) + if (v(fdif) .gt. v(preduc)*v(tuner1)) go to 190 +c +c *** decrease was much less than predicted -- either change models +c *** or accept step with decreased radius. +c + if (iv(stage) .ge. iv(stglim)) go to 150 +c *** consider switching models *** + iv(irc) = 2 + go to 160 +c +c *** accept step with decreased radius *** +c + 150 iv(irc) = 4 +c +c *** set v(radfac) to fletcher*s decrease factor *** +c + 160 iv(xirc) = iv(irc) + emax = v(gtstep) + v(fdif) + v(radfac) = half * rfac1 + if (emax .lt. v(gtstep)) v(radfac) = rfac1 * dmax1(v(rdfcmn), + 1 half * v(gtstep)/emax) +c +c *** do false convergence test *** +c + 170 if (v(reldx) .le. v(xftol)) go to 180 + iv(irc) = iv(xirc) + if (v(f) .lt. v(f0)) go to 200 + go to 230 +c + 180 iv(irc) = 12 + go to 240 +c +c *** handle good function decrease *** +c + 190 if (v(fdif) .lt. (-v(tuner3) * v(gtstep))) go to 210 +c +c *** increasing radius looks worthwhile. see if we just +c *** recomputed step with a decreased radius or restored step +c *** after recomputing it with a larger radius. +c + if (iv(radinc) .lt. 0) go to 210 + if (iv(restor) .eq. 1) go to 210 +c +c *** we did not. try a longer step unless this was a newton +c *** step. +c + v(radfac) = v(rdfcmx) + gts = v(gtstep) + if (v(fdif) .lt. (half/v(radfac) - one) * gts) + 1 v(radfac) = dmax1(v(incfac), half*gts/(gts + v(fdif))) + iv(irc) = 4 + if (v(stppar) .eq. zero) go to 230 + if (v(dst0) .ge. zero .and. (v(dst0) .lt. two*v(dstnrm) + 1 .or. v(nreduc) .lt. onep2*v(fdif))) go to 230 +c *** step was not a newton step. recompute it with +c *** a larger radius. + iv(irc) = 5 + iv(radinc) = iv(radinc) + 1 +c +c *** save values corresponding to good step *** +c + 200 v(flstgd) = v(f) + iv(mlstgd) = iv(model) + if (iv(restor) .ne. 1) iv(restor) = 2 + v(dstsav) = v(dstnrm) + iv(nfgcal) = nfc + v(plstgd) = v(preduc) + v(gtslst) = v(gtstep) + go to 230 +c +c *** accept step with radius unchanged *** +c + 210 v(radfac) = one + iv(irc) = 3 + go to 230 +c +c *** come here for a restart after convergence *** +c + 220 iv(irc) = iv(xirc) + if (v(dstsav) .ge. zero) go to 240 + iv(irc) = 12 + go to 240 +c +c *** perform convergence tests *** +c + 230 iv(xirc) = iv(irc) + 240 if (iv(restor) .eq. 1 .and. v(flstgd) .lt. v(f0)) iv(restor) = 3 + if (half * v(fdif) .gt. v(preduc)) go to 999 + emax = v(rfctol) * dabs(v(f0)) + emaxs = v(sctol) * dabs(v(f0)) + if (v(dstnrm) .gt. v(lmaxs) .and. v(preduc) .le. emaxs) + 1 iv(irc) = 11 + if (v(dst0) .lt. zero) go to 250 + i = 0 + if ((v(nreduc) .gt. zero .and. v(nreduc) .le. emax) .or. + 1 (v(nreduc) .eq. zero. and. v(preduc) .eq. zero)) i = 2 + if (v(stppar) .eq. zero .and. v(reldx) .le. v(xctol) + 1 .and. goodx) i = i + 1 + if (i .gt. 0) iv(irc) = i + 6 +c +c *** consider recomputing step of length v(lmaxs) for singular +c *** convergence test. +c + 250 if (iv(irc) .gt. 5 .and. iv(irc) .ne. 12) go to 999 + if (v(dstnrm) .gt. v(lmaxs)) go to 260 + if (v(preduc) .ge. emaxs) go to 999 + if (v(dst0) .le. zero) go to 270 + if (half * v(dst0) .le. v(lmaxs)) go to 999 + go to 270 + 260 if (half * v(dstnrm) .le. v(lmaxs)) go to 999 + xmax = v(lmaxs) / v(dstnrm) + if (xmax * (two - xmax) * v(preduc) .ge. emaxs) go to 999 + 270 if (v(nreduc) .lt. zero) go to 290 +c +c *** recompute v(preduc) for use in singular convergence test *** +c + v(gtslst) = v(gtstep) + v(dstsav) = v(dstnrm) + if (iv(irc) .eq. 12) v(dstsav) = -v(dstsav) + v(plstgd) = v(preduc) + i = iv(restor) + iv(restor) = 2 + if (i .eq. 3) iv(restor) = 0 + iv(irc) = 6 + go to 999 +c +c *** perform singular convergence test with recomputed v(preduc) *** +c + 280 v(gtstep) = v(gtslst) + v(dstnrm) = dabs(v(dstsav)) + iv(irc) = iv(xirc) + if (v(dstsav) .le. zero) iv(irc) = 12 + v(nreduc) = -v(preduc) + v(preduc) = v(plstgd) + iv(restor) = 3 + 290 if (-v(nreduc) .le. v(sctol) * dabs(v(f0))) iv(irc) = 11 +c + 999 return +c +c *** last card of assst follows *** + end + subroutine deflt(alg, iv, liv, lv, v) +c +c *** supply ***sol (version 2.3) default values to iv and v *** +c +c *** alg = 1 means regression constants. +c *** alg = 2 means general unconstrained optimization constants. +c + integer liv, l + integer alg, iv(liv) + double precision v(lv) +c + external imdcon, vdflt + integer imdcon +c imdcon... returns machine-dependent integer constants. +c vdflt.... provides default values to v. +c + integer miv, m + integer miniv(2), minv(2) +c +c *** subscripts for iv *** +c + integer algsav, covprt, covreq, dtype, hc, ierr, inith, inits, + 1 ipivot, ivneed, lastiv, lastv, lmat, mxfcal, mxiter, + 2 nfcov, ngcov, nvdflt, outlev, parprt, parsav, perm, + 3 prunit, qrtyp, rdreq, rmat, solprt, statpr, vneed, + 4 vsave, x0prt +c +c *** iv subscript values *** +c +c/6 +c data algsav/51/, covprt/14/, covreq/15/, dtype/16/, hc/71/, +c 1 ierr/75/, inith/25/, inits/25/, ipivot/76/, ivneed/3/, +c 2 lastiv/44/, lastv/45/, lmat/42/, mxfcal/17/, mxiter/18/, +c 3 nfcov/52/, ngcov/53/, nvdflt/50/, outlev/19/, parprt/20/, +c 4 parsav/49/, perm/58/, prunit/21/, qrtyp/80/, rdreq/57/, +c 5 rmat/78/, solprt/22/, statpr/23/, vneed/4/, vsave/60/, +c 6 x0prt/24/ +c/7 + parameter (algsav=51, covprt=14, covreq=15, dtype=16, hc=71, + 1 ierr=75, inith=25, inits=25, ipivot=76, ivneed=3, + 2 lastiv=44, lastv=45, lmat=42, mxfcal=17, mxiter=18, + 3 nfcov=52, ngcov=53, nvdflt=50, outlev=19, parprt=20, + 4 parsav=49, perm=58, prunit=21, qrtyp=80, rdreq=57, + 5 rmat=78, solprt=22, statpr=23, vneed=4, vsave=60, + 6 x0prt=24) +c/ + data miniv(1)/80/, miniv(2)/59/, minv(1)/98/, minv(2)/71/ +c +c------------------------------- body -------------------------------- +c + if (alg .lt. 1 .or. alg .gt. 2) go to 40 + miv = miniv(alg) + if (liv .lt. miv) go to 20 + mv = minv(alg) + if (lv .lt. mv) go to 30 + call vdflt(alg, lv, v) + iv(1) = 12 + iv(algsav) = alg + iv(ivneed) = 0 + iv(lastiv) = miv + iv(lastv) = mv + iv(lmat) = mv + 1 + iv(mxfcal) = 200 + iv(mxiter) = 150 + iv(outlev) = 1 + iv(parprt) = 1 + iv(perm) = miv + 1 + iv(prunit) = imdcon(1) + iv(solprt) = 1 + iv(statpr) = 1 + iv(vneed) = 0 + iv(x0prt) = 1 +c + if (alg .ge. 2) go to 10 +c +c *** regression values +c + iv(covprt) = 3 + iv(covreq) = 1 + iv(dtype) = 1 + iv(hc) = 0 + iv(ierr) = 0 + iv(inits) = 0 + iv(ipivot) = 0 + iv(nvdflt) = 32 + iv(parsav) = 67 + iv(qrtyp) = 1 + iv(rdreq) = 3 + iv(rmat) = 0 + iv(vsave) = 58 + go to 999 +c +c *** general optimization values +c + 10 iv(dtype) = 0 + iv(inith) = 1 + iv(nfcov) = 0 + iv(ngcov) = 0 + iv(nvdflt) = 25 + iv(parsav) = 47 + go to 999 +c + 20 iv(1) = 15 + go to 999 +c + 30 iv(1) = 16 + go to 999 +c + 40 iv(1) = 67 +c + 999 return +c *** last card of deflt follows *** + end + double precision function dotprd(p, x, y) +c +c *** return the inner product of the p-vectors x and y. *** +c + integer p + double precision x(p), y(p) +c + integer i + double precision one, sqteta, t, zero +c/+ + double precision dmax1, dabs +c/ + external rmdcon + double precision rmdcon +c +c *** rmdcon(2) returns a machine-dependent constant, sqteta, which +c *** is slightly larger than the smallest positive number that +c *** can be squared without underflowing. +c +c/6 +c data one/1.d+0/, sqteta/0.d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, zero=0.d+0) + data sqteta/0.d+0/ +c/ +c + dotprd = zero + if (p .le. 0) go to 999 +crc if (sqteta .eq. zero) sqteta = rmdcon(2) + do 20 i = 1, p +crc t = dmax1(dabs(x(i)), dabs(y(i))) +crc if (t .gt. one) go to 10 +crc if (t .lt. sqteta) go to 20 +crc t = (x(i)/sqteta)*y(i) +crc if (dabs(t) .lt. sqteta) go to 20 + 10 dotprd = dotprd + x(i)*y(i) + 20 continue +c + 999 return +c *** last card of dotprd follows *** + end + subroutine itsum(d, g, iv, liv, lv, p, v, x) +c +c *** print iteration summary for ***sol (version 2.3) *** +c +c *** parameter declarations *** +c + integer liv, lv, p + integer iv(liv) + double precision d(p), g(p), v(lv), x(p) +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer alg, i, iv1, m, nf, ng, ol, pu +c/6 +c real model1(6), model2(6) +c/7 + character*4 model1(6), model2(6) +c/ + double precision nreldf, oldf, preldf, reldf, zero +c +c *** intrinsic functions *** +c/+ + integer iabs + double precision dabs, dmax1 +c/ +c *** no external functions or subroutines *** +c +c *** subscripts for iv and v *** +c + integer algsav, dstnrm, f, fdif, f0, needhd, nfcall, nfcov, ngcov, + 1 ngcall, niter, nreduc, outlev, preduc, prntit, prunit, + 2 reldx, solprt, statpr, stppar, sused, x0prt +c +c *** iv subscript values *** +c +c/6 +c data algsav/51/, needhd/36/, nfcall/6/, nfcov/52/, ngcall/30/, +c 1 ngcov/53/, niter/31/, outlev/19/, prntit/39/, prunit/21/, +c 2 solprt/22/, statpr/23/, sused/64/, x0prt/24/ +c/7 + parameter (algsav=51, needhd=36, nfcall=6, nfcov=52, ngcall=30, + 1 ngcov=53, niter=31, outlev=19, prntit=39, prunit=21, + 2 solprt=22, statpr=23, sused=64, x0prt=24) +c/ +c +c *** v subscript values *** +c +c/6 +c data dstnrm/2/, f/10/, f0/13/, fdif/11/, nreduc/6/, preduc/7/, +c 1 reldx/17/, stppar/5/ +c/7 + parameter (dstnrm=2, f=10, f0=13, fdif=11, nreduc=6, preduc=7, + 1 reldx=17, stppar=5) +c/ +c +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c/6 +c data model1(1)/4h /, model1(2)/4h /, model1(3)/4h /, +c 1 model1(4)/4h /, model1(5)/4h g /, model1(6)/4h s /, +c 2 model2(1)/4h g /, model2(2)/4h s /, model2(3)/4hg-s /, +c 3 model2(4)/4hs-g /, model2(5)/4h-s-g/, model2(6)/4h-g-s/ +c/7 + data model1/' ',' ',' ',' ',' g ',' s '/, + 1 model2/' g ',' s ','g-s ','s-g ','-s-g','-g-s'/ +c/ +c +c------------------------------- body -------------------------------- +c + pu = iv(prunit) + if (pu .eq. 0) go to 999 + iv1 = iv(1) + if (iv1 .gt. 62) iv1 = iv1 - 51 + ol = iv(outlev) + alg = iv(algsav) + if (iv1 .lt. 2 .or. iv1 .gt. 15) go to 370 + if (iv1 .ge. 12) go to 120 + if (iv1 .eq. 2 .and. iv(niter) .eq. 0) go to 390 + if (ol .eq. 0) go to 120 + if (iv1 .ge. 10 .and. iv(prntit) .eq. 0) go to 120 + if (iv1 .gt. 2) go to 10 + iv(prntit) = iv(prntit) + 1 + if (iv(prntit) .lt. iabs(ol)) go to 999 + 10 nf = iv(nfcall) - iabs(iv(nfcov)) + iv(prntit) = 0 + reldf = zero + preldf = zero + oldf = dmax1(dabs(v(f0)), dabs(v(f))) + if (oldf .le. zero) go to 20 + reldf = v(fdif) / oldf + preldf = v(preduc) / oldf + 20 if (ol .gt. 0) go to 60 +c +c *** print short summary line *** +c + if (iv(needhd) .eq. 1 .and. alg .eq. 1) write(pu,30) + 30 format(/10h it nf,6x,1hf,7x,5hreldf,3x,6hpreldf,3x,5hreldx, + 1 2x,13hmodel stppar) + if (iv(needhd) .eq. 1 .and. alg .eq. 2) write(pu,40) + 40 format(/11h it nf,7x,1hf,8x,5hreldf,4x,6hpreldf,4x,5hreldx, + 1 3x,6hstppar) + iv(needhd) = 0 + if (alg .eq. 2) go to 50 + m = iv(sused) + write(pu,100) iv(niter), nf, v(f), reldf, preldf, v(reldx), + 1 model1(m), model2(m), v(stppar) + go to 120 +c + 50 write(pu,110) iv(niter), nf, v(f), reldf, preldf, v(reldx), + 1 v(stppar) + go to 120 +c +c *** print long summary line *** +c + 60 if (iv(needhd) .eq. 1 .and. alg .eq. 1) write(pu,70) + 70 format(/11h it nf,6x,1hf,7x,5hreldf,3x,6hpreldf,3x,5hreldx, + 1 2x,13hmodel stppar,2x,6hd*step,2x,7hnpreldf) + if (iv(needhd) .eq. 1 .and. alg .eq. 2) write(pu,80) + 80 format(/11h it nf,7x,1hf,8x,5hreldf,4x,6hpreldf,4x,5hreldx, + 1 3x,6hstppar,3x,6hd*step,3x,7hnpreldf) + iv(needhd) = 0 + nreldf = zero + if (oldf .gt. zero) nreldf = v(nreduc) / oldf + if (alg .eq. 2) go to 90 + m = iv(sused) + write(pu,100) iv(niter), nf, v(f), reldf, preldf, v(reldx), + 1 model1(m), model2(m), v(stppar), v(dstnrm), nreldf + go to 120 +c + 90 write(pu,110) iv(niter), nf, v(f), reldf, preldf, + 1 v(reldx), v(stppar), v(dstnrm), nreldf + 100 format(i6,i5,d10.3,2d9.2,d8.1,a3,a4,2d8.1,d9.2) + 110 format(i6,i5,d11.3,2d10.2,3d9.1,d10.2) +c + 120 if (iv(statpr) .lt. 0) go to 430 + go to (999, 999, 130, 150, 170, 190, 210, 230, 250, 270, 290, 310, + 1 330, 350, 520), iv1 +c + 130 write(pu,140) + 140 format(/26h ***** x-convergence *****) + go to 430 +c + 150 write(pu,160) + 160 format(/42h ***** relative function convergence *****) + go to 430 +c + 170 write(pu,180) + 180 format(/49h ***** x- and relative function convergence *****) + go to 430 +c + 190 write(pu,200) + 200 format(/42h ***** absolute function convergence *****) + go to 430 +c + 210 write(pu,220) + 220 format(/33h ***** singular convergence *****) + go to 430 +c + 230 write(pu,240) + 240 format(/30h ***** false convergence *****) + go to 430 +c + 250 write(pu,260) + 260 format(/38h ***** function evaluation limit *****) + go to 430 +c + 270 write(pu,280) + 280 format(/28h ***** iteration limit *****) + go to 430 +c + 290 write(pu,300) + 300 format(/18h ***** stopx *****) + go to 430 +c + 310 write(pu,320) + 320 format(/44h ***** initial f(x) cannot be computed *****) +c + go to 390 +c + 330 write(pu,340) + 340 format(/37h ***** bad parameters to assess *****) + go to 999 +c + 350 write(pu,360) + 360 format(/43h ***** gradient could not be computed *****) + if (iv(niter) .gt. 0) go to 480 + go to 390 +c + 370 write(pu,380) iv(1) + 380 format(/14h ***** iv(1) =,i5,6h *****) + go to 999 +c +c *** initial call on itsum *** +c + 390 if (iv(x0prt) .ne. 0) write(pu,400) (i, x(i), d(i), i = 1, p) + 400 format(/23h i initial x(i),8x,4hd(i)//(1x,i5,d17.6,d14.3)) +c *** the following are to avoid undefined variables when the +c *** function evaluation limit is 1... + v(dstnrm) = zero + v(fdif) = zero + v(nreduc) = zero + v(preduc) = zero + v(reldx) = zero + if (iv1 .ge. 12) go to 999 + iv(needhd) = 0 + iv(prntit) = 0 + if (ol .eq. 0) go to 999 + if (ol .lt. 0 .and. alg .eq. 1) write(pu,30) + if (ol .lt. 0 .and. alg .eq. 2) write(pu,40) + if (ol .gt. 0 .and. alg .eq. 1) write(pu,70) + if (ol .gt. 0 .and. alg .eq. 2) write(pu,80) + if (alg .eq. 1) write(pu,410) v(f) + if (alg .eq. 2) write(pu,420) v(f) + 410 format(/11h 0 1,d10.3) +c365 format(/11h 0 1,e11.3) + 420 format(/11h 0 1,d11.3) + go to 999 +c +c *** print various information requested on solution *** +c + 430 iv(needhd) = 1 + if (iv(statpr) .eq. 0) go to 480 + oldf = dmax1(dabs(v(f0)), dabs(v(f))) + preldf = zero + nreldf = zero + if (oldf .le. zero) go to 440 + preldf = v(preduc) / oldf + nreldf = v(nreduc) / oldf + 440 nf = iv(nfcall) - iv(nfcov) + ng = iv(ngcall) - iv(ngcov) + write(pu,450) v(f), v(reldx), nf, ng, preldf, nreldf + 450 format(/9h function,d17.6,8h reldx,d17.3/12h func. evals, + 1 i8,9x,11hgrad. evals,i8/7h preldf,d16.3,6x,7hnpreldf,d15.3) +c + if (iv(nfcov) .gt. 0) write(pu,460) iv(nfcov) + 460 format(/1x,i4,50h extra func. evals for covariance and diagnost + 1ics.) + if (iv(ngcov) .gt. 0) write(pu,470) iv(ngcov) + 470 format(1x,i4,50h extra grad. evals for covariance and diagnosti + 1cs.) +c + 480 if (iv(solprt) .eq. 0) go to 999 + iv(needhd) = 1 + write(pu,490) + 490 format(/22h i final x(i),8x,4hd(i),10x,4hg(i)/) + do 500 i = 1, p + write(pu,510) i, x(i), d(i), g(i) + 500 continue + 510 format(1x,i5,d16.6,2d14.3) + go to 999 +c + 520 write(pu,530) + 530 format(/24h inconsistent dimensions) + 999 return +c *** last card of itsum follows *** + end + subroutine litvmu(n, x, l, y) +c +c *** solve (l**t)*x = y, where l is an n x n lower triangular +c *** matrix stored compactly by rows. x and y may occupy the same +c *** storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) + integer i, ii, ij, im1, i0, j, np1 + double precision xi, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + do 10 i = 1, n + 10 x(i) = y(i) + np1 = n + 1 + i0 = n*(n+1)/2 + do 30 ii = 1, n + i = np1 - ii + xi = x(i)/l(i0) + x(i) = xi + if (i .le. 1) go to 999 + i0 = i0 - i + if (xi .eq. zero) go to 30 + im1 = i - 1 + do 20 j = 1, im1 + ij = i0 + j + x(j) = x(j) - xi*l(ij) + 20 continue + 30 continue + 999 return +c *** last card of litvmu follows *** + end + subroutine livmul(n, x, l, y) +c +c *** solve l*x = y, where l is an n x n lower triangular +c *** matrix stored compactly by rows. x and y may occupy the same +c *** storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) + external dotprd + double precision dotprd + integer i, j, k + double precision t, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + do 10 k = 1, n + if (y(k) .ne. zero) go to 20 + x(k) = zero + 10 continue + go to 999 + 20 j = k*(k+1)/2 + x(k) = y(k) / l(j) + if (k .ge. n) go to 999 + k = k + 1 + do 30 i = k, n + t = dotprd(i-1, l(j+1), x) + j = j + i + x(i) = (y(i) - t)/l(j) + 30 continue + 999 return +c *** last card of livmul follows *** + end + subroutine parck(alg, d, iv, liv, lv, n, v) +c +c *** check ***sol (version 2.3) parameters, print changed values *** +c +c *** alg = 1 for regression, alg = 2 for general unconstrained opt. +c + integer alg, liv, lv, n + integer iv(liv) + double precision d(n), v(lv) +c + external rmdcon, vcopy, vdflt + double precision rmdcon +c rmdcon -- returns machine-dependent constants. +c vcopy -- copies one vector to another. +c vdflt -- supplies default parameter values to v alone. +c/+ + integer max0 +c/ +c +c *** local variables *** +c + integer i, ii, iv1, j, k, l, m, miv1, miv2, ndfalt, parsv1, pu + integer ijmp, jlim(2), miniv(2), ndflt(2) +c/6 +c integer varnm(2), sh(2) +c real cngd(3), dflt(3), vn(2,34), which(3) +c/7 + character*1 varnm(2), sh(2) + character*4 cngd(3), dflt(3), vn(2,34), which(3) +c/ + double precision big, machep, tiny, vk, vm(34), vx(34), zero +c +c *** iv and v subscripts *** +c + integer algsav, dinit, dtype, dtype0, epslon, inits, ivneed, + 1 lastiv, lastv, lmat, nextiv, nextv, nvdflt, oldn, + 2 parprt, parsav, perm, prunit, vneed +c +c +c/6 +c data algsav/51/, dinit/38/, dtype/16/, dtype0/54/, epslon/19/, +c 1 inits/25/, ivneed/3/, lastiv/44/, lastv/45/, lmat/42/, +c 2 nextiv/46/, nextv/47/, nvdflt/50/, oldn/38/, parprt/20/, +c 3 parsav/49/, perm/58/, prunit/21/, vneed/4/ +c/7 + parameter (algsav=51, dinit=38, dtype=16, dtype0=54, epslon=19, + 1 inits=25, ivneed=3, lastiv=44, lastv=45, lmat=42, + 2 nextiv=46, nextv=47, nvdflt=50, oldn=38, parprt=20, + 3 parsav=49, perm=58, prunit=21, vneed=4) + save big, machep, tiny +c/ +c + data big/0.d+0/, machep/-1.d+0/, tiny/1.d+0/, zero/0.d+0/ +c/6 +c data vn(1,1),vn(2,1)/4hepsl,4hon../ +c data vn(1,2),vn(2,2)/4hphmn,4hfc../ +c data vn(1,3),vn(2,3)/4hphmx,4hfc../ +c data vn(1,4),vn(2,4)/4hdecf,4hac../ +c data vn(1,5),vn(2,5)/4hincf,4hac../ +c data vn(1,6),vn(2,6)/4hrdfc,4hmn../ +c data vn(1,7),vn(2,7)/4hrdfc,4hmx../ +c data vn(1,8),vn(2,8)/4htune,4hr1../ +c data vn(1,9),vn(2,9)/4htune,4hr2../ +c data vn(1,10),vn(2,10)/4htune,4hr3../ +c data vn(1,11),vn(2,11)/4htune,4hr4../ +c data vn(1,12),vn(2,12)/4htune,4hr5../ +c data vn(1,13),vn(2,13)/4hafct,4hol../ +c data vn(1,14),vn(2,14)/4hrfct,4hol../ +c data vn(1,15),vn(2,15)/4hxcto,4hl.../ +c data vn(1,16),vn(2,16)/4hxfto,4hl.../ +c data vn(1,17),vn(2,17)/4hlmax,4h0.../ +c data vn(1,18),vn(2,18)/4hlmax,4hs.../ +c data vn(1,19),vn(2,19)/4hscto,4hl.../ +c data vn(1,20),vn(2,20)/4hdini,4ht.../ +c data vn(1,21),vn(2,21)/4hdtin,4hit../ +c data vn(1,22),vn(2,22)/4hd0in,4hit../ +c data vn(1,23),vn(2,23)/4hdfac,4h..../ +c data vn(1,24),vn(2,24)/4hdltf,4hdc../ +c data vn(1,25),vn(2,25)/4hdltf,4hdj../ +c data vn(1,26),vn(2,26)/4hdelt,4ha0../ +c data vn(1,27),vn(2,27)/4hfuzz,4h..../ +c data vn(1,28),vn(2,28)/4hrlim,4hit../ +c data vn(1,29),vn(2,29)/4hcosm,4hin../ +c data vn(1,30),vn(2,30)/4hhube,4hrc../ +c data vn(1,31),vn(2,31)/4hrspt,4hol../ +c data vn(1,32),vn(2,32)/4hsigm,4hin../ +c data vn(1,33),vn(2,33)/4heta0,4h..../ +c data vn(1,34),vn(2,34)/4hbias,4h..../ +c/7 + data vn(1,1),vn(2,1)/'epsl','on..'/ + data vn(1,2),vn(2,2)/'phmn','fc..'/ + data vn(1,3),vn(2,3)/'phmx','fc..'/ + data vn(1,4),vn(2,4)/'decf','ac..'/ + data vn(1,5),vn(2,5)/'incf','ac..'/ + data vn(1,6),vn(2,6)/'rdfc','mn..'/ + data vn(1,7),vn(2,7)/'rdfc','mx..'/ + data vn(1,8),vn(2,8)/'tune','r1..'/ + data vn(1,9),vn(2,9)/'tune','r2..'/ + data vn(1,10),vn(2,10)/'tune','r3..'/ + data vn(1,11),vn(2,11)/'tune','r4..'/ + data vn(1,12),vn(2,12)/'tune','r5..'/ + data vn(1,13),vn(2,13)/'afct','ol..'/ + data vn(1,14),vn(2,14)/'rfct','ol..'/ + data vn(1,15),vn(2,15)/'xcto','l...'/ + data vn(1,16),vn(2,16)/'xfto','l...'/ + data vn(1,17),vn(2,17)/'lmax','0...'/ + data vn(1,18),vn(2,18)/'lmax','s...'/ + data vn(1,19),vn(2,19)/'scto','l...'/ + data vn(1,20),vn(2,20)/'dini','t...'/ + data vn(1,21),vn(2,21)/'dtin','it..'/ + data vn(1,22),vn(2,22)/'d0in','it..'/ + data vn(1,23),vn(2,23)/'dfac','....'/ + data vn(1,24),vn(2,24)/'dltf','dc..'/ + data vn(1,25),vn(2,25)/'dltf','dj..'/ + data vn(1,26),vn(2,26)/'delt','a0..'/ + data vn(1,27),vn(2,27)/'fuzz','....'/ + data vn(1,28),vn(2,28)/'rlim','it..'/ + data vn(1,29),vn(2,29)/'cosm','in..'/ + data vn(1,30),vn(2,30)/'hube','rc..'/ + data vn(1,31),vn(2,31)/'rspt','ol..'/ + data vn(1,32),vn(2,32)/'sigm','in..'/ + data vn(1,33),vn(2,33)/'eta0','....'/ + data vn(1,34),vn(2,34)/'bias','....'/ +c/ +c + data vm(1)/1.0d-3/, vm(2)/-0.99d+0/, vm(3)/1.0d-3/, vm(4)/1.0d-2/, + 1 vm(5)/1.2d+0/, vm(6)/1.d-2/, vm(7)/1.2d+0/, vm(8)/0.d+0/, + 2 vm(9)/0.d+0/, vm(10)/1.d-3/, vm(11)/-1.d+0/, vm(13)/0.d+0/, + 3 vm(15)/0.d+0/, vm(16)/0.d+0/, vm(19)/0.d+0/, vm(20)/-10.d+0/, + 4 vm(21)/0.d+0/, vm(22)/0.d+0/, vm(23)/0.d+0/, vm(27)/1.01d+0/, + 5 vm(28)/1.d+10/, vm(30)/0.d+0/, vm(31)/0.d+0/, vm(32)/0.d+0/, + 6 vm(34)/0.d+0/ + data vx(1)/0.9d+0/, vx(2)/-1.d-3/, vx(3)/1.d+1/, vx(4)/0.8d+0/, + 1 vx(5)/1.d+2/, vx(6)/0.8d+0/, vx(7)/1.d+2/, vx(8)/0.5d+0/, + 2 vx(9)/0.5d+0/, vx(10)/1.d+0/, vx(11)/1.d+0/, vx(14)/0.1d+0/, + 3 vx(15)/1.d+0/, vx(16)/1.d+0/, vx(19)/1.d+0/, vx(23)/1.d+0/, + 4 vx(24)/1.d+0/, vx(25)/1.d+0/, vx(26)/1.d+0/, vx(27)/1.d+10/, + 5 vx(29)/1.d+0/, vx(31)/1.d+0/, vx(32)/1.d+0/, vx(33)/1.d+0/, + 6 vx(34)/1.d+0/ +c +c/6 +c data varnm(1)/1hp/, varnm(2)/1hn/, sh(1)/1hs/, sh(2)/1hh/ +c data cngd(1),cngd(2),cngd(3)/4h---c,4hhang,4hed v/, +c 1 dflt(1),dflt(2),dflt(3)/4hnond,4hefau,4hlt v/ +c/7 + data varnm(1)/'p'/, varnm(2)/'n'/, sh(1)/'s'/, sh(2)/'h'/ + data cngd(1),cngd(2),cngd(3)/'---c','hang','ed v'/, + 1 dflt(1),dflt(2),dflt(3)/'nond','efau','lt v'/ +c/ + data ijmp/33/, jlim(1)/0/, jlim(2)/24/, ndflt(1)/32/, ndflt(2)/25/ + data miniv(1)/80/, miniv(2)/59/ +c +c............................... body ................................ +c + pu = 0 + if (prunit .le. liv) pu = iv(prunit) + if (alg .lt. 1 .or. alg .gt. 2) go to 340 + if (iv(1) .eq. 0) call deflt(alg, iv, liv, lv, v) + iv1 = iv(1) + if (iv1 .ne. 13 .and. iv1 .ne. 12) go to 10 + miv1 = miniv(alg) + if (perm .le. liv) miv1 = max0(miv1, iv(perm) - 1) + if (ivneed .le. liv) miv2 = miv1 + max0(iv(ivneed), 0) + if (lastiv .le. liv) iv(lastiv) = miv2 + if (liv .lt. miv1) go to 300 + iv(ivneed) = 0 + iv(lastv) = max0(iv(vneed), 0) + iv(lmat) - 1 + iv(vneed) = 0 + if (liv .lt. miv2) go to 300 + if (lv .lt. iv(lastv)) go to 320 + 10 if (alg .eq. iv(algsav)) go to 30 + if (pu .ne. 0) write(pu,20) alg, iv(algsav) + 20 format(/39h the first parameter to deflt should be,i3, + 1 12h rather than,i3) + iv(1) = 82 + go to 999 + 30 if (iv1 .lt. 12 .or. iv1 .gt. 14) go to 60 + if (n .ge. 1) go to 50 + iv(1) = 81 + if (pu .eq. 0) go to 999 + write(pu,40) varnm(alg), n + 40 format(/8h /// bad,a1,2h =,i5) + go to 999 + 50 if (iv1 .ne. 14) iv(nextiv) = iv(perm) + if (iv1 .ne. 14) iv(nextv) = iv(lmat) + if (iv1 .eq. 13) go to 999 + k = iv(parsav) - epslon + call vdflt(alg, lv-k, v(k+1)) + iv(dtype0) = 2 - alg + iv(oldn) = n + which(1) = dflt(1) + which(2) = dflt(2) + which(3) = dflt(3) + go to 110 + 60 if (n .eq. iv(oldn)) go to 80 + iv(1) = 17 + if (pu .eq. 0) go to 999 + write(pu,70) varnm(alg), iv(oldn), n + 70 format(/5h /// ,1a1,14h changed from ,i5,4h to ,i5) + go to 999 +c + 80 if (iv1 .le. 11 .and. iv1 .ge. 1) go to 100 + iv(1) = 80 + if (pu .ne. 0) write(pu,90) iv1 + 90 format(/13h /// iv(1) =,i5,28h should be between 0 and 14.) + go to 999 +c + 100 which(1) = cngd(1) + which(2) = cngd(2) + which(3) = cngd(3) +c + 110 if (iv1 .eq. 14) iv1 = 12 + if (big .gt. tiny) go to 120 + tiny = rmdcon(1) + machep = rmdcon(3) + big = rmdcon(6) + vm(12) = machep + vx(12) = big + vx(13) = big + vm(14) = machep + vm(17) = tiny + vx(17) = big + vm(18) = tiny + vx(18) = big + vx(20) = big + vx(21) = big + vx(22) = big + vm(24) = machep + vm(25) = machep + vm(26) = machep + vx(28) = rmdcon(5) + vm(29) = machep + vx(30) = big + vm(33) = machep + 120 m = 0 + i = 1 + j = jlim(alg) + k = epslon + ndfalt = ndflt(alg) + do 150 l = 1, ndfalt + vk = v(k) + if (vk .ge. vm(i) .and. vk .le. vx(i)) go to 140 + m = k + if (pu .ne. 0) write(pu,130) vn(1,i), vn(2,i), k, vk, + 1 vm(i), vx(i) + 130 format(/6h /// ,2a4,5h.. v(,i2,3h) =,d11.3,7h should, + 1 11h be between,d11.3,4h and,d11.3) + 140 k = k + 1 + i = i + 1 + if (i .eq. j) i = ijmp + 150 continue +c + if (iv(nvdflt) .eq. ndfalt) go to 170 + iv(1) = 51 + if (pu .eq. 0) go to 999 + write(pu,160) iv(nvdflt), ndfalt + 160 format(/13h iv(nvdflt) =,i5,13h rather than ,i5) + go to 999 + 170 if ((iv(dtype) .gt. 0 .or. v(dinit) .gt. zero) .and. iv1 .eq. 12) + 1 go to 200 + do 190 i = 1, n + if (d(i) .gt. zero) go to 190 + m = 18 + if (pu .ne. 0) write(pu,180) i, d(i) + 180 format(/8h /// d(,i3,3h) =,d11.3,19h should be positive) + 190 continue + 200 if (m .eq. 0) go to 210 + iv(1) = m + go to 999 +c + 210 if (pu .eq. 0 .or. iv(parprt) .eq. 0) go to 999 + if (iv1 .ne. 12 .or. iv(inits) .eq. alg-1) go to 230 + m = 1 + write(pu,220) sh(alg), iv(inits) + 220 format(/22h nondefault values..../5h init,a1,14h..... iv(25) =, + 1 i3) + 230 if (iv(dtype) .eq. iv(dtype0)) go to 250 + if (m .eq. 0) write(pu,260) which + m = 1 + write(pu,240) iv(dtype) + 240 format(20h dtype..... iv(16) =,i3) + 250 i = 1 + j = jlim(alg) + k = epslon + l = iv(parsav) + ndfalt = ndflt(alg) + do 290 ii = 1, ndfalt + if (v(k) .eq. v(l)) go to 280 + if (m .eq. 0) write(pu,260) which + 260 format(/1h ,3a4,9halues..../) + m = 1 + write(pu,270) vn(1,i), vn(2,i), k, v(k) + 270 format(1x,2a4,5h.. v(,i2,3h) =,d15.7) + 280 k = k + 1 + l = l + 1 + i = i + 1 + if (i .eq. j) i = ijmp + 290 continue +c + iv(dtype0) = iv(dtype) + parsv1 = iv(parsav) + call vcopy(iv(nvdflt), v(parsv1), v(epslon)) + go to 999 +c + 300 iv(1) = 15 + if (pu .eq. 0) go to 999 + write(pu,310) liv, miv2 + 310 format(/10h /// liv =,i5,17h must be at least,i5) + if (liv .lt. miv1) go to 999 + if (lv .lt. iv(lastv)) go to 320 + go to 999 +c + 320 iv(1) = 16 + if (pu .eq. 0) go to 999 + write(pu,330) lv, iv(lastv) + 330 format(/9h /// lv =,i5,17h must be at least,i5) + go to 999 +c + 340 iv(1) = 67 + if (pu .eq. 0) go to 999 + write(pu,350) alg + 350 format(/10h /// alg =,i5,15h must be 1 or 2) +c + 999 return +c *** last card of parck follows *** + end + double precision function reldst(p, d, x, x0) +c +c *** compute and return relative difference between x and x0 *** +c *** nl2sol version 2.2 *** +c + integer p + double precision d(p), x(p), x0(p) +c/+ + double precision dabs +c/ + integer i + double precision emax, t, xmax, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + emax = zero + xmax = zero + do 10 i = 1, p + t = dabs(d(i) * (x(i) - x0(i))) + if (emax .lt. t) emax = t + t = d(i) * (dabs(x(i)) + dabs(x0(i))) + if (xmax .lt. t) xmax = t + 10 continue + reldst = zero + if (xmax .gt. zero) reldst = emax / xmax + 999 return +c *** last card of reldst follows *** + end +c logical function stopx(idummy) +c *****parameters... +c integer idummy +c +c .................................................................. +c +c *****purpose... +c this function may serve as the stopx (asynchronous interruption) +c function for the nl2sol (nonlinear least-squares) package at +c those installations which do not wish to implement a +c dynamic stopx. +c +c *****algorithm notes... +c at installations where the nl2sol system is used +c interactively, this dummy stopx should be replaced by a +c function that returns .true. if and only if the interrupt +c (break) key has been pressed since the last call on stopx. +c +c .................................................................. +c +c stopx = .false. +c return +c end + subroutine vaxpy(p, w, a, x, y) +c +c *** set w = a*x + y -- w, x, y = p-vectors, a = scalar *** +c + integer p + double precision a, w(p), x(p), y(p) +c + integer i +c + do 10 i = 1, p + 10 w(i) = a*x(i) + y(i) + return + end + subroutine vcopy(p, y, x) +c +c *** set y = x, where x and y are p-vectors *** +c + integer p + double precision x(p), y(p) +c + integer i +c + do 10 i = 1, p + 10 y(i) = x(i) + return + end + subroutine vdflt(alg, lv, v) +c +c *** supply ***sol (version 2.3) default values to v *** +c +c *** alg = 1 means regression constants. +c *** alg = 2 means general unconstrained optimization constants. +c + integer alg, l + double precision v(lv) +c/+ + double precision dmax1 +c/ + external rmdcon + double precision rmdcon +c rmdcon... returns machine-dependent constants +c + double precision machep, mepcrt, one, sqteps, three +c +c *** subscripts for v *** +c + integer afctol, bias, cosmin, decfac, delta0, dfac, dinit, dltfdc, + 1 dltfdj, dtinit, d0init, epslon, eta0, fuzz, huberc, + 2 incfac, lmax0, lmaxs, phmnfc, phmxfc, rdfcmn, rdfcmx, + 3 rfctol, rlimit, rsptol, sctol, sigmin, tuner1, tuner2, + 4 tuner3, tuner4, tuner5, xctol, xftol +c +c/6 +c data one/1.d+0/, three/3.d+0/ +c/7 + parameter (one=1.d+0, three=3.d+0) +c/ +c +c *** v subscript values *** +c +c/6 +c data afctol/31/, bias/43/, cosmin/47/, decfac/22/, delta0/44/, +c 1 dfac/41/, dinit/38/, dltfdc/42/, dltfdj/43/, dtinit/39/, +c 2 d0init/40/, epslon/19/, eta0/42/, fuzz/45/, huberc/48/, +c 3 incfac/23/, lmax0/35/, lmaxs/36/, phmnfc/20/, phmxfc/21/, +c 4 rdfcmn/24/, rdfcmx/25/, rfctol/32/, rlimit/46/, rsptol/49/, +c 5 sctol/37/, sigmin/50/, tuner1/26/, tuner2/27/, tuner3/28/, +c 6 tuner4/29/, tuner5/30/, xctol/33/, xftol/34/ +c/7 + parameter (afctol=31, bias=43, cosmin=47, decfac=22, delta0=44, + 1 dfac=41, dinit=38, dltfdc=42, dltfdj=43, dtinit=39, + 2 d0init=40, epslon=19, eta0=42, fuzz=45, huberc=48, + 3 incfac=23, lmax0=35, lmaxs=36, phmnfc=20, phmxfc=21, + 4 rdfcmn=24, rdfcmx=25, rfctol=32, rlimit=46, rsptol=49, + 5 sctol=37, sigmin=50, tuner1=26, tuner2=27, tuner3=28, + 6 tuner4=29, tuner5=30, xctol=33, xftol=34) +c/ +c +c------------------------------- body -------------------------------- +c + machep = rmdcon(3) + v(afctol) = 1.d-20 + if (machep .gt. 1.d-10) v(afctol) = machep**2 + v(decfac) = 0.5d+0 + sqteps = rmdcon(4) + v(dfac) = 0.6d+0 + v(delta0) = sqteps + v(dtinit) = 1.d-6 + mepcrt = machep ** (one/three) + v(d0init) = 1.d+0 + v(epslon) = 0.1d+0 + v(incfac) = 2.d+0 + v(lmax0) = 1.d+0 + v(lmaxs) = 1.d+0 + v(phmnfc) = -0.1d+0 + v(phmxfc) = 0.1d+0 + v(rdfcmn) = 0.1d+0 + v(rdfcmx) = 4.d+0 + v(rfctol) = dmax1(1.d-10, mepcrt**2) + v(sctol) = v(rfctol) + v(tuner1) = 0.1d+0 + v(tuner2) = 1.d-4 + v(tuner3) = 0.75d+0 + v(tuner4) = 0.5d+0 + v(tuner5) = 0.75d+0 + v(xctol) = sqteps + v(xftol) = 1.d+2 * machep +c + if (alg .ge. 2) go to 10 +c +c *** regression values +c + v(cosmin) = dmax1(1.d-6, 1.d+2 * machep) + v(dinit) = 0.d+0 + v(dltfdc) = mepcrt + v(dltfdj) = sqteps + v(fuzz) = 1.5d+0 + v(huberc) = 0.7d+0 + v(rlimit) = rmdcon(5) + v(rsptol) = 1.d-3 + v(sigmin) = 1.d-4 + go to 999 +c +c *** general optimization values +c + 10 v(bias) = 0.8d+0 + v(dinit) = -1.0d+0 + v(eta0) = 1.0d+3 * machep +c + 999 return +c *** last card of vdflt follows *** + end + subroutine vscopy(p, y, s) +c +c *** set p-vector y to scalar s *** +c + integer p + double precision s, y(p) +c + integer i +c + do 10 i = 1, p + 10 y(i) = s + return + end + double precision function v2norm(p, x) +c +c *** return the 2-norm of the p-vector x, taking *** +c *** care to avoid the most likely underflows. *** +c + integer p + double precision x(p) +c + integer i, j + double precision one, r, scale, sqteta, t, xi, zero +c/+ + double precision dabs, dsqrt +c/ + external rmdcon + double precision rmdcon +c +c/6 +c data one/1.d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, zero=0.d+0) + save sqteta +c/ + data sqteta/0.d+0/ +c + if (p .gt. 0) go to 10 + v2norm = zero + go to 999 + 10 do 20 i = 1, p + if (x(i) .ne. zero) go to 30 + 20 continue + v2norm = zero + go to 999 +c + 30 scale = dabs(x(i)) + if (i .lt. p) go to 40 + v2norm = scale + go to 999 + 40 t = one + if (sqteta .eq. zero) sqteta = rmdcon(2) +c +c *** sqteta is (slightly larger than) the square root of the +c *** smallest positive floating point number on the machine. +c *** the tests involving sqteta are done to prevent underflows. +c + j = i + 1 + do 60 i = j, p + xi = dabs(x(i)) + if (xi .gt. scale) go to 50 + r = xi / scale + if (r .gt. sqteta) t = t + r*r + go to 60 + 50 r = scale / xi + if (r .le. sqteta) r = zero + t = one + t * r*r + scale = xi + 60 continue +c + v2norm = scale * dsqrt(t) + 999 return +c *** last card of v2norm follows *** + end + subroutine humsl(n, d, x, calcf, calcgh, iv, liv, lv, v, + 1 uiparm, urparm, ufparm) +c +c *** minimize general unconstrained objective function using *** +c *** (analytic) gradient and hessian provided by the caller. *** +c + integer liv, lv, n + integer iv(liv), uiparm(1) + double precision d(n), x(n), v(lv), urparm(1) +c dimension v(78 + n*(n+12)), uiparm(*), urparm(*) + external calcf, calcgh, ufparm +c +c------------------------------ discussion --------------------------- +c +c this routine is like sumsl, except that the subroutine para- +c meter calcg of sumsl (which computes the gradient of the objec- +c tive function) is replaced by the subroutine parameter calcgh, +c which computes both the gradient and (lower triangle of the) +c hessian of the objective function. the calling sequence is... +c call calcgh(n, x, nf, g, h, uiparm, urparm, ufparm) +c parameters n, x, nf, g, uiparm, urparm, and ufparm are the same +c as for sumsl, while h is an array of length n*(n+1)/2 in which +c calcgh must store the lower triangle of the hessian at x. start- +c ing at h(1), calcgh must store the hessian entries in the order +c (1,1), (2,1), (2,2), (3,1), (3,2), (3,3), ... +c the value printed (by itsum) in the column labelled stppar +c is the levenberg-marquardt used in computing the current step. +c zero means a full newton step. if the special case described in +c ref. 1 is detected, then stppar is negated. the value printed +c in the column labelled npreldf is zero if the current hessian +c is not positive definite. +c it sometimes proves worthwhile to let d be determined from the +c diagonal of the hessian matrix by setting iv(dtype) = 1 and +c v(dinit) = 0. the following iv and v components are relevant... +c +c iv(dtol)..... iv(59) gives the starting subscript in v of the dtol +c array used when d is updated. (iv(dtol) can be +c initialized by calling humsl with iv(1) = 13.) +c iv(dtype).... iv(16) tells how the scale vector d should be chosen. +c iv(dtype) .le. 0 means that d should not be updated, and +c iv(dtype) .ge. 1 means that d should be updated as +c described below with v(dfac). default = 0. +c v(dfac)..... v(41) and the dtol and d0 arrays (see v(dtinit) and +c v(d0init)) are used in updating the scale vector d when +c iv(dtype) .gt. 0. (d is initialized according to +c v(dinit), described in sumsl.) let +c d1(i) = max(sqrt(abs(h(i,i))), v(dfac)*d(i)), +c where h(i,i) is the i-th diagonal element of the current +c hessian. if iv(dtype) = 1, then d(i) is set to d1(i) +c unless d1(i) .lt. dtol(i), in which case d(i) is set to +c max(d0(i), dtol(i)). +c if iv(dtype) .ge. 2, then d is updated during the first +c iteration as for iv(dtype) = 1 (after any initialization +c due to v(dinit)) and is left unchanged thereafter. +c default = 0.6. +c v(dtinit)... v(39), if positive, is the value to which all components +c of the dtol array (see v(dfac)) are initialized. if +c v(dtinit) = 0, then it is assumed that the caller has +c stored dtol in v starting at v(iv(dtol)). +c default = 10**-6. +c v(d0init)... v(40), if positive, is the value to which all components +c of the d0 vector (see v(dfac)) are initialized. if +c v(dfac) = 0, then it is assumed that the caller has +c stored d0 in v starting at v(iv(dtol)+n). default = 1.0. +c +c *** reference *** +c +c 1. gay, d.m. (1981), computing optimal locally constrained steps, +c siam j. sci. statist. comput. 2, pp. 186-197. +c. +c *** general *** +c +c coded by david m. gay (winter 1980). revised sept. 1982. +c this subroutine was written in connection with research supported +c in part by the national science foundation under grants +c mcs-7600324 and mcs-7906671. +c +c---------------------------- declarations --------------------------- +c + external deflt, humit +c +c deflt... provides default input values for iv and v. +c humit... reverse-communication routine that does humsl algorithm. +c + integer g1, h1, iv1, lh, nf + double precision f +c +c *** subscripts for iv *** +c + integer g, h, nextv, nfcall, nfgcal, toobig, vneed +c +c/6 +c data nextv/47/, nfcall/6/, nfgcal/7/, g/28/, h/56/, toobig/2/, +c 1 vneed/4/ +c/7 + parameter (nextv=47, nfcall=6, nfgcal=7, g=28, h=56, toobig=2, + 1 vneed=4) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + lh = n * (n + 1) / 2 + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + if (iv(1) .eq. 12 .or. iv(1) .eq. 13) + 1 iv(vneed) = iv(vneed) + n*(n+3)/2 + iv1 = iv(1) + if (iv1 .eq. 14) go to 10 + if (iv1 .gt. 2 .and. iv1 .lt. 12) go to 10 + g1 = 1 + h1 = 1 + if (iv1 .eq. 12) iv(1) = 13 + go to 20 +c + 10 g1 = iv(g) + h1 = iv(h) +c + 20 call humit(d, f, v(g1), v(h1), iv, lh, liv, lv, n, v, x) + if (iv(1) - 2) 30, 40, 50 +c + 30 nf = iv(nfcall) + call calcf(n, x, nf, f, uiparm, urparm, ufparm) + if (nf .le. 0) iv(toobig) = 1 + go to 20 +c + 40 call calcgh(n, x, iv(nfgcal), v(g1), v(h1), uiparm, urparm, + 1 ufparm) + go to 20 +c + 50 if (iv(1) .ne. 14) go to 999 +c +c *** storage allocation +c + iv(g) = iv(nextv) + iv(h) = iv(g) + n + iv(nextv) = iv(h) + n*(n+1)/2 + if (iv1 .ne. 13) go to 10 +c + 999 return +c *** last card of humsl follows *** + end + subroutine humit(d, fx, g, h, iv, lh, liv, lv, n, v, x) +c +c *** carry out humsl (unconstrained minimization) iterations, using +c *** hessian matrix provided by the caller. +c +c *** parameter declarations *** +c + integer lh, liv, lv, n + integer iv(liv) + double precision d(n), fx, g(n), h(lh), v(lv), x(n) +c +c-------------------------- parameter usage -------------------------- +c +c d.... scale vector. +c fx... function value. +c g.... gradient vector. +c h.... lower triangle of the hessian, stored rowwise. +c iv... integer value array. +c lh... length of h = p*(p+1)/2. +c liv.. length of iv (at least 60). +c lv... length of v (at least 78 + n*(n+21)/2). +c n.... number of variables (components in x and g). +c v.... floating-point value array. +c x.... parameter vector. +c +c *** discussion *** +c +c parameters iv, n, v, and x are the same as the corresponding +c ones to humsl (which see), except that v can be shorter (since +c the part of v that humsl uses for storing g and h is not needed). +c moreover, compared with humsl, iv(1) may have the two additional +c output values 1 and 2, which are explained below, as is the use +c of iv(toobig) and iv(nfgcal). the value iv(g), which is an +c output value from humsl, is not referenced by humit or the +c subroutines it calls. +c +c iv(1) = 1 means the caller should set fx to f(x), the function value +c at x, and call humit again, having changed none of the +c other parameters. an exception occurs if f(x) cannot be +c computed (e.g. if overflow would occur), which may happen +c because of an oversized step. in this case the caller +c should set iv(toobig) = iv(2) to 1, which will cause +c humit to ignore fx and try a smaller step. the para- +c meter nf that humsl passes to calcf (for possible use by +c calcgh) is a copy of iv(nfcall) = iv(6). +c iv(1) = 2 means the caller should set g to g(x), the gradient of f at +c x, and h to the lower triangle of h(x), the hessian of f +c at x, and call humit again, having changed none of the +c other parameters except perhaps the scale vector d. +c the parameter nf that humsl passes to calcg is +c iv(nfgcal) = iv(7). if g(x) and h(x) cannot be evaluated, +c then the caller may set iv(nfgcal) to 0, in which case +c humit will return with iv(1) = 65. +c note -- humit overwrites h with the lower triangle +c of diag(d)**-1 * h(x) * diag(d)**-1. +c. +c *** general *** +c +c coded by david m. gay (winter 1980). revised sept. 1982. +c this subroutine was written in connection with research supported +c in part by the national science foundation under grants +c mcs-7600324 and mcs-7906671. +c +c (see sumsl and humsl for references.) +c +c+++++++++++++++++++++++++++ declarations ++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer dg1, dummy, i, j, k, l, lstgst, nn1o2, step1, + 1 temp1, w1, x01 + double precision t +c +c *** constants *** +c + double precision one, onep2, zero +c +c *** no intrinsic functions *** +c +c *** external functions and subroutines *** +c + external assst, deflt, dotprd, dupdu, gqtst, itsum, parck, + 1 reldst, slvmul, stopx, vaxpy, vcopy, vscopy, v2norm + logical stopx + double precision dotprd, reldst, v2norm +c +c assst.... assesses candidate step. +c deflt.... provides default iv and v input values. +c dotprd... returns inner product of two vectors. +c dupdu.... updates scale vector d. +c gqtst.... computes optimally locally constrained step. +c itsum.... prints iteration summary and info on initial and final x. +c parck.... checks validity of input iv and v values. +c reldst... computes v(reldx) = relative step size. +c slvmul... multiplies symmetric matrix times vector, given the lower +c triangle of the matrix. +c stopx.... returns .true. if the break key has been pressed. +c vaxpy.... computes scalar times one vector plus another. +c vcopy.... copies one vector to another. +c vscopy... sets all elements of a vector to a scalar. +c v2norm... returns the 2-norm of a vector. +c +c *** subscripts for iv and v *** +c + integer cnvcod, dg, dgnorm, dinit, dstnrm, dtinit, dtol, + 1 dtype, d0init, f, f0, fdif, gtstep, incfac, irc, kagqt, + 2 lmat, lmax0, lmaxs, mode, model, mxfcal, mxiter, nextv, + 3 nfcall, nfgcal, ngcall, niter, preduc, radfac, radinc, + 4 radius, rad0, reldx, restor, step, stglim, stlstg, stppar, + 5 toobig, tuner4, tuner5, vneed, w, xirc, x0 +c +c *** iv subscript values *** +c +c/6 +c data cnvcod/55/, dg/37/, dtol/59/, dtype/16/, irc/29/, kagqt/33/, +c 1 lmat/42/, mode/35/, model/5/, mxfcal/17/, mxiter/18/, +c 2 nextv/47/, nfcall/6/, nfgcal/7/, ngcall/30/, niter/31/, +c 3 radinc/8/, restor/9/, step/40/, stglim/11/, stlstg/41/, +c 4 toobig/2/, vneed/4/, w/34/, xirc/13/, x0/43/ +c/7 + parameter (cnvcod=55, dg=37, dtol=59, dtype=16, irc=29, kagqt=33, + 1 lmat=42, mode=35, model=5, mxfcal=17, mxiter=18, + 2 nextv=47, nfcall=6, nfgcal=7, ngcall=30, niter=31, + 3 radinc=8, restor=9, step=40, stglim=11, stlstg=41, + 4 toobig=2, vneed=4, w=34, xirc=13, x0=43) +c/ +c +c *** v subscript values *** +c +c/6 +c data dgnorm/1/, dinit/38/, dstnrm/2/, dtinit/39/, d0init/40/, +c 1 f/10/, f0/13/, fdif/11/, gtstep/4/, incfac/23/, lmax0/35/, +c 2 lmaxs/36/, preduc/7/, radfac/16/, radius/8/, rad0/9/, +c 3 reldx/17/, stppar/5/, tuner4/29/, tuner5/30/ +c/7 + parameter (dgnorm=1, dinit=38, dstnrm=2, dtinit=39, d0init=40, + 1 f=10, f0=13, fdif=11, gtstep=4, incfac=23, lmax0=35, + 2 lmaxs=36, preduc=7, radfac=16, radius=8, rad0=9, + 3 reldx=17, stppar=5, tuner4=29, tuner5=30) +c/ +c +c/6 +c data one/1.d+0/, onep2/1.2d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, onep2=1.2d+0, zero=0.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + i = iv(1) + if (i .eq. 1) go to 30 + if (i .eq. 2) go to 40 +c +c *** check validity of iv and v input values *** +c + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + if (iv(1) .eq. 12 .or. iv(1) .eq. 13) + 1 iv(vneed) = iv(vneed) + n*(n+21)/2 + 7 + call parck(2, d, iv, liv, lv, n, v) + i = iv(1) - 2 + if (i .gt. 12) go to 999 + nn1o2 = n * (n + 1) / 2 + if (lh .ge. nn1o2) go to (210,210,210,210,210,210,160,120,160, + 1 10,10,20), i + iv(1) = 66 + go to 350 +c +c *** storage allocation *** +c + 10 iv(dtol) = iv(lmat) + nn1o2 + iv(x0) = iv(dtol) + 2*n + iv(step) = iv(x0) + n + iv(stlstg) = iv(step) + n + iv(dg) = iv(stlstg) + n + iv(w) = iv(dg) + n + iv(nextv) = iv(w) + 4*n + 7 + if (iv(1) .ne. 13) go to 20 + iv(1) = 14 + go to 999 +c +c *** initialization *** +c + 20 iv(niter) = 0 + iv(nfcall) = 1 + iv(ngcall) = 1 + iv(nfgcal) = 1 + iv(mode) = -1 + iv(model) = 1 + iv(stglim) = 1 + iv(toobig) = 0 + iv(cnvcod) = 0 + iv(radinc) = 0 + v(rad0) = zero + v(stppar) = zero + if (v(dinit) .ge. zero) call vscopy(n, d, v(dinit)) + k = iv(dtol) + if (v(dtinit) .gt. zero) call vscopy(n, v(k), v(dtinit)) + k = k + n + if (v(d0init) .gt. zero) call vscopy(n, v(k), v(d0init)) + iv(1) = 1 + go to 999 +c + 30 v(f) = fx + if (iv(mode) .ge. 0) go to 210 + iv(1) = 2 + if (iv(toobig) .eq. 0) go to 999 + iv(1) = 63 + go to 350 +c +c *** make sure gradient could be computed *** +c + 40 if (iv(nfgcal) .ne. 0) go to 50 + iv(1) = 65 + go to 350 +c +c *** update the scale vector d *** +c + 50 dg1 = iv(dg) + if (iv(dtype) .le. 0) go to 70 + k = dg1 + j = 0 + do 60 i = 1, n + j = j + i + v(k) = h(j) + k = k + 1 + 60 continue + call dupdu(d, v(dg1), iv, liv, lv, n, v) +c +c *** compute scaled gradient and its norm *** +c + 70 dg1 = iv(dg) + k = dg1 + do 80 i = 1, n + v(k) = g(i) / d(i) + k = k + 1 + 80 continue + v(dgnorm) = v2norm(n, v(dg1)) +c +c *** compute scaled hessian *** +c + k = 1 + do 100 i = 1, n + t = one / d(i) + do 90 j = 1, i + h(k) = t * h(k) / d(j) + k = k + 1 + 90 continue + 100 continue +c + if (iv(cnvcod) .ne. 0) go to 340 + if (iv(mode) .eq. 0) go to 300 +c +c *** allow first step to have scaled 2-norm at most v(lmax0) *** +c + v(radius) = v(lmax0) +c + iv(mode) = 0 +c +c +c----------------------------- main loop ----------------------------- +c +c +c *** print iteration summary, check iteration limit *** +c + 110 call itsum(d, g, iv, liv, lv, n, v, x) + 120 k = iv(niter) + if (k .lt. iv(mxiter)) go to 130 + iv(1) = 10 + go to 350 +c + 130 iv(niter) = k + 1 +c +c *** initialize for start of next iteration *** +c + dg1 = iv(dg) + x01 = iv(x0) + v(f0) = v(f) + iv(irc) = 4 + iv(kagqt) = -1 +c +c *** copy x to x0 *** +c + call vcopy(n, v(x01), x) +c +c *** update radius *** +c + if (k .eq. 0) go to 150 + step1 = iv(step) + k = step1 + do 140 i = 1, n + v(k) = d(i) * v(k) + k = k + 1 + 140 continue + v(radius) = v(radfac) * v2norm(n, v(step1)) +c +c *** check stopx and function evaluation limit *** +c +C AL 4/30/95 + dummy=iv(nfcall) + 150 if (.not. stopx(dummy)) go to 170 + iv(1) = 11 + go to 180 +c +c *** come here when restarting after func. eval. limit or stopx. +c + 160 if (v(f) .ge. v(f0)) go to 170 + v(radfac) = one + k = iv(niter) + go to 130 +c + 170 if (iv(nfcall) .lt. iv(mxfcal)) go to 190 + iv(1) = 9 + 180 if (v(f) .ge. v(f0)) go to 350 +c +c *** in case of stopx or function evaluation limit with +c *** improved v(f), evaluate the gradient at x. +c + iv(cnvcod) = iv(1) + go to 290 +c +c. . . . . . . . . . . . . compute candidate step . . . . . . . . . . +c + 190 step1 = iv(step) + dg1 = iv(dg) + l = iv(lmat) + w1 = iv(w) + call gqtst(d, v(dg1), h, iv(kagqt), v(l), n, v(step1), v, v(w1)) + if (iv(irc) .eq. 6) go to 210 +c +c *** check whether evaluating f(x0 + step) looks worthwhile *** +c + if (v(dstnrm) .le. zero) go to 210 + if (iv(irc) .ne. 5) go to 200 + if (v(radfac) .le. one) go to 200 + if (v(preduc) .le. onep2 * v(fdif)) go to 210 +c +c *** compute f(x0 + step) *** +c + 200 x01 = iv(x0) + step1 = iv(step) + call vaxpy(n, x, one, v(step1), v(x01)) + iv(nfcall) = iv(nfcall) + 1 + iv(1) = 1 + iv(toobig) = 0 + go to 999 +c +c. . . . . . . . . . . . . assess candidate step . . . . . . . . . . . +c + 210 x01 = iv(x0) + v(reldx) = reldst(n, d, x, v(x01)) + call assst(iv, liv, lv, v) + step1 = iv(step) + lstgst = iv(stlstg) + if (iv(restor) .eq. 1) call vcopy(n, x, v(x01)) + if (iv(restor) .eq. 2) call vcopy(n, v(lstgst), v(step1)) + if (iv(restor) .ne. 3) go to 220 + call vcopy(n, v(step1), v(lstgst)) + call vaxpy(n, x, one, v(step1), v(x01)) + v(reldx) = reldst(n, d, x, v(x01)) +c + 220 k = iv(irc) + go to (230,260,260,260,230,240,250,250,250,250,250,250,330,300), k +c +c *** recompute step with new radius *** +c + 230 v(radius) = v(radfac) * v(dstnrm) + go to 150 +c +c *** compute step of length v(lmaxs) for singular convergence test. +c + 240 v(radius) = v(lmaxs) + go to 190 +c +c *** convergence or false convergence *** +c + 250 iv(cnvcod) = k - 4 + if (v(f) .ge. v(f0)) go to 340 + if (iv(xirc) .eq. 14) go to 340 + iv(xirc) = 14 +c +c. . . . . . . . . . . . process acceptable step . . . . . . . . . . . +c + 260 if (iv(irc) .ne. 3) go to 290 + temp1 = lstgst +c +c *** prepare for gradient tests *** +c *** set temp1 = hessian * step + g(x0) +c *** = diag(d) * (h * step + g(x0)) +c +c use x0 vector as temporary. + k = x01 + do 270 i = 1, n + v(k) = d(i) * v(step1) + k = k + 1 + step1 = step1 + 1 + 270 continue + call slvmul(n, v(temp1), h, v(x01)) + do 280 i = 1, n + v(temp1) = d(i) * v(temp1) + g(i) + temp1 = temp1 + 1 + 280 continue +c +c *** compute gradient and hessian *** +c + 290 iv(ngcall) = iv(ngcall) + 1 + iv(1) = 2 + go to 999 +c + 300 iv(1) = 2 + if (iv(irc) .ne. 3) go to 110 +c +c *** set v(radfac) by gradient tests *** +c + temp1 = iv(stlstg) + step1 = iv(step) +c +c *** set temp1 = diag(d)**-1 * (hessian*step + (g(x0)-g(x))) *** +c + k = temp1 + do 310 i = 1, n + v(k) = (v(k) - g(i)) / d(i) + k = k + 1 + 310 continue +c +c *** do gradient tests *** +c + if (v2norm(n, v(temp1)) .le. v(dgnorm) * v(tuner4)) go to 320 + if (dotprd(n, g, v(step1)) + 1 .ge. v(gtstep) * v(tuner5)) go to 110 + 320 v(radfac) = v(incfac) + go to 110 +c +c. . . . . . . . . . . . . . misc. details . . . . . . . . . . . . . . +c +c *** bad parameters to assess *** +c + 330 iv(1) = 64 + go to 350 +c +c *** print summary of final iteration and other requested items *** +c + 340 iv(1) = iv(cnvcod) + iv(cnvcod) = 0 + 350 call itsum(d, g, iv, liv, lv, n, v, x) +c + 999 return +c +c *** last card of humit follows *** + end + subroutine dupdu(d, hdiag, iv, liv, lv, n, v) +c +c *** update scale vector d for humsl *** +c +c *** parameter declarations *** +c + integer liv, lv, n + integer iv(liv) + double precision d(n), hdiag(n), v(lv) +c +c *** local variables *** +c + integer dtoli, d0i, i + double precision t, vdfac +c +c *** intrinsic functions *** +c/+ + double precision dabs, dmax1, dsqrt +c/ +c *** subscripts for iv and v *** +c + integer dfac, dtol, dtype, niter +c/6 +c data dfac/41/, dtol/59/, dtype/16/, niter/31/ +c/7 + parameter (dfac=41, dtol=59, dtype=16, niter=31) +c/ +c +c------------------------------- body -------------------------------- +c + i = iv(dtype) + if (i .eq. 1) go to 10 + if (iv(niter) .gt. 0) go to 999 +c + 10 dtoli = iv(dtol) + d0i = dtoli + n + vdfac = v(dfac) + do 20 i = 1, n + t = dmax1(dsqrt(dabs(hdiag(i))), vdfac*d(i)) + if (t .lt. v(dtoli)) t = dmax1(v(dtoli), v(d0i)) + d(i) = t + dtoli = dtoli + 1 + d0i = d0i + 1 + 20 continue +c + 999 return +c *** last card of dupdu follows *** + end + subroutine gqtst(d, dig, dihdi, ka, l, p, step, v, w) +c +c *** compute goldfeld-quandt-trotter step by more-hebden technique *** +c *** (nl2sol version 2.2), modified a la more and sorensen *** +c +c *** parameter declarations *** +c + integer ka, p +cal double precision d(p), dig(p), dihdi(1), l(1), v(21), step(p), +cal 1 w(1) + double precision d(p), dig(p), dihdi(p*(p+1)/2), l(p*(p+1)/2), + 1 v(21), step(p),w(4*p+7) +c dimension dihdi(p*(p+1)/2), l(p*(p+1)/2), w(4*p+7) +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** purpose *** +c +c given the (compactly stored) lower triangle of a scaled +c hessian (approximation) and a nonzero scaled gradient vector, +c this subroutine computes a goldfeld-quandt-trotter step of +c approximate length v(radius) by the more-hebden technique. in +c other words, step is computed to (approximately) minimize +c psi(step) = (g**t)*step + 0.5*(step**t)*h*step such that the +c 2-norm of d*step is at most (approximately) v(radius), where +c g is the gradient, h is the hessian, and d is a diagonal +c scale matrix whose diagonal is stored in the parameter d. +c (gqtst assumes dig = d**-1 * g and dihdi = d**-1 * h * d**-1.) +c +c *** parameter description *** +c +c d (in) = the scale vector, i.e. the diagonal of the scale +c matrix d mentioned above under purpose. +c dig (in) = the scaled gradient vector, d**-1 * g. if g = 0, then +c step = 0 and v(stppar) = 0 are returned. +c dihdi (in) = lower triangle of the scaled hessian (approximation), +c i.e., d**-1 * h * d**-1, stored compactly by rows., i.e., +c in the order (1,1), (2,1), (2,2), (3,1), (3,2), etc. +c ka (i/o) = the number of hebden iterations (so far) taken to deter- +c mine step. ka .lt. 0 on input means this is the first +c attempt to determine step (for the present dig and dihdi) +c -- ka is initialized to 0 in this case. output with +c ka = 0 (or v(stppar) = 0) means step = -(h**-1)*g. +c l (i/o) = workspace of length p*(p+1)/2 for cholesky factors. +c p (in) = number of parameters -- the hessian is a p x p matrix. +c step (i/o) = the step computed. +c v (i/o) contains various constants and variables described below. +c w (i/o) = workspace of length 4*p + 6. +c +c *** entries in v *** +c +c v(dgnorm) (i/o) = 2-norm of (d**-1)*g. +c v(dstnrm) (output) = 2-norm of d*step. +c v(dst0) (i/o) = 2-norm of d*(h**-1)*g (for pos. def. h only), or +c overestimate of smallest eigenvalue of (d**-1)*h*(d**-1). +c v(epslon) (in) = max. rel. error allowed for psi(step). for the +c step returned, psi(step) will exceed its optimal value +c by less than -v(epslon)*psi(step). suggested value = 0.1. +c v(gtstep) (out) = inner product between g and step. +c v(nreduc) (out) = psi(-(h**-1)*g) = psi(newton step) (for pos. def. +c h only -- v(nreduc) is set to zero otherwise). +c v(phmnfc) (in) = tol. (together with v(phmxfc)) for accepting step +c (more*s sigma). the error v(dstnrm) - v(radius) must lie +c between v(phmnfc)*v(radius) and v(phmxfc)*v(radius). +c v(phmxfc) (in) (see v(phmnfc).) +c suggested values -- v(phmnfc) = -0.25, v(phmxfc) = 0.5. +c v(preduc) (out) = psi(step) = predicted obj. func. reduction for step. +c v(radius) (in) = radius of current (scaled) trust region. +c v(rad0) (i/o) = value of v(radius) from previous call. +c v(stppar) (i/o) is normally the marquardt parameter, i.e. the alpha +c described below under algorithm notes. if h + alpha*d**2 +c (see algorithm notes) is (nearly) singular, however, +c then v(stppar) = -alpha. +c +c *** usage notes *** +c +c if it is desired to recompute step using a different value of +c v(radius), then this routine may be restarted by calling it +c with all parameters unchanged except v(radius). (this explains +c why step and w are listed as i/o). on an initial call (one with +c ka .lt. 0), step and w need not be initialized and only compo- +c nents v(epslon), v(stppar), v(phmnfc), v(phmxfc), v(radius), and +c v(rad0) of v must be initialized. +c +c *** algorithm notes *** +c +c the desired g-q-t step (ref. 2, 3, 4, 6) satisfies +c (h + alpha*d**2)*step = -g for some nonnegative alpha such that +c h + alpha*d**2 is positive semidefinite. alpha and step are +c computed by a scheme analogous to the one described in ref. 5. +c estimates of the smallest and largest eigenvalues of the hessian +c are obtained from the gerschgorin circle theorem enhanced by a +c simple form of the scaling described in ref. 7. cases in which +c h + alpha*d**2 is nearly (or exactly) singular are handled by +c the technique discussed in ref. 2. in these cases, a step of +c (exact) length v(radius) is returned for which psi(step) exceeds +c its optimal value by less than -v(epslon)*psi(step). the test +c suggested in ref. 6 for detecting the special case is performed +c once two matrix factorizations have been done -- doing so sooner +c seems to degrade the performance of optimization routines that +c call this routine. +c +c *** functions and subroutines called *** +c +c dotprd - returns inner product of two vectors. +c litvmu - applies inverse-transpose of compact lower triang. matrix. +c livmul - applies inverse of compact lower triang. matrix. +c lsqrt - finds cholesky factor (of compactly stored lower triang.). +c lsvmin - returns approx. to min. sing. value of lower triang. matrix. +c rmdcon - returns machine-dependent constants. +c v2norm - returns 2-norm of a vector. +c +c *** references *** +c +c 1. dennis, j.e., gay, d.m., and welsch, r.e. (1981), an adaptive +c nonlinear least-squares algorithm, acm trans. math. +c software, vol. 7, no. 3. +c 2. gay, d.m. (1981), computing optimal locally constrained steps, +c siam j. sci. statist. computing, vol. 2, no. 2, pp. +c 186-197. +c 3. goldfeld, s.m., quandt, r.e., and trotter, h.f. (1966), +c maximization by quadratic hill-climbing, econometrica 34, +c pp. 541-551. +c 4. hebden, m.d. (1973), an algorithm for minimization using exact +c second derivatives, report t.p. 515, theoretical physics +c div., a.e.r.e. harwell, oxon., england. +c 5. more, j.j. (1978), the levenberg-marquardt algorithm, implemen- +c tation and theory, pp.105-116 of springer lecture notes +c in mathematics no. 630, edited by g.a. watson, springer- +c verlag, berlin and new york. +c 6. more, j.j., and sorensen, d.c. (1981), computing a trust region +c step, technical report anl-81-83, argonne national lab. +c 7. varga, r.s. (1965), minimal gerschgorin sets, pacific j. math. 15, +c pp. 719-729. +c +c *** general *** +c +c coded by david m. gay. +c this subroutine was written in connection with research +c supported by the national science foundation under grants +c mcs-7600324, dcr75-10143, 76-14311dss, mcs76-11989, and +c mcs-7906671. +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** local variables *** +c + logical restrt + integer dggdmx, diag, diag0, dstsav, emax, emin, i, im1, inc, irc, + 1 j, k, kalim, kamin, k1, lk0, phipin, q, q0, uk0, x + double precision alphak, aki, akk, delta, dst, eps, gtsta, lk, + 1 oldphi, phi, phimax, phimin, psifac, rad, radsq, + 2 root, si, sk, sw, t, twopsi, t1, t2, uk, wi +c +c *** constants *** + double precision big, dgxfac, epsfac, four, half, kappa, negone, + 1 one, p001, six, three, two, zero +c +c *** intrinsic functions *** +c/+ + double precision dabs, dmax1, dmin1, dsqrt +c/ +c *** external functions and subroutines *** +c + external dotprd, litvmu, livmul, lsqrt, lsvmin, rmdcon, v2norm + double precision dotprd, lsvmin, rmdcon, v2norm +c +c *** subscripts for v *** +c + integer dgnorm, dstnrm, dst0, epslon, gtstep, stppar, nreduc, + 1 phmnfc, phmxfc, preduc, radius, rad0 +c/6 +c data dgnorm/1/, dstnrm/2/, dst0/3/, epslon/19/, gtstep/4/, +c 1 nreduc/6/, phmnfc/20/, phmxfc/21/, preduc/7/, radius/8/, +c 2 rad0/9/, stppar/5/ +c/7 + parameter (dgnorm=1, dstnrm=2, dst0=3, epslon=19, gtstep=4, + 1 nreduc=6, phmnfc=20, phmxfc=21, preduc=7, radius=8, + 2 rad0=9, stppar=5) +c/ +c +c/6 +c data epsfac/50.0d+0/, four/4.0d+0/, half/0.5d+0/, +c 1 kappa/2.0d+0/, negone/-1.0d+0/, one/1.0d+0/, p001/1.0d-3/, +c 2 six/6.0d+0/, three/3.0d+0/, two/2.0d+0/, zero/0.0d+0/ +c/7 + parameter (epsfac=50.0d+0, four=4.0d+0, half=0.5d+0, + 1 kappa=2.0d+0, negone=-1.0d+0, one=1.0d+0, p001=1.0d-3, + 2 six=6.0d+0, three=3.0d+0, two=2.0d+0, zero=0.0d+0) + save dgxfac +c/ + data big/0.d+0/, dgxfac/0.d+0/ +c +c *** body *** +c +c *** store largest abs. entry in (d**-1)*h*(d**-1) at w(dggdmx). + dggdmx = p + 1 +c *** store gerschgorin over- and underestimates of the largest +c *** and smallest eigenvalues of (d**-1)*h*(d**-1) at w(emax) +c *** and w(emin) respectively. + emax = dggdmx + 1 + emin = emax + 1 +c *** for use in recomputing step, the final values of lk, uk, dst, +c *** and the inverse derivative of more*s phi at 0 (for pos. def. +c *** h) are stored in w(lk0), w(uk0), w(dstsav), and w(phipin) +c *** respectively. + lk0 = emin + 1 + phipin = lk0 + 1 + uk0 = phipin + 1 + dstsav = uk0 + 1 +c *** store diag of (d**-1)*h*(d**-1) in w(diag),...,w(diag0+p). + diag0 = dstsav + diag = diag0 + 1 +c *** store -d*step in w(q),...,w(q0+p). + q0 = diag0 + p + q = q0 + 1 +c *** allocate storage for scratch vector x *** + x = q + p + rad = v(radius) + radsq = rad**2 +c *** phitol = max. error allowed in dst = v(dstnrm) = 2-norm of +c *** d*step. + phimax = v(phmxfc) * rad + phimin = v(phmnfc) * rad + psifac = two * v(epslon) / (three * (four * (v(phmnfc) + one) * + 1 (kappa + one) + kappa + two) * rad**2) +c *** oldphi is used to detect limits of numerical accuracy. if +c *** we recompute step and it does not change, then we accept it. + oldphi = zero + eps = v(epslon) + irc = 0 + restrt = .false. + kalim = ka + 50 +c +c *** start or restart, depending on ka *** +c + if (ka .ge. 0) go to 290 +c +c *** fresh start *** +c + k = 0 + uk = negone + ka = 0 + kalim = 50 + v(dgnorm) = v2norm(p, dig) + v(nreduc) = zero + v(dst0) = zero + kamin = 3 + if (v(dgnorm) .eq. zero) kamin = 0 +c +c *** store diag(dihdi) in w(diag0+1),...,w(diag0+p) *** +c + j = 0 + do 10 i = 1, p + j = j + i + k1 = diag0 + i + w(k1) = dihdi(j) + 10 continue +c +c *** determine w(dggdmx), the largest element of dihdi *** +c + t1 = zero + j = p * (p + 1) / 2 + do 20 i = 1, j + t = dabs(dihdi(i)) + if (t1 .lt. t) t1 = t + 20 continue + w(dggdmx) = t1 +c +c *** try alpha = 0 *** +c + 30 call lsqrt(1, p, l, dihdi, irc) + if (irc .eq. 0) go to 50 +c *** indef. h -- underestimate smallest eigenvalue, use this +c *** estimate to initialize lower bound lk on alpha. + j = irc*(irc+1)/2 + t = l(j) + l(j) = one + do 40 i = 1, irc + 40 w(i) = zero + w(irc) = one + call litvmu(irc, w, l, w) + t1 = v2norm(irc, w) + lk = -t / t1 / t1 + v(dst0) = -lk + if (restrt) go to 210 + go to 70 +c +c *** positive definite h -- compute unmodified newton step. *** + 50 lk = zero + t = lsvmin(p, l, w(q), w(q)) + if (t .ge. one) go to 60 + if (big .le. zero) big = rmdcon(6) + if (v(dgnorm) .ge. t*t*big) go to 70 + 60 call livmul(p, w(q), l, dig) + gtsta = dotprd(p, w(q), w(q)) + v(nreduc) = half * gtsta + call litvmu(p, w(q), l, w(q)) + dst = v2norm(p, w(q)) + v(dst0) = dst + phi = dst - rad + if (phi .le. phimax) go to 260 + if (restrt) go to 210 +c +c *** prepare to compute gerschgorin estimates of largest (and +c *** smallest) eigenvalues. *** +c + 70 k = 0 + do 100 i = 1, p + wi = zero + if (i .eq. 1) go to 90 + im1 = i - 1 + do 80 j = 1, im1 + k = k + 1 + t = dabs(dihdi(k)) + wi = wi + t + w(j) = w(j) + t + 80 continue + 90 w(i) = wi + k = k + 1 + 100 continue +c +c *** (under-)estimate smallest eigenvalue of (d**-1)*h*(d**-1) *** +c + k = 1 + t1 = w(diag) - w(1) + if (p .le. 1) go to 120 + do 110 i = 2, p + j = diag0 + i + t = w(j) - w(i) + if (t .ge. t1) go to 110 + t1 = t + k = i + 110 continue +c + 120 sk = w(k) + j = diag0 + k + akk = w(j) + k1 = k*(k-1)/2 + 1 + inc = 1 + t = zero + do 150 i = 1, p + if (i .eq. k) go to 130 + aki = dabs(dihdi(k1)) + si = w(i) + j = diag0 + i + t1 = half * (akk - w(j) + si - aki) + t1 = t1 + dsqrt(t1*t1 + sk*aki) + if (t .lt. t1) t = t1 + if (i .lt. k) go to 140 + 130 inc = i + 140 k1 = k1 + inc + 150 continue +c + w(emin) = akk - t + uk = v(dgnorm)/rad - w(emin) + if (v(dgnorm) .eq. zero) uk = uk + p001 + p001*uk + if (uk .le. zero) uk = p001 +c +c *** compute gerschgorin (over-)estimate of largest eigenvalue *** +c + k = 1 + t1 = w(diag) + w(1) + if (p .le. 1) go to 170 + do 160 i = 2, p + j = diag0 + i + t = w(j) + w(i) + if (t .le. t1) go to 160 + t1 = t + k = i + 160 continue +c + 170 sk = w(k) + j = diag0 + k + akk = w(j) + k1 = k*(k-1)/2 + 1 + inc = 1 + t = zero + do 200 i = 1, p + if (i .eq. k) go to 180 + aki = dabs(dihdi(k1)) + si = w(i) + j = diag0 + i + t1 = half * (w(j) + si - aki - akk) + t1 = t1 + dsqrt(t1*t1 + sk*aki) + if (t .lt. t1) t = t1 + if (i .lt. k) go to 190 + 180 inc = i + 190 k1 = k1 + inc + 200 continue +c + w(emax) = akk + t + lk = dmax1(lk, v(dgnorm)/rad - w(emax)) +c +c *** alphak = current value of alpha (see alg. notes above). we +c *** use more*s scheme for initializing it. + alphak = dabs(v(stppar)) * v(rad0)/rad +c + if (irc .ne. 0) go to 210 +c +c *** compute l0 for positive definite h *** +c + call livmul(p, w, l, w(q)) + t = v2norm(p, w) + w(phipin) = dst / t / t + lk = dmax1(lk, phi*w(phipin)) +c +c *** safeguard alphak and add alphak*i to (d**-1)*h*(d**-1) *** +c + 210 ka = ka + 1 + if (-v(dst0) .ge. alphak .or. alphak .lt. lk .or. alphak .ge. uk) + 1 alphak = uk * dmax1(p001, dsqrt(lk/uk)) + if (alphak .le. zero) alphak = half * uk + if (alphak .le. zero) alphak = uk + k = 0 + do 220 i = 1, p + k = k + i + j = diag0 + i + dihdi(k) = w(j) + alphak + 220 continue +c +c *** try computing cholesky decomposition *** +c + call lsqrt(1, p, l, dihdi, irc) + if (irc .eq. 0) go to 240 +c +c *** (d**-1)*h*(d**-1) + alphak*i is indefinite -- overestimate +c *** smallest eigenvalue for use in updating lk *** +c + j = (irc*(irc+1))/2 + t = l(j) + l(j) = one + do 230 i = 1, irc + 230 w(i) = zero + w(irc) = one + call litvmu(irc, w, l, w) + t1 = v2norm(irc, w) + lk = alphak - t/t1/t1 + v(dst0) = -lk + go to 210 +c +c *** alphak makes (d**-1)*h*(d**-1) positive definite. +c *** compute q = -d*step, check for convergence. *** +c + 240 call livmul(p, w(q), l, dig) + gtsta = dotprd(p, w(q), w(q)) + call litvmu(p, w(q), l, w(q)) + dst = v2norm(p, w(q)) + phi = dst - rad + if (phi .le. phimax .and. phi .ge. phimin) go to 270 + if (phi .eq. oldphi) go to 270 + oldphi = phi + if (phi .lt. zero) go to 330 +c +c *** unacceptable alphak -- update lk, uk, alphak *** +c + 250 if (ka .ge. kalim) go to 270 +c *** the following dmin1 is necessary because of restarts *** + if (phi .lt. zero) uk = dmin1(uk, alphak) +c *** kamin = 0 only iff the gradient vanishes *** + if (kamin .eq. 0) go to 210 + call livmul(p, w, l, w(q)) + t1 = v2norm(p, w) + alphak = alphak + (phi/t1) * (dst/t1) * (dst/rad) + lk = dmax1(lk, alphak) + go to 210 +c +c *** acceptable step on first try *** +c + 260 alphak = zero +c +c *** successful step in general. compute step = -(d**-1)*q *** +c + 270 do 280 i = 1, p + j = q0 + i + step(i) = -w(j)/d(i) + 280 continue + v(gtstep) = -gtsta + v(preduc) = half * (dabs(alphak)*dst*dst + gtsta) + go to 410 +c +c +c *** restart with new radius *** +c + 290 if (v(dst0) .le. zero .or. v(dst0) - rad .gt. phimax) go to 310 +c +c *** prepare to return newton step *** +c + restrt = .true. + ka = ka + 1 + k = 0 + do 300 i = 1, p + k = k + i + j = diag0 + i + dihdi(k) = w(j) + 300 continue + uk = negone + go to 30 +c + 310 kamin = ka + 3 + if (v(dgnorm) .eq. zero) kamin = 0 + if (ka .eq. 0) go to 50 +c + dst = w(dstsav) + alphak = dabs(v(stppar)) + phi = dst - rad + t = v(dgnorm)/rad + uk = t - w(emin) + if (v(dgnorm) .eq. zero) uk = uk + p001 + p001*uk + if (uk .le. zero) uk = p001 + if (rad .gt. v(rad0)) go to 320 +c +c *** smaller radius *** + lk = zero + if (alphak .gt. zero) lk = w(lk0) + lk = dmax1(lk, t - w(emax)) + if (v(dst0) .gt. zero) lk = dmax1(lk, (v(dst0)-rad)*w(phipin)) + go to 250 +c +c *** bigger radius *** + 320 if (alphak .gt. zero) uk = dmin1(uk, w(uk0)) + lk = dmax1(zero, -v(dst0), t - w(emax)) + if (v(dst0) .gt. zero) lk = dmax1(lk, (v(dst0)-rad)*w(phipin)) + go to 250 +c +c *** decide whether to check for special case... in practice (from +c *** the standpoint of the calling optimization code) it seems best +c *** not to check until a few iterations have failed -- hence the +c *** test on kamin below. +c + 330 delta = alphak + dmin1(zero, v(dst0)) + twopsi = alphak*dst*dst + gtsta + if (ka .ge. kamin) go to 340 +c *** if the test in ref. 2 is satisfied, fall through to handle +c *** the special case (as soon as the more-sorensen test detects +c *** it). + if (delta .ge. psifac*twopsi) go to 370 +c +c *** check for the special case of h + alpha*d**2 (nearly) +c *** singular. use one step of inverse power method with start +c *** from lsvmin to obtain approximate eigenvector corresponding +c *** to smallest eigenvalue of (d**-1)*h*(d**-1). lsvmin returns +c *** x and w with l*w = x. +c + 340 t = lsvmin(p, l, w(x), w) +c +c *** normalize w *** + do 350 i = 1, p + 350 w(i) = t*w(i) +c *** complete current inv. power iter. -- replace w by (l**-t)*w. + call litvmu(p, w, l, w) + t2 = one/v2norm(p, w) + do 360 i = 1, p + 360 w(i) = t2*w(i) + t = t2 * t +c +c *** now w is the desired approximate (unit) eigenvector and +c *** t*x = ((d**-1)*h*(d**-1) + alphak*i)*w. +c + sw = dotprd(p, w(q), w) + t1 = (rad + dst) * (rad - dst) + root = dsqrt(sw*sw + t1) + if (sw .lt. zero) root = -root + si = t1 / (sw + root) +c +c *** the actual test for the special case... +c + if ((t2*si)**2 .le. eps*(dst**2 + alphak*radsq)) go to 380 +c +c *** update upper bound on smallest eigenvalue (when not positive) +c *** (as recommended by more and sorensen) and continue... +c + if (v(dst0) .le. zero) v(dst0) = dmin1(v(dst0), t2**2 - alphak) + lk = dmax1(lk, -v(dst0)) +c +c *** check whether we can hope to detect the special case in +c *** the available arithmetic. accept step as it is if not. +c +c *** if not yet available, obtain machine dependent value dgxfac. + 370 if (dgxfac .eq. zero) dgxfac = epsfac * rmdcon(3) +c + if (delta .gt. dgxfac*w(dggdmx)) go to 250 + go to 270 +c +c *** special case detected... negate alphak to indicate special case +c + 380 alphak = -alphak + v(preduc) = half * twopsi +c +c *** accept current step if adding si*w would lead to a +c *** further relative reduction in psi of less than v(epslon)/3. +c + t1 = zero + t = si*(alphak*sw - half*si*(alphak + t*dotprd(p,w(x),w))) + if (t .lt. eps*twopsi/six) go to 390 + v(preduc) = v(preduc) + t + dst = rad + t1 = -si + 390 do 400 i = 1, p + j = q0 + i + w(j) = t1*w(i) - w(j) + step(i) = w(j) / d(i) + 400 continue + v(gtstep) = dotprd(p, dig, w(q)) +c +c *** save values for use in a possible restart *** +c + 410 v(dstnrm) = dst + v(stppar) = alphak + w(lk0) = lk + w(uk0) = uk + v(rad0) = rad + w(dstsav) = dst +c +c *** restore diagonal of dihdi *** +c + j = 0 + do 420 i = 1, p + j = j + i + k = diag0 + i + dihdi(j) = w(k) + 420 continue +c + 999 return +c +c *** last card of gqtst follows *** + end + subroutine lsqrt(n1, n, l, a, irc) +c +c *** compute rows n1 through n of the cholesky factor l of +c *** a = l*(l**t), where l and the lower triangle of a are both +c *** stored compactly by rows (and may occupy the same storage). +c *** irc = 0 means all went well. irc = j means the leading +c *** principal j x j submatrix of a is not positive definite -- +c *** and l(j*(j+1)/2) contains the (nonpos.) reduced j-th diagonal. +c +c *** parameters *** +c + integer n1, n, irc +cal double precision l(1), a(1) + double precision l(n*(n+1)/2), a(n*(n+1)/2) +c dimension l(n*(n+1)/2), a(n*(n+1)/2) +c +c *** local variables *** +c + integer i, ij, ik, im1, i0, j, jk, jm1, j0, k + double precision t, td, zero +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c +c *** body *** +c + i0 = n1 * (n1 - 1) / 2 + do 50 i = n1, n + td = zero + if (i .eq. 1) go to 40 + j0 = 0 + im1 = i - 1 + do 30 j = 1, im1 + t = zero + if (j .eq. 1) go to 20 + jm1 = j - 1 + do 10 k = 1, jm1 + ik = i0 + k + jk = j0 + k + t = t + l(ik)*l(jk) + 10 continue + 20 ij = i0 + j + j0 = j0 + j + t = (a(ij) - t) / l(j0) + l(ij) = t + td = td + t*t + 30 continue + 40 i0 = i0 + i + t = a(i0) - td + if (t .le. zero) go to 60 + l(i0) = dsqrt(t) + 50 continue +c + irc = 0 + go to 999 +c + 60 l(i0) = t + irc = i +c + 999 return +c +c *** last card of lsqrt *** + end + double precision function lsvmin(p, l, x, y) +c +c *** estimate smallest sing. value of packed lower triang. matrix l +c +c *** parameter declarations *** +c + integer p +cal double precision l(1), x(p), y(p) + double precision l(p*(p+1)/2), x(p), y(p) +c dimension l(p*(p+1)/2) +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** purpose *** +c +c this function returns a good over-estimate of the smallest +c singular value of the packed lower triangular matrix l. +c +c *** parameter description *** +c +c p (in) = the order of l. l is a p x p lower triangular matrix. +c l (in) = array holding the elements of l in row order, i.e. +c l(1,1), l(2,1), l(2,2), l(3,1), l(3,2), l(3,3), etc. +c x (out) if lsvmin returns a positive value, then x is a normalized +c approximate left singular vector corresponding to the +c smallest singular value. this approximation may be very +c crude. if lsvmin returns zero, then some components of x +c are zero and the rest retain their input values. +c y (out) if lsvmin returns a positive value, then y = (l**-1)*x is an +c unnormalized approximate right singular vector correspond- +c ing to the smallest singular value. this approximation +c may be crude. if lsvmin returns zero, then y retains its +c input value. the caller may pass the same vector for x +c and y (nonstandard fortran usage), in which case y over- +c writes x (for nonzero lsvmin returns). +c +c *** algorithm notes *** +c +c the algorithm is based on (1), with the additional provision that +c lsvmin = 0 is returned if the smallest diagonal element of l +c (in magnitude) is not more than the unit roundoff times the +c largest. the algorithm uses a random number generator proposed +c in (4), which passes the spectral test with flying colors -- see +c (2) and (3). +c +c *** subroutines and functions called *** +c +c v2norm - function, returns the 2-norm of a vector. +c +c *** references *** +c +c (1) cline, a., moler, c., stewart, g., and wilkinson, j.h.(1977), +c an estimate for the condition number of a matrix, report +c tm-310, applied math. div., argonne national laboratory. +c +c (2) hoaglin, d.c. (1976), theoretical properties of congruential +c random-number generators -- an empirical view, +c memorandum ns-340, dept. of statistics, harvard univ. +c +c (3) knuth, d.e. (1969), the art of computer programming, vol. 2 +c (seminumerical algorithms), addison-wesley, reading, mass. +c +c (4) smith, c.s. (1971), multiplicative pseudo-random number +c generators with prime modulus, j. assoc. comput. mach. 18, +c pp. 586-593. +c +c *** history *** +c +c designed and coded by david m. gay (winter 1977/summer 1978). +c +c *** general *** +c +c this subroutine was written in connection with research +c supported by the national science foundation under grants +c mcs-7600324, dcr75-10143, 76-14311dss, and mcs76-11989. +c +c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer i, ii, ix, j, ji, jj, jjj, jm1, j0, pm1 + double precision b, sminus, splus, t, xminus, xplus +c +c *** constants *** +c + double precision half, one, r9973, zero +c +c *** intrinsic functions *** +c/+ + integer mod + real float + double precision dabs +c/ +c *** external functions and subroutines *** +c + external dotprd, v2norm, vaxpy + double precision dotprd, v2norm +c +c/6 +c data half/0.5d+0/, one/1.d+0/, r9973/9973.d+0/, zero/0.d+0/ +c/7 + parameter (half=0.5d+0, one=1.d+0, r9973=9973.d+0, zero=0.d+0) +c/ +c +c *** body *** +c + ix = 2 + pm1 = p - 1 +c +c *** first check whether to return lsvmin = 0 and initialize x *** +c + ii = 0 + j0 = p*pm1/2 + jj = j0 + p + if (l(jj) .eq. zero) go to 110 + ix = mod(3432*ix, 9973) + b = half*(one + float(ix)/r9973) + xplus = b / l(jj) + x(p) = xplus + if (p .le. 1) go to 60 + do 10 i = 1, pm1 + ii = ii + i + if (l(ii) .eq. zero) go to 110 + ji = j0 + i + x(i) = xplus * l(ji) + 10 continue +c +c *** solve (l**t)*x = b, where the components of b have randomly +c *** chosen magnitudes in (.5,1) with signs chosen to make x large. +c +c do j = p-1 to 1 by -1... + do 50 jjj = 1, pm1 + j = p - jjj +c *** determine x(j) in this iteration. note for i = 1,2,...,j +c *** that x(i) holds the current partial sum for row i. + ix = mod(3432*ix, 9973) + b = half*(one + float(ix)/r9973) + xplus = (b - x(j)) + xminus = (-b - x(j)) + splus = dabs(xplus) + sminus = dabs(xminus) + jm1 = j - 1 + j0 = j*jm1/2 + jj = j0 + j + xplus = xplus/l(jj) + xminus = xminus/l(jj) + if (jm1 .eq. 0) go to 30 + do 20 i = 1, jm1 + ji = j0 + i + splus = splus + dabs(x(i) + l(ji)*xplus) + sminus = sminus + dabs(x(i) + l(ji)*xminus) + 20 continue + 30 if (sminus .gt. splus) xplus = xminus + x(j) = xplus +c *** update partial sums *** + if (jm1 .gt. 0) call vaxpy(jm1, x, xplus, l(j0+1), x) + 50 continue +c +c *** normalize x *** +c + 60 t = one/v2norm(p, x) + do 70 i = 1, p + 70 x(i) = t*x(i) +c +c *** solve l*y = x and return lsvmin = 1/twonorm(y) *** +c + do 100 j = 1, p + jm1 = j - 1 + j0 = j*jm1/2 + jj = j0 + j + t = zero + if (jm1 .gt. 0) t = dotprd(jm1, l(j0+1), y) + y(j) = (x(j) - t) / l(jj) + 100 continue +c + lsvmin = one/v2norm(p, y) + go to 999 +c + 110 lsvmin = zero + 999 return +c *** last card of lsvmin follows *** + end + subroutine slvmul(p, y, s, x) +c +c *** set y = s * x, s = p x p symmetric matrix. *** +c *** lower triangle of s stored rowwise. *** +c +c *** parameter declarations *** +c + integer p +cal double precision s(1), x(p), y(p) + double precision s(p*(p+1)/2), x(p), y(p) +c dimension s(p*(p+1)/2) +c +c *** local variables *** +c + integer i, im1, j, k + double precision xi +c +c *** no intrinsic functions *** +c +c *** external function *** +c + external dotprd + double precision dotprd +c +c----------------------------------------------------------------------- +c + j = 1 + do 10 i = 1, p + y(i) = dotprd(i, s(j), x) + j = j + i + 10 continue +c + if (p .le. 1) go to 999 + j = 1 + do 40 i = 2, p + xi = x(i) + im1 = i - 1 + j = j + 1 + do 30 k = 1, im1 + y(k) = y(k) + s(j)*xi + j = j + 1 + 30 continue + 40 continue +c + 999 return +c *** last card of slvmul follows *** + end diff --git a/source/unres/src_MD-NEWSC/dihed_cons.F b/source/unres/src_MD-NEWSC/dihed_cons.F new file mode 100644 index 0000000..e45405f --- /dev/null +++ b/source/unres/src_MD-NEWSC/dihed_cons.F @@ -0,0 +1,185 @@ + subroutine secstrp2dihc + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.BOUNDS' + include 'COMMON.CHAIN' + include 'COMMON.TORCNSTR' + include 'COMMON.IOUNITS' + character*1 secstruc(maxres) + COMMON/SECONDARYS/secstruc + character*80 line + logical errflag + external ilen + +cdr call getenv_loc('SECPREDFIL',secpred) + lenpre=ilen(prefix) + secpred=prefix(:lenpre)//'.spred' + +#if defined(WINIFL) || defined(WINPGI) + open(isecpred,file=secpred,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open(isecpred,file=secpred,status='old',action='read') +#elif (defined G77) + open(isecpred,file=secpred,status='old') +#else + open(isecpred,file=secpred,status='old',action='read') +#endif +C read secondary structure prediction from JPRED here! +! read(isecpred,'(A80)',err=100,end=100) line +! read(line,'(f10.3)',err=110) ftors + read(isecpred,'(f10.3)',err=110) ftors + + write (iout,*) 'FTORS factor =',ftors +! initialize secstruc to any + do i=1,nres + secstruc(i) ='-' + enddo + ndih_constr=0 + ndih_nconstr=0 + + call read_secstr_pred(isecpred,iout,errflag) + if (errflag) then + write(iout,*)'There is a problem with the list of secondary-', + & 'structure prediction' + goto 100 + endif +C 8/13/98 Set limits to generating the dihedral angles + do i=1,nres + phibound(1,i)=-pi + phibound(2,i)=pi + enddo + + ii=0 + do i=1,nres + if ( secstruc(i) .eq. 'H') then +C Helix restraints for this residue + ii=ii+1 + idih_constr(ii)=i + phi0(ii) = 45.0D0*deg2rad + drange(ii)= 5.0D0*deg2rad + phibound(1,i) = phi0(ii)-drange(ii) + phibound(2,i) = phi0(ii)+drange(ii) + else if (secstruc(i) .eq. 'E') then +C strand restraints for this residue + ii=ii+1 + idih_constr(ii)=i + phi0(ii) = 180.0D0*deg2rad + drange(ii)= 5.0D0*deg2rad + phibound(1,i) = phi0(ii)-drange(ii) + phibound(2,i) = phi0(ii)+drange(ii) + else +C no restraints for this residue + ndih_nconstr=ndih_nconstr+1 + idih_nconstr(ndih_nconstr)=i + endif + enddo + ndih_constr=ii + return +100 continue + write(iout,'(A30,A80)')'Error reading file SECPRED',secpred + return + 110 continue + write(iout,'(A20)')'Error reading FTORS' + return + end + + subroutine read_secstr_pred(jin,jout,errors) + + implicit real*8 (a-h,o-z) + INCLUDE 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + character*1 secstruc(maxres) + COMMON/SECONDARYS/secstruc + EXTERNAL ILEN + character*80 line,line1,ucase + logical errflag,errors,blankline + + errors=.false. + read (jin,'(a)') line + write (jout,'(2a)') '> ',line(1:78) + line1=ucase(line) +C Remember that we number full residues starting from 2, then, iseq=1 and iseq=nres +C correspond to the end-groups. ADD to the secondary structure prediction "-" for the +C end-groups in the input file "*.spred" + + iseq=1 + do while (index(line1,'$END').eq.0) +* Override commented lines. + ipos=1 + blankline=.false. + do while (.not.blankline) + line1=' ' + call mykey(line,line1,ipos,blankline,errflag) + if (errflag) write (jout,'(2a)') + & 'Error when reading sequence in line: ',line + errors=errors .or. errflag + if (.not. blankline .and. .not. errflag) then + ipos1=2 + iend=ilen(line1) + if (iseq.le.maxres) then + if (line1(1:1).eq.'-' ) then + secstruc(iseq)=line1(1:1) + else if ( ( ucase(line1(1:1)).eq.'E' ) .or. + & ( ucase(line1(1:1)).eq.'H' ) ) then + secstruc(iseq)=ucase(line1(1:1)) + else + errors=.true. + write (jout,1010) line1(1:1), iseq + goto 80 + endif + else + errors=.true. + write (jout,1000) iseq,maxres + goto 80 + endif + do while (ipos1.le.iend) + + iseq=iseq+1 + il=1 + ipos1=ipos1+1 + if (iseq.le.maxres) then + if (line1(ipos1-1:ipos1-1).eq.'-' ) then + secstruc(iseq)=line1(ipos1-1:ipos1-1) + else if((ucase(line1(ipos1-1:ipos1-1)).eq.'E').or. + & (ucase(line1(ipos1-1:ipos1-1)).eq.'H') ) then + secstruc(iseq)=ucase(line1(ipos1-1:ipos1-1)) + else + errors=.true. + write (jout,1010) line1(ipos1-1:ipos1-1), iseq + goto 80 + endif + else + errors=.true. + write (jout,1000) iseq,maxres + goto 80 + endif + enddo + iseq=iseq+1 + endif + enddo + read (jin,'(a)') line + write (jout,'(2a)') '> ',line(1:78) + line1=ucase(line) + enddo + +cd write (jout,'(10a8)') (sequence(i),i=1,iseq-1) + +cd check whether the found length of the chain is correct. + length_of_chain=iseq-1 + if (length_of_chain .ne. nres) then +! errors=.true. + write (jout,'(a,i4,a,i4,a)') + & 'Error: the number of labels specified in $SEC_STRUC_PRED (' + & ,length_of_chain,') does not match with the number of residues (' + & ,nres,').' + endif + 80 continue + + 1000 format('Error - the number of residues (',i4, + & ') has exceeded maximum (',i4,').') + 1010 format ('Error - unrecognized secondary structure label',a4, + & ' in position',i4) + return + end diff --git a/source/unres/src_MD-NEWSC/djacob.f b/source/unres/src_MD-NEWSC/djacob.f new file mode 100644 index 0000000..e3f46bc --- /dev/null +++ b/source/unres/src_MD-NEWSC/djacob.f @@ -0,0 +1,107 @@ + SUBROUTINE DJACOB(N,NMAX,MAXJAC,E,A,C,AII) + IMPLICIT REAL*8 (A-H,O-Z) +C THE JACOBI DIAGONALIZATION PROCEDURE + COMMON INP,IOUT,IPN + DIMENSION A(NMAX,N),C(NMAX,N),AII(150),AJJ(150) + SIN45 = .70710678 + COS45 = .70710678 + S45SQ = 0.50 + C45SQ = 0.50 +C UNIT EIGENVECTOR MATRIX + DO 70 I = 1,N + DO 7 J = I,N + A(J,I)=A(I,J) + C(I,J) = 0.0 + 7 C(J,I) = 0.0 + 70 C(I,I) = 1.0 +C DETERMINATION OF SEARCH ARGUMENT, TEST + AMAX = 0.0 + DO 1 I = 1,N + DO 1 J = 1,I + TEMPA=DABS(A(I,J)) + IF (AMAX-TEMPA) 2,1,1 + 2 AMAX = TEMPA + 1 CONTINUE + TEST = AMAX*E +C SEARCH FOR LARGEST OFF DIAGONAL ELEMENT + DO 72 IJAC=1,MAXJAC + AIJMAX = 0.0 + DO 3 I = 2,N + LIM = I-1 + DO 3 J = 1,LIM + TAIJ=DABS(A(I,J)) + IF (AIJMAX-TAIJ) 4,3,3 + 4 AIJMAX = TAIJ + IPIV = I + JPIV = J + 3 CONTINUE + IF(AIJMAX-TEST)300,300,5 +C PARAMETERS FOR ROTATION + 5 TAII = A(IPIV,IPIV) + TAJJ = A(JPIV,JPIV) + TAIJ = A(IPIV,JPIV) + TMT = TAII-TAJJ + IF(DABS(TMT/TAIJ)-1.0D-12) 60,60,6 + 60 IF(TAIJ) 10,10,11 + 6 ZAMMA=TAIJ/(2.0*TMT) + 90 IF(DABS(ZAMMA)-0.38268)8,8,9 + 9 IF(ZAMMA)10,10,11 + 10 SINT = -SIN45 + GO TO 12 + 11 SINT = SIN45 + 12 COST = COS45 + SINSQ = S45SQ + COSSQ = C45SQ + GO TO 120 + 8 GAMSQ=ZAMMA*ZAMMA + SINT=2.0*ZAMMA/(1.0+GAMSQ) + COST = (1.0-GAMSQ)/(1.0+GAMSQ) + SINSQ=SINT*SINT + COSSQ=COST*COST +C ROTATION + 120 DO 13 K = 1,N + TAIK = A(IPIV,K) + TAJK = A(JPIV,K) + A(IPIV,K) = TAIK*COST+TAJK*SINT + A(JPIV,K) = TAJK*COST-TAIK*SINT + TCIK = C(IPIV,K) + TCJK = C(JPIV,K) + C(IPIV,K) = TCIK*COST+TCJK*SINT + 13 C(JPIV,K) = TCJK*COST-TCIK*SINT + A(IPIV,IPIV) = TAII*COSSQ+TAJJ*SINSQ+2.0*TAIJ*SINT*COST + A(JPIV,JPIV) = TAII*SINSQ+TAJJ*COSSQ-2.0*TAIJ*SINT*COST + A(IPIV,JPIV) = TAIJ*(COSSQ-SINSQ)-SINT*COST*TMT + A(JPIV,IPIV) = A(IPIV,JPIV) + DO 30 K = 1,N + A(K,IPIV) = A(IPIV,K) + 30 A(K,JPIV) = A(JPIV,K) + 72 CONTINUE + WRITE (IOUT,1000) AIJMAX + 1000 FORMAT (/1X,'NONCONVERGENT JACOBI. LARGEST OFF-DIAGONAL ELE', + 1 'MENT = ',1PE14.7) +C ARRANGEMENT OF EIGENVALUES IN ASCENDING ORDER + 300 DO 14 I=1,N + 14 AJJ(I)=A(I,I) + LT=N+1 + DO15 L=1,N + LT=LT-1 + AIIMIN=1.0E+30 + DO16 I=1,N + IF(AJJ(I)-AIIMIN)17,16,16 + 17 AIIMIN=AJJ(I) + IT=I + 16 CONTINUE + IN=L + AII(IN)=AIIMIN + AJJ(IT)=1.0E+30 + DO15 K=1,N + 15 A(IN,K)=C(IT,K) + DO 18 I=1,N + IF(A(I,1))19,22,22 + 19 T=-1.0 + GO TO 91 + 22 T=1.0 + 91 DO 18 J=1,N + 18 C(J,I)=T*A(I,J) + RETURN + END diff --git a/source/unres/src_MD-NEWSC/econstr_local.F b/source/unres/src_MD-NEWSC/econstr_local.F new file mode 100644 index 0000000..f11acfb --- /dev/null +++ b/source/unres/src_MD-NEWSC/econstr_local.F @@ -0,0 +1,91 @@ + subroutine Econstr_back +c MD with umbrella_sampling using Wolyne's distance measure as a constraint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + Uconst_back=0.0d0 + do i=1,nres + dutheta(i)=0.0d0 + dugamma(i)=0.0d0 + do j=1,3 + duscdiff(j,i)=0.0d0 + duscdiffx(j,i)=0.0d0 + enddo + enddo + do i=1,nfrag_back + ii = ifrag_back(2,i,iset)-ifrag_back(1,i,iset) +c +c Deviations from theta angles +c + utheta_i=0.0d0 + do j=ifrag_back(1,i,iset)+2,ifrag_back(2,i,iset) + dtheta_i=theta(j)-thetaref(j) + utheta_i=utheta_i+0.5d0*dtheta_i*dtheta_i + dutheta(j-2)=dutheta(j-2)+wfrag_back(1,i,iset)*dtheta_i/(ii-1) + enddo + utheta(i)=utheta_i/(ii-1) +c +c Deviations from gamma angles +c + ugamma_i=0.0d0 + do j=ifrag_back(1,i,iset)+3,ifrag_back(2,i,iset) + dgamma_i=pinorm(phi(j)-phiref(j)) +c write (iout,*) j,phi(j),phi(j)-phiref(j) + ugamma_i=ugamma_i+0.5d0*dgamma_i*dgamma_i + dugamma(j-3)=dugamma(j-3)+wfrag_back(2,i,iset)*dgamma_i/(ii-2) +c write (iout,*) i,j,dgamma_i,wfrag_back(2,i,iset),dugamma(j-3) + enddo + ugamma(i)=ugamma_i/(ii-2) +c +c Deviations from local SC geometry +c + uscdiff(i)=0.0d0 + do j=ifrag_back(1,i,iset)+1,ifrag_back(2,i,iset)-1 + dxx=xxtab(j)-xxref(j) + dyy=yytab(j)-yyref(j) + dzz=zztab(j)-zzref(j) + uscdiff(i)=uscdiff(i)+dxx*dxx+dyy*dyy+dzz*dzz + do k=1,3 + duscdiff(k,j-1)=duscdiff(k,j-1)+wfrag_back(3,i,iset)* + & (dXX_C1tab(k,j)*dxx+dYY_C1tab(k,j)*dyy+dZZ_C1tab(k,j)*dzz)/ + & (ii-1) + duscdiff(k,j)=duscdiff(k,j)+wfrag_back(3,i,iset)* + & (dXX_Ctab(k,j)*dxx+dYY_Ctab(k,j)*dyy+dZZ_Ctab(k,j)*dzz)/ + & (ii-1) + duscdiffx(k,j)=duscdiffx(k,j)+wfrag_back(3,i,iset)* + & (dXX_XYZtab(k,j)*dxx+dYY_XYZtab(k,j)*dyy+dZZ_XYZtab(k,j)*dzz) + & /(ii-1) + enddo +c write (iout,'(i5,6f10.5)') j,xxtab(j),yytab(j),zztab(j), +c & xxref(j),yyref(j),zzref(j) + enddo + uscdiff(i)=0.5d0*uscdiff(i)/(ii-1) +c write (iout,*) i," uscdiff",uscdiff(i) +c +c Put together deviations from local geometry +c + Uconst_back=Uconst_back+wfrag_back(1,i,iset)*utheta(i)+ + & wfrag_back(2,i,iset)*ugamma(i)+wfrag_back(3,i,iset)*uscdiff(i) +c write(iout,*) "i",i," utheta",utheta(i)," ugamma",ugamma(i), +c & " uconst_back",uconst_back + utheta(i)=dsqrt(utheta(i)) + ugamma(i)=dsqrt(ugamma(i)) + uscdiff(i)=dsqrt(uscdiff(i)) + enddo + return + end diff --git a/source/unres/src_MD-NEWSC/eigen.f b/source/unres/src_MD-NEWSC/eigen.f new file mode 100644 index 0000000..e4088ee --- /dev/null +++ b/source/unres/src_MD-NEWSC/eigen.f @@ -0,0 +1,2351 @@ +C 10 AUG 94 - MWS - INCREASE NUMBER OF DAF RECORDS +C 31 MAR 94 - MWS - ADD A VARIABLE TO END OF MACHSW COMMON +C 26 JUN 93 - MWS - ETRED3: ADD RETURN FOR SPECIAL CASE N=1 +C 4 JAN 92 - TLW - MAKE WRITES PARALLEL;ADD COMMON PAR +C 30 AUG 91 - MWS - JACDIA: LIMIT ITERATIONS, USE EPSLON IN TEST. +C 14 JUL 91 - MWS - JACOBI DIAGONALIZATION ALLOWS FOR LDVEC.NE.N +C 29 JAN 91 - TLW - GLDIAG: CHANGED COMMON DIAGSW TO MACHSW +C 29 OCT 90 - STE - FIX JACDIA UNDEFINED VARIABLE BUG +C 14 SEP 90 - MK - NEW JACOBI DIAGONALIZATION (KDIAG=3) +C 27 MAR 88 - MWS - ALLOW FOR VECTOR ROUTINE IN GLDIAG +C 11 AUG 87 - MWS - SANITIZE CONSTANTS IN EQLRAT +C 15 FEB 87 - STE - FIX EINVIT SUB-MATRIX LOOP LIMIT +C SCRATCH ARRAYS ARE N*8 REAL AND N INTEGER +C 8 DEC 86 - STE - USE PERF INDEX FROM ESTPI1 TO JUDGE EINVIT FAILURE +C 30 NOV 86 - STE - DELETE LIGENB, MAKE EVVRSP DEFAULT +C (GIVEIS FAILS ON CRAY FOR BENCHMC AND BENCHCI) +C 7 JUL 86 - JAB - SANITIZE FLOATING POINT CONSTANTS +C 11 OCT 85 - STE - LIGENB,TQL2: USE DROT,DSWAP; TINVTB: SCALE VECTOR +C BEFORE NORMALIZING; GENERIC FUNCTIONS +C 24 FEB 84 - STE - INITIALIZE INDEX ARRAY FOR LIGENB IN GLDIAG +C 1 DEC 83 - STE - CHANGE MACHEP FROM 2**-54 TO 2**-50 +C 28 SEP 82 - MWS - CONVERT TO IBM +C +C*MODULE EIGEN *DECK EINVIT + SUBROUTINE EINVIT(NM,N,D,E,E2,M,W,IND,Z,IERR,RV1,RV2,RV3,RV4,RV6) +C* +C* AUTHORS- +C* THIS IS A MODIFICATION OF TINVIT FROM EISPACK EDITION 3 +C* DATED AUGUST 1983. +C* TINVIT IS A TRANSLATION OF THE INVERSE ITERATION TECHNIQUE +C* IN THE ALGOL PROCEDURE TRISTURM BY PETERS AND WILKINSON. +C* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971). +C* THIS VERSION IS BY S. T. ELBERT (AMES LABORATORY-USDOE) +C* +C* PURPOSE - +C* THIS ROUTINE FINDS THOSE EIGENVECTORS OF A TRIDIAGONAL +C* SYMMETRIC MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES. +C* +C* METHOD - +C* INVERSE ITERATION. +C* +C* ON ENTRY - +C* NM - INTEGER +C* MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL +C* ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE +C* DIMENSION STATEMENT. +C* N - INTEGER +C* D - W.P. REAL (N) +C* CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. +C* E - W.P. REAL (N) +C* CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX +C* IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY. +C* E2 - W.P. REAL (N) +C* CONTAINS THE SQUARES OF CORRESPONDING ELEMENTS OF E, +C* WITH ZEROS CORRESPONDING TO NEGLIGIBLE ELEMENTS OF E. +C* E(I) IS CONSIDERED NEGLIGIBLE IF IT IS NOT LARGER THAN +C* THE PRODUCT OF THE RELATIVE MACHINE PRECISION AND THE +C* SUM OF THE MAGNITUDES OF D(I) AND D(I-1). E2(1) MUST +C* CONTAIN 0.0 IF THE EIGENVALUES ARE IN ASCENDING ORDER, +C* OR 2.0 IF THE EIGENVALUES ARE IN DESCENDING ORDER. +C* IF TQLRAT, BISECT, TRIDIB, OR IMTQLV +C* HAS BEEN USED TO FIND THE EIGENVALUES, THEIR +C* OUTPUT E2 ARRAY IS EXACTLY WHAT IS EXPECTED HERE. +C* M - INTEGER +C* THE NUMBER OF SPECIFIED EIGENVECTORS. +C* W - W.P. REAL (M) +C* CONTAINS THE M EIGENVALUES IN ASCENDING +C* OR DESCENDING ORDER. +C* IND - INTEGER (M) +C* CONTAINS IN FIRST M POSITIONS THE SUBMATRIX INDICES +C* ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W -- +C* 1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX +C* FROM THE TOP, 2 FOR THOSE BELONGING TO THE SECOND +C* SUBMATRIX, ETC. +C* IERR - INTEGER (LOGICAL UNIT NUMBER) +C* LOGICAL UNIT FOR ERROR MESSAGES +C* +C* ON EXIT - +C* ALL INPUT ARRAYS ARE UNALTERED. +C* Z - W.P. REAL (NM,M) +C* CONTAINS THE ASSOCIATED SET OF ORTHONORMAL +C* EIGENVECTORS. ANY VECTOR WHICH WHICH FAILS TO CONVERGE +C* IS LEFT AS IS (BUT NORMALIZED) WHEN ITERATING STOPPED. +C* IERR - INTEGER +C* SET TO +C* ZERO FOR NORMAL RETURN, +C* -R IF THE EIGENVECTOR CORRESPONDING TO THE R-TH +C* EIGENVALUE FAILS TO CONVERGE IN 5 ITERATIONS. +C* (ONLY LAST FAILURE TO CONVERGE IS REPORTED) +C* +C* RV1, RV2, RV3, RV4, AND RV6 ARE TEMPORARY STORAGE ARRAYS. +C* +C* RV1 - W.P. REAL (N) +C* DIAGONAL ELEMENTS OF U FROM LU DECOMPOSITION +C* RV2 - W.P. REAL (N) +C* SUPER(1)-DIAGONAL ELEMENTS OF U FROM LU DECOMPOSITION +C* RV3 - W.P. REAL (N) +C* SUPER(2)-DIAGONAL ELEMENTS OF U FROM LU DECOMPOSITION +C* RV4 - W.P. REAL (N) +C* ELEMENTS DEFINING L IN LU DECOMPOSITION +C* RV6 - W.P. REAL (N) +C* APPROXIMATE EIGENVECTOR +C* +C* DIFFERENCES FROM EISPACK 3 - +C* EPS3 IS SCALED BY EPSCAL (ENHANCES CONVERGENCE, BUT +C* LOWERS ACCURACY)! +C* ONE MORE ITERATION (MINIMUM 2) IS PERFORMED AFTER CONVERGENCE +C* (ENHANCES ACCURACY)! +C* REPLACE LOOP WITH PYTHAG WITH SINGLE CALL TO DNRM2! +C* IF NOT CONVERGED, USE PERFORMANCE INDEX TO DECIDE ON ERROR +C* VALUE SETTING, BUT DO NOT STOP! +C* L.U. FOR ERROR MESSAGES PASSED THROUGH IERR +C* USE PARAMETER STATEMENTS AND GENERIC INTRINSIC FUNCTIONS +C* USE LEVEL 1 BLAS +C* USE IF-THEN-ELSE TO CLARIFY LOGIC +C* LOOP OVER SUBSPACES MADE INTO DO LOOP. +C* LOOP OVER INVERSE ITERATIONS MADE INTO DO LOOP +C* ZERO ONLY REQUIRED PORTIONS OF OUTPUT VECTOR +C* +C* NOTE - +C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO +C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB. +C* +C + LOGICAL CONVGD,GOPARR,DSKWRK,MASWRK +C + INTEGER GROUP,I,IERR,ITS,J,JJ,M,N,NM,P,Q,R,S,SUBMAT,TAG + INTEGER IND(M) +C + DOUBLE PRECISION D(N),E(N),E2(N),W(M),Z(NM,M) + DOUBLE PRECISION RV1(N),RV2(N),RV3(N),RV4(N),RV6(N) + DOUBLE PRECISION ANORM,EPS2,EPS3,EPS4,NORM,ORDER,RHO,U,UK,V + DOUBLE PRECISION X0,X1,XU + DOUBLE PRECISION EPSCAL,GRPTOL,HUNDRD,ONE,TEN,ZERO + DOUBLE PRECISION EPSLON, ESTPI1, DASUM, DDOT, DNRM2 +C + COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK +C + PARAMETER (ZERO = 0.0D+00, ONE = 1.0D+00, GRPTOL = 0.001D+00) + PARAMETER (EPSCAL = 0.5D+00, HUNDRD = 100.0D+00, TEN = 10.0D+00) +C + 001 FORMAT(' EIGENVECTOR ROUTINE EINVIT DID NOT CONVERGE FOR VECTOR' + * ,I5,'. NORM =',1P,E10.2,' PERFORMANCE INDEX =',E10.2/ + * ' (AN ERROR HALT WILL OCCUR IF THE PI IS GREATER THAN 100)') +C +C----------------------------------------------------------------------- +C + LUEMSG = IERR + IERR = 0 + X0 = ZERO + UK = ZERO + NORM = ZERO + EPS2 = ZERO + EPS3 = ZERO + EPS4 = ZERO + GROUP = 0 + TAG = 0 + ORDER = ONE - E2(1) + Q = 0 + DO 930 SUBMAT = 1, N + P = Q + 1 +C +C .......... ESTABLISH AND PROCESS NEXT SUBMATRIX .......... +C + DO 120 Q = P, N-1 + IF (E2(Q+1) .EQ. ZERO) GO TO 140 + 120 CONTINUE + Q = N +C +C .......... FIND VECTORS BY INVERSE ITERATION .......... +C + 140 CONTINUE + TAG = TAG + 1 + ANORM = ZERO + S = 0 +C + DO 920 R = 1, M + IF (IND(R) .NE. TAG) GO TO 920 + ITS = 1 + X1 = W(R) + IF (S .NE. 0) GO TO 510 +C +C .......... CHECK FOR ISOLATED ROOT .......... +C + XU = ONE + IF (P .EQ. Q) THEN + RV6(P) = ONE + CONVGD = .TRUE. + GO TO 860 +C + END IF + NORM = ABS(D(P)) + DO 500 I = P+1, Q + NORM = MAX( NORM, ABS(D(I)) + ABS(E(I)) ) + 500 CONTINUE +C +C .......... EPS2 IS THE CRITERION FOR GROUPING, +C EPS3 REPLACES ZERO PIVOTS AND EQUAL +C ROOTS ARE MODIFIED BY EPS3, +C EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW ......... +C + EPS2 = GRPTOL * NORM + EPS3 = EPSCAL * EPSLON(NORM) + UK = Q - P + 1 + EPS4 = UK * EPS3 + UK = EPS4 / SQRT(UK) + S = P + GROUP = 0 + GO TO 520 +C +C .......... LOOK FOR CLOSE OR COINCIDENT ROOTS .......... +C + 510 IF (ABS(X1-X0) .GE. EPS2) THEN +C +C ROOTS ARE SEPERATE +C + GROUP = 0 + ELSE +C +C ROOTS ARE CLOSE +C + GROUP = GROUP + 1 + IF (ORDER * (X1 - X0) .LE. EPS3) X1 = X0 + ORDER * EPS3 + END IF +C +C .......... ELIMINATION WITH INTERCHANGES AND +C INITIALIZATION OF VECTOR .......... +C + 520 CONTINUE +C + U = D(P) - X1 + V = E(P+1) + RV6(P) = UK + DO 550 I = P+1, Q + RV6(I) = UK + IF (ABS(E(I)) .GT. ABS(U)) THEN +C +C EXCHANGE ROWS BEFORE ELIMINATION +C +C *** WARNING -- A DIVIDE CHECK MAY OCCUR HERE IF +C E2 ARRAY HAS NOT BEEN SPECIFIED CORRECTLY ....... +C + XU = U / E(I) + RV4(I) = XU + RV1(I-1) = E(I) + RV2(I-1) = D(I) - X1 + RV3(I-1) = E(I+1) + U = V - XU * RV2(I-1) + V = -XU * RV3(I-1) +C + ELSE +C +C STRAIGHT ELIMINATION +C + XU = E(I) / U + RV4(I) = XU + RV1(I-1) = U + RV2(I-1) = V + RV3(I-1) = ZERO + U = D(I) - X1 - XU * V + V = E(I+1) + END IF + 550 CONTINUE +C + IF (ABS(U) .LE. EPS3) U = EPS3 + RV1(Q) = U + RV2(Q) = ZERO + RV3(Q) = ZERO +C +C DO INVERSE ITERATIONS +C + CONVGD = .FALSE. + DO 800 ITS = 1, 5 + IF (ITS .EQ. 1) GO TO 600 +C +C .......... FORWARD SUBSTITUTION .......... +C + IF (NORM .EQ. ZERO) THEN + RV6(S) = EPS4 + S = S + 1 + IF (S .GT. Q) S = P + ELSE + XU = EPS4 / NORM + CALL DSCAL (Q-P+1, XU, RV6(P), 1) + END IF +C +C ... ELIMINATION OPERATIONS ON NEXT VECTOR +C + DO 590 I = P+1, Q + U = RV6(I) +C +C IF RV1(I-1) .EQ. E(I), A ROW INTERCHANGE +C WAS PERFORMED EARLIER IN THE +C TRIANGULARIZATION PROCESS .......... +C + IF (RV1(I-1) .EQ. E(I)) THEN + U = RV6(I-1) + RV6(I-1) = RV6(I) + ELSE + U = RV6(I) + END IF + RV6(I) = U - RV4(I) * RV6(I-1) + 590 CONTINUE + 600 CONTINUE +C +C .......... BACK SUBSTITUTION +C + RV6(Q) = RV6(Q) / RV1(Q) + V = U + U = RV6(Q) + NORM = ABS(U) + DO 620 I = Q-1, P, -1 + RV6(I) = (RV6(I) - U * RV2(I) - V * RV3(I)) / RV1(I) + V = U + U = RV6(I) + NORM = NORM + ABS(U) + 620 CONTINUE + IF (GROUP .EQ. 0) GO TO 700 +C +C ....... ORTHOGONALIZE WITH RESPECT TO PREVIOUS +C MEMBERS OF GROUP .......... +C + J = R + DO 680 JJ = 1, GROUP + 630 J = J - 1 + IF (IND(J) .NE. TAG) GO TO 630 + CALL DAXPY(Q-P+1, -DDOT(Q-P+1,RV6(P),1,Z(P,J),1), + * Z(P,J),1,RV6(P),1) + 680 CONTINUE + NORM = DASUM(Q-P+1, RV6(P), 1) + 700 CONTINUE +C + IF (CONVGD) GO TO 840 + IF (NORM .GE. ONE) CONVGD = .TRUE. + 800 CONTINUE +C +C .......... NORMALIZE SO THAT SUM OF SQUARES IS +C 1 AND EXPAND TO FULL ORDER .......... +C + 840 CONTINUE +C + XU = ONE / DNRM2(Q-P+1,RV6(P),1) +C + 860 CONTINUE + DO 870 I = 1, P-1 + Z(I,R) = ZERO + 870 CONTINUE + DO 890 I = P,Q + Z(I,R) = RV6(I) * XU + 890 CONTINUE + DO 900 I = Q+1, N + Z(I,R) = ZERO + 900 CONTINUE +C + IF (.NOT.CONVGD) THEN + RHO = ESTPI1(Q-P+1,X1,D(P),E(P),Z(P,R),ANORM) + IF (RHO .GE. TEN .AND. LUEMSG .GT. 0 .AND. MASWRK) + * WRITE(LUEMSG,001) R,NORM,RHO +C +C *** SET ERROR -- NON-CONVERGED EIGENVECTOR .......... +C + IF (RHO .GT. HUNDRD) IERR = -R + END IF +C + X0 = X1 + 920 CONTINUE +C + IF (Q .EQ. N) GO TO 940 + 930 CONTINUE + 940 CONTINUE + RETURN + END +C*MODULE EIGEN *DECK ELAUM + SUBROUTINE ELAU(HINV,L,D,A,E) +C + DOUBLE PRECISION A(*) + DOUBLE PRECISION D(L) + DOUBLE PRECISION E(L) + DOUBLE PRECISION F + DOUBLE PRECISION G + DOUBLE PRECISION HALF + DOUBLE PRECISION HH + DOUBLE PRECISION HINV + DOUBLE PRECISION ZERO +C + PARAMETER (ZERO = 0.0D+00, HALF = 0.5D+00) +C + JL = L + E(1) = A(1) * D(1) + JK = 2 + DO 210 J = 2, JL + F = D(J) + G = ZERO + JM1 = J - 1 +C + DO 200 K = 1, JM1 + G = G + A(JK) * D(K) + E(K) = E(K) + A(JK) * F + JK = JK + 1 + 200 CONTINUE +C + E(J) = G + A(JK) * F + JK = JK + 1 + 210 CONTINUE +C +C .......... FORM P .......... +C + F = ZERO + DO 245 J = 1, L + E(J) = E(J) * HINV + F = F + E(J) * D(J) + 245 CONTINUE +C +C .......... FORM Q .......... +C + HH = F * HALF * HINV + DO 250 J = 1, L + 250 E(J) = E(J) - HH * D(J) +C + RETURN + END +C*MODULE EIGEN *DECK EPSLON + DOUBLE PRECISION FUNCTION EPSLON (X) +C* +C* AUTHORS - +C* THIS ROUTINE WAS TAKEN FROM EISPACK EDITION 3 DATED 4/6/83 +C* THIS VERSION IS BY S. T. ELBERT, AMES LABORATORY-USDOE NOV 1986 +C* +C* PURPOSE - +C* ESTIMATE UNIT ROUNDOFF IN QUANTITIES OF SIZE X. +C* +C* ON ENTRY - +C* X - WORKING PRECISION REAL +C* VALUES TO FIND EPSLON FOR +C* +C* ON EXIT - +C* EPSLON - WORKING PRECISION REAL +C* SMALLEST POSITIVE VALUE SUCH THAT X+EPSLON .NE. ZERO +C* +C* QUALIFICATIONS - +C* THIS ROUTINE SHOULD PERFORM PROPERLY ON ALL SYSTEMS +C* SATISFYING THE FOLLOWING TWO ASSUMPTIONS, +C* 1. THE BASE USED IN REPRESENTING FLOATING POINT +C* NUMBERS IS NOT A POWER OF THREE. +C* 2. THE QUANTITY A IN STATEMENT 10 IS REPRESENTED TO +C* THE ACCURACY USED IN FLOATING POINT VARIABLES +C* THAT ARE STORED IN MEMORY. +C* THE STATEMENT NUMBER 10 AND THE GO TO 10 ARE INTENDED TO +C* FORCE OPTIMIZING COMPILERS TO GENERATE CODE SATISFYING +C* ASSUMPTION 2. +C* UNDER THESE ASSUMPTIONS, IT SHOULD BE TRUE THAT, +C* A IS NOT EXACTLY EQUAL TO FOUR-THIRDS, +C* B HAS A ZERO FOR ITS LAST BIT OR DIGIT, +C* C IS NOT EXACTLY EQUAL TO ONE, +C* EPS MEASURES THE SEPARATION OF 1.0 FROM +C* THE NEXT LARGER FLOATING POINT NUMBER. +C* THE DEVELOPERS OF EISPACK WOULD APPRECIATE BEING INFORMED +C* ABOUT ANY SYSTEMS WHERE THESE ASSUMPTIONS DO NOT HOLD. +C* +C* DIFFERENCES FROM EISPACK 3 - +C* USE IS MADE OF PARAMETER STATEMENTS AND INTRINSIC FUNCTIONS +C* --NO EXECUTEABLE CODE CHANGES-- +C* +C* NOTE - +C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO +C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB. +C + DOUBLE PRECISION A,B,C,EPS,X + DOUBLE PRECISION ZERO, ONE, THREE, FOUR +C + PARAMETER (ZERO=0.0D+00, ONE=1.0D+00, THREE=3.0D+00, FOUR=4.0D+00) +C +C----------------------------------------------------------------------- +C + A = FOUR/THREE + 10 B = A - ONE + C = B + B + B + EPS = ABS(C - ONE) + IF (EPS .EQ. ZERO) GO TO 10 + EPSLON = EPS*ABS(X) + RETURN + END +C*MODULE EIGEN *DECK EQLRAT + SUBROUTINE EQLRAT(N,DIAG,E,E2IN,D,IND,IERR,E2) +C* +C* AUTHORS - +C* THIS IS A MODIFICATION OF ROUTINE EQLRAT FROM EISPACK EDITION 3 +C* DATED AUGUST 1983. +C* TQLRAT IS A TRANSLATION OF THE ALGOL PROCEDURE TQLRAT, +C* ALGORITHM 464, COMM. ACM 16, 689(1973) BY REINSCH. +C* THIS VERSION IS BY S. T. ELBERT (AMES LABORATORY-USDOE) +C* +C* PURPOSE - +C* THIS ROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC +C* TRIDIAGONAL MATRIX +C* +C* METHOD - +C* RATIONAL QL +C* +C* ON ENTRY - +C* N - INTEGER +C* THE ORDER OF THE MATRIX. +C* D - W.P. REAL (N) +C* CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. +C* E2 - W.P. REAL (N) +C* CONTAINS THE SQUARES OF THE SUBDIAGONAL ELEMENTS OF +C* THE INPUT MATRIX IN ITS LAST N-1 POSITIONS. +C* E2(1) IS ARBITRARY. +C* +C* ON EXIT - +C* D - W.P. REAL (N) +C* CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN +C* ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND +C* ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE +C* THE SMALLEST EIGENVALUES. +C* E2 - W.P. REAL (N) +C* DESTROYED. +C* IERR - INTEGER +C* SET TO +C* ZERO FOR NORMAL RETURN, +C* J IF THE J-TH EIGENVALUE HAS NOT BEEN +C* DETERMINED AFTER 30 ITERATIONS. +C* +C* DIFFERENCES FROM EISPACK 3 - +C* G=G+B INSTEAD OF IF(G.EQ.0) G=B ; B=B/4 +C* F77 BACKWARD LOOPS INSTEAD OF F66 CONSTRUCT +C* GENERIC INTRINSIC FUNCTIONS +C* ARRARY IND ADDED FOR USE BY EINVIT +C* +C* NOTE - +C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO +C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB. +C + INTEGER I,J,L,M,N,II,L1,IERR + INTEGER IND(N) +C + DOUBLE PRECISION D(N),E(N),E2(N),DIAG(N),E2IN(N) + DOUBLE PRECISION B,C,F,G,H,P,R,S,T,EPSLON + DOUBLE PRECISION SCALE,ZERO,ONE +C + PARAMETER (ZERO = 0.0D+00, SCALE= 1.0D+00/64.0D+00, ONE = 1.0D+00) +C +C----------------------------------------------------------------------- + IERR = 0 + D(1)=DIAG(1) + IND(1) = 1 + K = 0 + ITAG = 0 + IF (N .EQ. 1) GO TO 1001 +C + DO 100 I = 2, N + D(I)=DIAG(I) + 100 E2(I-1) = E2IN(I) +C + F = ZERO + T = ZERO + B = EPSLON(ONE) + C = B *B + B = B * SCALE + E2(N) = ZERO +C + DO 290 L = 1, N + H = ABS(D(L)) + ABS(E(L)) + IF (T .GE. H) GO TO 105 + T = H + B = EPSLON(T) + C = B * B + B = B * SCALE + 105 CONTINUE +C .......... LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT .......... + M = L - 1 + 110 M = M + 1 + IF (E2(M) .GT. C) GO TO 110 +C .......... E2(N) IS ALWAYS ZERO, SO THERE IS AN EXIT +C FROM THE LOOP .......... +C + IF (M .LE. K) GO TO 125 + IF (M .NE. N) E2IN(M+1) = ZERO + K = M + ITAG = ITAG + 1 + 125 CONTINUE + IF (M .EQ. L) GO TO 210 +C +C ITERATE +C + DO 205 J = 1, 30 +C .......... FORM SHIFT .......... + L1 = L + 1 + S = SQRT(E2(L)) + G = D(L) + P = (D(L1) - G) / (2.0D+00 * S) + R = SQRT(P*P+1.0D+00) + D(L) = S / (P + SIGN(R,P)) + H = G - D(L) +C + DO 140 I = L1, N + 140 D(I) = D(I) - H +C + F = F + H +C .......... RATIONAL QL TRANSFORMATION .......... + G = D(M) + B + H = G + S = ZERO + DO 200 I = M-1,L,-1 + P = G * H + R = P + E2(I) + E2(I+1) = S * R + S = E2(I) / R + D(I+1) = H + S * (H + D(I)) + G = D(I) - E2(I) / G + B + H = G * P / R + 200 CONTINUE +C + E2(L) = S * G + D(L) = H +C .......... GUARD AGAINST UNDERFLOW IN CONVERGENCE TEST + IF (H .EQ. ZERO) GO TO 210 + IF (ABS(E2(L)) .LE. ABS(C/H)) GO TO 210 + E2(L) = H * E2(L) + IF (E2(L) .EQ. ZERO) GO TO 210 + 205 CONTINUE +C .......... SET ERROR -- NO CONVERGENCE TO AN +C EIGENVALUE AFTER 30 ITERATIONS .......... + IERR = L + GO TO 1001 +C +C CONVERGED +C + 210 P = D(L) + F +C .......... ORDER EIGENVALUES .......... + I = 1 + IF (L .EQ. 1) GO TO 250 + IF (P .LT. D(1)) GO TO 230 + I = L +C .......... LOOP TO FIND ORDERED POSITION + 220 I = I - 1 + IF (P .LT. D(I)) GO TO 220 +C + I = I + 1 + IF (I .EQ. L) GO TO 250 + 230 CONTINUE + DO 240 II = L, I+1, -1 + D(II) = D(II-1) + IND(II) = IND(II-1) + 240 CONTINUE +C + 250 CONTINUE + D(I) = P + IND(I) = ITAG + 290 CONTINUE +C + 1001 RETURN + END +C*MODULE EIGEN *DECK ESTPI1 + DOUBLE PRECISION FUNCTION ESTPI1 (N,EVAL,D,E,X,ANORM) +C* +C* AUTHOR - +C* STEPHEN T. ELBERT (AMES LABORATORY-USDOE) DATE: 5 DEC 1986 +C* +C* PURPOSE - +C* EVALUATE SYMMETRIC TRIDIAGONAL MATRIX PERFORMANCE INDEX +C* * * * * * +C* FOR 1 EIGENVECTOR +C* * +C* +C* METHOD - +C* THIS ROUTINE FORMS THE 1-NORM OF THE RESIDUAL MATRIX A*X-X*EVAL +C* WHERE A IS A SYMMETRIC TRIDIAGONAL MATRIX STORED +C* IN THE DIAGONAL (D) AND SUB-DIAGONAL (E) VECTORS, EVAL IS THE +C* EIGENVALUE OF AN EIGENVECTOR OF A, NAMELY X. +C* THIS NORM IS SCALED BY MACHINE ACCURACY FOR THE PROBLEM SIZE. +C* ALL NORMS APPEARING IN THE COMMENTS BELOW ARE 1-NORMS. +C* +C* ON ENTRY - +C* N - INTEGER +C* THE ORDER OF THE MATRIX A. +C* EVAL - W.P. REAL +C* THE EIGENVALUE CORRESPONDING TO VECTOR X. +C* D - W.P. REAL (N) +C* THE DIAGONAL VECTOR OF A. +C* E - W.P. REAL (N) +C* THE SUB-DIAGONAL VECTOR OF A. +C* X - W.P. REAL (N) +C* AN EIGENVECTOR OF A. +C* ANORM - W.P. REAL +C* THE NORM OF A IF IT HAS BEEN PREVIOUSLY COMPUTED. +C* +C* ON EXIT - +C* ANORM - W.P. REAL +C* THE NORM OF A, COMPUTED IF INITIALLY ZERO. +C* ESTPI1 - W.P. REAL +C* !!A*X-X*EVAL!! / (EPSLON(10*N)*!!A!!*!!X!!); +C* WHERE EPSLON(X) IS THE SMALLEST NUMBER SUCH THAT +C* X + EPSLON(X) .NE. X +C* +C* ESTPI1 .LT. 1 == SATISFACTORY PERFORMANCE +C* .GE. 1 AND .LE. 100 == MARGINAL PERFORMANCE +C* .GT. 100 == POOR PERFORMANCE +C* (SEE LECT. NOTES IN COMP. SCI. VOL.6 PP 124-125) +C + DOUBLE PRECISION ANORM,EVAL,RNORM,SIZE,XNORM + DOUBLE PRECISION D(N), E(N), X(N) + DOUBLE PRECISION EPSLON, ONE, ZERO +C + PARAMETER (ZERO = 0.0D+00, ONE = 1.0D+00) +C +C----------------------------------------------------------------------- +C + ESTPI1 = ZERO + IF( N .LE. 1 ) RETURN + SIZE = 10 * N + IF (ANORM .EQ. ZERO) THEN +C +C COMPUTE NORM OF A +C + ANORM = MAX( ABS(D(1)) + ABS(E(2)) + * ,ABS(D(N)) + ABS(E(N))) + DO 110 I = 2, N-1 + ANORM = MAX( ANORM, ABS(E(I))+ABS(D(I))+ABS(E(I+1))) + 110 CONTINUE + IF(ANORM .EQ. ZERO) ANORM = ONE + END IF +C +C COMPUTE NORMS OF RESIDUAL AND EIGENVECTOR +C + XNORM = ABS(X(1)) + ABS(X(N)) + RNORM = ABS( (D(1)-EVAL)*X(1) + E(2)*X(2)) + * +ABS( (D(N)-EVAL)*X(N) + E(N)*X(N-1)) + DO 120 I = 2, N-1 + XNORM = XNORM + ABS(X(I)) + RNORM = RNORM + ABS(E(I)*X(I-1) + (D(I)-EVAL)*X(I) + * + E(I+1)*X(I+1)) + 120 CONTINUE +C + ESTPI1 = RNORM / (EPSLON(SIZE)*ANORM*XNORM) + RETURN + END +C*MODULE EIGEN *DECK ETRBK3 + SUBROUTINE ETRBK3(NM,N,NV,A,M,Z) +C* +C* AUTHORS- +C* THIS IS A MODIFICATION OF ROUTINE TRBAK3 FROM EISPACK EDITION 3 +C* DATED AUGUST 1983. +C* EISPACK TRBAK3 IS A TRANSLATION OF THE ALGOL PROCEDURE TRBAK3, +C* NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. +C* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). +C* THIS VERSION IS BY S. T. ELBERT (AMES LABORATORY-USDOE) +C* +C* PURPOSE - +C* THIS ROUTINE FORMS THE EIGENVECTORS OF A REAL SYMMETRIC +C* MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING +C* SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY ETRED3. +C* +C* METHOD - +C* THE CALCULATION IS CARRIED OUT BY FORMING THE MATRIX PRODUCT +C* Q*Z +C* WHERE Q IS A PRODUCT OF THE ORTHOGONAL SYMMETRIC MATRICES +C* Q = PROD(I)[1 - U(I)*.TRANSPOSE.U(I)*H(I)] +C* U IS THE AUGMENTED SUB-DIAGONAL ROWS OF A AND +C* Z IS THE SET OF EIGENVECTORS OF THE TRIDIAGONAL +C* MATRIX F WHICH WAS FORMED FROM THE ORIGINAL SYMMETRIC +C* MATRIX C BY THE SIMILARITY TRANSFORMATION +C* F = Q(TRANSPOSE) C Q +C* NOTE THAT ETRBK3 PRESERVES VECTOR EUCLIDEAN NORMS. +C* +C* +C* COMPLEXITY - +C* M*N**2 +C* +C* ON ENTRY- +C* NM - INTEGER +C* MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL +C* ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE +C* DIMENSION STATEMENT. +C* N - INTEGER +C* THE ORDER OF THE MATRIX A. +C* NV - INTEGER +C* MUST BE SET TO THE DIMENSION OF THE ARRAY A AS +C* DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT. +C* A - W.P. REAL (NV) +C* CONTAINS INFORMATION ABOUT THE ORTHOGONAL +C* TRANSFORMATIONS USED IN THE REDUCTION BY ETRED3 IN +C* ITS FIRST NV = N*(N+1)/2 POSITIONS. +C* M - INTEGER +C* THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. +C* Z - W.P REAL (NM,M) +C* CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED +C* IN ITS FIRST M COLUMNS. +C* +C* ON EXIT- +C* Z - W.P. REAL (NM,M) +C* CONTAINS THE TRANSFORMED EIGENVECTORS +C* IN ITS FIRST M COLUMNS. +C* +C* DIFFERENCES WITH EISPACK 3 - +C* THE TWO INNER LOOPS ARE REPLACED BY DDOT AND DAXPY. +C* MULTIPLICATION USED INSTEAD OF DIVISION TO FIND S. +C* OUTER LOOP RANGE CHANGED FROM 2,N TO 3,N. +C* ADDRESS POINTERS FOR A SIMPLIFIED. +C* +C* NOTE - +C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO +C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB. +C + INTEGER I,II,IM1,IZ,J,M,N,NM,NV +C + DOUBLE PRECISION A(NV),Z(NM,M) + DOUBLE PRECISION H,S,DDOT,ZERO +C + PARAMETER (ZERO = 0.0D+00) +C +C----------------------------------------------------------------------- +C + IF (M .EQ. 0) RETURN + IF (N .LE. 2) RETURN +C + II=3 + DO 140 I = 3, N + IZ=II+1 + II=II+I + H = A(II) + IF (H .EQ. ZERO) GO TO 140 + IM1 = I - 1 + DO 130 J = 1, M + S = -( DDOT(IM1,A(IZ),1,Z(1,J),1) * H) * H + CALL DAXPY(IM1,S,A(IZ),1,Z(1,J),1) + 130 CONTINUE + 140 CONTINUE + RETURN + END +C*MODULE EIGEN *DECK ETRED3 + SUBROUTINE ETRED3(N,NV,A,D,E,E2) +C* +C* AUTHORS - +C* THIS IS A MODIFICATION OF ROUTINE TRED3 FROM EISPACK EDITION 3 +C* DATED AUGUST 1983. +C* EISPACK TRED3 IS A TRANSLATION OF THE ALGOL PROCEDURE TRED3, +C* NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. +C* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). +C* THIS VERSION IS BY S. T. ELBERT, AMES LABORATORY-USDOE JUN 1986 +C* +C* PURPOSE - +C* THIS ROUTINE REDUCES A REAL SYMMETRIC (PACKED) MATRIX, STORED +C* AS A ONE-DIMENSIONAL ARRAY, TO A SYMMETRIC TRIDIAGONAL MATRIX +C* USING ORTHOGONAL SIMILARITY TRANSFORMATIONS, PRESERVING THE +C* INFORMATION ABOUT THE TRANSFORMATIONS IN A. +C* +C* METHOD - +C* THE TRIDIAGONAL REDUCTION IS PERFORMED IN THE FOLLOWING WAY. +C* STARTING WITH J=N, THE ELEMENTS IN THE J-TH ROW TO THE +C* LEFT OF THE DIAGONAL ARE FIRST SCALED, TO AVOID POSSIBLE +C* UNDERFLOW IN THE TRANSFORMATION THAT MIGHT RESULT IN SEVERE +C* DEPARTURE FROM ORTHOGONALITY. THE SUM OF SQUARES SIGMA OF +C* THESE SCALED ELEMENTS IS NEXT FORMED. THEN, A VECTOR U AND +C* A SCALAR +C* H = U(TRANSPOSE) * U / 2 +C* DEFINE A REFLECTION OPERATOR +C* P = I - U * U(TRANSPOSE) / H +C* WHICH IS ORTHOGONAL AND SYMMETRIC AND FOR WHICH THE +C* SIMILIARITY TRANSFORMATION PAP ELIMINATES THE ELEMENTS IN +C* THE J-TH ROW OF A TO THE LEFT OF THE SUBDIAGONAL AND THE +C* SYMMETRICAL ELEMENTS IN THE J-TH COLUMN. +C* +C* THE NON-ZERO COMPONENTS OF U ARE THE ELEMENTS OF THE J-TH +C* ROW TO THE LEFT OF THE DIAGONAL WITH THE LAST OF THEM +C* AUGMENTED BY THE SQUARE ROOT OF SIGMA PREFIXED BY THE SIGN +C* OF THE SUBDIAGONAL ELEMENT. BY STORING THE TRANSFORMED SUB- +C* DIAGONAL ELEMENT IN E(J) AND NOT OVERWRITING THE ROW +C* ELEMENTS ELIMINATED IN THE TRANSFORMATION, FULL INFORMATION +C* ABOUT P IS SAVE FOR LATER USE IN ETRBK3. +C* +C* THE TRANSFORMATION SETS E2(J) EQUAL TO SIGMA AND E(J) +C* EQUAL TO THE SQUARE ROOT OF SIGMA PREFIXED BY THE SIGN +C* OF THE REPLACED SUBDIAGONAL ELEMENT. +C* +C* THE ABOVE STEPS ARE REPEATED ON FURTHER ROWS OF THE +C* TRANSFORMED A IN REVERSE ORDER UNTIL A IS REDUCED TO TRI- +C* DIAGONAL FORM, THAT IS, REPEATED FOR J = N-1,N-2,...,3. +C* +C* COMPLEXITY - +C* 2/3 N**3 +C* +C* ON ENTRY- +C* N - INTEGER +C* THE ORDER OF THE MATRIX. +C* NV - INTEGER +C* MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A +C* AS DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT +C* A - W.P. REAL (NV) +C* CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC +C* INPUT MATRIX, STORED ROW-WISE AS A ONE-DIMENSIONAL +C* ARRAY, IN ITS FIRST N*(N+1)/2 POSITIONS. +C* +C* ON EXIT- +C* A - W.P. REAL (NV) +C* CONTAINS INFORMATION ABOUT THE ORTHOGONAL +C* TRANSFORMATIONS USED IN THE REDUCTION. +C* D - W.P. REAL (N) +C* CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL +C* MATRIX. +C* E - W.P. REAL (N) +C* CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL +C* MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO +C* E2 - W.P. REAL (N) +C* CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF +C* E. MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. +C* +C* DIFFERENCES FROM EISPACK 3 - +C* OUTER LOOP CHANGED FROM II=1,N TO I=N,3,-1 +C* PARAMETER STATEMENT AND GENERIC INTRINSIC FUNCTIONS USED +C* SCALE.NE.0 TEST NOW SPOTS TRI-DIAGONAL FORM +C* VALUES LESS THAN EPSLON CLEARED TO ZERO +C* USE BLAS(1) +C* U NOT COPIED TO D, LEFT IN A +C* E2 COMPUTED FROM E +C* INNER LOOPS SPLIT INTO ROUTINES ELAU AND FREDA +C* INVERSE OF H STORED INSTEAD OF H +C* +C* NOTE - +C* QUESTIONS AND COMMENTS CONCERNING EISPACK SHOULD BE DIRECTED TO +C* B. S. GARBOW, APPLIED MATH. DIVISION, ARGONNE NATIONAL LAB. +C + INTEGER I,IIA,IZ0,L,N,NV +C + DOUBLE PRECISION A(NV),D(N),E(N),E2(N) + DOUBLE PRECISION AIIMAX,F,G,H,HROOT,SCALE,SCALEI + DOUBLE PRECISION DASUM, DNRM2 + DOUBLE PRECISION ONE, ZERO +C + PARAMETER (ZERO = 0.0D+00, ONE = 1.0D+00) +C +C----------------------------------------------------------------------- +C + IF (N .LE. 2) GO TO 310 + IZ0 = (N*N+N)/2 + AIIMAX = ABS(A(IZ0)) + DO 300 I = N, 3, -1 + L = I - 1 + IIA = IZ0 + IZ0 = IZ0 - I + AIIMAX = MAX(AIIMAX, ABS(A(IIA))) + SCALE = DASUM (L, A(IZ0+1), 1) + IF(SCALE .EQ. ABS(A(IIA-1)) .OR. AIIMAX+SCALE .EQ. AIIMAX) THEN +C +C THIS ROW IS ALREADY IN TRI-DIAGONAL FORM +C + D(I) = A(IIA) + IF (AIIMAX+D(I) .EQ. AIIMAX) D(I) = ZERO + E(I) = A(IIA-1) + IF (AIIMAX+E(I) .EQ. AIIMAX) E(I) = ZERO + E2(I) = E(I)*E(I) + A(IIA) = ZERO + GO TO 300 +C + END IF +C + SCALEI = ONE / SCALE + CALL DSCAL(L,SCALEI,A(IZ0+1),1) + HROOT = DNRM2(L,A(IZ0+1),1) +C + F = A(IZ0+L) + G = -SIGN(HROOT,F) + E(I) = SCALE * G + E2(I) = E(I)*E(I) + H = HROOT*HROOT - F * G + A(IZ0+L) = F - G + D(I) = A(IIA) + A(IIA) = ONE / SQRT(H) +C .......... FORM P THEN Q IN E(1:L) .......... + CALL ELAU(ONE/H,L,A(IZ0+1),A,E) +C .......... FORM REDUCED A .......... + CALL FREDA(L,A(IZ0+1),A,E) +C + 300 CONTINUE + 310 CONTINUE + E(1) = ZERO + E2(1)= ZERO + D(1) = A(1) + IF(N.EQ.1) RETURN +C + E(2) = A(2) + E2(2)= A(2)*A(2) + D(2) = A(3) + RETURN + END +C*MODULE EIGEN *DECK EVVRSP + SUBROUTINE EVVRSP(MSGFL,N,NVECT,LENA,NV,A,B,IND,ROOT, + * VECT,IORDER,IERR) +C* +C* AUTHOR: S. T. ELBERT, AMES LABORATORY-USDOE, JUNE 1985 +C* +C* PURPOSE - +C* FINDS (ALL) EIGENVALUES AND (SOME OR ALL) EIGENVECTORS +C* * * * +C* OF A REAL SYMMETRIC PACKED MATRIX. +C* * * * +C* +C* METHOD - +C* THE METHOD AS PRESENTED IN THIS ROUTINE CONSISTS OF FOUR STEPS: +C* FIRST, THE INPUT MATRIX IS REDUCED TO TRIDIAGONAL FORM BY THE +C* HOUSEHOLDER TECHNIQUE (ORTHOGONAL SIMILARITY TRANSFORMATIONS). +C* SECOND, THE ROOTS ARE LOCATED USING THE RATIONAL QL METHOD. +C* THIRD, THE VECTORS OF THE TRIDIAGONAL FORM ARE EVALUATED BY THE +C* INVERSE ITERATION TECHNIQUE. VECTORS FOR DEGENERATE OR NEAR- +C* DEGENERATE ROOTS ARE FORCED TO BE ORTHOGONAL. +C* FOURTH, THE TRIDIAGONAL VECTORS ARE ROTATED TO VECTORS OF THE +C* ORIGINAL ARRAY. +C* +C* THESE ROUTINES ARE MODIFICATIONS OF THE EISPACK 3 +C* ROUTINES TRED3, TQLRAT, TINVIT AND TRBAK3 +C* +C* FOR FURTHER DETAILS, SEE EISPACK USERS GUIDE, B. T. SMITH +C* ET AL, SPRINGER-VERLAG, LECTURE NOTES IN COMPUTER SCIENCE, +C* VOL. 6, 2-ND EDITION, 1976. ANOTHER GOOD REFERENCE IS +C* THE SYMMETRIC EIGENVALUE PROBLEM BY B. N. PARLETT +C* PUBLISHED BY PRENTICE-HALL, INC., ENGLEWOOD CLIFFS, N.J. (1980) +C* +C* ON ENTRY - +C* MSGFL - INTEGER (LOGICAL UNIT NO.) +C* FILE WHERE ERROR MESSAGES WILL BE PRINTED. +C* IF MSGFL IS 0, ERROR MESSAGES WILL BE PRINTED ON LU 6. +C* IF MSGFL IS NEGATIVE, NO ERROR MESSAGES PRINTED. +C* N - INTEGER +C* ORDER OF MATRIX A. +C* NVECT - INTEGER +C* NUMBER OF VECTORS DESIRED. 0 .LE. NVECT .LE. N. +C* LENA - INTEGER +C* DIMENSION OF A IN CALLING ROUTINE. MUST NOT BE LESS +C* THAN (N*N+N)/2. +C* NV - INTEGER +C* ROW DIMENSION OF VECT IN CALLING ROUTINE. N .LE. NV. +C* A - WORKING PRECISION REAL (LENA) +C* INPUT MATRIX, ROWS OF THE LOWER TRIANGLE PACKED INTO +C* LINEAR ARRAY OF DIMENSION N*(N+1)/2. THE PACKED ORDER +C* IS A(1,1), A(2,1), A(2,2), A(3,1), A(3,2), ... +C* B - WORKING PRECISION REAL (N,8) +C* SCRATCH ARRAY, 8*N ELEMENTS +C* IND - INTEGER (N) +C* SCRATCH ARRAY OF LENGTH N. +C* IORDER - INTEGER +C* ROOT ORDERING FLAG. +C* = 0, ROOTS WILL BE PUT IN ASCENDING ORDER. +C* = 2, ROOTS WILL BE PUT IN DESCENDING ORDER. +C* +C* ON EXIT - +C* A - DESTORYED. NOW HOLDS REFLECTION OPERATORS. +C* ROOT - WORKING PRECISION REAL (N) +C* ALL EIGENVALUES IN ASCENDING OR DESCENDING ORDER. +C* IF IORDER = 0, ROOT(1) .LE. ... .LE. ROOT(N) +C* IF IORDER = 2, ROOT(1) .GE. ... .GE. ROOT(N) +C* VECT - WORKING PRECISION REAL (NV,NVECT) +C* EIGENVECTORS FOR ROOT(1), ..., ROOT(NVECT). +C* IERR - INTEGER +C* = 0 IF NO ERROR DETECTED, +C* = K IF ITERATION FOR K-TH EIGENVALUE FAILED, +C* = -K IF ITERATION FOR K-TH EIGENVECTOR FAILED. +C* (FAILURES SHOULD BE VERY RARE. CONTACT C. MOLER.) +C* +C + LOGICAL GOPARR,DSKWRK,MASWRK +C + DOUBLE PRECISION A(LENA) + DOUBLE PRECISION B(N,8) + DOUBLE PRECISION ROOT(N) + DOUBLE PRECISION T + DOUBLE PRECISION VECT(NV,*) +C + INTEGER IND(N) +C + COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK +C + 900 FORMAT(26H0*** EVVRSP PARAMETERS ***/ + + 14H *** N = ,I8,4H ***/ + + 14H *** NVECT = ,I8,4H ***/ + + 14H *** LENA = ,I8,4H ***/ + + 14H *** NV = ,I8,4H ***/ + + 14H *** IORDER = ,I8,4H ***/ + + 14H *** IERR = ,I8,4H ***) + 901 FORMAT(37H VALUE OF LENA IS LESS THAN (N*N+N)/2) + 902 FORMAT(39H EQLRAT HAS FAILED TO CONVERGE FOR ROOT,I5) + 903 FORMAT(18H NV IS LESS THAN N) + 904 FORMAT(41H EINVIT HAS FAILED TO CONVERGE FOR VECTOR,I5) + 905 FORMAT(51H VALUE OF IORDER MUST BE 0 (SMALLEST ROOT FIRST) OR + * ,23H 2 (LARGEST ROOT FIRST)) + 906 FORMAT(' VALUE OF N IS LESS THAN OR EQUAL ZERO') +C +C----------------------------------------------------------------------- +C + LMSGFL=MSGFL + IF (MSGFL .EQ. 0) LMSGFL=6 + IERR = N - 1 + IF (N .LE. 0) GO TO 800 + IERR = N + 1 + IF ( (N*N+N)/2 .GT. LENA) GO TO 810 +C +C REDUCE REAL SYMMETRIC MATRIX A TO TRIDIAGONAL FORM +C + CALL ETRED3(N,LENA,A,B(1,1),B(1,2),B(1,3)) +C +C FIND ALL EIGENVALUES OF TRIDIAGONAL MATRIX +C + CALL EQLRAT(N,B(1,1),B(1,2),B(1,3),ROOT,IND,IERR,B(1,4)) + IF (IERR .NE. 0) GO TO 820 +C +C CHECK THE DESIRED ORDER OF THE EIGENVALUES +C + B(1,3) = IORDER + IF (IORDER .EQ. 0) GO TO 300 + IF (IORDER .NE. 2) GO TO 850 +C +C ORDER ROOTS IN DESCENDING ORDER (LARGEST FIRST)... +C TURN ROOT AND IND ARRAYS END FOR END +C + DO 210 I = 1, N/2 + J = N+1-I + T = ROOT(I) + ROOT(I) = ROOT(J) + ROOT(J) = T + L = IND(I) + IND(I) = IND(J) + IND(J) = L + 210 CONTINUE +C +C FIND I AND J MARKING THE START AND END OF A SEQUENCE +C OF DEGENERATE ROOTS +C + I=0 + 220 CONTINUE + I = I+1 + IF (I .GT. N) GO TO 300 + DO 230 J=I,N + IF (ROOT(J) .NE. ROOT(I)) GO TO 240 + 230 CONTINUE + J = N+1 + 240 CONTINUE + J = J-1 + IF (J .EQ. I) GO TO 220 +C +C TURN AROUND IND BETWEEN I AND J +C + JSV = J + KLIM = (J-I+1)/2 + DO 250 K=1,KLIM + L = IND(J) + IND(J) = IND(I) + IND(I) = L + I = I+1 + J = J-1 + 250 CONTINUE + I = JSV + GO TO 220 +C + 300 CONTINUE +C + IF (NVECT .LE. 0) RETURN + IF (NV .LT. N) GO TO 830 +C +C FIND EIGENVECTORS OF TRI-DIAGONAL MATRIX VIA INVERSE ITERATION +C + IERR = LMSGFL + CALL EINVIT(NV,N,B(1,1),B(1,2),B(1,3),NVECT,ROOT,IND, + + VECT,IERR,B(1,4),B(1,5),B(1,6),B(1,7),B(1,8)) + IF (IERR .NE. 0) GO TO 840 +C +C FIND EIGENVECTORS OF SYMMETRIC MATRIX VIA BACK TRANSFORMATION +C + 400 CONTINUE + CALL ETRBK3(NV,N,LENA,A,NVECT,VECT) + RETURN +C +C ERROR MESSAGE SECTION +C + 800 IF (LMSGFL .LT. 0) RETURN + IF (MASWRK) WRITE(LMSGFL,906) + GO TO 890 +C + 810 IF (LMSGFL .LT. 0) RETURN + IF (MASWRK) WRITE(LMSGFL,901) + GO TO 890 +C + 820 IF (LMSGFL .LT. 0) RETURN + IF (MASWRK) WRITE(LMSGFL,902) IERR + GO TO 890 +C + 830 IF (LMSGFL .LT. 0) RETURN + IF (MASWRK) WRITE(LMSGFL,903) + GO TO 890 +C + 840 CONTINUE + IF ((LMSGFL .GT. 0).AND.MASWRK) WRITE(LMSGFL,904) -IERR + GO TO 400 +C + 850 IERR=-1 + IF (LMSGFL .LT. 0) RETURN + IF (MASWRK) WRITE(LMSGFL,905) + GO TO 890 +C + 890 CONTINUE + IF (MASWRK) WRITE(LMSGFL,900) N,NVECT,LENA,NV,IORDER,IERR + RETURN + END +C*MODULE EIGEN *DECK FREDA + SUBROUTINE FREDA(L,D,A,E) +C + DOUBLE PRECISION A(*) + DOUBLE PRECISION D(L) + DOUBLE PRECISION E(L) + DOUBLE PRECISION F + DOUBLE PRECISION G +C + JK = 1 +C +C .......... FORM REDUCED A .......... +C + DO 280 J = 1, L + F = D(J) + G = E(J) +C + DO 260 K = 1, J + A(JK) = A(JK) - F * E(K) - G * D(K) + JK = JK + 1 + 260 CONTINUE +C + 280 CONTINUE + RETURN + END +C*MODULE EIGEN *DECK GIVEIS + SUBROUTINE GIVEIS(N,NVECT,NV,A,B,INDB,ROOT,VECT,IERR) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION A(*),B(N,8),INDB(N),ROOT(N),VECT(NV,NVECT) +C +C EISPACK-BASED SUBSTITUTE FOR QCPE ROUTINE GIVENS. +C FINDS ALL EIGENVALUES AND SOME EIGENVECTORS OF A REAL SYMMETRIC +C MATRIX. AUTHOR.. C. MOLER AND D. SPANGLER, N.R.C.C., 4/1/79. +C +C INPUT.. +C N = ORDER OF MATRIX . +C NVECT = NUMBER OF VECTORS DESIRED. 0 .LE. NVECT .LE. N . +C NV = LEADING DIMENSION OF VECT . +C A = INPUT MATRIX, COLUMNS OF THE UPPER TRIANGLE PACKED INTO +C LINEAR ARRAY OF DIMENSION N*(N+1)/2 . +C B = SCRATCH ARRAY, 8*N ELEMENTS (NOTE THIS IS MORE THAN +C PREVIOUS VERSIONS OF GIVENS.) +C IND = INDEX ARRAY OF N ELEMENTS +C +C OUTPUT.. +C A DESTROYED . +C ROOT = ALL EIGENVALUES, ROOT(1) .LE. ... .LE. ROOT(N) . +C (FOR OTHER ORDERINGS, SEE BELOW.) +C VECT = EIGENVECTORS FOR ROOT(1),..., ROOT(NVECT) . +C IERR = 0 IF NO ERROR DETECTED, +C = K IF ITERATION FOR K-TH EIGENVALUE FAILED, +C = -K IF ITERATION FOR K-TH EIGENVECTOR FAILED. +C (FAILURES SHOULD BE VERY RARE. CONTACT MOLER.) +C +C CALLS MODIFIED EISPACK ROUTINES TRED3B, IMTQLV, TINVTB, AND +C TRBK3B. THE ROUTINES TRED3B, TINVTB, AND TRBK3B. +C THE ORIGINAL EISPACK ROUTINES TRED3, TINVIT, AND TRBAK3 +C WERE MODIFIED BY THE INTRODUCTION OF TWO ROUTINES FROM THE +C BLAS LIBRARY - DDOT AND DAXPY. +C +C IF TINVIT FAILS TO CONVERGE, TQL2 IS CALLED +C +C SEE EISPACK USERS GUIDE, B. T. SMITH ET AL, SPRINGER-VERLAG +C LECTURE NOTES IN COMPUTER SCIENCE, VOL. 6, 2-ND EDITION, 1976 . +C NOTE THAT IMTQLV AND TINVTB HAVE INTERNAL MACHINE +C DEPENDENT CONSTANTS. +C + DATA ONE, ZERO /1.0D+00, 0.0D+00/ + CALL TRED3B(N,(N*N+N)/2,A,B(1,1),B(1,2),B(1,3)) + CALL IMTQLV(N,B(1,1),B(1,2),B(1,3),ROOT,INDB,IERR,B(1,4)) + IF (IERR .NE. 0) RETURN +C +C TO REORDER ROOTS... +C K = N/2 +C B(1,3) = 2.0D+00 +C DO 50 I = 1, K +C J = N+1-I +C T = ROOT(I) +C ROOT(I) = ROOT(J) +C ROOT(J) = T +C 50 CONTINUE +C + IF (NVECT .LE. 0) RETURN + CALL TINVTB(NV,N,B(1,1),B(1,2),B(1,3),NVECT,ROOT,INDB,VECT,IERR, + + B(1,4),B(1,5),B(1,6),B(1,7),B(1,8)) + IF (IERR .EQ. 0) GO TO 160 +C +C IF INVERSE ITERATION GIVES AN ERROR IN DETERMINING THE +C EIGENVECTORS, TRY THE QL ALGORITHM IF ALL THE EIGENVECTORS +C ARE DESIRED. +C + IF (NVECT .NE. N) RETURN + DO 120 I = 1, NVECT + DO 100 J = 1, N + VECT(I,J) = ZERO + 100 CONTINUE + VECT(I,I) = ONE + 120 CONTINUE + CALL TQL2 (NV,N,B(1,1),B(1,2),VECT,IERR) + DO 140 I = 1, NVECT + ROOT(I) = B(I,1) + 140 CONTINUE + IF (IERR .NE. 0) RETURN + 160 CALL TRBK3B(NV,N,(N*N+N)/2,A,NVECT,VECT) + RETURN + END +C*MODULE EIGEN *DECK GLDIAG + SUBROUTINE GLDIAG(LDVECT,NVECT,N,H,WRK,EIG,VECTOR,IERR,IWRK) +C + IMPLICIT DOUBLE PRECISION (A-H,O-Z) +C + LOGICAL GOPARR,DSKWRK,MASWRK +C + DIMENSION H(*),WRK(N,8),EIG(N),VECTOR(LDVECT,NVECT),IWRK(N) +C + COMMON /IOFILE/ IR,IW,IP,IJK,IPK,IDAF,NAV,IODA(400) + COMMON /MACHSW/ KDIAG,ICORFL,IXDR + COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK +C +C ----- GENERAL ROUTINE TO DIAGONALIZE A SYMMETRIC MATRIX ----- +C IF KDIAG = 0, USE A ROUTINE FROM THE VECTOR LIBRARY, +C IF AVAILABLE (SEE THE SUBROUTINE 'GLDIAG' +C IN VECTOR.SRC), OR EVVRSP OTHERWISE +C = 1, USE EVVRSP +C = 2, USE GIVEIS +C = 3, USE JACOBI +C +C N = DIMENSION (ORDER) OF MATRIX TO BE SOLVED +C LDVECT = LEADING DIMENSION OF VECTOR +C NVECT = NUMBER OF VECTORS DESIRED +C H = MATRIX TO BE DIAGONALIZED +C WRK = N*8 W.P. REAL WORDS OF SCRATCH SPACE +C EIG = EIGENVECTORS (OUTPUT) +C VECTOR = EIGENVECTORS (OUTPUT) +C IERR = ERROR FLAG (OUTPUT) +C IWRK = N INTEGER WORDS OF SCRATCH SPACE +C + IERR = 0 +C +C ----- USE STEVE ELBERT'S ROUTINE ----- +C + IF(KDIAG.LE.1 .OR. KDIAG.GT.3) THEN + LENH = (N*N+N)/2 + KORDER =0 + CALL EVVRSP(IW,N,NVECT,LENH,LDVECT,H,WRK,IWRK,EIG,VECTOR + * ,KORDER,IERR) + END IF +C +C ----- USE MODIFIED EISPAK ROUTINE ----- +C + IF(KDIAG.EQ.2) + * CALL GIVEIS(N,NVECT,LDVECT,H,WRK,IWRK,EIG,VECTOR,IERR) +C +C ----- USE JACOBI ROTATION ROUTINE ----- +C + IF(KDIAG.EQ.3) THEN + IF(NVECT.EQ.N) THEN + CALL JACDG(H,VECTOR,EIG,IWRK,WRK,LDVECT,N) + ELSE + IF (MASWRK) WRITE(IW,9000) N,NVECT,LDVECT + CALL ABRT + END IF + END IF + RETURN +C + 9000 FORMAT(1X,'IN -GLDIAG-, N,NVECT,LDVECT=',3I8/ + * 1X,'THE JACOBI CODE CANNOT COPE WITH N.NE.NVECT!'/ + * 1X,'SO THIS RUN DOES NOT PERMIT KDIAG=3.') + END +C*MODULE EIGEN *DECK IMTQLV + SUBROUTINE IMTQLV(N,D,E,E2,W,IND,IERR,RV1) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + INTEGER TAG + DOUBLE PRECISION MACHEP + DIMENSION D(N),E(N),E2(N),W(N),RV1(N),IND(N) +C +C THIS ROUTINE IS A VARIANT OF IMTQL1 WHICH IS A TRANSLATION OF +C ALGOL PROCEDURE IMTQL1, NUM. MATH. 12, 377-383(1968) BY MARTIN AND +C WILKINSON, AS MODIFIED IN NUM. MATH. 15, 450(1970) BY DUBRULLE. +C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 241-248(1971). +C +C THIS ROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC TRIDIAGONAL +C MATRIX BY THE IMPLICIT QL METHOD AND ASSOCIATES WITH THEM +C THEIR CORRESPONDING SUBMATRIX INDICES. +C +C ON INPUT- +C +C N IS THE ORDER OF THE MATRIX, +C +C D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX, +C +C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX +C IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY, +C +C E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. +C E2(1) IS ARBITRARY. +C +C ON OUTPUT- +C +C D AND E ARE UNALTERED, +C +C ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED +C AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE +C MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES. +C E2(1) IS ALSO SET TO ZERO, +C +C W CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN +C ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND +C ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE +C THE SMALLEST EIGENVALUES, +C +C IND CONTAINS THE SUBMATRIX INDICES ASSOCIATED WITH THE +C CORRESPONDING EIGENVALUES IN W -- 1 FOR EIGENVALUES +C BELONGING TO THE FIRST SUBMATRIX FROM THE TOP, +C 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC., +C +C IERR IS SET TO +C ZERO FOR NORMAL RETURN, +C J IF THE J-TH EIGENVALUE HAS NOT BEEN +C DETERMINED AFTER 30 ITERATIONS, +C +C RV1 IS A TEMPORARY STORAGE ARRAY. +C +C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, +C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY +C +C ------------------------------------------------------------------ +C +C ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING +C THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC. +C +C ********** + MACHEP = 2.0D+00**(-50) +C + IERR = 0 + K = 0 + TAG = 0 +C + DO 100 I = 1, N + W(I) = D(I) + IF (I .NE. 1) RV1(I-1) = E(I) + 100 CONTINUE +C + E2(1) = 0.0D+00 + RV1(N) = 0.0D+00 +C + DO 360 L = 1, N + J = 0 +C ********** LOOK FOR SMALL SUB-DIAGONAL ELEMENT ********** + 120 DO 140 M = L, N + IF (M .EQ. N) GO TO 160 + IF (ABS(RV1(M)) .LE. MACHEP * (ABS(W(M)) + ABS(W(M+1)))) GO TO + + 160 +C ********** GUARD AGAINST UNDERFLOWED ELEMENT OF E2 ********** + IF (E2(M+1) .EQ. 0.0D+00) GO TO 180 + 140 CONTINUE +C + 160 IF (M .LE. K) GO TO 200 + IF (M .NE. N) E2(M+1) = 0.0D+00 + 180 K = M + TAG = TAG + 1 + 200 P = W(L) + IF (M .EQ. L) GO TO 280 + IF (J .EQ. 30) GO TO 380 + J = J + 1 +C ********** FORM SHIFT ********** + G = (W(L+1) - P) / (2.0D+00 * RV1(L)) + R = SQRT(G*G+1.0D+00) + G = W(M) - P + RV1(L) / (G + SIGN(R,G)) + S = 1.0D+00 + C = 1.0D+00 + P = 0.0D+00 + MML = M - L +C ********** FOR I=M-1 STEP -1 UNTIL L DO -- ********** + DO 260 II = 1, MML + I = M - II + F = S * RV1(I) + B = C * RV1(I) + IF (ABS(F) .LT. ABS(G)) GO TO 220 + C = G / F + R = SQRT(C*C+1.0D+00) + RV1(I+1) = F * R + S = 1.0D+00 / R + C = C * S + GO TO 240 + 220 S = F / G + R = SQRT(S*S+1.0D+00) + RV1(I+1) = G * R + C = 1.0D+00 / R + S = S * C + 240 G = W(I+1) - P + R = (W(I) - G) * S + 2.0D+00 * C * B + P = S * R + W(I+1) = G + P + G = C * R - B + 260 CONTINUE +C + W(L) = W(L) - P + RV1(L) = G + RV1(M) = 0.0D+00 + GO TO 120 +C ********** ORDER EIGENVALUES ********** + 280 IF (L .EQ. 1) GO TO 320 +C ********** FOR I=L STEP -1 UNTIL 2 DO -- ********** + DO 300 II = 2, L + I = L + 2 - II + IF (P .GE. W(I-1)) GO TO 340 + W(I) = W(I-1) + IND(I) = IND(I-1) + 300 CONTINUE +C + 320 I = 1 + 340 W(I) = P + IND(I) = TAG + 360 CONTINUE +C + GO TO 400 +C ********** SET ERROR -- NO CONVERGENCE TO AN +C EIGENVALUE AFTER 30 ITERATIONS ********** + 380 IERR = L + 400 RETURN +C ********** LAST CARD OF IMTQLV ********** + END +C*MODULE EIGEN *DECK JACDG + SUBROUTINE JACDG(A,VEC,EIG,JBIG,BIG,LDVEC,N) +C + IMPLICIT DOUBLE PRECISION(A-H,O-Z) +C + DIMENSION A(*),VEC(LDVEC,N),EIG(N),JBIG(N),BIG(N) +C + PARAMETER (ONE=1.0D+00) +C +C ----- JACOBI DIAGONALIZATION OF SYMMETRIC MATRIX ----- +C SYMMETRIC MATRIX -A- OF DIMENSION -N- IS DESTROYED ON EXIT. +C ALL EIGENVECTORS ARE FOUND, SO -VEC- MUST BE SQUARE, +C UNLESS SOMEONE TAKES THE TROUBLE TO LOOK AT -NMAX- BELOW. +C -BIG- AND -JBIG- ARE SCRATCH WORK ARRAYS. +C + CALL VCLR(VEC,1,LDVEC*N) + DO 20 I = 1,N + VEC(I,I) = ONE + 20 CONTINUE +C + NB1 = N + NB2 = (NB1*NB1+NB1)/2 + NMIN = 1 + NMAX = NB1 +C + CALL JACDIA(A,VEC,NB1,NB2,LDVEC,NMIN,NMAX,BIG,JBIG) +C + DO 30 I=1,N + EIG(I) = A((I*I+I)/2) + 30 CONTINUE +C + CALL JACORD(VEC,EIG,NB1,LDVEC) + RETURN + END +C*MODULE EIGEN *DECK JACDIA + SUBROUTINE JACDIA(F,VEC,NB1,NB2,LDVEC,NMIN,NMAX,BIG,JBIG) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + LOGICAL GOPARR,DSKWRK,MASWRK + DIMENSION F(NB2),VEC(LDVEC,NB1),BIG(NB1),JBIG(NB1) +C + COMMON /PAR / ME,MASTER,NPROC,IBTYP,IPTIM,GOPARR,DSKWRK,MASWRK +C + PARAMETER (ROOT2=0.707106781186548D+00 ) + PARAMETER (ZERO=0.0D+00, ONE=1.0D+00, D1050=1.05D+00, + * D1500=1.5D+00, D3875=3.875D+00, + * D0500=0.5D+00, D1375=1.375D+00, D0250=0.25D+00 ) + PARAMETER (C2=1.0D-12, C3=4.0D-16, + * C4=2.0D-16, C5=8.0D-09, C6=3.0D-06 ) +C +C F IS THE MATRIX TO BE DIAGONALIZED, F IS STORED TRIANGULAR +C VEC IS THE ARRAY OF EIGENVECTORS, DIMENSION NB1*NB1 +C BIG AND JBIG ARE TEMPORARY SCRATCH AREAS OF DIMENSION NB1 +C THE ROTATIONS AMONG THE FIRST NMIN BASIS FUNCTIONS ARE NOT +C ACCOUNTED FOR. +C THE ROTATIONS AMONG THE LAST NB1-NMAX BASIS FUNCTIONS ARE NOT +C ACCOUNTED FOR. +C + IEAA=0 + IEAB=0 + TT=ZERO + EPS = 64.0D+00*EPSLON(ONE) +C +C LOOP OVER COLUMNS (K) OF TRIANGULAR MATRIX TO DETERMINE +C LARGEST OFF-DIAGONAL ELEMENTS IN ROW(I). +C + DO 20 I=1,NB1 + BIG(I)=ZERO + JBIG(I)=0 + IF(I.LT.NMIN .OR. I.EQ.1) GO TO 20 + II = (I*I-I)/2 + J=MIN(I-1,NMAX) + DO 10 K=1,J + IF(ABS(BIG(I)).GE.ABS(F(II+K))) GO TO 10 + BIG(I)=F(II+K) + JBIG(I)=K + 10 CONTINUE + 20 CONTINUE +C +C ----- 2X2 JACOBI ITERATIONS BEGIN HERE ----- +C + MAXIT=MAX(NB2*20,500) + ITER=0 + 30 CONTINUE + ITER=ITER+1 +C +C FIND SMALLEST DIAGONAL ELEMENT +C + SD=D1050 + JJ=0 + DO 40 J=1,NB1 + JJ=JJ+J + SD= MIN(SD,ABS(F(JJ))) + 40 CONTINUE + TEST = MAX(EPS, C2*MAX(SD,C6)) +C +C FIND LARGEST OFF-DIAGONAL ELEMENT +C + T=ZERO + I1=MAX(2,NMIN) + IB = I1 + DO 50 I=I1,NB1 + IF(T.GE.ABS(BIG(I))) GO TO 50 + T= ABS(BIG(I)) + IB=I + 50 CONTINUE +C +C TEST FOR CONVERGENCE, THEN DETERMINE ROTATION. +C + IF(T.LT.TEST) RETURN +C ****** +C + IF(ITER.GT.MAXIT) THEN + IF (MASWRK) THEN + WRITE(6,*) 'JACOBI DIAGONALIZATION FAILS, DIMENSION=',NB1 + WRITE(6,9020) ITER,T,TEST,SD + ENDIF + CALL ABRT + STOP + END IF +C + IA=JBIG(IB) + IAA=IA*(IA-1)/2 + IBB=IB*(IB-1)/2 + DIF=F(IAA+IA)-F(IBB+IB) + IF(ABS(DIF).GT.C3*T) GO TO 70 + SX=ROOT2 + CX=ROOT2 + GO TO 110 + 70 T2X2=BIG(IB)/DIF + T2X25=T2X2*T2X2 + IF(T2X25 . GT . C4) GO TO 80 + CX=ONE + SX=T2X2 + GO TO 110 + 80 IF(T2X25 . GT . C5) GO TO 90 + SX=T2X2*(ONE-D1500*T2X25) + CX=ONE-D0500*T2X25 + GO TO 110 + 90 IF(T2X25 . GT . C6) GO TO 100 + CX=ONE+T2X25*(T2X25*D1375 - D0500) + SX= T2X2*(ONE + T2X25*(T2X25*D3875 - D1500)) + GO TO 110 + 100 T=D0250 / SQRT(D0250 + T2X25) + CX= SQRT(D0500 + T) + SX= SIGN( SQRT(D0500 - T),T2X2) + 110 IEAR=IAA+1 + IEBR=IBB+1 +C + DO 230 IR=1,NB1 + T=F(IEAR)*SX + F(IEAR)=F(IEAR)*CX+F(IEBR)*SX + F(IEBR)=T-F(IEBR)*CX + IF(IR-IA) 220,120,130 + 120 TT=F(IEBR) + IEAA=IEAR + IEAB=IEBR + F(IEBR)=BIG(IB) + IEAR=IEAR+IR-1 + IF(JBIG(IR)) 200,220,200 + 130 T=F(IEAR) + IT=IA + IEAR=IEAR+IR-1 + IF(IR-IB) 180,150,160 + 150 F(IEAA)=F(IEAA)*CX+F(IEAB)*SX + F(IEAB)=TT*CX+F(IEBR)*SX + F(IEBR)=TT*SX-F(IEBR)*CX + IEBR=IEBR+IR-1 + GO TO 200 + 160 IF( ABS(T) . GE . ABS(F(IEBR))) GO TO 170 + IF(IB.GT.NMAX) GO TO 170 + T=F(IEBR) + IT=IB + 170 IEBR=IEBR+IR-1 + 180 IF( ABS(T) . LT . ABS(BIG(IR))) GO TO 190 + BIG(IR) = T + JBIG(IR) = IT + GO TO 220 + 190 IF(IA . NE . JBIG(IR) . AND . IB . NE . JBIG(IR)) GO TO 220 + 200 KQ=IEAR-IR-IA+1 + BIG(IR)=ZERO + IR1=MIN(IR-1,NMAX) + DO 210 I=1,IR1 + K=KQ+I + IF(ABS(BIG(IR)) . GE . ABS(F(K))) GO TO 210 + BIG(IR) = F(K) + JBIG(IR)=I + 210 CONTINUE + 220 IEAR=IEAR+1 + 230 IEBR=IEBR+1 +C + DO 240 I=1,NB1 + T1=VEC(I,IA)*CX + VEC(I,IB)*SX + T2=VEC(I,IA)*SX - VEC(I,IB)*CX + VEC(I,IA)=T1 + VEC(I,IB)=T2 + 240 CONTINUE + GO TO 30 +C + 9020 FORMAT(1X,'ITER=',I6,' T,TEST,SD=',1P,3E20.10) + END +C*MODULE EIGEN *DECK JACORD + SUBROUTINE JACORD(VEC,EIG,N,LDVEC) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION VEC(LDVEC,N),EIG(N) +C +C ---- SORT EIGENDATA INTO ASCENDING ORDER ----- +C + DO 290 I = 1, N + JJ = I + DO 270 J = I, N + IF (EIG(J) .LT. EIG(JJ)) JJ = J + 270 CONTINUE + IF (JJ .EQ. I) GO TO 290 + T = EIG(JJ) + EIG(JJ) = EIG(I) + EIG(I) = T + DO 280 J = 1, N + T = VEC(J,JJ) + VEC(J,JJ) = VEC(J,I) + VEC(J,I) = T + 280 CONTINUE + 290 CONTINUE + RETURN + END +C*MODULE EIGEN *DECK TINVTB + SUBROUTINE TINVTB(NM,N,D,E,E2,M,W,IND,Z, + * IERR,RV1,RV2,RV3,RV4,RV6) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION D(N),E(N),E2(N),W(M),Z(NM,M), + * RV1(N),RV2(N),RV3(N),RV4(N),RV6(N),IND(M) + DOUBLE PRECISION MACHEP,NORM + INTEGER P,Q,R,S,TAG,GROUP +C ------------------------------------------------------------------ +C +C THIS ROUTINE IS A TRANSLATION OF THE INVERSE ITERATION TECH- +C NIQUE IN THE ALGOL PROCEDURE TRISTURM BY PETERS AND WILKINSON. +C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971). +C +C THIS ROUTINE FINDS THOSE EIGENVECTORS OF A TRIDIAGONAL +C SYMMETRIC MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES, +C USING INVERSE ITERATION. +C +C ON INPUT- +C +C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL +C ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE +C DIMENSION STATEMENT, +C +C N IS THE ORDER OF THE MATRIX, +C +C D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX, +C +C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX +C IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY, +C +C E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E, +C WITH ZEROS CORRESPONDING TO NEGLIGIBLE ELEMENTS OF E. +C E(I) IS CONSIDERED NEGLIGIBLE IF IT IS NOT LARGER THAN +C THE PRODUCT OF THE RELATIVE MACHINE PRECISION AND THE SUM +C OF THE MAGNITUDES OF D(I) AND D(I-1). E2(1) MUST CONTAIN +C 0.0 IF THE EIGENVALUES ARE IN ASCENDING ORDER, OR 2.0 +C IF THE EIGENVALUES ARE IN DESCENDING ORDER. IF BISECT, +C TRIDIB, OR IMTQLV HAS BEEN USED TO FIND THE EIGENVALUES, +C THEIR OUTPUT E2 ARRAY IS EXACTLY WHAT IS EXPECTED HERE, +C +C M IS THE NUMBER OF SPECIFIED EIGENVALUES, +C +C W CONTAINS THE M EIGENVALUES IN ASCENDING OR DESCENDING ORDER, +C +C IND CONTAINS IN ITS FIRST M POSITIONS THE SUBMATRIX INDICES +C ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W -- +C 1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX FROM +C THE TOP, 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC. +C +C ON OUTPUT- +C +C ALL INPUT ARRAYS ARE UNALTERED, +C +C Z CONTAINS THE ASSOCIATED SET OF ORTHONORMAL EIGENVECTORS. +C ANY VECTOR WHICH FAILS TO CONVERGE IS SET TO ZERO, +C +C IERR IS SET TO +C ZERO FOR NORMAL RETURN, +C -R IF THE EIGENVECTOR CORRESPONDING TO THE R-TH +C EIGENVALUE FAILS TO CONVERGE IN 5 ITERATIONS, +C +C RV1, RV2, RV3, RV4, AND RV6 ARE TEMPORARY STORAGE ARRAYS. +C +C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, +C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY +C +C ------------------------------------------------------------------ +C +C ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING +C THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC. +C +C ********** + MACHEP = 2.0D+00**(-50) +C + IERR = 0 + IF (M .EQ. 0) GO TO 680 + TAG = 0 + ORDER = 1.0D+00 - E2(1) + XU = 0.0D+00 + UK = 0.0D+00 + X0 = 0.0D+00 + U = 0.0D+00 + EPS2 = 0.0D+00 + EPS3 = 0.0D+00 + EPS4 = 0.0D+00 + GROUP = 0 + Q = 0 +C ********** ESTABLISH AND PROCESS NEXT SUBMATRIX ********** + 100 P = Q + 1 + IP = P + 1 +C + DO 120 Q = P, N + IF (Q .EQ. N) GO TO 140 + IF (E2(Q+1) .EQ. 0.0D+00) GO TO 140 + 120 CONTINUE +C ********** FIND VECTORS BY INVERSE ITERATION ********** + 140 TAG = TAG + 1 + IQMP = Q - P + 1 + S = 0 +C + DO 660 R = 1, M + IF (IND(R) .NE. TAG) GO TO 660 + ITS = 1 + X1 = W(R) + IF (S .NE. 0) GO TO 220 +C ********** CHECK FOR ISOLATED ROOT ********** + XU = 1.0D+00 + IF (P .NE. Q) GO TO 160 + RV6(P) = 1.0D+00 + GO TO 600 + 160 NORM = ABS(D(P)) +C + DO 180 I = IP, Q + 180 NORM = NORM + ABS(D(I)) + ABS(E(I)) +C ********** EPS2 IS THE CRITERION FOR GROUPING, +C EPS3 REPLACES ZERO PIVOTS AND EQUAL +C ROOTS ARE MODIFIED BY EPS3, +C EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW ********** + EPS2 = 1.0D-03 * NORM + EPS3 = MACHEP * NORM + UK = IQMP + EPS4 = UK * EPS3 + UK = EPS4 / SQRT(UK) + S = P + 200 GROUP = 0 + GO TO 240 +C ********** LOOK FOR CLOSE OR COINCIDENT ROOTS ********** + 220 IF (ABS(X1-X0) .GE. EPS2) GO TO 200 + GROUP = GROUP + 1 + IF (ORDER * (X1 - X0) .LE. 0.0D+00) X1 = X0 + ORDER * EPS3 +C ********** ELIMINATION WITH INTERCHANGES AND +C INITIALIZATION OF VECTOR ********** + 240 V = 0.0D+00 +C + DO 300 I = P, Q + RV6(I) = UK + IF (I .EQ. P) GO TO 280 + IF (ABS(E(I)) .LT. ABS(U)) GO TO 260 +C ********** WARNING -- A DIVIDE CHECK MAY OCCUR HERE IF +C E2 ARRAY HAS NOT BEEN SPECIFIED CORRECTLY ********** + XU = U / E(I) + RV4(I) = XU + RV1(I-1) = E(I) + RV2(I-1) = D(I) - X1 + RV3(I-1) = 0.0D+00 + IF (I .NE. Q) RV3(I-1) = E(I+1) + U = V - XU * RV2(I-1) + V = -XU * RV3(I-1) + GO TO 300 + 260 XU = E(I) / U + RV4(I) = XU + RV1(I-1) = U + RV2(I-1) = V + RV3(I-1) = 0.0D+00 + 280 U = D(I) - X1 - XU * V + IF (I .NE. Q) V = E(I+1) + 300 CONTINUE +C + IF (U .EQ. 0.0D+00) U = EPS3 + RV1(Q) = U + RV2(Q) = 0.0D+00 + RV3(Q) = 0.0D+00 +C ********** BACK SUBSTITUTION +C FOR I=Q STEP -1 UNTIL P DO -- ********** + 320 DO 340 II = P, Q + I = P + Q - II + RV6(I) = (RV6(I) - U * RV2(I) - V * RV3(I)) / RV1(I) + V = U + U = RV6(I) + 340 CONTINUE +C ********** ORTHOGONALIZE WITH RESPECT TO PREVIOUS +C MEMBERS OF GROUP ********** + IF (GROUP .EQ. 0) GO TO 400 + J = R +C + DO 380 JJ = 1, GROUP + 360 J = J - 1 + IF (IND(J) .NE. TAG) GO TO 360 + XU = DDOT(IQMP,RV6(P),1,Z(P,J),1) +C + CALL DAXPY(IQMP,-XU,Z(P,J),1,RV6(P),1) +C + 380 CONTINUE +C + 400 NORM = 0.0D+00 +C + DO 420 I = P, Q + 420 NORM = NORM + ABS(RV6(I)) +C + IF (NORM .GE. 1.0D+00) GO TO 560 +C ********** FORWARD SUBSTITUTION ********** + IF (ITS .EQ. 5) GO TO 540 + IF (NORM .NE. 0.0D+00) GO TO 440 + RV6(S) = EPS4 + S = S + 1 + IF (S .GT. Q) S = P + GO TO 480 + 440 XU = EPS4 / NORM +C + DO 460 I = P, Q + 460 RV6(I) = RV6(I) * XU +C ********** ELIMINATION OPERATIONS ON NEXT VECTOR +C ITERATE ********** + 480 DO 520 I = IP, Q + U = RV6(I) +C ********** IF RV1(I-1) .EQ. E(I), A ROW INTERCHANGE +C WAS PERFORMED EARLIER IN THE +C TRIANGULARIZATION PROCESS ********** + IF (RV1(I-1) .NE. E(I)) GO TO 500 + U = RV6(I-1) + RV6(I-1) = RV6(I) + 500 RV6(I) = U - RV4(I) * RV6(I-1) + 520 CONTINUE +C + ITS = ITS + 1 + GO TO 320 +C ********** SET ERROR -- NON-CONVERGED EIGENVECTOR ********** + 540 IERR = -R + XU = 0.0D+00 + GO TO 600 +C ********** NORMALIZE SO THAT SUM OF SQUARES IS +C 1 AND EXPAND TO FULL ORDER ********** + 560 U = 0.0D+00 +C + DO 580 I = P, Q + RV6(I) = RV6(I) / NORM + 580 U = U + RV6(I)**2 +C + XU = 1.0D+00 / SQRT(U) +C + 600 DO 620 I = 1, N + 620 Z(I,R) = 0.0D+00 +C + DO 640 I = P, Q + 640 Z(I,R) = RV6(I) * XU +C + X0 = X1 + 660 CONTINUE +C + IF (Q .LT. N) GO TO 100 + 680 RETURN +C ********** LAST CARD OF TINVIT ********** + END +C*MODULE EIGEN *DECK TQL2 +C +C ------------------------------------------------------------------ +C + SUBROUTINE TQL2(NM,N,D,E,Z,IERR) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DOUBLE PRECISION MACHEP + DIMENSION D(N),E(N),Z(NM,N) +C +C THIS ROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL2, +C NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, AND +C WILKINSON. +C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971). +C +C THIS ROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS +C OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE QL METHOD. +C THE EIGENVECTORS OF A FULL SYMMETRIC MATRIX CAN ALSO +C BE FOUND IF TRED2 HAS BEEN USED TO REDUCE THIS +C FULL MATRIX TO TRIDIAGONAL FORM. +C +C ON INPUT- +C +C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL +C ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE +C DIMENSION STATEMENT, +C +C N IS THE ORDER OF THE MATRIX, +C +C D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX, +C +C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX +C IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY, +C +C Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE +C REDUCTION BY TRED2, IF PERFORMED. IF THE EIGENVECTORS +C OF THE TRIDIAGONAL MATRIX ARE DESIRED, Z MUST CONTAIN +C THE IDENTITY MATRIX. +C +C ON OUTPUT- +C +C D CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN +C ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT BUT +C UNORDERED FOR INDICES 1,2,...,IERR-1, +C +C E HAS BEEN DESTROYED, +C +C Z CONTAINS ORTHONORMAL EIGENVECTORS OF THE SYMMETRIC +C TRIDIAGONAL (OR FULL) MATRIX. IF AN ERROR EXIT IS MADE, +C Z CONTAINS THE EIGENVECTORS ASSOCIATED WITH THE STORED +C EIGENVALUES, +C +C IERR IS SET TO +C ZERO FOR NORMAL RETURN, +C J IF THE J-TH EIGENVALUE HAS NOT BEEN +C DETERMINED AFTER 30 ITERATIONS. +C +C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, +C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY +C +C ------------------------------------------------------------------ +C +C ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING +C THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC. +C +C ********** + MACHEP = 2.0D+00**(-50) +C + IERR = 0 + IF (N .EQ. 1) GO TO 400 +C + DO 100 I = 2, N + 100 E(I-1) = E(I) +C + F = 0.0D+00 + B = 0.0D+00 + E(N) = 0.0D+00 +C + DO 300 L = 1, N + J = 0 + H = MACHEP * (ABS(D(L)) + ABS(E(L))) + IF (B .LT. H) B = H +C ********** LOOK FOR SMALL SUB-DIAGONAL ELEMENT ********** + DO 120 M = L, N + IF (ABS(E(M)) .LE. B) GO TO 140 +C ********** E(N) IS ALWAYS ZERO, SO THERE IS NO EXIT +C THROUGH THE BOTTOM OF THE LOOP ********** + 120 CONTINUE +C + 140 IF (M .EQ. L) GO TO 280 + 160 IF (J .EQ. 30) GO TO 380 + J = J + 1 +C ********** FORM SHIFT ********** + L1 = L + 1 + G = D(L) + P = (D(L1) - G) / (2.0D+00 * E(L)) + R = SQRT(P*P+1.0D+00) + D(L) = E(L) / (P + SIGN(R,P)) + H = G - D(L) +C + DO 180 I = L1, N + 180 D(I) = D(I) - H +C + F = F + H +C ********** QL TRANSFORMATION ********** + P = D(M) + C = 1.0D+00 + S = 0.0D+00 + MML = M - L +C ********** FOR I=M-1 STEP -1 UNTIL L DO -- ********** + DO 260 II = 1, MML + I = M - II + G = C * E(I) + H = C * P + IF (ABS(P) .LT. ABS(E(I))) GO TO 200 + C = E(I) / P + R = SQRT(C*C+1.0D+00) + E(I+1) = S * P * R + S = C / R + C = 1.0D+00 / R + GO TO 220 + 200 C = P / E(I) + R = SQRT(C*C+1.0D+00) + E(I+1) = S * E(I) * R + S = 1.0D+00 / R + C = C * S + 220 P = C * D(I) - S * G + D(I+1) = H + S * (C * G + S * D(I)) +C ********** FORM VECTOR ********** + CALL DROT(N,Z(1,I+1),1,Z(1,I),1,C,S) +C + 260 CONTINUE +C + E(L) = S * P + D(L) = C * P + IF (ABS(E(L)) .GT. B) GO TO 160 + 280 D(L) = D(L) + F + 300 CONTINUE +C ********** ORDER EIGENVALUES AND EIGENVECTORS ********** + DO 360 II = 2, N + I = II - 1 + K = I + P = D(I) +C + DO 320 J = II, N + IF (D(J) .GE. P) GO TO 320 + K = J + P = D(J) + 320 CONTINUE +C + IF (K .EQ. I) GO TO 360 + D(K) = D(I) + D(I) = P +C + CALL DSWAP(N,Z(1,I),1,Z(1,K),1) +C + 360 CONTINUE +C + GO TO 400 +C ********** SET ERROR -- NO CONVERGENCE TO AN +C EIGENVALUE AFTER 30 ITERATIONS ********** + 380 IERR = L + 400 RETURN +C ********** LAST CARD OF TQL2 ********** + END +C*MODULE EIGEN *DECK TRBK3B +C +C ------------------------------------------------------------------ +C + SUBROUTINE TRBK3B(NM,N,NV,A,M,Z) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION A(NV),Z(NM,M) +C +C THIS ROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRBAK3, +C NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. +C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). +C +C THIS ROUTINE FORMS THE EIGENVECTORS OF A REAL SYMMETRIC +C MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING +C SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY TRED3B. +C +C ON INPUT- +C +C NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL +C ARRAY PARAMETERS AS DECLARED IN THE CALLING ROUTINE +C DIMENSION STATEMENT, +C +C N IS THE ORDER OF THE MATRIX, +C +C NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A +C AS DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT, +C +C A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANSFORMATIONS +C USED IN THE REDUCTION BY TRED3B IN ITS FIRST +C N*(N+1)/2 POSITIONS, +C +C M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED, +C +C Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED +C IN ITS FIRST M COLUMNS. +C +C ON OUTPUT- +C +C Z CONTAINS THE TRANSFORMED EIGENVECTORS +C IN ITS FIRST M COLUMNS. +C +C NOTE THAT TRBAK3 PRESERVES VECTOR EUCLIDEAN NORMS. +C +C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, +C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY +C +C ------------------------------------------------------------------ +C + IF (M .EQ. 0) GO TO 140 + IF (N .EQ. 1) GO TO 140 +C + DO 120 I = 2, N + L = I - 1 + IZ = (I * L) / 2 + IK = IZ + I + H = A(IK) + IF (H .EQ. 0.0D+00) GO TO 120 +C + DO 100 J = 1, M + S = -DDOT(L,A(IZ+1),1,Z(1,J),1) +C +C ********** DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ********** + S = (S / H) / H +C + CALL DAXPY(L,S,A(IZ+1),1,Z(1,J),1) +C + 100 CONTINUE +C + 120 CONTINUE +C + 140 RETURN +C ********** LAST CARD OF TRBAK3 ********** + END +C*MODULE EIGEN *DECK TRED3B +C +C ------------------------------------------------------------------ +C + SUBROUTINE TRED3B(N,NV,A,D,E,E2) + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + DIMENSION A(NV),D(N),E(N),E2(N) +C +C THIS ROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED3, +C NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. +C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). +C +C THIS ROUTINE REDUCES A REAL SYMMETRIC MATRIX, STORED AS +C A ONE-DIMENSIONAL ARRAY, TO A SYMMETRIC TRIDIAGONAL MATRIX +C USING ORTHOGONAL SIMILARITY TRANSFORMATIONS. +C +C ON INPUT- +C +C N IS THE ORDER OF THE MATRIX, +C +C NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A +C AS DECLARED IN THE CALLING ROUTINE DIMENSION STATEMENT, +C +C A CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC +C INPUT MATRIX, STORED ROW-WISE AS A ONE-DIMENSIONAL +C ARRAY, IN ITS FIRST N*(N+1)/2 POSITIONS. +C +C ON OUTPUT- +C +C A CONTAINS INFORMATION ABOUT THE ORTHOGONAL +C TRANSFORMATIONS USED IN THE REDUCTION, +C +C D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX, +C +C E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL +C MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO, +C +C E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. +C E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. +C +C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW, +C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY +C +C ------------------------------------------------------------------ +C +C ********** FOR I=N STEP -1 UNTIL 1 DO -- ********** + DO 300 II = 1, N + I = N + 1 - II + L = I - 1 + IZ = (I * L) / 2 + H = 0.0D+00 + SCALE = 0.0D+00 + IF (L .LT. 1) GO TO 120 +C ********** SCALE ROW (ALGOL TOL THEN NOT NEEDED) ********** + DO 100 K = 1, L + IZ = IZ + 1 + D(K) = A(IZ) + SCALE = SCALE + ABS(D(K)) + 100 CONTINUE +C + IF (SCALE .NE. 0.0D+00) GO TO 140 + 120 E(I) = 0.0D+00 + E2(I) = 0.0D+00 + GO TO 280 +C + 140 DO 160 K = 1, L + D(K) = D(K) / SCALE + H = H + D(K) * D(K) + 160 CONTINUE +C + E2(I) = SCALE * SCALE * H + F = D(L) + G = -SIGN(SQRT(H),F) + E(I) = SCALE * G + H = H - F * G + D(L) = F - G + A(IZ) = SCALE * D(L) + IF (L .EQ. 1) GO TO 280 + F = 0.0D+00 +C + JK = 1 + DO 220 J = 1, L + JM1 = J - 1 + DT = D(J) + G = 0.0D+00 +C ********** FORM ELEMENT OF A*U ********** + IF (JM1 .EQ. 0) GO TO 200 + DO 180 K = 1, JM1 + E(K) = E(K) + DT * A(JK) + G = G + D(K) * A(JK) + JK = JK + 1 + 180 CONTINUE + 200 E(J) = G + A(JK) * DT + JK = JK + 1 +C ********** FORM ELEMENT OF P ********** + 220 CONTINUE + F = 0.0D+00 + DO 240 J = 1, L + E(J) = E(J) / H + F = F + E(J) * D(J) + 240 CONTINUE +C + HH = F / (H + H) + JK = 0 +C ********** FORM REDUCED A ********** + DO 260 J = 1, L + F = D(J) + G = E(J) - HH * F + E(J) = G +C + DO 260 K = 1, J + JK = JK + 1 + A(JK) = A(JK) - F * E(K) - G * D(K) + 260 CONTINUE +C + 280 D(I) = A(IZ+1) + A(IZ+1) = SCALE * SQRT(H) + 300 CONTINUE +C + RETURN +C ********** LAST CARD OF TRED3 ********** + END diff --git a/source/unres/src_MD-NEWSC/elecont.f b/source/unres/src_MD-NEWSC/elecont.f new file mode 100644 index 0000000..e9ed067 --- /dev/null +++ b/source/unres/src_MD-NEWSC/elecont.f @@ -0,0 +1,509 @@ + subroutine elecont(lprint,ncont,icont) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + logical lprint + double precision elpp_6(2,2),elpp_3(2,2),ael6_(2,2),ael3_(2,2) + double precision app_(2,2),bpp_(2,2),rpp_(2,2) + integer ncont,icont(2,maxcont) + double precision econt(maxcont) +* +* Load the constants of peptide bond - peptide bond interactions. +* Type 1 - ordinary peptide bond, type 2 - alkylated peptide bond (e.g. +* proline) - determined by averaging ECEPP energy. +* +* as of 7/06/91. +* +c data epp / 0.3045d0, 0.3649d0, 0.3649d0, 0.5743d0/ + data rpp_ / 4.5088d0, 4.5395d0, 4.5395d0, 4.4846d0/ + data elpp_6 /-0.2379d0,-0.2056d0,-0.2056d0,-0.0610d0/ + data elpp_3 / 0.0503d0, 0.0000d0, 0.0000d0, 0.0692d0/ + data elcutoff /-0.3d0/,elecutoff_14 /-0.5d0/ + if (lprint) write (iout,'(a)') + & "Constants of electrostatic interaction energy expression." + do i=1,2 + do j=1,2 + rri=rpp_(i,j)**6 + app_(i,j)=epp(i,j)*rri*rri + bpp_(i,j)=-2.0*epp(i,j)*rri + ael6_(i,j)=elpp_6(i,j)*4.2**6 + ael3_(i,j)=elpp_3(i,j)*4.2**3 + if (lprint) + & write (iout,'(2i2,4e15.4)') i,j,app_(i,j),bpp_(i,j),ael6_(i,j), + & ael3_(i,j) + enddo + enddo + ncont=0 + ees=0.0 + evdw=0.0 + do 1 i=nnt,nct-2 + xi=c(1,i) + yi=c(2,i) + zi=c(3,i) + dxi=c(1,i+1)-c(1,i) + dyi=c(2,i+1)-c(2,i) + dzi=c(3,i+1)-c(3,i) + xmedi=xi+0.5*dxi + ymedi=yi+0.5*dyi + zmedi=zi+0.5*dzi + do 4 j=i+2,nct-1 + ind=ind+1 + iteli=itel(i) + itelj=itel(j) + if (j.eq.i+2 .and. itelj.eq.2) iteli=2 + if (iteli.eq.2 .and. itelj.eq.2) goto 4 + aaa=app_(iteli,itelj) + bbb=bpp_(iteli,itelj) + ael6_i=ael6_(iteli,itelj) + ael3_i=ael3_(iteli,itelj) + dxj=c(1,j+1)-c(1,j) + dyj=c(2,j+1)-c(2,j) + dzj=c(3,j+1)-c(3,j) + xj=c(1,j)+0.5*dxj-xmedi + yj=c(2,j)+0.5*dyj-ymedi + zj=c(3,j)+0.5*dzj-zmedi + rrmij=1.0/(xj*xj+yj*yj+zj*zj) + rmij=sqrt(rrmij) + r3ij=rrmij*rmij + r6ij=r3ij*r3ij + vrmij=vblinv*rmij + cosa=(dxi*dxj+dyi*dyj+dzi*dzj)*vblinv2 + cosb=(xj*dxi+yj*dyi+zj*dzi)*vrmij + cosg=(xj*dxj+yj*dyj+zj*dzj)*vrmij + fac=cosa-3.0*cosb*cosg + ev1=aaa*r6ij*r6ij + ev2=bbb*r6ij + fac3=ael6_i*r6ij + fac4=ael3_i*r3ij + evdwij=ev1+ev2 + el1=fac3*(4.0+fac*fac-3.0*(cosb*cosb+cosg*cosg)) + el2=fac4*fac + eesij=el1+el2 + if (j.gt.i+2 .and. eesij.le.elcutoff .or. + & j.eq.i+2 .and. eesij.le.elecutoff_14) then + ncont=ncont+1 + icont(1,ncont)=i + icont(2,ncont)=j + econt(ncont)=eesij + endif + ees=ees+eesij + evdw=evdw+evdwij + 4 continue + 1 continue + if (lprint) then + write (iout,*) 'Total average electrostatic energy: ',ees + write (iout,*) 'VDW energy between peptide-group centers: ',evdw + write (iout,*) + write (iout,*) 'Electrostatic contacts before pruning: ' + do i=1,ncont + i1=icont(1,i) + i2=icont(2,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4,f10.5)') + & i,restyp(it1),i1,restyp(it2),i2,econt(i) + enddo + endif +c For given residues keep only the contacts with the greatest energy. + i=0 + do while (i.lt.ncont) + i=i+1 + ene=econt(i) + ic1=icont(1,i) + ic2=icont(2,i) + j=i + do while (j.lt.ncont) + j=j+1 + if (ic1.eq.icont(1,j).and.iabs(icont(2,j)-ic2).le.2 .or. + & ic2.eq.icont(2,j).and.iabs(icont(1,j)-ic1).le.2) then +c write (iout,*) "i",i," j",j," ic1",ic1," ic2",ic2, +c & " jc1",icont(1,j)," jc2",icont(2,j)," ncont",ncont + if (econt(j).lt.ene .and. icont(2,j).ne.icont(1,j)+2) then + if (ic1.eq.icont(1,j)) then + do k=1,ncont + if (k.ne.i .and. k.ne.j .and. icont(2,k).eq.icont(2,j) + & .and. iabs(icont(1,k)-ic1).le.2 .and. + & econt(k).lt.econt(j) ) goto 21 + enddo + else if (ic2.eq.icont(2,j) ) then + do k=1,ncont + if (k.ne.i .and. k.ne.j .and. icont(1,k).eq.icont(1,j) + & .and. iabs(icont(2,k)-ic2).le.2 .and. + & econt(k).lt.econt(j) ) goto 21 + enddo + endif +c Remove ith contact + do k=i+1,ncont + icont(1,k-1)=icont(1,k) + icont(2,k-1)=icont(2,k) + econt(k-1)=econt(k) + enddo + i=i-1 + ncont=ncont-1 +c write (iout,*) "ncont",ncont +c do k=1,ncont +c write (iout,*) icont(1,k),icont(2,k) +c enddo + goto 20 + else if (econt(j).gt.ene .and. ic2.ne.ic1+2) + & then + if (ic1.eq.icont(1,j)) then + do k=1,ncont + if (k.ne.i .and. k.ne.j .and. icont(2,k).eq.ic2 + & .and. iabs(icont(1,k)-icont(1,j)).le.2 .and. + & econt(k).lt.econt(i) ) goto 21 + enddo + else if (ic2.eq.icont(2,j) ) then + do k=1,ncont + if (k.ne.i .and. k.ne.j .and. icont(1,k).eq.ic1 + & .and. iabs(icont(2,k)-icont(2,j)).le.2 .and. + & econt(k).lt.econt(i) ) goto 21 + enddo + endif +c Remove jth contact + do k=j+1,ncont + icont(1,k-1)=icont(1,k) + icont(2,k-1)=icont(2,k) + econt(k-1)=econt(k) + enddo + ncont=ncont-1 +c write (iout,*) "ncont",ncont +c do k=1,ncont +c write (iout,*) icont(1,k),icont(2,k) +c enddo + j=j-1 + endif + endif + 21 continue + enddo + 20 continue + enddo + if (lprint) then + write (iout,*) + write (iout,*) 'Electrostatic contacts after pruning: ' + do i=1,ncont + i1=icont(1,i) + i2=icont(2,i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(i3,2x,a,i4,2x,a,i4,f10.5)') + & i,restyp(it1),i1,restyp(it2),i2,econt(i) + enddo + endif + return + end +c-------------------------------------------- + subroutine secondary2(lprint) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.DISTFIT' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.CONTROL' + integer ncont,icont(2,maxcont),isec(maxres,4),nsec(maxres) + logical lprint,not_done,freeres + double precision p1,p2 + external freeres + + if(.not.dccart) call chainbuild +cd call write_pdb(99,'sec structure',0d0) + ncont=0 + nbfrag=0 + nhfrag=0 + do i=1,nres + isec(i,1)=0 + isec(i,2)=0 + nsec(i)=0 + enddo + + call elecont(lprint,ncont,icont) + +c finding parallel beta +cd write (iout,*) '------- looking for parallel beta -----------' + nbeta=0 + nstrand=0 + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if(j1-i1.gt.5 .and. freeres(i1,j1,nsec,isec)) then + ii1=i1 + jj1=j1 +cd write (iout,*) i1,j1 + not_done=.true. + do while (not_done) + i1=i1+1 + j1=j1+1 + do j=1,ncont + if (i1.eq.icont(1,j) .and. j1.eq.icont(2,j) .and. + & freeres(i1,j1,nsec,isec)) goto 5 + enddo + not_done=.false. + 5 continue +cd write (iout,*) i1,j1,not_done + enddo + j1=j1-1 + i1=i1-1 + if (i1-ii1.gt.1) then + ii1=max0(ii1-1,1) + jj1=max0(jj1-1,1) + nbeta=nbeta+1 + if(lprint)write(iout,'(a,i3,4i4)')'parallel beta', + & nbeta,ii1,i1,jj1,j1 + + nbfrag=nbfrag+1 + bfrag(1,nbfrag)=ii1+1 + bfrag(2,nbfrag)=i1+1 + bfrag(3,nbfrag)=jj1+1 + bfrag(4,nbfrag)=min0(j1+1,nres) + + do ij=ii1,i1 + nsec(ij)=nsec(ij)+1 + isec(ij,nsec(ij))=nbeta + enddo + do ij=jj1,j1 + nsec(ij)=nsec(ij)+1 + isec(ij,nsec(ij))=nbeta + enddo + + if(lprint) then + nstrand=nstrand+1 + if (nbeta.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-1,"..",i1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-1,"..",i1-1,"'" + endif + nstrand=nstrand+1 + if (nbeta.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",jj1-1,"..",j1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",jj1-1,"..",j1-1,"'" + endif + write(12,'(a8,4i4)') + & "SetNeigh",ii1-1,i1-1,jj1-1,j1-1 + endif + endif + endif + enddo + +c finding alpha or 310 helix + + nhelix=0 + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + p1=phi(i1+2)*rad2deg + p2=0.0 + if (j1+2.le.nres) p2=phi(j1+2)*rad2deg + + + if (j1.eq.i1+3 .and. + & ((p1.ge.10.and.p1.le.80).or.i1.le.2).and. + & ((p2.ge.10.and.p2.le.80).or.j1.le.2.or.j1.ge.nres-3) )then +cd if (j1.eq.i1+3) write (iout,*) "found 1-4 ",i1,j1,p1,p2 +co if (j1.eq.i1+4) write (iout,*) "found 1-5 ",i1,j1,p1,p2 + ii1=i1 + jj1=j1 + if (nsec(ii1).eq.0) then + not_done=.true. + else + not_done=.false. + endif + do while (not_done) + i1=i1+1 + j1=j1+1 + do j=1,ncont + if (i1.eq.icont(1,j) .and. j1.eq.icont(2,j)) goto 10 + enddo + not_done=.false. + 10 continue + p1=phi(i1+2)*rad2deg + p2=phi(j1+2)*rad2deg + if (p1.lt.10.or.p1.gt.80.or.p2.lt.10.or.p2.gt.80) + & not_done=.false. +cd write (iout,*) i1,j1,not_done,p1,p2 + enddo + j1=j1+1 + if (j1-ii1.gt.5) then + nhelix=nhelix+1 +cd write (iout,*)'helix',nhelix,ii1,j1 + + nhfrag=nhfrag+1 + hfrag(1,nhfrag)=ii1 + hfrag(2,nhfrag)=j1 + + do ij=ii1,j1 + nsec(ij)=-1 + enddo + if (lprint) then + write (iout,'(a,i3,2i4)') "Helix",nhelix,ii1-1,j1-1 + if (nhelix.le.9) then + write(12,'(a17,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'helix",nhelix, + & "' 'num = ",ii1-1,"..",j1-2,"'" + else + write(12,'(a17,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'helix",nhelix, + & "' 'num = ",ii1-1,"..",j1-2,"'" + endif + endif + endif + endif + enddo + + if (nhelix.gt.0.and.lprint) then + write(12,'(a26,$)') "DefPropRes 'helix' 'helix1" + do i=2,nhelix + if (nhelix.le.9) then + write(12,'(a8,i1,$)') " | helix",i + else + write(12,'(a8,i2,$)') " | helix",i + endif + enddo + write(12,'(a1)') "'" + endif + + +c finding antiparallel beta +cd write (iout,*) '--------- looking for antiparallel beta ---------' + + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if (freeres(i1,j1,nsec,isec)) then + ii1=i1 + jj1=j1 +cd write (iout,*) i1,j1 + + not_done=.true. + do while (not_done) + i1=i1+1 + j1=j1-1 + do j=1,ncont + if (i1.eq.icont(1,j).and.j1.eq.icont(2,j) .and. + & freeres(i1,j1,nsec,isec)) goto 6 + enddo + not_done=.false. + 6 continue +cd write (iout,*) i1,j1,not_done + enddo + i1=i1-1 + j1=j1+1 + if (i1-ii1.gt.1) then + + nbfrag=nbfrag+1 + bfrag(1,nbfrag)=ii1 + bfrag(2,nbfrag)=min0(i1+1,nres) + bfrag(3,nbfrag)=min0(jj1+1,nres) + bfrag(4,nbfrag)=j1 + + nbeta=nbeta+1 + iii1=max0(ii1-1,1) + do ij=iii1,i1 + nsec(ij)=nsec(ij)+1 + if (nsec(ij).le.2) then + isec(ij,nsec(ij))=nbeta + endif + enddo + jjj1=max0(j1-1,1) + do ij=jjj1,jj1 + nsec(ij)=nsec(ij)+1 + if (nsec(ij).le.2 .and. nsec(ij).gt.0) then + isec(ij,nsec(ij))=nbeta + endif + enddo + + + if (lprint) then + write (iout,'(a,i3,4i4)')'antiparallel beta', + & nbeta,ii1-1,i1,jj1,j1-1 + nstrand=nstrand+1 + if (nstrand.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-2,"..",i1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-2,"..",i1-1,"'" + endif + nstrand=nstrand+1 + if (nstrand.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",j1-2,"..",jj1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",j1-2,"..",jj1-1,"'" + endif + write(12,'(a8,4i4)') + & "SetNeigh",ii1-2,i1-1,jj1-1,j1-2 + endif + endif + endif + enddo + + if (nstrand.gt.0.and.lprint) then + write(12,'(a27,$)') "DefPropRes 'sheet' 'strand1" + do i=2,nstrand + if (i.le.9) then + write(12,'(a9,i1,$)') " | strand",i + else + write(12,'(a9,i2,$)') " | strand",i + endif + enddo + write(12,'(a1)') "'" + endif + + + + if (lprint) then + write(12,'(a37)') "DefPropRes 'coil' '! (helix | sheet)'" + write(12,'(a20)') "XMacStand ribbon.mac" + + + write(iout,*) 'UNRES seq:' + do j=1,nbfrag + write(iout,*) 'beta ',(bfrag(i,j),i=1,4) + enddo + + do j=1,nhfrag + write(iout,*) 'helix ',(hfrag(i,j),i=1,2) + enddo + endif + + return + end +c------------------------------------------------- + logical function freeres(i,j,nsec,isec) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer isec(maxres,4),nsec(maxres) + freeres=.false. + + if (nsec(i).lt.0.or.nsec(j).lt.0) return + if (nsec(i).gt.1.or.nsec(j).gt.1) return + do k=1,nsec(i) + do l=1,nsec(j) + if (isec(i,k).eq.isec(j,l)) return + enddo + enddo + freeres=.true. + return + end + diff --git a/source/unres/src_MD-NEWSC/energy_p_new-sep_barrier.F b/source/unres/src_MD-NEWSC/energy_p_new-sep_barrier.F new file mode 100644 index 0000000..c89aee2 --- /dev/null +++ b/source/unres/src_MD-NEWSC/energy_p_new-sep_barrier.F @@ -0,0 +1,2322 @@ +C----------------------------------------------------------------------- + double precision function sscale(r) + double precision r,gamm + include "COMMON.SPLITELE" + if(r.lt.r_cut-rlamb) then + sscale=1.0d0 + else if(r.le.r_cut.and.r.ge.r_cut-rlamb) then + gamm=(r-(r_cut-rlamb))/rlamb + sscale=1.0d0+gamm*gamm*(2*gamm-3.0d0) + else + sscale=0d0 + endif + return + end +C----------------------------------------------------------------------- + subroutine elj_long(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJ potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (accur=1.0d-10) + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.TORSION' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) +c write(iout,*)'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) +cd write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint), +cd & 'iend=',iend(i,iint) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + rij=xj*xj+yj*yj+zj*zj + sss=sscale(dsqrt(rij)/sigma(itypi,itypj)) + if (sss.lt.1.0d0) then + rrij=1.0D0/rij + eps0ij=eps(itypi,itypj) + fac=rrij**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e1+e2 + evdw=evdw+(1.0d0-sss)*evdwij +C +C Calculate the components of the gradient in DC and X +C + fac=-rrij*(e1+evdwij)*(1.0d0-sss) + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + endif + enddo ! j + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc(j,i)=expon*gvdwc(j,i) + gvdwx(j,i)=expon*gvdwx(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time, the factor of EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end +C----------------------------------------------------------------------- + subroutine elj_short(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJ potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (accur=1.0d-10) + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.TORSION' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) +c write(iout,*)'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C Change 12/1/95 + num_conti=0 +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) +cd write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint), +cd & 'iend=',iend(i,iint) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi +C Change 12/1/95 to calculate four-body interactions + rij=xj*xj+yj*yj+zj*zj + sss=sscale(dsqrt(rij)/sigma(itypi,itypj)) + if (sss.gt.0.0d0) then + rrij=1.0D0/rij + eps0ij=eps(itypi,itypj) + fac=rrij**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e1+e2 + evdw=evdw+sss*evdwij +C +C Calculate the components of the gradient in DC and X +C + fac=-rrij*(e1+evdwij)*sss + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + endif + enddo ! j + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc(j,i)=expon*gvdwc(j,i) + gvdwx(j,i)=expon*gvdwx(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time, the factor of EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end +C----------------------------------------------------------------------------- + subroutine eljk_long(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJK potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + dimension gg(3) + logical scheck +c print *,'Entering ELJK nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + fac_augm=rrij**expon + e_augm=augm(itypi,itypj)*fac_augm + r_inv_ij=dsqrt(rrij) + rij=1.0D0/r_inv_ij + sss=sscale(rij/sigma(itypi,itypj)) + if (sss.lt.1.0d0) then + r_shift_inv=1.0D0/(rij+r0(itypi,itypj)-sigma(itypi,itypj)) + fac=r_shift_inv**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e_augm+e1+e2 +cd sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +cd epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),8(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & restyp(itypi),i,restyp(itypj),j,aa(itypi,itypj), +cd & bb(itypi,itypj),augm(itypi,itypj),epsi,sigm, +cd & sigma(itypi,itypj),1.0D0/dsqrt(rrij),evdwij, +cd & (c(k,i),k=1,3),(c(k,j),k=1,3) + evdw=evdw+(1.0d0-sss)*evdwij +C +C Calculate the components of the gradient in DC and X +C + fac=-2.0D0*rrij*e_augm-r_inv_ij*r_shift_inv*(e1+e1+e2) + fac=fac*(1.0d0-sss) + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + endif + enddo ! j + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc(j,i)=expon*gvdwc(j,i) + gvdwx(j,i)=expon*gvdwx(j,i) + enddo + enddo + return + end +C----------------------------------------------------------------------------- + subroutine eljk_short(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJK potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + dimension gg(3) + logical scheck +c print *,'Entering ELJK nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + fac_augm=rrij**expon + e_augm=augm(itypi,itypj)*fac_augm + r_inv_ij=dsqrt(rrij) + rij=1.0D0/r_inv_ij + sss=sscale(rij/sigma(itypi,itypj)) + if (sss.gt.0.0d0) then + r_shift_inv=1.0D0/(rij+r0(itypi,itypj)-sigma(itypi,itypj)) + fac=r_shift_inv**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e_augm+e1+e2 +cd sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +cd epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),8(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & restyp(itypi),i,restyp(itypj),j,aa(itypi,itypj), +cd & bb(itypi,itypj),augm(itypi,itypj),epsi,sigm, +cd & sigma(itypi,itypj),1.0D0/dsqrt(rrij),evdwij, +cd & (c(k,i),k=1,3),(c(k,j),k=1,3) + evdw=evdw+sss*evdwij +C +C Calculate the components of the gradient in DC and X +C + fac=-2.0D0*rrij*e_augm-r_inv_ij*r_shift_inv*(e1+e1+e2) + fac=fac*sss + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + endif + enddo ! j + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc(j,i)=expon*gvdwc(j,i) + gvdwx(j,i)=expon*gvdwx(j,i) + enddo + enddo + return + end +C----------------------------------------------------------------------------- + subroutine ebp_long(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Berne-Pechukas potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + common /srutu/ icall +c double precision rrsave(maxdim) + logical lprn + evdw=0.0D0 +c print *,'Entering EBP nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 +c if (icall.eq.0) then +c lprn=.true. +c else + lprn=.false. +c endif + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.lt.1.0d0) then + +C Calculate the angle-dependent terms of energy & contributions to derivatives. + call sc_angular +C Calculate whole angle-dependent part of epsilon and contributions +C to its derivatives + fac=(rrij*sigsq)**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt + evdwij=evdwij*eps2rt*eps3rt + evdw=evdw+evdwij*(1.0d0-sss) + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),15(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & epsi,sigm,chi1,chi2,chip1,chip2, +cd & eps1,eps2rt**2,eps3rt**2,1.0D0/dsqrt(sigsq), +cd & om1,om2,om12,1.0D0/dsqrt(rrij), +cd & evdwij + endif +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij) + sigder=fac/sigsq + fac=rrij*fac +C Calculate radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate the angular part of the gradient and sum add the contributions +C to the appropriate components of the Cartesian gradient. + call sc_grad_scale(1.0d0-sss) + endif + enddo ! j + enddo ! iint + enddo ! i +c stop + return + end +C----------------------------------------------------------------------------- + subroutine ebp_short(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Berne-Pechukas potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + common /srutu/ icall +c double precision rrsave(maxdim) + logical lprn + evdw=0.0D0 +c print *,'Entering EBP nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 +c if (icall.eq.0) then +c lprn=.true. +c else + lprn=.false. +c endif + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.gt.0.0d0) then + +C Calculate the angle-dependent terms of energy & contributions to derivatives. + call sc_angular +C Calculate whole angle-dependent part of epsilon and contributions +C to its derivatives + fac=(rrij*sigsq)**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt + evdwij=evdwij*eps2rt*eps3rt + evdw=evdw+evdwij*sss + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),15(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & epsi,sigm,chi1,chi2,chip1,chip2, +cd & eps1,eps2rt**2,eps3rt**2,1.0D0/dsqrt(sigsq), +cd & om1,om2,om12,1.0D0/dsqrt(rrij), +cd & evdwij + endif +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij) + sigder=fac/sigsq + fac=rrij*fac +C Calculate radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate the angular part of the gradient and sum add the contributions +C to the appropriate components of the Cartesian gradient. + call sc_grad_scale(sss) + endif + enddo ! j + enddo ! iint + enddo ! i +c stop + return + end +C----------------------------------------------------------------------------- + subroutine egb_long(evdw,evdw_p,evdw_m) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Gay-Berne potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + include 'COMMON.CONTROL' + logical lprn +ccccc energy_dec=.false. +c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + evdw_p=0.0D0 + evdw_m=0.0D0 + lprn=.false. +c if (icall.eq.0) lprn=.false. + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +c write (iout,*) "i",i,dsc_inv(itypi),dsci_inv,1.0d0/vbld(i+nres) +c write (iout,*) "dcnori",dxi*dxi+dyi*dyi+dzi*dzi +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) +c write (iout,*) "j",j,dsc_inv(itypj),dscj_inv, +c & 1.0d0/vbld(j+nres) +c write (iout,*) "i",i," j", j," itype",itype(i),itype(j) + sig0ij=sigma(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.lt.1.0d0) then + +C Calculate angle-dependent terms of energy and contributions to their +C derivatives. + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+sig0ij +c for diagnostics; uncomment +c rij_shift=1.2*sig0ij +C I hate to put IF's in the loops, but here don't have another choice!!!! + if (rij_shift.le.0.0D0) then + evdw=1.0D20 +cd write (iout,'(2(a3,i3,2x),17(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & rij_shift,1.0D0/rij,sig,sig0ij,sigsq,1-dsqrt(sigsq) + return + endif + sigder=-sig*sigsq +c--------------------------------------------------------------- + rij_shift=1.0D0/rij_shift + fac=rij_shift**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt +c write (iout,*) "sigsq",sigsq," sig",sig," eps2rt",eps2rt, +c & " eps3rt",eps3rt," eps1",eps1," e1",e1," e2",e2 + evdwij=evdwij*eps2rt*eps3rt +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + evdw_p=evdw_p+evdwij*(1.0d0-sss) + else + evdw_m=evdw_m+evdwij*(1.0d0-sss) + endif +#else + evdw=evdw+evdwij*(1.0d0-sss) +#endif + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) + write (iout,'(2(a3,i3,2x),17(0pf7.3))') + & restyp(itypi),i,restyp(itypj),j, + & epsi,sigm,chi1,chi2,chip1,chip2, + & eps1,eps2rt**2,eps3rt**2,sig,sig0ij, + & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, + & evdwij + endif + + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw',i,j,evdwij + +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij)*rij_shift + sigder=fac*sigder + fac=rij*fac +c fac=0.0d0 +C Calculate the radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate angular part of the gradient. +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + call sc_grad_scale_T(1.0d0-sss) + else + call sc_grad_scale(1.0d0-sss) + endif +#else + call sc_grad_scale(1.0d0-sss) +#endif + endif + enddo ! j + enddo ! iint + enddo ! i +c write (iout,*) "Number of loop steps in EGB:",ind +cccc energy_dec=.false. + return + end +C----------------------------------------------------------------------------- + subroutine egb_short(evdw,evdw_p,evdw_m) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Gay-Berne potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + include 'COMMON.CONTROL' + logical lprn + evdw=0.0D0 + evdw_p=0.0D0 + evdw_m=0.0D0 +ccccc energy_dec=.false. +c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + lprn=.false. +c if (icall.eq.0) lprn=.false. + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +c write (iout,*) "i",i,dsc_inv(itypi),dsci_inv,1.0d0/vbld(i+nres) +c write (iout,*) "dcnori",dxi*dxi+dyi*dyi+dzi*dzi +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) +c write (iout,*) "j",j,dsc_inv(itypj),dscj_inv, +c & 1.0d0/vbld(j+nres) +c write (iout,*) "i",i," j", j," itype",itype(i),itype(j) + sig0ij=sigma(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.gt.0.0d0) then + +C Calculate angle-dependent terms of energy and contributions to their +C derivatives. + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+sig0ij +c for diagnostics; uncomment +c rij_shift=1.2*sig0ij +C I hate to put IF's in the loops, but here don't have another choice!!!! + if (rij_shift.le.0.0D0) then + evdw=1.0D20 +cd write (iout,'(2(a3,i3,2x),17(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & rij_shift,1.0D0/rij,sig,sig0ij,sigsq,1-dsqrt(sigsq) + return + endif + sigder=-sig*sigsq +c--------------------------------------------------------------- + rij_shift=1.0D0/rij_shift + fac=rij_shift**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt +c write (iout,*) "sigsq",sigsq," sig",sig," eps2rt",eps2rt, +c & " eps3rt",eps3rt," eps1",eps1," e1",e1," e2",e2 + evdwij=evdwij*eps2rt*eps3rt +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + evdw_p=evdw_p+evdwij*sss + else + evdw_m=evdw_m+evdwij*sss + endif +#else + evdw=evdw+evdwij*sss +#endif + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) + write (iout,'(2(a3,i3,2x),17(0pf7.3))') + & restyp(itypi),i,restyp(itypj),j, + & epsi,sigm,chi1,chi2,chip1,chip2, + & eps1,eps2rt**2,eps3rt**2,sig,sig0ij, + & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, + & evdwij + endif + + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw',i,j,evdwij + +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij)*rij_shift + sigder=fac*sigder + fac=rij*fac +c fac=0.0d0 +C Calculate the radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate angular part of the gradient. +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + call sc_grad_scale_T(sss) + else + call sc_grad_scale(sss) + endif +#else + call sc_grad_scale(sss) +#endif + endif + enddo ! j + enddo ! iint + enddo ! i +c write (iout,*) "Number of loop steps in EGB:",ind +cccc energy_dec=.false. + return + end +C----------------------------------------------------------------------------- + subroutine egbv_long(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Gay-Berne-Vorobjev potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + common /srutu/ icall + logical lprn + evdw=0.0D0 +c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + lprn=.false. +c if (icall.eq.0) lprn=.true. + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) + sig0ij=sigma(itypi,itypj) + r0ij=r0(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.lt.1.0d0) then + +C Calculate angle-dependent terms of energy and contributions to their +C derivatives. + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+r0ij +C I hate to put IF's in the loops, but here don't have another choice!!!! + if (rij_shift.le.0.0D0) then + evdw=1.0D20 + return + endif + sigder=-sig*sigsq +c--------------------------------------------------------------- + rij_shift=1.0D0/rij_shift + fac=rij_shift**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt + fac_augm=rrij**expon + e_augm=augm(itypi,itypj)*fac_augm + evdwij=evdwij*eps2rt*eps3rt + evdw=evdw+(evdwij+e_augm)*(1.0d0-sss) + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) + write (iout,'(2(a3,i3,2x),17(0pf7.3))') + & restyp(itypi),i,restyp(itypj),j, + & epsi,sigm,sig,(augm(itypi,itypj)/epsi)**(1.0D0/12.0D0), + & chi1,chi2,chip1,chip2, + & eps1,eps2rt**2,eps3rt**2, + & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, + & evdwij+e_augm + endif +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij)*rij_shift + sigder=fac*sigder + fac=rij*fac-2*expon*rrij*e_augm +C Calculate the radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate angular part of the gradient. + call sc_grad_scale(1.0d0-sss) + endif + enddo ! j + enddo ! iint + enddo ! i + end +C----------------------------------------------------------------------------- + subroutine egbv_short(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Gay-Berne-Vorobjev potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + common /srutu/ icall + logical lprn + evdw=0.0D0 +c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + lprn=.false. +c if (icall.eq.0) lprn=.true. + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(i+nres) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(j+nres) + sig0ij=sigma(itypi,itypj) + r0ij=r0(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + + sss=sscale(1.0d0/(rij*sigmaii(itypi,itypj))) + + if (sss.gt.0.0d0) then + +C Calculate angle-dependent terms of energy and contributions to their +C derivatives. + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+r0ij +C I hate to put IF's in the loops, but here don't have another choice!!!! + if (rij_shift.le.0.0D0) then + evdw=1.0D20 + return + endif + sigder=-sig*sigsq +c--------------------------------------------------------------- + rij_shift=1.0D0/rij_shift + fac=rij_shift**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt + fac_augm=rrij**expon + e_augm=augm(itypi,itypj)*fac_augm + evdwij=evdwij*eps2rt*eps3rt + evdw=evdw+(evdwij+e_augm)*sss + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) + write (iout,'(2(a3,i3,2x),17(0pf7.3))') + & restyp(itypi),i,restyp(itypj),j, + & epsi,sigm,sig,(augm(itypi,itypj)/epsi)**(1.0D0/12.0D0), + & chi1,chi2,chip1,chip2, + & eps1,eps2rt**2,eps3rt**2, + & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, + & evdwij+e_augm + endif +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij)*rij_shift + sigder=fac*sigder + fac=rij*fac-2*expon*rrij*e_augm +C Calculate the radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate angular part of the gradient. + call sc_grad_scale(sss) + endif + enddo ! j + enddo ! iint + enddo ! i + end +C---------------------------------------------------------------------------- + subroutine sc_grad_scale(scalfac) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.CALC' + include 'COMMON.IOUNITS' + double precision dcosom1(3),dcosom2(3) + double precision scalfac + eom1=eps2der*eps2rt_om1-2.0D0*alf1*eps3der+sigder*sigsq_om1 + eom2=eps2der*eps2rt_om2+2.0D0*alf2*eps3der+sigder*sigsq_om2 + eom12=evdwij*eps1_om12+eps2der*eps2rt_om12 + & -2.0D0*alf12*eps3der+sigder*sigsq_om12 +c diagnostics only +c eom1=0.0d0 +c eom2=0.0d0 +c eom12=evdwij*eps1_om12 +c end diagnostics +c write (iout,*) "eps2der",eps2der," eps3der",eps3der, +c & " sigder",sigder +c write (iout,*) "eps1_om12",eps1_om12," eps2rt_om12",eps2rt_om12 +c write (iout,*) "eom1",eom1," eom2",eom2," eom12",eom12 + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,nres+i)-om1*erij(k)) + dcosom2(k)=rij*(dc_norm(k,nres+j)-om2*erij(k)) + enddo + do k=1,3 + gg(k)=(gg(k)+eom1*dcosom1(k)+eom2*dcosom2(k))*scalfac + enddo +c write (iout,*) "gg",(gg(k),k=1,3) + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv*scalfac + gvdwx(k,j)=gvdwx(k,j)+gg(k) + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv*scalfac +c write (iout,*)(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) +c & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv +c write (iout,*)(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) +c & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + enddo +C +C Calculate the components of the gradient in DC and X +C + do l=1,3 + gvdwc(l,i)=gvdwc(l,i)-gg(l) + gvdwc(l,j)=gvdwc(l,j)+gg(l) + enddo + return + end +C---------------------------------------------------------------------------- + subroutine sc_grad_scale_T(scalfac) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.CALC' + include 'COMMON.IOUNITS' + double precision dcosom1(3),dcosom2(3) + double precision scalfac + eom1=eps2der*eps2rt_om1-2.0D0*alf1*eps3der+sigder*sigsq_om1 + eom2=eps2der*eps2rt_om2+2.0D0*alf2*eps3der+sigder*sigsq_om2 + eom12=evdwij*eps1_om12+eps2der*eps2rt_om12 + & -2.0D0*alf12*eps3der+sigder*sigsq_om12 +c diagnostics only +c eom1=0.0d0 +c eom2=0.0d0 +c eom12=evdwij*eps1_om12 +c end diagnostics +c write (iout,*) "eps2der",eps2der," eps3der",eps3der, +c & " sigder",sigder +c write (iout,*) "eps1_om12",eps1_om12," eps2rt_om12",eps2rt_om12 +c write (iout,*) "eom1",eom1," eom2",eom2," eom12",eom12 + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,nres+i)-om1*erij(k)) + dcosom2(k)=rij*(dc_norm(k,nres+j)-om2*erij(k)) + enddo + do k=1,3 + gg(k)=(gg(k)+eom1*dcosom1(k)+eom2*dcosom2(k))*scalfac + enddo +c write (iout,*) "gg",(gg(k),k=1,3) + do k=1,3 + gvdwxT(k,i)=gvdwxT(k,i)-gg(k) + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv*scalfac + gvdwxT(k,j)=gvdwxT(k,j)+gg(k) + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv*scalfac +c write (iout,*)(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) +c & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv +c write (iout,*)(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) +c & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + enddo +C +C Calculate the components of the gradient in DC and X +C + do l=1,3 + gvdwcT(l,i)=gvdwcT(l,i)-gg(l) + gvdwcT(l,j)=gvdwcT(l,j)+gg(l) + enddo + return + end + +C-------------------------------------------------------------------------- + subroutine eelec_scale(ees,evdw1,eel_loc,eello_turn3,eello_turn4) +C +C This subroutine calculates the average interaction energy and its gradient +C in the virtual-bond vectors between non-adjacent peptide groups, based on +C the potential described in Liwo et al., Protein Sci., 1993, 2, 1715. +C The potential depends both on the distance of peptide-group centers and on +C the orientation of the CA-CA virtual bonds. +C + implicit real*8 (a-h,o-z) +#ifdef MPI + include 'mpif.h' +#endif + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.TIME1' + dimension ggg(3),gggp(3),gggm(3),erij(3),dcosb(3),dcosg(3), + & erder(3,3),uryg(3,3),urzg(3,3),vryg(3,3),vrzg(3,3) + double precision acipa(2,2),agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions +#ifdef MOMENT + double precision scal_el /1.0d0/ +#else + double precision scal_el /0.5d0/ +#endif +C 12/13/98 +C 13-go grudnia roku pamietnego... + double precision unmat(3,3) /1.0d0,0.0d0,0.0d0, + & 0.0d0,1.0d0,0.0d0, + & 0.0d0,0.0d0,1.0d0/ +cd write(iout,*) 'In EELEC' +cd do i=1,nloctyp +cd write(iout,*) 'Type',i +cd write(iout,*) 'B1',B1(:,i) +cd write(iout,*) 'B2',B2(:,i) +cd write(iout,*) 'CC',CC(:,:,i) +cd write(iout,*) 'DD',DD(:,:,i) +cd write(iout,*) 'EE',EE(:,:,i) +cd enddo +cd call check_vecgrad +cd stop + if (icheckgrad.eq.1) then + do i=1,nres-1 + fac=1.0d0/dsqrt(scalar(dc(1,i),dc(1,i))) + do k=1,3 + dc_norm(k,i)=dc(k,i)*fac + enddo +c write (iout,*) 'i',i,' fac',fac + enddo + endif + if (wel_loc.gt.0.0d0 .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 + & .or. wcorr6.gt.0.0d0 .or. wturn3.gt.0.0d0 .or. + & wturn4.gt.0.0d0 .or. wturn6.gt.0.0d0) then +c call vec_and_deriv +#ifdef TIMING + time01=MPI_Wtime() +#endif + call set_matrices +#ifdef TIMING + time_mat=time_mat+MPI_Wtime()-time01 +#endif + endif +cd do i=1,nres-1 +cd write (iout,*) 'i=',i +cd do k=1,3 +cd write (iout,'(i5,2f10.5)') k,uy(k,i),uz(k,i) +cd enddo +cd do k=1,3 +cd write (iout,'(f10.5,2x,3f10.5,2x,3f10.5)') +cd & uz(k,i),(uzgrad(k,l,1,i),l=1,3),(uzgrad(k,l,2,i),l=1,3) +cd enddo +cd enddo + t_eelecij=0.0d0 + ees=0.0D0 + evdw1=0.0D0 + eel_loc=0.0d0 + eello_turn3=0.0d0 + eello_turn4=0.0d0 + ind=0 + do i=1,nres + num_cont_hb(i)=0 + enddo +cd print '(a)','Enter EELEC' +cd write (iout,*) 'iatel_s=',iatel_s,' iatel_e=',iatel_e + do i=1,nres + gel_loc_loc(i)=0.0d0 + gcorr_loc(i)=0.0d0 + enddo +c +c +c 9/27/08 AL Split the interaction loop to ensure load balancing of turn terms +C +C Loop over i,i+2 and i,i+3 pairs of the peptide groups +C + do i=iturn3_start,iturn3_end + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=0 + call eelecij_scale(i,i+2,ees,evdw1,eel_loc) + if (wturn3.gt.0.0d0) call eturn3(i,eello_turn3) + num_cont_hb(i)=num_conti + enddo + do i=iturn4_start,iturn4_end + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=num_cont_hb(i) + call eelecij_scale(i,i+3,ees,evdw1,eel_loc) + if (wturn4.gt.0.0d0) call eturn4(i,eello_turn4) + num_cont_hb(i)=num_conti + enddo ! i +c +c Loop over all pairs of interacting peptide groups except i,i+2 and i,i+3 +c + do i=iatel_s,iatel_e + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi +c write (iout,*) 'i',i,' ielstart',ielstart(i),' ielend',ielend(i) + num_conti=num_cont_hb(i) + do j=ielstart(i),ielend(i) + call eelecij_scale(i,j,ees,evdw1,eel_loc) + enddo ! j + num_cont_hb(i)=num_conti + enddo ! i +c write (iout,*) "Number of loop steps in EELEC:",ind +cd do i=1,nres +cd write (iout,'(i3,3f10.5,5x,3f10.5)') +cd & i,(gel_loc(k,i),k=1,3),gel_loc_loc(i) +cd enddo +c 12/7/99 Adam eello_turn3 will be considered as a separate energy term +ccc eel_loc=eel_loc+eello_turn3 +cd print *,"Processor",fg_rank," t_eelecij",t_eelecij + return + end +C------------------------------------------------------------------------------- + subroutine eelecij_scale(i,j,ees,evdw1,eel_loc) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.TIME1' + dimension ggg(3),gggp(3),gggm(3),erij(3),dcosb(3),dcosg(3), + & erder(3,3),uryg(3,3),urzg(3,3),vryg(3,3),vrzg(3,3) + double precision acipa(2,2),agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions +#ifdef MOMENT + double precision scal_el /1.0d0/ +#else + double precision scal_el /0.5d0/ +#endif +C 12/13/98 +C 13-go grudnia roku pamietnego... + double precision unmat(3,3) /1.0d0,0.0d0,0.0d0, + & 0.0d0,1.0d0,0.0d0, + & 0.0d0,0.0d0,1.0d0/ +c time00=MPI_Wtime() +cd write (iout,*) "eelecij",i,j + ind=ind+1 + iteli=itel(i) + itelj=itel(j) + if (j.eq.i+2 .and. itelj.eq.2) iteli=2 + aaa=app(iteli,itelj) + bbb=bpp(iteli,itelj) + ael6i=ael6(iteli,itelj) + ael3i=ael3(iteli,itelj) + dxj=dc(1,j) + dyj=dc(2,j) + dzj=dc(3,j) + dx_normj=dc_norm(1,j) + dy_normj=dc_norm(2,j) + dz_normj=dc_norm(3,j) + xj=c(1,j)+0.5D0*dxj-xmedi + yj=c(2,j)+0.5D0*dyj-ymedi + zj=c(3,j)+0.5D0*dzj-zmedi + rij=xj*xj+yj*yj+zj*zj + rrmij=1.0D0/rij + rij=dsqrt(rij) + rmij=1.0D0/rij +c For extracting the short-range part of Evdwpp + sss=sscale(rij/rpp(iteli,itelj)) + + r3ij=rrmij*rmij + r6ij=r3ij*r3ij + cosa=dx_normi*dx_normj+dy_normi*dy_normj+dz_normi*dz_normj + cosb=(xj*dx_normi+yj*dy_normi+zj*dz_normi)*rmij + cosg=(xj*dx_normj+yj*dy_normj+zj*dz_normj)*rmij + fac=cosa-3.0D0*cosb*cosg + ev1=aaa*r6ij*r6ij +c 4/26/02 - AL scaling down 1,4 repulsive VDW interactions + if (j.eq.i+2) ev1=scal_el*ev1 + ev2=bbb*r6ij + fac3=ael6i*r6ij + fac4=ael3i*r3ij + evdwij=ev1+ev2 + el1=fac3*(4.0D0+fac*fac-3.0D0*(cosb*cosb+cosg*cosg)) + el2=fac4*fac + eesij=el1+el2 +C 12/26/95 - for the evaluation of multi-body H-bonding interactions + ees0ij=4.0D0+fac*fac-3.0D0*(cosb*cosb+cosg*cosg) + ees=ees+eesij + evdw1=evdw1+evdwij*(1.0d0-sss) +cd write(iout,'(2(2i3,2x),7(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & iteli,i,itelj,j,aaa,bbb,ael6i,ael3i, +cd & 1.0D0/dsqrt(rrmij),evdwij,eesij, +cd & xmedi,ymedi,zmedi,xj,yj,zj + + if (energy_dec) then + write (iout,'(a6,2i5,0pf7.3,f7.3)') 'evdw1',i,j,evdwij,sss + write (iout,'(a6,2i5,0pf7.3)') 'ees',i,j,eesij + endif + +C +C Calculate contributions to the Cartesian gradient. +C +#ifdef SPLITELE + facvdw=-6*rrmij*(ev1+evdwij)*(1.0d0-sss) + facel=-3*rrmij*(el1+eesij) + fac1=fac + erij(1)=xj*rmij + erij(2)=yj*rmij + erij(3)=zj*rmij +* +* Radial derivatives. First process both termini of the fragment (i,j) +* + ggg(1)=facel*xj + ggg(2)=facel*yj + ggg(3)=facel*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c gelc(k,j)=gelc(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gelc_long(k,j)=gelc_long(k,j)+ggg(k) + gelc_long(k,i)=gelc_long(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gvdwpp(k,i)=gvdwpp(k,i)+ghalf +c gvdwpp(k,j)=gvdwpp(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gvdwpp(l,k)=gvdwpp(l,k)+ggg(l) +cgrad enddo +cgrad enddo +#else + facvdw=ev1+evdwij*(1.0d0-sss) + facel=el1+eesij + fac1=fac + fac=-3*rrmij*(facvdw+facvdw+facel) + erij(1)=xj*rmij + erij(2)=yj*rmij + erij(3)=zj*rmij +* +* Radial derivatives. First process both termini of the fragment (i,j) +* + ggg(1)=fac*xj + ggg(2)=fac*yj + ggg(3)=fac*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c gelc(k,j)=gelc(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gelc_long(k,j)=gelc(k,j)+ggg(k) + gelc_long(k,i)=gelc(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj + do k=1,3 + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + enddo +#endif +* +* Angular part +* + ecosa=2.0D0*fac3*fac1+fac4 + fac4=-3.0D0*fac4 + fac3=-6.0D0*fac3 + ecosb=(fac3*(fac1*cosg+cosb)+cosg*fac4) + ecosg=(fac3*(fac1*cosb+cosg)+cosb*fac4) + do k=1,3 + dcosb(k)=rmij*(dc_norm(k,i)-erij(k)*cosb) + dcosg(k)=rmij*(dc_norm(k,j)-erij(k)*cosg) + enddo +cd print '(2i3,2(3(1pd14.5),3x))',i,j,(dcosb(k),k=1,3), +cd & (dcosg(k),k=1,3) + do k=1,3 + ggg(k)=ecosb*dcosb(k)+ecosg*dcosg(k) + enddo +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c & +(ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i)) +c & + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) +c gelc(k,j)=gelc(k,j)+ghalf +c & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) +c & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) +c enddo +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gelc(k,i)=gelc(k,i) + & +(ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gelc(k,j)=gelc(k,j) + & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gelc_long(k,j)=gelc_long(k,j)+ggg(k) + gelc_long(k,i)=gelc_long(k,i)-ggg(k) + enddo + IF (wel_loc.gt.0.0d0 .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 + & .or. wcorr6.gt.0.0d0 .or. wturn3.gt.0.0d0 + & .or. wturn4.gt.0.0d0 .or. wturn6.gt.0.0d0) THEN +C +C 9/25/99 Mixed third-order local-electrostatic terms. The local-interaction +C energy of a peptide unit is assumed in the form of a second-order +C Fourier series in the angles lambda1 and lambda2 (see Nishikawa et al. +C Macromolecules, 1974, 7, 797-806 for definition). This correlation terms +C are computed for EVERY pair of non-contiguous peptide groups. +C + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + kkk=0 + do k=1,2 + do l=1,2 + kkk=kkk+1 + muij(kkk)=mu(k,i)*mu(l,j) + enddo + enddo +cd write (iout,*) 'EELEC: i',i,' j',j +cd write (iout,*) 'j',j,' j1',j1,' j2',j2 +cd write(iout,*) 'muij',muij + ury=scalar(uy(1,i),erij) + urz=scalar(uz(1,i),erij) + vry=scalar(uy(1,j),erij) + vrz=scalar(uz(1,j),erij) + a22=scalar(uy(1,i),uy(1,j))-3*ury*vry + a23=scalar(uy(1,i),uz(1,j))-3*ury*vrz + a32=scalar(uz(1,i),uy(1,j))-3*urz*vry + a33=scalar(uz(1,i),uz(1,j))-3*urz*vrz + fac=dsqrt(-ael6i)*r3ij + a22=a22*fac + a23=a23*fac + a32=a32*fac + a33=a33*fac +cd write (iout,'(4i5,4f10.5)') +cd & i,itortyp(itype(i)),j,itortyp(itype(j)),a22,a23,a32,a33 +cd write (iout,'(6f10.5)') (muij(k),k=1,4),fac,eel_loc_ij +cd write (iout,'(2(3f10.5,5x)/2(3f10.5,5x))') uy(:,i),uz(:,i), +cd & uy(:,j),uz(:,j) +cd write (iout,'(4f10.5)') +cd & scalar(uy(1,i),uy(1,j)),scalar(uy(1,i),uz(1,j)), +cd & scalar(uz(1,i),uy(1,j)),scalar(uz(1,i),uz(1,j)) +cd write (iout,'(4f10.5)') ury,urz,vry,vrz +cd write (iout,'(9f10.5/)') +cd & fac22,a22,fac23,a23,fac32,a32,fac33,a33,eel_loc_ij +C Derivatives of the elements of A in virtual-bond vectors + call unormderiv(erij(1),unmat(1,1),rmij,erder(1,1)) + do k=1,3 + uryg(k,1)=scalar(erder(1,k),uy(1,i)) + uryg(k,2)=scalar(uygrad(1,k,1,i),erij(1)) + uryg(k,3)=scalar(uygrad(1,k,2,i),erij(1)) + urzg(k,1)=scalar(erder(1,k),uz(1,i)) + urzg(k,2)=scalar(uzgrad(1,k,1,i),erij(1)) + urzg(k,3)=scalar(uzgrad(1,k,2,i),erij(1)) + vryg(k,1)=scalar(erder(1,k),uy(1,j)) + vryg(k,2)=scalar(uygrad(1,k,1,j),erij(1)) + vryg(k,3)=scalar(uygrad(1,k,2,j),erij(1)) + vrzg(k,1)=scalar(erder(1,k),uz(1,j)) + vrzg(k,2)=scalar(uzgrad(1,k,1,j),erij(1)) + vrzg(k,3)=scalar(uzgrad(1,k,2,j),erij(1)) + enddo +C Compute radial contributions to the gradient + facr=-3.0d0*rrmij + a22der=a22*facr + a23der=a23*facr + a32der=a32*facr + a33der=a33*facr + agg(1,1)=a22der*xj + agg(2,1)=a22der*yj + agg(3,1)=a22der*zj + agg(1,2)=a23der*xj + agg(2,2)=a23der*yj + agg(3,2)=a23der*zj + agg(1,3)=a32der*xj + agg(2,3)=a32der*yj + agg(3,3)=a32der*zj + agg(1,4)=a33der*xj + agg(2,4)=a33der*yj + agg(3,4)=a33der*zj +C Add the contributions coming from er + fac3=-3.0d0*fac + do k=1,3 + agg(k,1)=agg(k,1)+fac3*(uryg(k,1)*vry+vryg(k,1)*ury) + agg(k,2)=agg(k,2)+fac3*(uryg(k,1)*vrz+vrzg(k,1)*ury) + agg(k,3)=agg(k,3)+fac3*(urzg(k,1)*vry+vryg(k,1)*urz) + agg(k,4)=agg(k,4)+fac3*(urzg(k,1)*vrz+vrzg(k,1)*urz) + enddo + do k=1,3 +C Derivatives in DC(i) +cgrad ghalf1=0.5d0*agg(k,1) +cgrad ghalf2=0.5d0*agg(k,2) +cgrad ghalf3=0.5d0*agg(k,3) +cgrad ghalf4=0.5d0*agg(k,4) + aggi(k,1)=fac*(scalar(uygrad(1,k,1,i),uy(1,j)) + & -3.0d0*uryg(k,2)*vry)!+ghalf1 + aggi(k,2)=fac*(scalar(uygrad(1,k,1,i),uz(1,j)) + & -3.0d0*uryg(k,2)*vrz)!+ghalf2 + aggi(k,3)=fac*(scalar(uzgrad(1,k,1,i),uy(1,j)) + & -3.0d0*urzg(k,2)*vry)!+ghalf3 + aggi(k,4)=fac*(scalar(uzgrad(1,k,1,i),uz(1,j)) + & -3.0d0*urzg(k,2)*vrz)!+ghalf4 +C Derivatives in DC(i+1) + aggi1(k,1)=fac*(scalar(uygrad(1,k,2,i),uy(1,j)) + & -3.0d0*uryg(k,3)*vry)!+agg(k,1) + aggi1(k,2)=fac*(scalar(uygrad(1,k,2,i),uz(1,j)) + & -3.0d0*uryg(k,3)*vrz)!+agg(k,2) + aggi1(k,3)=fac*(scalar(uzgrad(1,k,2,i),uy(1,j)) + & -3.0d0*urzg(k,3)*vry)!+agg(k,3) + aggi1(k,4)=fac*(scalar(uzgrad(1,k,2,i),uz(1,j)) + & -3.0d0*urzg(k,3)*vrz)!+agg(k,4) +C Derivatives in DC(j) + aggj(k,1)=fac*(scalar(uygrad(1,k,1,j),uy(1,i)) + & -3.0d0*vryg(k,2)*ury)!+ghalf1 + aggj(k,2)=fac*(scalar(uzgrad(1,k,1,j),uy(1,i)) + & -3.0d0*vrzg(k,2)*ury)!+ghalf2 + aggj(k,3)=fac*(scalar(uygrad(1,k,1,j),uz(1,i)) + & -3.0d0*vryg(k,2)*urz)!+ghalf3 + aggj(k,4)=fac*(scalar(uzgrad(1,k,1,j),uz(1,i)) + & -3.0d0*vrzg(k,2)*urz)!+ghalf4 +C Derivatives in DC(j+1) or DC(nres-1) + aggj1(k,1)=fac*(scalar(uygrad(1,k,2,j),uy(1,i)) + & -3.0d0*vryg(k,3)*ury) + aggj1(k,2)=fac*(scalar(uzgrad(1,k,2,j),uy(1,i)) + & -3.0d0*vrzg(k,3)*ury) + aggj1(k,3)=fac*(scalar(uygrad(1,k,2,j),uz(1,i)) + & -3.0d0*vryg(k,3)*urz) + aggj1(k,4)=fac*(scalar(uzgrad(1,k,2,j),uz(1,i)) + & -3.0d0*vrzg(k,3)*urz) +cgrad if (j.eq.nres-1 .and. i.lt.j-2) then +cgrad do l=1,4 +cgrad aggj1(k,l)=aggj1(k,l)+agg(k,l) +cgrad enddo +cgrad endif + enddo + acipa(1,1)=a22 + acipa(1,2)=a23 + acipa(2,1)=a32 + acipa(2,2)=a33 + a22=-a22 + a23=-a23 + do l=1,2 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + if (j.lt.nres-1) then + a22=-a22 + a32=-a32 + do l=1,3,2 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + else + a22=-a22 + a23=-a23 + a32=-a32 + a33=-a33 + do l=1,4 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + endif + ENDIF ! WCORR + IF (wel_loc.gt.0.0d0) THEN +C Contribution to the local-electrostatic energy coming from the i-j pair + eel_loc_ij=a22*muij(1)+a23*muij(2)+a32*muij(3) + & +a33*muij(4) +cd write (iout,*) 'i',i,' j',j,' eel_loc_ij',eel_loc_ij + + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'eelloc',i,j,eel_loc_ij + + eel_loc=eel_loc+eel_loc_ij +C Partial derivatives in virtual-bond dihedral angles gamma + if (i.gt.1) + & gel_loc_loc(i-1)=gel_loc_loc(i-1)+ + & a22*muder(1,i)*mu(1,j)+a23*muder(1,i)*mu(2,j) + & +a32*muder(2,i)*mu(1,j)+a33*muder(2,i)*mu(2,j) + gel_loc_loc(j-1)=gel_loc_loc(j-1)+ + & a22*mu(1,i)*muder(1,j)+a23*mu(1,i)*muder(2,j) + & +a32*mu(2,i)*muder(1,j)+a33*mu(2,i)*muder(2,j) +C Derivatives of eello in DC(i+1) thru DC(j-1) or DC(nres-2) + do l=1,3 + ggg(l)=agg(l,1)*muij(1)+ + & agg(l,2)*muij(2)+agg(l,3)*muij(3)+agg(l,4)*muij(4) + gel_loc_long(l,j)=gel_loc_long(l,j)+ggg(l) + gel_loc_long(l,i)=gel_loc_long(l,i)-ggg(l) +cgrad ghalf=0.5d0*ggg(l) +cgrad gel_loc(l,i)=gel_loc(l,i)+ghalf +cgrad gel_loc(l,j)=gel_loc(l,j)+ghalf + enddo +cgrad do k=i+1,j2 +cgrad do l=1,3 +cgrad gel_loc(l,k)=gel_loc(l,k)+ggg(l) +cgrad enddo +cgrad enddo +C Remaining derivatives of eello + do l=1,3 + gel_loc(l,i)=gel_loc(l,i)+aggi(l,1)*muij(1)+ + & aggi(l,2)*muij(2)+aggi(l,3)*muij(3)+aggi(l,4)*muij(4) + gel_loc(l,i+1)=gel_loc(l,i+1)+aggi1(l,1)*muij(1)+ + & aggi1(l,2)*muij(2)+aggi1(l,3)*muij(3)+aggi1(l,4)*muij(4) + gel_loc(l,j)=gel_loc(l,j)+aggj(l,1)*muij(1)+ + & aggj(l,2)*muij(2)+aggj(l,3)*muij(3)+aggj(l,4)*muij(4) + gel_loc(l,j1)=gel_loc(l,j1)+aggj1(l,1)*muij(1)+ + & aggj1(l,2)*muij(2)+aggj1(l,3)*muij(3)+aggj1(l,4)*muij(4) + enddo + ENDIF +C Change 12/26/95 to calculate four-body contributions to H-bonding energy +c if (j.gt.i+1 .and. num_conti.le.maxconts) then + if (wcorr+wcorr4+wcorr5+wcorr6.gt.0.0d0 + & .and. num_conti.le.maxconts) then +c write (iout,*) i,j," entered corr" +C +C Calculate the contact function. The ith column of the array JCONT will +C contain the numbers of atoms that make contacts with the atom I (of numbers +C greater than I). The arrays FACONT and GACONT will contain the values of +C the contact function and its derivative. +c r0ij=1.02D0*rpp(iteli,itelj) +c r0ij=1.11D0*rpp(iteli,itelj) + r0ij=2.20D0*rpp(iteli,itelj) +c r0ij=1.55D0*rpp(iteli,itelj) + call gcont(rij,r0ij,1.0D0,0.2d0*r0ij,fcont,fprimcont) + if (fcont.gt.0.0D0) then + num_conti=num_conti+1 + if (num_conti.gt.maxconts) then + write (iout,*) 'WARNING - max. # of contacts exceeded;', + & ' will skip next contacts for this conf.' + else + jcont_hb(num_conti,i)=j +cd write (iout,*) "i",i," j",j," num_conti",num_conti, +cd & " jcont_hb",jcont_hb(num_conti,i) + IF (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. + & wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0) THEN +C 9/30/99 (AL) - store components necessary to evaluate higher-order loc-el +C terms. + d_cont(num_conti,i)=rij +cd write (2,'(3e15.5)') rij,r0ij+0.2d0*r0ij,rij +C --- Electrostatic-interaction matrix --- + a_chuj(1,1,num_conti,i)=a22 + a_chuj(1,2,num_conti,i)=a23 + a_chuj(2,1,num_conti,i)=a32 + a_chuj(2,2,num_conti,i)=a33 +C --- Gradient of rij + do kkk=1,3 + grij_hb_cont(kkk,num_conti,i)=erij(kkk) + enddo + kkll=0 + do k=1,2 + do l=1,2 + kkll=kkll+1 + do m=1,3 + a_chuj_der(k,l,m,1,num_conti,i)=agg(m,kkll) + a_chuj_der(k,l,m,2,num_conti,i)=aggi(m,kkll) + a_chuj_der(k,l,m,3,num_conti,i)=aggi1(m,kkll) + a_chuj_der(k,l,m,4,num_conti,i)=aggj(m,kkll) + a_chuj_der(k,l,m,5,num_conti,i)=aggj1(m,kkll) + enddo + enddo + enddo + ENDIF + IF (wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) THEN +C Calculate contact energies + cosa4=4.0D0*cosa + wij=cosa-3.0D0*cosb*cosg + cosbg1=cosb+cosg + cosbg2=cosb-cosg +c fac3=dsqrt(-ael6i)/r0ij**3 + fac3=dsqrt(-ael6i)*r3ij +c ees0pij=dsqrt(4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1) + ees0tmp=4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1 + if (ees0tmp.gt.0) then + ees0pij=dsqrt(ees0tmp) + else + ees0pij=0 + endif +c ees0mij=dsqrt(4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2) + ees0tmp=4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2 + if (ees0tmp.gt.0) then + ees0mij=dsqrt(ees0tmp) + else + ees0mij=0 + endif +c ees0mij=0.0D0 + ees0p(num_conti,i)=0.5D0*fac3*(ees0pij+ees0mij) + ees0m(num_conti,i)=0.5D0*fac3*(ees0pij-ees0mij) +C Diagnostics. Comment out or remove after debugging! +c ees0p(num_conti,i)=0.5D0*fac3*ees0pij +c ees0m(num_conti,i)=0.5D0*fac3*ees0mij +c ees0m(num_conti,i)=0.0D0 +C End diagnostics. +c write (iout,*) 'i=',i,' j=',j,' rij=',rij,' r0ij=',r0ij, +c & ' ees0ij=',ees0p(num_conti,i),ees0m(num_conti,i),' fcont=',fcont +C Angular derivatives of the contact function + ees0pij1=fac3/ees0pij + ees0mij1=fac3/ees0mij + fac3p=-3.0D0*fac3*rrmij + ees0pijp=0.5D0*fac3p*(ees0pij+ees0mij) + ees0mijp=0.5D0*fac3p*(ees0pij-ees0mij) +c ees0mij1=0.0D0 + ecosa1= ees0pij1*( 1.0D0+0.5D0*wij) + ecosb1=-1.5D0*ees0pij1*(wij*cosg+cosbg1) + ecosg1=-1.5D0*ees0pij1*(wij*cosb+cosbg1) + ecosa2= ees0mij1*(-1.0D0+0.5D0*wij) + ecosb2=-1.5D0*ees0mij1*(wij*cosg+cosbg2) + ecosg2=-1.5D0*ees0mij1*(wij*cosb-cosbg2) + ecosap=ecosa1+ecosa2 + ecosbp=ecosb1+ecosb2 + ecosgp=ecosg1+ecosg2 + ecosam=ecosa1-ecosa2 + ecosbm=ecosb1-ecosb2 + ecosgm=ecosg1-ecosg2 +C Diagnostics +c ecosap=ecosa1 +c ecosbp=ecosb1 +c ecosgp=ecosg1 +c ecosam=0.0D0 +c ecosbm=0.0D0 +c ecosgm=0.0D0 +C End diagnostics + facont_hb(num_conti,i)=fcont + fprimcont=fprimcont/rij +cd facont_hb(num_conti,i)=1.0D0 +C Following line is for diagnostics. +cd fprimcont=0.0D0 + do k=1,3 + dcosb(k)=rmij*(dc_norm(k,i)-erij(k)*cosb) + dcosg(k)=rmij*(dc_norm(k,j)-erij(k)*cosg) + enddo + do k=1,3 + gggp(k)=ecosbp*dcosb(k)+ecosgp*dcosg(k) + gggm(k)=ecosbm*dcosb(k)+ecosgm*dcosg(k) + enddo + gggp(1)=gggp(1)+ees0pijp*xj + gggp(2)=gggp(2)+ees0pijp*yj + gggp(3)=gggp(3)+ees0pijp*zj + gggm(1)=gggm(1)+ees0mijp*xj + gggm(2)=gggm(2)+ees0mijp*yj + gggm(3)=gggm(3)+ees0mijp*zj +C Derivatives due to the contact function + gacont_hbr(1,num_conti,i)=fprimcont*xj + gacont_hbr(2,num_conti,i)=fprimcont*yj + gacont_hbr(3,num_conti,i)=fprimcont*zj + do k=1,3 +c +c 10/24/08 cgrad and ! comments indicate the parts of the code removed +c following the change of gradient-summation algorithm. +c +cgrad ghalfp=0.5D0*gggp(k) +cgrad ghalfm=0.5D0*gggm(k) + gacontp_hb1(k,num_conti,i)=!ghalfp + & +(ecosap*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosbp*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gacontp_hb2(k,num_conti,i)=!ghalfp + & +(ecosap*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosgp*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gacontp_hb3(k,num_conti,i)=gggp(k) + gacontm_hb1(k,num_conti,i)=!ghalfm + & +(ecosam*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosbm*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gacontm_hb2(k,num_conti,i)=!ghalfm + & +(ecosam*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosgm*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gacontm_hb3(k,num_conti,i)=gggm(k) + enddo + ENDIF ! wcorr + endif ! num_conti.le.maxconts + endif ! fcont.gt.0 + endif ! j.gt.i+1 + if (wturn3.gt.0.0d0 .or. wturn4.gt.0.0d0) then + do k=1,4 + do l=1,3 + ghalf=0.5d0*agg(l,k) + aggi(l,k)=aggi(l,k)+ghalf + aggi1(l,k)=aggi1(l,k)+agg(l,k) + aggj(l,k)=aggj(l,k)+ghalf + enddo + enddo + if (j.eq.nres-1 .and. i.lt.j-2) then + do k=1,4 + do l=1,3 + aggj1(l,k)=aggj1(l,k)+agg(l,k) + enddo + enddo + endif + endif +c t_eelecij=t_eelecij+MPI_Wtime()-time00 + return + end +C----------------------------------------------------------------------- + subroutine evdwpp_short(evdw1) +C +C Compute Evdwpp +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + dimension ggg(3) +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions +#ifdef MOMENT + double precision scal_el /1.0d0/ +#else + double precision scal_el /0.5d0/ +#endif + evdw1=0.0D0 +c write (iout,*) "iatel_s_vdw",iatel_s_vdw, +c & " iatel_e_vdw",iatel_e_vdw + call flush(iout) + do i=iatel_s_vdw,iatel_e_vdw + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=0 +c write (iout,*) 'i',i,' ielstart',ielstart_vdw(i), +c & ' ielend',ielend_vdw(i) + call flush(iout) + do j=ielstart_vdw(i),ielend_vdw(i) + ind=ind+1 + iteli=itel(i) + itelj=itel(j) + if (j.eq.i+2 .and. itelj.eq.2) iteli=2 + aaa=app(iteli,itelj) + bbb=bpp(iteli,itelj) + dxj=dc(1,j) + dyj=dc(2,j) + dzj=dc(3,j) + dx_normj=dc_norm(1,j) + dy_normj=dc_norm(2,j) + dz_normj=dc_norm(3,j) + xj=c(1,j)+0.5D0*dxj-xmedi + yj=c(2,j)+0.5D0*dyj-ymedi + zj=c(3,j)+0.5D0*dzj-zmedi + rij=xj*xj+yj*yj+zj*zj + rrmij=1.0D0/rij + rij=dsqrt(rij) + sss=sscale(rij/rpp(iteli,itelj)) + if (sss.gt.0.0d0) then + rmij=1.0D0/rij + r3ij=rrmij*rmij + r6ij=r3ij*r3ij + ev1=aaa*r6ij*r6ij +c 4/26/02 - AL scaling down 1,4 repulsive VDW interactions + if (j.eq.i+2) ev1=scal_el*ev1 + ev2=bbb*r6ij + evdwij=ev1+ev2 + if (energy_dec) then + write (iout,'(a6,2i5,0pf7.3,f7.3)') 'evdw1',i,j,evdwij,sss + endif + evdw1=evdw1+evdwij*sss +C +C Calculate contributions to the Cartesian gradient. +C + facvdw=-6*rrmij*(ev1+evdwij)*sss + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj + do k=1,3 + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + enddo + endif + enddo ! j + enddo ! i + return + end +C----------------------------------------------------------------------------- + subroutine escp_long(evdw2,evdw2_14) +C +C This subroutine calculates the excluded-volume interaction energy between +C peptide-group centers and side chains and its gradient in virtual-bond and +C side-chain vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 +cd print '(a)','Enter ESCP' +cd write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e + do i=iatscp_s,iatscp_e + iteli=itel(i) + xi=0.5D0*(c(1,i)+c(1,i+1)) + yi=0.5D0*(c(2,i)+c(2,i+1)) + zi=0.5D0*(c(3,i)+c(3,i+1)) + + do iint=1,nscp_gr(i) + + do j=iscpstart(i,iint),iscpend(i,iint) + itypj=itype(j) +C Uncomment following three lines for SC-p interactions +c xj=c(1,nres+j)-xi +c yj=c(2,nres+j)-yi +c zj=c(3,nres+j)-zi +C Uncomment following three lines for Ca-p interactions + xj=c(1,j)-xi + yj=c(2,j)-yi + zj=c(3,j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + + sss=sscale(1.0d0/(dsqrt(rrij)*rscp(itypj,iteli))) + + if (sss.lt.1.0d0) then + + fac=rrij**expon2 + e1=fac*fac*aad(itypj,iteli) + e2=fac*bad(itypj,iteli) + if (iabs(j-i) .le. 2) then + e1=scal14*e1 + e2=scal14*e2 + evdw2_14=evdw2_14+(e1+e2)*(1.0d0-sss) + endif + evdwij=e1+e2 + evdw2=evdw2+evdwij*(1.0d0-sss) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw2',i,j,evdwij +C +C Calculate contributions to the gradient in the virtual-bond and SC vectors. +C + fac=-(evdwij+e1)*rrij*(1.0d0-sss) + ggg(1)=xj*fac + ggg(2)=yj*fac + ggg(3)=zj*fac +C Uncomment following three lines for SC-p interactions +c do k=1,3 +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) +c enddo +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + endif + enddo + + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(j,i) + gvdwc_scpp(j,i)=expon*gvdwc_scpp(j,i) + gradx_scp(j,i)=expon*gradx_scp(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time the factor EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end +C----------------------------------------------------------------------------- + subroutine escp_short(evdw2,evdw2_14) +C +C This subroutine calculates the excluded-volume interaction energy between +C peptide-group centers and side chains and its gradient in virtual-bond and +C side-chain vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 +cd print '(a)','Enter ESCP' +cd write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e + do i=iatscp_s,iatscp_e + iteli=itel(i) + xi=0.5D0*(c(1,i)+c(1,i+1)) + yi=0.5D0*(c(2,i)+c(2,i+1)) + zi=0.5D0*(c(3,i)+c(3,i+1)) + + do iint=1,nscp_gr(i) + + do j=iscpstart(i,iint),iscpend(i,iint) + itypj=itype(j) +C Uncomment following three lines for SC-p interactions +c xj=c(1,nres+j)-xi +c yj=c(2,nres+j)-yi +c zj=c(3,nres+j)-zi +C Uncomment following three lines for Ca-p interactions + xj=c(1,j)-xi + yj=c(2,j)-yi + zj=c(3,j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + + sss=sscale(1.0d0/(dsqrt(rrij)*rscp(itypj,iteli))) + + if (sss.gt.0.0d0) then + + fac=rrij**expon2 + e1=fac*fac*aad(itypj,iteli) + e2=fac*bad(itypj,iteli) + if (iabs(j-i) .le. 2) then + e1=scal14*e1 + e2=scal14*e2 + evdw2_14=evdw2_14+(e1+e2)*sss + endif + evdwij=e1+e2 + evdw2=evdw2+evdwij*sss + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw2',i,j,evdwij +C +C Calculate contributions to the gradient in the virtual-bond and SC vectors. +C + fac=-(evdwij+e1)*rrij*sss + ggg(1)=xj*fac + ggg(2)=yj*fac + ggg(3)=zj*fac +C Uncomment following three lines for SC-p interactions +c do k=1,3 +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) +c enddo +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + endif + enddo + + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(j,i) + gvdwc_scpp(j,i)=expon*gvdwc_scpp(j,i) + gradx_scp(j,i)=expon*gradx_scp(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time the factor EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end diff --git a/source/unres/src_MD-NEWSC/energy_p_new_barrier.F b/source/unres/src_MD-NEWSC/energy_p_new_barrier.F new file mode 100644 index 0000000..fc584af --- /dev/null +++ b/source/unres/src_MD-NEWSC/energy_p_new_barrier.F @@ -0,0 +1,10943 @@ + SUBROUTINE etotal(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" + double precision weights_(n_ene) +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene) + include 'COMMON.LOCAL' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' +#ifdef MPI +c print*,"ETOTAL Processor",fg_rank," absolute rank",myrank, +c & " nfgtasks",nfgtasks + if (nfgtasks.gt.1) then +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (fg_rank.eq.0) then + call MPI_Bcast(0,1,MPI_INTEGER,king,FG_COMM,IERROR) +c print *,"Processor",myrank," BROADCAST iorder" +C FG master sets up the WEIGHTS_ array which will be broadcast to the +C FG slaves as WEIGHTS array. + weights_(1)=wsc + weights_(2)=wscp + weights_(3)=welec + weights_(4)=wcorr + weights_(5)=wcorr5 + weights_(6)=wcorr6 + weights_(7)=wel_loc + weights_(8)=wturn3 + weights_(9)=wturn4 + weights_(10)=wturn6 + weights_(11)=wang + weights_(12)=wscloc + weights_(13)=wtor + weights_(14)=wtor_d + weights_(15)=wstrain + weights_(16)=wvdwpp + weights_(17)=wbond + weights_(18)=scal14 + weights_(21)=wsccor + weights_(22)=wsct +C FG Master broadcasts the WEIGHTS_ array + call MPI_Bcast(weights_(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + else +C FG slaves receive the WEIGHTS array + call MPI_Bcast(weights(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + wsc=weights(1) + wscp=weights(2) + welec=weights(3) + wcorr=weights(4) + wcorr5=weights(5) + wcorr6=weights(6) + wel_loc=weights(7) + wturn3=weights(8) + wturn4=weights(9) + wturn6=weights(10) + wang=weights(11) + wscloc=weights(12) + wtor=weights(13) + wtor_d=weights(14) + wstrain=weights(15) + wvdwpp=weights(16) + wbond=weights(17) + scal14=weights(18) + wsccor=weights(21) + wsct=weights(22) + endif + time_Bcast=time_Bcast+MPI_Wtime()-time00 + time_Bcastw=time_Bcastw+MPI_Wtime()-time00 +c call chainbuild_cart + endif +c print *,'Processor',myrank,' calling etotal ipot=',ipot +c print *,'Processor',myrank,' nnt=',nnt,' nct=',nct +#else +c if (modecalc.eq.12.or.modecalc.eq.14) then +c call int_from_cart1(.false.) +c endif +#endif +#ifdef TIMING +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +#endif +C +C Compute the side-chain and electrostatic interaction energy +C + goto (101,102,103,104,105,106,107) ipot +C Lennard-Jones potential. + 101 call elj(evdw,evdw_p,evdw_m) +cd print '(a)','Exit ELJ' + goto 108 +C Lennard-Jones-Kihara potential (shifted). + 102 call eljk(evdw,evdw_p,evdw_m) + goto 108 +C Berne-Pechukas potential (dilated LJ, angular dependence). + 103 call ebp(evdw,evdw_p,evdw_m) + goto 108 +C Gay-Berne potential (shifted LJ, angular dependence). + 104 call egb(evdw,evdw_p,evdw_m) + goto 108 +C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence). + 105 call egbv(evdw,evdw_p,evdw_m) + goto 108 +C New SC-SC potential + 106 call emomo(evdw,evdw_p,evdw_m) + goto 108 +C Soft-sphere potential + 107 call e_softsphere(evdw) +C +C Calculate electrostatic (H-bonding) energy of the main chain. +C + 108 continue +cmc +cmc Sep-06: egb takes care of dynamic ss bonds too +cmc +c if (dyn_ss) call dyn_set_nss + +c print *,"Processor",myrank," computed USCSC" +#ifdef TIMING +#ifdef MPI + time01=MPI_Wtime() +#else + time00=tcpu() +#endif +#endif + call vec_and_deriv +#ifdef TIMING +#ifdef MPI + time_vec=time_vec+MPI_Wtime()-time01 +#else + time_vec=time_vec+tcpu()-time01 +#endif +#endif +c print *,"Processor",myrank," left VEC_AND_DERIV" + if (ipot.lt.7) then +#ifdef SPLITELE + if (welec.gt.0d0.or.wvdwpp.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#else + if (welec.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#endif + call eelec(ees,evdw1,eel_loc,eello_turn3,eello_turn4) + else + ees=0.0d0 + evdw1=0.0d0 + eel_loc=0.0d0 + eello_turn3=0.0d0 + eello_turn4=0.0d0 + endif + else +c write (iout,*) "Soft-spheer ELEC potential" + call eelec_soft_sphere(ees,evdw1,eel_loc,eello_turn3, + & eello_turn4) + endif +c print *,"Processor",myrank," computed UELEC" +C +C Calculate excluded-volume interaction energy between peptide groups +C and side chains. +C + if (ipot.lt.7) then + if(wscp.gt.0d0) then + call escp(evdw2,evdw2_14) + else + evdw2=0 + evdw2_14=0 + endif + else +c write (iout,*) "Soft-sphere SCP potential" + call escp_soft_sphere(evdw2,evdw2_14) + endif +c +c Calculate the bond-stretching energy +c + call ebond(estr) +C +C Calculate the disulfide-bridge and other energy and the contributions +C from other distance constraints. +cd print *,'Calling EHPB' + call edis(ehpb) +cd print *,'EHPB exitted succesfully.' +C +C Calculate the virtual-bond-angle energy. +C + if (wang.gt.0d0) then + call ebend(ebe) + else + ebe=0 + endif +c print *,"Processor",myrank," computed UB" +C +C Calculate the SC local energy. +C + call esc(escloc) +c print *,"Processor",myrank," computed USC" +C +C Calculate the virtual-bond torsional energy. +C +cd print *,'nterm=',nterm + if (wtor.gt.0) then + call etor(etors,edihcnstr) + else + etors=0 + edihcnstr=0 + endif +c print *,"Processor",myrank," computed Utor" +C +C 6/23/01 Calculate double-torsional energy +C + if (wtor_d.gt.0) then + call etor_d(etors_d) + else + etors_d=0 + endif +c print *,"Processor",myrank," computed Utord" +C +C 21/5/07 Calculate local sicdechain correlation energy +C + if (wsccor.gt.0.0d0) then + call eback_sc_corr(esccor) + else + esccor=0.0d0 + endif +c print *,"Processor",myrank," computed Usccorr" +C +C 12/1/95 Multi-body terms +C + n_corr=0 + n_corr1=0 + if ((wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 + & .or. wturn6.gt.0.0d0) .and. ipot.lt.7) then + call multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr,n_corr1) +cd write(2,*)'multibody_eello n_corr=',n_corr,' n_corr1=',n_corr1, +cd &" ecorr",ecorr," ecorr5",ecorr5," ecorr6",ecorr6," eturn6",eturn6 + else + ecorr=0.0d0 + ecorr5=0.0d0 + ecorr6=0.0d0 + eturn6=0.0d0 + endif + if ((wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) .and. ipot.lt.7) then + call multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) +cd write (iout,*) "multibody_hb ecorr",ecorr + endif +c print *,"Processor",myrank," computed Ucorr" +C +C If performing constraint dynamics, call the constraint energy +C after the equilibration time + if(usampl.and.totT.gt.eq_time) then + call EconstrQ + call Econstr_back + else + Uconst=0.0d0 + Uconst_back=0.0d0 + endif +#ifdef TIMING +#ifdef MPI + time_enecalc=time_enecalc+MPI_Wtime()-time00 +#else + time_enecalc=time_enecalc+tcpu()-time00 +#endif +#endif +c print *,"Processor",myrank," computed Uconstr" +#ifdef TIMING +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +#endif +c +C Sum the energies +C + energia(1)=evdw +#ifdef SCP14 + energia(2)=evdw2-evdw2_14 + energia(18)=evdw2_14 +#else + energia(2)=evdw2 + energia(18)=0.0d0 +#endif +#ifdef SPLITELE + energia(3)=ees + energia(16)=evdw1 +#else + energia(3)=ees+evdw1 + energia(16)=0.0d0 +#endif + energia(4)=ecorr + energia(5)=ecorr5 + energia(6)=ecorr6 + energia(7)=eel_loc + energia(8)=eello_turn3 + energia(9)=eello_turn4 + energia(10)=eturn6 + energia(11)=ebe + energia(12)=escloc + energia(13)=etors + energia(14)=etors_d + energia(15)=ehpb + energia(19)=edihcnstr + energia(17)=estr + energia(20)=Uconst+Uconst_back + energia(21)=esccor + energia(22)=evdw_p + energia(23)=evdw_m +c print *," Processor",myrank," calls SUM_ENERGY" + call sum_energy(energia,.true.) + if (dyn_ss) call dyn_set_nss +c print *," Processor",myrank," left SUM_ENERGY" +#ifdef TIMING +#ifdef MPI + time_sumene=time_sumene+MPI_Wtime()-time00 +#else + time_sumene=time_sumene+tcpu()-time00 +#endif +#endif + RETURN + END SUBROUTINE etotal +c------------------------------------------------------------------------------- + subroutine sum_energy(energia,reduce) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene),enebuff(0:n_ene+1) + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' + logical reduce +#ifdef MPI + if (nfgtasks.gt.1 .and. reduce) then +#ifdef DEBUG + write (iout,*) "energies before REDUCE" + call enerprint(energia) + call flush(iout) +#endif + do i=0,n_ene + enebuff(i)=energia(i) + enddo + time00=MPI_Wtime() + call MPI_Barrier(FG_COMM,IERR) + time_barrier_e=time_barrier_e+MPI_Wtime()-time00 + time00=MPI_Wtime() + call MPI_Reduce(enebuff(0),energia(0),n_ene+1, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) +#ifdef DEBUG + write (iout,*) "energies after REDUCE" + call enerprint(energia) + call flush(iout) +#endif + time_Reduce=time_Reduce+MPI_Wtime()-time00 + endif + if (fg_rank.eq.0) then +#endif +#ifdef TSCSC + evdw=energia(22)+wsct*energia(23) +#else + evdw=energia(1) +#endif +#ifdef SCP14 + evdw2=energia(2)+energia(18) + evdw2_14=energia(18) +#else + evdw2=energia(2) +#endif +#ifdef SPLITELE + ees=energia(3) + evdw1=energia(16) +#else + ees=energia(3) + evdw1=0.0d0 +#endif + ecorr=energia(4) + ecorr5=energia(5) + ecorr6=energia(6) + eel_loc=energia(7) + eello_turn3=energia(8) + eello_turn4=energia(9) + eturn6=energia(10) + ebe=energia(11) + escloc=energia(12) + etors=energia(13) + etors_d=energia(14) + ehpb=energia(15) + edihcnstr=energia(19) + estr=energia(17) + Uconst=energia(20) + esccor=energia(21) +#ifdef SPLITELE + etot=wsc*evdw+wscp*evdw2+welec*ees+wvdwpp*evdw1 + & +wang*ebe+wtor*etors+wscloc*escloc + & +wstrain*ehpb+wcorr*ecorr+wcorr5*ecorr5 + & +wcorr6*ecorr6+wturn4*eello_turn4+wturn3*eello_turn3 + & +wturn6*eturn6+wel_loc*eel_loc+edihcnstr+wtor_d*etors_d + & +wbond*estr+Uconst+wsccor*esccor +#else + etot=wsc*evdw+wscp*evdw2+welec*(ees+evdw1) + & +wang*ebe+wtor*etors+wscloc*escloc + & +wstrain*ehpb+wcorr*ecorr+wcorr5*ecorr5 + & +wcorr6*ecorr6+wturn4*eello_turn4+wturn3*eello_turn3 + & +wturn6*eturn6+wel_loc*eel_loc+edihcnstr+wtor_d*etors_d + & +wbond*estr+Uconst+wsccor*esccor +#endif + energia(0)=etot +c detecting NaNQ +#ifdef ISNAN +#ifdef AIX + if (isnan(etot).ne.0) energia(0)=1.0d+99 +#else + if (isnan(etot)) energia(0)=1.0d+99 +#endif +#else + i=0 +#ifdef WINPGI + idumm=proc_proc(etot,i) +#else + call proc_proc(etot,i) +#endif + if(i.eq.1)energia(0)=1.0d+99 +#endif +#ifdef MPI + endif +#endif + return + end +c------------------------------------------------------------------------------- + subroutine sum_gradient + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include 'mpif.h' +#endif + double precision gradbufc(3,maxres),gradbufx(3,maxres), + & glocbuf(4*maxres),gradbufc_sum(3,maxres),gloc_scbuf(3,maxres) + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' + include 'COMMON.MAXGRAD' + include 'COMMON.SCCOR' +#ifdef TIMING +#ifdef MPI + time01=MPI_Wtime() +#else + time01=tcpu() +#endif +#endif +#ifdef DEBUG + write (iout,*) "sum_gradient gvdwc, gvdwx" + do i=1,nres + write (iout,'(i3,3f10.5,5x,3f10.5,5x,3f10.5,5x,3f10.5)') + & i,(gvdwx(j,i),j=1,3),(gvdwcT(j,i),j=1,3),(gvdwc(j,i),j=1,3), + & (gvdwcT(j,i),j=1,3) + enddo + call flush(iout) +#endif +#ifdef MPI +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (nfgtasks.gt.1 .and. fg_rank.eq.0) + & call MPI_Bcast(1,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif +C +C 9/29/08 AL Transform parts of gradients in site coordinates to the gradient +C in virtual-bond-vector coordinates +C +#ifdef DEBUG +c write (iout,*) "gel_loc gel_loc_long and gel_loc_loc" +c do i=1,nres-1 +c write (iout,'(i5,3f10.5,2x,3f10.5,2x,f10.5)') +c & i,(gel_loc(j,i),j=1,3),(gel_loc_long(j,i),j=1,3),gel_loc_loc(i) +c enddo +c write (iout,*) "gel_loc_tur3 gel_loc_turn4" +c do i=1,nres-1 +c write (iout,'(i5,3f10.5,2x,f10.5)') +c & i,(gcorr4_turn(j,i),j=1,3),gel_loc_turn4(i) +c enddo + write (iout,*) "gradcorr5 gradcorr5_long gradcorr5_loc" + do i=1,nres + write (iout,'(i3,3f10.5,5x,3f10.5,5x,f10.5)') + & i,(gradcorr5(j,i),j=1,3),(gradcorr5_long(j,i),j=1,3), + & g_corr5_loc(i) + enddo + call flush(iout) +#endif +#ifdef SPLITELE +#ifdef TSCSC + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+wsc*wscT*gvdwcT(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#else + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#endif +#else + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+ + & wbond*gradb(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#endif +#ifdef MPI + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +#ifdef DEBUG + write (iout,*) "gradbufc before allreduce" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + do i=1,nres + do j=1,3 + gradbufc_sum(j,i)=gradbufc(j,i) + enddo + enddo +c call MPI_AllReduce(gradbufc(1,1),gradbufc_sum(1,1),3*nres, +c & MPI_DOUBLE_PRECISION,MPI_SUM,FG_COMM,IERR) +c time_reduce=time_reduce+MPI_Wtime()-time00 +#ifdef DEBUG +c write (iout,*) "gradbufc_sum after allreduce" +c do i=1,nres +c write (iout,'(i3,3f10.5)') i,(gradbufc_sum(j,i),j=1,3) +c enddo +c call flush(iout) +#endif +#ifdef TIMING +c time_allreduce=time_allreduce+MPI_Wtime()-time00 +#endif + do i=nnt,nres + do k=1,3 + gradbufc(k,i)=0.0d0 + enddo + enddo +#ifdef DEBUG + write (iout,*) "igrad_start",igrad_start," igrad_end",igrad_end + write (iout,*) (i," jgrad_start",jgrad_start(i), + & " jgrad_end ",jgrad_end(i), + & i=igrad_start,igrad_end) +#endif +c +c Obsolete and inefficient code; we can make the effort O(n) and, therefore, +c do not parallelize this part. +c +c do i=igrad_start,igrad_end +c do j=jgrad_start(i),jgrad_end(i) +c do k=1,3 +c gradbufc(k,i)=gradbufc(k,i)+gradbufc_sum(k,j) +c enddo +c enddo +c enddo + do j=1,3 + gradbufc(j,nres-1)=gradbufc_sum(j,nres) + enddo + do i=nres-2,nnt,-1 + do j=1,3 + gradbufc(j,i)=gradbufc(j,i+1)+gradbufc_sum(j,i+1) + enddo + enddo +#ifdef DEBUG + write (iout,*) "gradbufc after summing" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + else +#endif +#ifdef DEBUG + write (iout,*) "gradbufc" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + do i=1,nres + do j=1,3 + gradbufc_sum(j,i)=gradbufc(j,i) + gradbufc(j,i)=0.0d0 + enddo + enddo + do j=1,3 + gradbufc(j,nres-1)=gradbufc_sum(j,nres) + enddo + do i=nres-2,nnt,-1 + do j=1,3 + gradbufc(j,i)=gradbufc(j,i+1)+gradbufc_sum(j,i+1) + enddo + enddo +c do i=nnt,nres-1 +c do k=1,3 +c gradbufc(k,i)=0.0d0 +c enddo +c do j=i+1,nres +c do k=1,3 +c gradbufc(k,i)=gradbufc(k,i)+gradbufc(k,j) +c enddo +c enddo +c enddo +#ifdef DEBUG + write (iout,*) "gradbufc after summing" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif +#ifdef MPI + endif +#endif + do k=1,3 + gradbufc(k,nres)=0.0d0 + enddo + do i=1,nct + do j=1,3 +#ifdef SPLITELE + gradc(j,i,icg)=gradbufc(j,i)+welec*gelc(j,i)+ + & wel_loc*gel_loc(j,i)+ + & 0.5d0*(wscp*gvdwc_scpp(j,i)+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i))+ + & wbond*gradb(j,i)+ + & wcorr*gradcorr(j,i)+ + & wturn3*gcorr3_turn(j,i)+ + & wturn4*gcorr4_turn(j,i)+ + & wcorr5*gradcorr5(j,i)+ + & wcorr6*gradcorr6(j,i)+ + & wturn6*gcorr6_turn(j,i)+ + & wsccor*gsccorc(j,i) + & +wscloc*gscloc(j,i) +#else + gradc(j,i,icg)=gradbufc(j,i)+welec*gelc(j,i)+ + & wel_loc*gel_loc(j,i)+ + & 0.5d0*(wscp*gvdwc_scpp(j,i)+ + & welec*gelc_long(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i))+ + & wbond*gradb(j,i)+ + & wcorr*gradcorr(j,i)+ + & wturn3*gcorr3_turn(j,i)+ + & wturn4*gcorr4_turn(j,i)+ + & wcorr5*gradcorr5(j,i)+ + & wcorr6*gradcorr6(j,i)+ + & wturn6*gcorr6_turn(j,i)+ + & wsccor*gsccorc(j,i) + & +wscloc*gscloc(j,i) +#endif +#ifdef TSCSC + gradx(j,i,icg)=wsc*gvdwx(j,i)+wsc*wscT*gvdwxT(j,i)+ + & wscp*gradx_scp(j,i)+ + & wbond*gradbx(j,i)+ + & wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+ + & wsccor*gsccorx(j,i) + & +wscloc*gsclocx(j,i) +#else + gradx(j,i,icg)=wsc*gvdwx(j,i)+wscp*gradx_scp(j,i)+ + & wbond*gradbx(j,i)+ + & wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+ + & wsccor*gsccorx(j,i) + & +wscloc*gsclocx(j,i) +#endif + enddo + enddo +#ifdef DEBUG + write (iout,*) "gloc before adding corr" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif + do i=1,nres-3 + gloc(i,icg)=gloc(i,icg)+wcorr*gcorr_loc(i) + & +wcorr5*g_corr5_loc(i) + & +wcorr6*g_corr6_loc(i) + & +wturn4*gel_loc_turn4(i) + & +wturn3*gel_loc_turn3(i) + & +wturn6*gel_loc_turn6(i) + & +wel_loc*gel_loc_loc(i) + enddo +#ifdef DEBUG + write (iout,*) "gloc after adding corr" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif +#ifdef MPI + if (nfgtasks.gt.1) then + do j=1,3 + do i=1,nres + gradbufc(j,i)=gradc(j,i,icg) + gradbufx(j,i)=gradx(j,i,icg) + enddo + enddo + do i=1,4*nres + glocbuf(i)=gloc(i,icg) + enddo +#ifdef DEBUG + write (iout,*) "gloc_sc before reduce" + do i=1,nres + do j=1,3 + write (iout,*) i,j,gloc_sc(j,i,icg) + enddo + enddo +#endif + do i=1,nres + do j=1,3 + gloc_scbuf(j,i)=gloc_sc(j,i,icg) + enddo + enddo + time00=MPI_Wtime() + call MPI_Barrier(FG_COMM,IERR) + time_barrier_g=time_barrier_g+MPI_Wtime()-time00 + time00=MPI_Wtime() + call MPI_Reduce(gradbufc(1,1),gradc(1,1,icg),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + call MPI_Reduce(gradbufx(1,1),gradx(1,1,icg),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + call MPI_Reduce(glocbuf(1),gloc(1,icg),4*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + call MPI_Reduce(gloc_scbuf(1,1),gloc_sc(1,1,icg),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + time_reduce=time_reduce+MPI_Wtime()-time00 +#ifdef DEBUG + write (iout,*) "gloc_sc after reduce" + do i=1,nres + do j=1,3 + write (iout,*) i,j,gloc_sc(j,i,icg) + enddo + enddo +#endif +#ifdef DEBUG + write (iout,*) "gloc after reduce" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif + endif +#endif + if (gnorm_check) then +c +c Compute the maximum elements of the gradient +c + gvdwc_max=0.0d0 + gvdwc_scp_max=0.0d0 + gelc_max=0.0d0 + gvdwpp_max=0.0d0 + gradb_max=0.0d0 + ghpbc_max=0.0d0 + gradcorr_max=0.0d0 + gel_loc_max=0.0d0 + gcorr3_turn_max=0.0d0 + gcorr4_turn_max=0.0d0 + gradcorr5_max=0.0d0 + gradcorr6_max=0.0d0 + gcorr6_turn_max=0.0d0 + gsccorc_max=0.0d0 + gscloc_max=0.0d0 + gvdwx_max=0.0d0 + gradx_scp_max=0.0d0 + ghpbx_max=0.0d0 + gradxorr_max=0.0d0 + gsccorx_max=0.0d0 + gsclocx_max=0.0d0 + do i=1,nct + gvdwc_norm=dsqrt(scalar(gvdwc(1,i),gvdwc(1,i))) + if (gvdwc_norm.gt.gvdwc_max) gvdwc_max=gvdwc_norm +#ifdef TSCSC + gvdwc_norm=dsqrt(scalar(gvdwcT(1,i),gvdwcT(1,i))) + if (gvdwc_norm.gt.gvdwc_max) gvdwc_max=gvdwc_norm +#endif + gvdwc_scp_norm=dsqrt(scalar(gvdwc_scp(1,i),gvdwc_scp(1,i))) + if (gvdwc_scp_norm.gt.gvdwc_scp_max) + & gvdwc_scp_max=gvdwc_scp_norm + gelc_norm=dsqrt(scalar(gelc(1,i),gelc(1,i))) + if (gelc_norm.gt.gelc_max) gelc_max=gelc_norm + gvdwpp_norm=dsqrt(scalar(gvdwpp(1,i),gvdwpp(1,i))) + if (gvdwpp_norm.gt.gvdwpp_max) gvdwpp_max=gvdwpp_norm + gradb_norm=dsqrt(scalar(gradb(1,i),gradb(1,i))) + if (gradb_norm.gt.gradb_max) gradb_max=gradb_norm + ghpbc_norm=dsqrt(scalar(ghpbc(1,i),ghpbc(1,i))) + if (ghpbc_norm.gt.ghpbc_max) ghpbc_max=ghpbc_norm + gradcorr_norm=dsqrt(scalar(gradcorr(1,i),gradcorr(1,i))) + if (gradcorr_norm.gt.gradcorr_max) gradcorr_max=gradcorr_norm + gel_loc_norm=dsqrt(scalar(gel_loc(1,i),gel_loc(1,i))) + if (gel_loc_norm.gt.gel_loc_max) gel_loc_max=gel_loc_norm + gcorr3_turn_norm=dsqrt(scalar(gcorr3_turn(1,i), + & gcorr3_turn(1,i))) + if (gcorr3_turn_norm.gt.gcorr3_turn_max) + & gcorr3_turn_max=gcorr3_turn_norm + gcorr4_turn_norm=dsqrt(scalar(gcorr4_turn(1,i), + & gcorr4_turn(1,i))) + if (gcorr4_turn_norm.gt.gcorr4_turn_max) + & gcorr4_turn_max=gcorr4_turn_norm + gradcorr5_norm=dsqrt(scalar(gradcorr5(1,i),gradcorr5(1,i))) + if (gradcorr5_norm.gt.gradcorr5_max) + & gradcorr5_max=gradcorr5_norm + gradcorr6_norm=dsqrt(scalar(gradcorr6(1,i),gradcorr6(1,i))) + if (gradcorr6_norm.gt.gradcorr6_max) gcorr6_max=gradcorr6_norm + gcorr6_turn_norm=dsqrt(scalar(gcorr6_turn(1,i), + & gcorr6_turn(1,i))) + if (gcorr6_turn_norm.gt.gcorr6_turn_max) + & gcorr6_turn_max=gcorr6_turn_norm + gsccorr_norm=dsqrt(scalar(gsccorc(1,i),gsccorc(1,i))) + if (gsccorr_norm.gt.gsccorr_max) gsccorr_max=gsccorr_norm + gscloc_norm=dsqrt(scalar(gscloc(1,i),gscloc(1,i))) + if (gscloc_norm.gt.gscloc_max) gscloc_max=gscloc_norm + gvdwx_norm=dsqrt(scalar(gvdwx(1,i),gvdwx(1,i))) + if (gvdwx_norm.gt.gvdwx_max) gvdwx_max=gvdwx_norm +#ifdef TSCSC + gvdwx_norm=dsqrt(scalar(gvdwxT(1,i),gvdwxT(1,i))) + if (gvdwx_norm.gt.gvdwx_max) gvdwx_max=gvdwx_norm +#endif + gradx_scp_norm=dsqrt(scalar(gradx_scp(1,i),gradx_scp(1,i))) + if (gradx_scp_norm.gt.gradx_scp_max) + & gradx_scp_max=gradx_scp_norm + ghpbx_norm=dsqrt(scalar(ghpbx(1,i),ghpbx(1,i))) + if (ghpbx_norm.gt.ghpbx_max) ghpbx_max=ghpbx_norm + gradxorr_norm=dsqrt(scalar(gradxorr(1,i),gradxorr(1,i))) + if (gradxorr_norm.gt.gradxorr_max) gradxorr_max=gradxorr_norm + gsccorrx_norm=dsqrt(scalar(gsccorx(1,i),gsccorx(1,i))) + if (gsccorrx_norm.gt.gsccorrx_max) gsccorrx_max=gsccorrx_norm + gsclocx_norm=dsqrt(scalar(gsclocx(1,i),gsclocx(1,i))) + if (gsclocx_norm.gt.gsclocx_max) gsclocx_max=gsclocx_norm + enddo + if (gradout) then +#ifdef AIX + open(istat,file=statname,position="append") +#else + open(istat,file=statname,access="append") +#endif + write (istat,'(1h#,21f10.2)') gvdwc_max,gvdwc_scp_max, + & gelc_max,gvdwpp_max,gradb_max,ghpbc_max, + & gradcorr_max,gel_loc_max,gcorr3_turn_max,gcorr4_turn_max, + & gradcorr5_max,gradcorr6_max,gcorr6_turn_max,gsccorc_max, + & gscloc_max,gvdwx_max,gradx_scp_max,ghpbx_max,gradxorr_max, + & gsccorx_max,gsclocx_max + close(istat) + if (gvdwc_max.gt.1.0d4) then + write (iout,*) "gvdwc gvdwx gradb gradbx" + do i=nnt,nct + write(iout,'(i5,4(3f10.2,5x))') i,(gvdwc(j,i),gvdwx(j,i), + & gradb(j,i),gradbx(j,i),j=1,3) + enddo + call pdbout(0.0d0,'cipiszcze',iout) + call flush(iout) + endif + endif + endif +#ifdef DEBUG + write (iout,*) "gradc gradx gloc" + do i=1,nres + write (iout,'(i5,3f10.5,5x,3f10.5,5x,f10.5)') + & i,(gradc(j,i,icg),j=1,3),(gradx(j,i,icg),j=1,3),gloc(i,icg) + enddo +#endif +#ifdef TIMING +#ifdef MPI + time_sumgradient=time_sumgradient+MPI_Wtime()-time01 +#else + time_sumgradient=time_sumgradient+tcpu()-time01 +#endif +#endif + return + end +c------------------------------------------------------------------------------- + subroutine rescale_weights(t_bath) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + double precision kfac /2.4d0/ + double precision x,x2,x3,x4,x5,licznik /1.12692801104297249644/ +c facT=temp0/t_bath +c facT=2*temp0/(t_bath+temp0) + if (rescale_mode.eq.0) then + facT=1.0d0 + facT2=1.0d0 + facT3=1.0d0 + facT4=1.0d0 + facT5=1.0d0 + else if (rescale_mode.eq.1) then + facT=kfac/(kfac-1.0d0+t_bath/temp0) + facT2=kfac**2/(kfac**2-1.0d0+(t_bath/temp0)**2) + facT3=kfac**3/(kfac**3-1.0d0+(t_bath/temp0)**3) + facT4=kfac**4/(kfac**4-1.0d0+(t_bath/temp0)**4) + facT5=kfac**5/(kfac**5-1.0d0+(t_bath/temp0)**5) + else if (rescale_mode.eq.2) then + x=t_bath/temp0 + x2=x*x + x3=x2*x + x4=x3*x + x5=x4*x + facT=licznik/dlog(dexp(x)+dexp(-x)) + facT2=licznik/dlog(dexp(x2)+dexp(-x2)) + facT3=licznik/dlog(dexp(x3)+dexp(-x3)) + facT4=licznik/dlog(dexp(x4)+dexp(-x4)) + facT5=licznik/dlog(dexp(x5)+dexp(-x5)) + else + write (iout,*) "Wrong RESCALE_MODE",rescale_mode + write (*,*) "Wrong RESCALE_MODE",rescale_mode +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,IERROR) +#endif + stop 555 + endif + welec=weights(3)*fact + wcorr=weights(4)*fact3 + wcorr5=weights(5)*fact4 + wcorr6=weights(6)*fact5 + wel_loc=weights(7)*fact2 + wturn3=weights(8)*fact2 + wturn4=weights(9)*fact3 + wturn6=weights(10)*fact5 + wtor=weights(13)*fact + wtor_d=weights(14)*fact2 + wsccor=weights(21)*fact +#ifdef TSCSC +c wsct=t_bath/temp0 + wsct=(320.0+80.0*dtanh((t_bath-320.0)/80.0))/320.0 +#endif + return + end +C------------------------------------------------------------------------ + subroutine enerprint(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.MD' + double precision energia(0:n_ene) + etot=energia(0) +#ifdef TSCSC + evdw=energia(22)+wsct*energia(23) +#else + evdw=energia(1) +#endif + evdw2=energia(2) +#ifdef SCP14 + evdw2=energia(2)+energia(18) +#else + evdw2=energia(2) +#endif + ees=energia(3) +#ifdef SPLITELE + evdw1=energia(16) +#endif + ecorr=energia(4) + ecorr5=energia(5) + ecorr6=energia(6) + eel_loc=energia(7) + eello_turn3=energia(8) + eello_turn4=energia(9) + eello_turn6=energia(10) + ebe=energia(11) + escloc=energia(12) + etors=energia(13) + etors_d=energia(14) + ehpb=energia(15) + edihcnstr=energia(19) + estr=energia(17) + Uconst=energia(20) + esccor=energia(21) +#ifdef SPLITELE + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec,evdw1,wvdwpp, + & estr,wbond,ebe,wang, + & escloc,wscloc,etors,wtor,etors_d,wtor_d,ehpb,wstrain, + & ecorr,wcorr, + & ecorr5,wcorr5,ecorr6,wcorr6,eel_loc,wel_loc,eello_turn3,wturn3, + & eello_turn4,wturn4,eello_turn6,wturn6,esccor,wsccor, + & edihcnstr,ebr*nss, + & Uconst,etot + 10 format (/'Virtual-chain energies:'// + & 'EVDW= ',1pE16.6,' WEIGHT=',1pE16.6,' (SC-SC)'/ + & 'EVDW2= ',1pE16.6,' WEIGHT=',1pE16.6,' (SC-p)'/ + & 'EES= ',1pE16.6,' WEIGHT=',1pE16.6,' (p-p)'/ + & 'EVDWPP=',1pE16.6,' WEIGHT=',1pE16.6,' (p-p VDW)'/ + & 'ESTR= ',1pE16.6,' WEIGHT=',1pE16.6,' (stretching)'/ + & 'EBE= ',1pE16.6,' WEIGHT=',1pE16.6,' (bending)'/ + & 'ESC= ',1pE16.6,' WEIGHT=',1pE16.6,' (SC local)'/ + & 'ETORS= ',1pE16.6,' WEIGHT=',1pE16.6,' (torsional)'/ + & 'ETORSD=',1pE16.6,' WEIGHT=',1pE16.6,' (double torsional)'/ + & 'EHPB= ',1pE16.6,' WEIGHT=',1pE16.6, + & ' (SS bridges & dist. cnstr.)'/ + & 'ECORR4=',1pE16.6,' WEIGHT=',1pE16.6,' (multi-body)'/ + & 'ECORR5=',1pE16.6,' WEIGHT=',1pE16.6,' (multi-body)'/ + & 'ECORR6=',1pE16.6,' WEIGHT=',1pE16.6,' (multi-body)'/ + & 'EELLO= ',1pE16.6,' WEIGHT=',1pE16.6,' (electrostatic-local)'/ + & 'ETURN3=',1pE16.6,' WEIGHT=',1pE16.6,' (turns, 3rd order)'/ + & 'ETURN4=',1pE16.6,' WEIGHT=',1pE16.6,' (turns, 4th order)'/ + & 'ETURN6=',1pE16.6,' WEIGHT=',1pE16.6,' (turns, 6th order)'/ + & 'ESCCOR=',1pE16.6,' WEIGHT=',1pE16.6,' (backbone-rotamer corr)'/ + & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/ + & 'ESS= ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ + & 'UCONST= ',1pE16.6,' (Constraint energy)'/ + & 'ETOT= ',1pE16.6,' (total)') +#else + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec, + & estr,wbond,ebe,wang, + & escloc,wscloc,etors,wtor,etors_d,wtor_d,ehpb,wstrain, + & ecorr,wcorr, + & ecorr5,wcorr5,ecorr6,wcorr6,eel_loc,wel_loc,eello_turn3,wturn3, + & eello_turn4,wturn4,eello_turn6,wturn6,esccor,wsccro,edihcnstr, + & ebr*nss,Uconst,etot + 10 format (/'Virtual-chain energies:'// + & 'EVDW= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-SC)'/ + & 'EVDW2= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-p)'/ + & 'EES= ',1pE16.6,' WEIGHT=',1pD16.6,' (p-p)'/ + & 'ESTR= ',1pE16.6,' WEIGHT=',1pD16.6,' (stretching)'/ + & 'EBE= ',1pE16.6,' WEIGHT=',1pD16.6,' (bending)'/ + & 'ESC= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC local)'/ + & 'ETORS= ',1pE16.6,' WEIGHT=',1pD16.6,' (torsional)'/ + & 'ETORSD=',1pE16.6,' WEIGHT=',1pD16.6,' (double torsional)'/ + & 'EHBP= ',1pE16.6,' WEIGHT=',1pD16.6, + & ' (SS bridges & dist. cnstr.)'/ + & 'ECORR4=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR5=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR6=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'EELLO= ',1pE16.6,' WEIGHT=',1pD16.6,' (electrostatic-local)'/ + & 'ETURN3=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 3rd order)'/ + & 'ETURN4=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 4th order)'/ + & 'ETURN6=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 6th order)'/ + & 'ESCCOR=',1pE16.6,' WEIGHT=',1pD16.6,' (backbone-rotamer corr)'/ + & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/ + & 'ESS= ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ + & 'UCONST=',1pE16.6,' (Constraint energy)'/ + & 'ETOT= ',1pE16.6,' (total)') +#endif + return + end +C----------------------------------------------------------------------- + subroutine elj(evdw,evdw_p,evdw_m) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJ potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (accur=1.0d-10) + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.TORSION' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) +c write(iout,*)'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C Change 12/1/95 + num_conti=0 +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) +cd write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint), +cd & 'iend=',iend(i,iint) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi +C Change 12/1/95 to calculate four-body interactions + rij=xj*xj+yj*yj+zj*zj + rrij=1.0D0/rij +c write (iout,*)'i=',i,' j=',j,' itypi=',itypi,' itypj=',itypj + eps0ij=eps(itypi,itypj) + fac=rrij**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e1+e2 +cd sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +cd epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),6(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & restyp(itypi),i,restyp(itypj),j,aa(itypi,itypj), +cd & bb(itypi,itypj),1.0D0/dsqrt(rrij),evdwij,epsi,sigm, +cd & (c(k,i),k=1,3),(c(k,j),k=1,3) +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + evdw_p=evdw_p+evdwij + else + evdw_m=evdw_m+evdwij + endif +#else + evdw=evdw+evdwij +#endif +C +C Calculate the components of the gradient in DC and X +C + fac=-rrij*(e1+evdwij) + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +#ifdef TSCSC + if (bb(itypi,itypj).gt.0.0d0) then + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + else + do k=1,3 + gvdwxT(k,i)=gvdwxT(k,i)-gg(k) + gvdwxT(k,j)=gvdwxT(k,j)+gg(k) + gvdwcT(k,i)=gvdwcT(k,i)-gg(k) + gvdwcT(k,j)=gvdwcT(k,j)+gg(k) + enddo + endif +#else + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo +#endif +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad gvdwc(l,k)=gvdwc(l,k)+gg(l) +cgrad enddo +cgrad enddo +C +C 12/1/95, revised on 5/20/97 +C +C Calculate the contact function. The ith column of the array JCONT will +C contain the numbers of atoms that make contacts with the atom I (of numbers +C greater than I). The arrays FACONT and GACONT will contain the values of +C the contact function and its derivative. +C +C Uncomment next line, if the correlation interactions include EVDW explicitly. +c if (j.gt.i+1 .and. evdwij.le.0.0D0) then +C Uncomment next line, if the correlation interactions are contact function only + if (j.gt.i+1.and. eps0ij.gt.0.0D0) then + rij=dsqrt(rij) + sigij=sigma(itypi,itypj) + r0ij=rs0(itypi,itypj) +C +C Check whether the SC's are not too far to make a contact. +C + rcut=1.5d0*r0ij + call gcont(rij,rcut,1.0d0,0.2d0*rcut,fcont,fprimcont) +C Add a new contact, if the SC's are close enough, but not too close (r.< +c! om = omega, sqom = om^2 + sqom1 = om1 * om1 + sqom2 = om2 * om2 + sqom12 = om12 * om12 + +c! now we calculate EGB - Gey-Berne +c! It will be summed up in evdwij and saved in evdw + sigsq = 1.0D0 / sigsq + sig = sig0ij * dsqrt(sigsq) +c! rij_shift = 1.0D0 / rij - sig + sig0ij + rij_shift = Rtail - sig + sig0ij + IF (rij_shift.le.0.0D0) THEN + evdw = 1.0D20 + RETURN + END IF + sigder = -sig * sigsq + rij_shift = 1.0D0 / rij_shift + fac = rij_shift**expon + c1 = fac * fac * aa(itypi,itypj) +c! c1 = 0.0d0 + c2 = fac * bb(itypi,itypj) +c! c2 = 0.0d0 + evdwij = eps1 * eps2rt * eps3rt * ( c1 + c2 ) + eps2der = eps3rt * evdwij + eps3der = eps2rt * evdwij +c! evdwij = 4.0d0 * eps2rt * eps3rt * evdwij + evdwij = eps2rt * eps3rt * evdwij +c! evdwij = 0.0d0 +c! write (*,*) "Gey Berne = ", evdwij +#ifdef TSCSC + IF (bb(itypi,itypj).gt.0) THEN + evdw_p = evdw_p + evdwij + ELSE + evdw_m = evdw_m + evdwij + END IF +#else + evdw = evdw + & + evdwij +#endif +c!------------------------------------------------------------------- +c! Calculate some components of GGB + c1 = c1 * eps1 * eps2rt**2 * eps3rt**2 + fac = -expon * (c1 + evdwij) * rij_shift + sigder = fac * sigder +c! fac = rij * fac +c! Calculate distance derivative +c! gg(1) = xj * fac +c! gg(2) = yj * fac +c! gg(3) = zj * fac + gg(1) = fac + gg(2) = fac + gg(3) = fac +c! write (*,*) "gg(1) = ", gg(1) +c! write (*,*) "gg(2) = ", gg(2) +c! write (*,*) "gg(3) = ", gg(3) +c! The angular derivatives of GGB are brought together in sc_grad +c!------------------------------------------------------------------- +c! Fcav +c! +c! Catch gly-gly interactions to skip calculation of something that +c! does not exist + + IF (itypi.eq.10.and.itypj.eq.10) THEN + Fcav = 0.0d0 + dFdR = 0.0d0 + dCAVdOM1 = 0.0d0 + dCAVdOM2 = 0.0d0 + dCAVdOM12 = 0.0d0 + ELSE + +c! we are not 2 glycines, so we calculate Fcav (and maybe more) + fac = chis1 * sqom1 + chis2 * sqom2 + & - 2.0d0 * chis12 * om1 * om2 * om12 +c! we will use pom later in Gcav, so dont mess with it! + pom = 1.0d0 - chis1 * chis2 * sqom12 + + Lambf = (1.0d0 - (fac / pom)) + Lambf = dsqrt(Lambf) + + + sparrow = 1.0d0 / dsqrt(sig1**2.0d0 + sig2**2.0d0) +c! write (*,*) "sparrow = ", sparrow + Chif = Rtail * sparrow + ChiLambf = Chif * Lambf + eagle = dsqrt(ChiLambf) + bat = ChiLambf ** 11.0d0 + + top = b1 * ( eagle + b2 * ChiLambf - b3 ) + bot = 1.0d0 + b4 * (ChiLambf ** 12.0d0) + botsq = bot * bot + +c! write (*,*) "sig1 = ",sig1 +c! write (*,*) "sig2 = ",sig2 +c! write (*,*) "Rtail = ",Rtail +c! write (*,*) "sparrow = ",sparrow +c! write (*,*) "Chis1 = ", chis1 +c! write (*,*) "Chis2 = ", chis2 +c! write (*,*) "Chis12 = ", chis12 +c! write (*,*) "om1 = ", om1 +c! write (*,*) "om2 = ", om2 +c! write (*,*) "om12 = ", om12 +c! write (*,*) "sqom1 = ", sqom1 +c! write (*,*) "sqom2 = ", sqom2 +c! write (*,*) "sqom12 = ", sqom12 +c! write (*,*) "Lambf = ",Lambf +c! write (*,*) "b1 = ",b1 +c! write (*,*) "b2 = ",b2 +c! write (*,*) "b3 = ",b3 +c! write (*,*) "b4 = ",b4 +c! write (*,*) "top = ",top +c! write (*,*) "bot = ",bot + Fcav = top / bot +c! Fcav = 0.0d0 +c! write (*,*) "Fcav = ", Fcav +c!------------------------------------------------------------------- +c! derivative of Fcav is Gcav... +c!--------------------------------------------------- + + dtop = b1 * ((Lambf / (2.0d0 * eagle)) + (b2 * Lambf)) + dbot = 12.0d0 * b4 * bat * Lambf + dFdR = ((dtop * bot - top * dbot) / botsq) * sparrow +c! dFdR = 0.0d0 +c! write (*,*) "dFcav/dR = ", dFdR + + dtop = b1 * ((Chif / (2.0d0 * eagle)) + (b2 * Chif)) + dbot = 12.0d0 * b4 * bat * Chif + eagle = Lambf * pom + dFdOM1 = -(chis1 * om1 - chis12 * om2 * om12) / (eagle) + dFdOM2 = -(chis2 * om2 - chis12 * om1 * om12) / (eagle) + dFdOM12 = chis12 * (chis1 * om1 * om12 - om2) + & * (chis2 * om2 * om12 - om1) / (eagle * pom) + + dFdL = ((dtop * bot - top * dbot) / botsq) +c! dFdL = 0.0d0 + dCAVdOM1 = dFdL * ( dFdOM1 ) + dCAVdOM2 = dFdL * ( dFdOM2 ) + dCAVdOM12 = dFdL * ( dFdOM12 ) +c! write (*,*) "dFcav/dOM1 = ", dCAVdOM1 +c! write (*,*) "dFcav/dOM2 = ", dCAVdOM2 +c! write (*,*) "dFcav/dOM12 = ", dCAVdOM12 +c! write (*,*) "" +c!------------------------------------------------------------------- +c! Finally, add the distance derivatives of GB and Fcav to gvdwc +c! Pom is used here to project the gradient vector into +c! cartesian coordinates and at the same time contains +c! dXhb/dXsc derivative (for charged amino acids +c! location of hydrophobic centre of interaction is not +c! the same as geometric centre of side chain, this +c! derivative takes that into account) +c! derivatives of omega angles will be added in sc_grad + + DO k= 1, 3 + ertail(k) = Rtail_distance(k)/Rtail + END DO + erdxi = scalar( ertail(1), dC_norm(1,i+nres) ) + erdxj = scalar( ertail(1), dC_norm(1,j+nres) ) + facd1 = dtail(1,itypi,itypj) * vbld_inv(i+nres) + facd2 = dtail(2,itypi,itypj) * vbld_inv(j+nres) + DO k = 1, 3 +c! write (*,*) "Gvdwc(",k,",",i,")=", gvdwc(k,i) +c! write (*,*) "Gvdwc(",k,",",j,")=", gvdwc(k,j) + pom = ertail(k)-facd1*(ertail(k)-erdxi*dC_norm(k,i+nres)) + gvdwx(k,i) = gvdwx(k,i) + & - (( dFdR + gg(k) ) * pom) +c! & - ( dFdR * pom ) + pom = ertail(k)-facd2*(ertail(k)-erdxj*dC_norm(k,j+nres)) + gvdwx(k,j) = gvdwx(k,j) + & + (( dFdR + gg(k) ) * pom) +c! & + ( dFdR * pom ) + + gvdwc(k,i) = gvdwc(k,i) + & - (( dFdR + gg(k) ) * ertail(k)) +c! & - ( dFdR * ertail(k)) + + gvdwc(k,j) = gvdwc(k,j) + & + (( dFdR + gg(k) ) * ertail(k)) +c! & + ( dFdR * ertail(k)) + + gg(k) = 0.0d0 +c! write (*,*) "Gvdwc(",k,",",i,")=", gvdwc(k,i) +c! write (*,*) "Gvdwc(",k,",",j,")=", gvdwc(k,j) + END DO + +c!------------------------------------------------------------------- +c! Compute head-head and head-tail energies for each state + + isel = iabs(Qi) + iabs(Qj) + IF (isel.eq.0) THEN +c! No charges - do nothing + eheadtail = 0.0d0 + + ELSE IF (isel.eq.4) THEN +c! Calculate dipole-dipole interactions + CALL edd(ecl) + eheadtail = ECL + + ELSE IF (isel.eq.1 .and. iabs(Qi).eq.1) THEN +c! Charge-nonpolar interactions + CALL eqn(epol) + eheadtail = epol + + ELSE IF (isel.eq.1 .and. iabs(Qj).eq.1) THEN +c! Nonpolar-charge interactions + CALL enq(epol) + eheadtail = epol + + ELSE IF (isel.eq.3 .and. icharge(itypj).eq.2) THEN +c! Charge-dipole interactions + CALL eqd(ecl, elj, epol) + eheadtail = ECL + elj + epol + + ELSE IF (isel.eq.3 .and. icharge(itypi).eq.2) THEN +c! Dipole-charge interactions + CALL edq(ecl, elj, epol) + eheadtail = ECL + elj + epol + + ELSE IF ((isel.eq.2.and. + & iabs(Qi).eq.1).and. + & nstate(itypi,itypj).eq.1) THEN +c! Same charge-charge interaction ( +/+ or -/- ) + CALL eqq(Ecl,Egb,Epol,Fisocav,Elj) + eheadtail = ECL + Egb + Epol + Fisocav + Elj + + ELSE IF ((isel.eq.2.and. + & iabs(Qi).eq.1).and. + & nstate(itypi,itypj).ne.1) THEN +c! Different charge-charge interaction ( +/- or -/+ ) + CALL energy_quad + & (istate,eheadtail,Ecl,Egb,Epol,Fisocav,Elj,Equad) + END IF + END IF ! this endif ends the "catch the gly-gly" at the beggining of Fcav +c! write (*,*) "evdw = ", evdw +c! write (*,*) "Fcav = ", Fcav +c! write (*,*) "eheadtail = ", eheadtail + evdw = evdw + & + Fcav + & + eheadtail + + IF (energy_dec) write (iout,'(2(1x,a3,i3),3f6.2,9f16.7)') + & restyp(itype(i)),i,restyp(itype(j)),j, + & 1.0d0/rij,Rtail,Rhead,evdwij,Fcav,Ecl,Egb,Epol,Fisocav,Elj, + & Equad,evdw + IF (energy_dec) write (*,'(2(1x,a3,i3),3f6.2,9f16.7)') + & restyp(itype(i)),i,restyp(itype(j)),j, + & 1.0d0/rij,Rtail,Rhead,evdwij,Fcav,Ecl,Egb,Epol,Fisocav,Elj, + & Equad,evdw +#IFDEF CHECK_MOMO + evdw = 0.0d0 + END DO ! troll +#ENDIF + +c!------------------------------------------------------------------- +c! As all angular derivatives are done, now we sum them up, +c! then transform and project into cartesian vectors and add to gvdwc +c! We call sc_grad always, with the exception of +/- interaction. +c! This is because energy_quad subroutine needs to handle +c! this job in his own way. +c! This IS probably not very efficient and SHOULD be optimised +c! but it will require major restructurization of emomo +c! so it will be left as it is for now +c! write (*,*) 'troll1, nstate =', nstate (itypi,itypj) + IF (nstate(itypi,itypj).eq.1) THEN +#ifdef TSCSC + IF (bb(itypi,itypj).gt.0) THEN + CALL sc_grad + ELSE + CALL sc_grad_T + END IF +#else + CALL sc_grad +#endif + END IF +c!------------------------------------------------------------------- +c! NAPISY KONCOWE + END DO ! j + END DO ! iint + END DO ! i +c write (iout,*) "Number of loop steps in EGB:",ind +c energy_dec=.false. + RETURN + END SUBROUTINE emomo +c! END OF MOMO + + +C----------------------------------------------------------------------------- + + + SUBROUTINE eqq(Ecl,Egb,Epol,Fisocav,Elj) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar, facd3, facd4, federmaus, adler +c! Epol and Gpol analytical parameters + alphapol1 = alphapol(itypi,itypj) + alphapol2 = alphapol(itypj,itypi) +c! Fisocav and Gisocav analytical parameters + al1 = alphiso(1,itypi,itypj) + al2 = alphiso(2,itypi,itypj) + al3 = alphiso(3,itypi,itypj) + al4 = alphiso(4,itypi,itypj) + csig = (1.0d0 + & / dsqrt(sigiso1(itypi, itypj)**2.0d0 + & + sigiso2(itypi,itypj)**2.0d0)) +c! + pis = sig0head(itypi,itypj) + eps_head = epshead(itypi,itypj) + Rhead_sq = Rhead * Rhead +c! R1 - distance between head of ith side chain and tail of jth sidechain +c! R2 - distance between head of jth side chain and tail of ith sidechain + R1 = 0.0d0 + R2 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances needed by Epol + R1=R1+(ctail(k,2)-chead(k,1))**2 + R2=R2+(chead(k,2)-ctail(k,1))**2 + END DO +c! Pitagoras + R1 = dsqrt(R1) + R2 = dsqrt(R2) + +c! R1 = dsqrt((Rtail**2)+((dtail(1,itypi,itypj) +c! & +dhead(1,1,itypi,itypj))**2)) +c! R2 = dsqrt((Rtail**2)+((dtail(2,itypi,itypj) +c! & +dhead(2,1,itypi,itypj))**2)) + +c!------------------------------------------------------------------- +c! Coulomb electrostatic interaction + Ecl = (332.0d0 * Qij) / Rhead +c! derivative of Ecl is Gcl... + dGCLdR = (-332.0d0 * Qij ) / Rhead_sq + dGCLdOM1 = 0.0d0 + dGCLdOM2 = 0.0d0 + dGCLdOM12 = 0.0d0 +c!------------------------------------------------------------------- +c! Generalised Born Solvent Polarization +c! Charged head polarizes the solvent + ee = dexp(-( Rhead_sq ) / (4.0d0 * a12sq)) + Fgb = sqrt( ( Rhead_sq ) + a12sq * ee) + Egb = -(332.0d0 * Qij * eps_inout_fac) / Fgb +c! Derivative of Egb is Ggb... + dGGBdFGB = -(-332.0d0 * Qij * eps_inout_fac) / (Fgb * Fgb) + dFGBdR = ( Rhead * ( 2.0d0 - (0.5d0 * ee) ) ) + & / ( 2.0d0 * Fgb ) + dGGBdR = dGGBdFGB * dFGBdR +c!------------------------------------------------------------------- +c! Fisocav - isotropic cavity creation term +c! or "how much energy it costs to put charged head in water" + pom = Rhead * csig + top = al1 * (dsqrt(pom) + al2 * pom - al3) + bot = (1.0d0 + al4 * pom**12.0d0) + botsq = bot * bot + FisoCav = top / bot +c! write (*,*) "Rhead = ",Rhead +c! write (*,*) "csig = ",csig +c! write (*,*) "pom = ",pom +c! write (*,*) "al1 = ",al1 +c! write (*,*) "al2 = ",al2 +c! write (*,*) "al3 = ",al3 +c! write (*,*) "al4 = ",al4 +c! write (*,*) "top = ",top +c! write (*,*) "bot = ",bot +c! Derivative of Fisocav is GCV... + dtop = al1 * ((1.0d0 / (2.0d0 * dsqrt(pom))) + al2) + dbot = 12.0d0 * al4 * pom ** 11.0d0 + dGCVdR = ((dtop * bot - top * dbot) / botsq) * csig +c!------------------------------------------------------------------- +c! Epol +c! Polarization energy - charged heads polarize hydrophobic "neck" + MomoFac1 = (1.0d0 - chi1 * sqom2) + MomoFac2 = (1.0d0 - chi2 * sqom1) + RR1 = ( R1 * R1 ) / MomoFac1 + RR2 = ( R2 * R2 ) / MomoFac2 + ee1 = exp(-( RR1 / (4.0d0 * a12sq) )) + ee2 = exp(-( RR2 / (4.0d0 * a12sq) )) + fgb1 = sqrt( RR1 + a12sq * ee1 ) + fgb2 = sqrt( RR2 + a12sq * ee2 ) + epol = 332.0d0 * eps_inout_fac * ( + & (( alphapol1 / fgb1 )**4.0d0)+((alphapol2/fgb2) ** 4.0d0 )) +c! epol = 0.0d0 +c write (*,*) "eps_inout_fac = ",eps_inout_fac +c write (*,*) "alphapol1 = ", alphapol1 +c write (*,*) "alphapol2 = ", alphapol2 +c write (*,*) "fgb1 = ", fgb1 +c write (*,*) "fgb2 = ", fgb2 +c write (*,*) "epol = ", epol +c! derivative of Epol is Gpol... + dPOLdFGB1 = -(1328.0d0 * eps_inout_fac * alphapol1 ** 4.0d0) + & / (fgb1 ** 5.0d0) + dPOLdFGB2 = -(1328.0d0 * eps_inout_fac * alphapol2 ** 4.0d0) + & / (fgb2 ** 5.0d0) + dFGBdR1 = ( (R1 / MomoFac1) + & * ( 2.0d0 - (0.5d0 * ee1) ) ) + & / ( 2.0d0 * fgb1 ) + dFGBdR2 = ( (R2 / MomoFac2) + & * ( 2.0d0 - (0.5d0 * ee2) ) ) + & / ( 2.0d0 * fgb2 ) + dFGBdOM2 = (((R1 * R1 * chi1 * om2) / (MomoFac1 * MomoFac1)) + & * ( 2.0d0 - 0.5d0 * ee1) ) + & / ( 2.0d0 * fgb1 ) + dFGBdOM1 = (((R2 * R2 * chi2 * om1) / (MomoFac2 * MomoFac2)) + & * ( 2.0d0 - 0.5d0 * ee2) ) + & / ( 2.0d0 * fgb2 ) + dPOLdR1 = dPOLdFGB1 * dFGBdR1 +c! dPOLdR1 = 0.0d0 + dPOLdR2 = dPOLdFGB2 * dFGBdR2 +c! dPOLdR2 = 0.0d0 + dPOLdOM1 = dPOLdFGB2 * dFGBdOM1 +c! dPOLdOM1 = 0.0d0 + dPOLdOM2 = dPOLdFGB1 * dFGBdOM2 +c! dPOLdOM2 = 0.0d0 +c!------------------------------------------------------------------- +c! Elj +c! Lennard-Jones 6-12 interaction between heads + pom = (pis / Rhead)**6.0d0 + Elj = 4.0d0 * eps_head * pom * (pom-1.0d0) +c! derivative of Elj is Glj + dGLJdR = 4.0d0 * eps_head + & * (((-12.0d0*pis**12.0d0)/(Rhead**13.0d0)) + & + (( 6.0d0*pis**6.0d0) /(Rhead**7.0d0))) +c!------------------------------------------------------------------- +c! Return the results +c! These things do the dRdX derivatives, that is +c! allow us to change what we see from function that changes with +c! distance to function that changes with LOCATION (of the interaction +c! site) + DO k = 1, 3 + erhead(k) = Rhead_distance(k)/Rhead + erhead_tail(k,1) = ((ctail(k,2)-chead(k,1))/R1) + erhead_tail(k,2) = ((chead(k,2)-ctail(k,1))/R2) + END DO + + erdxi = scalar( erhead(1), dC_norm(1,i+nres) ) + erdxj = scalar( erhead(1), dC_norm(1,j+nres) ) + bat = scalar( erhead_tail(1,1), dC_norm(1,i+nres) ) + federmaus = scalar(erhead_tail(1,1),dC_norm(1,j+nres)) + eagle = scalar( erhead_tail(1,2), dC_norm(1,j+nres) ) + adler = scalar( erhead_tail(1,2), dC_norm(1,i+nres) ) + facd1 = d1 * vbld_inv(i+nres) + facd2 = d2 * vbld_inv(j+nres) + facd3 = dtail(1,itypi,itypj) * vbld_inv(i+nres) + facd4 = dtail(2,itypi,itypj) * vbld_inv(j+nres) + +c! Now we add appropriate partial derivatives (one in each dimension) + DO k = 1, 3 + hawk = (erhead_tail(k,1) + + & facd1 * (erhead_tail(k,1) - bat * dC_norm(k,i+nres))) + condor = (erhead_tail(k,2) + + & facd2 * (erhead_tail(k,2) - eagle * dC_norm(k,j+nres))) + + pom = erhead(k)+facd1*(erhead(k)-erdxi*dC_norm(k,i+nres)) + gvdwx(k,i) = gvdwx(k,i) + & - dGCLdR * pom + & - dGGBdR * pom + & - dGCVdR * pom + & - dPOLdR1 * hawk + & - dPOLdR2 * (erhead_tail(k,2) + & -facd3 * (erhead_tail(k,2) - adler * dC_norm(k,i+nres))) + & - dGLJdR * pom + + pom = erhead(k)+facd2*(erhead(k)-erdxj*dC_norm(k,j+nres)) + gvdwx(k,j) = gvdwx(k,j) + & + dGCLdR * pom + & + dGGBdR * pom + & + dGCVdR * pom + & + dPOLdR1 * (erhead_tail(k,1) + & -facd4 * (erhead_tail(k,1) - federmaus * dC_norm(k,j+nres))) + & + dPOLdR2 * condor + & + dGLJdR * pom + + gvdwc(k,i) = gvdwc(k,i) + & - dGCLdR * erhead(k) + & - dGGBdR * erhead(k) + & - dGCVdR * erhead(k) + & - dPOLdR1 * erhead_tail(k,1) + & - dPOLdR2 * erhead_tail(k,2) + & - dGLJdR * erhead(k) + + gvdwc(k,j) = gvdwc(k,j) + & + dGCLdR * erhead(k) + & + dGGBdR * erhead(k) + & + dGCVdR * erhead(k) + & + dPOLdR1 * erhead_tail(k,1) + & + dPOLdR2 * erhead_tail(k,2) + & + dGLJdR * erhead(k) + + END DO + RETURN + END SUBROUTINE eqq +c!------------------------------------------------------------------- + SUBROUTINE energy_quad + &(istate,eheadtail,Ecl,Egb,Epol,Fisocav,Elj,Equad) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar + double precision ener(4) + double precision dcosom1(3),dcosom2(3) +c! used in Epol derivatives + double precision facd3, facd4 + double precision federmaus, adler +c! Epol and Gpol analytical parameters + alphapol1 = alphapol(itypi,itypj) + alphapol2 = alphapol(itypj,itypi) +c! Fisocav and Gisocav analytical parameters + al1 = alphiso(1,itypi,itypj) + al2 = alphiso(2,itypi,itypj) + al3 = alphiso(3,itypi,itypj) + al4 = alphiso(4,itypi,itypj) + csig = (1.0d0 + & / dsqrt(sigiso1(itypi, itypj)**2.0d0 + & + sigiso2(itypi,itypj)**2.0d0)) +c! + w1 = wqdip(1,itypi,itypj) + w2 = wqdip(2,itypi,itypj) + pis = sig0head(itypi,itypj) + eps_head = epshead(itypi,itypj) +c! First things first: +c! We need to do sc_grad's job with GB and Fcav + eom1 = + & eps2der * eps2rt_om1 + & - 2.0D0 * alf1 * eps3der + & + sigder * sigsq_om1 + & + dCAVdOM1 + eom2 = + & eps2der * eps2rt_om2 + & + 2.0D0 * alf2 * eps3der + & + sigder * sigsq_om2 + & + dCAVdOM2 + eom12 = + & evdwij * eps1_om12 + & + eps2der * eps2rt_om12 + & - 2.0D0 * alf12 * eps3der + & + sigder *sigsq_om12 + & + dCAVdOM12 +c! now some magical transformations to project gradient into +c! three cartesian vectors + DO k = 1, 3 + dcosom1(k) = rij * (dc_norm(k,nres+i) - om1 * erij(k)) + dcosom2(k) = rij * (dc_norm(k,nres+j) - om2 * erij(k)) + gg(k) = gg(k) + eom1 * dcosom1(k) + eom2 * dcosom2(k) +c! this acts on hydrophobic center of interaction + gvdwx(k,i)= gvdwx(k,i) - gg(k) + & + (eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & + eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + gvdwx(k,j)= gvdwx(k,j) + gg(k) + & + (eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & + eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv +c! this acts on Calpha + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + END DO +c! sc_grad is done, now we will compute + eheadtail = 0.0d0 + eom1 = 0.0d0 + eom2 = 0.0d0 + eom12 = 0.0d0 + +c! ENERGY DEBUG +c! ii = 1 +c! jj = 1 +c! d1 = dhead(1, 1, itypi, itypj) +c! d2 = dhead(2, 1, itypi, itypj) +c! R1 = dsqrt((Rtail**2)+((dtail(1,itypi,itypj) +c! & +dhead(1,ii,itypi,itypj))**2)) +c! R2 = dsqrt((Rtail**2)+((dtail(2,itypi,itypj) +c! & +dhead(2,jj,itypi,itypj))**2)) +c! Rhead = dsqrt((Rtail**2)+((dabs(d1-d2))**2)) +c! END OF ENERGY DEBUG +c************************************************************* + DO istate = 1, nstate(itypi,itypj) +c************************************************************* + IF (istate.ne.1) THEN + IF (istate.lt.3) THEN + ii = 1 + ELSE + ii = 2 + END IF + jj = istate/ii + d1 = dhead(1,ii,itypi,itypj) + d2 = dhead(2,jj,itypi,itypj) + DO k = 1,3 + chead(k,1) = c(k, i+nres) + d1 * dc_norm(k, i+nres) + chead(k,2) = c(k, j+nres) + d2 * dc_norm(k, j+nres) + Rhead_distance(k) = chead(k,2) - chead(k,1) + END DO +c! pitagoras (root of sum of squares) + Rhead = dsqrt( + & (Rhead_distance(1)*Rhead_distance(1)) + & + (Rhead_distance(2)*Rhead_distance(2)) + & + (Rhead_distance(3)*Rhead_distance(3))) + END IF + Rhead_sq = Rhead * Rhead + +c! R1 - distance between head of ith side chain and tail of jth sidechain +c! R2 - distance between head of jth side chain and tail of ith sidechain + R1 = 0.0d0 + R2 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R1=R1+(ctail(k,2)-chead(k,1))**2 + R2=R2+(chead(k,2)-ctail(k,1))**2 + END DO +c! Pitagoras + R1 = dsqrt(R1) + R2 = dsqrt(R2) + +c! ENERGY DEBUG +c! write (*,*) "istate = ", istate +c! write (*,*) "ii = ", ii +c! write (*,*) "jj = ", jj +c! R1 = dsqrt((Rtail**2)+((dtail(1,itypi,itypj) +c! & +dhead(1,ii,itypi,itypj))**2)) +c! R2 = dsqrt((Rtail**2)+((dtail(2,itypi,itypj) +c! & +dhead(2,jj,itypi,itypj))**2)) +c! Rhead = dsqrt((Rtail**2)+((dabs(d1-d2))**2)) +c! Rhead_sq = Rhead * Rhead +c! write (*,*) "d1 = ",d1 +c! write (*,*) "d2 = ",d2 +c! write (*,*) "R1 = ",R1 +c! write (*,*) "R2 = ",R2 +c! write (*,*) "Rhead = ",Rhead +c! END OF ENERGY DEBUG + +c!------------------------------------------------------------------- +c! Coulomb electrostatic interaction + Ecl = (332.0d0 * Qij) / (Rhead * eps_in) +c! Ecl = 0.0d0 +c! write (*,*) "Ecl = ", Ecl +c! derivative of Ecl is Gcl... + dGCLdR = (-332.0d0 * Qij ) / (Rhead_sq * eps_in) +c! dGCLdR = 0.0d0 + dGCLdOM1 = 0.0d0 + dGCLdOM2 = 0.0d0 + dGCLdOM12 = 0.0d0 +c!------------------------------------------------------------------- +c! Generalised Born Solvent Polarization + ee = dexp(-( Rhead_sq ) / (4.0d0 * a12sq)) + Fgb = sqrt( ( Rhead_sq ) + a12sq * ee) + Egb = -(332.0d0 * Qij * eps_inout_fac) / Fgb +c! Egb = 0.0d0 +c! write (*,*) "a1*a2 = ", a12sq +c! write (*,*) "Rhead = ", Rhead +c! write (*,*) "Rhead_sq = ", Rhead_sq +c! write (*,*) "ee = ", ee +c! write (*,*) "Fgb = ", Fgb +c! write (*,*) "fac = ", eps_inout_fac +c! write (*,*) "Qij = ", Qij +c! write (*,*) "Egb = ", Egb +c! Derivative of Egb is Ggb... +c! dFGBdR is used by Quad's later... + dGGBdFGB = -(-332.0d0 * Qij * eps_inout_fac) / (Fgb * Fgb) + dFGBdR = ( Rhead * ( 2.0d0 - (0.5d0 * ee) ) ) + & / ( 2.0d0 * Fgb ) + dGGBdR = dGGBdFGB * dFGBdR +c! dGGBdR = 0.0d0 +c!------------------------------------------------------------------- +c! Fisocav - isotropic cavity creation term + pom = Rhead * csig + top = al1 * (dsqrt(pom) + al2 * pom - al3) + bot = (1.0d0 + al4 * pom**12.0d0) + botsq = bot * bot + FisoCav = top / bot +c! FisoCav = 0.0d0 +c! write (*,*) "pom = ",pom +c! write (*,*) "al1 = ",al1 +c! write (*,*) "al2 = ",al2 +c! write (*,*) "al3 = ",al3 +c! write (*,*) "al4 = ",al4 +c! write (*,*) "top = ",top +c! write (*,*) "bot = ",bot +c! write (*,*) "Fisocav = ", Fisocav + +c! Derivative of Fisocav is GCV... + dtop = al1 * ((1.0d0 / (2.0d0 * dsqrt(pom))) + al2) + dbot = 12.0d0 * al4 * pom ** 11.0d0 + dGCVdR = ((dtop * bot - top * dbot) / botsq) * csig +c! dGCVdR = 0.0d0 +c!------------------------------------------------------------------- +c! Polarization energy +c! Epol + MomoFac1 = (1.0d0 - chi1 * sqom2) + MomoFac2 = (1.0d0 - chi2 * sqom1) + RR1 = ( R1 * R1 ) / MomoFac1 + RR2 = ( R2 * R2 ) / MomoFac2 + ee1 = exp(-( RR1 / (4.0d0 * a12sq) )) + ee2 = exp(-( RR2 / (4.0d0 * a12sq) )) + fgb1 = sqrt( RR1 + a12sq * ee1 ) + fgb2 = sqrt( RR2 + a12sq * ee2 ) + epol = 332.0d0 * eps_inout_fac * ( + & (( alphapol1 / fgb1 )**4.0d0)+((alphapol2/fgb2) ** 4.0d0 )) +c! epol = 0.0d0 +c! derivative of Epol is Gpol... + dPOLdFGB1 = -(1328.0d0 * eps_inout_fac * alphapol1 ** 4.0d0) + & / (fgb1 ** 5.0d0) + dPOLdFGB2 = -(1328.0d0 * eps_inout_fac * alphapol2 ** 4.0d0) + & / (fgb2 ** 5.0d0) + dFGBdR1 = ( (R1 / MomoFac1) + & * ( 2.0d0 - (0.5d0 * ee1) ) ) + & / ( 2.0d0 * fgb1 ) + dFGBdR2 = ( (R2 / MomoFac2) + & * ( 2.0d0 - (0.5d0 * ee2) ) ) + & / ( 2.0d0 * fgb2 ) + dFGBdOM2 = (((R1 * R1 * chi1 * om2) / (MomoFac1 * MomoFac1)) + & * ( 2.0d0 - 0.5d0 * ee1) ) + & / ( 2.0d0 * fgb1 ) + dFGBdOM1 = (((R2 * R2 * chi2 * om1) / (MomoFac2 * MomoFac2)) + & * ( 2.0d0 - 0.5d0 * ee2) ) + & / ( 2.0d0 * fgb2 ) + dPOLdR1 = dPOLdFGB1 * dFGBdR1 +c! dPOLdR1 = 0.0d0 + dPOLdR2 = dPOLdFGB2 * dFGBdR2 +c! dPOLdR2 = 0.0d0 + dPOLdOM1 = dPOLdFGB2 * dFGBdOM1 +c! dPOLdOM1 = 0.0d0 + dPOLdOM2 = dPOLdFGB1 * dFGBdOM2 +c! dPOLdOM2 = 0.0d0 +c!------------------------------------------------------------------- +c! Elj + pom = (pis / Rhead)**6.0d0 + Elj = 4.0d0 * eps_head * pom * (pom-1.0d0) +c! Elj = 0.0d0 +c! derivative of Elj is Glj + dGLJdR = 4.0d0 * eps_head + & * (((-12.0d0*pis**12.0d0)/(Rhead**13.0d0)) + & + (( 6.0d0*pis**6.0d0) /(Rhead**7.0d0))) +c! dGLJdR = 0.0d0 +c!------------------------------------------------------------------- +c! Equad + IF (Wqd.ne.0.0d0) THEN + Beta1 = 5.0d0 + 3.0d0 * (sqom12 - 1.0d0) + & - 37.5d0 * ( sqom1 + sqom2 ) + & + 157.5d0 * ( sqom1 * sqom2 ) + & - 45.0d0 * om1*om2*om12 + fac = -( Wqd / (2.0d0 * Fgb**5.0d0) ) + Equad = fac * Beta1 +c! Equad = 0.0d0 +c! derivative of Equad... + dQUADdR = ((2.5d0 * Wqd * Beta1) / (Fgb**6.0d0)) * dFGBdR +c! dQUADdR = 0.0d0 + dQUADdOM1 = fac + & * (-75.0d0*om1 + 315.0d0*om1*sqom2 - 45.0d0*om2*om12) +c! dQUADdOM1 = 0.0d0 + dQUADdOM2 = fac + & * (-75.0d0*om2 + 315.0d0*sqom1*om2 - 45.0d0*om1*om12) +c! dQUADdOM2 = 0.0d0 + dQUADdOM12 = fac + & * ( 6.0d0*om12 - 45.0d0*om1*om2 ) +c! dQUADdOM12 = 0.0d0 + ELSE + Beta1 = 0.0d0 + Equad = 0.0d0 + END IF +c!------------------------------------------------------------------- +c! Return the results +c! Angular stuff + eom1 = dPOLdOM1 + dQUADdOM1 + eom2 = dPOLdOM2 + dQUADdOM2 + eom12 = dQUADdOM12 +c! now some magical transformations to project gradient into +c! three cartesian vectors + DO k = 1, 3 + dcosom1(k) = rij * (dc_norm(k,nres+i) - om1 * erij(k)) + dcosom2(k) = rij * (dc_norm(k,nres+j) - om2 * erij(k)) + tuna(k) = eom1 * dcosom1(k) + eom2 * dcosom2(k) + END DO +c! Radial stuff + DO k = 1, 3 + erhead(k) = Rhead_distance(k)/Rhead + erhead_tail(k,1) = ((ctail(k,2)-chead(k,1))/R1) + erhead_tail(k,2) = ((chead(k,2)-ctail(k,1))/R2) + END DO + erdxi = scalar( erhead(1), dC_norm(1,i+nres) ) + erdxj = scalar( erhead(1), dC_norm(1,j+nres) ) + bat = scalar( erhead_tail(1,1), dC_norm(1,i+nres) ) + federmaus = scalar(erhead_tail(1,1),dC_norm(1,j+nres)) + eagle = scalar( erhead_tail(1,2), dC_norm(1,j+nres) ) + adler = scalar( erhead_tail(1,2), dC_norm(1,i+nres) ) + facd1 = d1 * vbld_inv(i+nres) + facd2 = d2 * vbld_inv(j+nres) + facd3 = dtail(1,itypi,itypj) * vbld_inv(i+nres) + facd4 = dtail(2,itypi,itypj) * vbld_inv(j+nres) +c! Throw the results into gheadtail which holds gradients +c! for each micro-state + DO k = 1, 3 + hawk = erhead_tail(k,1) + + & facd1 * (erhead_tail(k,1) - bat * dC_norm(k,i+nres)) + condor = erhead_tail(k,2) + + & facd2 * (erhead_tail(k,2) - eagle * dC_norm(k,j+nres)) + + pom = erhead(k)+facd1*(erhead(k)-erdxi*dC_norm(k,i+nres)) +c! this acts on hydrophobic center of interaction + gheadtail(k,1,1) = gheadtail(k,1,1) + & - dGCLdR * pom + & - dGGBdR * pom + & - dGCVdR * pom + & - dPOLdR1 * hawk + & - dPOLdR2 * (erhead_tail(k,2) + & -facd3 * (erhead_tail(k,2) - adler * dC_norm(k,i+nres))) + & - dGLJdR * pom + & - dQUADdR * pom + & - tuna(k) + & + (eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & + eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + + pom = erhead(k)+facd2*(erhead(k)-erdxj*dC_norm(k,j+nres)) +c! this acts on hydrophobic center of interaction + gheadtail(k,2,1) = gheadtail(k,2,1) + & + dGCLdR * pom + & + dGGBdR * pom + & + dGCVdR * pom + & + dPOLdR1 * (erhead_tail(k,1) + & -facd4 * (erhead_tail(k,1) - federmaus * dC_norm(k,j+nres))) + & + dPOLdR2 * condor + & + dGLJdR * pom + & + dQUADdR * pom + & + tuna(k) + & + (eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & + eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + +c! this acts on Calpha + gheadtail(k,3,1) = gheadtail(k,3,1) + & - dGCLdR * erhead(k) + & - dGGBdR * erhead(k) + & - dGCVdR * erhead(k) + & - dPOLdR1 * erhead_tail(k,1) + & - dPOLdR2 * erhead_tail(k,2) + & - dGLJdR * erhead(k) + & - dQUADdR * erhead(k) + & - tuna(k) + +c! this acts on Calpha + gheadtail(k,4,1) = gheadtail(k,4,1) + & + dGCLdR * erhead(k) + & + dGGBdR * erhead(k) + & + dGCVdR * erhead(k) + & + dPOLdR1 * erhead_tail(k,1) + & + dPOLdR2 * erhead_tail(k,2) + & + dGLJdR * erhead(k) + & + dQUADdR * erhead(k) + & + tuna(k) + END DO +c! write(*,*) "ECL = ", Ecl +c! write(*,*) "Egb = ", Egb +c! write(*,*) "Epol = ", Epol +c! write(*,*) "Fisocav = ", Fisocav +c! write(*,*) "Elj = ", Elj +c! write(*,*) "Equad = ", Equad +c! write(*,*) "wstate = ", wstate(istate,itypi,itypj) +c! write(*,*) "eheadtail = ", eheadtail +c! write(*,*) "TROLL = ", dexp(-betaT * ener(istate)) +c! write(*,*) "dGCLdR = ", dGCLdR +c! write(*,*) "dGGBdR = ", dGGBdR +c! write(*,*) "dGCVdR = ", dGCVdR +c! write(*,*) "dPOLdR1 = ", dPOLdR1 +c! write(*,*) "dPOLdR2 = ", dPOLdR2 +c! write(*,*) "dGLJdR = ", dGLJdR +c! write(*,*) "dQUADdR = ", dQUADdR +c! write(*,*) "tuna(",k,") = ", tuna(k) + ener(istate) = ECL + Egb + Epol + Fisocav + Elj + Equad + eheadtail = eheadtail + & + wstate(istate, itypi, itypj) + & * dexp(-betaT * ener(istate)) +c! foreach cartesian dimension + DO k = 1, 3 +c! foreach of two gvdwx and gvdwc + DO l = 1, 4 + gheadtail(k,l,2) = gheadtail(k,l,2) + & + wstate( istate, itypi, itypj ) + & * dexp(-betaT * ener(istate)) + & * gheadtail(k,l,1) + gheadtail(k,l,1) = 0.0d0 + END DO + END DO + END DO +c! Here ended the gigantic DO istate = 1, 4, which starts +c! at the beggining of the subroutine + + DO k = 1, 3 + DO l = 1, 4 + gheadtail(k,l,2) = gheadtail(k,l,2) / eheadtail + END DO + gvdwx(k,i) = gvdwx(k,i) + gheadtail(k,1,2) + gvdwx(k,j) = gvdwx(k,j) + gheadtail(k,2,2) + gvdwc(k,i) = gvdwc(k,i) + gheadtail(k,3,2) + gvdwc(k,j) = gvdwc(k,j) + gheadtail(k,4,2) + DO l = 1, 4 + gheadtail(k,l,1) = 0.0d0 + gheadtail(k,l,2) = 0.0d0 + END DO + END DO + eheadtail = (-dlog(eheadtail)) / betaT + dPOLdOM1 = 0.0d0 + dPOLdOM2 = 0.0d0 + dQUADdOM1 = 0.0d0 + dQUADdOM2 = 0.0d0 + dQUADdOM12 = 0.0d0 + RETURN + END SUBROUTINE energy_quad + + +c!------------------------------------------------------------------- + + + SUBROUTINE eqn(Epol) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar, facd4, federmaus + alphapol1 = alphapol(itypi,itypj) +c! R1 - distance between head of ith side chain and tail of jth sidechain + R1 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R1=R1+(ctail(k,2)-chead(k,1))**2 + END DO +c! Pitagoras + R1 = dsqrt(R1) + +c! R1 = dsqrt((Rtail**2)+((dtail(1,itypi,itypj) +c! & +dhead(1,1,itypi,itypj))**2)) +c! R2 = dsqrt((Rtail**2)+((dtail(2,itypi,itypj) +c! & +dhead(2,1,itypi,itypj))**2)) +c-------------------------------------------------------------------- +c Polarization energy +c Epol + MomoFac1 = (1.0d0 - chi1 * sqom2) + RR1 = R1 * R1 / MomoFac1 + ee1 = exp(-( RR1 / (4.0d0 * a12sq) )) + fgb1 = sqrt( RR1 + a12sq * ee1) + epol = 332.0d0 * eps_inout_fac * (( alphapol1 / fgb1 )**4.0d0) +c! epol = 0.0d0 +c!------------------------------------------------------------------ +c! derivative of Epol is Gpol... + dPOLdFGB1 = -(1328.0d0 * eps_inout_fac * alphapol1 ** 4.0d0) + & / (fgb1 ** 5.0d0) + dFGBdR1 = ( (R1 / MomoFac1) + & * ( 2.0d0 - (0.5d0 * ee1) ) ) + & / ( 2.0d0 * fgb1 ) + dFGBdOM2 = (((R1 * R1 * chi1 * om2) / (MomoFac1 * MomoFac1)) + & * (2.0d0 - 0.5d0 * ee1) ) + & / (2.0d0 * fgb1) + dPOLdR1 = dPOLdFGB1 * dFGBdR1 +c! dPOLdR1 = 0.0d0 + dPOLdOM1 = 0.0d0 + dPOLdOM2 = dPOLdFGB1 * dFGBdOM2 +c! dPOLdOM2 = 0.0d0 +c!------------------------------------------------------------------- +c! Return the results +c! (see comments in Eqq) + DO k = 1, 3 + erhead_tail(k,1) = ((ctail(k,2)-chead(k,1))/R1) + END DO + bat = scalar( erhead_tail(1,1), dC_norm(1,i+nres) ) + federmaus = scalar(erhead_tail(1,1),dC_norm(1,j+nres)) + facd1 = d1 * vbld_inv(i+nres) + facd4 = dtail(2,itypi,itypj) * vbld_inv(j+nres) + + DO k = 1, 3 + hawk = (erhead_tail(k,1) + + & facd1 * (erhead_tail(k,1) - bat * dC_norm(k,i+nres))) + + gvdwx(k,i) = gvdwx(k,i) + & - dPOLdR1 * hawk + gvdwx(k,j) = gvdwx(k,j) + & + dPOLdR1 * (erhead_tail(k,1) + & -facd4 * (erhead_tail(k,1) - federmaus * dC_norm(k,j+nres))) + + gvdwc(k,i) = gvdwc(k,i) + & - dPOLdR1 * erhead_tail(k,1) + gvdwc(k,j) = gvdwc(k,j) + & + dPOLdR1 * erhead_tail(k,1) + + END DO + RETURN + END SUBROUTINE eqn + + +c!------------------------------------------------------------------- + + + + SUBROUTINE enq(Epol) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar, facd3, adler + alphapol2 = alphapol(itypj,itypi) +c! R2 - distance between head of jth side chain and tail of ith sidechain + R2 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R2=R2+(chead(k,2)-ctail(k,1))**2 + END DO +c! Pitagoras + R2 = dsqrt(R2) + +c! R1 = dsqrt((Rtail**2)+((dtail(1,itypi,itypj) +c! & +dhead(1,1,itypi,itypj))**2)) +c! R2 = dsqrt((Rtail**2)+((dtail(2,itypi,itypj) +c! & +dhead(2,1,itypi,itypj))**2)) +c------------------------------------------------------------------------ +c Polarization energy + MomoFac2 = (1.0d0 - chi2 * sqom1) + RR2 = R2 * R2 / MomoFac2 + ee2 = exp(-(RR2 / (4.0d0 * a12sq))) + fgb2 = sqrt(RR2 + a12sq * ee2) + epol = 332.0d0 * eps_inout_fac * ((alphapol2/fgb2) ** 4.0d0 ) +c! epol = 0.0d0 +c!------------------------------------------------------------------- +c! derivative of Epol is Gpol... + dPOLdFGB2 = -(1328.0d0 * eps_inout_fac * alphapol2 ** 4.0d0) + & / (fgb2 ** 5.0d0) + dFGBdR2 = ( (R2 / MomoFac2) + & * ( 2.0d0 - (0.5d0 * ee2) ) ) + & / (2.0d0 * fgb2) + dFGBdOM1 = (((R2 * R2 * chi2 * om1) / (MomoFac2 * MomoFac2)) + & * (2.0d0 - 0.5d0 * ee2) ) + & / (2.0d0 * fgb2) + dPOLdR2 = dPOLdFGB2 * dFGBdR2 +c! dPOLdR2 = 0.0d0 + dPOLdOM1 = dPOLdFGB2 * dFGBdOM1 +c! dPOLdOM1 = 0.0d0 + dPOLdOM2 = 0.0d0 +c!------------------------------------------------------------------- +c! Return the results +c! (See comments in Eqq) + DO k = 1, 3 + erhead_tail(k,2) = ((chead(k,2)-ctail(k,1))/R2) + END DO + eagle = scalar( erhead_tail(1,2), dC_norm(1,j+nres) ) + adler = scalar( erhead_tail(1,2), dC_norm(1,i+nres) ) + facd2 = d2 * vbld_inv(j+nres) + facd3 = dtail(1,itypi,itypj) * vbld_inv(i+nres) + DO k = 1, 3 + condor = (erhead_tail(k,2) + & + facd2 * (erhead_tail(k,2) - eagle * dC_norm(k,j+nres))) + + gvdwx(k,i) = gvdwx(k,i) + & - dPOLdR2 * (erhead_tail(k,2) + & -facd3 * (erhead_tail(k,2) - adler * dC_norm(k,i+nres))) + gvdwx(k,j) = gvdwx(k,j) + & + dPOLdR2 * condor + + gvdwc(k,i) = gvdwc(k,i) + & - dPOLdR2 * erhead_tail(k,2) + gvdwc(k,j) = gvdwc(k,j) + & + dPOLdR2 * erhead_tail(k,2) + + END DO + RETURN + END SUBROUTINE enq + + +c!------------------------------------------------------------------- + + + SUBROUTINE eqd(Ecl,Elj,Epol) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar, facd4, federmaus + alphapol1 = alphapol(itypi,itypj) + w1 = wqdip(1,itypi,itypj) + w2 = wqdip(2,itypi,itypj) + pis = sig0head(itypi,itypj) + eps_head = epshead(itypi,itypj) +c!------------------------------------------------------------------- +c! R1 - distance between head of ith side chain and tail of jth sidechain + R1 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R1=R1+(ctail(k,2)-chead(k,1))**2 + END DO +c! Pitagoras + R1 = dsqrt(R1) + +c! R1 = dsqrt((Rtail**2)+((dtail(1,itypi,itypj) +c! & +dhead(1,1,itypi,itypj))**2)) +c! R2 = dsqrt((Rtail**2)+((dtail(2,itypi,itypj) +c! & +dhead(2,1,itypi,itypj))**2)) + +c!------------------------------------------------------------------- +c! ecl + sparrow = w1 * Qi * om1 + hawk = w2 * Qi * Qi * (1.0d0 - sqom2) + Ecl = sparrow / Rhead**2.0d0 + & - hawk / Rhead**4.0d0 +c!------------------------------------------------------------------- +c! derivative of ecl is Gcl +c! dF/dr part + dGCLdR = - 2.0d0 * sparrow / Rhead**3.0d0 + & + 4.0d0 * hawk / Rhead**5.0d0 +c! dF/dom1 + dGCLdOM1 = (w1 * Qi) / (Rhead**2.0d0) +c! dF/dom2 + dGCLdOM2 = (2.0d0 * w2 * Qi * Qi * om2) / (Rhead ** 4.0d0) +c-------------------------------------------------------------------- +c Polarization energy +c Epol + MomoFac1 = (1.0d0 - chi1 * sqom2) + RR1 = R1 * R1 / MomoFac1 + ee1 = exp(-( RR1 / (4.0d0 * a12sq) )) + fgb1 = sqrt( RR1 + a12sq * ee1) + epol = 332.0d0 * eps_inout_fac * (( alphapol1 / fgb1 )**4.0d0) +c! epol = 0.0d0 +c!------------------------------------------------------------------ +c! derivative of Epol is Gpol... + dPOLdFGB1 = -(1328.0d0 * eps_inout_fac * alphapol1 ** 4.0d0) + & / (fgb1 ** 5.0d0) + dFGBdR1 = ( (R1 / MomoFac1) + & * ( 2.0d0 - (0.5d0 * ee1) ) ) + & / ( 2.0d0 * fgb1 ) + dFGBdOM2 = (((R1 * R1 * chi1 * om2) / (MomoFac1 * MomoFac1)) + & * (2.0d0 - 0.5d0 * ee1) ) + & / (2.0d0 * fgb1) + dPOLdR1 = dPOLdFGB1 * dFGBdR1 +c! dPOLdR1 = 0.0d0 + dPOLdOM1 = 0.0d0 + dPOLdOM2 = dPOLdFGB1 * dFGBdOM2 +c! dPOLdOM2 = 0.0d0 +c!------------------------------------------------------------------- +c! Elj + pom = (pis / Rhead)**6.0d0 + Elj = 4.0d0 * eps_head * pom * (pom-1.0d0) +c! derivative of Elj is Glj + dGLJdR = 4.0d0 * eps_head + & * (((-12.0d0*pis**12.0d0)/(Rhead**13.0d0)) + & + (( 6.0d0*pis**6.0d0) /(Rhead**7.0d0))) +c!------------------------------------------------------------------- +c! Return the results + DO k = 1, 3 + erhead(k) = Rhead_distance(k)/Rhead + erhead_tail(k,1) = ((ctail(k,2)-chead(k,1))/R1) + END DO + + erdxi = scalar( erhead(1), dC_norm(1,i+nres) ) + erdxj = scalar( erhead(1), dC_norm(1,j+nres) ) + bat = scalar( erhead_tail(1,1), dC_norm(1,i+nres) ) + federmaus = scalar(erhead_tail(1,1),dC_norm(1,j+nres)) + facd1 = d1 * vbld_inv(i+nres) + facd2 = d2 * vbld_inv(j+nres) + facd4 = dtail(2,itypi,itypj) * vbld_inv(j+nres) + + DO k = 1, 3 + hawk = (erhead_tail(k,1) + + & facd1 * (erhead_tail(k,1) - bat * dC_norm(k,i+nres))) + + pom = erhead(k)+facd1*(erhead(k)-erdxi*dC_norm(k,i+nres)) + gvdwx(k,i) = gvdwx(k,i) + & - dGCLdR * pom + & - dPOLdR1 * hawk + & - dGLJdR * pom + + pom = erhead(k)+facd2*(erhead(k)-erdxj*dC_norm(k,j+nres)) + gvdwx(k,j) = gvdwx(k,j) + & + dGCLdR * pom + & + dPOLdR1 * (erhead_tail(k,1) + & -facd4 * (erhead_tail(k,1) - federmaus * dC_norm(k,j+nres))) + & + dGLJdR * pom + + + gvdwc(k,i) = gvdwc(k,i) + & - dGCLdR * erhead(k) + & - dPOLdR1 * erhead_tail(k,1) + & - dGLJdR * erhead(k) + + gvdwc(k,j) = gvdwc(k,j) + & + dGCLdR * erhead(k) + & + dPOLdR1 * erhead_tail(k,1) + & + dGLJdR * erhead(k) + + END DO + RETURN + END SUBROUTINE eqd + + +c!------------------------------------------------------------------- + + + SUBROUTINE edq(Ecl,Elj,Epol) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar, facd3, adler + alphapol2 = alphapol(itypj,itypi) + w1 = wqdip(1,itypi,itypj) + w2 = wqdip(2,itypi,itypj) + pis = sig0head(itypi,itypj) + eps_head = epshead(itypi,itypj) +c!------------------------------------------------------------------- +c! R2 - distance between head of jth side chain and tail of ith sidechain + R2 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R2=R2+(chead(k,2)-ctail(k,1))**2 + END DO +c! Pitagoras + R2 = dsqrt(R2) + +c! R1 = dsqrt((Rtail**2)+((dtail(1,itypi,itypj) +c! & +dhead(1,1,itypi,itypj))**2)) +c! R2 = dsqrt((Rtail**2)+((dtail(2,itypi,itypj) +c! & +dhead(2,1,itypi,itypj))**2)) + + +c!------------------------------------------------------------------- +c! ecl + sparrow = w1 * Qi * om1 + hawk = w2 * Qi * Qi * (1.0d0 - sqom2) + ECL = sparrow / Rhead**2.0d0 + & - hawk / Rhead**4.0d0 +c!------------------------------------------------------------------- +c! derivative of ecl is Gcl +c! dF/dr part + dGCLdR = - 2.0d0 * sparrow / Rhead**3.0d0 + & + 4.0d0 * hawk / Rhead**5.0d0 +c! dF/dom1 + dGCLdOM1 = (w1 * Qi) / (Rhead**2.0d0) +c! dF/dom2 + dGCLdOM2 = (2.0d0 * w2 * Qi * Qi * om2) / (Rhead ** 4.0d0) +c-------------------------------------------------------------------- +c Polarization energy +c Epol + MomoFac2 = (1.0d0 - chi2 * sqom1) + RR2 = R2 * R2 / MomoFac2 + ee2 = exp(-(RR2 / (4.0d0 * a12sq))) + fgb2 = sqrt(RR2 + a12sq * ee2) + epol = 332.0d0 * eps_inout_fac * ((alphapol2/fgb2) ** 4.0d0 ) +c! epol = 0.0d0 +c! derivative of Epol is Gpol... + dPOLdFGB2 = -(1328.0d0 * eps_inout_fac * alphapol2 ** 4.0d0) + & / (fgb2 ** 5.0d0) + dFGBdR2 = ( (R2 / MomoFac2) + & * ( 2.0d0 - (0.5d0 * ee2) ) ) + & / (2.0d0 * fgb2) + dFGBdOM1 = (((R2 * R2 * chi2 * om1) / (MomoFac2 * MomoFac2)) + & * (2.0d0 - 0.5d0 * ee2) ) + & / (2.0d0 * fgb2) + dPOLdR2 = dPOLdFGB2 * dFGBdR2 +c! dPOLdR2 = 0.0d0 + dPOLdOM1 = dPOLdFGB2 * dFGBdOM1 +c! dPOLdOM1 = 0.0d0 + dPOLdOM2 = 0.0d0 +c!------------------------------------------------------------------- +c! Elj + pom = (pis / Rhead)**6.0d0 + Elj = 4.0d0 * eps_head * pom * (pom-1.0d0) +c! derivative of Elj is Glj + dGLJdR = 4.0d0 * eps_head + & * (((-12.0d0*pis**12.0d0)/(Rhead**13.0d0)) + & + (( 6.0d0*pis**6.0d0) /(Rhead**7.0d0))) +c!------------------------------------------------------------------- +c! Return the results +c! (see comments in Eqq) + DO k = 1, 3 + erhead(k) = Rhead_distance(k)/Rhead + erhead_tail(k,2) = ((chead(k,2)-ctail(k,1))/R2) + END DO + erdxi = scalar( erhead(1), dC_norm(1,i+nres) ) + erdxj = scalar( erhead(1), dC_norm(1,j+nres) ) + eagle = scalar( erhead_tail(1,2), dC_norm(1,j+nres) ) + adler = scalar( erhead_tail(1,2), dC_norm(1,i+nres) ) + facd1 = d1 * vbld_inv(i+nres) + facd2 = d2 * vbld_inv(j+nres) + facd3 = dtail(1,itypi,itypj) * vbld_inv(i+nres) + + DO k = 1, 3 + condor = (erhead_tail(k,2) + & + facd2 * (erhead_tail(k,2) - eagle * dC_norm(k,j+nres))) + + pom = erhead(k)+facd1*(erhead(k)-erdxi*dC_norm(k,i+nres)) + gvdwx(k,i) = gvdwx(k,i) + & - dGCLdR * pom + & - dPOLdR2 * (erhead_tail(k,2) + & -facd3 * (erhead_tail(k,2) - adler * dC_norm(k,i+nres))) + & - dGLJdR * pom + + pom = erhead(k)+facd2*(erhead(k)-erdxj*dC_norm(k,j+nres)) + gvdwx(k,j) = gvdwx(k,j) + & + dGCLdR * pom + & + dPOLdR2 * condor + & + dGLJdR * pom + + + gvdwc(k,i) = gvdwc(k,i) + & - dGCLdR * erhead(k) + & - dPOLdR2 * erhead_tail(k,2) + & - dGLJdR * erhead(k) + + gvdwc(k,j) = gvdwc(k,j) + & + dGCLdR * erhead(k) + & + dPOLdR2 * erhead_tail(k,2) + & + dGLJdR * erhead(k) + + END DO + RETURN + END SUBROUTINE edq + + +C-------------------------------------------------------------------- + + + SUBROUTINE edd(ECL) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar +c! csig = sigiso(itypi,itypj) + w1 = wqdip(1,itypi,itypj) + w2 = wqdip(2,itypi,itypj) +c!------------------------------------------------------------------- +c! ECL + fac = (om12 - 3.0d0 * om1 * om2) + c1 = (w1 / (Rhead**3.0d0)) * fac + c2 = (w2 / Rhead ** 6.0d0) + & * (4.0d0 + fac * fac -3.0d0 * (sqom1 + sqom2)) + ECL = c1 - c2 +c! write (*,*) "w1 = ", w1 +c! write (*,*) "w2 = ", w2 +c! write (*,*) "om1 = ", om1 +c! write (*,*) "om2 = ", om2 +c! write (*,*) "om12 = ", om12 +c! write (*,*) "fac = ", fac +c! write (*,*) "c1 = ", c1 +c! write (*,*) "c2 = ", c2 +c! write (*,*) "Ecl = ", Ecl +c! write (*,*) "c2_1 = ", (w2 / Rhead ** 6.0d0) +c! write (*,*) "c2_2 = ", +c! & (4.0d0 + fac * fac -3.0d0 * (sqom1 + sqom2)) +c!------------------------------------------------------------------- +c! dervative of ECL is GCL... +c! dECL/dr + c1 = (-3.0d0 * w1 * fac) / (Rhead ** 4.0d0) + c2 = (-6.0d0 * w2) / (Rhead ** 7.0d0) + & * (4.0d0 + fac * fac - 3.0d0 * (sqom1 + sqom2)) + dGCLdR = c1 - c2 +c! dECL/dom1 + c1 = (-3.0d0 * w1 * om2 ) / (Rhead**3.0d0) + c2 = (-6.0d0 * w2) / (Rhead**6.0d0) + & * ( om2 * om12 - 3.0d0 * om1 * sqom2 + om1 ) + dGCLdOM1 = c1 - c2 +c! dECL/dom2 + c1 = (-3.0d0 * w1 * om1 ) / (Rhead**3.0d0) + c2 = (-6.0d0 * w2) / (Rhead**6.0d0) + & * ( om1 * om12 - 3.0d0 * sqom1 * om2 + om2 ) + dGCLdOM2 = c1 - c2 +c! dECL/dom12 + c1 = w1 / (Rhead ** 3.0d0) + c2 = ( 2.0d0 * w2 * fac ) / Rhead ** 6.0d0 + dGCLdOM12 = c1 - c2 +c!------------------------------------------------------------------- +c! Return the results +c! (see comments in Eqq) + DO k= 1, 3 + erhead(k) = Rhead_distance(k)/Rhead + END DO + erdxi = scalar( erhead(1), dC_norm(1,i+nres) ) + erdxj = scalar( erhead(1), dC_norm(1,j+nres) ) + facd1 = d1 * vbld_inv(i+nres) + facd2 = d2 * vbld_inv(j+nres) + DO k = 1, 3 + + pom = erhead(k)+facd1*(erhead(k)-erdxi*dC_norm(k,i+nres)) + gvdwx(k,i) = gvdwx(k,i) + & - dGCLdR * pom + pom = erhead(k)+facd2*(erhead(k)-erdxj*dC_norm(k,j+nres)) + gvdwx(k,j) = gvdwx(k,j) + & + dGCLdR * pom + + gvdwc(k,i) = gvdwc(k,i) + & - dGCLdR * erhead(k) + gvdwc(k,j) = gvdwc(k,j) + & + dGCLdR * erhead(k) + END DO + RETURN + END SUBROUTINE edd + + +c!------------------------------------------------------------------- + + + SUBROUTINE elgrad_init(eheadtail,Egb,Ecl,Elj,Equad,Epol) + IMPLICIT NONE +c! maxres + INCLUDE 'DIMENSIONS' +c! itypi, itypj, i, j, k, l, chead, + INCLUDE 'COMMON.CALC' +c! c, nres, dc_norm + INCLUDE 'COMMON.CHAIN' +c! gradc, gradx + INCLUDE 'COMMON.DERIV' +c! electrostatic gradients-specific variables + INCLUDE 'COMMON.EMP' +c! wquad, dhead, alphiso, alphasur, rborn, epsintab + INCLUDE 'COMMON.INTERACT' +c! t_bath, Rb + INCLUDE 'COMMON.MD' +c! io for debug, disable it in final builds + INCLUDE 'COMMON.IOUNITS' +c!------------------------------------------------------------------- +c! Variable Init + +c! what amino acid is the aminoacid j'th? + itypj = itype(j) +c! 1/(Gas Constant * Thermostate temperature) = BetaT +c! ENABLE THIS LINE WHEN USING CHECKGRAD!!! +c! t_bath = 300 +c! BetaT = 1.0d0 / (t_bath * Rb) + BetaT = 1.0d0 / (298.0d0 * Rb) +c! Gay-berne var's + sig0ij = sigma( itypi,itypj ) + chi1 = chi( itypi, itypj ) + chi2 = chi( itypj, itypi ) + chi12 = chi1 * chi2 + chip1 = chipp( itypi, itypj ) + chip2 = chipp( itypj, itypi ) + chip12 = chip1 * chip2 +c! not used by momo potential, but needed by sc_angular which is shared +c! by all energy_potential subroutines + alf1 = 0.0d0 + alf2 = 0.0d0 + alf12 = 0.0d0 +c! location, location, location + xj = c( 1, nres+j ) - xi + yj = c( 2, nres+j ) - yi + zj = c( 3, nres+j ) - zi + dxj = dc_norm( 1, nres+j ) + dyj = dc_norm( 2, nres+j ) + dzj = dc_norm( 3, nres+j ) +c! distance from center of chain(?) to polar/charged head +c! write (*,*) "istate = ", 1 +c! write (*,*) "ii = ", 1 +c! write (*,*) "jj = ", 1 + d1 = dhead(1, 1, itypi, itypj) + d2 = dhead(2, 1, itypi, itypj) +c! ai*aj from Fgb + a12sq = rborn(itypi,itypj) * rborn(itypj,itypi) +c! a12sq = a12sq * a12sq +c! charge of amino acid itypi is... + Qi = icharge(itypi) + Qj = icharge(itypj) + Qij = Qi * Qj +c! chis1,2,12 + chis1 = chis(itypi,itypj) + chis2 = chis(itypj,itypi) + chis12 = chis1 * chis2 + sig1 = sigmap1(itypi,itypj) + sig2 = sigmap2(itypi,itypj) +c! write (*,*) "sig1 = ", sig1 +c! write (*,*) "sig2 = ", sig2 +c! alpha factors from Fcav/Gcav + b1 = alphasur(1,itypi,itypj) + b2 = alphasur(2,itypi,itypj) + b3 = alphasur(3,itypi,itypj) + b4 = alphasur(4,itypi,itypj) +c! used to determine whether we want to do quadrupole calculations + wqd = wquad(itypi, itypj) +c! used by Fgb + eps_in = epsintab(itypi,itypj) + eps_inout_fac = ( (1.0d0/eps_in) - (1.0d0/eps_out)) +c! write (*,*) "eps_inout_fac = ", eps_inout_fac +c!------------------------------------------------------------------- +c! tail location and distance calculations + Rtail = 0.0d0 + DO k = 1, 3 + ctail(k,1)=c(k,i+nres)-dtail(1,itypi,itypj)*dc_norm(k,nres+i) + ctail(k,2)=c(k,j+nres)-dtail(2,itypi,itypj)*dc_norm(k,nres+j) + END DO +c! tail distances will be themselves usefull elswhere +c1 (in Gcav, for example) + Rtail_distance(1) = ctail( 1, 2 ) - ctail( 1,1 ) + Rtail_distance(2) = ctail( 2, 2 ) - ctail( 2,1 ) + Rtail_distance(3) = ctail( 3, 2 ) - ctail( 3,1 ) + Rtail = dsqrt( + & (Rtail_distance(1)*Rtail_distance(1)) + & + (Rtail_distance(2)*Rtail_distance(2)) + & + (Rtail_distance(3)*Rtail_distance(3))) +c!------------------------------------------------------------------- +c! Calculate location and distance between polar heads +c! distance between heads +c! for each one of our three dimensional space... + DO k = 1,3 +c! location of polar head is computed by taking hydrophobic centre +c! and moving by a d1 * dc_norm vector +c! see unres publications for very informative images + chead(k,1) = c(k, i+nres) + d1 * dc_norm(k, i+nres) + chead(k,2) = c(k, j+nres) + d2 * dc_norm(k, j+nres) +c! distance +c! Rsc_distance(k) = dabs(c(k, i+nres) - c(k, j+nres)) +c! Rsc(k) = Rsc_distance(k) * Rsc_distance(k) + Rhead_distance(k) = chead(k,2) - chead(k,1) + END DO +c! pitagoras (root of sum of squares) + Rhead = dsqrt( + & (Rhead_distance(1)*Rhead_distance(1)) + & + (Rhead_distance(2)*Rhead_distance(2)) + & + (Rhead_distance(3)*Rhead_distance(3))) +c!------------------------------------------------------------------- +c! zero everything that should be zero'ed + Egb = 0.0d0 + ECL = 0.0d0 + Elj = 0.0d0 + Equad = 0.0d0 + Epol = 0.0d0 + eheadtail = 0.0d0 + dGCLdOM1 = 0.0d0 + dGCLdOM2 = 0.0d0 + dGCLdOM12 = 0.0d0 + dPOLdOM1 = 0.0d0 + dPOLdOM2 = 0.0d0 + RETURN + END SUBROUTINE elgrad_init + + +c!------------------------------------------------------------------- + + subroutine sc_angular +C Calculate eps1,eps2,eps3,sigma, and parts of their derivatives in om1,om2, +C om12. Called by ebp, egb, and egbv. + implicit none + include 'COMMON.CALC' + include 'COMMON.IOUNITS' + erij(1)=xj*rij + erij(2)=yj*rij + erij(3)=zj*rij + om1=dxi*erij(1)+dyi*erij(2)+dzi*erij(3) + om2=dxj*erij(1)+dyj*erij(2)+dzj*erij(3) + om12=dxi*dxj+dyi*dyj+dzi*dzj +c! om1 = 0.0d0 +c! om2 = 0.0d0 +c! om12 = 0.0d0 + chiom12=chi12*om12 +C Calculate eps1(om12) and its derivative in om12 + faceps1=1.0D0-om12*chiom12 + faceps1_inv=1.0D0/faceps1 + eps1=dsqrt(faceps1_inv) +C Following variable is eps1*deps1/dom12 + eps1_om12=faceps1_inv*chiom12 +c diagnostics only +c faceps1_inv=om12 +c eps1=om12 +c eps1_om12=1.0d0 +c write (iout,*) "om12",om12," eps1",eps1 +C Calculate sigma(om1,om2,om12) and the derivatives of sigma**2 in om1,om2, +C and om12. + om1om2=om1*om2 + chiom1=chi1*om1 + chiom2=chi2*om2 + facsig=om1*chiom1+om2*chiom2-2.0D0*om1om2*chiom12 + sigsq=1.0D0-facsig*faceps1_inv + sigsq_om1=(chiom1-chiom12*om2)*faceps1_inv + sigsq_om2=(chiom2-chiom12*om1)*faceps1_inv + sigsq_om12=-chi12*(om1om2*faceps1-om12*facsig)*faceps1_inv**2 +c diagnostics only +c sigsq=1.0d0 +c sigsq_om1=0.0d0 +c sigsq_om2=0.0d0 +c sigsq_om12=0.0d0 +c write (iout,*) "chiom1",chiom1," chiom2",chiom2," chiom12",chiom12 +c write (iout,*) "faceps1",faceps1," faceps1_inv",faceps1_inv, +c & " eps1",eps1 +C Calculate eps2 and its derivatives in om1, om2, and om12. + chipom1=chip1*om1 + chipom2=chip2*om2 + chipom12=chip12*om12 + facp=1.0D0-om12*chipom12 + facp_inv=1.0D0/facp + facp1=om1*chipom1+om2*chipom2-2.0D0*om1om2*chipom12 +c write (iout,*) "chipom1",chipom1," chipom2",chipom2, +c & " chipom12",chipom12," facp",facp," facp_inv",facp_inv +C Following variable is the square root of eps2 + eps2rt=1.0D0-facp1*facp_inv +C Following three variables are the derivatives of the square root of eps +C in om1, om2, and om12. + eps2rt_om1=-4.0D0*(chipom1-chipom12*om2)*facp_inv + eps2rt_om2=-4.0D0*(chipom2-chipom12*om1)*facp_inv + eps2rt_om12=4.0D0*chip12*(om1om2*facp-om12*facp1)*facp_inv**2 +C Evaluate the "asymmetric" factor in the VDW constant, eps3 +c! Note that THIS is 0 in emomo, so we should probably move it out of sc_angular +c! Or frankly, we should restructurize the whole energy section + eps3rt=1.0D0-alf1*om1+alf2*om2-alf12*om12 +c write (iout,*) "eps2rt",eps2rt," eps3rt",eps3rt +c write (iout,*) "eps2rt_om1",eps2rt_om1," eps2rt_om2",eps2rt_om2, +c & " eps2rt_om12",eps2rt_om12 +C Calculate whole angle-dependent part of epsilon and contributions +C to its derivatives + return + end + +C---------------------------------------------------------------------------- + subroutine sc_grad_T + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.CALC' + include 'COMMON.IOUNITS' + double precision dcosom1(3),dcosom2(3) + eom1=eps2der*eps2rt_om1-2.0D0*alf1*eps3der+sigder*sigsq_om1 + eom2=eps2der*eps2rt_om2+2.0D0*alf2*eps3der+sigder*sigsq_om2 + eom12=evdwij*eps1_om12+eps2der*eps2rt_om12 + & -2.0D0*alf12*eps3der+sigder*sigsq_om12 +c diagnostics only +c eom1=0.0d0 +c eom2=0.0d0 +c eom12=evdwij*eps1_om12 +c end diagnostics +c write (iout,*) "eps2der",eps2der," eps3der",eps3der, +c & " sigder",sigder +c write (iout,*) "eps1_om12",eps1_om12," eps2rt_om12",eps2rt_om12 +c write (iout,*) "eom1",eom1," eom2",eom2," eom12",eom12 + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,nres+i)-om1*erij(k)) + dcosom2(k)=rij*(dc_norm(k,nres+j)-om2*erij(k)) + enddo + do k=1,3 + gg(k)=gg(k)+eom1*dcosom1(k)+eom2*dcosom2(k) + enddo +c write (iout,*) "gg",(gg(k),k=1,3) + do k=1,3 + gvdwxT(k,i)=gvdwxT(k,i)-gg(k) + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + gvdwxT(k,j)=gvdwxT(k,j)+gg(k) + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv +c write (iout,*)(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) +c & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv +c write (iout,*)(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) +c & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + enddo +C +C Calculate the components of the gradient in DC and X +C +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad gvdwc(l,k)=gvdwc(l,k)+gg(l) +cgrad enddo +cgrad enddo + do l=1,3 + gvdwcT(l,i)=gvdwcT(l,i)-gg(l) + gvdwcT(l,j)=gvdwcT(l,j)+gg(l) + enddo + return + end + +C---------------------------------------------------------------------------- + + + SUBROUTINE sc_grad + IMPLICIT real*8 (a-h,o-z) + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.EMP' + double precision dcosom1(3),dcosom2(3) +c! write (*,*) "Start sc_grad" +c! each eom holds sum of omega-angular derivatives of each component +c! of energy function. First GGB, then Gcav, dipole-dipole,... + eom1 = + & eps2der * eps2rt_om1 + & - 2.0D0 * alf1 * eps3der + & + sigder * sigsq_om1 + & + dCAVdOM1 + & + dGCLdOM1 + & + dPOLdOM1 + + eom2 = + & eps2der * eps2rt_om2 + & + 2.0D0 * alf2 * eps3der + & + sigder * sigsq_om2 + & + dCAVdOM2 + & + dGCLdOM2 + & + dPOLdOM2 + + eom12 = + & evdwij * eps1_om12 + & + eps2der * eps2rt_om12 + & - 2.0D0 * alf12 * eps3der + & + sigder *sigsq_om12 + & + dCAVdOM12 + & + dGCLdOM12 + +c! write (*,*) "evdwij=", evdwij +c! write (*,*) "eps1_om12=", eps1_om12 +c! write (*,*) "eps2der=", eps2rt_om12 +c! write (*,*) "alf12=", alf12 +c! write (*,*) "eps3der=", eps3der +c! write (*,*) "eom1=", eom1 +c! write (*,*) "eom2=", eom2 +c! write (*,*) "eom12=", eom12 +c! eom1 = 0.0d0 +c! eom2 = 0.0d0 +c! eom12 = 0.0d0 +c! write (*,*) "" + + DO k = 1, 3 +c! now some magical transformations to project gradient into +c! three cartesian vectors +c! write (*,*) "Gvdwc(",k,",",i,")=", gvdwc(k,i) +c! write (*,*) "Gvdwc(",k,",",j,")=", gvdwc(k,j) +c! write (*,*) "gg(",k,")=", gg(k) + dcosom1(k) = rij * (dc_norm(k,nres+i) - om1 * erij(k)) + dcosom2(k) = rij * (dc_norm(k,nres+j) - om2 * erij(k)) + gg(k) = gg(k) + eom1 * dcosom1(k) + eom2 * dcosom2(k) +c! write (*,*) "gg(",k,")=", gg(k) +c! this acts on hydrophobic center of interaction + gvdwx(k,i)= gvdwx(k,i) - gg(k) + & + (eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & + eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + gvdwx(k,j)= gvdwx(k,j) + gg(k) + & + (eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & + eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv +c! this acts on Calpha + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) +c! write (*,*) "Gvdwc(",k,",",i,")=", gvdwc(k,i) +c! write (*,*) "Gvdwc(",k,",",j,")=", gvdwc(k,j) + END DO +c! write (*,*) "*************" +c! write (*,*) "" + RETURN + END SUBROUTINE sc_grad + + +C----------------------------------------------------------------------- + + + subroutine e_softsphere(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJ potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (accur=1.0d-10) + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.TORSION' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) +cd print *,'Entering Esoft_sphere nnt=',nnt,' nct=',nct + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) +cd write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint), +cd & 'iend=',iend(i,iint) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + rij=xj*xj+yj*yj+zj*zj +c write (iout,*)'i=',i,' j=',j,' itypi=',itypi,' itypj=',itypj + r0ij=r0(itypi,itypj) + r0ijsq=r0ij*r0ij +c print *,i,j,r0ij,dsqrt(rij) + if (rij.lt.r0ijsq) then + evdwij=0.25d0*(rij-r0ijsq)**2 + fac=rij-r0ijsq + else + evdwij=0.0d0 + fac=0.0d0 + endif + evdw=evdw+evdwij +C +C Calculate the components of the gradient in DC and X +C + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad gvdwc(l,k)=gvdwc(l,k)+gg(l) +cgrad enddo +cgrad enddo + enddo ! j + enddo ! iint + enddo ! i + return + end +C-------------------------------------------------------------------------- + subroutine eelec_soft_sphere(ees,evdw1,eel_loc,eello_turn3, + & eello_turn4) +C +C Soft-sphere potential of p-p interaction +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + dimension ggg(3) +cd write(iout,*) 'In EELEC_soft_sphere' + ees=0.0D0 + evdw1=0.0D0 + eel_loc=0.0d0 + eello_turn3=0.0d0 + eello_turn4=0.0d0 + ind=0 + do i=iatel_s,iatel_e + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=0 +c write (iout,*) 'i',i,' ielstart',ielstart(i),' ielend',ielend(i) + do j=ielstart(i),ielend(i) + ind=ind+1 + iteli=itel(i) + itelj=itel(j) + if (j.eq.i+2 .and. itelj.eq.2) iteli=2 + r0ij=rpp(iteli,itelj) + r0ijsq=r0ij*r0ij + dxj=dc(1,j) + dyj=dc(2,j) + dzj=dc(3,j) + xj=c(1,j)+0.5D0*dxj-xmedi + yj=c(2,j)+0.5D0*dyj-ymedi + zj=c(3,j)+0.5D0*dzj-zmedi + rij=xj*xj+yj*yj+zj*zj + if (rij.lt.r0ijsq) then + evdw1ij=0.25d0*(rij-r0ijsq)**2 + fac=rij-r0ijsq + else + evdw1ij=0.0d0 + fac=0.0d0 + endif + evdw1=evdw1+evdw1ij +C +C Calculate contributions to the Cartesian gradient. +C + ggg(1)=fac*xj + ggg(2)=fac*yj + ggg(3)=fac*zj + do k=1,3 + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo + enddo ! j + enddo ! i +cgrad do i=nnt,nct-1 +cgrad do k=1,3 +cgrad gelc(k,i)=gelc(k,i)+0.5d0*gelc(k,i) +cgrad enddo +cgrad do j=i+1,nct-1 +cgrad do k=1,3 +cgrad gelc(k,i)=gelc(k,i)+gelc(k,j) +cgrad enddo +cgrad enddo +cgrad enddo + return + end +c------------------------------------------------------------------------------ + subroutine vec_and_deriv + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.VECTORS' + include 'COMMON.SETUP' + include 'COMMON.TIME1' + dimension uyder(3,3,2),uzder(3,3,2),vbld_inv_temp(2) +C Compute the local reference systems. For reference system (i), the +C X-axis points from CA(i) to CA(i+1), the Y axis is in the +C CA(i)-CA(i+1)-CA(i+2) plane, and the Z axis is perpendicular to this plane. +#ifdef PARVEC + do i=ivec_start,ivec_end +#else + do i=1,nres-1 +#endif + if (i.eq.nres-1) then +C Case of the last full residue +C Compute the Z-axis + call vecpr(dc_norm(1,i),dc_norm(1,i-1),uz(1,i)) + costh=dcos(pi-theta(nres)) + fac=1.0d0/dsqrt(1.0d0-costh*costh) + do k=1,3 + uz(k,i)=fac*uz(k,i) + enddo +C Compute the derivatives of uz + uzder(1,1,1)= 0.0d0 + uzder(2,1,1)=-dc_norm(3,i-1) + uzder(3,1,1)= dc_norm(2,i-1) + uzder(1,2,1)= dc_norm(3,i-1) + uzder(2,2,1)= 0.0d0 + uzder(3,2,1)=-dc_norm(1,i-1) + uzder(1,3,1)=-dc_norm(2,i-1) + uzder(2,3,1)= dc_norm(1,i-1) + uzder(3,3,1)= 0.0d0 + uzder(1,1,2)= 0.0d0 + uzder(2,1,2)= dc_norm(3,i) + uzder(3,1,2)=-dc_norm(2,i) + uzder(1,2,2)=-dc_norm(3,i) + uzder(2,2,2)= 0.0d0 + uzder(3,2,2)= dc_norm(1,i) + uzder(1,3,2)= dc_norm(2,i) + uzder(2,3,2)=-dc_norm(1,i) + uzder(3,3,2)= 0.0d0 +C Compute the Y-axis + facy=fac + do k=1,3 + uy(k,i)=fac*(dc_norm(k,i-1)-costh*dc_norm(k,i)) + enddo +C Compute the derivatives of uy + do j=1,3 + do k=1,3 + uyder(k,j,1)=2*dc_norm(k,i-1)*dc_norm(j,i) + & -dc_norm(k,i)*dc_norm(j,i-1) + uyder(k,j,2)=-dc_norm(j,i)*dc_norm(k,i) + enddo + uyder(j,j,1)=uyder(j,j,1)-costh + uyder(j,j,2)=1.0d0+uyder(j,j,2) + enddo + do j=1,2 + do k=1,3 + do l=1,3 + uygrad(l,k,j,i)=uyder(l,k,j) + uzgrad(l,k,j,i)=uzder(l,k,j) + enddo + enddo + enddo + call unormderiv(uy(1,i),uyder(1,1,1),facy,uygrad(1,1,1,i)) + call unormderiv(uy(1,i),uyder(1,1,2),facy,uygrad(1,1,2,i)) + call unormderiv(uz(1,i),uzder(1,1,1),fac,uzgrad(1,1,1,i)) + call unormderiv(uz(1,i),uzder(1,1,2),fac,uzgrad(1,1,2,i)) + else +C Other residues +C Compute the Z-axis + call vecpr(dc_norm(1,i),dc_norm(1,i+1),uz(1,i)) + costh=dcos(pi-theta(i+2)) + fac=1.0d0/dsqrt(1.0d0-costh*costh) + do k=1,3 + uz(k,i)=fac*uz(k,i) + enddo +C Compute the derivatives of uz + uzder(1,1,1)= 0.0d0 + uzder(2,1,1)=-dc_norm(3,i+1) + uzder(3,1,1)= dc_norm(2,i+1) + uzder(1,2,1)= dc_norm(3,i+1) + uzder(2,2,1)= 0.0d0 + uzder(3,2,1)=-dc_norm(1,i+1) + uzder(1,3,1)=-dc_norm(2,i+1) + uzder(2,3,1)= dc_norm(1,i+1) + uzder(3,3,1)= 0.0d0 + uzder(1,1,2)= 0.0d0 + uzder(2,1,2)= dc_norm(3,i) + uzder(3,1,2)=-dc_norm(2,i) + uzder(1,2,2)=-dc_norm(3,i) + uzder(2,2,2)= 0.0d0 + uzder(3,2,2)= dc_norm(1,i) + uzder(1,3,2)= dc_norm(2,i) + uzder(2,3,2)=-dc_norm(1,i) + uzder(3,3,2)= 0.0d0 +C Compute the Y-axis + facy=fac + do k=1,3 + uy(k,i)=facy*(dc_norm(k,i+1)-costh*dc_norm(k,i)) + enddo +C Compute the derivatives of uy + do j=1,3 + do k=1,3 + uyder(k,j,1)=2*dc_norm(k,i+1)*dc_norm(j,i) + & -dc_norm(k,i)*dc_norm(j,i+1) + uyder(k,j,2)=-dc_norm(j,i)*dc_norm(k,i) + enddo + uyder(j,j,1)=uyder(j,j,1)-costh + uyder(j,j,2)=1.0d0+uyder(j,j,2) + enddo + do j=1,2 + do k=1,3 + do l=1,3 + uygrad(l,k,j,i)=uyder(l,k,j) + uzgrad(l,k,j,i)=uzder(l,k,j) + enddo + enddo + enddo + call unormderiv(uy(1,i),uyder(1,1,1),facy,uygrad(1,1,1,i)) + call unormderiv(uy(1,i),uyder(1,1,2),facy,uygrad(1,1,2,i)) + call unormderiv(uz(1,i),uzder(1,1,1),fac,uzgrad(1,1,1,i)) + call unormderiv(uz(1,i),uzder(1,1,2),fac,uzgrad(1,1,2,i)) + endif + enddo + do i=1,nres-1 + vbld_inv_temp(1)=vbld_inv(i+1) + if (i.lt.nres-1) then + vbld_inv_temp(2)=vbld_inv(i+2) + else + vbld_inv_temp(2)=vbld_inv(i) + endif + do j=1,2 + do k=1,3 + do l=1,3 + uygrad(l,k,j,i)=vbld_inv_temp(j)*uygrad(l,k,j,i) + uzgrad(l,k,j,i)=vbld_inv_temp(j)*uzgrad(l,k,j,i) + enddo + enddo + enddo + enddo +#if defined(PARVEC) && defined(MPI) + if (nfgtasks1.gt.1) then + time00=MPI_Wtime() +c print *,"Processor",fg_rank1,kolor1," ivec_start",ivec_start, +c & " ivec_displ",(ivec_displ(i),i=0,nfgtasks1-1), +c & " ivec_count",(ivec_count(i),i=0,nfgtasks1-1) + call MPI_Allgatherv(uy(1,ivec_start),ivec_count(fg_rank1), + & MPI_UYZ,uy(1,1),ivec_count(0),ivec_displ(0),MPI_UYZ, + & FG_COMM1,IERR) + call MPI_Allgatherv(uz(1,ivec_start),ivec_count(fg_rank1), + & MPI_UYZ,uz(1,1),ivec_count(0),ivec_displ(0),MPI_UYZ, + & FG_COMM1,IERR) + call MPI_Allgatherv(uygrad(1,1,1,ivec_start), + & ivec_count(fg_rank1),MPI_UYZGRAD,uygrad(1,1,1,1),ivec_count(0), + & ivec_displ(0),MPI_UYZGRAD,FG_COMM1,IERR) + call MPI_Allgatherv(uzgrad(1,1,1,ivec_start), + & ivec_count(fg_rank1),MPI_UYZGRAD,uzgrad(1,1,1,1),ivec_count(0), + & ivec_displ(0),MPI_UYZGRAD,FG_COMM1,IERR) + time_gather=time_gather+MPI_Wtime()-time00 + endif +c if (fg_rank.eq.0) then +c write (iout,*) "Arrays UY and UZ" +c do i=1,nres-1 +c write (iout,'(i5,3f10.5,5x,3f10.5)') i,(uy(k,i),k=1,3), +c & (uz(k,i),k=1,3) +c enddo +c endif +#endif + return + end +C----------------------------------------------------------------------------- + subroutine check_vecgrad + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.VECTORS' + dimension uygradt(3,3,2,maxres),uzgradt(3,3,2,maxres) + dimension uyt(3,maxres),uzt(3,maxres) + dimension uygradn(3,3,2),uzgradn(3,3,2),erij(3) + double precision delta /1.0d-7/ + call vec_and_deriv +cd do i=1,nres +crc write(iout,'(2i5,2(3f10.5,5x))') i,1,dc_norm(:,i) +crc write(iout,'(2i5,2(3f10.5,5x))') i,2,uy(:,i) +crc write(iout,'(2i5,2(3f10.5,5x)/)')i,3,uz(:,i) +cd write(iout,'(2i5,2(3f10.5,5x))') i,1, +cd & (dc_norm(if90,i),if90=1,3) +cd write(iout,'(2i5,2(3f10.5,5x))') i,2,(uy(if90,i),if90=1,3) +cd write(iout,'(2i5,2(3f10.5,5x)/)')i,3,(uz(if90,i),if90=1,3) +cd write(iout,'(a)') +cd enddo + do i=1,nres + do j=1,2 + do k=1,3 + do l=1,3 + uygradt(l,k,j,i)=uygrad(l,k,j,i) + uzgradt(l,k,j,i)=uzgrad(l,k,j,i) + enddo + enddo + enddo + enddo + call vec_and_deriv + do i=1,nres + do j=1,3 + uyt(j,i)=uy(j,i) + uzt(j,i)=uz(j,i) + enddo + enddo + do i=1,nres +cd write (iout,*) 'i=',i + do k=1,3 + erij(k)=dc_norm(k,i) + enddo + do j=1,3 + do k=1,3 + dc_norm(k,i)=erij(k) + enddo + dc_norm(j,i)=dc_norm(j,i)+delta +c fac=dsqrt(scalar(dc_norm(1,i),dc_norm(1,i))) +c do k=1,3 +c dc_norm(k,i)=dc_norm(k,i)/fac +c enddo +c write (iout,*) (dc_norm(k,i),k=1,3) +c write (iout,*) (erij(k),k=1,3) + call vec_and_deriv + do k=1,3 + uygradn(k,j,1)=(uy(k,i)-uyt(k,i))/delta + uygradn(k,j,2)=(uy(k,i-1)-uyt(k,i-1))/delta + uzgradn(k,j,1)=(uz(k,i)-uzt(k,i))/delta + uzgradn(k,j,2)=(uz(k,i-1)-uzt(k,i-1))/delta + enddo +c write (iout,'(i5,3f8.5,3x,3f8.5,5x,3f8.5,3x,3f8.5)') +c & j,(uzgradt(k,j,1,i),k=1,3),(uzgradn(k,j,1),k=1,3), +c & (uzgradt(k,j,2,i-1),k=1,3),(uzgradn(k,j,2),k=1,3) + enddo + do k=1,3 + dc_norm(k,i)=erij(k) + enddo +cd do k=1,3 +cd write (iout,'(i5,3f8.5,3x,3f8.5,5x,3f8.5,3x,3f8.5)') +cd & k,(uygradt(k,l,1,i),l=1,3),(uygradn(k,l,1),l=1,3), +cd & (uygradt(k,l,2,i-1),l=1,3),(uygradn(k,l,2),l=1,3) +cd write (iout,'(i5,3f8.5,3x,3f8.5,5x,3f8.5,3x,3f8.5)') +cd & k,(uzgradt(k,l,1,i),l=1,3),(uzgradn(k,l,1),l=1,3), +cd & (uzgradt(k,l,2,i-1),l=1,3),(uzgradn(k,l,2),l=1,3) +cd write (iout,'(a)') +cd enddo + enddo + return + end +C-------------------------------------------------------------------------- + subroutine set_matrices + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" + include "COMMON.SETUP" + integer IERR + integer status(MPI_STATUS_SIZE) +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + double precision auxvec(2),auxmat(2,2) +C +C Compute the virtual-bond-torsional-angle dependent quantities needed +C to calculate the el-loc multibody terms of various order. +C +#ifdef PARMAT + do i=ivec_start+2,ivec_end+2 +#else + do i=3,nres+1 +#endif + if (i .lt. nres+1) then + sin1=dsin(phi(i)) + cos1=dcos(phi(i)) + sintab(i-2)=sin1 + costab(i-2)=cos1 + obrot(1,i-2)=cos1 + obrot(2,i-2)=sin1 + sin2=dsin(2*phi(i)) + cos2=dcos(2*phi(i)) + sintab2(i-2)=sin2 + costab2(i-2)=cos2 + obrot2(1,i-2)=cos2 + obrot2(2,i-2)=sin2 + Ug(1,1,i-2)=-cos1 + Ug(1,2,i-2)=-sin1 + Ug(2,1,i-2)=-sin1 + Ug(2,2,i-2)= cos1 + Ug2(1,1,i-2)=-cos2 + Ug2(1,2,i-2)=-sin2 + Ug2(2,1,i-2)=-sin2 + Ug2(2,2,i-2)= cos2 + else + costab(i-2)=1.0d0 + sintab(i-2)=0.0d0 + obrot(1,i-2)=1.0d0 + obrot(2,i-2)=0.0d0 + obrot2(1,i-2)=0.0d0 + obrot2(2,i-2)=0.0d0 + Ug(1,1,i-2)=1.0d0 + Ug(1,2,i-2)=0.0d0 + Ug(2,1,i-2)=0.0d0 + Ug(2,2,i-2)=1.0d0 + Ug2(1,1,i-2)=0.0d0 + Ug2(1,2,i-2)=0.0d0 + Ug2(2,1,i-2)=0.0d0 + Ug2(2,2,i-2)=0.0d0 + endif + if (i .gt. 3 .and. i .lt. nres+1) then + obrot_der(1,i-2)=-sin1 + obrot_der(2,i-2)= cos1 + Ugder(1,1,i-2)= sin1 + Ugder(1,2,i-2)=-cos1 + Ugder(2,1,i-2)=-cos1 + Ugder(2,2,i-2)=-sin1 + dwacos2=cos2+cos2 + dwasin2=sin2+sin2 + obrot2_der(1,i-2)=-dwasin2 + obrot2_der(2,i-2)= dwacos2 + Ug2der(1,1,i-2)= dwasin2 + Ug2der(1,2,i-2)=-dwacos2 + Ug2der(2,1,i-2)=-dwacos2 + Ug2der(2,2,i-2)=-dwasin2 + else + obrot_der(1,i-2)=0.0d0 + obrot_der(2,i-2)=0.0d0 + Ugder(1,1,i-2)=0.0d0 + Ugder(1,2,i-2)=0.0d0 + Ugder(2,1,i-2)=0.0d0 + Ugder(2,2,i-2)=0.0d0 + obrot2_der(1,i-2)=0.0d0 + obrot2_der(2,i-2)=0.0d0 + Ug2der(1,1,i-2)=0.0d0 + Ug2der(1,2,i-2)=0.0d0 + Ug2der(2,1,i-2)=0.0d0 + Ug2der(2,2,i-2)=0.0d0 + endif +c if (i.gt. iatel_s+2 .and. i.lt.iatel_e+5) then + if (i.gt. nnt+2 .and. i.lt.nct+2) then + iti = itortyp(itype(i-2)) + else + iti=ntortyp+1 + endif +c if (i.gt. iatel_s+1 .and. i.lt.iatel_e+4) then + if (i.gt. nnt+1 .and. i.lt.nct+1) then + iti1 = itortyp(itype(i-1)) + else + iti1=ntortyp+1 + endif +cd write (iout,*) '*******i',i,' iti1',iti +cd write (iout,*) 'b1',b1(:,iti) +cd write (iout,*) 'b2',b2(:,iti) +cd write (iout,*) 'Ug',Ug(:,:,i-2) +c if (i .gt. iatel_s+2) then + if (i .gt. nnt+2) then + call matvec2(Ug(1,1,i-2),b2(1,iti),Ub2(1,i-2)) + call matmat2(EE(1,1,iti),Ug(1,1,i-2),EUg(1,1,i-2)) + if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) + & then + call matmat2(CC(1,1,iti),Ug(1,1,i-2),CUg(1,1,i-2)) + call matmat2(DD(1,1,iti),Ug(1,1,i-2),DUg(1,1,i-2)) + call matmat2(Dtilde(1,1,iti),Ug2(1,1,i-2),DtUg2(1,1,i-2)) + call matvec2(Ctilde(1,1,iti1),obrot(1,i-2),Ctobr(1,i-2)) + call matvec2(Dtilde(1,1,iti),obrot2(1,i-2),Dtobr2(1,i-2)) + endif + else + do k=1,2 + Ub2(k,i-2)=0.0d0 + Ctobr(k,i-2)=0.0d0 + Dtobr2(k,i-2)=0.0d0 + do l=1,2 + EUg(l,k,i-2)=0.0d0 + CUg(l,k,i-2)=0.0d0 + DUg(l,k,i-2)=0.0d0 + DtUg2(l,k,i-2)=0.0d0 + enddo + enddo + endif + call matvec2(Ugder(1,1,i-2),b2(1,iti),Ub2der(1,i-2)) + call matmat2(EE(1,1,iti),Ugder(1,1,i-2),EUgder(1,1,i-2)) + do k=1,2 + muder(k,i-2)=Ub2der(k,i-2) + enddo +c if (i.gt. iatel_s+1 .and. i.lt.iatel_e+4) then + if (i.gt. nnt+1 .and. i.lt.nct+1) then + iti1 = itortyp(itype(i-1)) + else + iti1=ntortyp+1 + endif + do k=1,2 + mu(k,i-2)=Ub2(k,i-2)+b1(k,iti1) + enddo +cd write (iout,*) 'mu ',mu(:,i-2) +cd write (iout,*) 'mu1',mu1(:,i-2) +cd write (iout,*) 'mu2',mu2(:,i-2) + if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or.wcorr6.gt.0.0d0) + & then + call matmat2(CC(1,1,iti1),Ugder(1,1,i-2),CUgder(1,1,i-2)) + call matmat2(DD(1,1,iti),Ugder(1,1,i-2),DUgder(1,1,i-2)) + call matmat2(Dtilde(1,1,iti),Ug2der(1,1,i-2),DtUg2der(1,1,i-2)) + call matvec2(Ctilde(1,1,iti1),obrot_der(1,i-2),Ctobrder(1,i-2)) + call matvec2(Dtilde(1,1,iti),obrot2_der(1,i-2),Dtobr2der(1,i-2)) +C Vectors and matrices dependent on a single virtual-bond dihedral. + call matvec2(DD(1,1,iti),b1tilde(1,iti1),auxvec(1)) + call matvec2(Ug2(1,1,i-2),auxvec(1),Ug2Db1t(1,i-2)) + call matvec2(Ug2der(1,1,i-2),auxvec(1),Ug2Db1tder(1,i-2)) + call matvec2(CC(1,1,iti1),Ub2(1,i-2),CUgb2(1,i-2)) + call matvec2(CC(1,1,iti1),Ub2der(1,i-2),CUgb2der(1,i-2)) + call matmat2(EUg(1,1,i-2),CC(1,1,iti1),EUgC(1,1,i-2)) + call matmat2(EUgder(1,1,i-2),CC(1,1,iti1),EUgCder(1,1,i-2)) + call matmat2(EUg(1,1,i-2),DD(1,1,iti1),EUgD(1,1,i-2)) + call matmat2(EUgder(1,1,i-2),DD(1,1,iti1),EUgDder(1,1,i-2)) + endif + enddo +C Matrices dependent on two consecutive virtual-bond dihedrals. +C The order of matrices is from left to right. + if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or.wcorr6.gt.0.0d0) + &then +c do i=max0(ivec_start,2),ivec_end + do i=2,nres-1 + call matmat2(DtUg2(1,1,i-1),EUg(1,1,i),DtUg2EUg(1,1,i)) + call matmat2(DtUg2der(1,1,i-1),EUg(1,1,i),DtUg2EUgder(1,1,1,i)) + call matmat2(DtUg2(1,1,i-1),EUgder(1,1,i),DtUg2EUgder(1,1,2,i)) + call transpose2(DtUg2(1,1,i-1),auxmat(1,1)) + call matmat2(auxmat(1,1),EUg(1,1,i),Ug2DtEUg(1,1,i)) + call matmat2(auxmat(1,1),EUgder(1,1,i),Ug2DtEUgder(1,1,2,i)) + call transpose2(DtUg2der(1,1,i-1),auxmat(1,1)) + call matmat2(auxmat(1,1),EUg(1,1,i),Ug2DtEUgder(1,1,1,i)) + enddo + endif +#if defined(MPI) && defined(PARMAT) +#ifdef DEBUG +c if (fg_rank.eq.0) then + write (iout,*) "Arrays UG and UGDER before GATHER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & ((ug(l,k,i),l=1,2),k=1,2), + & ((ugder(l,k,i),l=1,2),k=1,2) + enddo + write (iout,*) "Arrays UG2 and UG2DER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & ((ug2(l,k,i),l=1,2),k=1,2), + & ((ug2der(l,k,i),l=1,2),k=1,2) + enddo + write (iout,*) "Arrays OBROT OBROT2 OBROTDER and OBROT2DER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & (obrot(k,i),k=1,2),(obrot2(k,i),k=1,2), + & (obrot_der(k,i),k=1,2),(obrot2_der(k,i),k=1,2) + enddo + write (iout,*) "Arrays COSTAB SINTAB COSTAB2 and SINTAB2" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & costab(i),sintab(i),costab2(i),sintab2(i) + enddo + write (iout,*) "Array MUDER" + do i=1,nres-1 + write (iout,'(i5,2f10.5)') i,muder(1,i),muder(2,i) + enddo +c endif +#endif + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +c write(iout,*)"Processor",fg_rank,kolor," ivec_start",ivec_start, +c & " ivec_displ",(ivec_displ(i),i=0,nfgtasks-1), +c & " ivec_count",(ivec_count(i),i=0,nfgtasks-1) +#ifdef MATGATHER + call MPI_Allgatherv(Ub2(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Ub2(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Ub2der(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Ub2der(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(mu(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,mu(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(muder(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,muder(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Eug(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Eug(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Eugder(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Eugder(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(costab(ivec_start),ivec_count(fg_rank1), + & MPI_DOUBLE_PRECISION,costab(1),ivec_count(0),ivec_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) + call MPI_Allgatherv(sintab(ivec_start),ivec_count(fg_rank1), + & MPI_DOUBLE_PRECISION,sintab(1),ivec_count(0),ivec_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) + call MPI_Allgatherv(costab2(ivec_start),ivec_count(fg_rank1), + & MPI_DOUBLE_PRECISION,costab2(1),ivec_count(0),ivec_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) + call MPI_Allgatherv(sintab2(ivec_start),ivec_count(fg_rank1), + & MPI_DOUBLE_PRECISION,sintab2(1),ivec_count(0),ivec_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) + if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) + & then + call MPI_Allgatherv(Ctobr(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Ctobr(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Ctobrder(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Ctobrder(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dtobr2(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Dtobr2(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dtobr2der(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Dtobr2der(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Ug2Db1t(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Ug2Db1t(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Ug2Db1tder(1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MU,Ug2Db1tder(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(CUgb2(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,CUgb2(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(CUgb2der(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,CUgb2der(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Cug(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Cug(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Cugder(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Cugder(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dug(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Dug(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dugder(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Dugder(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dtug2(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Dtug2(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dtug2der(1,1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MAT1,Dtug2der(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(EugC(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,EugC(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(EugCder(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,EugCder(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(EugD(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,EugD(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(EugDder(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,EugDder(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(DtUg2EUg(1,1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MAT1,DtUg2EUg(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Ug2DtEUg(1,1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MAT1,Ug2DtEUg(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(DtUg2EUgder(1,1,1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MAT2,DtUg2EUgder(1,1,1,1),ivec_count(0),ivec_displ(0), + & MPI_MAT2,FG_COMM1,IERR) + call MPI_Allgatherv(Ug2DtEUgder(1,1,1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MAT2,Ug2DtEUgder(1,1,1,1),ivec_count(0),ivec_displ(0), + & MPI_MAT2,FG_COMM1,IERR) + endif +#else +c Passes matrix info through the ring + isend=fg_rank1 + irecv=fg_rank1-1 + if (irecv.lt.0) irecv=nfgtasks1-1 + iprev=irecv + inext=fg_rank1+1 + if (inext.ge.nfgtasks1) inext=0 + do i=1,nfgtasks1-1 +c write (iout,*) "isend",isend," irecv",irecv +c call flush(iout) + lensend=lentyp(isend) + lenrecv=lentyp(irecv) +c write (iout,*) "lensend",lensend," lenrecv",lenrecv +c call MPI_SENDRECV(ug(1,1,ivec_displ(isend)+1),1, +c & MPI_ROTAT1(lensend),inext,2200+isend, +c & ug(1,1,ivec_displ(irecv)+1),1,MPI_ROTAT1(lenrecv), +c & iprev,2200+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather ROTAT1" +c call flush(iout) +c call MPI_SENDRECV(obrot(1,ivec_displ(isend)+1),1, +c & MPI_ROTAT2(lensend),inext,3300+isend, +c & obrot(1,ivec_displ(irecv)+1),1,MPI_ROTAT2(lenrecv), +c & iprev,3300+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather ROTAT2" +c call flush(iout) + call MPI_SENDRECV(costab(ivec_displ(isend)+1),1, + & MPI_ROTAT_OLD(lensend),inext,4400+isend, + & costab(ivec_displ(irecv)+1),1,MPI_ROTAT_OLD(lenrecv), + & iprev,4400+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather ROTAT_OLD" +c call flush(iout) + call MPI_SENDRECV(mu(1,ivec_displ(isend)+1),1, + & MPI_PRECOMP11(lensend),inext,5500+isend, + & mu(1,ivec_displ(irecv)+1),1,MPI_PRECOMP11(lenrecv), + & iprev,5500+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather PRECOMP11" +c call flush(iout) + call MPI_SENDRECV(Eug(1,1,ivec_displ(isend)+1),1, + & MPI_PRECOMP12(lensend),inext,6600+isend, + & Eug(1,1,ivec_displ(irecv)+1),1,MPI_PRECOMP12(lenrecv), + & iprev,6600+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather PRECOMP12" +c call flush(iout) + if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) + & then + call MPI_SENDRECV(ug2db1t(1,ivec_displ(isend)+1),1, + & MPI_ROTAT2(lensend),inext,7700+isend, + & ug2db1t(1,ivec_displ(irecv)+1),1,MPI_ROTAT2(lenrecv), + & iprev,7700+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather PRECOMP21" +c call flush(iout) + call MPI_SENDRECV(EUgC(1,1,ivec_displ(isend)+1),1, + & MPI_PRECOMP22(lensend),inext,8800+isend, + & EUgC(1,1,ivec_displ(irecv)+1),1,MPI_PRECOMP22(lenrecv), + & iprev,8800+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather PRECOMP22" +c call flush(iout) + call MPI_SENDRECV(Ug2DtEUgder(1,1,1,ivec_displ(isend)+1),1, + & MPI_PRECOMP23(lensend),inext,9900+isend, + & Ug2DtEUgder(1,1,1,ivec_displ(irecv)+1),1, + & MPI_PRECOMP23(lenrecv), + & iprev,9900+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather PRECOMP23" +c call flush(iout) + endif + isend=irecv + irecv=irecv-1 + if (irecv.lt.0) irecv=nfgtasks1-1 + enddo +#endif + time_gather=time_gather+MPI_Wtime()-time00 + endif +#ifdef DEBUG +c if (fg_rank.eq.0) then + write (iout,*) "Arrays UG and UGDER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & ((ug(l,k,i),l=1,2),k=1,2), + & ((ugder(l,k,i),l=1,2),k=1,2) + enddo + write (iout,*) "Arrays UG2 and UG2DER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & ((ug2(l,k,i),l=1,2),k=1,2), + & ((ug2der(l,k,i),l=1,2),k=1,2) + enddo + write (iout,*) "Arrays OBROT OBROT2 OBROTDER and OBROT2DER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & (obrot(k,i),k=1,2),(obrot2(k,i),k=1,2), + & (obrot_der(k,i),k=1,2),(obrot2_der(k,i),k=1,2) + enddo + write (iout,*) "Arrays COSTAB SINTAB COSTAB2 and SINTAB2" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & costab(i),sintab(i),costab2(i),sintab2(i) + enddo + write (iout,*) "Array MUDER" + do i=1,nres-1 + write (iout,'(i5,2f10.5)') i,muder(1,i),muder(2,i) + enddo +c endif +#endif +#endif +cd do i=1,nres +cd iti = itortyp(itype(i)) +cd write (iout,*) i +cd do j=1,2 +cd write (iout,'(2f10.5,5x,2f10.5,5x,2f10.5)') +cd & (EE(j,k,iti),k=1,2),(Ug(j,k,i),k=1,2),(EUg(j,k,i),k=1,2) +cd enddo +cd enddo + return + end +C-------------------------------------------------------------------------- + subroutine eelec(ees,evdw1,eel_loc,eello_turn3,eello_turn4) +C +C This subroutine calculates the average interaction energy and its gradient +C in the virtual-bond vectors between non-adjacent peptide groups, based on +C the potential described in Liwo et al., Protein Sci., 1993, 2, 1715. +C The potential depends both on the distance of peptide-group centers and on +C the orientation of the CA-CA virtual bonds. +C + implicit real*8 (a-h,o-z) +#ifdef MPI + include 'mpif.h' +#endif + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.TIME1' + dimension ggg(3),gggp(3),gggm(3),erij(3),dcosb(3),dcosg(3), + & erder(3,3),uryg(3,3),urzg(3,3),vryg(3,3),vrzg(3,3) + double precision acipa(2,2),agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions +#ifdef MOMENT + double precision scal_el /1.0d0/ +#else + double precision scal_el /0.5d0/ +#endif +C 12/13/98 +C 13-go grudnia roku pamietnego... + double precision unmat(3,3) /1.0d0,0.0d0,0.0d0, + & 0.0d0,1.0d0,0.0d0, + & 0.0d0,0.0d0,1.0d0/ +cd write(iout,*) 'In EELEC' +cd do i=1,nloctyp +cd write(iout,*) 'Type',i +cd write(iout,*) 'B1',B1(:,i) +cd write(iout,*) 'B2',B2(:,i) +cd write(iout,*) 'CC',CC(:,:,i) +cd write(iout,*) 'DD',DD(:,:,i) +cd write(iout,*) 'EE',EE(:,:,i) +cd enddo +cd call check_vecgrad +cd stop + if (icheckgrad.eq.1) then + do i=1,nres-1 + fac=1.0d0/dsqrt(scalar(dc(1,i),dc(1,i))) + do k=1,3 + dc_norm(k,i)=dc(k,i)*fac + enddo +c write (iout,*) 'i',i,' fac',fac + enddo + endif + if (wel_loc.gt.0.0d0 .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 + & .or. wcorr6.gt.0.0d0 .or. wturn3.gt.0.0d0 .or. + & wturn4.gt.0.0d0 .or. wturn6.gt.0.0d0) then +c call vec_and_deriv +#ifdef TIMING + time01=MPI_Wtime() +#endif + call set_matrices +#ifdef TIMING + time_mat=time_mat+MPI_Wtime()-time01 +#endif + endif +cd do i=1,nres-1 +cd write (iout,*) 'i=',i +cd do k=1,3 +cd write (iout,'(i5,2f10.5)') k,uy(k,i),uz(k,i) +cd enddo +cd do k=1,3 +cd write (iout,'(f10.5,2x,3f10.5,2x,3f10.5)') +cd & uz(k,i),(uzgrad(k,l,1,i),l=1,3),(uzgrad(k,l,2,i),l=1,3) +cd enddo +cd enddo + t_eelecij=0.0d0 + ees=0.0D0 + evdw1=0.0D0 + eel_loc=0.0d0 + eello_turn3=0.0d0 + eello_turn4=0.0d0 + ind=0 + do i=1,nres + num_cont_hb(i)=0 + enddo +cd print '(a)','Enter EELEC' +cd write (iout,*) 'iatel_s=',iatel_s,' iatel_e=',iatel_e + do i=1,nres + gel_loc_loc(i)=0.0d0 + gcorr_loc(i)=0.0d0 + enddo +c +c +c 9/27/08 AL Split the interaction loop to ensure load balancing of turn terms +C +C Loop over i,i+2 and i,i+3 pairs of the peptide groups +C + do i=iturn3_start,iturn3_end + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=0 + call eelecij(i,i+2,ees,evdw1,eel_loc) + if (wturn3.gt.0.0d0) call eturn3(i,eello_turn3) + num_cont_hb(i)=num_conti + enddo + do i=iturn4_start,iturn4_end + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=num_cont_hb(i) + call eelecij(i,i+3,ees,evdw1,eel_loc) + if (wturn4.gt.0.0d0) call eturn4(i,eello_turn4) + num_cont_hb(i)=num_conti + enddo ! i +c +c Loop over all pairs of interacting peptide groups except i,i+2 and i,i+3 +c + do i=iatel_s,iatel_e + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi +c write (iout,*) 'i',i,' ielstart',ielstart(i),' ielend',ielend(i) + num_conti=num_cont_hb(i) + do j=ielstart(i),ielend(i) + call eelecij(i,j,ees,evdw1,eel_loc) + enddo ! j + num_cont_hb(i)=num_conti + enddo ! i +c write (iout,*) "Number of loop steps in EELEC:",ind +cd do i=1,nres +cd write (iout,'(i3,3f10.5,5x,3f10.5)') +cd & i,(gel_loc(k,i),k=1,3),gel_loc_loc(i) +cd enddo +c 12/7/99 Adam eello_turn3 will be considered as a separate energy term +ccc eel_loc=eel_loc+eello_turn3 +cd print *,"Processor",fg_rank," t_eelecij",t_eelecij + return + end +C------------------------------------------------------------------------------- + subroutine eelecij(i,j,ees,evdw1,eel_loc) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.TIME1' + dimension ggg(3),gggp(3),gggm(3),erij(3),dcosb(3),dcosg(3), + & erder(3,3),uryg(3,3),urzg(3,3),vryg(3,3),vrzg(3,3) + double precision acipa(2,2),agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions +#ifdef MOMENT + double precision scal_el /1.0d0/ +#else + double precision scal_el /0.5d0/ +#endif +C 12/13/98 +C 13-go grudnia roku pamietnego... + double precision unmat(3,3) /1.0d0,0.0d0,0.0d0, + & 0.0d0,1.0d0,0.0d0, + & 0.0d0,0.0d0,1.0d0/ +c time00=MPI_Wtime() +cd write (iout,*) "eelecij",i,j +c ind=ind+1 + iteli=itel(i) + itelj=itel(j) + if (j.eq.i+2 .and. itelj.eq.2) iteli=2 + aaa=app(iteli,itelj) + bbb=bpp(iteli,itelj) + ael6i=ael6(iteli,itelj) + ael3i=ael3(iteli,itelj) + dxj=dc(1,j) + dyj=dc(2,j) + dzj=dc(3,j) + dx_normj=dc_norm(1,j) + dy_normj=dc_norm(2,j) + dz_normj=dc_norm(3,j) + xj=c(1,j)+0.5D0*dxj-xmedi + yj=c(2,j)+0.5D0*dyj-ymedi + zj=c(3,j)+0.5D0*dzj-zmedi + rij=xj*xj+yj*yj+zj*zj + rrmij=1.0D0/rij + rij=dsqrt(rij) + rmij=1.0D0/rij + r3ij=rrmij*rmij + r6ij=r3ij*r3ij + cosa=dx_normi*dx_normj+dy_normi*dy_normj+dz_normi*dz_normj + cosb=(xj*dx_normi+yj*dy_normi+zj*dz_normi)*rmij + cosg=(xj*dx_normj+yj*dy_normj+zj*dz_normj)*rmij + fac=cosa-3.0D0*cosb*cosg + ev1=aaa*r6ij*r6ij +c 4/26/02 - AL scaling down 1,4 repulsive VDW interactions + if (j.eq.i+2) ev1=scal_el*ev1 + ev2=bbb*r6ij + fac3=ael6i*r6ij + fac4=ael3i*r3ij + evdwij=ev1+ev2 + el1=fac3*(4.0D0+fac*fac-3.0D0*(cosb*cosb+cosg*cosg)) + el2=fac4*fac + eesij=el1+el2 +C 12/26/95 - for the evaluation of multi-body H-bonding interactions + ees0ij=4.0D0+fac*fac-3.0D0*(cosb*cosb+cosg*cosg) + ees=ees+eesij + evdw1=evdw1+evdwij +cd write(iout,'(2(2i3,2x),7(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & iteli,i,itelj,j,aaa,bbb,ael6i,ael3i, +cd & 1.0D0/dsqrt(rrmij),evdwij,eesij, +cd & xmedi,ymedi,zmedi,xj,yj,zj + + if (energy_dec) then + write (iout,'(a6,2i5,0pf7.3)') 'evdw1',i,j,evdwij + write (iout,'(a6,2i5,0pf7.3)') 'ees',i,j,eesij + endif + +C +C Calculate contributions to the Cartesian gradient. +C +#ifdef SPLITELE + facvdw=-6*rrmij*(ev1+evdwij) + facel=-3*rrmij*(el1+eesij) + fac1=fac + erij(1)=xj*rmij + erij(2)=yj*rmij + erij(3)=zj*rmij +* +* Radial derivatives. First process both termini of the fragment (i,j) +* + ggg(1)=facel*xj + ggg(2)=facel*yj + ggg(3)=facel*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c gelc(k,j)=gelc(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gelc_long(k,j)=gelc_long(k,j)+ggg(k) + gelc_long(k,i)=gelc_long(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gvdwpp(k,i)=gvdwpp(k,i)+ghalf +c gvdwpp(k,j)=gvdwpp(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gvdwpp(l,k)=gvdwpp(l,k)+ggg(l) +cgrad enddo +cgrad enddo +#else + facvdw=ev1+evdwij + facel=el1+eesij + fac1=fac + fac=-3*rrmij*(facvdw+facvdw+facel) + erij(1)=xj*rmij + erij(2)=yj*rmij + erij(3)=zj*rmij +* +* Radial derivatives. First process both termini of the fragment (i,j) +* + ggg(1)=fac*xj + ggg(2)=fac*yj + ggg(3)=fac*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c gelc(k,j)=gelc(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gelc_long(k,j)=gelc(k,j)+ggg(k) + gelc_long(k,i)=gelc(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj + do k=1,3 + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + enddo +#endif +* +* Angular part +* + ecosa=2.0D0*fac3*fac1+fac4 + fac4=-3.0D0*fac4 + fac3=-6.0D0*fac3 + ecosb=(fac3*(fac1*cosg+cosb)+cosg*fac4) + ecosg=(fac3*(fac1*cosb+cosg)+cosb*fac4) + do k=1,3 + dcosb(k)=rmij*(dc_norm(k,i)-erij(k)*cosb) + dcosg(k)=rmij*(dc_norm(k,j)-erij(k)*cosg) + enddo +cd print '(2i3,2(3(1pd14.5),3x))',i,j,(dcosb(k),k=1,3), +cd & (dcosg(k),k=1,3) + do k=1,3 + ggg(k)=ecosb*dcosb(k)+ecosg*dcosg(k) + enddo +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c & +(ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i)) +c & + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) +c gelc(k,j)=gelc(k,j)+ghalf +c & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) +c & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) +c enddo +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gelc(k,i)=gelc(k,i) + & +(ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gelc(k,j)=gelc(k,j) + & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gelc_long(k,j)=gelc_long(k,j)+ggg(k) + gelc_long(k,i)=gelc_long(k,i)-ggg(k) + enddo + IF (wel_loc.gt.0.0d0 .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 + & .or. wcorr6.gt.0.0d0 .or. wturn3.gt.0.0d0 + & .or. wturn4.gt.0.0d0 .or. wturn6.gt.0.0d0) THEN +C +C 9/25/99 Mixed third-order local-electrostatic terms. The local-interaction +C energy of a peptide unit is assumed in the form of a second-order +C Fourier series in the angles lambda1 and lambda2 (see Nishikawa et al. +C Macromolecules, 1974, 7, 797-806 for definition). This correlation terms +C are computed for EVERY pair of non-contiguous peptide groups. +C + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + kkk=0 + do k=1,2 + do l=1,2 + kkk=kkk+1 + muij(kkk)=mu(k,i)*mu(l,j) + enddo + enddo +cd write (iout,*) 'EELEC: i',i,' j',j +cd write (iout,*) 'j',j,' j1',j1,' j2',j2 +cd write(iout,*) 'muij',muij + ury=scalar(uy(1,i),erij) + urz=scalar(uz(1,i),erij) + vry=scalar(uy(1,j),erij) + vrz=scalar(uz(1,j),erij) + a22=scalar(uy(1,i),uy(1,j))-3*ury*vry + a23=scalar(uy(1,i),uz(1,j))-3*ury*vrz + a32=scalar(uz(1,i),uy(1,j))-3*urz*vry + a33=scalar(uz(1,i),uz(1,j))-3*urz*vrz + fac=dsqrt(-ael6i)*r3ij + a22=a22*fac + a23=a23*fac + a32=a32*fac + a33=a33*fac +cd write (iout,'(4i5,4f10.5)') +cd & i,itortyp(itype(i)),j,itortyp(itype(j)),a22,a23,a32,a33 +cd write (iout,'(6f10.5)') (muij(k),k=1,4),fac,eel_loc_ij +cd write (iout,'(2(3f10.5,5x)/2(3f10.5,5x))') uy(:,i),uz(:,i), +cd & uy(:,j),uz(:,j) +cd write (iout,'(4f10.5)') +cd & scalar(uy(1,i),uy(1,j)),scalar(uy(1,i),uz(1,j)), +cd & scalar(uz(1,i),uy(1,j)),scalar(uz(1,i),uz(1,j)) +cd write (iout,'(4f10.5)') ury,urz,vry,vrz +cd write (iout,'(9f10.5/)') +cd & fac22,a22,fac23,a23,fac32,a32,fac33,a33,eel_loc_ij +C Derivatives of the elements of A in virtual-bond vectors + call unormderiv(erij(1),unmat(1,1),rmij,erder(1,1)) + do k=1,3 + uryg(k,1)=scalar(erder(1,k),uy(1,i)) + uryg(k,2)=scalar(uygrad(1,k,1,i),erij(1)) + uryg(k,3)=scalar(uygrad(1,k,2,i),erij(1)) + urzg(k,1)=scalar(erder(1,k),uz(1,i)) + urzg(k,2)=scalar(uzgrad(1,k,1,i),erij(1)) + urzg(k,3)=scalar(uzgrad(1,k,2,i),erij(1)) + vryg(k,1)=scalar(erder(1,k),uy(1,j)) + vryg(k,2)=scalar(uygrad(1,k,1,j),erij(1)) + vryg(k,3)=scalar(uygrad(1,k,2,j),erij(1)) + vrzg(k,1)=scalar(erder(1,k),uz(1,j)) + vrzg(k,2)=scalar(uzgrad(1,k,1,j),erij(1)) + vrzg(k,3)=scalar(uzgrad(1,k,2,j),erij(1)) + enddo +C Compute radial contributions to the gradient + facr=-3.0d0*rrmij + a22der=a22*facr + a23der=a23*facr + a32der=a32*facr + a33der=a33*facr + agg(1,1)=a22der*xj + agg(2,1)=a22der*yj + agg(3,1)=a22der*zj + agg(1,2)=a23der*xj + agg(2,2)=a23der*yj + agg(3,2)=a23der*zj + agg(1,3)=a32der*xj + agg(2,3)=a32der*yj + agg(3,3)=a32der*zj + agg(1,4)=a33der*xj + agg(2,4)=a33der*yj + agg(3,4)=a33der*zj +C Add the contributions coming from er + fac3=-3.0d0*fac + do k=1,3 + agg(k,1)=agg(k,1)+fac3*(uryg(k,1)*vry+vryg(k,1)*ury) + agg(k,2)=agg(k,2)+fac3*(uryg(k,1)*vrz+vrzg(k,1)*ury) + agg(k,3)=agg(k,3)+fac3*(urzg(k,1)*vry+vryg(k,1)*urz) + agg(k,4)=agg(k,4)+fac3*(urzg(k,1)*vrz+vrzg(k,1)*urz) + enddo + do k=1,3 +C Derivatives in DC(i) +cgrad ghalf1=0.5d0*agg(k,1) +cgrad ghalf2=0.5d0*agg(k,2) +cgrad ghalf3=0.5d0*agg(k,3) +cgrad ghalf4=0.5d0*agg(k,4) + aggi(k,1)=fac*(scalar(uygrad(1,k,1,i),uy(1,j)) + & -3.0d0*uryg(k,2)*vry)!+ghalf1 + aggi(k,2)=fac*(scalar(uygrad(1,k,1,i),uz(1,j)) + & -3.0d0*uryg(k,2)*vrz)!+ghalf2 + aggi(k,3)=fac*(scalar(uzgrad(1,k,1,i),uy(1,j)) + & -3.0d0*urzg(k,2)*vry)!+ghalf3 + aggi(k,4)=fac*(scalar(uzgrad(1,k,1,i),uz(1,j)) + & -3.0d0*urzg(k,2)*vrz)!+ghalf4 +C Derivatives in DC(i+1) + aggi1(k,1)=fac*(scalar(uygrad(1,k,2,i),uy(1,j)) + & -3.0d0*uryg(k,3)*vry)!+agg(k,1) + aggi1(k,2)=fac*(scalar(uygrad(1,k,2,i),uz(1,j)) + & -3.0d0*uryg(k,3)*vrz)!+agg(k,2) + aggi1(k,3)=fac*(scalar(uzgrad(1,k,2,i),uy(1,j)) + & -3.0d0*urzg(k,3)*vry)!+agg(k,3) + aggi1(k,4)=fac*(scalar(uzgrad(1,k,2,i),uz(1,j)) + & -3.0d0*urzg(k,3)*vrz)!+agg(k,4) +C Derivatives in DC(j) + aggj(k,1)=fac*(scalar(uygrad(1,k,1,j),uy(1,i)) + & -3.0d0*vryg(k,2)*ury)!+ghalf1 + aggj(k,2)=fac*(scalar(uzgrad(1,k,1,j),uy(1,i)) + & -3.0d0*vrzg(k,2)*ury)!+ghalf2 + aggj(k,3)=fac*(scalar(uygrad(1,k,1,j),uz(1,i)) + & -3.0d0*vryg(k,2)*urz)!+ghalf3 + aggj(k,4)=fac*(scalar(uzgrad(1,k,1,j),uz(1,i)) + & -3.0d0*vrzg(k,2)*urz)!+ghalf4 +C Derivatives in DC(j+1) or DC(nres-1) + aggj1(k,1)=fac*(scalar(uygrad(1,k,2,j),uy(1,i)) + & -3.0d0*vryg(k,3)*ury) + aggj1(k,2)=fac*(scalar(uzgrad(1,k,2,j),uy(1,i)) + & -3.0d0*vrzg(k,3)*ury) + aggj1(k,3)=fac*(scalar(uygrad(1,k,2,j),uz(1,i)) + & -3.0d0*vryg(k,3)*urz) + aggj1(k,4)=fac*(scalar(uzgrad(1,k,2,j),uz(1,i)) + & -3.0d0*vrzg(k,3)*urz) +cgrad if (j.eq.nres-1 .and. i.lt.j-2) then +cgrad do l=1,4 +cgrad aggj1(k,l)=aggj1(k,l)+agg(k,l) +cgrad enddo +cgrad endif + enddo + acipa(1,1)=a22 + acipa(1,2)=a23 + acipa(2,1)=a32 + acipa(2,2)=a33 + a22=-a22 + a23=-a23 + do l=1,2 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + if (j.lt.nres-1) then + a22=-a22 + a32=-a32 + do l=1,3,2 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + else + a22=-a22 + a23=-a23 + a32=-a32 + a33=-a33 + do l=1,4 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + endif + ENDIF ! WCORR + IF (wel_loc.gt.0.0d0) THEN +C Contribution to the local-electrostatic energy coming from the i-j pair + eel_loc_ij=a22*muij(1)+a23*muij(2)+a32*muij(3) + & +a33*muij(4) +cd write (iout,*) 'i',i,' j',j,' eel_loc_ij',eel_loc_ij + + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'eelloc',i,j,eel_loc_ij + + eel_loc=eel_loc+eel_loc_ij +C Partial derivatives in virtual-bond dihedral angles gamma + if (i.gt.1) + & gel_loc_loc(i-1)=gel_loc_loc(i-1)+ + & a22*muder(1,i)*mu(1,j)+a23*muder(1,i)*mu(2,j) + & +a32*muder(2,i)*mu(1,j)+a33*muder(2,i)*mu(2,j) + gel_loc_loc(j-1)=gel_loc_loc(j-1)+ + & a22*mu(1,i)*muder(1,j)+a23*mu(1,i)*muder(2,j) + & +a32*mu(2,i)*muder(1,j)+a33*mu(2,i)*muder(2,j) +C Derivatives of eello in DC(i+1) thru DC(j-1) or DC(nres-2) + do l=1,3 + ggg(l)=agg(l,1)*muij(1)+ + & agg(l,2)*muij(2)+agg(l,3)*muij(3)+agg(l,4)*muij(4) + gel_loc_long(l,j)=gel_loc_long(l,j)+ggg(l) + gel_loc_long(l,i)=gel_loc_long(l,i)-ggg(l) +cgrad ghalf=0.5d0*ggg(l) +cgrad gel_loc(l,i)=gel_loc(l,i)+ghalf +cgrad gel_loc(l,j)=gel_loc(l,j)+ghalf + enddo +cgrad do k=i+1,j2 +cgrad do l=1,3 +cgrad gel_loc(l,k)=gel_loc(l,k)+ggg(l) +cgrad enddo +cgrad enddo +C Remaining derivatives of eello + do l=1,3 + gel_loc(l,i)=gel_loc(l,i)+aggi(l,1)*muij(1)+ + & aggi(l,2)*muij(2)+aggi(l,3)*muij(3)+aggi(l,4)*muij(4) + gel_loc(l,i+1)=gel_loc(l,i+1)+aggi1(l,1)*muij(1)+ + & aggi1(l,2)*muij(2)+aggi1(l,3)*muij(3)+aggi1(l,4)*muij(4) + gel_loc(l,j)=gel_loc(l,j)+aggj(l,1)*muij(1)+ + & aggj(l,2)*muij(2)+aggj(l,3)*muij(3)+aggj(l,4)*muij(4) + gel_loc(l,j1)=gel_loc(l,j1)+aggj1(l,1)*muij(1)+ + & aggj1(l,2)*muij(2)+aggj1(l,3)*muij(3)+aggj1(l,4)*muij(4) + enddo + ENDIF +C Change 12/26/95 to calculate four-body contributions to H-bonding energy +c if (j.gt.i+1 .and. num_conti.le.maxconts) then + if (wcorr+wcorr4+wcorr5+wcorr6.gt.0.0d0 + & .and. num_conti.le.maxconts) then +c write (iout,*) i,j," entered corr" +C +C Calculate the contact function. The ith column of the array JCONT will +C contain the numbers of atoms that make contacts with the atom I (of numbers +C greater than I). The arrays FACONT and GACONT will contain the values of +C the contact function and its derivative. +c r0ij=1.02D0*rpp(iteli,itelj) +c r0ij=1.11D0*rpp(iteli,itelj) + r0ij=2.20D0*rpp(iteli,itelj) +c r0ij=1.55D0*rpp(iteli,itelj) + call gcont(rij,r0ij,1.0D0,0.2d0*r0ij,fcont,fprimcont) + if (fcont.gt.0.0D0) then + num_conti=num_conti+1 + if (num_conti.gt.maxconts) then + write (iout,*) 'WARNING - max. # of contacts exceeded;', + & ' will skip next contacts for this conf.' + else + jcont_hb(num_conti,i)=j +cd write (iout,*) "i",i," j",j," num_conti",num_conti, +cd & " jcont_hb",jcont_hb(num_conti,i) + IF (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. + & wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0) THEN +C 9/30/99 (AL) - store components necessary to evaluate higher-order loc-el +C terms. + d_cont(num_conti,i)=rij +cd write (2,'(3e15.5)') rij,r0ij+0.2d0*r0ij,rij +C --- Electrostatic-interaction matrix --- + a_chuj(1,1,num_conti,i)=a22 + a_chuj(1,2,num_conti,i)=a23 + a_chuj(2,1,num_conti,i)=a32 + a_chuj(2,2,num_conti,i)=a33 +C --- Gradient of rij + do kkk=1,3 + grij_hb_cont(kkk,num_conti,i)=erij(kkk) + enddo + kkll=0 + do k=1,2 + do l=1,2 + kkll=kkll+1 + do m=1,3 + a_chuj_der(k,l,m,1,num_conti,i)=agg(m,kkll) + a_chuj_der(k,l,m,2,num_conti,i)=aggi(m,kkll) + a_chuj_der(k,l,m,3,num_conti,i)=aggi1(m,kkll) + a_chuj_der(k,l,m,4,num_conti,i)=aggj(m,kkll) + a_chuj_der(k,l,m,5,num_conti,i)=aggj1(m,kkll) + enddo + enddo + enddo + ENDIF + IF (wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) THEN +C Calculate contact energies + cosa4=4.0D0*cosa + wij=cosa-3.0D0*cosb*cosg + cosbg1=cosb+cosg + cosbg2=cosb-cosg +c fac3=dsqrt(-ael6i)/r0ij**3 + fac3=dsqrt(-ael6i)*r3ij +c ees0pij=dsqrt(4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1) + ees0tmp=4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1 + if (ees0tmp.gt.0) then + ees0pij=dsqrt(ees0tmp) + else + ees0pij=0 + endif +c ees0mij=dsqrt(4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2) + ees0tmp=4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2 + if (ees0tmp.gt.0) then + ees0mij=dsqrt(ees0tmp) + else + ees0mij=0 + endif +c ees0mij=0.0D0 + ees0p(num_conti,i)=0.5D0*fac3*(ees0pij+ees0mij) + ees0m(num_conti,i)=0.5D0*fac3*(ees0pij-ees0mij) +C Diagnostics. Comment out or remove after debugging! +c ees0p(num_conti,i)=0.5D0*fac3*ees0pij +c ees0m(num_conti,i)=0.5D0*fac3*ees0mij +c ees0m(num_conti,i)=0.0D0 +C End diagnostics. +c write (iout,*) 'i=',i,' j=',j,' rij=',rij,' r0ij=',r0ij, +c & ' ees0ij=',ees0p(num_conti,i),ees0m(num_conti,i),' fcont=',fcont +C Angular derivatives of the contact function + ees0pij1=fac3/ees0pij + ees0mij1=fac3/ees0mij + fac3p=-3.0D0*fac3*rrmij + ees0pijp=0.5D0*fac3p*(ees0pij+ees0mij) + ees0mijp=0.5D0*fac3p*(ees0pij-ees0mij) +c ees0mij1=0.0D0 + ecosa1= ees0pij1*( 1.0D0+0.5D0*wij) + ecosb1=-1.5D0*ees0pij1*(wij*cosg+cosbg1) + ecosg1=-1.5D0*ees0pij1*(wij*cosb+cosbg1) + ecosa2= ees0mij1*(-1.0D0+0.5D0*wij) + ecosb2=-1.5D0*ees0mij1*(wij*cosg+cosbg2) + ecosg2=-1.5D0*ees0mij1*(wij*cosb-cosbg2) + ecosap=ecosa1+ecosa2 + ecosbp=ecosb1+ecosb2 + ecosgp=ecosg1+ecosg2 + ecosam=ecosa1-ecosa2 + ecosbm=ecosb1-ecosb2 + ecosgm=ecosg1-ecosg2 +C Diagnostics +c ecosap=ecosa1 +c ecosbp=ecosb1 +c ecosgp=ecosg1 +c ecosam=0.0D0 +c ecosbm=0.0D0 +c ecosgm=0.0D0 +C End diagnostics + facont_hb(num_conti,i)=fcont + fprimcont=fprimcont/rij +cd facont_hb(num_conti,i)=1.0D0 +C Following line is for diagnostics. +cd fprimcont=0.0D0 + do k=1,3 + dcosb(k)=rmij*(dc_norm(k,i)-erij(k)*cosb) + dcosg(k)=rmij*(dc_norm(k,j)-erij(k)*cosg) + enddo + do k=1,3 + gggp(k)=ecosbp*dcosb(k)+ecosgp*dcosg(k) + gggm(k)=ecosbm*dcosb(k)+ecosgm*dcosg(k) + enddo + gggp(1)=gggp(1)+ees0pijp*xj + gggp(2)=gggp(2)+ees0pijp*yj + gggp(3)=gggp(3)+ees0pijp*zj + gggm(1)=gggm(1)+ees0mijp*xj + gggm(2)=gggm(2)+ees0mijp*yj + gggm(3)=gggm(3)+ees0mijp*zj +C Derivatives due to the contact function + gacont_hbr(1,num_conti,i)=fprimcont*xj + gacont_hbr(2,num_conti,i)=fprimcont*yj + gacont_hbr(3,num_conti,i)=fprimcont*zj + do k=1,3 +c +c 10/24/08 cgrad and ! comments indicate the parts of the code removed +c following the change of gradient-summation algorithm. +c +cgrad ghalfp=0.5D0*gggp(k) +cgrad ghalfm=0.5D0*gggm(k) + gacontp_hb1(k,num_conti,i)=!ghalfp + & +(ecosap*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosbp*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gacontp_hb2(k,num_conti,i)=!ghalfp + & +(ecosap*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosgp*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gacontp_hb3(k,num_conti,i)=gggp(k) + gacontm_hb1(k,num_conti,i)=!ghalfm + & +(ecosam*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosbm*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gacontm_hb2(k,num_conti,i)=!ghalfm + & +(ecosam*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosgm*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gacontm_hb3(k,num_conti,i)=gggm(k) + enddo +C Diagnostics. Comment out or remove after debugging! +cdiag do k=1,3 +cdiag gacontp_hb1(k,num_conti,i)=0.0D0 +cdiag gacontp_hb2(k,num_conti,i)=0.0D0 +cdiag gacontp_hb3(k,num_conti,i)=0.0D0 +cdiag gacontm_hb1(k,num_conti,i)=0.0D0 +cdiag gacontm_hb2(k,num_conti,i)=0.0D0 +cdiag gacontm_hb3(k,num_conti,i)=0.0D0 +cdiag enddo + ENDIF ! wcorr + endif ! num_conti.le.maxconts + endif ! fcont.gt.0 + endif ! j.gt.i+1 + if (wturn3.gt.0.0d0 .or. wturn4.gt.0.0d0) then + do k=1,4 + do l=1,3 + ghalf=0.5d0*agg(l,k) + aggi(l,k)=aggi(l,k)+ghalf + aggi1(l,k)=aggi1(l,k)+agg(l,k) + aggj(l,k)=aggj(l,k)+ghalf + enddo + enddo + if (j.eq.nres-1 .and. i.lt.j-2) then + do k=1,4 + do l=1,3 + aggj1(l,k)=aggj1(l,k)+agg(l,k) + enddo + enddo + endif + endif +c t_eelecij=t_eelecij+MPI_Wtime()-time00 + return + end +C----------------------------------------------------------------------------- + subroutine eturn3(i,eello_turn3) +C Third- and fourth-order contributions from turns + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + dimension ggg(3) + double precision auxmat(2,2),auxmat1(2,2),auxmat2(2,2),pizda(2,2), + & e1t(2,2),e2t(2,2),e3t(2,2),e1tder(2,2),e2tder(2,2),e3tder(2,2), + & e1a(2,2),ae3(2,2),ae3e2(2,2),auxvec(2),auxvec1(2) + double precision agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),auxmat3(2,2) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 + j=i+2 +c write (iout,*) "eturn3",i,j,j1,j2 + a_temp(1,1)=a22 + a_temp(1,2)=a23 + a_temp(2,1)=a32 + a_temp(2,2)=a33 +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C Third-order contributions +C +C (i+2)o----(i+3) +C | | +C | | +C (i+1)o----i +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd call checkint_turn3(i,a_temp,eello_turn3_num) + call matmat2(EUg(1,1,i+1),EUg(1,1,i+2),auxmat(1,1)) + call transpose2(auxmat(1,1),auxmat1(1,1)) + call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1)) + eello_turn3=eello_turn3+0.5d0*(pizda(1,1)+pizda(2,2)) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'eturn3',i,j,0.5d0*(pizda(1,1)+pizda(2,2)) +cd write (2,*) 'i,',i,' j',j,'eello_turn3', +cd & 0.5d0*(pizda(1,1)+pizda(2,2)), +cd & ' eello_turn3_num',4*eello_turn3_num +C Derivatives in gamma(i) + call matmat2(EUgder(1,1,i+1),EUg(1,1,i+2),auxmat2(1,1)) + call transpose2(auxmat2(1,1),auxmat3(1,1)) + call matmat2(a_temp(1,1),auxmat3(1,1),pizda(1,1)) + gel_loc_turn3(i)=gel_loc_turn3(i)+0.5d0*(pizda(1,1)+pizda(2,2)) +C Derivatives in gamma(i+1) + call matmat2(EUg(1,1,i+1),EUgder(1,1,i+2),auxmat2(1,1)) + call transpose2(auxmat2(1,1),auxmat3(1,1)) + call matmat2(a_temp(1,1),auxmat3(1,1),pizda(1,1)) + gel_loc_turn3(i+1)=gel_loc_turn3(i+1) + & +0.5d0*(pizda(1,1)+pizda(2,2)) +C Cartesian derivatives + do l=1,3 +c ghalf1=0.5d0*agg(l,1) +c ghalf2=0.5d0*agg(l,2) +c ghalf3=0.5d0*agg(l,3) +c ghalf4=0.5d0*agg(l,4) + a_temp(1,1)=aggi(l,1)!+ghalf1 + a_temp(1,2)=aggi(l,2)!+ghalf2 + a_temp(2,1)=aggi(l,3)!+ghalf3 + a_temp(2,2)=aggi(l,4)!+ghalf4 + call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1)) + gcorr3_turn(l,i)=gcorr3_turn(l,i) + & +0.5d0*(pizda(1,1)+pizda(2,2)) + a_temp(1,1)=aggi1(l,1)!+agg(l,1) + a_temp(1,2)=aggi1(l,2)!+agg(l,2) + a_temp(2,1)=aggi1(l,3)!+agg(l,3) + a_temp(2,2)=aggi1(l,4)!+agg(l,4) + call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1)) + gcorr3_turn(l,i+1)=gcorr3_turn(l,i+1) + & +0.5d0*(pizda(1,1)+pizda(2,2)) + a_temp(1,1)=aggj(l,1)!+ghalf1 + a_temp(1,2)=aggj(l,2)!+ghalf2 + a_temp(2,1)=aggj(l,3)!+ghalf3 + a_temp(2,2)=aggj(l,4)!+ghalf4 + call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1)) + gcorr3_turn(l,j)=gcorr3_turn(l,j) + & +0.5d0*(pizda(1,1)+pizda(2,2)) + a_temp(1,1)=aggj1(l,1) + a_temp(1,2)=aggj1(l,2) + a_temp(2,1)=aggj1(l,3) + a_temp(2,2)=aggj1(l,4) + call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1)) + gcorr3_turn(l,j1)=gcorr3_turn(l,j1) + & +0.5d0*(pizda(1,1)+pizda(2,2)) + enddo + return + end +C------------------------------------------------------------------------------- + subroutine eturn4(i,eello_turn4) +C Third- and fourth-order contributions from turns + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + dimension ggg(3) + double precision auxmat(2,2),auxmat1(2,2),auxmat2(2,2),pizda(2,2), + & e1t(2,2),e2t(2,2),e3t(2,2),e1tder(2,2),e2tder(2,2),e3tder(2,2), + & e1a(2,2),ae3(2,2),ae3e2(2,2),auxvec(2),auxvec1(2) + double precision agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),auxmat3(2,2) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 + j=i+3 +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C Fourth-order contributions +C +C (i+3)o----(i+4) +C / | +C (i+2)o | +C \ | +C (i+1)o----i +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd call checkint_turn4(i,a_temp,eello_turn4_num) +c write (iout,*) "eturn4 i",i," j",j," j1",j1," j2",j2 + a_temp(1,1)=a22 + a_temp(1,2)=a23 + a_temp(2,1)=a32 + a_temp(2,2)=a33 + iti1=itortyp(itype(i+1)) + iti2=itortyp(itype(i+2)) + iti3=itortyp(itype(i+3)) +c write(iout,*) "iti1",iti1," iti2",iti2," iti3",iti3 + call transpose2(EUg(1,1,i+1),e1t(1,1)) + call transpose2(Eug(1,1,i+2),e2t(1,1)) + call transpose2(Eug(1,1,i+3),e3t(1,1)) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + eello_turn4=eello_turn4-(s1+s2+s3) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'eturn4',i,j,-(s1+s2+s3) +cd write (2,*) 'i,',i,' j',j,'eello_turn4',-(s1+s2+s3), +cd & ' eello_turn4_num',8*eello_turn4_num +C Derivatives in gamma(i) + call transpose2(EUgder(1,1,i+1),e1tder(1,1)) + call matmat2(e1tder(1,1),a_temp(1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(ae3e2(1,1),e1tder(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gel_loc_turn4(i)=gel_loc_turn4(i)-(s1+s3) +C Derivatives in gamma(i+1) + call transpose2(EUgder(1,1,i+2),e2tder(1,1)) + call matvec2(ae3(1,1),Ub2der(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2tder(1,1),auxmat(1,1)) + call matmat2(auxmat(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gel_loc_turn4(i+1)=gel_loc_turn4(i+1)-(s2+s3) +C Derivatives in gamma(i+2) + call transpose2(EUgder(1,1,i+3),e3tder(1,1)) + call matvec2(e1a(1,1),Ub2der(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3tder(1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(auxmat(1,1),e2t(1,1),auxmat3(1,1)) + call matmat2(auxmat3(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gel_loc_turn4(i+2)=gel_loc_turn4(i+2)-(s1+s2+s3) +C Cartesian derivatives +C Derivatives of this turn contributions in DC(i+2) + if (j.lt.nres-1) then + do l=1,3 + a_temp(1,1)=agg(l,1) + a_temp(1,2)=agg(l,2) + a_temp(2,1)=agg(l,3) + a_temp(2,2)=agg(l,4) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + ggg(l)=-(s1+s2+s3) + gcorr4_turn(l,i+2)=gcorr4_turn(l,i+2)-(s1+s2+s3) + enddo + endif +C Remaining derivatives of this turn contribution + do l=1,3 + a_temp(1,1)=aggi(l,1) + a_temp(1,2)=aggi(l,2) + a_temp(2,1)=aggi(l,3) + a_temp(2,2)=aggi(l,4) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gcorr4_turn(l,i)=gcorr4_turn(l,i)-(s1+s2+s3) + a_temp(1,1)=aggi1(l,1) + a_temp(1,2)=aggi1(l,2) + a_temp(2,1)=aggi1(l,3) + a_temp(2,2)=aggi1(l,4) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gcorr4_turn(l,i+1)=gcorr4_turn(l,i+1)-(s1+s2+s3) + a_temp(1,1)=aggj(l,1) + a_temp(1,2)=aggj(l,2) + a_temp(2,1)=aggj(l,3) + a_temp(2,2)=aggj(l,4) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gcorr4_turn(l,j)=gcorr4_turn(l,j)-(s1+s2+s3) + a_temp(1,1)=aggj1(l,1) + a_temp(1,2)=aggj1(l,2) + a_temp(2,1)=aggj1(l,3) + a_temp(2,2)=aggj1(l,4) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) +c write (iout,*) "s1",s1," s2",s2," s3",s3," s1+s2+s3",s1+s2+s3 + gcorr4_turn(l,j1)=gcorr4_turn(l,j1)-(s1+s2+s3) + enddo + return + end +C----------------------------------------------------------------------------- + subroutine vecpr(u,v,w) + implicit real*8(a-h,o-z) + dimension u(3),v(3),w(3) + w(1)=u(2)*v(3)-u(3)*v(2) + w(2)=-u(1)*v(3)+u(3)*v(1) + w(3)=u(1)*v(2)-u(2)*v(1) + return + end +C----------------------------------------------------------------------------- + subroutine unormderiv(u,ugrad,unorm,ungrad) +C This subroutine computes the derivatives of a normalized vector u, given +C the derivatives computed without normalization conditions, ugrad. Returns +C ungrad. + implicit none + double precision u(3),ugrad(3,3),unorm,ungrad(3,3) + double precision vec(3) + double precision scalar + integer i,j +c write (2,*) 'ugrad',ugrad +c write (2,*) 'u',u + do i=1,3 + vec(i)=scalar(ugrad(1,i),u(1)) + enddo +c write (2,*) 'vec',vec + do i=1,3 + do j=1,3 + ungrad(j,i)=(ugrad(j,i)-u(j)*vec(i))*unorm + enddo + enddo +c write (2,*) 'ungrad',ungrad + return + end +C----------------------------------------------------------------------------- + subroutine escp_soft_sphere(evdw2,evdw2_14) +C +C This subroutine calculates the excluded-volume interaction energy between +C peptide-group centers and side chains and its gradient in virtual-bond and +C side-chain vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 + r0_scp=4.5d0 +cd print '(a)','Enter ESCP' +cd write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e + do i=iatscp_s,iatscp_e + iteli=itel(i) + xi=0.5D0*(c(1,i)+c(1,i+1)) + yi=0.5D0*(c(2,i)+c(2,i+1)) + zi=0.5D0*(c(3,i)+c(3,i+1)) + + do iint=1,nscp_gr(i) + + do j=iscpstart(i,iint),iscpend(i,iint) + itypj=itype(j) +C Uncomment following three lines for SC-p interactions +c xj=c(1,nres+j)-xi +c yj=c(2,nres+j)-yi +c zj=c(3,nres+j)-zi +C Uncomment following three lines for Ca-p interactions + xj=c(1,j)-xi + yj=c(2,j)-yi + zj=c(3,j)-zi + rij=xj*xj+yj*yj+zj*zj + r0ij=r0_scp + r0ijsq=r0ij*r0ij + if (rij.lt.r0ijsq) then + evdwij=0.25d0*(rij-r0ijsq)**2 + fac=rij-r0ijsq + else + evdwij=0.0d0 + fac=0.0d0 + endif + evdw2=evdw2+evdwij +C +C Calculate contributions to the gradient in the virtual-bond and SC vectors. +C + ggg(1)=xj*fac + ggg(2)=yj*fac + ggg(3)=zj*fac +cgrad if (j.lt.i) then +cd write (iout,*) 'ji' +cgrad do k=1,3 +cgrad ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) +cgrad enddo +cgrad endif +cgrad do k=1,3 +cgrad gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) +cgrad enddo +cgrad kstart=min0(i+1,j) +cgrad kend=max0(i-1,j-1) +cd write (iout,*) 'i=',i,' j=',j,' kstart=',kstart,' kend=',kend +cd write (iout,*) ggg(1),ggg(2),ggg(3) +cgrad do k=kstart,kend +cgrad do l=1,3 +cgrad gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + enddo + + enddo ! iint + enddo ! i + return + end +C----------------------------------------------------------------------------- + subroutine escp(evdw2,evdw2_14) +C +C This subroutine calculates the excluded-volume interaction energy between +C peptide-group centers and side chains and its gradient in virtual-bond and +C side-chain vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 +cd print '(a)','Enter ESCP' +cd write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e + do i=iatscp_s,iatscp_e + iteli=itel(i) + xi=0.5D0*(c(1,i)+c(1,i+1)) + yi=0.5D0*(c(2,i)+c(2,i+1)) + zi=0.5D0*(c(3,i)+c(3,i+1)) + + do iint=1,nscp_gr(i) + + do j=iscpstart(i,iint),iscpend(i,iint) + itypj=itype(j) +C Uncomment following three lines for SC-p interactions +c xj=c(1,nres+j)-xi +c yj=c(2,nres+j)-yi +c zj=c(3,nres+j)-zi +C Uncomment following three lines for Ca-p interactions + xj=c(1,j)-xi + yj=c(2,j)-yi + zj=c(3,j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + fac=rrij**expon2 + e1=fac*fac*aad(itypj,iteli) + e2=fac*bad(itypj,iteli) + if (iabs(j-i) .le. 2) then + e1=scal14*e1 + e2=scal14*e2 + evdw2_14=evdw2_14+e1+e2 + endif + evdwij=e1+e2 + evdw2=evdw2+evdwij + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw2',i,j,evdwij +C +C Calculate contributions to the gradient in the virtual-bond and SC vectors. +C + fac=-(evdwij+e1)*rrij + ggg(1)=xj*fac + ggg(2)=yj*fac + ggg(3)=zj*fac +cgrad if (j.lt.i) then +cd write (iout,*) 'ji' +cgrad do k=1,3 +cgrad ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +ccgrad gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) +cgrad enddo +cgrad endif +cgrad do k=1,3 +cgrad gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) +cgrad enddo +cgrad kstart=min0(i+1,j) +cgrad kend=max0(i-1,j-1) +cd write (iout,*) 'i=',i,' j=',j,' kstart=',kstart,' kend=',kend +cd write (iout,*) ggg(1),ggg(2),ggg(3) +cgrad do k=kstart,kend +cgrad do l=1,3 +cgrad gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + enddo + + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(j,i) + gvdwc_scpp(j,i)=expon*gvdwc_scpp(j,i) + gradx_scp(j,i)=expon*gradx_scp(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time the factor EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end +C-------------------------------------------------------------------------- + subroutine edis(ehpb) +C +C Evaluate bridge-strain energy and its gradient in virtual-bond and SC vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + dimension ggg(3) + ehpb=0.0D0 +cd write(iout,*)'edis: nhpb=',nhpb,' fbr=',fbr +cd write(iout,*)'link_start=',link_start,' link_end=',link_end + if (link_end.eq.0) return + do i=link_start,link_end +C If ihpb(i) and jhpb(i) > NRES, this is a SC-SC distance, otherwise a +C CA-CA distance used in regularization of structure. + ii=ihpb(i) + jj=jhpb(i) +C iii and jjj point to the residues for which the distance is assigned. + if (ii.gt.nres) then + iii=ii-nres + jjj=jj-nres + else + iii=ii + jjj=jj + endif +c write (iout,*) "i",i," ii",ii," iii",iii," jj",jj," jjj",jjj, +c & dhpb(i),dhpb1(i),forcon(i) +C 24/11/03 AL: SS bridges handled separately because of introducing a specific +C distance and angle dependent SS bond potential. +cmc if (ii.gt.nres .and. itype(iii).eq.1 .and. itype(jjj).eq.1) then +C 18/07/06 MC: Use the convention that the first nss pairs are SS bonds + if (.not.dyn_ss .and. i.le.nss) then +C 15/02/13 CC dynamic SSbond - additional check + if (ii.gt.nres + & .and. itype(iii).eq.1 .and. itype(jjj).eq.1) then + call ssbond_ene(iii,jjj,eij) + ehpb=ehpb+2*eij + endif +cd write (iout,*) "eij",eij + else if (ii.gt.nres .and. jj.gt.nres) then +c Restraints from contact prediction + dd=dist(ii,jj) + if (dhpb1(i).gt.0.0d0) then + ehpb=ehpb+2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i)) + fac=forcon(i)*gnmr1prim(dd,dhpb(i),dhpb1(i))/dd +c write (iout,*) "beta nmr", +c & dd,2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i)) + else + dd=dist(ii,jj) + rdis=dd-dhpb(i) +C Get the force constant corresponding to this distance. + waga=forcon(i) +C Calculate the contribution to energy. + ehpb=ehpb+waga*rdis*rdis +c write (iout,*) "beta reg",dd,waga*rdis*rdis +C +C Evaluate gradient. +C + fac=waga*rdis/dd + endif + do j=1,3 + ggg(j)=fac*(c(j,jj)-c(j,ii)) + enddo + do j=1,3 + ghpbx(j,iii)=ghpbx(j,iii)-ggg(j) + ghpbx(j,jjj)=ghpbx(j,jjj)+ggg(j) + enddo + do k=1,3 + ghpbc(k,jjj)=ghpbc(k,jjj)+ggg(k) + ghpbc(k,iii)=ghpbc(k,iii)-ggg(k) + enddo + else +C Calculate the distance between the two points and its difference from the +C target distance. + dd=dist(ii,jj) + if (dhpb1(i).gt.0.0d0) then + ehpb=ehpb+2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i)) + fac=forcon(i)*gnmr1prim(dd,dhpb(i),dhpb1(i))/dd +c write (iout,*) "alph nmr", +c & dd,2*forcon(i)*gnmr1(dd,dhpb(i),dhpb1(i)) + else + rdis=dd-dhpb(i) +C Get the force constant corresponding to this distance. + waga=forcon(i) +C Calculate the contribution to energy. + ehpb=ehpb+waga*rdis*rdis +c write (iout,*) "alpha reg",dd,waga*rdis*rdis +C +C Evaluate gradient. +C + fac=waga*rdis/dd + endif +cd print *,'i=',i,' ii=',ii,' jj=',jj,' dhpb=',dhpb(i),' dd=',dd, +cd & ' waga=',waga,' fac=',fac + do j=1,3 + ggg(j)=fac*(c(j,jj)-c(j,ii)) + enddo +cd print '(i3,3(1pe14.5))',i,(ggg(j),j=1,3) +C If this is a SC-SC distance, we need to calculate the contributions to the +C Cartesian gradient in the SC vectors (ghpbx). + if (iii.lt.ii) then + do j=1,3 + ghpbx(j,iii)=ghpbx(j,iii)-ggg(j) + ghpbx(j,jjj)=ghpbx(j,jjj)+ggg(j) + enddo + endif +cgrad do j=iii,jjj-1 +cgrad do k=1,3 +cgrad ghpbc(k,j)=ghpbc(k,j)+ggg(k) +cgrad enddo +cgrad enddo + do k=1,3 + ghpbc(k,jjj)=ghpbc(k,jjj)+ggg(k) + ghpbc(k,iii)=ghpbc(k,iii)-ggg(k) + enddo + endif + enddo + ehpb=0.5D0*ehpb + return + end +C-------------------------------------------------------------------------- + subroutine ssbond_ene(i,j,eij) +C +C Calculate the distance and angle dependent SS-bond potential energy +C using a free-energy function derived based on RHF/6-31G** ab initio +C calculations of diethyl disulfide. +C +C A. Liwo and U. Kozlowska, 11/24/03 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + double precision erij(3),dcosom1(3),dcosom2(3),gg(3) + itypi=itype(i) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(nres+i) + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(nres+j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + erij(1)=xj*rij + erij(2)=yj*rij + erij(3)=zj*rij + om1=dxi*erij(1)+dyi*erij(2)+dzi*erij(3) + om2=dxj*erij(1)+dyj*erij(2)+dzj*erij(3) + om12=dxi*dxj+dyi*dyj+dzi*dzj + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,nres+i)-om1*erij(k)) + dcosom2(k)=rij*(dc_norm(k,nres+j)-om2*erij(k)) + enddo + rij=1.0d0/rij + deltad=rij-d0cm + deltat1=1.0d0-om1 + deltat2=1.0d0+om2 + deltat12=om2-om1+2.0d0 + cosphi=om12-om1*om2 + eij=akcm*deltad*deltad+akth*(deltat1*deltat1+deltat2*deltat2) + & +akct*deltad*deltat12+ebr + & +v1ss*cosphi+v2ss*cosphi*cosphi+v3ss*cosphi*cosphi*cosphi +c write(iout,*) i,j,"rij",rij,"d0cm",d0cm," akcm",akcm," akth",akth, +c & " akct",akct," deltad",deltad," deltat",deltat1,deltat2, +c & " deltat12",deltat12," eij",eij + ed=2*akcm*deltad+akct*deltat12 + pom1=akct*deltad + pom2=v1ss+2*v2ss*cosphi+3*v3ss*cosphi*cosphi + eom1=-2*akth*deltat1-pom1-om2*pom2 + eom2= 2*akth*deltat2+pom1-om1*pom2 + eom12=pom2 + do k=1,3 + ggk=ed*erij(k)+eom1*dcosom1(k)+eom2*dcosom2(k) + ghpbx(k,i)=ghpbx(k,i)-ggk + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + ghpbx(k,j)=ghpbx(k,j)+ggk + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + ghpbc(k,i)=ghpbc(k,i)-ggk + ghpbc(k,j)=ghpbc(k,j)+ggk + enddo +C +C Calculate the components of the gradient in DC and X +C +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad ghpbc(l,k)=ghpbc(l,k)+gg(l) +cgrad enddo +cgrad enddo + return + end +C-------------------------------------------------------------------------- + subroutine ebond(estr) +c +c Evaluate the energy of stretching of the CA-CA and CA-SC virtual bonds +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + double precision u(3),ud(3) + estr=0.0d0 + do i=ibondp_start,ibondp_end + diff = vbld(i)-vbldp0 +c write (iout,*) i,vbld(i),vbldp0,diff,AKP*diff*diff + estr=estr+diff*diff + do j=1,3 + gradb(j,i-1)=AKP*diff*dc(j,i-1)/vbld(i) + enddo +c write (iout,'(i5,3f10.5)') i,(gradb(j,i-1),j=1,3) + enddo + estr=0.5d0*AKP*estr +c +c 09/18/07 AL: multimodal bond potential based on AM1 CA-SC PMF's included +c + do i=ibond_start,ibond_end + iti=itype(i) + if (iti.ne.10) then + nbi=nbondterm(iti) + if (nbi.eq.1) then + diff=vbld(i+nres)-vbldsc0(1,iti) +c write (iout,*) i,iti,vbld(i+nres),vbldsc0(1,iti),diff, +c & AKSC(1,iti),AKSC(1,iti)*diff*diff + estr=estr+0.5d0*AKSC(1,iti)*diff*diff + do j=1,3 + gradbx(j,i)=AKSC(1,iti)*diff*dc(j,i+nres)/vbld(i+nres) + enddo + else + do j=1,nbi + diff=vbld(i+nres)-vbldsc0(j,iti) + ud(j)=aksc(j,iti)*diff + u(j)=abond0(j,iti)+0.5d0*ud(j)*diff + enddo + uprod=u(1) + do j=2,nbi + uprod=uprod*u(j) + enddo + usum=0.0d0 + usumsqder=0.0d0 + do j=1,nbi + uprod1=1.0d0 + uprod2=1.0d0 + do k=1,nbi + if (k.ne.j) then + uprod1=uprod1*u(k) + uprod2=uprod2*u(k)*u(k) + endif + enddo + usum=usum+uprod1 + usumsqder=usumsqder+ud(j)*uprod2 + enddo + estr=estr+uprod/usum + do j=1,3 + gradbx(j,i)=usumsqder/(usum*usum)*dc(j,i+nres)/vbld(i+nres) + enddo + endif + endif + enddo + return + end +#ifdef CRYST_THETA +C-------------------------------------------------------------------------- + subroutine ebend(etheta) +C +C Evaluate the virtual-bond-angle energy given the virtual-bond dihedral +C angles gamma and its derivatives in consecutive thetas and gammas. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it + double precision y(2),z(2) + delta=0.02d0*pi +c time11=dexp(-2*time) +c time12=1.0d0 + etheta=0.0D0 +c write (*,'(a,i2)') 'EBEND ICG=',icg + do i=ithet_start,ithet_end +C Zero the energy function and its derivative at 0 or pi. + call splinthet(theta(i),0.5d0*delta,ss,ssd) + it=itype(i-1) + if (i.gt.3) then +#ifdef OSF + phii=phi(i) + if (phii.ne.phii) phii=150.0 +#else + phii=phi(i) +#endif + y(1)=dcos(phii) + y(2)=dsin(phii) + else + y(1)=0.0D0 + y(2)=0.0D0 + endif + if (i.lt.nres) then +#ifdef OSF + phii1=phi(i+1) + if (phii1.ne.phii1) phii1=150.0 + phii1=pinorm(phii1) + z(1)=cos(phii1) +#else + phii1=phi(i+1) + z(1)=dcos(phii1) +#endif + z(2)=dsin(phii1) + else + z(1)=0.0D0 + z(2)=0.0D0 + endif +C Calculate the "mean" value of theta from the part of the distribution +C dependent on the adjacent virtual-bond-valence angles (gamma1 & gamma2). +C In following comments this theta will be referred to as t_c. + thet_pred_mean=0.0d0 + do k=1,2 + athetk=athet(k,it) + bthetk=bthet(k,it) + thet_pred_mean=thet_pred_mean+athetk*y(k)+bthetk*z(k) + enddo + dthett=thet_pred_mean*ssd + thet_pred_mean=thet_pred_mean*ss+a0thet(it) +C Derivatives of the "mean" values in gamma1 and gamma2. + dthetg1=(-athet(1,it)*y(2)+athet(2,it)*y(1))*ss + dthetg2=(-bthet(1,it)*z(2)+bthet(2,it)*z(1))*ss + if (theta(i).gt.pi-delta) then + call theteng(pi-delta,thet_pred_mean,theta0(it),f0,fprim0, + & E_tc0) + call mixder(pi-delta,thet_pred_mean,theta0(it),fprim_tc0) + call theteng(pi,thet_pred_mean,theta0(it),f1,fprim1,E_tc1) + call spline1(theta(i),pi-delta,delta,f0,f1,fprim0,ethetai, + & E_theta) + call spline2(theta(i),pi-delta,delta,E_tc0,E_tc1,fprim_tc0, + & E_tc) + else if (theta(i).lt.delta) then + call theteng(delta,thet_pred_mean,theta0(it),f0,fprim0,E_tc0) + call theteng(0.0d0,thet_pred_mean,theta0(it),f1,fprim1,E_tc1) + call spline1(theta(i),delta,-delta,f0,f1,fprim0,ethetai, + & E_theta) + call mixder(delta,thet_pred_mean,theta0(it),fprim_tc0) + call spline2(theta(i),delta,-delta,E_tc0,E_tc1,fprim_tc0, + & E_tc) + else + call theteng(theta(i),thet_pred_mean,theta0(it),ethetai, + & E_theta,E_tc) + endif + etheta=etheta+ethetai + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'ebend',i,ethetai + if (i.gt.3) gloc(i-3,icg)=gloc(i-3,icg)+wang*E_tc*dthetg1 + if (i.lt.nres) gloc(i-2,icg)=gloc(i-2,icg)+wang*E_tc*dthetg2 + gloc(nphi+i-2,icg)=wang*(E_theta+E_tc*dthett) + enddo +C Ufff.... We've done all this!!! + return + end +C--------------------------------------------------------------------------- + subroutine theteng(thetai,thet_pred_mean,theta0i,ethetai,E_theta, + & E_tc) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it +C Calculate the contributions to both Gaussian lobes. +C 6/6/97 - Deform the Gaussians using the factor of 1/(1+time) +C The "polynomial part" of the "standard deviation" of this part of +C the distribution. + sig=polthet(3,it) + do j=2,0,-1 + sig=sig*thet_pred_mean+polthet(j,it) + enddo +C Derivative of the "interior part" of the "standard deviation of the" +C gamma-dependent Gaussian lobe in t_c. + sigtc=3*polthet(3,it) + do j=2,1,-1 + sigtc=sigtc*thet_pred_mean+j*polthet(j,it) + enddo + sigtc=sig*sigtc +C Set the parameters of both Gaussian lobes of the distribution. +C "Standard deviation" of the gamma-dependent Gaussian lobe (sigtc) + fac=sig*sig+sigc0(it) + sigcsq=fac+fac + sigc=1.0D0/sigcsq +C Following variable (sigsqtc) is -(1/2)d[sigma(t_c)**(-2))]/dt_c + sigsqtc=-4.0D0*sigcsq*sigtc +c print *,i,sig,sigtc,sigsqtc +C Following variable (sigtc) is d[sigma(t_c)]/dt_c + sigtc=-sigtc/(fac*fac) +C Following variable is sigma(t_c)**(-2) + sigcsq=sigcsq*sigcsq + sig0i=sig0(it) + sig0inv=1.0D0/sig0i**2 + delthec=thetai-thet_pred_mean + delthe0=thetai-theta0i + term1=-0.5D0*sigcsq*delthec*delthec + term2=-0.5D0*sig0inv*delthe0*delthe0 +C Following fuzzy logic is to avoid underflows in dexp and subsequent INFs and +C NaNs in taking the logarithm. We extract the largest exponent which is added +C to the energy (this being the log of the distribution) at the end of energy +C term evaluation for this virtual-bond angle. + if (term1.gt.term2) then + termm=term1 + term2=dexp(term2-termm) + term1=1.0d0 + else + termm=term2 + term1=dexp(term1-termm) + term2=1.0d0 + endif +C The ratio between the gamma-independent and gamma-dependent lobes of +C the distribution is a Gaussian function of thet_pred_mean too. + diffak=gthet(2,it)-thet_pred_mean + ratak=diffak/gthet(3,it)**2 + ak=dexp(gthet(1,it)-0.5D0*diffak*ratak) +C Let's differentiate it in thet_pred_mean NOW. + aktc=ak*ratak +C Now put together the distribution terms to make complete distribution. + termexp=term1+ak*term2 + termpre=sigc+ak*sig0i +C Contribution of the bending energy from this theta is just the -log of +C the sum of the contributions from the two lobes and the pre-exponential +C factor. Simple enough, isn't it? + ethetai=(-dlog(termexp)-termm+dlog(termpre)) +C NOW the derivatives!!! +C 6/6/97 Take into account the deformation. + E_theta=(delthec*sigcsq*term1 + & +ak*delthe0*sig0inv*term2)/termexp + E_tc=((sigtc+aktc*sig0i)/termpre + & -((delthec*sigcsq+delthec*delthec*sigsqtc)*term1+ + & aktc*term2)/termexp) + return + end +c----------------------------------------------------------------------------- + subroutine mixder(thetai,thet_pred_mean,theta0i,E_tc_t) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it + delthec=thetai-thet_pred_mean + delthe0=thetai-theta0i +C "Thank you" to MAPLE (probably spared one day of hand-differentiation). + t3 = thetai-thet_pred_mean + t6 = t3**2 + t9 = term1 + t12 = t3*sigcsq + t14 = t12+t6*sigsqtc + t16 = 1.0d0 + t21 = thetai-theta0i + t23 = t21**2 + t26 = term2 + t27 = t21*t26 + t32 = termexp + t40 = t32**2 + E_tc_t = -((sigcsq+2.D0*t3*sigsqtc)*t9-t14*sigcsq*t3*t16*t9 + & -aktc*sig0inv*t27)/t32+(t14*t9+aktc*t26)/t40 + & *(-t12*t9-ak*sig0inv*t27) + return + end +#else +C-------------------------------------------------------------------------- + subroutine ebend(etheta) +C +C Evaluate the virtual-bond-angle energy given the virtual-bond dihedral +C angles gamma and its derivatives in consecutive thetas and gammas. +C ab initio-derived potentials from +c Kozlowska et al., J. Phys.: Condens. Matter 19 (2007) 285203 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + double precision coskt(mmaxtheterm),sinkt(mmaxtheterm), + & cosph1(maxsingle),sinph1(maxsingle),cosph2(maxsingle), + & sinph2(maxsingle),cosph1ph2(maxdouble,maxdouble), + & sinph1ph2(maxdouble,maxdouble) + logical lprn /.false./, lprn1 /.false./ + etheta=0.0D0 + do i=ithet_start,ithet_end + dethetai=0.0d0 + dephii=0.0d0 + dephii1=0.0d0 + theti2=0.5d0*theta(i) + ityp2=ithetyp(itype(i-1)) + do k=1,nntheterm + coskt(k)=dcos(k*theti2) + sinkt(k)=dsin(k*theti2) + enddo + if (i.gt.3) then +#ifdef OSF + phii=phi(i) + if (phii.ne.phii) phii=150.0 +#else + phii=phi(i) +#endif + ityp1=ithetyp(itype(i-2)) + do k=1,nsingle + cosph1(k)=dcos(k*phii) + sinph1(k)=dsin(k*phii) + enddo + else + phii=0.0d0 + ityp1=nthetyp+1 + do k=1,nsingle + cosph1(k)=0.0d0 + sinph1(k)=0.0d0 + enddo + endif + if (i.lt.nres) then +#ifdef OSF + phii1=phi(i+1) + if (phii1.ne.phii1) phii1=150.0 + phii1=pinorm(phii1) +#else + phii1=phi(i+1) +#endif + ityp3=ithetyp(itype(i)) + do k=1,nsingle + cosph2(k)=dcos(k*phii1) + sinph2(k)=dsin(k*phii1) + enddo + else + phii1=0.0d0 + ityp3=nthetyp+1 + do k=1,nsingle + cosph2(k)=0.0d0 + sinph2(k)=0.0d0 + enddo + endif + ethetai=aa0thet(ityp1,ityp2,ityp3) + do k=1,ndouble + do l=1,k-1 + ccl=cosph1(l)*cosph2(k-l) + ssl=sinph1(l)*sinph2(k-l) + scl=sinph1(l)*cosph2(k-l) + csl=cosph1(l)*sinph2(k-l) + cosph1ph2(l,k)=ccl-ssl + cosph1ph2(k,l)=ccl+ssl + sinph1ph2(l,k)=scl+csl + sinph1ph2(k,l)=scl-csl + enddo + enddo + if (lprn) then + write (iout,*) "i",i," ityp1",ityp1," ityp2",ityp2, + & " ityp3",ityp3," theti2",theti2," phii",phii," phii1",phii1 + write (iout,*) "coskt and sinkt" + do k=1,nntheterm + write (iout,*) k,coskt(k),sinkt(k) + enddo + endif + do k=1,ntheterm + ethetai=ethetai+aathet(k,ityp1,ityp2,ityp3)*sinkt(k) + dethetai=dethetai+0.5d0*k*aathet(k,ityp1,ityp2,ityp3) + & *coskt(k) + if (lprn) + & write (iout,*) "k",k," aathet",aathet(k,ityp1,ityp2,ityp3), + & " ethetai",ethetai + enddo + if (lprn) then + write (iout,*) "cosph and sinph" + do k=1,nsingle + write (iout,*) k,cosph1(k),sinph1(k),cosph2(k),sinph2(k) + enddo + write (iout,*) "cosph1ph2 and sinph2ph2" + do k=2,ndouble + do l=1,k-1 + write (iout,*) l,k,cosph1ph2(l,k),cosph1ph2(k,l), + & sinph1ph2(l,k),sinph1ph2(k,l) + enddo + enddo + write(iout,*) "ethetai",ethetai + endif + do m=1,ntheterm2 + do k=1,nsingle + aux=bbthet(k,m,ityp1,ityp2,ityp3)*cosph1(k) + & +ccthet(k,m,ityp1,ityp2,ityp3)*sinph1(k) + & +ddthet(k,m,ityp1,ityp2,ityp3)*cosph2(k) + & +eethet(k,m,ityp1,ityp2,ityp3)*sinph2(k) + ethetai=ethetai+sinkt(m)*aux + dethetai=dethetai+0.5d0*m*aux*coskt(m) + dephii=dephii+k*sinkt(m)*( + & ccthet(k,m,ityp1,ityp2,ityp3)*cosph1(k)- + & bbthet(k,m,ityp1,ityp2,ityp3)*sinph1(k)) + dephii1=dephii1+k*sinkt(m)*( + & eethet(k,m,ityp1,ityp2,ityp3)*cosph2(k)- + & ddthet(k,m,ityp1,ityp2,ityp3)*sinph2(k)) + if (lprn) + & write (iout,*) "m",m," k",k," bbthet", + & bbthet(k,m,ityp1,ityp2,ityp3)," ccthet", + & ccthet(k,m,ityp1,ityp2,ityp3)," ddthet", + & ddthet(k,m,ityp1,ityp2,ityp3)," eethet", + & eethet(k,m,ityp1,ityp2,ityp3)," ethetai",ethetai + enddo + enddo + if (lprn) + & write(iout,*) "ethetai",ethetai + do m=1,ntheterm3 + do k=2,ndouble + do l=1,k-1 + aux=ffthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)+ + & ffthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)+ + & ggthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l) + ethetai=ethetai+sinkt(m)*aux + dethetai=dethetai+0.5d0*m*coskt(m)*aux + dephii=dephii+l*sinkt(m)*( + & -ffthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)- + & ffthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)+ + & ggthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)) + dephii1=dephii1+(k-l)*sinkt(m)*( + & -ffthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)+ + & ffthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)- + & ggthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)) + if (lprn) then + write (iout,*) "m",m," k",k," l",l," ffthet", + & ffthet(l,k,m,ityp1,ityp2,ityp3), + & ffthet(k,l,m,ityp1,ityp2,ityp3)," ggthet", + & ggthet(l,k,m,ityp1,ityp2,ityp3), + & ggthet(k,l,m,ityp1,ityp2,ityp3)," ethetai",ethetai + write (iout,*) cosph1ph2(l,k)*sinkt(m), + & cosph1ph2(k,l)*sinkt(m), + & sinph1ph2(l,k)*sinkt(m),sinph1ph2(k,l)*sinkt(m) + endif + enddo + enddo + enddo +10 continue + if (lprn1) write (iout,'(i2,3f8.1,9h ethetai ,f10.5)') + & i,theta(i)*rad2deg,phii*rad2deg, + & phii1*rad2deg,ethetai + etheta=etheta+ethetai + if (i.gt.3) gloc(i-3,icg)=gloc(i-3,icg)+wang*dephii + if (i.lt.nres) gloc(i-2,icg)=gloc(i-2,icg)+wang*dephii1 + gloc(nphi+i-2,icg)=wang*dethetai + enddo + return + end +#endif +#ifdef CRYST_SC +c----------------------------------------------------------------------------- + subroutine esc(escloc) +C Calculate the local energy of a side chain and its derivatives in the +C corresponding virtual-bond valence angles THETA and the spherical angles +C ALPHA and OMEGA. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + double precision x(3),dersc(3),xemp(3),dersc0(3),dersc1(3), + & ddersc0(3),ddummy(3),xtemp(3),temp(3) + common /sccalc/ time11,time12,time112,theti,it,nlobit + delta=0.02d0*pi + escloc=0.0D0 +c write (iout,'(a)') 'ESC' + do i=loc_start,loc_end + it=itype(i) + if (it.eq.10) goto 1 + nlobit=nlob(it) +c print *,'i=',i,' it=',it,' nlobit=',nlobit +c write (iout,*) 'i=',i,' ssa=',ssa,' ssad=',ssad + theti=theta(i+1)-pipol + x(1)=dtan(theti) + x(2)=alph(i) + x(3)=omeg(i) + + if (x(2).gt.pi-delta) then + xtemp(1)=x(1) + xtemp(2)=pi-delta + xtemp(3)=x(3) + call enesc(xtemp,escloci0,dersc0,ddersc0,.true.) + xtemp(2)=pi + call enesc(xtemp,escloci1,dersc1,ddummy,.false.) + call spline1(x(2),pi-delta,delta,escloci0,escloci1,dersc0(2), + & escloci,dersc(2)) + call spline2(x(2),pi-delta,delta,dersc0(1),dersc1(1), + & ddersc0(1),dersc(1)) + call spline2(x(2),pi-delta,delta,dersc0(3),dersc1(3), + & ddersc0(3),dersc(3)) + xtemp(2)=pi-delta + call enesc_bound(xtemp,esclocbi0,dersc0,dersc12,.true.) + xtemp(2)=pi + call enesc_bound(xtemp,esclocbi1,dersc1,chuju,.false.) + call spline1(x(2),pi-delta,delta,esclocbi0,esclocbi1, + & dersc0(2),esclocbi,dersc02) + call spline2(x(2),pi-delta,delta,dersc0(1),dersc1(1), + & dersc12,dersc01) + call splinthet(x(2),0.5d0*delta,ss,ssd) + dersc0(1)=dersc01 + dersc0(2)=dersc02 + dersc0(3)=0.0d0 + do k=1,3 + dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k) + enddo + dersc(2)=dersc(2)+ssd*(escloci-esclocbi) +c write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci, +c & esclocbi,ss,ssd + escloci=ss*escloci+(1.0d0-ss)*esclocbi +c escloci=esclocbi +c write (iout,*) escloci + else if (x(2).lt.delta) then + xtemp(1)=x(1) + xtemp(2)=delta + xtemp(3)=x(3) + call enesc(xtemp,escloci0,dersc0,ddersc0,.true.) + xtemp(2)=0.0d0 + call enesc(xtemp,escloci1,dersc1,ddummy,.false.) + call spline1(x(2),delta,-delta,escloci0,escloci1,dersc0(2), + & escloci,dersc(2)) + call spline2(x(2),delta,-delta,dersc0(1),dersc1(1), + & ddersc0(1),dersc(1)) + call spline2(x(2),delta,-delta,dersc0(3),dersc1(3), + & ddersc0(3),dersc(3)) + xtemp(2)=delta + call enesc_bound(xtemp,esclocbi0,dersc0,dersc12,.true.) + xtemp(2)=0.0d0 + call enesc_bound(xtemp,esclocbi1,dersc1,chuju,.false.) + call spline1(x(2),delta,-delta,esclocbi0,esclocbi1, + & dersc0(2),esclocbi,dersc02) + call spline2(x(2),delta,-delta,dersc0(1),dersc1(1), + & dersc12,dersc01) + dersc0(1)=dersc01 + dersc0(2)=dersc02 + dersc0(3)=0.0d0 + call splinthet(x(2),0.5d0*delta,ss,ssd) + do k=1,3 + dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k) + enddo + dersc(2)=dersc(2)+ssd*(escloci-esclocbi) +c write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci, +c & esclocbi,ss,ssd + escloci=ss*escloci+(1.0d0-ss)*esclocbi +c write (iout,*) escloci + else + call enesc(x,escloci,dersc,ddummy,.false.) + endif + + escloc=escloc+escloci + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'escloc',i,escloci +c write (iout,*) 'i=',i,' escloci=',escloci,' dersc=',dersc + + gloc(nphi+i-1,icg)=gloc(nphi+i-1,icg)+ + & wscloc*dersc(1) + gloc(ialph(i,1),icg)=wscloc*dersc(2) + gloc(ialph(i,1)+nside,icg)=wscloc*dersc(3) + 1 continue + enddo + return + end +C--------------------------------------------------------------------------- + subroutine enesc(x,escloci,dersc,ddersc,mixed) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /sccalc/ time11,time12,time112,theti,it,nlobit + double precision x(3),z(3),Ax(3,maxlob,-1:1),dersc(3),ddersc(3) + double precision contr(maxlob,-1:1) + logical mixed +c write (iout,*) 'it=',it,' nlobit=',nlobit + escloc_i=0.0D0 + do j=1,3 + dersc(j)=0.0D0 + if (mixed) ddersc(j)=0.0d0 + enddo + x3=x(3) + +C Because of periodicity of the dependence of the SC energy in omega we have +C to add up the contributions from x(3)-2*pi, x(3), and x(3+2*pi). +C To avoid underflows, first compute & store the exponents. + + do iii=-1,1 + + x(3)=x3+iii*dwapi + + do j=1,nlobit + do k=1,3 + z(k)=x(k)-censc(k,j,it) + enddo + do k=1,3 + Axk=0.0D0 + do l=1,3 + Axk=Axk+gaussc(l,k,j,it)*z(l) + enddo + Ax(k,j,iii)=Axk + enddo + expfac=0.0D0 + do k=1,3 + expfac=expfac+Ax(k,j,iii)*z(k) + enddo + contr(j,iii)=expfac + enddo ! j + + enddo ! iii + + x(3)=x3 +C As in the case of ebend, we want to avoid underflows in exponentiation and +C subsequent NaNs and INFs in energy calculation. +C Find the largest exponent + emin=contr(1,-1) + do iii=-1,1 + do j=1,nlobit + if (emin.gt.contr(j,iii)) emin=contr(j,iii) + enddo + enddo + emin=0.5D0*emin +cd print *,'it=',it,' emin=',emin + +C Compute the contribution to SC energy and derivatives + do iii=-1,1 + + do j=1,nlobit +#ifdef OSF + adexp=bsc(j,it)-0.5D0*contr(j,iii)+emin + if(adexp.ne.adexp) adexp=1.0 + expfac=dexp(adexp) +#else + expfac=dexp(bsc(j,it)-0.5D0*contr(j,iii)+emin) +#endif +cd print *,'j=',j,' expfac=',expfac + escloc_i=escloc_i+expfac + do k=1,3 + dersc(k)=dersc(k)+Ax(k,j,iii)*expfac + enddo + if (mixed) then + do k=1,3,2 + ddersc(k)=ddersc(k)+(-Ax(2,j,iii)*Ax(k,j,iii) + & +gaussc(k,2,j,it))*expfac + enddo + endif + enddo + + enddo ! iii + + dersc(1)=dersc(1)/cos(theti)**2 + ddersc(1)=ddersc(1)/cos(theti)**2 + ddersc(3)=ddersc(3) + + escloci=-(dlog(escloc_i)-emin) + do j=1,3 + dersc(j)=dersc(j)/escloc_i + enddo + if (mixed) then + do j=1,3,2 + ddersc(j)=(ddersc(j)/escloc_i+dersc(2)*dersc(j)) + enddo + endif + return + end +C------------------------------------------------------------------------------ + subroutine enesc_bound(x,escloci,dersc,dersc12,mixed) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /sccalc/ time11,time12,time112,theti,it,nlobit + double precision x(3),z(3),Ax(3,maxlob),dersc(3) + double precision contr(maxlob) + logical mixed + + escloc_i=0.0D0 + + do j=1,3 + dersc(j)=0.0D0 + enddo + + do j=1,nlobit + do k=1,2 + z(k)=x(k)-censc(k,j,it) + enddo + z(3)=dwapi + do k=1,3 + Axk=0.0D0 + do l=1,3 + Axk=Axk+gaussc(l,k,j,it)*z(l) + enddo + Ax(k,j)=Axk + enddo + expfac=0.0D0 + do k=1,3 + expfac=expfac+Ax(k,j)*z(k) + enddo + contr(j)=expfac + enddo ! j + +C As in the case of ebend, we want to avoid underflows in exponentiation and +C subsequent NaNs and INFs in energy calculation. +C Find the largest exponent + emin=contr(1) + do j=1,nlobit + if (emin.gt.contr(j)) emin=contr(j) + enddo + emin=0.5D0*emin + +C Compute the contribution to SC energy and derivatives + + dersc12=0.0d0 + do j=1,nlobit + expfac=dexp(bsc(j,it)-0.5D0*contr(j)+emin) + escloc_i=escloc_i+expfac + do k=1,2 + dersc(k)=dersc(k)+Ax(k,j)*expfac + enddo + if (mixed) dersc12=dersc12+(-Ax(2,j)*Ax(1,j) + & +gaussc(1,2,j,it))*expfac + dersc(3)=0.0d0 + enddo + + dersc(1)=dersc(1)/cos(theti)**2 + dersc12=dersc12/cos(theti)**2 + escloci=-(dlog(escloc_i)-emin) + do j=1,2 + dersc(j)=dersc(j)/escloc_i + enddo + if (mixed) dersc12=(dersc12/escloc_i+dersc(2)*dersc(1)) + return + end +#else +c---------------------------------------------------------------------------------- + subroutine esc(escloc) +C Calculate the local energy of a side chain and its derivatives in the +C corresponding virtual-bond valence angles THETA and the spherical angles +C ALPHA and OMEGA derived from AM1 all-atom calculations. +C added by Urszula Kozlowska. 07/11/2007 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.SCROT' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include 'COMMON.VECTORS' + double precision x_prime(3),y_prime(3),z_prime(3) + & , sumene,dsc_i,dp2_i,x(65), + & xx,yy,zz,sumene1,sumene2,sumene3,sumene4,s1,s1_6,s2,s2_6, + & de_dxx,de_dyy,de_dzz,de_dt + double precision s1_t,s1_6_t,s2_t,s2_6_t + double precision + & dXX_Ci1(3),dYY_Ci1(3),dZZ_Ci1(3),dXX_Ci(3), + & dYY_Ci(3),dZZ_Ci(3),dXX_XYZ(3),dYY_XYZ(3),dZZ_XYZ(3), + & dt_dCi(3),dt_dCi1(3) + common /sccalc/ time11,time12,time112,theti,it,nlobit + delta=0.02d0*pi + escloc=0.0D0 + do i=loc_start,loc_end + costtab(i+1) =dcos(theta(i+1)) + sinttab(i+1) =dsqrt(1-costtab(i+1)*costtab(i+1)) + cost2tab(i+1)=dsqrt(0.5d0*(1.0d0+costtab(i+1))) + sint2tab(i+1)=dsqrt(0.5d0*(1.0d0-costtab(i+1))) + cosfac2=0.5d0/(1.0d0+costtab(i+1)) + cosfac=dsqrt(cosfac2) + sinfac2=0.5d0/(1.0d0-costtab(i+1)) + sinfac=dsqrt(sinfac2) + it=itype(i) + if (it.eq.10) goto 1 +c +C Compute the axes of tghe local cartesian coordinates system; store in +c x_prime, y_prime and z_prime +c + do j=1,3 + x_prime(j) = 0.00 + y_prime(j) = 0.00 + z_prime(j) = 0.00 + enddo +C write(2,*) "dc_norm", dc_norm(1,i+nres),dc_norm(2,i+nres), +C & dc_norm(3,i+nres) + do j = 1,3 + x_prime(j) = (dc_norm(j,i) - dc_norm(j,i-1))*cosfac + y_prime(j) = (dc_norm(j,i) + dc_norm(j,i-1))*sinfac + enddo + do j = 1,3 + z_prime(j) = -uz(j,i-1) + enddo +c write (2,*) "i",i +c write (2,*) "x_prime",(x_prime(j),j=1,3) +c write (2,*) "y_prime",(y_prime(j),j=1,3) +c write (2,*) "z_prime",(z_prime(j),j=1,3) +c write (2,*) "xx",scalar(x_prime(1),x_prime(1)), +c & " xy",scalar(x_prime(1),y_prime(1)), +c & " xz",scalar(x_prime(1),z_prime(1)), +c & " yy",scalar(y_prime(1),y_prime(1)), +c & " yz",scalar(y_prime(1),z_prime(1)), +c & " zz",scalar(z_prime(1),z_prime(1)) +c +C Transform the unit vector of the ith side-chain centroid, dC_norm(*,i), +C to local coordinate system. Store in xx, yy, zz. +c + xx=0.0d0 + yy=0.0d0 + zz=0.0d0 + do j = 1,3 + xx = xx + x_prime(j)*dc_norm(j,i+nres) + yy = yy + y_prime(j)*dc_norm(j,i+nres) + zz = zz + z_prime(j)*dc_norm(j,i+nres) + enddo + + xxtab(i)=xx + yytab(i)=yy + zztab(i)=zz +C +C Compute the energy of the ith side cbain +C +c write (2,*) "xx",xx," yy",yy," zz",zz + it=itype(i) + do j = 1,65 + x(j) = sc_parmin(j,it) + enddo +#ifdef CHECK_COORD +Cc diagnostics - remove later + xx1 = dcos(alph(2)) + yy1 = dsin(alph(2))*dcos(omeg(2)) + zz1 = -dsin(alph(2))*dsin(omeg(2)) + write(2,'(3f8.1,3f9.3,1x,3f9.3)') + & alph(2)*rad2deg,omeg(2)*rad2deg,theta(3)*rad2deg,xx,yy,zz, + & xx1,yy1,zz1 +C," --- ", xx_w,yy_w,zz_w +c end diagnostics +#endif + sumene1= x(1)+ x(2)*xx+ x(3)*yy+ x(4)*zz+ x(5)*xx**2 + & + x(6)*yy**2+ x(7)*zz**2+ x(8)*xx*zz+ x(9)*xx*yy + & + x(10)*yy*zz + sumene2= x(11) + x(12)*xx + x(13)*yy + x(14)*zz + x(15)*xx**2 + & + x(16)*yy**2 + x(17)*zz**2 + x(18)*xx*zz + x(19)*xx*yy + & + x(20)*yy*zz + sumene3= x(21) +x(22)*xx +x(23)*yy +x(24)*zz +x(25)*xx**2 + & +x(26)*yy**2 +x(27)*zz**2 +x(28)*xx*zz +x(29)*xx*yy + & +x(30)*yy*zz +x(31)*xx**3 +x(32)*yy**3 +x(33)*zz**3 + & +x(34)*(xx**2)*yy +x(35)*(xx**2)*zz +x(36)*(yy**2)*xx + & +x(37)*(yy**2)*zz +x(38)*(zz**2)*xx +x(39)*(zz**2)*yy + & +x(40)*xx*yy*zz + sumene4= x(41) +x(42)*xx +x(43)*yy +x(44)*zz +x(45)*xx**2 + & +x(46)*yy**2 +x(47)*zz**2 +x(48)*xx*zz +x(49)*xx*yy + & +x(50)*yy*zz +x(51)*xx**3 +x(52)*yy**3 +x(53)*zz**3 + & +x(54)*(xx**2)*yy +x(55)*(xx**2)*zz +x(56)*(yy**2)*xx + & +x(57)*(yy**2)*zz +x(58)*(zz**2)*xx +x(59)*(zz**2)*yy + & +x(60)*xx*yy*zz + dsc_i = 0.743d0+x(61) + dp2_i = 1.9d0+x(62) + dscp1=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2tab(i+1)+yy*sint2tab(i+1))) + dscp2=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2tab(i+1)-yy*sint2tab(i+1))) + s1=(1+x(63))/(0.1d0 + dscp1) + s1_6=(1+x(64))/(0.1d0 + dscp1**6) + s2=(1+x(65))/(0.1d0 + dscp2) + s2_6=(1+x(65))/(0.1d0 + dscp2**6) + sumene = ( sumene3*sint2tab(i+1) + sumene1)*(s1+s1_6) + & + (sumene4*cost2tab(i+1) +sumene2)*(s2+s2_6) +c write(2,'(i2," sumene",7f9.3)') i,sumene1,sumene2,sumene3, +c & sumene4, +c & dscp1,dscp2,sumene +c sumene = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + escloc = escloc + sumene +c write (2,*) "i",i," escloc",sumene,escloc +#ifdef DEBUG +C +C This section to check the numerical derivatives of the energy of ith side +C chain in xx, yy, zz, and theta. Use the -DDEBUG compiler option or insert +C #define DEBUG in the code to turn it on. +C + write (2,*) "sumene =",sumene + aincr=1.0d-7 + xxsave=xx + xx=xx+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dxx_num=(sumenep-sumene)/aincr + xx=xxsave + write (2,*) "xx+ sumene from enesc=",sumenep + yysave=yy + yy=yy+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dyy_num=(sumenep-sumene)/aincr + yy=yysave + write (2,*) "yy+ sumene from enesc=",sumenep + zzsave=zz + zz=zz+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dzz_num=(sumenep-sumene)/aincr + zz=zzsave + write (2,*) "zz+ sumene from enesc=",sumenep + costsave=cost2tab(i+1) + sintsave=sint2tab(i+1) + cost2tab(i+1)=dcos(0.5d0*(theta(i+1)+aincr)) + sint2tab(i+1)=dsin(0.5d0*(theta(i+1)+aincr)) + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dt_num=(sumenep-sumene)/aincr + write (2,*) " t+ sumene from enesc=",sumenep + cost2tab(i+1)=costsave + sint2tab(i+1)=sintsave +C End of diagnostics section. +#endif +C +C Compute the gradient of esc +C + pom_s1=(1.0d0+x(63))/(0.1d0 + dscp1)**2 + pom_s16=6*(1.0d0+x(64))/(0.1d0 + dscp1**6)**2 + pom_s2=(1.0d0+x(65))/(0.1d0 + dscp2)**2 + pom_s26=6*(1.0d0+x(65))/(0.1d0 + dscp2**6)**2 + pom_dx=dsc_i*dp2_i*cost2tab(i+1) + pom_dy=dsc_i*dp2_i*sint2tab(i+1) + pom_dt1=-0.5d0*dsc_i*dp2_i*(xx*sint2tab(i+1)-yy*cost2tab(i+1)) + pom_dt2=-0.5d0*dsc_i*dp2_i*(xx*sint2tab(i+1)+yy*cost2tab(i+1)) + pom1=(sumene3*sint2tab(i+1)+sumene1) + & *(pom_s1/dscp1+pom_s16*dscp1**4) + pom2=(sumene4*cost2tab(i+1)+sumene2) + & *(pom_s2/dscp2+pom_s26*dscp2**4) + sumene1x=x(2)+2*x(5)*xx+x(8)*zz+ x(9)*yy + sumene3x=x(22)+2*x(25)*xx+x(28)*zz+x(29)*yy+3*x(31)*xx**2 + & +2*x(34)*xx*yy +2*x(35)*xx*zz +x(36)*(yy**2) +x(38)*(zz**2) + & +x(40)*yy*zz + sumene2x=x(12)+2*x(15)*xx+x(18)*zz+ x(19)*yy + sumene4x=x(42)+2*x(45)*xx +x(48)*zz +x(49)*yy +3*x(51)*xx**2 + & +2*x(54)*xx*yy+2*x(55)*xx*zz+x(56)*(yy**2)+x(58)*(zz**2) + & +x(60)*yy*zz + de_dxx =(sumene1x+sumene3x*sint2tab(i+1))*(s1+s1_6) + & +(sumene2x+sumene4x*cost2tab(i+1))*(s2+s2_6) + & +(pom1+pom2)*pom_dx +#ifdef DEBUG + write(2,*), "de_dxx = ", de_dxx,de_dxx_num +#endif +C + sumene1y=x(3) + 2*x(6)*yy + x(9)*xx + x(10)*zz + sumene3y=x(23) +2*x(26)*yy +x(29)*xx +x(30)*zz +3*x(32)*yy**2 + & +x(34)*(xx**2) +2*x(36)*yy*xx +2*x(37)*yy*zz +x(39)*(zz**2) + & +x(40)*xx*zz + sumene2y=x(13) + 2*x(16)*yy + x(19)*xx + x(20)*zz + sumene4y=x(43)+2*x(46)*yy+x(49)*xx +x(50)*zz + & +3*x(52)*yy**2+x(54)*xx**2+2*x(56)*yy*xx +2*x(57)*yy*zz + & +x(59)*zz**2 +x(60)*xx*zz + de_dyy =(sumene1y+sumene3y*sint2tab(i+1))*(s1+s1_6) + & +(sumene2y+sumene4y*cost2tab(i+1))*(s2+s2_6) + & +(pom1-pom2)*pom_dy +#ifdef DEBUG + write(2,*), "de_dyy = ", de_dyy,de_dyy_num +#endif +C + de_dzz =(x(24) +2*x(27)*zz +x(28)*xx +x(30)*yy + & +3*x(33)*zz**2 +x(35)*xx**2 +x(37)*yy**2 +2*x(38)*zz*xx + & +2*x(39)*zz*yy +x(40)*xx*yy)*sint2tab(i+1)*(s1+s1_6) + & +(x(4) + 2*x(7)*zz+ x(8)*xx + x(10)*yy)*(s1+s1_6) + & +(x(44)+2*x(47)*zz +x(48)*xx +x(50)*yy +3*x(53)*zz**2 + & +x(55)*xx**2 +x(57)*(yy**2)+2*x(58)*zz*xx +2*x(59)*zz*yy + & +x(60)*xx*yy)*cost2tab(i+1)*(s2+s2_6) + & + ( x(14) + 2*x(17)*zz+ x(18)*xx + x(20)*yy)*(s2+s2_6) +#ifdef DEBUG + write(2,*), "de_dzz = ", de_dzz,de_dzz_num +#endif +C + de_dt = 0.5d0*sumene3*cost2tab(i+1)*(s1+s1_6) + & -0.5d0*sumene4*sint2tab(i+1)*(s2+s2_6) + & +pom1*pom_dt1+pom2*pom_dt2 +#ifdef DEBUG + write(2,*), "de_dt = ", de_dt,de_dt_num +#endif +c +C + cossc=scalar(dc_norm(1,i),dc_norm(1,i+nres)) + cossc1=scalar(dc_norm(1,i-1),dc_norm(1,i+nres)) + cosfac2xx=cosfac2*xx + sinfac2yy=sinfac2*yy + do k = 1,3 + dt_dCi(k) = -(dc_norm(k,i-1)+costtab(i+1)*dc_norm(k,i))* + & vbld_inv(i+1) + dt_dCi1(k)= -(dc_norm(k,i)+costtab(i+1)*dc_norm(k,i-1))* + & vbld_inv(i) + pom=(dC_norm(k,i+nres)-cossc*dC_norm(k,i))*vbld_inv(i+1) + pom1=(dC_norm(k,i+nres)-cossc1*dC_norm(k,i-1))*vbld_inv(i) +c write (iout,*) "i",i," k",k," pom",pom," pom1",pom1, +c & " dt_dCi",dt_dCi(k)," dt_dCi1",dt_dCi1(k) +c write (iout,*) "dC_norm",(dC_norm(j,i),j=1,3), +c & (dC_norm(j,i-1),j=1,3)," vbld_inv",vbld_inv(i+1),vbld_inv(i) + dXX_Ci(k)=pom*cosfac-dt_dCi(k)*cosfac2xx + dXX_Ci1(k)=-pom1*cosfac-dt_dCi1(k)*cosfac2xx + dYY_Ci(k)=pom*sinfac+dt_dCi(k)*sinfac2yy + dYY_Ci1(k)=pom1*sinfac+dt_dCi1(k)*sinfac2yy + dZZ_Ci1(k)=0.0d0 + dZZ_Ci(k)=0.0d0 + do j=1,3 + dZZ_Ci(k)=dZZ_Ci(k)-uzgrad(j,k,2,i-1)*dC_norm(j,i+nres) + dZZ_Ci1(k)=dZZ_Ci1(k)-uzgrad(j,k,1,i-1)*dC_norm(j,i+nres) + enddo + + dXX_XYZ(k)=vbld_inv(i+nres)*(x_prime(k)-xx*dC_norm(k,i+nres)) + dYY_XYZ(k)=vbld_inv(i+nres)*(y_prime(k)-yy*dC_norm(k,i+nres)) + dZZ_XYZ(k)=vbld_inv(i+nres)*(z_prime(k)-zz*dC_norm(k,i+nres)) +c + dt_dCi(k) = -dt_dCi(k)/sinttab(i+1) + dt_dCi1(k)= -dt_dCi1(k)/sinttab(i+1) + enddo + + do k=1,3 + dXX_Ctab(k,i)=dXX_Ci(k) + dXX_C1tab(k,i)=dXX_Ci1(k) + dYY_Ctab(k,i)=dYY_Ci(k) + dYY_C1tab(k,i)=dYY_Ci1(k) + dZZ_Ctab(k,i)=dZZ_Ci(k) + dZZ_C1tab(k,i)=dZZ_Ci1(k) + dXX_XYZtab(k,i)=dXX_XYZ(k) + dYY_XYZtab(k,i)=dYY_XYZ(k) + dZZ_XYZtab(k,i)=dZZ_XYZ(k) + enddo + + do k = 1,3 +c write (iout,*) "k",k," dxx_ci1",dxx_ci1(k)," dyy_ci1", +c & dyy_ci1(k)," dzz_ci1",dzz_ci1(k) +c write (iout,*) "k",k," dxx_ci",dxx_ci(k)," dyy_ci", +c & dyy_ci(k)," dzz_ci",dzz_ci(k) +c write (iout,*) "k",k," dt_dci",dt_dci(k)," dt_dci", +c & dt_dci(k) +c write (iout,*) "k",k," dxx_XYZ",dxx_XYZ(k)," dyy_XYZ", +c & dyy_XYZ(k)," dzz_XYZ",dzz_XYZ(k) + gscloc(k,i-1)=gscloc(k,i-1)+de_dxx*dxx_ci1(k) + & +de_dyy*dyy_ci1(k)+de_dzz*dzz_ci1(k)+de_dt*dt_dCi1(k) + gscloc(k,i)=gscloc(k,i)+de_dxx*dxx_Ci(k) + & +de_dyy*dyy_Ci(k)+de_dzz*dzz_Ci(k)+de_dt*dt_dCi(k) + gsclocx(k,i)= de_dxx*dxx_XYZ(k) + & +de_dyy*dyy_XYZ(k)+de_dzz*dzz_XYZ(k) + enddo +c write(iout,*) "ENERGY GRAD = ", (gscloc(k,i-1),k=1,3), +c & (gscloc(k,i),k=1,3),(gsclocx(k,i),k=1,3) + +C to check gradient call subroutine check_grad + + 1 continue + enddo + return + end +c------------------------------------------------------------------------------ + double precision function enesc(x,xx,yy,zz,cost2,sint2) + implicit none + double precision x(65),xx,yy,zz,cost2,sint2,sumene1,sumene2, + & sumene3,sumene4,sumene,dsc_i,dp2_i,dscp1,dscp2,s1,s1_6,s2,s2_6 + sumene1= x(1)+ x(2)*xx+ x(3)*yy+ x(4)*zz+ x(5)*xx**2 + & + x(6)*yy**2+ x(7)*zz**2+ x(8)*xx*zz+ x(9)*xx*yy + & + x(10)*yy*zz + sumene2= x(11) + x(12)*xx + x(13)*yy + x(14)*zz + x(15)*xx**2 + & + x(16)*yy**2 + x(17)*zz**2 + x(18)*xx*zz + x(19)*xx*yy + & + x(20)*yy*zz + sumene3= x(21) +x(22)*xx +x(23)*yy +x(24)*zz +x(25)*xx**2 + & +x(26)*yy**2 +x(27)*zz**2 +x(28)*xx*zz +x(29)*xx*yy + & +x(30)*yy*zz +x(31)*xx**3 +x(32)*yy**3 +x(33)*zz**3 + & +x(34)*(xx**2)*yy +x(35)*(xx**2)*zz +x(36)*(yy**2)*xx + & +x(37)*(yy**2)*zz +x(38)*(zz**2)*xx +x(39)*(zz**2)*yy + & +x(40)*xx*yy*zz + sumene4= x(41) +x(42)*xx +x(43)*yy +x(44)*zz +x(45)*xx**2 + & +x(46)*yy**2 +x(47)*zz**2 +x(48)*xx*zz +x(49)*xx*yy + & +x(50)*yy*zz +x(51)*xx**3 +x(52)*yy**3 +x(53)*zz**3 + & +x(54)*(xx**2)*yy +x(55)*(xx**2)*zz +x(56)*(yy**2)*xx + & +x(57)*(yy**2)*zz +x(58)*(zz**2)*xx +x(59)*(zz**2)*yy + & +x(60)*xx*yy*zz + dsc_i = 0.743d0+x(61) + dp2_i = 1.9d0+x(62) + dscp1=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2+yy*sint2)) + dscp2=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2-yy*sint2)) + s1=(1+x(63))/(0.1d0 + dscp1) + s1_6=(1+x(64))/(0.1d0 + dscp1**6) + s2=(1+x(65))/(0.1d0 + dscp2) + s2_6=(1+x(65))/(0.1d0 + dscp2**6) + sumene = ( sumene3*sint2 + sumene1)*(s1+s1_6) + & + (sumene4*cost2 +sumene2)*(s2+s2_6) + enesc=sumene + return + end +#endif +c------------------------------------------------------------------------------ + subroutine gcont(rij,r0ij,eps0ij,delta,fcont,fprimcont) +C +C This procedure calculates two-body contact function g(rij) and its derivative: +C +C eps0ij ! x < -1 +C g(rij) = esp0ij*(-0.9375*x+0.625*x**3-0.1875*x**5) ! -1 =< x =< 1 +C 0 ! x > 1 +C +C where x=(rij-r0ij)/delta +C +C rij - interbody distance, r0ij - contact distance, eps0ij - contact energy +C + implicit none + double precision rij,r0ij,eps0ij,fcont,fprimcont + double precision x,x2,x4,delta +c delta=0.02D0*r0ij +c delta=0.2D0*r0ij + x=(rij-r0ij)/delta + if (x.lt.-1.0D0) then + fcont=eps0ij + fprimcont=0.0D0 + else if (x.le.1.0D0) then + x2=x*x + x4=x2*x2 + fcont=eps0ij*(x*(-0.9375D0+0.6250D0*x2-0.1875D0*x4)+0.5D0) + fprimcont=eps0ij * (-0.9375D0+1.8750D0*x2-0.9375D0*x4)/delta + else + fcont=0.0D0 + fprimcont=0.0D0 + endif + return + end +c------------------------------------------------------------------------------ + subroutine splinthet(theti,delta,ss,ssder) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + thetup=pi-delta + thetlow=delta + if (theti.gt.pipol) then + call gcont(theti,thetup,1.0d0,delta,ss,ssder) + else + call gcont(-theti,-thetlow,1.0d0,delta,ss,ssder) + ssder=-ssder + endif + return + end +c------------------------------------------------------------------------------ + subroutine spline1(x,x0,delta,f0,f1,fprim0,f,fprim) + implicit none + double precision x,x0,delta,f0,f1,fprim0,f,fprim + double precision ksi,ksi2,ksi3,a1,a2,a3 + a1=fprim0*delta/(f1-f0) + a2=3.0d0-2.0d0*a1 + a3=a1-2.0d0 + ksi=(x-x0)/delta + ksi2=ksi*ksi + ksi3=ksi2*ksi + f=f0+(f1-f0)*ksi*(a1+ksi*(a2+a3*ksi)) + fprim=(f1-f0)/delta*(a1+ksi*(2*a2+3*ksi*a3)) + return + end +c------------------------------------------------------------------------------ + subroutine spline2(x,x0,delta,f0x,f1x,fprim0x,fx) + implicit none + double precision x,x0,delta,f0x,f1x,fprim0x,fx + double precision ksi,ksi2,ksi3,a1,a2,a3 + ksi=(x-x0)/delta + ksi2=ksi*ksi + ksi3=ksi2*ksi + a1=fprim0x*delta + a2=3*(f1x-f0x)-2*fprim0x*delta + a3=fprim0x*delta-2*(f1x-f0x) + fx=f0x+a1*ksi+a2*ksi2+a3*ksi3 + return + end +C----------------------------------------------------------------------------- +#ifdef CRYST_TOR +C----------------------------------------------------------------------------- + subroutine etor(etors,edihcnstr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors=0.0D0 + do i=iphi_start,iphi_end + etors_ii=0.0D0 + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + phii=phi(i) + gloci=0.0D0 +C Proline-Proline pair is a special case... + if (itori.eq.3 .and. itori1.eq.3) then + if (phii.gt.-dwapi3) then + cosphi=dcos(3*phii) + fac=1.0D0/(1.0D0-cosphi) + etorsi=v1(1,3,3)*fac + etorsi=etorsi+etorsi + etors=etors+etorsi-v1(1,3,3) + if (energy_dec) etors_ii=etors_ii+etorsi-v1(1,3,3) + gloci=gloci-3*fac*etorsi*dsin(3*phii) + endif + do j=1,3 + v1ij=v1(j+1,itori,itori1) + v2ij=v2(j+1,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + if (energy_dec) etors_ii=etors_ii+ + & v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + else + do j=1,nterm_old + v1ij=v1(j,itori,itori1) + v2ij=v2(j,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + if (energy_dec) etors_ii=etors_ii+ + & v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + endif + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'etor',i,etors_ii + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1(j,itori,itori1),j=1,6),(v2(j,itori,itori1),j=1,6) + gloc(i-3,icg)=gloc(i-3,icg)+wtor*gloci + write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg) + enddo +! 6/20/98 - dihedral angle constraints + edihcnstr=0.0d0 + do i=1,ndih_constr + itori=idih_constr(i) + phii=phi(itori) + difi=phii-phi0(i) + if (difi.gt.drange(i)) then + difi=difi-drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else if (difi.lt.-drange(i)) then + difi=difi+drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + endif +! write (iout,'(2i5,2f8.3,2e14.5)') i,itori,rad2deg*phii, +! & rad2deg*difi,0.25d0*ftors*difi**4,gloc(itori-3,icg) + enddo +! write (iout,*) 'edihcnstr',edihcnstr + return + end +c------------------------------------------------------------------------------ + subroutine etor_d(etors_d) + etors_d=0.0d0 + return + end +c---------------------------------------------------------------------------- +#else + subroutine etor(etors,edihcnstr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors=0.0D0 + do i=iphi_start,iphi_end + etors_ii=0.0D0 + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + phii=phi(i) + gloci=0.0D0 +C Regular cosine and sine terms + do j=1,nterm(itori,itori1) + v1ij=v1(j,itori,itori1) + v2ij=v2(j,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi + if (energy_dec) etors_ii=etors_ii+ + & v1ij*cosphi+v2ij*sinphi + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo +C Lorentz terms +C v1 +C E = SUM ----------------------------------- - v1 +C [v2 cos(phi/2)+v3 sin(phi/2)]^2 + 1 +C + cosphi=dcos(0.5d0*phii) + sinphi=dsin(0.5d0*phii) + do j=1,nlor(itori,itori1) + vl1ij=vlor1(j,itori,itori1) + vl2ij=vlor2(j,itori,itori1) + vl3ij=vlor3(j,itori,itori1) + pom=vl2ij*cosphi+vl3ij*sinphi + pom1=1.0d0/(pom*pom+1.0d0) + etors=etors+vl1ij*pom1 + if (energy_dec) etors_ii=etors_ii+ + & vl1ij*pom1 + pom=-pom*pom1*pom1 + gloci=gloci+vl1ij*(vl3ij*cosphi-vl2ij*sinphi)*pom + enddo +C Subtract the constant term + etors=etors-v0(itori,itori1) + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'etor',i,etors_ii-v0(itori,itori1) + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1(j,itori,itori1),j=1,6),(v2(j,itori,itori1),j=1,6) + gloc(i-3,icg)=gloc(i-3,icg)+wtor*gloci +c write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg) + enddo +! 6/20/98 - dihedral angle constraints + edihcnstr=0.0d0 +c do i=1,ndih_constr + do i=idihconstr_start,idihconstr_end + itori=idih_constr(i) + phii=phi(itori) + difi=pinorm(phii-phi0(i)) + if (difi.gt.drange(i)) then + difi=difi-drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else if (difi.lt.-drange(i)) then + difi=difi+drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else + difi=0.0 + endif +c write (iout,*) "gloci", gloc(i-3,icg) +cd write (iout,'(2i5,4f8.3,2e14.5)') i,itori,rad2deg*phii, +cd & rad2deg*phi0(i), rad2deg*drange(i), +cd & rad2deg*difi,0.25d0*ftors*difi**4,gloc(itori-3,icg) + enddo +cd write (iout,*) 'edihcnstr',edihcnstr + return + end +c---------------------------------------------------------------------------- + subroutine etor_d(etors_d) +C 6/23/01 Compute double torsional energy + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors_d=0.0D0 + do i=iphid_start,iphid_end + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + itori2=itortyp(itype(i)) + phii=phi(i) + phii1=phi(i+1) + gloci1=0.0D0 + gloci2=0.0D0 + do j=1,ntermd_1(itori,itori1,itori2) + v1cij=v1c(1,j,itori,itori1,itori2) + v1sij=v1s(1,j,itori,itori1,itori2) + v2cij=v1c(2,j,itori,itori1,itori2) + v2sij=v1s(2,j,itori,itori1,itori2) + cosphi1=dcos(j*phii) + sinphi1=dsin(j*phii) + cosphi2=dcos(j*phii1) + sinphi2=dsin(j*phii1) + etors_d=etors_d+v1cij*cosphi1+v1sij*sinphi1+ + & v2cij*cosphi2+v2sij*sinphi2 + gloci1=gloci1+j*(v1sij*cosphi1-v1cij*sinphi1) + gloci2=gloci2+j*(v2sij*cosphi2-v2cij*sinphi2) + enddo + do k=2,ntermd_2(itori,itori1,itori2) + do l=1,k-1 + v1cdij = v2c(k,l,itori,itori1,itori2) + v2cdij = v2c(l,k,itori,itori1,itori2) + v1sdij = v2s(k,l,itori,itori1,itori2) + v2sdij = v2s(l,k,itori,itori1,itori2) + cosphi1p2=dcos(l*phii+(k-l)*phii1) + cosphi1m2=dcos(l*phii-(k-l)*phii1) + sinphi1p2=dsin(l*phii+(k-l)*phii1) + sinphi1m2=dsin(l*phii-(k-l)*phii1) + etors_d=etors_d+v1cdij*cosphi1p2+v2cdij*cosphi1m2+ + & v1sdij*sinphi1p2+v2sdij*sinphi1m2 + gloci1=gloci1+l*(v1sdij*cosphi1p2+v2sdij*cosphi1m2 + & -v1cdij*sinphi1p2-v2cdij*sinphi1m2) + gloci2=gloci2+(k-l)*(v1sdij*cosphi1p2-v2sdij*cosphi1m2 + & -v1cdij*sinphi1p2+v2cdij*sinphi1m2) + enddo + enddo + gloc(i-3,icg)=gloc(i-3,icg)+wtor_d*gloci1 + gloc(i-2,icg)=gloc(i-2,icg)+wtor_d*gloci2 +c write (iout,*) "gloci", gloc(i-3,icg) + enddo + return + end +#endif +c------------------------------------------------------------------------------ + subroutine eback_sc_corr(esccor) +c 7/21/2007 Correlations between the backbone-local and side-chain-local +c conformational states; temporarily implemented as differences +c between UNRES torsional potentials (dependent on three types of +c residues) and the torsional potentials dependent on all 20 types +c of residues computed from AM1 energy surfaces of terminally-blocked +c amino-acid residues. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.SCCOR' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. +c write (iout,*) "EBACK_SC_COR",iphi_start,iphi_end,nterm_sccor + esccor=0.0D0 + do i=itau_start,itau_end + esccor_ii=0.0D0 + isccori=isccortyp(itype(i-2)) + isccori1=isccortyp(itype(i-1)) + phii=phi(i) +cccc Added 9 May 2012 +cc Tauangle is torsional engle depending on the value of first digit +c(see comment below) +cc Omicron is flat angle depending on the value of first digit +c(see comment below) + + + do intertyp=1,3 !intertyp +cc Added 09 May 2012 (Adasko) +cc Intertyp means interaction type of backbone mainchain correlation: +c 1 = SC...Ca...Ca...Ca +c 2 = Ca...Ca...Ca...SC +c 3 = SC...Ca...Ca...SCi + gloci=0.0D0 + if (((intertyp.eq.3).and.((itype(i-2).eq.10).or. + & (itype(i-1).eq.10).or.(itype(i-2).eq.21).or. + & (itype(i-1).eq.21))) + & .or. ((intertyp.eq.1).and.((itype(i-2).eq.10) + & .or.(itype(i-2).eq.21))) + & .or.((intertyp.eq.2).and.((itype(i-1).eq.10).or. + & (itype(i-1).eq.21)))) cycle + if ((intertyp.eq.2).and.(i.eq.4).and.(itype(1).eq.21)) cycle + if ((intertyp.eq.1).and.(i.eq.nres).and.(itype(nres).eq.21)) + & cycle + do j=1,nterm_sccor(isccori,isccori1) + v1ij=v1sccor(j,intertyp,isccori,isccori1) + v2ij=v2sccor(j,intertyp,isccori,isccori1) + cosphi=dcos(j*tauangle(intertyp,i)) + sinphi=dsin(j*tauangle(intertyp,i)) + esccor=esccor+v1ij*cosphi+v2ij*sinphi + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + gloc_sc(intertyp,i-3,icg)=gloc_sc(intertyp,i-3,icg)+wsccor*gloci +c write (iout,*) "WTF",intertyp,i,itype(i),v1ij*cosphi+v2ij*sinphi +c &gloc_sc(intertyp,i-3,icg) + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1sccor(j,intertyp,itori,itori1),j=1,6) + & ,(v2sccor(j,intertyp,itori,itori1),j=1,6) + gsccor_loc(i-3)=gsccor_loc(i-3)+gloci + enddo !intertyp + enddo +c do i=1,nres +c write (iout,*) "W@T@F", gloc_sc(1,i,icg),gloc(i,icg) +c enddo + return + end +c---------------------------------------------------------------------------- + subroutine multibody(ecorr) +C This subroutine calculates multi-body contributions to energy following +C the idea of Skolnick et al. If side chains I and J make a contact and +C at the same time side chains I+1 and J+1 make a contact, an extra +C contribution equal to sqrt(eps(i,j)*eps(i+1,j+1)) is added. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + +C Set lprn=.true. for debugging + lprn=.false. + + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(i2,20(1x,i2,f10.5))') + & i,(jcont(j,i),facont(j,i),j=1,num_cont(i)) + enddo + endif + ecorr=0.0D0 + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo + do i=nnt,nct-2 + + DO ISHIFT = 3,4 + + i1=i+ishift + num_conti=num_cont(i) + num_conti1=num_cont(i1) + do jj=1,num_conti + j=jcont(jj,i) + do kk=1,num_conti1 + j1=jcont(kk,i1) + if (j1.eq.j+ishift .or. j1.eq.j-ishift) then +cd write(iout,*)'i=',i,' j=',j,' i1=',i1,' j1=',j1, +cd & ' ishift=',ishift +C Contacts I--J and I+ISHIFT--J+-ISHIFT1 occur simultaneously. +C The system gains extra energy. + ecorr=ecorr+esccorr(i,j,i1,j1,jj,kk) + endif ! j1==j+-ishift + enddo ! kk + enddo ! jj + + ENDDO ! ISHIFT + + enddo ! i + return + end +c------------------------------------------------------------------------------ + double precision function esccorr(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + lprn=.false. + eij=facont(jj,i) + ekl=facont(kk,k) +cd write (iout,'(4i5,3f10.5)') i,j,k,l,eij,ekl,-eij*ekl +C Calculate the multi-body contribution to energy. +C Calculate multi-body contributions to the gradient. +cd write (iout,'(2(2i3,3f10.5))')i,j,(gacont(m,jj,i),m=1,3), +cd & k,l,(gacont(m,kk,k),m=1,3) + do m=1,3 + gx(m) =ekl*gacont(m,jj,i) + gx1(m)=eij*gacont(m,kk,k) + gradxorr(m,i)=gradxorr(m,i)-gx(m) + gradxorr(m,j)=gradxorr(m,j)+gx(m) + gradxorr(m,k)=gradxorr(m,k)-gx1(m) + gradxorr(m,l)=gradxorr(m,l)+gx1(m) + enddo + do m=i,j-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+gx(ll) + enddo + enddo + do m=k,l-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+gx1(ll) + enddo + enddo + esccorr=-eij*ekl + return + end +c------------------------------------------------------------------------------ + subroutine multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) +C This subroutine calculates multi-body contributions to hydrogen-bonding + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPI + include "mpif.h" + parameter (max_cont=maxconts) + parameter (max_dim=26) + integer source,CorrelType,CorrelID,CorrelType1,CorrelID1,Error + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer status(MPI_STATUS_SIZE),req(maxconts*2), + & status_array(MPI_STATUS_SIZE,maxconts*2) +#endif + include 'COMMON.SETUP' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.LOCAL' + double precision gx(3),gx1(3),time00 + logical lprn,ldone + +C Set lprn=.true. for debugging + lprn=.false. +#ifdef MPI + n_corr=0 + n_corr1=0 + if (nfgtasks.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values before RECEIVE:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + call flush(iout) + do i=1,ntask_cont_from + ncont_recv(i)=0 + enddo + do i=1,ntask_cont_to + ncont_sent(i)=0 + enddo +c write (iout,*) "ntask_cont_from",ntask_cont_from," ntask_cont_to", +c & ntask_cont_to +C Make the list of contacts to send to send to other procesors +c write (iout,*) "limits",max0(iturn4_end-1,iatel_s),iturn3_end +c call flush(iout) + do i=iturn3_start,iturn3_end +c write (iout,*) "make contact list turn3",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact(i,i+2,iturn3_sent_local(1,i)) + enddo + do i=iturn4_start,iturn4_end +c write (iout,*) "make contact list turn4",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact(i,i+3,iturn4_sent_local(1,i)) + enddo + do ii=1,nat_sent + i=iat_sent(ii) +c write (iout,*) "make contact list longrange",i,ii," num_cont", +c & num_cont_hb(i) + do j=1,num_cont_hb(i) + do k=1,4 + jjc=jcont_hb(j,i) + iproc=iint_sent_local(k,jjc,ii) +c write (iout,*) "i",i," j",j," k",k," jjc",jjc," iproc",iproc + if (iproc.gt.0) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=i + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=facont_hb(j,i) + zapas(4,nn,iproc)=ees0p(j,i) + zapas(5,nn,iproc)=ees0m(j,i) + zapas(6,nn,iproc)=gacont_hbr(1,j,i) + zapas(7,nn,iproc)=gacont_hbr(2,j,i) + zapas(8,nn,iproc)=gacont_hbr(3,j,i) + zapas(9,nn,iproc)=gacontm_hb1(1,j,i) + zapas(10,nn,iproc)=gacontm_hb1(2,j,i) + zapas(11,nn,iproc)=gacontm_hb1(3,j,i) + zapas(12,nn,iproc)=gacontp_hb1(1,j,i) + zapas(13,nn,iproc)=gacontp_hb1(2,j,i) + zapas(14,nn,iproc)=gacontp_hb1(3,j,i) + zapas(15,nn,iproc)=gacontm_hb2(1,j,i) + zapas(16,nn,iproc)=gacontm_hb2(2,j,i) + zapas(17,nn,iproc)=gacontm_hb2(3,j,i) + zapas(18,nn,iproc)=gacontp_hb2(1,j,i) + zapas(19,nn,iproc)=gacontp_hb2(2,j,i) + zapas(20,nn,iproc)=gacontp_hb2(3,j,i) + zapas(21,nn,iproc)=gacontm_hb3(1,j,i) + zapas(22,nn,iproc)=gacontm_hb3(2,j,i) + zapas(23,nn,iproc)=gacontm_hb3(3,j,i) + zapas(24,nn,iproc)=gacontp_hb3(1,j,i) + zapas(25,nn,iproc)=gacontp_hb3(2,j,i) + zapas(26,nn,iproc)=gacontp_hb3(3,j,i) + endif + enddo + enddo + enddo + if (lprn) then + write (iout,*) + & "Numbers of contacts to be sent to other processors", + & (ncont_sent(i),i=1,ntask_cont_to) + write (iout,*) "Contacts sent" + do ii=1,ntask_cont_to + nn=ncont_sent(ii) + iproc=itask_cont_to(ii) + write (iout,*) nn," contacts to processor",iproc, + & " of CONT_TO_COMM group" + do i=1,nn + write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) + enddo + enddo + call flush(iout) + endif + CorrelType=477 + CorrelID=fg_rank+1 + CorrelType1=478 + CorrelID1=nfgtasks+fg_rank+1 + ireq=0 +C Receive the numbers of needed contacts from other processors + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + ireq=ireq+1 + call MPI_Irecv(ncont_recv(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "IRECV ended" +c call flush(iout) +C Send the number of contacts needed by other processors + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + ireq=ireq+1 + call MPI_Isend(ncont_sent(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "ISEND ended" +c write (iout,*) "number of requests (nn)",ireq + call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) +c write (iout,*) +c & "Numbers of contacts to be received from other processors", +c & (ncont_recv(i),i=1,ntask_cont_from) +c call flush(iout) +C Receive contacts + ireq=0 + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + nn=ncont_recv(ii) +c write (iout,*) "Receiving",nn," contacts from processor",iproc, +c & " of CONT_TO_COMM group" + call flush(iout) + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Irecv(zapas_recv(1,1,ii),nn*max_dim, + & MPI_DOUBLE_PRECISION,iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) + endif + enddo +C Send the contacts to processors that need them + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + nn=ncont_sent(ii) +c write (iout,*) nn," contacts to processor",iproc, +c & " of CONT_TO_COMM group" + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Isend(zapas(1,1,ii),nn*max_dim,MPI_DOUBLE_PRECISION, + & iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) +c do i=1,nn +c write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) +c enddo + endif + enddo +c write (iout,*) "number of requests (contacts)",ireq +c write (iout,*) "req",(req(i),i=1,4) +c call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) + do iii=1,ntask_cont_from + iproc=itask_cont_from(iii) + nn=ncont_recv(iii) + if (lprn) then + write (iout,*) "Received",nn," contacts from processor",iproc, + & " of CONT_FROM_COMM group" + call flush(iout) + do i=1,nn + write(iout,'(2f5.0,4f10.5)')(zapas_recv(j,i,iii),j=1,5) + enddo + call flush(iout) + endif + do i=1,nn + ii=zapas_recv(1,i,iii) +c Flag the received contacts to prevent double-counting + jj=-zapas_recv(2,i,iii) +c write (iout,*) "iii",iii," i",i," ii",ii," jj",jj +c call flush(iout) + nnn=num_cont_hb(ii)+1 + num_cont_hb(ii)=nnn + jcont_hb(nnn,ii)=jj + facont_hb(nnn,ii)=zapas_recv(3,i,iii) + ees0p(nnn,ii)=zapas_recv(4,i,iii) + ees0m(nnn,ii)=zapas_recv(5,i,iii) + gacont_hbr(1,nnn,ii)=zapas_recv(6,i,iii) + gacont_hbr(2,nnn,ii)=zapas_recv(7,i,iii) + gacont_hbr(3,nnn,ii)=zapas_recv(8,i,iii) + gacontm_hb1(1,nnn,ii)=zapas_recv(9,i,iii) + gacontm_hb1(2,nnn,ii)=zapas_recv(10,i,iii) + gacontm_hb1(3,nnn,ii)=zapas_recv(11,i,iii) + gacontp_hb1(1,nnn,ii)=zapas_recv(12,i,iii) + gacontp_hb1(2,nnn,ii)=zapas_recv(13,i,iii) + gacontp_hb1(3,nnn,ii)=zapas_recv(14,i,iii) + gacontm_hb2(1,nnn,ii)=zapas_recv(15,i,iii) + gacontm_hb2(2,nnn,ii)=zapas_recv(16,i,iii) + gacontm_hb2(3,nnn,ii)=zapas_recv(17,i,iii) + gacontp_hb2(1,nnn,ii)=zapas_recv(18,i,iii) + gacontp_hb2(2,nnn,ii)=zapas_recv(19,i,iii) + gacontp_hb2(3,nnn,ii)=zapas_recv(20,i,iii) + gacontm_hb3(1,nnn,ii)=zapas_recv(21,i,iii) + gacontm_hb3(2,nnn,ii)=zapas_recv(22,i,iii) + gacontm_hb3(3,nnn,ii)=zapas_recv(23,i,iii) + gacontp_hb3(1,nnn,ii)=zapas_recv(24,i,iii) + gacontp_hb3(2,nnn,ii)=zapas_recv(25,i,iii) + gacontp_hb3(3,nnn,ii)=zapas_recv(26,i,iii) + enddo + enddo + call flush(iout) + if (lprn) then + write (iout,'(a)') 'Contact function values after receive:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + call flush(iout) + endif + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + ecorr=0.0D0 +C Remove the loop below after debugging !!! + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo +C Calculate the local-electrostatic correlation terms + do i=min0(iatel_s,iturn4_start),max0(iatel_e,iturn3_end) + i1=i+1 + num_conti=num_cont_hb(i) + num_conti1=num_cont_hb(i+1) + do jj=1,num_conti + j=jcont_hb(jj,i) + jp=iabs(j) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) + jp1=iabs(j1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if ((j.gt.0 .and. j1.gt.0 .or. j.gt.0 .and. j1.lt.0 + & .or. j.lt.0 .and. j1.gt.0) .and. + & (jp1.eq.jp+1 .or. jp1.eq.jp-1)) then +C Contacts I-J and (I+1)-(J+1) or (I+1)-(J-1) occur simultaneously. +C The system gains extra energy. + ecorr=ecorr+ehbcorr(i,jp,i+1,jp1,jj,kk,0.72D0,0.32D0) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'ecorrh',i,j,ehbcorr(i,j,i+1,j1,jj,kk,0.72D0,0.32D0) + n_corr=n_corr+1 + else if (j1.eq.j) then +C Contacts I-J and I-(J+1) occur simultaneously. +C The system loses extra energy. +c ecorr=ecorr+ehbcorr(i,j,i+1,j,jj,kk,0.60D0,-0.40D0) + endif + enddo ! kk + do kk=1,num_conti + j1=jcont_hb(kk,i) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if (j1.eq.j+1) then +C Contacts I-J and (I+1)-J occur simultaneously. +C The system loses extra energy. +c ecorr=ecorr+ehbcorr(i,j,i,j+1,jj,kk,0.60D0,-0.40D0) + endif ! j1==j+1 + enddo ! kk + enddo ! jj + enddo ! i + return + end +c------------------------------------------------------------------------------ + subroutine add_hb_contact(ii,jj,itask) + implicit real*8 (a-h,o-z) + include "DIMENSIONS" + include "COMMON.IOUNITS" + integer max_cont + integer max_dim + parameter (max_cont=maxconts) + parameter (max_dim=26) + include "COMMON.CONTACTS" + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer i,j,ii,jj,iproc,itask(4),nn +c write (iout,*) "itask",itask + do i=1,2 + iproc=itask(i) + if (iproc.gt.0) then + do j=1,num_cont_hb(ii) + jjc=jcont_hb(j,ii) +c write (iout,*) "i",ii," j",jj," jjc",jjc + if (jjc.eq.jj) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=ii + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=facont_hb(j,ii) + zapas(4,nn,iproc)=ees0p(j,ii) + zapas(5,nn,iproc)=ees0m(j,ii) + zapas(6,nn,iproc)=gacont_hbr(1,j,ii) + zapas(7,nn,iproc)=gacont_hbr(2,j,ii) + zapas(8,nn,iproc)=gacont_hbr(3,j,ii) + zapas(9,nn,iproc)=gacontm_hb1(1,j,ii) + zapas(10,nn,iproc)=gacontm_hb1(2,j,ii) + zapas(11,nn,iproc)=gacontm_hb1(3,j,ii) + zapas(12,nn,iproc)=gacontp_hb1(1,j,ii) + zapas(13,nn,iproc)=gacontp_hb1(2,j,ii) + zapas(14,nn,iproc)=gacontp_hb1(3,j,ii) + zapas(15,nn,iproc)=gacontm_hb2(1,j,ii) + zapas(16,nn,iproc)=gacontm_hb2(2,j,ii) + zapas(17,nn,iproc)=gacontm_hb2(3,j,ii) + zapas(18,nn,iproc)=gacontp_hb2(1,j,ii) + zapas(19,nn,iproc)=gacontp_hb2(2,j,ii) + zapas(20,nn,iproc)=gacontp_hb2(3,j,ii) + zapas(21,nn,iproc)=gacontm_hb3(1,j,ii) + zapas(22,nn,iproc)=gacontm_hb3(2,j,ii) + zapas(23,nn,iproc)=gacontm_hb3(3,j,ii) + zapas(24,nn,iproc)=gacontp_hb3(1,j,ii) + zapas(25,nn,iproc)=gacontp_hb3(2,j,ii) + zapas(26,nn,iproc)=gacontp_hb3(3,j,ii) + exit + endif + enddo + endif + enddo + return + end +c------------------------------------------------------------------------------ + subroutine multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr, + & n_corr1) +C This subroutine calculates multi-body contributions to hydrogen-bonding + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPI + include "mpif.h" + parameter (max_cont=maxconts) + parameter (max_dim=70) + integer source,CorrelType,CorrelID,CorrelType1,CorrelID1,Error + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer status(MPI_STATUS_SIZE),req(maxconts*2), + & status_array(MPI_STATUS_SIZE,maxconts*2) +#endif + include 'COMMON.SETUP' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.CONTROL' + double precision gx(3),gx1(3) + integer num_cont_hb_old(maxres) + logical lprn,ldone + double precision eello4,eello5,eelo6,eello_turn6 + external eello4,eello5,eello6,eello_turn6 +C Set lprn=.true. for debugging + lprn=.false. + eturn6=0.0d0 +#ifdef MPI + do i=1,nres + num_cont_hb_old(i)=num_cont_hb(i) + enddo + n_corr=0 + n_corr1=0 + if (nfgtasks.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values before RECEIVE:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + call flush(iout) + do i=1,ntask_cont_from + ncont_recv(i)=0 + enddo + do i=1,ntask_cont_to + ncont_sent(i)=0 + enddo +c write (iout,*) "ntask_cont_from",ntask_cont_from," ntask_cont_to", +c & ntask_cont_to +C Make the list of contacts to send to send to other procesors + do i=iturn3_start,iturn3_end +c write (iout,*) "make contact list turn3",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact_eello(i,i+2,iturn3_sent_local(1,i)) + enddo + do i=iturn4_start,iturn4_end +c write (iout,*) "make contact list turn4",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact_eello(i,i+3,iturn4_sent_local(1,i)) + enddo + do ii=1,nat_sent + i=iat_sent(ii) +c write (iout,*) "make contact list longrange",i,ii," num_cont", +c & num_cont_hb(i) + do j=1,num_cont_hb(i) + do k=1,4 + jjc=jcont_hb(j,i) + iproc=iint_sent_local(k,jjc,ii) +c write (iout,*) "i",i," j",j," k",k," jjc",jjc," iproc",iproc + if (iproc.ne.0) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=i + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=d_cont(j,i) + ind=3 + do kk=1,3 + ind=ind+1 + zapas(ind,nn,iproc)=grij_hb_cont(kk,j,i) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj(ll,kk,j,i) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj_der(mm,ll,kk,jj,j,i) + enddo + enddo + enddo + enddo + endif + enddo + enddo + enddo + if (lprn) then + write (iout,*) + & "Numbers of contacts to be sent to other processors", + & (ncont_sent(i),i=1,ntask_cont_to) + write (iout,*) "Contacts sent" + do ii=1,ntask_cont_to + nn=ncont_sent(ii) + iproc=itask_cont_to(ii) + write (iout,*) nn," contacts to processor",iproc, + & " of CONT_TO_COMM group" + do i=1,nn + write(iout,'(2f5.0,10f10.5)')(zapas(j,i,ii),j=1,10) + enddo + enddo + call flush(iout) + endif + CorrelType=477 + CorrelID=fg_rank+1 + CorrelType1=478 + CorrelID1=nfgtasks+fg_rank+1 + ireq=0 +C Receive the numbers of needed contacts from other processors + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + ireq=ireq+1 + call MPI_Irecv(ncont_recv(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "IRECV ended" +c call flush(iout) +C Send the number of contacts needed by other processors + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + ireq=ireq+1 + call MPI_Isend(ncont_sent(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "ISEND ended" +c write (iout,*) "number of requests (nn)",ireq + call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) +c write (iout,*) +c & "Numbers of contacts to be received from other processors", +c & (ncont_recv(i),i=1,ntask_cont_from) +c call flush(iout) +C Receive contacts + ireq=0 + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + nn=ncont_recv(ii) +c write (iout,*) "Receiving",nn," contacts from processor",iproc, +c & " of CONT_TO_COMM group" + call flush(iout) + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Irecv(zapas_recv(1,1,ii),nn*max_dim, + & MPI_DOUBLE_PRECISION,iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) + endif + enddo +C Send the contacts to processors that need them + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + nn=ncont_sent(ii) +c write (iout,*) nn," contacts to processor",iproc, +c & " of CONT_TO_COMM group" + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Isend(zapas(1,1,ii),nn*max_dim,MPI_DOUBLE_PRECISION, + & iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) +c do i=1,nn +c write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) +c enddo + endif + enddo +c write (iout,*) "number of requests (contacts)",ireq +c write (iout,*) "req",(req(i),i=1,4) +c call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) + do iii=1,ntask_cont_from + iproc=itask_cont_from(iii) + nn=ncont_recv(iii) + if (lprn) then + write (iout,*) "Received",nn," contacts from processor",iproc, + & " of CONT_FROM_COMM group" + call flush(iout) + do i=1,nn + write(iout,'(2f5.0,10f10.5)')(zapas_recv(j,i,iii),j=1,10) + enddo + call flush(iout) + endif + do i=1,nn + ii=zapas_recv(1,i,iii) +c Flag the received contacts to prevent double-counting + jj=-zapas_recv(2,i,iii) +c write (iout,*) "iii",iii," i",i," ii",ii," jj",jj +c call flush(iout) + nnn=num_cont_hb(ii)+1 + num_cont_hb(ii)=nnn + jcont_hb(nnn,ii)=jj + d_cont(nnn,ii)=zapas_recv(3,i,iii) + ind=3 + do kk=1,3 + ind=ind+1 + grij_hb_cont(kk,nnn,ii)=zapas_recv(ind,i,iii) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + a_chuj(ll,kk,nnn,ii)=zapas_recv(ind,i,iii) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + a_chuj_der(mm,ll,kk,jj,nnn,ii)=zapas_recv(ind,i,iii) + enddo + enddo + enddo + enddo + enddo + enddo + call flush(iout) + if (lprn) then + write (iout,'(a)') 'Contact function values after receive:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,5f6.3))') + & i,num_cont_hb(i),(jcont_hb(j,i),d_cont(j,i), + & ((a_chuj(ll,kk,j,i),ll=1,2),kk=1,2),j=1,num_cont_hb(i)) + enddo + call flush(iout) + endif + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,5f6.3))') + & i,num_cont_hb(i),(jcont_hb(j,i),d_cont(j,i), + & ((a_chuj(ll,kk,j,i),ll=1,2),kk=1,2),j=1,num_cont_hb(i)) + enddo + endif + ecorr=0.0D0 + ecorr5=0.0d0 + ecorr6=0.0d0 +C Remove the loop below after debugging !!! + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo +C Calculate the dipole-dipole interaction energies + if (wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0) then + do i=iatel_s,iatel_e+1 + num_conti=num_cont_hb(i) + do jj=1,num_conti + j=jcont_hb(jj,i) +#ifdef MOMENT + call dipole(i,j,jj) +#endif + enddo + enddo + endif +C Calculate the local-electrostatic correlation terms +c write (iout,*) "gradcorr5 in eello5 before loop" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + do i=min0(iatel_s,iturn4_start),max0(iatel_e+1,iturn3_end+1) +c write (iout,*) "corr loop i",i + i1=i+1 + num_conti=num_cont_hb(i) + num_conti1=num_cont_hb(i+1) + do jj=1,num_conti + j=jcont_hb(jj,i) + jp=iabs(j) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) + jp1=iabs(j1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk +c if (j1.eq.j+1 .or. j1.eq.j-1) then + if ((j.gt.0 .and. j1.gt.0 .or. j.gt.0 .and. j1.lt.0 + & .or. j.lt.0 .and. j1.gt.0) .and. + & (jp1.eq.jp+1 .or. jp1.eq.jp-1)) then +C Contacts I-J and (I+1)-(J+1) or (I+1)-(J-1) occur simultaneously. +C The system gains extra energy. + n_corr=n_corr+1 + sqd1=dsqrt(d_cont(jj,i)) + sqd2=dsqrt(d_cont(kk,i1)) + sred_geom = sqd1*sqd2 + IF (sred_geom.lt.cutoff_corr) THEN + call gcont(sred_geom,r0_corr,1.0D0,delt_corr, + & ekont,fprimcont) +cd write (iout,*) 'i=',i,' j=',jp,' i1=',i1,' j1=',jp1, +cd & ' jj=',jj,' kk=',kk + fac_prim1=0.5d0*sqd2/sqd1*fprimcont + fac_prim2=0.5d0*sqd1/sqd2*fprimcont + do l=1,3 + g_contij(l,1)=fac_prim1*grij_hb_cont(l,jj,i) + g_contij(l,2)=fac_prim2*grij_hb_cont(l,kk,i1) + enddo + n_corr1=n_corr1+1 +cd write (iout,*) 'sred_geom=',sred_geom, +cd & ' ekont=',ekont,' fprim=',fprimcont, +cd & ' fac_prim1',fac_prim1,' fac_prim2',fac_prim2 +cd write (iout,*) "g_contij",g_contij +cd write (iout,*) "grij_hb_cont i",grij_hb_cont(:,jj,i) +cd write (iout,*) "grij_hb_cont i1",grij_hb_cont(:,jj,i1) + call calc_eello(i,jp,i+1,jp1,jj,kk) + if (wcorr4.gt.0.0d0) + & ecorr=ecorr+eello4(i,jp,i+1,jp1,jj,kk) + if (energy_dec.and.wcorr4.gt.0.0d0) + 1 write (iout,'(a6,4i5,0pf7.3)') + 2 'ecorr4',i,j,i+1,j1,eello4(i,jp,i+1,jp1,jj,kk) +c write (iout,*) "gradcorr5 before eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + if (wcorr5.gt.0.0d0) + & ecorr5=ecorr5+eello5(i,jp,i+1,jp1,jj,kk) +c write (iout,*) "gradcorr5 after eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + if (energy_dec.and.wcorr5.gt.0.0d0) + 1 write (iout,'(a6,4i5,0pf7.3)') + 2 'ecorr5',i,j,i+1,j1,eello5(i,jp,i+1,jp1,jj,kk) +cd write(2,*)'wcorr6',wcorr6,' wturn6',wturn6 +cd write(2,*)'ijkl',i,jp,i+1,jp1 + if (wcorr6.gt.0.0d0 .and. (jp.ne.i+4 .or. jp1.ne.i+3 + & .or. wturn6.eq.0.0d0))then +cd write (iout,*) '******ecorr6: i,j,i+1,j1',i,j,i+1,j1 + ecorr6=ecorr6+eello6(i,jp,i+1,jp1,jj,kk) + if (energy_dec) write (iout,'(a6,4i5,0pf7.3)') + 1 'ecorr6',i,j,i+1,j1,eello6(i,jp,i+1,jp1,jj,kk) +cd write (iout,*) 'ecorr',ecorr,' ecorr5=',ecorr5, +cd & 'ecorr6=',ecorr6 +cd write (iout,'(4e15.5)') sred_geom, +cd & dabs(eello4(i,jp,i+1,jp1,jj,kk)), +cd & dabs(eello5(i,jp,i+1,jp1,jj,kk)), +cd & dabs(eello6(i,jp,i+1,jp1,jj,kk)) + else if (wturn6.gt.0.0d0 + & .and. (jp.eq.i+4 .and. jp1.eq.i+3)) then +cd write (iout,*) '******eturn6: i,j,i+1,j1',i,jip,i+1,jp1 + eturn6=eturn6+eello_turn6(i,jj,kk) + if (energy_dec) write (iout,'(a6,4i5,0pf7.3)') + 1 'eturn6',i,j,i+1,j1,eello_turn6(i,jj,kk) +cd write (2,*) 'multibody_eello:eturn6',eturn6 + endif + ENDIF +1111 continue + endif + enddo ! kk + enddo ! jj + enddo ! i + do i=1,nres + num_cont_hb(i)=num_cont_hb_old(i) + enddo +c write (iout,*) "gradcorr5 in eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + return + end +c------------------------------------------------------------------------------ + subroutine add_hb_contact_eello(ii,jj,itask) + implicit real*8 (a-h,o-z) + include "DIMENSIONS" + include "COMMON.IOUNITS" + integer max_cont + integer max_dim + parameter (max_cont=maxconts) + parameter (max_dim=70) + include "COMMON.CONTACTS" + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer i,j,ii,jj,iproc,itask(4),nn +c write (iout,*) "itask",itask + do i=1,2 + iproc=itask(i) + if (iproc.gt.0) then + do j=1,num_cont_hb(ii) + jjc=jcont_hb(j,ii) +c write (iout,*) "send turns i",ii," j",jj," jjc",jjc + if (jjc.eq.jj) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=ii + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=d_cont(j,ii) + ind=3 + do kk=1,3 + ind=ind+1 + zapas(ind,nn,iproc)=grij_hb_cont(kk,j,ii) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj(ll,kk,j,ii) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj_der(mm,ll,kk,jj,j,ii) + enddo + enddo + enddo + enddo + exit + endif + enddo + endif + enddo + return + end +c------------------------------------------------------------------------------ + double precision function ehbcorr(i,j,k,l,jj,kk,coeffp,coeffm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + lprn=.false. + eij=facont_hb(jj,i) + ekl=facont_hb(kk,k) + ees0pij=ees0p(jj,i) + ees0pkl=ees0p(kk,k) + ees0mij=ees0m(jj,i) + ees0mkl=ees0m(kk,k) + ekont=eij*ekl + ees=-(coeffp*ees0pij*ees0pkl+coeffm*ees0mij*ees0mkl) +cd ees=-(coeffp*ees0pkl+coeffm*ees0mkl) +C Following 4 lines for diagnostics. +cd ees0pkl=0.0D0 +cd ees0pij=1.0D0 +cd ees0mkl=0.0D0 +cd ees0mij=1.0D0 +c write (iout,'(2(a,2i3,a,f10.5,a,2f10.5),a,f10.5,a,$)') +c & 'Contacts ',i,j, +c & ' eij',eij,' eesij',ees0pij,ees0mij,' and ',k,l +c & ,' fcont ',ekl,' eeskl',ees0pkl,ees0mkl,' energy=',ekont*ees, +c & 'gradcorr_long' +C Calculate the multi-body contribution to energy. +c ecorr=ecorr+ekont*ees +C Calculate multi-body contributions to the gradient. + coeffpees0pij=coeffp*ees0pij + coeffmees0mij=coeffm*ees0mij + coeffpees0pkl=coeffp*ees0pkl + coeffmees0mkl=coeffm*ees0mkl + do ll=1,3 +cgrad ghalfi=ees*ekl*gacont_hbr(ll,jj,i) + gradcorr(ll,i)=gradcorr(ll,i)!+0.5d0*ghalfi + & -ekont*(coeffpees0pkl*gacontp_hb1(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb1(ll,jj,i)) + gradcorr(ll,j)=gradcorr(ll,j)!+0.5d0*ghalfi + & -ekont*(coeffpees0pkl*gacontp_hb2(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb2(ll,jj,i)) +cgrad ghalfk=ees*eij*gacont_hbr(ll,kk,k) + gradcorr(ll,k)=gradcorr(ll,k)!+0.5d0*ghalfk + & -ekont*(coeffpees0pij*gacontp_hb1(ll,kk,k)+ + & coeffmees0mij*gacontm_hb1(ll,kk,k)) + gradcorr(ll,l)=gradcorr(ll,l)!+0.5d0*ghalfk + & -ekont*(coeffpees0pij*gacontp_hb2(ll,kk,k)+ + & coeffmees0mij*gacontm_hb2(ll,kk,k)) + gradlongij=ees*ekl*gacont_hbr(ll,jj,i)- + & ekont*(coeffpees0pkl*gacontp_hb3(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb3(ll,jj,i)) + gradcorr_long(ll,j)=gradcorr_long(ll,j)+gradlongij + gradcorr_long(ll,i)=gradcorr_long(ll,i)-gradlongij + gradlongkl=ees*eij*gacont_hbr(ll,kk,k)- + & ekont*(coeffpees0pij*gacontp_hb3(ll,kk,k)+ + & coeffmees0mij*gacontm_hb3(ll,kk,k)) + gradcorr_long(ll,l)=gradcorr_long(ll,l)+gradlongkl + gradcorr_long(ll,k)=gradcorr_long(ll,k)-gradlongkl +c write (iout,'(2f10.5,2x,$)') gradlongij,gradlongkl + enddo +c write (iout,*) +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ +cgrad & ees*ekl*gacont_hbr(ll,jj,i)- +cgrad & ekont*(coeffp*ees0pkl*gacontp_hb3(ll,jj,i)+ +cgrad & coeffm*ees0mkl*gacontm_hb3(ll,jj,i)) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ +cgrad & ees*eij*gacont_hbr(ll,kk,k)- +cgrad & ekont*(coeffp*ees0pij*gacontp_hb3(ll,kk,k)+ +cgrad & coeffm*ees0mij*gacontm_hb3(ll,kk,k)) +cgrad enddo +cgrad enddo +c write (iout,*) "ehbcorr",ekont*ees + ehbcorr=ekont*ees + return + end +#ifdef MOMENT +C--------------------------------------------------------------------------- + subroutine dipole(i,j,jj) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + dimension dipi(2,2),dipj(2,2),dipderi(2),dipderj(2),auxvec(2), + & auxmat(2,2) + iti1 = itortyp(itype(i+1)) + if (j.lt.nres-1) then + itj1 = itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + do iii=1,2 + dipi(iii,1)=Ub2(iii,i) + dipderi(iii)=Ub2der(iii,i) + dipi(iii,2)=b1(iii,iti1) + dipj(iii,1)=Ub2(iii,j) + dipderj(iii)=Ub2der(iii,j) + dipj(iii,2)=b1(iii,itj1) + enddo + kkk=0 + do iii=1,2 + call matvec2(a_chuj(1,1,jj,i),dipj(1,iii),auxvec(1)) + do jjj=1,2 + kkk=kkk+1 + dip(kkk,jj,i)=scalar2(dipi(1,jjj),auxvec(1)) + enddo + enddo + do kkk=1,5 + do lll=1,3 + mmm=0 + do iii=1,2 + call matvec2(a_chuj_der(1,1,lll,kkk,jj,i),dipj(1,iii), + & auxvec(1)) + do jjj=1,2 + mmm=mmm+1 + dipderx(lll,kkk,mmm,jj,i)=scalar2(dipi(1,jjj),auxvec(1)) + enddo + enddo + enddo + enddo + call transpose2(a_chuj(1,1,jj,i),auxmat(1,1)) + call matvec2(auxmat(1,1),dipderi(1),auxvec(1)) + do iii=1,2 + dipderg(iii,jj,i)=scalar2(auxvec(1),dipj(1,iii)) + enddo + call matvec2(a_chuj(1,1,jj,i),dipderj(1),auxvec(1)) + do iii=1,2 + dipderg(iii+2,jj,i)=scalar2(auxvec(1),dipi(1,iii)) + enddo + return + end +#endif +C--------------------------------------------------------------------------- + subroutine calc_eello(i,j,k,l,jj,kk) +C +C This subroutine computes matrices and vectors needed to calculate +C the fourth-, fifth-, and sixth-order local-electrostatic terms. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision aa1(2,2),aa2(2,2),aa1t(2,2),aa2t(2,2), + & aa1tder(2,2,3,5),aa2tder(2,2,3,5),auxmat(2,2) + logical lprn + common /kutas/ lprn +cd write (iout,*) 'calc_eello: i=',i,' j=',j,' k=',k,' l=',l, +cd & ' jj=',jj,' kk=',kk +cd if (i.ne.2 .or. j.ne.4 .or. k.ne.3 .or. l.ne.5) return +cd write (iout,*) "a_chujij",((a_chuj(iii,jjj,jj,i),iii=1,2),jjj=1,2) +cd write (iout,*) "a_chujkl",((a_chuj(iii,jjj,kk,k),iii=1,2),jjj=1,2) + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=a_chuj(iii,jjj,jj,i) + aa2(iii,jjj)=a_chuj(iii,jjj,kk,k) + enddo + enddo + call transpose2(aa1(1,1),aa1t(1,1)) + call transpose2(aa2(1,1),aa2t(1,1)) + do kkk=1,5 + do lll=1,3 + call transpose2(a_chuj_der(1,1,lll,kkk,jj,i), + & aa1tder(1,1,lll,kkk)) + call transpose2(a_chuj_der(1,1,lll,kkk,kk,k), + & aa2tder(1,1,lll,kkk)) + enddo + enddo + if (l.eq.j+1) then +C parallel orientation of the two CA-CA-CA frames. + if (i.gt.1) then + iti=itortyp(itype(i)) + else + iti=ntortyp+1 + endif + itk1=itortyp(itype(k+1)) + itj=itortyp(itype(j)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +C A1 kernel(j+1) A2T +cd do iii=1,2 +cd write (iout,'(3f10.5,5x,3f10.5)') +cd & (EUg(iii,jjj,k),jjj=1,2),(EUg(iii,jjj,l),jjj=1,2) +cd enddo + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.false.,EUg(1,1,l),EUgder(1,1,l), + & AEA(1,1,1),AEAderg(1,1,1),AEAderx(1,1,1,1,1,1)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0) THEN + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.false.,EUgC(1,1,l),EUgCder(1,1,l), + & AECA(1,1,1),AECAderg(1,1,1),AECAderx(1,1,1,1,1,1)) + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.false.,Ug2DtEUg(1,1,l), + & Ug2DtEUgder(1,1,1,l),ADtEA(1,1,1),ADtEAderg(1,1,1,1), + & ADtEAderx(1,1,1,1,1,1)) + lprn=.false. + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.false.,DtUg2EUg(1,1,l), + & DtUg2EUgder(1,1,1,l),ADtEA1(1,1,1),ADtEA1derg(1,1,1,1), + & ADtEA1derx(1,1,1,1,1,1)) + ENDIF +C End 6-th order cumulants +cd lprn=.false. +cd if (lprn) then +cd write (2,*) 'In calc_eello6' +cd do iii=1,2 +cd write (2,*) 'iii=',iii +cd do kkk=1,5 +cd write (2,*) 'kkk=',kkk +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & ((ADtEA1derx(jjj,mmm,lll,kkk,iii,1),mmm=1,2),lll=1,3) +cd enddo +cd enddo +cd enddo +cd endif + call transpose2(EUgder(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,1,1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEA(1,1,1)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),EAEAderg(1,1,2,1)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & EAEAderx(1,1,lll,kkk,iii,1)) + enddo + enddo + enddo +C A1T kernel(i+1) A2 + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),1,.false.,EUg(1,1,k),EUgder(1,1,k), + & AEA(1,1,2),AEAderg(1,1,2),AEAderx(1,1,1,1,1,2)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0) THEN + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),1,.false.,EUgC(1,1,k),EUgCder(1,1,k), + & AECA(1,1,2),AECAderg(1,1,2),AECAderx(1,1,1,1,1,2)) + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),2,.false.,Ug2DtEUg(1,1,k), + & Ug2DtEUgder(1,1,1,k),ADtEA(1,1,2),ADtEAderg(1,1,1,2), + & ADtEAderx(1,1,1,1,1,2)) + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),2,.false.,DtUg2EUg(1,1,k), + & DtUg2EUgder(1,1,1,k),ADtEA1(1,1,2),ADtEA1derg(1,1,1,2), + & ADtEA1derx(1,1,1,1,1,2)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,l),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEAderg(1,1,1,2)) + call transpose2(EUg(1,1,l),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEA(1,1,2)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),EAEAderg(1,1,2,2)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & EAEAderx(1,1,lll,kkk,iii,2)) + enddo + enddo + enddo +C AEAb1 and AEAb2 +C Calculate the vectors and their derivatives in virtual-bond dihedral angles. +C They are needed only when the fifth- or the sixth-order cumulants are +C indluded. + IF (wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) THEN + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2(1,1,1)) + call matvec2(auxmat(1,1),Ub2der(1,i),AEAb2derg(1,2,1,1)) + call transpose2(AEAderg(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1derg(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2derg(1,1,1,1)) + call matvec2(AEA(1,1,1),b1(1,itk1),AEAb1(1,2,1)) + call matvec2(AEAderg(1,1,1),b1(1,itk1),AEAb1derg(1,2,1)) + call matvec2(AEA(1,1,1),Ub2(1,k+1),AEAb2(1,2,1)) + call matvec2(AEAderg(1,1,1),Ub2(1,k+1),AEAb2derg(1,1,2,1)) + call matvec2(AEA(1,1,1),Ub2der(1,k+1),AEAb2derg(1,2,2,1)) + call transpose2(AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j),AEAb2(1,1,2)) + call matvec2(auxmat(1,1),Ub2der(1,j),AEAb2derg(1,2,1,2)) + call transpose2(AEAderg(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj),AEAb1derg(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j),AEAb2derg(1,1,1,2)) + call matvec2(AEA(1,1,2),b1(1,itl1),AEAb1(1,2,2)) + call matvec2(AEAderg(1,1,2),b1(1,itl1),AEAb1derg(1,2,2)) + call matvec2(AEA(1,1,2),Ub2(1,l+1),AEAb2(1,2,2)) + call matvec2(AEAderg(1,1,2),Ub2(1,l+1),AEAb2derg(1,1,2,2)) + call matvec2(AEA(1,1,2),Ub2der(1,l+1),AEAb2derg(1,2,2,2)) +C Calculate the Cartesian derivatives of the vectors. + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti), + & AEAb1derx(1,lll,kkk,iii,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i), + & AEAb2derx(1,lll,kkk,iii,1,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & AEAb1derx(1,lll,kkk,iii,2,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),Ub2(1,k+1), + & AEAb2derx(1,lll,kkk,iii,2,1)) + call transpose2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj), + & AEAb1derx(1,lll,kkk,iii,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j), + & AEAb2derx(1,lll,kkk,iii,1,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,itl1), + & AEAb1derx(1,lll,kkk,iii,2,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),Ub2(1,l+1), + & AEAb2derx(1,lll,kkk,iii,2,2)) + enddo + enddo + enddo + ENDIF +C End vectors + else +C Antiparallel orientation of the two CA-CA-CA frames. + if (i.gt.1) then + iti=itortyp(itype(i)) + else + iti=ntortyp+1 + endif + itk1=itortyp(itype(k+1)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif +C A2 kernel(j-1)T A1T + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.true.,EUg(1,1,j),EUgder(1,1,j), + & AEA(1,1,1),AEAderg(1,1,1),AEAderx(1,1,1,1,1,1)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0 .or. (wturn6.gt.0.0d0 .and. + & j.eq.i+4 .and. l.eq.i+3)) THEN + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.true.,EUgC(1,1,j),EUgCder(1,1,j), + & AECA(1,1,1),AECAderg(1,1,1),AECAderx(1,1,1,1,1,1)) + call kernel(aa2(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.true.,Ug2DtEUg(1,1,j), + & Ug2DtEUgder(1,1,1,j),ADtEA(1,1,1),ADtEAderg(1,1,1,1), + & ADtEAderx(1,1,1,1,1,1)) + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.true.,DtUg2EUg(1,1,j), + & DtUg2EUgder(1,1,1,j),ADtEA1(1,1,1),ADtEA1derg(1,1,1,1), + & ADtEA1derx(1,1,1,1,1,1)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,1,1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEA(1,1,1)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),EAEAderg(1,1,2,1)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & EAEAderx(1,1,lll,kkk,iii,1)) + enddo + enddo + enddo +C A2T kernel(i+1)T A1 + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),1,.true.,EUg(1,1,k),EUgder(1,1,k), + & AEA(1,1,2),AEAderg(1,1,2),AEAderx(1,1,1,1,1,2)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0 .or. (wturn6.gt.0.0d0 .and. + & j.eq.i+4 .and. l.eq.i+3)) THEN + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),1,.true.,EUgC(1,1,k),EUgCder(1,1,k), + & AECA(1,1,2),AECAderg(1,1,2),AECAderx(1,1,1,1,1,2)) + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),2,.true.,Ug2DtEUg(1,1,k), + & Ug2DtEUgder(1,1,1,k),ADtEA(1,1,2),ADtEAderg(1,1,1,2), + & ADtEAderx(1,1,1,1,1,2)) + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),2,.true.,DtUg2EUg(1,1,k), + & DtUg2EUgder(1,1,1,k),ADtEA1(1,1,2),ADtEA1derg(1,1,1,2), + & ADtEA1derx(1,1,1,1,1,2)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,j),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,2,2)) + call transpose2(EUg(1,1,j),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEA(1,1,2)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),EAEAderg(1,1,2,2)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & EAEAderx(1,1,lll,kkk,iii,2)) + enddo + enddo + enddo +C AEAb1 and AEAb2 +C Calculate the vectors and their derivatives in virtual-bond dihedral angles. +C They are needed only when the fifth- or the sixth-order cumulants are +C indluded. + IF (wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 .or. + & (wturn6.gt.0.0d0 .and. j.eq.i+4 .and. l.eq.i+3)) THEN + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2(1,1,1)) + call matvec2(auxmat(1,1),Ub2der(1,i),AEAb2derg(1,2,1,1)) + call transpose2(AEAderg(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1derg(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2derg(1,1,1,1)) + call matvec2(AEA(1,1,1),b1(1,itk1),AEAb1(1,2,1)) + call matvec2(AEAderg(1,1,1),b1(1,itk1),AEAb1derg(1,2,1)) + call matvec2(AEA(1,1,1),Ub2(1,k+1),AEAb2(1,2,1)) + call matvec2(AEAderg(1,1,1),Ub2(1,k+1),AEAb2derg(1,1,2,1)) + call matvec2(AEA(1,1,1),Ub2der(1,k+1),AEAb2derg(1,2,2,1)) + call transpose2(AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj1),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l),AEAb2(1,1,2)) + call matvec2(auxmat(1,1),Ub2der(1,l),AEAb2derg(1,2,1,2)) + call transpose2(AEAderg(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itl),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l),AEAb2derg(1,1,1,2)) + call matvec2(AEA(1,1,2),b1(1,itj1),AEAb1(1,2,2)) + call matvec2(AEAderg(1,1,2),b1(1,itj1),AEAb1derg(1,2,2)) + call matvec2(AEA(1,1,2),Ub2(1,j),AEAb2(1,2,2)) + call matvec2(AEAderg(1,1,2),Ub2(1,j),AEAb2derg(1,1,2,2)) + call matvec2(AEA(1,1,2),Ub2der(1,j),AEAb2derg(1,2,2,2)) +C Calculate the Cartesian derivatives of the vectors. + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti), + & AEAb1derx(1,lll,kkk,iii,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i), + & AEAb2derx(1,lll,kkk,iii,1,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & AEAb1derx(1,lll,kkk,iii,2,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),Ub2(1,k+1), + & AEAb2derx(1,lll,kkk,iii,2,1)) + call transpose2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itl), + & AEAb1derx(1,lll,kkk,iii,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l), + & AEAb2derx(1,lll,kkk,iii,1,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,itj1), + & AEAb1derx(1,lll,kkk,iii,2,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),Ub2(1,j), + & AEAb2derx(1,lll,kkk,iii,2,2)) + enddo + enddo + enddo + ENDIF +C End vectors + endif + return + end +C--------------------------------------------------------------------------- + subroutine kernel(aa1,aa2t,aa1derx,aa2tderx,nderg,transp, + & KK,KKderg,AKA,AKAderg,AKAderx) + implicit none + integer nderg + logical transp + double precision aa1(2,2),aa2t(2,2),aa1derx(2,2,3,5), + & aa2tderx(2,2,3,5),KK(2,2),KKderg(2,2,nderg),AKA(2,2), + & AKAderg(2,2,nderg),AKAderx(2,2,3,5,2) + integer iii,kkk,lll + integer jjj,mmm + logical lprn + common /kutas/ lprn + call prodmat3(aa1(1,1),aa2t(1,1),KK(1,1),transp,AKA(1,1)) + do iii=1,nderg + call prodmat3(aa1(1,1),aa2t(1,1),KKderg(1,1,iii),transp, + & AKAderg(1,1,iii)) + enddo +cd if (lprn) write (2,*) 'In kernel' + do kkk=1,5 +cd if (lprn) write (2,*) 'kkk=',kkk + do lll=1,3 + call prodmat3(aa1derx(1,1,lll,kkk),aa2t(1,1), + & KK(1,1),transp,AKAderx(1,1,lll,kkk,1)) +cd if (lprn) then +cd write (2,*) 'lll=',lll +cd write (2,*) 'iii=1' +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & (AKAderx(jjj,mmm,lll,kkk,1),mmm=1,2) +cd enddo +cd endif + call prodmat3(aa1(1,1),aa2tderx(1,1,lll,kkk), + & KK(1,1),transp,AKAderx(1,1,lll,kkk,2)) +cd if (lprn) then +cd write (2,*) 'lll=',lll +cd write (2,*) 'iii=2' +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & (AKAderx(jjj,mmm,lll,kkk,2),mmm=1,2) +cd enddo +cd endif + enddo + enddo + return + end +C--------------------------------------------------------------------------- + double precision function eello4(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision pizda(2,2),ggg1(3),ggg2(3) +cd if (i.ne.1 .or. j.ne.5 .or. k.ne.2 .or.l.ne.4) then +cd eello4=0.0d0 +cd return +cd endif +cd print *,'eello4:',i,j,k,l,jj,kk +cd write (2,*) 'i',i,' j',j,' k',k,' l',l +cd call checkint4(i,j,k,l,jj,kk,eel4_num) +cold eij=facont_hb(jj,i) +cold ekl=facont_hb(kk,k) +cold ekont=eij*ekl + eel4=-EAEA(1,1,1)-EAEA(2,2,1) +cd eel41=-EAEA(1,1,2)-EAEA(2,2,2) + gcorr_loc(k-1)=gcorr_loc(k-1) + & -ekont*(EAEAderg(1,1,1,1)+EAEAderg(2,2,1,1)) + if (l.eq.j+1) then + gcorr_loc(l-1)=gcorr_loc(l-1) + & -ekont*(EAEAderg(1,1,2,1)+EAEAderg(2,2,2,1)) + else + gcorr_loc(j-1)=gcorr_loc(j-1) + & -ekont*(EAEAderg(1,1,2,1)+EAEAderg(2,2,2,1)) + endif + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=-EAEAderx(1,1,lll,kkk,iii,1) + & -EAEAderx(2,2,lll,kkk,iii,1) +cd derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd gcorr_loc(l-1)=0.0d0 +cd gcorr_loc(j-1)=0.0d0 +cd gcorr_loc(k-1)=0.0d0 +cd eel4=1.0d0 +cd write (iout,*)'Contacts have occurred for peptide groups', +cd & i,j,' fcont:',eij,' eij',' and ',k,l, +cd & ' fcont ',ekl,' eel4=',eel4,' eel4_num',16*eel4_num + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel4*g_contij(ll,1) +cgrad ggg2(ll)=eel4*g_contij(ll,2) + glongij=eel4*g_contij(ll,1)+ekont*derx(ll,1,1) + glongkl=eel4*g_contij(ll,2)+ekont*derx(ll,1,2) +cgrad ghalf=0.5d0*ggg1(ll) + gradcorr(ll,i)=gradcorr(ll,i)+ekont*derx(ll,2,1) + gradcorr(ll,i+1)=gradcorr(ll,i+1)+ekont*derx(ll,3,1) + gradcorr(ll,j)=gradcorr(ll,j)+ekont*derx(ll,4,1) + gradcorr(ll,j1)=gradcorr(ll,j1)+ekont*derx(ll,5,1) + gradcorr_long(ll,j)=gradcorr_long(ll,j)+glongij + gradcorr_long(ll,i)=gradcorr_long(ll,i)-glongij +cgrad ghalf=0.5d0*ggg2(ll) + gradcorr(ll,k)=gradcorr(ll,k)+ekont*derx(ll,2,2) + gradcorr(ll,k+1)=gradcorr(ll,k+1)+ekont*derx(ll,3,2) + gradcorr(ll,l)=gradcorr(ll,l)+ekont*derx(ll,4,2) + gradcorr(ll,l1)=gradcorr(ll,l1)+ekont*derx(ll,5,2) + gradcorr_long(ll,l)=gradcorr_long(ll,l)+glongkl + gradcorr_long(ll,k)=gradcorr_long(ll,k)-glongkl + enddo +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,gcorr_loc(iii) +cd enddo + eello4=ekont*eel4 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello4',ekont*eel4 + return + end +C--------------------------------------------------------------------------- + double precision function eello5(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision pizda(2,2),auxmat(2,2),auxmat1(2,2),vv(2) + double precision ggg1(3),ggg2(3) +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel chains C +C C +C o o o o C +C /l\ / \ \ / \ / \ / C +C / \ / \ \ / \ / \ / C +C j| o |l1 | o | o| o | | o |o C +C \ |/k\| |/ \| / |/ \| |/ \| C +C \i/ \ / \ / / \ / \ C +C o k1 o C +C (I) (II) (III) (IV) C +C C +C eello5_1 eello5_2 eello5_3 eello5_4 C +C C +C Antiparallel chains C +C C +C o o o o C +C /j\ / \ \ / \ / \ / C +C / \ / \ \ / \ / \ / C +C j1| o |l | o | o| o | | o |o C +C \ |/k\| |/ \| / |/ \| |/ \| C +C \i/ \ / \ / / \ / \ C +C o k1 o C +C (I) (II) (III) (IV) C +C C +C eello5_1 eello5_2 eello5_3 eello5_4 C +C C +C o denotes a local interaction, vertical lines an electrostatic interaction. C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd if (i.ne.2 .or. j.ne.6 .or. k.ne.3 .or. l.ne.5) then +cd eello5=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO5: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l + itk=itortyp(itype(k)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) + eello5_1=0.0d0 + eello5_2=0.0d0 + eello5_3=0.0d0 + eello5_4=0.0d0 +cd call checkint5(i,j,k,l,jj,kk,eel5_1_num,eel5_2_num, +cd & eel5_3_num,eel5_4_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=facont_hb(jj,i) +cd ekl=facont_hb(kk,k) +cd ekont=eij*ekl +cd write (iout,*)'Contacts have occurred for peptide groups', +cd & i,j,' fcont:',eij,' eij',' and ',k,l +cd goto 1111 +C Contribution from the graph I. +cd write (2,*) 'AEA ',AEA(1,1,1),AEA(2,1,1),AEA(1,2,1),AEA(2,2,1) +cd write (2,*) 'AEAb2',AEAb2(1,1,1),AEAb2(2,1,1) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_1=scalar2(AEAb2(1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i)) +C Explicit gradient in virtual-dihedral angles. + if (i.gt.1) g_corr5_loc(i-1)=g_corr5_loc(i-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,i))) + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(AEA(1,1,1),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2(1,1,1),Ub2der(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + call matmat2(AEAderg(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + if (l.eq.j+1) then + if (l.lt.nres-1) g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + else + if (j.lt.nres-1) g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + endif +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i)) + enddo + enddo + enddo +c goto 1112 +c1111 continue +C Contribution from graph II + call transpose2(EE(1,1,itk),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_2=scalar2(AEAb1(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,k)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + if (l.eq.j+1) then + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k))) + else + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k))) + endif +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k)) + enddo + enddo + enddo +cd goto 1112 +cd1111 continue + if (l.eq.j+1) then +cd goto 1110 +C Parallel orientation +C Contribution from graph III + call transpose2(EUg(1,1,l),auxmat(1,1)) + call matmat2(AEA(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_3=scalar2(AEAb2(1,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,j))) + call matmat2(AEAderg(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j))) + call transpose2(EUgder(1,1,l),auxmat1(1,1)) + call matmat2(AEA(1,1,2),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2(1,1,2),Ub2der(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j)) + enddo + enddo + enddo +cd goto 1112 +C Contribution from graph IV +cd1110 continue + call transpose2(EE(1,1,itl),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_4=scalar2(AEAb1(1,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,l)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l)) + enddo + enddo + enddo + else +C Antiparallel orientation +C Contribution from graph III +c goto 1110 + call transpose2(EUg(1,1,j),auxmat(1,1)) + call matmat2(AEA(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_3=scalar2(AEAb2(1,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,l))) + call matmat2(AEAderg(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l))) + call transpose2(EUgder(1,1,j),auxmat1(1,1)) + call matmat2(AEA(1,1,2),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2(1,1,2),Ub2der(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l)) + enddo + enddo + enddo +cd goto 1112 +C Contribution from graph IV +1110 continue + call transpose2(EE(1,1,itj),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_4=scalar2(AEAb1(1,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,j)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j)) + enddo + enddo + enddo + endif +1112 continue + eel5=eello5_1+eello5_2+eello5_3+eello5_4 +cd if (i.eq.2 .and. j.eq.8 .and. k.eq.3 .and. l.eq.7) then +cd write (2,*) 'ijkl',i,j,k,l +cd write (2,*) 'eello5_1',eello5_1,' eello5_2',eello5_2, +cd & ' eello5_3',eello5_3,' eello5_4',eello5_4 +cd endif +cd write(iout,*) 'eello5_1',eello5_1,' eel5_1_num',16*eel5_1_num +cd write(iout,*) 'eello5_2',eello5_2,' eel5_2_num',16*eel5_2_num +cd write(iout,*) 'eello5_3',eello5_3,' eel5_3_num',16*eel5_3_num +cd write(iout,*) 'eello5_4',eello5_4,' eel5_4_num',16*eel5_4_num + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 +cd write (2,*) 'eij',eij,' ekl',ekl,' ekont',ekont +C 2/11/08 AL Gradients over DC's connecting interacting sites will be +C summed up outside the subrouine as for the other subroutines +C handling long-range interactions. The old code is commented out +C with "cgrad" to keep track of changes. + do ll=1,3 +cgrad ggg1(ll)=eel5*g_contij(ll,1) +cgrad ggg2(ll)=eel5*g_contij(ll,2) + gradcorr5ij=eel5*g_contij(ll,1)+ekont*derx(ll,1,1) + gradcorr5kl=eel5*g_contij(ll,2)+ekont*derx(ll,1,2) +c write (iout,'(a,3i3,a,5f8.3,2i3,a,5f8.3,a,f8.3)') +c & "ecorr5",ll,i,j," derx",derx(ll,2,1),derx(ll,3,1),derx(ll,4,1), +c & derx(ll,5,1),k,l," derx",derx(ll,2,2),derx(ll,3,2), +c & derx(ll,4,2),derx(ll,5,2)," ekont",ekont +c write (iout,'(a,3i3,a,3f8.3,2i3,a,3f8.3)') +c & "ecorr5",ll,i,j," gradcorr5",g_contij(ll,1),derx(ll,1,1), +c & gradcorr5ij, +c & k,l," gradcorr5",g_contij(ll,2),derx(ll,1,2),gradcorr5kl +cold ghalf=0.5d0*eel5*ekl*gacont_hbr(ll,jj,i) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr5(ll,i)=gradcorr5(ll,i)+ekont*derx(ll,2,1) + gradcorr5(ll,i+1)=gradcorr5(ll,i+1)+ekont*derx(ll,3,1) + gradcorr5(ll,j)=gradcorr5(ll,j)+ekont*derx(ll,4,1) + gradcorr5(ll,j1)=gradcorr5(ll,j1)+ekont*derx(ll,5,1) + gradcorr5_long(ll,j)=gradcorr5_long(ll,j)+gradcorr5ij + gradcorr5_long(ll,i)=gradcorr5_long(ll,i)-gradcorr5ij +cold ghalf=0.5d0*eel5*eij*gacont_hbr(ll,kk,k) +cgrad ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gradcorr5(ll,k)=gradcorr5(ll,k)+ghalf+ekont*derx(ll,2,2) + gradcorr5(ll,k+1)=gradcorr5(ll,k+1)+ekont*derx(ll,3,2) + gradcorr5(ll,l)=gradcorr5(ll,l)+ghalf+ekont*derx(ll,4,2) + gradcorr5(ll,l1)=gradcorr5(ll,l1)+ekont*derx(ll,5,2) + gradcorr5_long(ll,l)=gradcorr5_long(ll,l)+gradcorr5kl + gradcorr5_long(ll,k)=gradcorr5_long(ll,k)-gradcorr5kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*ekl*gacont_hbr(ll,jj,i) +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*eij*gacont_hbr(ll,kk,k) +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +c1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr5_loc(iii) +cd enddo + eello5=ekont*eel5 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello5',ekont*eel5 + return + end +c-------------------------------------------------------------------------- + double precision function eello6(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision ggg1(3),ggg2(3) +cd if (i.ne.1 .or. j.ne.3 .or. k.ne.2 .or. l.ne.4) then +cd eello6=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO6: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l + eello6_1=0.0d0 + eello6_2=0.0d0 + eello6_3=0.0d0 + eello6_4=0.0d0 + eello6_5=0.0d0 + eello6_6=0.0d0 +cd call checkint6(i,j,k,l,jj,kk,eel6_1_num,eel6_2_num, +cd & eel6_3_num,eel6_4_num,eel6_5_num,eel6_6_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=facont_hb(jj,i) +cd ekl=facont_hb(kk,k) +cd ekont=eij*ekl +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 + if (l.eq.j+1) then + eello6_1=eello6_graph1(i,j,k,l,1,.false.) + eello6_2=eello6_graph1(j,i,l,k,2,.false.) + eello6_3=eello6_graph2(i,j,k,l,jj,kk,.false.) + eello6_4=eello6_graph4(i,j,k,l,jj,kk,1,.false.) + eello6_5=eello6_graph4(j,i,l,k,jj,kk,2,.false.) + eello6_6=eello6_graph3(i,j,k,l,jj,kk,.false.) + else + eello6_1=eello6_graph1(i,j,k,l,1,.false.) + eello6_2=eello6_graph1(l,k,j,i,2,.true.) + eello6_3=eello6_graph2(i,l,k,j,jj,kk,.true.) + eello6_4=eello6_graph4(i,j,k,l,jj,kk,1,.false.) + if (wturn6.eq.0.0d0 .or. j.ne.i+4) then + eello6_5=eello6_graph4(l,k,j,i,kk,jj,2,.true.) + else + eello6_5=0.0d0 + endif + eello6_6=eello6_graph3(i,l,k,j,jj,kk,.true.) + endif +C If turn contributions are considered, they will be handled separately. + eel6=eello6_1+eello6_2+eello6_3+eello6_4+eello6_5+eello6_6 +cd write(iout,*) 'eello6_1',eello6_1!,' eel6_1_num',16*eel6_1_num +cd write(iout,*) 'eello6_2',eello6_2!,' eel6_2_num',16*eel6_2_num +cd write(iout,*) 'eello6_3',eello6_3!,' eel6_3_num',16*eel6_3_num +cd write(iout,*) 'eello6_4',eello6_4!,' eel6_4_num',16*eel6_4_num +cd write(iout,*) 'eello6_5',eello6_5!,' eel6_5_num',16*eel6_5_num +cd write(iout,*) 'eello6_6',eello6_6!,' eel6_6_num',16*eel6_6_num +cd goto 1112 + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel6*g_contij(ll,1) +cgrad ggg2(ll)=eel6*g_contij(ll,2) +cold ghalf=0.5d0*eel6*ekl*gacont_hbr(ll,jj,i) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr6ij=eel6*g_contij(ll,1)+ekont*derx(ll,1,1) + gradcorr6kl=eel6*g_contij(ll,2)+ekont*derx(ll,1,2) + gradcorr6(ll,i)=gradcorr6(ll,i)+ekont*derx(ll,2,1) + gradcorr6(ll,i+1)=gradcorr6(ll,i+1)+ekont*derx(ll,3,1) + gradcorr6(ll,j)=gradcorr6(ll,j)+ekont*derx(ll,4,1) + gradcorr6(ll,j1)=gradcorr6(ll,j1)+ekont*derx(ll,5,1) + gradcorr6_long(ll,j)=gradcorr6_long(ll,j)+gradcorr6ij + gradcorr6_long(ll,i)=gradcorr6_long(ll,i)-gradcorr6ij +cgrad ghalf=0.5d0*ggg2(ll) +cold ghalf=0.5d0*eel6*eij*gacont_hbr(ll,kk,k) +cd ghalf=0.0d0 + gradcorr6(ll,k)=gradcorr6(ll,k)+ekont*derx(ll,2,2) + gradcorr6(ll,k+1)=gradcorr6(ll,k+1)+ekont*derx(ll,3,2) + gradcorr6(ll,l)=gradcorr6(ll,l)+ekont*derx(ll,4,2) + gradcorr6(ll,l1)=gradcorr6(ll,l1)+ekont*derx(ll,5,2) + gradcorr6_long(ll,l)=gradcorr6_long(ll,l)+gradcorr6kl + gradcorr6_long(ll,k)=gradcorr6_long(ll,k)-gradcorr6kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*ekl*gacont_hbr(ll,jj,i) +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*eij*gacont_hbr(ll,kk,k) +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + eello6=ekont*eel6 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello6',ekont*eel6 + return + end +c-------------------------------------------------------------------------- + double precision function eello6_graph1(i,j,k,l,imat,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vv(2),vv1(2),pizda(2,2),auxmat(2,2),pizda1(2,2) + logical swap + logical lprn + common /kutas/ lprn +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C Parallel Antiparallel +C +C o o +C /l\ /j\ +C / \ / \ +C /| o | | o |\ +C \ j|/k\| / \ |/k\|l / +C \ / \ / \ / \ / +C o o o o +C i i +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + itk=itortyp(itype(k)) + s1= scalar2(AEAb1(1,2,imat),CUgb2(1,i)) + s2=-scalar2(AEAb2(1,1,imat),Ug2Db1t(1,k)) + s3= scalar2(AEAb2(1,1,imat),CUgb2(1,k)) + call transpose2(EUgC(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + s4=0.5d0*scalar2(vv1(1),Dtobr2(1,i)) + vv(1)=AEAb1(1,2,imat)*b1(1,itk)-AEAb1(2,2,imat)*b1(2,itk) + vv(2)=AEAb1(1,2,imat)*b1(2,itk)+AEAb1(2,2,imat)*b1(1,itk) + s5=scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4', s4,' s5',s5 + eello6_graph1=-0.5d0*(s1+s2+s3+s4+s5) + if (i.gt.1) g_corr6_loc(i-1)=g_corr6_loc(i-1) + & -0.5d0*ekont*(scalar2(AEAb1(1,2,imat),CUgb2der(1,i)) + & -scalar2(AEAb2derg(1,2,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,2,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2der(1,i)) + & +scalar2(vv(1),Dtobr2der(1,i))) + call matmat2(AEAderg(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + vv(1)=AEAb1derg(1,2,imat)*b1(1,itk)-AEAb1derg(2,2,imat)*b1(2,itk) + vv(2)=AEAb1derg(1,2,imat)*b1(2,itk)+AEAb1derg(2,2,imat)*b1(1,itk) + if (l.eq.j+1) then + g_corr6_loc(l-1)=g_corr6_loc(l-1) + & +ekont*(-0.5d0*(scalar2(AEAb1derg(1,2,imat),CUgb2(1,i)) + & -scalar2(AEAb2derg(1,1,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,1,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i))+scalar2(vv(1),Dtobr2(1,i)))) + else + g_corr6_loc(j-1)=g_corr6_loc(j-1) + & +ekont*(-0.5d0*(scalar2(AEAb1derg(1,2,imat),CUgb2(1,i)) + & -scalar2(AEAb2derg(1,1,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,1,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i))+scalar2(vv(1),Dtobr2(1,i)))) + endif + call transpose2(EUgCder(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + if (k.gt.1) g_corr6_loc(k-1)=g_corr6_loc(k-1) + & +ekont*(-0.5d0*(-scalar2(AEAb2(1,1,imat),Ug2Db1tder(1,k)) + & +scalar2(AEAb2(1,1,imat),CUgb2der(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i)))) + do iii=1,2 + if (swap) then + ind=3-iii + else + ind=iii + endif + do kkk=1,5 + do lll=1,3 + s1= scalar2(AEAb1derx(1,lll,kkk,iii,2,imat),CUgb2(1,i)) + s2=-scalar2(AEAb2derx(1,lll,kkk,iii,1,imat),Ug2Db1t(1,k)) + s3= scalar2(AEAb2derx(1,lll,kkk,iii,1,imat),CUgb2(1,k)) + call transpose2(EUgC(1,1,k),auxmat(1,1)) + call matmat2(AEAderx(1,1,lll,kkk,iii,imat),auxmat(1,1), + & pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + s4=0.5d0*scalar2(vv1(1),Dtobr2(1,i)) + vv(1)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(1,itk) + & -AEAb1derx(2,lll,kkk,iii,2,imat)*b1(2,itk) + vv(2)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(2,itk) + & +AEAb1derx(2,lll,kkk,iii,2,imat)*b1(1,itk) + s5=scalar2(vv(1),Dtobr2(1,i)) + derx(lll,kkk,ind)=derx(lll,kkk,ind)-0.5d0*(s1+s2+s3+s4+s5) + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello6_graph2(i,j,k,l,jj,kk,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + logical swap + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2), + & auxvec1(2),auxvec2(2),auxmat1(2,2) + logical lprn + common /kutas/ lprn +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel Antiparallel C +C C +C o o C +C \ /l\ /j\ / C +C \ / \ / \ / C +C o| o | | o |o C +C \ j|/k\| \ |/k\|l C +C \ / \ \ / \ C +C o o C +C i i C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd write (2,*) 'eello6_graph2: i,',i,' j',j,' k',k,' l',l +C AL 7/4/01 s1 would occur in the sixth-order moment, +C but not in a cluster cumulant +#ifdef MOMENT + s1=dip(1,jj,i)*dip(1,kk,k) +#endif + call matvec2(ADtEA1(1,1,1),Ub2(1,k),auxvec(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matvec2(ADtEA(1,1,2),Ub2(1,l),auxvec1(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec1(1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(ADtEA1(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 'eello6_graph2:','s1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + eello6_graph2=-(s1+s2+s3+s4) +#else + eello6_graph2=-(s2+s3+s4) +#endif +c eello6_graph2=-s3 +C Derivatives in gamma(i-1) + if (i.gt.1) then +#ifdef MOMENT + s1=dipderg(1,jj,i)*dip(1,kk,k) +#endif + s2=-0.5d0*scalar2(Ub2der(1,i),auxvec(1)) + call matvec2(ADtEAderg(1,1,1,2),Ub2(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + s4=-0.25d0*scalar2(vv(1),Dtobr2der(1,i)) +#ifdef MOMENT + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s2+s3+s4) +#endif +c g_corr6_loc(i-1)=g_corr6_loc(i-1)-s3 + endif +C Derivatives in gamma(k-1) +#ifdef MOMENT + s1=dip(1,jj,i)*dipderg(1,kk,k) +#endif + call matvec2(ADtEA1(1,1,1),Ub2der(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + call matvec2(ADtEAderg(1,1,2,2),Ub2(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(ADtEA1(1,1,1),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s2+s3+s4) +#endif +c g_corr6_loc(k-1)=g_corr6_loc(k-1)-s3 +C Derivatives in gamma(j-1) or gamma(l-1) + if (j.gt.1) then +#ifdef MOMENT + s1=dipderg(3,jj,i)*dip(1,kk,k) +#endif + call matvec2(ADtEA1derg(1,1,1,1),Ub2(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2der(1,j),auxvec1(1)) + call matmat2(ADtEA1derg(1,1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + if (swap) then + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*s1 + else + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*s1 + endif +#endif + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*(s2+s3+s4) +c g_corr6_loc(j-1)=g_corr6_loc(j-1)-s3 + endif +C Derivatives in gamma(l-1) or gamma(j-1) + if (l.gt.1) then +#ifdef MOMENT + s1=dip(1,jj,i)*dipderg(3,kk,k) +#endif + call matvec2(ADtEA1derg(1,1,2,1),Ub2(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + call matvec2(ADtEA(1,1,2),Ub2der(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + call matmat2(ADtEA1derg(1,1,2,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + if (swap) then + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*s1 + else + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*s1 + endif +#endif + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s3+s4) +c g_corr6_loc(l-1)=g_corr6_loc(l-1)-s3 + endif +C Cartesian derivatives. + if (lprn) then + write (2,*) 'In eello6_graph2' + do iii=1,2 + write (2,*) 'iii=',iii + do kkk=1,5 + write (2,*) 'kkk=',kkk + do jjj=1,2 + write (2,'(3(2f10.5),5x)') + & ((ADtEA1derx(jjj,mmm,lll,kkk,iii,1),mmm=1,2),lll=1,3) + enddo + enddo + enddo + endif + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + s1=dipderx(lll,kkk,1,jj,i)*dip(1,kk,k) + else + s1=dip(1,jj,i)*dipderx(lll,kkk,1,kk,k) + endif +#endif + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,1),Ub2(1,k), + & auxvec(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matvec2(ADtEAderx(1,1,lll,kkk,iii,2),Ub2(1,l), + & auxvec(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec(1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(ADtEA1derx(1,1,lll,kkk,iii,1),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (swap) then + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello6_graph3(i,j,k,l,jj,kk,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2) + logical swap +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel Antiparallel C +C C +C o o C +C /l\ / \ /j\ C +C / \ / \ / \ C +C /| o |o o| o |\ C +C j|/k\| / |/k\|l / C +C / \ / / \ / C +C / o / o C +C i i C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C 4/7/01 AL Component s1 was removed, because it pertains to the respective +C energy moment and not to the cluster cumulant. + iti=itortyp(itype(i)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + itk=itortyp(itype(k)) + itk1=itortyp(itype(k+1)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +#ifdef MOMENT + s1=dip(4,jj,i)*dip(4,kk,k) +#endif + call matvec2(AECA(1,1,1),b1(1,itk1),auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matvec2(AECA(1,1,2),b1(1,itl1),auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + call transpose2(EE(1,1,itk),auxmat(1,1)) + call matmat2(auxmat(1,1),AECA(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) +cd write (2,*) 'eello6_graph3:','s1',s1,' s2',s2,' s3',s3,' s4',s4, +cd & "sum",-(s2+s3+s4) +#ifdef MOMENT + eello6_graph3=-(s1+s2+s3+s4) +#else + eello6_graph3=-(s2+s3+s4) +#endif +c eello6_graph3=-s4 +C Derivatives in gamma(k-1) + call matvec2(AECAderg(1,1,2),b1(1,itl1),auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + s4=-0.25d0*scalar2(vv(1),Ctobrder(1,k)) + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s3+s4) +C Derivatives in gamma(l-1) + call matvec2(AECAderg(1,1,1),b1(1,itk1),auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matmat2(auxmat(1,1),AECAderg(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s4) +C Cartesian derivatives. + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + s1=dipderx(lll,kkk,4,jj,i)*dip(4,kk,k) + else + s1=dip(4,jj,i)*dipderx(lll,kkk,4,kk,k) + endif +#endif + call matvec2(AECAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matvec2(AECAderx(1,1,lll,kkk,iii,2),b1(1,itl1), + & auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + call matmat2(auxmat(1,1),AECAderx(1,1,lll,kkk,iii,1), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (swap) then + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif +c derx(lll,kkk,iii)=derx(lll,kkk,iii)-s4 + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello6_graph4(i,j,k,l,jj,kk,imat,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2), + & auxvec1(2),auxmat1(2,2) + logical swap +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel Antiparallel C +C C +C o o C +C /l\ / \ /j\ C +C / \ / \ / \ C +C /| o |o o| o |\ C +C \ j|/k\| \ |/k\|l C +C \ / \ \ / \ C +C o \ o \ C +C i i C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C 4/7/01 AL Component s1 was removed, because it pertains to the respective +C energy moment and not to the cluster cumulant. +cd write (2,*) 'eello_graph4: wturn6',wturn6 + iti=itortyp(itype(i)) + itj=itortyp(itype(j)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + itk=itortyp(itype(k)) + if (k.lt.nres-1) then + itk1=itortyp(itype(k+1)) + else + itk1=ntortyp+1 + endif + itl=itortyp(itype(l)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +cd write (2,*) 'eello6_graph4:','i',i,' j',j,' k',k,' l',l +cd write (2,*) 'iti',iti,' itj',itj,' itj1',itj1,' itk',itk, +cd & ' itl',itl,' itl1',itl1 +#ifdef MOMENT + if (imat.eq.1) then + s1=dip(3,jj,i)*dip(3,kk,k) + else + s1=dip(2,jj,j)*dip(2,kk,l) + endif +#endif + call matvec2(AECA(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1(1,1,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1(1,1,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(AECA(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 'eello6_graph4:','s1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + eello6_graph4=-(s1+s2+s3+s4) +#else + eello6_graph4=-(s2+s3+s4) +#endif +C Derivatives in gamma(i-1) + if (i.gt.1) then +#ifdef MOMENT + if (imat.eq.1) then + s1=dipderg(2,jj,i)*dip(3,kk,k) + else + s1=dipderg(4,jj,j)*dip(2,kk,l) + endif +#endif + s2=0.5d0*scalar2(Ub2der(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + s4=0.25d0*scalar2(vv(1),Dtobr2der(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +cd write (2,*) 'turn6 derivatives' +#ifdef MOMENT + gel_loc_turn6(i-1)=gel_loc_turn6(i-1)-ekont*(s1+s2+s3+s4) +#else + gel_loc_turn6(i-1)=gel_loc_turn6(i-1)-ekont*(s2+s3+s4) +#endif + else +#ifdef MOMENT + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s2+s3+s4) +#endif + endif + endif +C Derivatives in gamma(k-1) +#ifdef MOMENT + if (imat.eq.1) then + s1=dip(3,jj,i)*dipderg(2,kk,k) + else + s1=dip(2,jj,j)*dipderg(4,kk,l) + endif +#endif + call matvec2(AECA(1,1,imat),Ub2der(1,k),auxvec1(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec1(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(AECA(1,1,imat),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +#ifdef MOMENT + gel_loc_turn6(k-1)=gel_loc_turn6(k-1)-ekont*(s1+s2+s3+s4) +#else + gel_loc_turn6(k-1)=gel_loc_turn6(k-1)-ekont*(s2+s3+s4) +#endif + else +#ifdef MOMENT + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s2+s3+s4) +#endif + endif +C Derivatives in gamma(j-1) or gamma(l-1) + if (l.eq.j+1 .and. l.gt.1) then + call matvec2(AECAderg(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matmat2(AECAderg(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s4) + else if (j.gt.1) then + call matvec2(AECAderg(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matmat2(AECAderg(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then + gel_loc_turn6(j-1)=gel_loc_turn6(j-1)-ekont*(s2+s4) + else + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*(s2+s4) + endif + endif +C Cartesian derivatives. + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + if (imat.eq.1) then + s1=dipderx(lll,kkk,3,jj,i)*dip(3,kk,k) + else + s1=dipderx(lll,kkk,2,jj,j)*dip(2,kk,l) + endif + else + if (imat.eq.1) then + s1=dip(3,jj,i)*dipderx(lll,kkk,3,kk,k) + else + s1=dip(2,jj,j)*dipderx(lll,kkk,2,kk,l) + endif + endif +#endif + call matvec2(AECAderx(1,1,lll,kkk,iii,imat),Ub2(1,k), + & auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat), + & b1(1,itj1),auxvec(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec(1)) + else + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat), + & b1(1,itl1),auxvec(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec(1)) + endif + call matmat2(AECAderx(1,1,lll,kkk,iii,imat),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (swap) then + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +#ifdef MOMENT + derx_turn(lll,kkk,3-iii)=derx_turn(lll,kkk,3-iii) + & -(s1+s2+s4) +#else + derx_turn(lll,kkk,3-iii)=derx_turn(lll,kkk,3-iii) + & -(s2+s4) +#endif + derx_turn(lll,kkk,iii)=derx_turn(lll,kkk,iii)-s3 + else +#ifdef MOMENT + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-(s1+s2+s4) +#else + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-(s2+s4) +#endif + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif + else +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (l.eq.j+1) then + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + else + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + endif + endif + enddo + enddo + enddo + return + end +c---------------------------------------------------------------------------- + double precision function eello_turn6(i,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vtemp1(2),vtemp2(2),vtemp3(2),vtemp4(2), + & atemp(2,2),auxmat(2,2),achuj_temp(2,2),gtemp(2,2),gvec(2), + & ggg1(3),ggg2(3) + double precision vtemp1d(2),vtemp2d(2),vtemp3d(2),vtemp4d(2), + & atempd(2,2),auxmatd(2,2),achuj_tempd(2,2),gtempd(2,2),gvecd(2) +C 4/7/01 AL Components s1, s8, and s13 were removed, because they pertain to +C the respective energy moment and not to the cluster cumulant. + s1=0.0d0 + s8=0.0d0 + s13=0.0d0 +c + eello_turn6=0.0d0 + j=i+4 + k=i+1 + l=i+3 + iti=itortyp(itype(i)) + itk=itortyp(itype(k)) + itk1=itortyp(itype(k+1)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) +cd write (2,*) 'itk',itk,' itk1',itk1,' itl',itl,' itj',itj +cd write (2,*) 'i',i,' k',k,' j',j,' l',l +cd if (i.ne.1 .or. j.ne.3 .or. k.ne.2 .or. l.ne.4) then +cd eello6=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO6: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l +cd call checkint_turn6(i,jj,kk,eel_turn6_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx_turn(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 + eello6_5=eello6_graph4(l,k,j,i,kk,jj,2,.true.) +cd eello6_5=0.0d0 +cd write (2,*) 'eello6_5',eello6_5 +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matmat2(EUg(1,1,i+1),auxmat(1,1),auxmat(1,1)) + ss1=scalar2(Ub2(1,i+2),b1(1,itl)) + s1 = (auxmat(1,1)+auxmat(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1(1)) + call matvec2(AEA(1,1,1),vtemp1(1),vtemp1(1)) + s2 = scalar2(b1(1,itk),vtemp1(1)) +#ifdef MOMENT + call transpose2(AEA(1,1,2),atemp(1,1)) + call matmat2(atemp(1,1),EUg(1,1,i+4),atemp(1,1)) + call matvec2(Ug2(1,1,i+2),dd(1,1,itk1),vtemp2(1)) + s8 = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),Ub2(1,i+4),vtemp3(1)) + s12 = scalar2(Ub2(1,i+2),vtemp3(1)) +#ifdef MOMENT + call transpose2(a_chuj(1,1,kk,i+1),achuj_temp(1,1)) + call matmat2(achuj_temp(1,1),EUg(1,1,i+2),gtemp(1,1)) + call matmat2(gtemp(1,1),EUg(1,1,i+3),gtemp(1,1)) + call matvec2(a_chuj(1,1,jj,i),Ub2(1,i+4),vtemp4(1)) + ss13 = scalar2(b1(1,itk),vtemp4(1)) + s13 = (gtemp(1,1)+gtemp(2,2))*ss13 +#endif +c write (2,*) 's1,s2,s8,s12,s13',s1,s2,s8,s12,s13 +c s1=0.0d0 +c s2=0.0d0 +c s8=0.0d0 +c s12=0.0d0 +c s13=0.0d0 + eel_turn6 = eello6_5 - 0.5d0*(s1+s2+s12+s8+s13) +C Derivatives in gamma(i+2) + s1d =0.0d0 + s8d =0.0d0 +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmatd(1,1)) + call matmat2(EUgder(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 + call transpose2(AEAderg(1,1,2),atempd(1,1)) + call matmat2(atempd(1,1),EUg(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEAderg(1,1,2),auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 + gel_loc_turn6(i)=gel_loc_turn6(i)-0.5d0*ekont*(s1d+s8d+s12d) +C Derivatives in gamma(i+3) +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + ss1d=scalar2(Ub2der(1,i+2),b1(1,itl)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1d +#endif + call matvec2(EUgder(1,1,i+2),b1(1,itl),vtemp1d(1)) + call matvec2(AEA(1,1,1),vtemp1d(1),vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call matvec2(Ug2der(1,1,i+2),dd(1,1,itk1),vtemp2d(1)) + s8d = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,itl),vtemp2d(1)) +#endif + s12d = scalar2(Ub2der(1,i+2),vtemp3(1)) +#ifdef MOMENT + call matmat2(achuj_temp(1,1),EUgder(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUg(1,1,i+3),gtempd(1,1)) + s13d = (gtempd(1,1)+gtempd(2,2))*ss13 +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+1)=gel_loc_turn6(i+1) + & -0.5d0*ekont*(s1d+s2d+s8d+s12d+s13d) +#else + gel_loc_turn6(i+1)=gel_loc_turn6(i+1) + & -0.5d0*ekont*(s2d+s12d) +#endif +C Derivatives in gamma(i+4) + call matmat2(EUgder(1,1,i+3),AEA(1,1,2),auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +#ifdef MOMENT + call matmat2(achuj_temp(1,1),EUg(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUgder(1,1,i+3),gtempd(1,1)) + s13d = (gtempd(1,1)+gtempd(2,2))*ss13 +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +C s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+2)=gel_loc_turn6(i+2)-0.5d0*ekont*(s12d+s13d) +#else + gel_loc_turn6(i+2)=gel_loc_turn6(i+2)-0.5d0*ekont*(s12d) +#endif +C Derivatives in gamma(i+5) +#ifdef MOMENT + call transpose2(AEAderg(1,1,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1d(1)) + call matvec2(AEAderg(1,1,1),vtemp1d(1),vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call transpose2(AEA(1,1,2),atempd(1,1)) + call matmat2(atempd(1,1),EUgder(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matvec2(auxmat(1,1),Ub2der(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +#ifdef MOMENT + call matvec2(a_chuj(1,1,jj,i),Ub2der(1,i+4),vtemp4d(1)) + ss13d = scalar2(b1(1,itk),vtemp4d(1)) + s13d = (gtemp(1,1)+gtemp(2,2))*ss13d +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+3)=gel_loc_turn6(i+3) + & -0.5d0*ekont*(s1d+s2d+s8d+s12d+s13d) +#else + gel_loc_turn6(i+3)=gel_loc_turn6(i+3) + & -0.5d0*ekont*(s2d+s12d) +#endif +C Cartesian derivatives + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1(1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),vtemp1(1), + & vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call transpose2(AEAderx(1,1,lll,kkk,iii,2),atempd(1,1)) + call matmat2(atempd(1,1),EUg(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))* + & scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEAderx(1,1,lll,kkk,iii,2), + & auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + derx_turn(lll,kkk,iii) = derx_turn(lll,kkk,iii) + & - 0.5d0*(s1d+s2d) +#else + derx_turn(lll,kkk,iii) = derx_turn(lll,kkk,iii) + & - 0.5d0*s2d +#endif +#ifdef MOMENT + derx_turn(lll,kkk,3-iii) = derx_turn(lll,kkk,3-iii) + & - 0.5d0*(s8d+s12d) +#else + derx_turn(lll,kkk,3-iii) = derx_turn(lll,kkk,3-iii) + & - 0.5d0*s12d +#endif + enddo + enddo + enddo +#ifdef MOMENT + do kkk=1,5 + do lll=1,3 + call transpose2(a_chuj_der(1,1,lll,kkk,kk,i+1), + & achuj_tempd(1,1)) + call matmat2(achuj_tempd(1,1),EUg(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUg(1,1,i+3),gtempd(1,1)) + s13d=(gtempd(1,1)+gtempd(2,2))*ss13 + derx_turn(lll,kkk,2) = derx_turn(lll,kkk,2)-0.5d0*s13d + call matvec2(a_chuj_der(1,1,lll,kkk,jj,i),Ub2(1,i+4), + & vtemp4d(1)) + ss13d = scalar2(b1(1,itk),vtemp4d(1)) + s13d = (gtemp(1,1)+gtemp(2,2))*ss13d + derx_turn(lll,kkk,1) = derx_turn(lll,kkk,1)-0.5d0*s13d + enddo + enddo +#endif +cd write(iout,*) 'eel6_turn6',eel_turn6,' eel_turn6_num', +cd & 16*eel_turn6_num +cd goto 1112 + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel_turn6*g_contij(ll,1) +cgrad ggg2(ll)=eel_turn6*g_contij(ll,2) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gturn6ij=eel_turn6*g_contij(ll,1)+ekont*derx_turn(ll,1,1) + gturn6kl=eel_turn6*g_contij(ll,2)+ekont*derx_turn(ll,1,2) + gcorr6_turn(ll,i)=gcorr6_turn(ll,i)!+ghalf + & +ekont*derx_turn(ll,2,1) + gcorr6_turn(ll,i+1)=gcorr6_turn(ll,i+1)+ekont*derx_turn(ll,3,1) + gcorr6_turn(ll,j)=gcorr6_turn(ll,j)!+ghalf + & +ekont*derx_turn(ll,4,1) + gcorr6_turn(ll,j1)=gcorr6_turn(ll,j1)+ekont*derx_turn(ll,5,1) + gcorr6_turn_long(ll,j)=gcorr6_turn_long(ll,j)+gturn6ij + gcorr6_turn_long(ll,i)=gcorr6_turn_long(ll,i)-gturn6ij +cgrad ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gcorr6_turn(ll,k)=gcorr6_turn(ll,k)!+ghalf + & +ekont*derx_turn(ll,2,2) + gcorr6_turn(ll,k+1)=gcorr6_turn(ll,k+1)+ekont*derx_turn(ll,3,2) + gcorr6_turn(ll,l)=gcorr6_turn(ll,l)!+ghalf + & +ekont*derx_turn(ll,4,2) + gcorr6_turn(ll,l1)=gcorr6_turn(ll,l1)+ekont*derx_turn(ll,5,2) + gcorr6_turn_long(ll,l)=gcorr6_turn_long(ll,l)+gturn6kl + gcorr6_turn_long(ll,k)=gcorr6_turn_long(ll,k)-gturn6kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + eello_turn6=ekont*eel_turn6 +cd write (2,*) 'ekont',ekont +cd write (2,*) 'eel_turn6',ekont*eel_turn6 + return + end + +C----------------------------------------------------------------------------- + double precision function scalar(u,v) +!DIR$ INLINEALWAYS scalar +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::scalar +#endif + implicit none + double precision u(3),v(3) +cd double precision sc +cd integer i +cd sc=0.0d0 +cd do i=1,3 +cd sc=sc+u(i)*v(i) +cd enddo +cd scalar=sc + + scalar=u(1)*v(1)+u(2)*v(2)+u(3)*v(3) + return + end +crc------------------------------------------------- + SUBROUTINE MATVEC2(A1,V1,V2) +!DIR$ INLINEALWAYS MATVEC2 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::MATVEC2 +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A1(2,2),V1(2),V2(2) +c DO 1 I=1,2 +c VI=0.0 +c DO 3 K=1,2 +c 3 VI=VI+A1(I,K)*V1(K) +c Vaux(I)=VI +c 1 CONTINUE + + vaux1=a1(1,1)*v1(1)+a1(1,2)*v1(2) + vaux2=a1(2,1)*v1(1)+a1(2,2)*v1(2) + + v2(1)=vaux1 + v2(2)=vaux2 + END +C--------------------------------------- + SUBROUTINE MATMAT2(A1,A2,A3) +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::MATMAT2 +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A1(2,2),A2(2,2),A3(2,2) +c DIMENSION AI3(2,2) +c DO J=1,2 +c A3IJ=0.0 +c DO K=1,2 +c A3IJ=A3IJ+A1(I,K)*A2(K,J) +c enddo +c A3(I,J)=A3IJ +c enddo +c enddo + + ai3_11=a1(1,1)*a2(1,1)+a1(1,2)*a2(2,1) + ai3_12=a1(1,1)*a2(1,2)+a1(1,2)*a2(2,2) + ai3_21=a1(2,1)*a2(1,1)+a1(2,2)*a2(2,1) + ai3_22=a1(2,1)*a2(1,2)+a1(2,2)*a2(2,2) + + A3(1,1)=AI3_11 + A3(2,1)=AI3_21 + A3(1,2)=AI3_12 + A3(2,2)=AI3_22 + END + +c------------------------------------------------------------------------- + double precision function scalar2(u,v) +!DIR$ INLINEALWAYS scalar2 + implicit none + double precision u(2),v(2) + double precision sc + integer i + scalar2=u(1)*v(1)+u(2)*v(2) + return + end + +C----------------------------------------------------------------------------- + + subroutine transpose2(a,at) +!DIR$ INLINEALWAYS transpose2 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::transpose2 +#endif + implicit none + double precision a(2,2),at(2,2) + at(1,1)=a(1,1) + at(1,2)=a(2,1) + at(2,1)=a(1,2) + at(2,2)=a(2,2) + return + end +c-------------------------------------------------------------------------- + subroutine transpose(n,a,at) + implicit none + integer n,i,j + double precision a(n,n),at(n,n) + do i=1,n + do j=1,n + at(j,i)=a(i,j) + enddo + enddo + return + end +C--------------------------------------------------------------------------- + subroutine prodmat3(a1,a2,kk,transp,prod) +!DIR$ INLINEALWAYS prodmat3 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::prodmat3 +#endif + implicit none + integer i,j + double precision a1(2,2),a2(2,2),a2t(2,2),kk(2,2),prod(2,2) + logical transp +crc double precision auxmat(2,2),prod_(2,2) + + if (transp) then +crc call transpose2(kk(1,1),auxmat(1,1)) +crc call matmat2(a1(1,1),auxmat(1,1),auxmat(1,1)) +crc call matmat2(auxmat(1,1),a2(1,1),prod_(1,1)) + + prod(1,1)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(1,2))*a2(1,1) + & +(a1(1,1)*kk(2,1)+a1(1,2)*kk(2,2))*a2(2,1) + prod(1,2)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(1,2))*a2(1,2) + & +(a1(1,1)*kk(2,1)+a1(1,2)*kk(2,2))*a2(2,2) + prod(2,1)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(1,2))*a2(1,1) + & +(a1(2,1)*kk(2,1)+a1(2,2)*kk(2,2))*a2(2,1) + prod(2,2)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(1,2))*a2(1,2) + & +(a1(2,1)*kk(2,1)+a1(2,2)*kk(2,2))*a2(2,2) + + else +crc call matmat2(a1(1,1),kk(1,1),auxmat(1,1)) +crc call matmat2(auxmat(1,1),a2(1,1),prod_(1,1)) + + prod(1,1)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(2,1))*a2(1,1) + & +(a1(1,1)*kk(1,2)+a1(1,2)*kk(2,2))*a2(2,1) + prod(1,2)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(2,1))*a2(1,2) + & +(a1(1,1)*kk(1,2)+a1(1,2)*kk(2,2))*a2(2,2) + prod(2,1)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(2,1))*a2(1,1) + & +(a1(2,1)*kk(1,2)+a1(2,2)*kk(2,2))*a2(2,1) + prod(2,2)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(2,1))*a2(1,2) + & +(a1(2,1)*kk(1,2)+a1(2,2)*kk(2,2))*a2(2,2) + + endif +c call transpose2(a2(1,1),a2t(1,1)) + +crc print *,transp +crc print *,((prod_(i,j),i=1,2),j=1,2) +crc print *,((prod(i,j),i=1,2),j=1,2) + + return + end + diff --git a/source/unres/src_MD-NEWSC/energy_p_new_barrier_v3ok1.F b/source/unres/src_MD-NEWSC/energy_p_new_barrier_v3ok1.F new file mode 100644 index 0000000..1c46174 --- /dev/null +++ b/source/unres/src_MD-NEWSC/energy_p_new_barrier_v3ok1.F @@ -0,0 +1,10958 @@ + SUBROUTINE etotal(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" + double precision weights_(n_ene) +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene) + include 'COMMON.LOCAL' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' +#ifdef MPI +c print*,"ETOTAL Processor",fg_rank," absolute rank",myrank, +c & " nfgtasks",nfgtasks + if (nfgtasks.gt.1) then +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (fg_rank.eq.0) then + call MPI_Bcast(0,1,MPI_INTEGER,king,FG_COMM,IERROR) +c print *,"Processor",myrank," BROADCAST iorder" +C FG master sets up the WEIGHTS_ array which will be broadcast to the +C FG slaves as WEIGHTS array. + weights_(1)=wsc + weights_(2)=wscp + weights_(3)=welec + weights_(4)=wcorr + weights_(5)=wcorr5 + weights_(6)=wcorr6 + weights_(7)=wel_loc + weights_(8)=wturn3 + weights_(9)=wturn4 + weights_(10)=wturn6 + weights_(11)=wang + weights_(12)=wscloc + weights_(13)=wtor + weights_(14)=wtor_d + weights_(15)=wstrain + weights_(16)=wvdwpp + weights_(17)=wbond + weights_(18)=scal14 + weights_(21)=wsccor + weights_(22)=wsct +C FG Master broadcasts the WEIGHTS_ array + call MPI_Bcast(weights_(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + else +C FG slaves receive the WEIGHTS array + call MPI_Bcast(weights(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + wsc=weights(1) + wscp=weights(2) + welec=weights(3) + wcorr=weights(4) + wcorr5=weights(5) + wcorr6=weights(6) + wel_loc=weights(7) + wturn3=weights(8) + wturn4=weights(9) + wturn6=weights(10) + wang=weights(11) + wscloc=weights(12) + wtor=weights(13) + wtor_d=weights(14) + wstrain=weights(15) + wvdwpp=weights(16) + wbond=weights(17) + scal14=weights(18) + wsccor=weights(21) + wsct=weights(22) + endif + time_Bcast=time_Bcast+MPI_Wtime()-time00 + time_Bcastw=time_Bcastw+MPI_Wtime()-time00 +c call chainbuild_cart + endif +c print *,'Processor',myrank,' calling etotal ipot=',ipot +c print *,'Processor',myrank,' nnt=',nnt,' nct=',nct +#else +c if (modecalc.eq.12.or.modecalc.eq.14) then +c call int_from_cart1(.false.) +c endif +#endif +#ifdef TIMING +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +#endif +C +C Compute the side-chain and electrostatic interaction energy +C + goto (101,102,103,104,105,106,107) ipot +C Lennard-Jones potential. + 101 call elj(evdw,evdw_p,evdw_m) +cd print '(a)','Exit ELJ' + goto 108 +C Lennard-Jones-Kihara potential (shifted). + 102 call eljk(evdw,evdw_p,evdw_m) + goto 108 +C Berne-Pechukas potential (dilated LJ, angular dependence). + 103 call ebp(evdw,evdw_p,evdw_m) + goto 108 +C Gay-Berne potential (shifted LJ, angular dependence). + 104 call egb(evdw,evdw_p,evdw_m) + goto 108 +C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence). + 105 call egbv(evdw,evdw_p,evdw_m) + goto 108 +C New SC-SC potential + 106 call emomo(evdw,evdw_p,evdw_m) + goto 108 +C Soft-sphere potential + 107 call e_softsphere(evdw) +C +C Calculate electrostatic (H-bonding) energy of the main chain. +C + 108 continue +c print *,"Processor",myrank," computed USCSC" +#ifdef TIMING +#ifdef MPI + time01=MPI_Wtime() +#else + time00=tcpu() +#endif +#endif + call vec_and_deriv +#ifdef TIMING +#ifdef MPI + time_vec=time_vec+MPI_Wtime()-time01 +#else + time_vec=time_vec+tcpu()-time01 +#endif +#endif +c print *,"Processor",myrank," left VEC_AND_DERIV" + IF (ipot.lt.7) THEN +#ifdef SPLITELE + if (welec.gt.0d0.or.wvdwpp.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#else + if (welec.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#endif + call eelec(ees,evdw1,eel_loc,eello_turn3,eello_turn4) + else + ees=0.0d0 + evdw1=0.0d0 + eel_loc=0.0d0 + eello_turn3=0.0d0 + eello_turn4=0.0d0 + endif + else +c write (iout,*) "Soft-spheer ELEC potential" + call eelec_soft_sphere(ees,evdw1,eel_loc,eello_turn3, + & eello_turn4) + endif +c print *,"Processor",myrank," computed UELEC" +C +C Calculate excluded-volume interaction energy between peptide groups +C and side chains. +C + if (ipot.lt.7) then + if(wscp.gt.0d0) then + call escp(evdw2,evdw2_14) + else + evdw2=0 + evdw2_14=0 + endif + else +c write (iout,*) "Soft-sphere SCP potential" + call escp_soft_sphere(evdw2,evdw2_14) + endif +c +c Calculate the bond-stretching energy +c + call ebond(estr) +C +C Calculate the disulfide-bridge and other energy and the contributions +C from other distance constraints. +cd print *,'Calling EHPB' + call edis(ehpb) +cd print *,'EHPB exitted succesfully.' +C +C Calculate the virtual-bond-angle energy. +C + if (wang.gt.0d0) then + call ebend(ebe) + else + ebe=0 + endif +c print *,"Processor",myrank," computed UB" +C +C Calculate the SC local energy. +C + call esc(escloc) +c print *,"Processor",myrank," computed USC" +C +C Calculate the virtual-bond torsional energy. +C +cd print *,'nterm=',nterm + if (wtor.gt.0) then + call etor(etors,edihcnstr) + else + etors=0 + edihcnstr=0 + endif +c print *,"Processor",myrank," computed Utor" +C +C 6/23/01 Calculate double-torsional energy +C + if (wtor_d.gt.0) then + call etor_d(etors_d) + else + etors_d=0 + endif +c print *,"Processor",myrank," computed Utord" +C +C 21/5/07 Calculate local sicdechain correlation energy +C + write (*,*) "eback_sc_corr XX" + if (wsccor.gt.0.0d0) then + write (*,*) "eback_sc_corr 00a" + call eback_sc_corr(esccor) + else + write (*,*) "eback_sc_corr 00b" + esccor=0.0d0 + END IF +c print *,"Processor",myrank," computed Usccorr" +C +C 12/1/95 Multi-body terms +C + n_corr=0 + n_corr1=0 + if ((wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 + & .or. wturn6.gt.0.0d0) .and. ipot.lt.7) then + call multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr,n_corr1) +cd write(2,*)'multibody_eello n_corr=',n_corr,' n_corr1=',n_corr1, +cd &" ecorr",ecorr," ecorr5",ecorr5," ecorr6",ecorr6," eturn6",eturn6 + else + ecorr=0.0d0 + ecorr5=0.0d0 + ecorr6=0.0d0 + eturn6=0.0d0 + end if + if ((wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) .and. ipot.lt.7) then + call multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) +cd write (iout,*) "multibody_hb ecorr",ecorr + end if +c print *,"Processor",myrank," computed Ucorr" +C +C If performing constraint dynamics, call the constraint energy +C after the equilibration time + IF(usampl.and.totT.gt.eq_time) THEN + call EconstrQ + call Econstr_back + ELSE + Uconst=0.0d0 + Uconst_back=0.0d0 + ENDIF +#ifdef TIMING +#ifdef MPI + time_enecalc=time_enecalc+MPI_Wtime()-time00 +#else + time_enecalc=time_enecalc+tcpu()-time00 +#endif +#endif +c print *,"Processor",myrank," computed Uconstr" +#ifdef TIMING +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +#endif +c +C Sum the energies +C + energia(1)=evdw +#ifdef SCP14 + energia(2)=evdw2-evdw2_14 + energia(18)=evdw2_14 +#else + energia(2)=evdw2 + energia(18)=0.0d0 +#endif +#ifdef SPLITELE + energia(3)=ees + energia(16)=evdw1 +#else + energia(3)=ees+evdw1 + energia(16)=0.0d0 +#endif + energia(4)=ecorr + energia(5)=ecorr5 + energia(6)=ecorr6 + energia(7)=eel_loc + energia(8)=eello_turn3 + energia(9)=eello_turn4 + energia(10)=eturn6 + energia(11)=ebe + energia(12)=escloc + energia(13)=etors + energia(14)=etors_d + energia(15)=ehpb + energia(19)=edihcnstr + energia(17)=estr + energia(20)=Uconst+Uconst_back + energia(21)=esccor + energia(22)=evdw_p + energia(23)=evdw_m +c print *," Processor",myrank," calls SUM_ENERGY" + call sum_energy(energia,.true.) +c print *," Processor",myrank," left SUM_ENERGY" +#ifdef TIMING +#ifdef MPI + time_sumene=time_sumene+MPI_Wtime()-time00 +#else + time_sumene=time_sumene+tcpu()-time00 +#endif +#endif + RETURN + END SUBROUTINE etotal + + +c------------------------------------------------------------------------------- + + + subroutine sum_energy(energia,reduce) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene),enebuff(0:n_ene+1) + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' + logical reduce +#ifdef MPI + if (nfgtasks.gt.1 .and. reduce) then +#ifdef DEBUG + write (iout,*) "energies before REDUCE" + call enerprint(energia) + call flush(iout) +#endif + do i=0,n_ene + enebuff(i)=energia(i) + enddo + time00=MPI_Wtime() + call MPI_Barrier(FG_COMM,IERR) + time_barrier_e=time_barrier_e+MPI_Wtime()-time00 + time00=MPI_Wtime() + call MPI_Reduce(enebuff(0),energia(0),n_ene+1, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) +#ifdef DEBUG + write (iout,*) "energies after REDUCE" + call enerprint(energia) + call flush(iout) +#endif + time_Reduce=time_Reduce+MPI_Wtime()-time00 + endif + if (fg_rank.eq.0) then +#endif +#ifdef TSCSC + evdw=energia(22)+wsct*energia(23) +#else + evdw=energia(1) +#endif +#ifdef SCP14 + evdw2=energia(2)+energia(18) + evdw2_14=energia(18) +#else + evdw2=energia(2) +#endif +#ifdef SPLITELE + ees=energia(3) + evdw1=energia(16) +#else + ees=energia(3) + evdw1=0.0d0 +#endif + ecorr=energia(4) + ecorr5=energia(5) + ecorr6=energia(6) + eel_loc=energia(7) + eello_turn3=energia(8) + eello_turn4=energia(9) + eturn6=energia(10) + ebe=energia(11) + escloc=energia(12) + etors=energia(13) + etors_d=energia(14) + ehpb=energia(15) + edihcnstr=energia(19) + estr=energia(17) + Uconst=energia(20) + esccor=energia(21) +#ifdef SPLITELE + etot=wsc*evdw+wscp*evdw2+welec*ees+wvdwpp*evdw1 + & +wang*ebe+wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+wcorr*ecorr+wcorr5*ecorr5 + & +wcorr6*ecorr6+wturn4*eello_turn4+wturn3*eello_turn3 + & +wturn6*eturn6+wel_loc*eel_loc+edihcnstr+wtor_d*etors_d + & +wbond*estr+Uconst+wsccor*esccor +#else + etot=wsc*evdw+wscp*evdw2+welec*(ees+evdw1) + & +wang*ebe+wtor*etors+wscloc*escloc + & +wstrain*ehpb+nss*ebr+wcorr*ecorr+wcorr5*ecorr5 + & +wcorr6*ecorr6+wturn4*eello_turn4+wturn3*eello_turn3 + & +wturn6*eturn6+wel_loc*eel_loc+edihcnstr+wtor_d*etors_d + & +wbond*estr+Uconst+wsccor*esccor +#endif + energia(0)=etot +c detecting NaNQ +#ifdef ISNAN +#ifdef AIX + if (isnan(etot).ne.0) energia(0)=1.0d+99 +#else + if (isnan(etot)) energia(0)=1.0d+99 +#endif +#else + i=0 +#ifdef WINPGI + idumm=proc_proc(etot,i) +#else + call proc_proc(etot,i) +#endif + if(i.eq.1)energia(0)=1.0d+99 +#endif +#ifdef MPI + endif +#endif + return + end + + +c------------------------------------------------------------------------------- + + + subroutine sum_gradient + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include 'mpif.h' +#endif + double precision gradbufc(3,maxres),gradbufx(3,maxres), + & glocbuf(4*maxres),gradbufc_sum(3,maxres) + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.TIME1' + include 'COMMON.MAXGRAD' +#ifdef TIMING +#ifdef MPI + time01=MPI_Wtime() +#else + time01=tcpu() +#endif +#endif +#ifdef DEBUG + write (iout,*) "sum_gradient gvdwc, gvdwx" + do i=1,nres + write (iout,'(i3,3f10.5,5x,3f10.5,5x,3f10.5,5x,3f10.5)') + & i,(gvdwx(j,i),j=1,3),(gvdwcT(j,i),j=1,3),(gvdwc(j,i),j=1,3), + & (gvdwcT(j,i),j=1,3) + enddo + call flush(iout) +#endif +#ifdef MPI +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (nfgtasks.gt.1 .and. fg_rank.eq.0) + & call MPI_Bcast(1,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif +C +C 9/29/08 AL Transform parts of gradients in site coordinates to the gradient +C in virtual-bond-vector coordinates +C +#ifdef DEBUG +c write (iout,*) "gel_loc gel_loc_long and gel_loc_loc" +c do i=1,nres-1 +c write (iout,'(i5,3f10.5,2x,3f10.5,2x,f10.5)') +c & i,(gel_loc(j,i),j=1,3),(gel_loc_long(j,i),j=1,3),gel_loc_loc(i) +c enddo +c write (iout,*) "gel_loc_tur3 gel_loc_turn4" +c do i=1,nres-1 +c write (iout,'(i5,3f10.5,2x,f10.5)') +c & i,(gcorr4_turn(j,i),j=1,3),gel_loc_turn4(i) +c enddo + write (iout,*) "gradcorr5 gradcorr5_long gradcorr5_loc" + do i=1,nres + write (iout,'(i3,3f10.5,5x,3f10.5,5x,f10.5)') + & i,(gradcorr5(j,i),j=1,3),(gradcorr5_long(j,i),j=1,3), + & g_corr5_loc(i) + enddo + call flush(iout) +#endif +#ifdef SPLITELE +#ifdef TSCSC + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+wsc*wscT*gvdwcT(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#else + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#endif +#else + do i=1,nct + do j=1,3 + gradbufc(j,i)=wsc*gvdwc(j,i)+ + & wscp*(gvdwc_scp(j,i)+gvdwc_scpp(j,i))+ + & welec*gelc_long(j,i)+ + & wbond*gradb(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i)+ + & wstrain*ghpbc(j,i) + enddo + enddo +#endif +#ifdef MPI + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +#ifdef DEBUG + write (iout,*) "gradbufc before allreduce" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + do i=1,nres + do j=1,3 + gradbufc_sum(j,i)=gradbufc(j,i) + enddo + enddo +c call MPI_AllReduce(gradbufc(1,1),gradbufc_sum(1,1),3*nres, +c & MPI_DOUBLE_PRECISION,MPI_SUM,FG_COMM,IERR) +c time_reduce=time_reduce+MPI_Wtime()-time00 +#ifdef DEBUG +c write (iout,*) "gradbufc_sum after allreduce" +c do i=1,nres +c write (iout,'(i3,3f10.5)') i,(gradbufc_sum(j,i),j=1,3) +c enddo +c call flush(iout) +#endif +#ifdef TIMING +c time_allreduce=time_allreduce+MPI_Wtime()-time00 +#endif + do i=nnt,nres + do k=1,3 + gradbufc(k,i)=0.0d0 + enddo + enddo +#ifdef DEBUG + write (iout,*) "igrad_start",igrad_start," igrad_end",igrad_end + write (iout,*) (i," jgrad_start",jgrad_start(i), + & " jgrad_end ",jgrad_end(i), + & i=igrad_start,igrad_end) +#endif +c +c Obsolete and inefficient code; we can make the effort O(n) and, therefore, +c do not parallelize this part. +c +c do i=igrad_start,igrad_end +c do j=jgrad_start(i),jgrad_end(i) +c do k=1,3 +c gradbufc(k,i)=gradbufc(k,i)+gradbufc_sum(k,j) +c enddo +c enddo +c enddo + do j=1,3 + gradbufc(j,nres-1)=gradbufc_sum(j,nres) + enddo + do i=nres-2,nnt,-1 + do j=1,3 + gradbufc(j,i)=gradbufc(j,i+1)+gradbufc_sum(j,i+1) + enddo + enddo +#ifdef DEBUG + write (iout,*) "gradbufc after summing" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + else +#endif +#ifdef DEBUG + write (iout,*) "gradbufc" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif + do i=1,nres + do j=1,3 + gradbufc_sum(j,i)=gradbufc(j,i) + gradbufc(j,i)=0.0d0 + enddo + enddo + do j=1,3 + gradbufc(j,nres-1)=gradbufc_sum(j,nres) + enddo + do i=nres-2,nnt,-1 + do j=1,3 + gradbufc(j,i)=gradbufc(j,i+1)+gradbufc_sum(j,i+1) + enddo + enddo +c do i=nnt,nres-1 +c do k=1,3 +c gradbufc(k,i)=0.0d0 +c enddo +c do j=i+1,nres +c do k=1,3 +c gradbufc(k,i)=gradbufc(k,i)+gradbufc(k,j) +c enddo +c enddo +c enddo +#ifdef DEBUG + write (iout,*) "gradbufc after summing" + do i=1,nres + write (iout,'(i3,3f10.5)') i,(gradbufc(j,i),j=1,3) + enddo + call flush(iout) +#endif +#ifdef MPI + endif +#endif + do k=1,3 + gradbufc(k,nres)=0.0d0 + enddo + do i=1,nct + do j=1,3 +#ifdef SPLITELE + gradc(j,i,icg)=gradbufc(j,i)+welec*gelc(j,i)+ + & wel_loc*gel_loc(j,i)+ + & 0.5d0*(wscp*gvdwc_scpp(j,i)+ + & welec*gelc_long(j,i)+wvdwpp*gvdwpp(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gradcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i))+ + & wbond*gradb(j,i)+ + & wcorr*gradcorr(j,i)+ + & wturn3*gcorr3_turn(j,i)+ + & wturn4*gcorr4_turn(j,i)+ + & wcorr5*gradcorr5(j,i)+ + & wcorr6*gradcorr6(j,i)+ + & wturn6*gcorr6_turn(j,i)+ + & wsccor*gsccorc(j,i) + & +wscloc*gscloc(j,i) +#else + gradc(j,i,icg)=gradbufc(j,i)+welec*gelc(j,i)+ + & wel_loc*gel_loc(j,i)+ + & 0.5d0*(wscp*gvdwc_scpp(j,i)+ + & welec*gelc_long(j,i)+ + & wel_loc*gel_loc_long(j,i)+ + & wcorr*gcorr_long(j,i)+ + & wcorr5*gradcorr5_long(j,i)+ + & wcorr6*gradcorr6_long(j,i)+ + & wturn6*gcorr6_turn_long(j,i))+ + & wbond*gradb(j,i)+ + & wcorr*gradcorr(j,i)+ + & wturn3*gcorr3_turn(j,i)+ + & wturn4*gcorr4_turn(j,i)+ + & wcorr5*gradcorr5(j,i)+ + & wcorr6*gradcorr6(j,i)+ + & wturn6*gcorr6_turn(j,i)+ + & wsccor*gsccorc(j,i) + & +wscloc*gscloc(j,i) +#endif +#ifdef TSCSC + gradx(j,i,icg)=wsc*gvdwx(j,i)+wsc*wscT*gvdwxT(j,i)+ + & wscp*gradx_scp(j,i)+ + & wbond*gradbx(j,i)+ + & wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+ + & wsccor*gsccorx(j,i) + & +wscloc*gsclocx(j,i) +#else + gradx(j,i,icg)=wsc*gvdwx(j,i)+wscp*gradx_scp(j,i)+ + & wbond*gradbx(j,i)+ + & wstrain*ghpbx(j,i)+wcorr*gradxorr(j,i)+ + & wsccor*gsccorx(j,i) + & +wscloc*gsclocx(j,i) + +#endif + enddo + enddo +#ifdef DEBUG + write (iout,*) "gloc before adding corr" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif + do i=1,nres-3 + gloc(i,icg)=gloc(i,icg)+wcorr*gcorr_loc(i) + & +wcorr5*g_corr5_loc(i) + & +wcorr6*g_corr6_loc(i) + & +wturn4*gel_loc_turn4(i) + & +wturn3*gel_loc_turn3(i) + & +wturn6*gel_loc_turn6(i) + & +wel_loc*gel_loc_loc(i) + & +wsccor*gsccor_loc(i) + enddo +#ifdef DEBUG + write (iout,*) "gloc after adding corr" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif +#ifdef MPI + if (nfgtasks.gt.1) then + do j=1,3 + do i=1,nres + gradbufc(j,i)=gradc(j,i,icg) + gradbufx(j,i)=gradx(j,i,icg) + enddo + enddo + do i=1,4*nres + glocbuf(i)=gloc(i,icg) + enddo + time00=MPI_Wtime() + call MPI_Barrier(FG_COMM,IERR) + time_barrier_g=time_barrier_g+MPI_Wtime()-time00 + time00=MPI_Wtime() + call MPI_Reduce(gradbufc(1,1),gradc(1,1,icg),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + call MPI_Reduce(gradbufx(1,1),gradx(1,1,icg),3*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + call MPI_Reduce(glocbuf(1),gloc(1,icg),4*nres, + & MPI_DOUBLE_PRECISION,MPI_SUM,king,FG_COMM,IERR) + time_reduce=time_reduce+MPI_Wtime()-time00 +#ifdef DEBUG + write (iout,*) "gloc after reduce" + do i=1,4*nres + write (iout,*) i,gloc(i,icg) + enddo +#endif + endif +#endif + if (gnorm_check) then +c +c Compute the maximum elements of the gradient +c + gvdwc_max=0.0d0 + gvdwc_scp_max=0.0d0 + gelc_max=0.0d0 + gvdwpp_max=0.0d0 + gradb_max=0.0d0 + ghpbc_max=0.0d0 + gradcorr_max=0.0d0 + gel_loc_max=0.0d0 + gcorr3_turn_max=0.0d0 + gcorr4_turn_max=0.0d0 + gradcorr5_max=0.0d0 + gradcorr6_max=0.0d0 + gcorr6_turn_max=0.0d0 + gsccorc_max=0.0d0 + gscloc_max=0.0d0 + gvdwx_max=0.0d0 + gradx_scp_max=0.0d0 + ghpbx_max=0.0d0 + gradxorr_max=0.0d0 + gsccorx_max=0.0d0 + gsclocx_max=0.0d0 + do i=1,nct + gvdwc_norm=dsqrt(scalar(gvdwc(1,i),gvdwc(1,i))) + if (gvdwc_norm.gt.gvdwc_max) gvdwc_max=gvdwc_norm +#ifdef TSCSC + gvdwc_norm=dsqrt(scalar(gvdwcT(1,i),gvdwcT(1,i))) + if (gvdwc_norm.gt.gvdwc_max) gvdwc_max=gvdwc_norm +#endif + gvdwc_scp_norm=dsqrt(scalar(gvdwc_scp(1,i),gvdwc_scp(1,i))) + if (gvdwc_scp_norm.gt.gvdwc_scp_max) + & gvdwc_scp_max=gvdwc_scp_norm + gelc_norm=dsqrt(scalar(gelc(1,i),gelc(1,i))) + if (gelc_norm.gt.gelc_max) gelc_max=gelc_norm + gvdwpp_norm=dsqrt(scalar(gvdwpp(1,i),gvdwpp(1,i))) + if (gvdwpp_norm.gt.gvdwpp_max) gvdwpp_max=gvdwpp_norm + gradb_norm=dsqrt(scalar(gradb(1,i),gradb(1,i))) + if (gradb_norm.gt.gradb_max) gradb_max=gradb_norm + ghpbc_norm=dsqrt(scalar(ghpbc(1,i),ghpbc(1,i))) + if (ghpbc_norm.gt.ghpbc_max) ghpbc_max=ghpbc_norm + gradcorr_norm=dsqrt(scalar(gradcorr(1,i),gradcorr(1,i))) + if (gradcorr_norm.gt.gradcorr_max) gradcorr_max=gradcorr_norm + gel_loc_norm=dsqrt(scalar(gel_loc(1,i),gel_loc(1,i))) + if (gel_loc_norm.gt.gel_loc_max) gel_loc_max=gel_loc_norm + gcorr3_turn_norm=dsqrt(scalar(gcorr3_turn(1,i), + & gcorr3_turn(1,i))) + if (gcorr3_turn_norm.gt.gcorr3_turn_max) + & gcorr3_turn_max=gcorr3_turn_norm + gcorr4_turn_norm=dsqrt(scalar(gcorr4_turn(1,i), + & gcorr4_turn(1,i))) + if (gcorr4_turn_norm.gt.gcorr4_turn_max) + & gcorr4_turn_max=gcorr4_turn_norm + gradcorr5_norm=dsqrt(scalar(gradcorr5(1,i),gradcorr5(1,i))) + if (gradcorr5_norm.gt.gradcorr5_max) + & gradcorr5_max=gradcorr5_norm + gradcorr6_norm=dsqrt(scalar(gradcorr6(1,i),gradcorr6(1,i))) + if (gradcorr6_norm.gt.gradcorr6_max) gcorr6_max=gradcorr6_norm + gcorr6_turn_norm=dsqrt(scalar(gcorr6_turn(1,i), + & gcorr6_turn(1,i))) + if (gcorr6_turn_norm.gt.gcorr6_turn_max) + & gcorr6_turn_max=gcorr6_turn_norm + gsccorr_norm=dsqrt(scalar(gsccorc(1,i),gsccorc(1,i))) + if (gsccorr_norm.gt.gsccorr_max) gsccorr_max=gsccorr_norm + gscloc_norm=dsqrt(scalar(gscloc(1,i),gscloc(1,i))) + if (gscloc_norm.gt.gscloc_max) gscloc_max=gscloc_norm + gvdwx_norm=dsqrt(scalar(gvdwx(1,i),gvdwx(1,i))) + if (gvdwx_norm.gt.gvdwx_max) gvdwx_max=gvdwx_norm +#ifdef TSCSC + gvdwx_norm=dsqrt(scalar(gvdwxT(1,i),gvdwxT(1,i))) + if (gvdwx_norm.gt.gvdwx_max) gvdwx_max=gvdwx_norm +#endif + gradx_scp_norm=dsqrt(scalar(gradx_scp(1,i),gradx_scp(1,i))) + if (gradx_scp_norm.gt.gradx_scp_max) + & gradx_scp_max=gradx_scp_norm + ghpbx_norm=dsqrt(scalar(ghpbx(1,i),ghpbx(1,i))) + if (ghpbx_norm.gt.ghpbx_max) ghpbx_max=ghpbx_norm + gradxorr_norm=dsqrt(scalar(gradxorr(1,i),gradxorr(1,i))) + if (gradxorr_norm.gt.gradxorr_max) gradxorr_max=gradxorr_norm + gsccorrx_norm=dsqrt(scalar(gsccorx(1,i),gsccorx(1,i))) + if (gsccorrx_norm.gt.gsccorrx_max) gsccorrx_max=gsccorrx_norm + gsclocx_norm=dsqrt(scalar(gsclocx(1,i),gsclocx(1,i))) + if (gsclocx_norm.gt.gsclocx_max) gsclocx_max=gsclocx_norm + enddo + if (gradout) then +#ifdef AIX + open(istat,file=statname,position="append") +#else + open(istat,file=statname,access="append") +#endif + write (istat,'(1h#,21f10.2)') gvdwc_max,gvdwc_scp_max, + & gelc_max,gvdwpp_max,gradb_max,ghpbc_max, + & gradcorr_max,gel_loc_max,gcorr3_turn_max,gcorr4_turn_max, + & gradcorr5_max,gradcorr6_max,gcorr6_turn_max,gsccorc_max, + & gscloc_max,gvdwx_max,gradx_scp_max,ghpbx_max,gradxorr_max, + & gsccorx_max,gsclocx_max + close(istat) + if (gvdwc_max.gt.1.0d4) then + write (iout,*) "gvdwc gvdwx gradb gradbx" + do i=nnt,nct + write(iout,'(i5,4(3f10.2,5x))') i,(gvdwc(j,i),gvdwx(j,i), + & gradb(j,i),gradbx(j,i),j=1,3) + enddo + call pdbout(0.0d0,'cipiszcze',iout) + call flush(iout) + endif + endif + endif +#ifdef DEBUG + write (iout,*) "gradc gradx gloc" + do i=1,nres + write (iout,'(i5,3f10.5,5x,3f10.5,5x,f10.5)') + & i,(gradc(j,i,icg),j=1,3),(gradx(j,i,icg),j=1,3),gloc(i,icg) + enddo +#endif +#ifdef TIMING +#ifdef MPI + time_sumgradient=time_sumgradient+MPI_Wtime()-time01 +#else + time_sumgradient=time_sumgradient+tcpu()-time01 +#endif +#endif + return + end + + +c------------------------------------------------------------------------------- + + + subroutine rescale_weights(t_bath) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + double precision kfac /2.4d0/ + double precision x,x2,x3,x4,x5,licznik /1.12692801104297249644/ +c facT=temp0/t_bath +c facT=2*temp0/(t_bath+temp0) + if (rescale_mode.eq.0) then + facT=1.0d0 + facT2=1.0d0 + facT3=1.0d0 + facT4=1.0d0 + facT5=1.0d0 + else if (rescale_mode.eq.1) then + facT=kfac/(kfac-1.0d0+t_bath/temp0) + facT2=kfac**2/(kfac**2-1.0d0+(t_bath/temp0)**2) + facT3=kfac**3/(kfac**3-1.0d0+(t_bath/temp0)**3) + facT4=kfac**4/(kfac**4-1.0d0+(t_bath/temp0)**4) + facT5=kfac**5/(kfac**5-1.0d0+(t_bath/temp0)**5) + else if (rescale_mode.eq.2) then + x=t_bath/temp0 + x2=x*x + x3=x2*x + x4=x3*x + x5=x4*x + facT=licznik/dlog(dexp(x)+dexp(-x)) + facT2=licznik/dlog(dexp(x2)+dexp(-x2)) + facT3=licznik/dlog(dexp(x3)+dexp(-x3)) + facT4=licznik/dlog(dexp(x4)+dexp(-x4)) + facT5=licznik/dlog(dexp(x5)+dexp(-x5)) + else + write (iout,*) "Wrong RESCALE_MODE",rescale_mode + write (*,*) "Wrong RESCALE_MODE",rescale_mode +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,IERROR) +#endif + stop 555 + endif + welec=weights(3)*fact + wcorr=weights(4)*fact3 + wcorr5=weights(5)*fact4 + wcorr6=weights(6)*fact5 + wel_loc=weights(7)*fact2 + wturn3=weights(8)*fact2 + wturn4=weights(9)*fact3 + wturn6=weights(10)*fact5 + wtor=weights(13)*fact + wtor_d=weights(14)*fact2 + wsccor=weights(21)*fact +#ifdef TSCSC +c wsct=t_bath/temp0 + wsct=(320.0+80.0*dtanh((t_bath-320.0)/80.0))/320.0 +#endif + return + end + + +C------------------------------------------------------------------------ + + + subroutine enerprint(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.MD' + double precision energia(0:n_ene) + etot=energia(0) +#ifdef TSCSC + evdw=energia(22)+wsct*energia(23) +#else + evdw=energia(1) +#endif + evdw2=energia(2) +#ifdef SCP14 + evdw2=energia(2)+energia(18) +#else + evdw2=energia(2) +#endif + ees=energia(3) +#ifdef SPLITELE + evdw1=energia(16) +#endif + ecorr=energia(4) + ecorr5=energia(5) + ecorr6=energia(6) + eel_loc=energia(7) + eello_turn3=energia(8) + eello_turn4=energia(9) + eello_turn6=energia(10) + ebe=energia(11) + escloc=energia(12) + etors=energia(13) + etors_d=energia(14) + ehpb=energia(15) + edihcnstr=energia(19) + estr=energia(17) + Uconst=energia(20) + esccor=energia(21) +#ifdef SPLITELE + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec,evdw1,wvdwpp, + & estr,wbond,ebe,wang, + & escloc,wscloc,etors,wtor,etors_d,wtor_d,ehpb,wstrain, + & ecorr,wcorr, + & ecorr5,wcorr5,ecorr6,wcorr6,eel_loc,wel_loc,eello_turn3,wturn3, + & eello_turn4,wturn4,eello_turn6,wturn6,esccor,wsccor, + & edihcnstr,ebr*nss, + & Uconst,etot + 10 format (/'Virtual-chain energies:'// + & 'EVDW= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-SC)'/ + & 'EVDW2= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-p)'/ + & 'EES= ',1pE16.6,' WEIGHT=',1pD16.6,' (p-p)'/ + & 'EVDWPP=',1pE16.6,' WEIGHT=',1pD16.6,' (p-p VDW)'/ + & 'ESTR= ',1pE16.6,' WEIGHT=',1pD16.6,' (stretching)'/ + & 'EBE= ',1pE16.6,' WEIGHT=',1pD16.6,' (bending)'/ + & 'ESC= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC local)'/ + & 'ETORS= ',1pE16.6,' WEIGHT=',1pD16.6,' (torsional)'/ + & 'ETORSD=',1pE16.6,' WEIGHT=',1pD16.6,' (double torsional)'/ + & 'EHBP= ',1pE16.6,' WEIGHT=',1pD16.6, + & ' (SS bridges & dist. cnstr.)'/ + & 'ECORR4=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR5=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR6=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'EELLO= ',1pE16.6,' WEIGHT=',1pD16.6,' (electrostatic-local)'/ + & 'ETURN3=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 3rd order)'/ + & 'ETURN4=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 4th order)'/ + & 'ETURN6=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 6th order)'/ + & 'ESCCOR=',1pE16.6,' WEIGHT=',1pD16.6,' (backbone-rotamer corr)'/ + & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/ + & 'ESS= ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ + & 'UCONST= ',1pE16.6,' (Constraint energy)'/ + & 'ETOT= ',1pE16.6,' (total)') +#else + write (iout,10) evdw,wsc,evdw2,wscp,ees,welec, + & estr,wbond,ebe,wang, + & escloc,wscloc,etors,wtor,etors_d,wtor_d,ehpb,wstrain, + & ecorr,wcorr, + & ecorr5,wcorr5,ecorr6,wcorr6,eel_loc,wel_loc,eello_turn3,wturn3, + & eello_turn4,wturn4,eello_turn6,wturn6,esccor,wsccro,edihcnstr, + & ebr*nss,Uconst,etot + 10 format (/'Virtual-chain energies:'// + & 'EVDW= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-SC)'/ + & 'EVDW2= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC-p)'/ + & 'EES= ',1pE16.6,' WEIGHT=',1pD16.6,' (p-p)'/ + & 'ESTR= ',1pE16.6,' WEIGHT=',1pD16.6,' (stretching)'/ + & 'EBE= ',1pE16.6,' WEIGHT=',1pD16.6,' (bending)'/ + & 'ESC= ',1pE16.6,' WEIGHT=',1pD16.6,' (SC local)'/ + & 'ETORS= ',1pE16.6,' WEIGHT=',1pD16.6,' (torsional)'/ + & 'ETORSD=',1pE16.6,' WEIGHT=',1pD16.6,' (double torsional)'/ + & 'EHBP= ',1pE16.6,' WEIGHT=',1pD16.6, + & ' (SS bridges & dist. cnstr.)'/ + & 'ECORR4=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR5=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'ECORR6=',1pE16.6,' WEIGHT=',1pD16.6,' (multi-body)'/ + & 'EELLO= ',1pE16.6,' WEIGHT=',1pD16.6,' (electrostatic-local)'/ + & 'ETURN3=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 3rd order)'/ + & 'ETURN4=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 4th order)'/ + & 'ETURN6=',1pE16.6,' WEIGHT=',1pD16.6,' (turns, 6th order)'/ + & 'ESCCOR=',1pE16.6,' WEIGHT=',1pD16.6,' (backbone-rotamer corr)'/ + & 'EDIHC= ',1pE16.6,' (dihedral angle constraints)'/ + & 'ESS= ',1pE16.6,' (disulfide-bridge intrinsic energy)'/ + & 'UCONST=',1pE16.6,' (Constraint energy)'/ + & 'ETOT= ',1pE16.6,' (total)') +#endif + return + end + + +C----------------------------------------------------------------------- + + + subroutine elj(evdw,evdw_p,evdw_m) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJ potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (accur=1.0d-10) + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.TORSION' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) +c write(iout,*)'Entering ELJ nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C Change 12/1/95 + num_conti=0 +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) +cd write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint), +cd & 'iend=',iend(i,iint) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi +C Change 12/1/95 to calculate four-body interactions + rij=xj*xj+yj*yj+zj*zj + rrij=1.0D0/rij +c write (iout,*)'i=',i,' j=',j,' itypi=',itypi,' itypj=',itypj + eps0ij=eps(itypi,itypj) + fac=rrij**expon2 + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=e1+e2 +cd sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +cd epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),6(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & restyp(itypi),i,restyp(itypj),j,aa(itypi,itypj), +cd & bb(itypi,itypj),1.0D0/dsqrt(rrij),evdwij,epsi,sigm, +cd & (c(k,i),k=1,3),(c(k,j),k=1,3) +#ifdef TSCSC + if (bb(itypi,itypj).gt.0) then + evdw_p=evdw_p+evdwij + else + evdw_m=evdw_m+evdwij + endif +#else + evdw=evdw+evdwij +#endif +C +C Calculate the components of the gradient in DC and X +C + fac=-rrij*(e1+evdwij) + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +#ifdef TSCSC + if (bb(itypi,itypj).gt.0.0d0) then + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo + else + do k=1,3 + gvdwxT(k,i)=gvdwxT(k,i)-gg(k) + gvdwxT(k,j)=gvdwxT(k,j)+gg(k) + gvdwcT(k,i)=gvdwcT(k,i)-gg(k) + gvdwcT(k,j)=gvdwcT(k,j)+gg(k) + enddo + endif +#else + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo +#endif +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad gvdwc(l,k)=gvdwc(l,k)+gg(l) +cgrad enddo +cgrad enddo +C +C 12/1/95, revised on 5/20/97 +C +C Calculate the contact function. The ith column of the array JCONT will +C contain the numbers of atoms that make contacts with the atom I (of numbers +C greater than I). The arrays FACONT and GACONT will contain the values of +C the contact function and its derivative. +C +C Uncomment next line, if the correlation interactions include EVDW explicitly. +c if (j.gt.i+1 .and. evdwij.le.0.0D0) then +C Uncomment next line, if the correlation interactions are contact function only + if (j.gt.i+1.and. eps0ij.gt.0.0D0) then + rij=dsqrt(rij) + sigij=sigma(itypi,itypj) + r0ij=rs0(itypi,itypj) +C +C Check whether the SC's are not too far to make a contact. +C + rcut=1.5d0*r0ij + call gcont(rij,rcut,1.0d0,0.2d0*rcut,fcont,fprimcont) +C Add a new contact, if the SC's are close enough, but not too close (r.< +c! om = omega, sqom = om^2 + sqom1 = om1 * om1 + sqom2 = om2 * om2 + sqom12 = om12 * om12 +c! now we calculate FGB - Gey-Berne Force. +c! It will be summed up in evdwij and saved in evdw + sigsq = 1.0D0 / sigsq + sig = sig0ij * dsqrt(sigsq) + rij_shift = 1.0D0 / rij - sig + sig0ij + IF (rij_shift.le.0.0D0) THEN + evdw = 1.0D20 + RETURN + END IF + sigder = -sig * sigsq + rij_shift = 1.0D0 / rij_shift + fac = rij_shift**expon + c1 = fac * fac * aa(itypi,itypj) + c2 = fac * bb(itypi,itypj) + evdwij = eps1 * eps2rt * eps3rt * ( c1 + c2 ) + eps2der = evdwij * eps3rt + eps3der = evdwij * eps2rt + evdwij = evdwij * eps2rt * eps3rt +#ifdef TSCSC + IF (bb(itypi,itypj).gt.0) THEN + evdw_p = evdw_p + evdwij + ELSE + evdw_m = evdw_m + evdwij + END IF +#else + evdw = evdw + & + evdwij +#endif +c!------------------------------------------------------------------- +c! Calculate some components of GGB and EGB + c1 = c1 * eps1 * eps2rt**2 * eps3rt**2 + fac = -expon * (c1 + evdwij) * rij_shift + sigder = fac * sigder + fac = rij * fac +c! fac = 0.0d0 +c! Calculate the radial part of GGB + gg(1) = xj * fac + gg(2) = yj * fac + gg(3) = zj * fac + +c! The angular derivatives of GGB are brought together in sc_grad +c!------------------------------------------------------------------- +c! Fcav +c! +c! Catch gly-gly interactions to skip calculation of something that +c! does not exist + + IF (itypi.eq.10.and.itypj.eq.10) THEN + Fcav = 0.0d0 + dFdR = 0.0d0 + dCAVdOM1 = 0.0d0 + dCAVdOM2 = 0.0d0 + dCAVdOM12 = 0.0d0 + ELSE + +c! we are not 2 glycines, so we calculate Fcav + fac = chis1 * sqom1 + chis2 * sqom2 + & - 2.0d0 * chis12 * om1 * om2 * om12 +c! we will use pom later in Gcav, so dont mess with it! + pom = 1.0d0 - chis1 * chis2 * sqom12 + + Lambf = (1.0d0 - (fac / pom)) + Lambf = dsqrt(Lambf) + + sparrow = 1.0d0 / dsqrt(sig1**2.0d0 + sig2**2.0d0) + Chif = Rtail * sparrow + ChiLambf = Chif * Lambf + eagle = dsqrt(ChiLambf) + bat = ChiLambf ** 11.0d0 + + top = b1 * ( eagle + b2 * ChiLambf - b3 ) + bot = 1.0d0 + b4 * (ChiLambf * bat) + botsq = bot * bot + + Fcav = top / bot + +c!------------------------------------------------------------------- +c! derivative of Fcav is Gcav... +c!--------------------------------------------------- + + dtop = b1 * ((Lambf / (2.0d0 * eagle)) + (b2 * Lambf)) + dbot = 12.0d0 * b4 * bat * Lambf + dFdR = ((dtop * bot - top * dbot) / botsq) * sparrow + + dtop = b1 * ((Chif / (2.0d0 * eagle)) + (b2 * Chif)) + dbot = 12.0d0 * b4 * bat * Chif + eagle = Lambf * pom + dFdOM1 = -(chis1 * om1 - chis12 * om2 * om12) / (eagle) + dFdOM2 = -(chis2 * om2 - chis12 * om1 * om12) / (eagle) + dFdOM12 = chis12 * (chis1 * om1 * om12 - om2) + & * (chis2 * om2 * om12 - om1) / (eagle * pom) + + dFdL = ((dtop * bot - top * dbot) / botsq) + dCAVdOM1 = dFdL * ( dFdOM1 ) + dCAVdOM2 = dFdL * ( dFdOM2 ) + dCAVdOM12 = dFdL * ( dFdOM12 ) +c!---------------------------------------------------- +c! Finally, add the distance derivatives to gvdwc +c! Fac is used here to project the gradient vector into +c! cartesian coordinates +c! derivatives of omega angles will be added in sc_grad + DO k = 1, 3 + fac = Rtail_distance(k) / Rtail + gvdwx(k,i) = gvdwx(k,i) + & - dFdR * fac + + gvdwx(k,j) = gvdwx(k,j) + & + dFdR * fac + + gvdwc(k,i) = gvdwc(k,i) + & - dFdR * fac + + gvdwc(k,j) = gvdwc(k,j) + & + dFdR * fac + END DO + +c!------------------------------------------------------------------- +c! Compute head-head and head-tail energies for each state + + isel = iabs(Qi) + iabs(Qj) + IF (isel.eq.0) THEN +c! No charges - do nothing + eheadtail = 0.0d0 + + ELSE IF (isel.eq.4) THEN +c! Calculate dipole-dipole interactions + CALL edd(ecl) + eheadtail = ECL + + ELSE IF (isel.eq.1 .and. iabs(Qi).eq.1) THEN +c! Charge-nonpolar interactions + CALL eqn(epol) + eheadtail = epol + + ELSE IF (isel.eq.1 .and. iabs(Qj).eq.1) THEN +c! Nonpolar-charge interactions + CALL enq(epol) + eheadtail = epol + + ELSE IF (isel.eq.3 .and. icharge(itypj).eq.2) THEN +c! Charge-dipole interactions + CALL eqd(ecl, elj, epol) + eheadtail = ECL + elj + epol + + ELSE IF (isel.eq.3 .and. icharge(itypi).eq.2) THEN +c! Dipole-charge interactions + CALL edq(ecl, elj, epol) + eheadtail = ECL + elj + epol + + ELSE IF ((isel.eq.2.and. + & iabs(Qi).eq.1).and. + & nstate(itypi,itypj).eq.1) THEN +c! Same charge-charge interaction ( +/+ or -/- ) + CALL eqq(Ecl,Egb,Epol,Fisocav,Elj) + eheadtail = ECL + Egb + Epol + Fisocav + Elj + + ELSE IF ((isel.eq.2.and. + & iabs(Qi).eq.1).and. + & nstate(itypi,itypj).ne.1) THEN +c! Different charge-charge interaction ( +/- or -/+ ) + CALL energy_quad + & (istate,eheadtail,Ecl,Egb,Epol,Fisocav,Elj,Equad) + END IF + +c! this endif ends the "catch the gly-gly" at the beggining of Fcav + END IF + evdw = evdw + & + Fcav + & + eheadtail +c!------------------------------------------------------------------- +c! As all angular derivatives are done, now we sum them up, +c! then transform and project into cartesian vectors and add to gvdwc +c! We call sc_grad always, with the exception of +/- interaction. +c! This is because energy_quad subroutine needs to handle +c! this job in his own way. +c! This IS probably not very efficient and SHOULD be optimised +c! but it will require major restructurization of emomo +c! so it will be left as it is for now + IF (nstate(itypi,itypj).eq.1) THEN +#ifdef TSCSC + IF (bb(itypi,itypj).gt.0) THEN + CALL sc_grad + ELSE + CALL sc_grad_T + END IF +#else + CALL sc_grad +#endif + END IF +c!------------------------------------------------------------------- +c! NAPISY KONCOWE +c! j + END DO +c! iint + END DO +c! i + END DO +c write (iout,*) "Number of loop steps in EGB:",ind +cccc energy_dec=.false. + RETURN + END SUBROUTINE emomo + +c! END OF MOMO +C-------------------------------------------------------------------- + + + SUBROUTINE eqq(Ecl,Egb,Epol,Fisocav,Elj) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar +c! Epol and Gpol analytical parameters + alphapol1 = alphapol(itypi,itypj) + alphapol2 = alphapol(itypj,itypi) +c! Fisocav and Gisocav analytical parameters + al1 = alphiso(1,itypi,itypj) + al2 = alphiso(2,itypi,itypj) + al3 = alphiso(3,itypi,itypj) + al4 = alphiso(4,itypi,itypj) + csig = sigiso(itypi, itypj) +c! + w1 = wqdip(1,itypi,itypj) + w2 = wqdip(2,itypi,itypj) + pis = sig0head(itypi,itypj) + eps0 = epshead(itypi,itypj) + Rhead_sq = Rhead * Rhead + +c! R1 - distance between head of ith side chain and tail of jth sidechain +c! R2 - distance between head of jth side chain and tail of ith sidechain + R1 = 0.0d0 + R2 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R1=R1+(ctail(k,2)-chead(k,1))**2 + R2=R2+(chead(k,2)-ctail(k,1))**2 + END DO +c! Pitagoras + R1 = dsqrt(R1) + R2 = dsqrt(R2) + +c!------------------------------------------------------------------- +c! Coulomb electrostatic interaction + Ecl = (332.0d0 * Qij) / Rhead +c! write (*,*) "Ecl = ", Ecl +c! derivative of Ecl is Gcl... + dGCLdR = (-332.0d0 * Qij ) / Rhead_sq +c! ============= +c! Ecl = 0.0d0 +c! dGCLdR = 0.0d0 +c! ============= + dGCLdOM1 = 0.0d0 + dGCLdOM2 = 0.0d0 + dGCLdOM12 = 0.0d0 +c!------------------------------------------------------------------- +c! Generalised Born Solvent Polarization + ee = dexp(-( Rhead_sq ) / (4.0d0 * a12sq)) + Fgb = sqrt( ( Rhead_sq ) + a12sq * ee) + Egb = (332.0d0 * Qij * eps_inout_fac) / Fgb + +c! Derivative of Egb is Ggb... + dGGBdFGB = (-332.0d0 * Qij * eps_inout_fac) / (Fgb * Fgb) + dFGBdR = ( Rhead * ( 2.0d0 - (0.5d0 * ee) ) ) + & / ( 2.0d0 * Fgb ) + dGGBdR = dGGBdFGB * dFGBdR + +c! ============= +c! write (*,*) "Fgb = ", Fgb +c! write (*,*) "Egb = ", Egb +c! write (*,*) "dFGBdR = ", dFGBdR +c! write (*,*) "dGGBdR = ", dGGBdR +c! Egb = 0.0d0 +c! dGGBdR = 0.0d0 +c! ============= +c!------------------------------------------------------------------- +c! Fisocav - isotropic cavity creation term + pom = Rhead * csig + top = al1 * (dsqrt(pom) + al2 * pom - al3) + bot = (1.0d0 + al4 * pom**12.0d0) + botsq = bot * bot + FisoCav = top / bot + +c! Derivative of Fisocav is GCV... + dtop = al1 * ((1.0d0 / (2.0d0 * dsqrt(pom))) + al2) + dbot = 12.0d0 * al4 * pom ** 11.0d0 + dGCVdR = ((dtop * bot - top * dbot) / botsq) * csig + +c! ============= +c! FisoCav = 0.0d0 +c! dGCVdR = 0.0d0 +c! ============= +c!------------------------------------------------------------------- +c! Polarization energy +c! Epol + MomoFac1 = (1.0d0 - chi1 * sqom2) + MomoFac2 = (1.0d0 - chi2 * sqom1) + RR1 = ( R1 * R1 ) / MomoFac1 + RR2 = ( R2 * R2 ) / MomoFac2 + ee1 = exp(-( RR1 / (4.0d0 * a12sq) )) + ee2 = exp(-( RR2 / (4.0d0 * a12sq) )) + fgb1 = sqrt( RR1 + a12sq * ee1 ) + fgb2 = sqrt( RR2 + a12sq * ee2 ) + epol = 332.0d0 * eps_inout_fac * ( + & (( alphapol1 / fgb1 )**4.0d0)+((alphapol2/fgb2) ** 4.0d0 )) + +c! derivative of Epol is Gpol... + dPOLdFGB1 = -(1328.0d0 * eps_inout_fac * alphapol1 ** 4.0d0) + & / (fgb1 ** 5.0d0) + dPOLdFGB2 = -(1328.0d0 * eps_inout_fac * alphapol2 ** 4.0d0) + & / (fgb2 ** 5.0d0) + dFGBdR1 = ( (R1 / MomoFac1) + & * ( 2.0d0 - (0.5d0 * ee1) ) ) + & / ( 2.0d0 * fgb1 ) + dFGBdR2 = ( (R2 / MomoFac2) + & * ( 2.0d0 - (0.5d0 * ee2) ) ) + & / ( 2.0d0 * fgb2 ) + dFGBdOM2 = (((R1 * R1 * chi1 * om2) / (MomoFac1 * MomoFac1)) + & * ( 2.0d0 - 0.5d0 * ee1) ) + & / ( 2.0d0 * fgb1 ) + dFGBdOM1 = (((R2 * R2 * chi2 * om1) / (MomoFac2 * MomoFac2)) + & * ( 2.0d0 - 0.5d0 * ee2) ) + & / ( 2.0d0 * fgb2 ) + dPOLdR1 = dPOLdFGB1 * dFGBdR1 + dPOLdR2 = dPOLdFGB2 * dFGBdR2 + dPOLdOM1 = dPOLdFGB2 * dFGBdOM1 + dPOLdOM2 = dPOLdFGB1 * dFGBdOM2 +c! ============= +c! Epol = 0.0d0 +c! dPOLdR1 = 0.0d0 +c! dPOLdR2 = 0.0d0 +c! dPOLdOM1 = 0.0d0 +c! dPOLdOM2 = 0.0d0 +c! ============= +c!------------------------------------------------------------------- +c! Elj + pom = (pis / Rhead)**6.0d0 + Elj = 4.0d0 * eps0 * pom * (pom-1.0d0) +c! write (*,*) "ELJ = ", ELJ +c! derivative of Elj is Glj + Glj = 4.0d0 * eps0 + & * (((-12.0d0*pis**12.0d0)/(Rhead**13.0d0)) + & + (( 6.0d0*pis**6.0d0) /(Rhead**7.0d0))) +c! dGLJdR = glj * fish + dGLJdR = glj +c! ============= +c! Elj = 0.0d0 +c! dGLJdR = 0.0d0 +c! ============= +c!------------------------------------------------------------------- +c! Return the results + DO k = 1, 3 + erhead(k) = Rhead_distance(k)/Rhead + erhead_tail(k,1) = ((ctail(k,2)-chead(k,1))/R1) + erhead_tail(k,2) = ((chead(k,2)-ctail(k,1))/R2) + END DO + + erdxi = scalar( erhead(1), dC_norm(1,i+nres) ) + erdxj = scalar( erhead(1), dC_norm(1,j+nres) ) + bat = scalar( erhead_tail(1,1), dC_norm(1,i+nres) ) + eagle = scalar( erhead_tail(1,2), dC_norm(1,j+nres) ) + facd1 = d1 * vbld_inv(i+nres) + facd2 = d2 * vbld_inv(j+nres) + + DO k = 1, 3 + hawk = (erhead_tail(k,1) + + & facd1 * (erhead_tail(k,1) - bat * dC_norm(k,i+nres))) + condor = (erhead_tail(k,2) + + & facd2 * (erhead_tail(k,2) - eagle * dC_norm(k,j+nres))) + + pom = erhead(k)+facd1*(erhead(k)-erdxi*dC_norm(k,i+nres)) + gvdwx(k,i) = gvdwx(k,i) + & - dGCLdR * pom + & - dGGBdR * pom + & - dGCVdR * pom + & - dPOLdR1 * hawk + & - dPOLdR2 * erhead_tail(k,2) + & - dGLJdR * pom + + pom = erhead(k)+facd2*(erhead(k)-erdxj*dC_norm(k,j+nres)) + gvdwx(k,j) = gvdwx(k,j) + & + dGCLdR * pom + & + dGGBdR * pom + & + dGCVdR * pom + & + dPOLdR1 * erhead_tail(k,1) + & + dPOLdR2 * condor + & + dGLJdR * pom + + gvdwc(k,i) = gvdwc(k,i) + & - dGCLdR * erhead(k) + & - dGGBdR * erhead(k) + & - dGCVdR * erhead(k) + & - dPOLdR1 * erhead_tail(k,1) + & - dPOLdR2 * erhead_tail(k,2) + & - dGLJdR * erhead(k) + + gvdwc(k,j) = gvdwc(k,j) + & + dGCLdR * erhead(k) + & + dGGBdR * erhead(k) + & + dGCVdR * erhead(k) + & + dPOLdR1 * erhead_tail(k,1) + & + dPOLdR2 * erhead_tail(k,2) + & + dGLJdR * erhead(k) + + END DO + RETURN + END SUBROUTINE eqq + + +c!------------------------------------------------------------------- + + SUBROUTINE energy_quad + &(istate,eheadtail,Ecl,Egb,Epol,Fisocav,Elj,Equad) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar + double precision ener(4) + double precision dcosom1(3),dcosom2(3) +c! Epol and Gpol analytical parameters + alphapol1 = alphapol(itypi,itypj) + alphapol2 = alphapol(itypj,itypi) +c! Fisocav and Gisocav analytical parameters + al1 = alphiso(1,itypi,itypj) + al2 = alphiso(2,itypi,itypj) + al3 = alphiso(3,itypi,itypj) + al4 = alphiso(4,itypi,itypj) + csig = sigiso(itypi, itypj) +c! + w1 = wqdip(1,itypi,itypj) + w2 = wqdip(2,itypi,itypj) + pis = sig0head(itypi,itypj) + eps0 = epshead(itypi,itypj) + +c! First things first: +c! We need to do sc_grad's job with GB and Fcav + + eom1 = + & eps2der * eps2rt_om1 + & - 2.0D0 * alf1 * eps3der + & + sigder * sigsq_om1 + & + dCAVdOM1 + + eom2 = + & eps2der * eps2rt_om2 + & + 2.0D0 * alf2 * eps3der + & + sigder * sigsq_om2 + & + dCAVdOM2 + + eom12 = + & evdwij * eps1_om12 + & + eps2der * eps2rt_om12 + & - 2.0D0 * alf12 * eps3der + & + sigder *sigsq_om12 + & + dCAVdOM12 + +c! now some magical transformations to project gradient into +c! three cartesian vectors + + DO k = 1, 3 + dcosom1(k) = rij * (dc_norm(k,nres+i) - om1 * erij(k)) + dcosom2(k) = rij * (dc_norm(k,nres+j) - om2 * erij(k)) + gg(k) = gg(k) + eom1 * dcosom1(k) + eom2 * dcosom2(k) +c! this acts on hydrophobic center of interaction + gvdwx(k,i)= gvdwx(k,i) - gg(k) + & + (eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & + eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + gvdwx(k,j)= gvdwx(k,j) + gg(k) + & + (eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & + eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv +c! this acts on Calpha + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + END DO + +c! sc_grad is done, now we will compute + + eheadtail = 0.0d0 + eom1 = 0.0d0 + eom2 = 0.0d0 + eom12 = 0.0d0 +c************************************************************* + DO istate = 1, nstate(itypi,itypj) +c! DO istate = 1, 1 +c! write (*,*) "istate = ", istate +c************************************************************* + IF (istate.ne.1) THEN + IF (istate.lt.3) THEN + ii = 1 + ELSE + ii = 2 + END IF + jj = istate/ii + d1 = dhead(1,ii,itypi,itypj) + d2 = dhead(2,jj,itypi,itypj) + DO k = 1,3 + chead(k,1) = c(k, i+nres) + d1 * dc_norm(k, i+nres) + chead(k,2) = c(k, j+nres) + d2 * dc_norm(k, j+nres) + Rhead_distance(k) = chead(k,2) - chead(k,1) + END DO +c! pitagoras (root of sum of squares) + Rhead = dsqrt( + & (Rhead_distance(1)*Rhead_distance(1)) + & + (Rhead_distance(2)*Rhead_distance(2)) + & + (Rhead_distance(3)*Rhead_distance(3))) + END IF + Rhead_sq = Rhead * Rhead + +c! R1 - distance between head of ith side chain and tail of jth sidechain +c! R2 - distance between head of jth side chain and tail of ith sidechain + R1 = 0.0d0 + R2 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R1=R1+(ctail(k,2)-chead(k,1))**2 + R2=R2+(chead(k,2)-ctail(k,1))**2 + END DO +c! Pitagoras + R1 = dsqrt(R1) + R2 = dsqrt(R2) + +c!------------------------------------------------------------------- +c! Coulomb electrostatic interaction + Ecl = (332.0d0 * Qij) / Rhead +c! write (*,*) "Ecl = ", Ecl +c! derivative of Ecl is Gcl... + dGCLdR = (-332.0d0 * Qij ) / Rhead_sq +c! ============= +c! write (*,*) "Ecl = ", Ecl +c! write (*,*) "dGCLdR = ", dGCLdR +c! Ecl = 0.0d0 +c! dGCLdR = 0.0d0 +c! ============= + dGCLdOM1 = 0.0d0 + dGCLdOM2 = 0.0d0 + dGCLdOM12 = 0.0d0 +c!------------------------------------------------------------------- +c! Generalised Born Solvent Polarization + ee = dexp(-( Rhead_sq ) / (4.0d0 * a12sq)) + Fgb = sqrt( ( Rhead_sq ) + a12sq * ee) + Egb = (332.0d0 * Qij * eps_inout_fac) / Fgb + +c! Derivative of Egb is Ggb... + dGGBdFGB = (-332.0d0 * Qij * eps_inout_fac) / (Fgb * Fgb) + dFGBdR = ( Rhead * ( 2.0d0 - (0.5d0 * ee) ) ) + & / ( 2.0d0 * Fgb ) + dGGBdR = dGGBdFGB * dFGBdR + +c! ============= +c! write (*,*) "Fgb = ", Fgb +c! write (*,*) "Egb = ", Egb +c! write (*,*) "dFGBdR = ", dFGBdR +c! write (*,*) "dGGBdR = ", dGGBdR +c! Egb = 0.0d0 +c! dGGBdR = 0.0d0 +c! ============= +c!------------------------------------------------------------------- +c! Fisocav - isotropic cavity creation term + pom = Rhead * csig + top = al1 * (dsqrt(pom) + al2 * pom - al3) + bot = (1.0d0 + al4 * pom**12.0d0) + botsq = bot * bot + FisoCav = top / bot + +c! Derivative of Fisocav is GCV... + dtop = al1 * ((1.0d0 / (2.0d0 * dsqrt(pom))) + al2) + dbot = 12.0d0 * al4 * pom ** 11.0d0 + dGCVdR = ((dtop * bot - top * dbot) / botsq) * csig + +c! ============= +c! write(*,*) "FisoCav = ", Fisocav +c! write(*,*) "dGCVdR = ", dGCVdR +c! FisoCav = 0.0d0 +c! dGCVdR = 0.0d0 +c! ============= +c!------------------------------------------------------------------- +c! Polarization energy +c! Epol + MomoFac1 = (1.0d0 - chi1 * sqom2) + MomoFac2 = (1.0d0 - chi2 * sqom1) + RR1 = ( R1 * R1 ) / MomoFac1 + RR2 = ( R2 * R2 ) / MomoFac2 + ee1 = exp(-( RR1 / (4.0d0 * a12sq) )) + ee2 = exp(-( RR2 / (4.0d0 * a12sq) )) + fgb1 = sqrt( RR1 + a12sq * ee1 ) + fgb2 = sqrt( RR2 + a12sq * ee2 ) + epol = 332.0d0 * eps_inout_fac * ( + & (( alphapol1 / fgb1 )**4.0d0)+((alphapol2/fgb2) ** 4.0d0 )) + +c! derivative of Epol is Gpol... + dPOLdFGB1 = -(1328.0d0 * eps_inout_fac * alphapol1 ** 4.0d0) + & / (fgb1 ** 5.0d0) + dPOLdFGB2 = -(1328.0d0 * eps_inout_fac * alphapol2 ** 4.0d0) + & / (fgb2 ** 5.0d0) + dFGBdR1 = ( (R1 / MomoFac1) + & * ( 2.0d0 - (0.5d0 * ee1) ) ) + & / ( 2.0d0 * fgb1 ) + dFGBdR2 = ( (R2 / MomoFac2) + & * ( 2.0d0 - (0.5d0 * ee2) ) ) + & / ( 2.0d0 * fgb2 ) + dFGBdOM2 = (((R1 * R1 * chi1 * om2) / (MomoFac1 * MomoFac1)) + & * ( 2.0d0 - 0.5d0 * ee1) ) + & / ( 2.0d0 * fgb1 ) + dFGBdOM1 = (((R2 * R2 * chi2 * om1) / (MomoFac2 * MomoFac2)) + & * ( 2.0d0 - 0.5d0 * ee2) ) + & / ( 2.0d0 * fgb2 ) + dPOLdR1 = dPOLdFGB1 * dFGBdR1 + dPOLdR2 = dPOLdFGB2 * dFGBdR2 + dPOLdOM1 = dPOLdFGB2 * dFGBdOM1 + dPOLdOM2 = dPOLdFGB1 * dFGBdOM2 +c! ============= +c! write(*,*) "Epol = ", Epol +c! write(*,*) "dPOLdR1 = ", dPOLdOM2 +c! write(*,*) "dPOLdR2 = ", dPOLdR2 +c! write(*,*) "dPOLdOM1 = ", dPOLdOM1 +c! write(*,*) "dPOLdOM2 = ", dPOLdOM2 +c! Epol = 0.0d0 +c! dPOLdR1 = 0.0d0 +c! dPOLdR2 = 0.0d0 +c! dPOLdOM1 = 0.0d0 +c! dPOLdOM2 = 0.0d0 +c! ============= +c!------------------------------------------------------------------- +c! Elj + pom = (pis / Rhead)**6.0d0 + Elj = 4.0d0 * eps0 * pom * (pom-1.0d0) +c! write (*,*) "ELJ = ", ELJ +c! derivative of Elj is Glj + dGLJdR = 4.0d0 * eps0 + & * (((-12.0d0*pis**12.0d0)/(Rhead**13.0d0)) + & + (( 6.0d0*pis**6.0d0) /(Rhead**7.0d0))) + +c! ============= +c! write (*,*) "Elj = ", Elj +c! write (*,*) "dGLJdR = ", dGLJdR +c! Elj = 0.0d0 +c! dGLJdR = 0.0d0 +c! ============= +c!------------------------------------------------------------------- +c! Equad + IF (Wqd.ne.0.0d0) THEN + + Beta1 = 5.0d0 + 3.0d0 * (sqom12 - 1.0d0) + & - 37.5d0 * ( sqom1 + sqom2 ) + & + 157.5d0 * ( sqom1 * sqom2 ) + & - 45.0d0 * om1*om2*om12 + fac = -( Wqd / (2.0d0 * Fgb**5.0d0) ) + Equad = fac * Beta1 +c! derivative of Equad... + dQUADdR = ((2.5d0 * Wqd * Beta1) / (Fgb**6.0d0)) * dFGBdR + dQUADdOM1 = fac + & * (-75.0d0*om1 + 315.0d0*om1*sqom2 - 45.0d0*om2*om12) + dQUADdOM2 = fac + & * (-75.0d0*om2 + 315.0d0*sqom1*om2 - 45.0d0*om1*om12) + dQUADdOM12 = fac + & * ( 6.0d0*om12 - 45.0d0*om1*om2 ) +c! write(*,*) "Equad = ", Equad +c! write(*,*) "dQUADdR = ", dQUADdR +c! write(*,*) "dQUADdOM1 = ", dQUADdOM1 +c! write(*,*) "dQUADdOM2 = ", dQUADdOM2 +c! write(*,*) "dQUADdOM12 = ", dQUADdOM12 + ELSE + Beta1 = 0.0d0 + Equad = 0.0d0 + END IF +c!------------------------------------------------------------------- +c! Return the results + +c! Angular stuff +c! eom1 = eom1 + dPOLdOM1 + dQUADdOM1 +c! eom2 = eom2 + dPOLdOM2 + dQUADdOM2 +c! eom12 = eom12 + dQUADdOM12 + eom1 = dPOLdOM1 + dQUADdOM1 + eom2 = dPOLdOM2 + dQUADdOM2 + eom12 = dQUADdOM12 +c! now some magical transformations to project gradient into +c! three cartesian vectors + DO k = 1, 3 + dcosom1(k) = rij * (dc_norm(k,nres+i) - om1 * erij(k)) + dcosom2(k) = rij * (dc_norm(k,nres+j) - om2 * erij(k)) +c! gg(k) = gg(k) + eom1 * dcosom1(k) + eom2 * dcosom2(k) + tuna(k) = eom1 * dcosom1(k) + eom2 * dcosom2(k) + END DO + +c! Radial stuff + DO k = 1, 3 + erhead(k) = Rhead_distance(k)/Rhead + erhead_tail(k,1) = ((ctail(k,2)-chead(k,1))/R1) + erhead_tail(k,2) = ((chead(k,2)-ctail(k,1))/R2) + END DO + erdxi = scalar( erhead(1), dC_norm(1,i+nres) ) + erdxj = scalar( erhead(1), dC_norm(1,j+nres) ) + bat = scalar( erhead_tail(1,1), dC_norm(1,i+nres) ) + eagle = scalar( erhead_tail(1,2), dC_norm(1,j+nres) ) + facd1 = d1 * vbld_inv(i+nres) + facd2 = d2 * vbld_inv(j+nres) + +c! Throw the results into gheadtail which holds gradients +c! for each micro-state + + DO k = 1, 3 + hawk = (erhead_tail(k,1) + + & facd1 * (erhead_tail(k,1) - bat * dC_norm(k,i+nres))) + condor = (erhead_tail(k,2) + + & facd2 * (erhead_tail(k,2) - eagle * dC_norm(k,j+nres))) + + pom = erhead(k)+facd1*(erhead(k)-erdxi*dC_norm(k,i+nres)) +c! this acts on hydrophobic center of interaction +c! gvdwx(k,i) = gvdwx(k,i) + gheadtail(k,1,1) = gheadtail(k,1,1) + & - dGCLdR * pom + & - dGGBdR * pom + & - dGCVdR * pom + & - dPOLdR1 * hawk + & - dPOLdR2 * erhead_tail(k,2) + & - dGLJdR * pom + & - dQUADdR * pom + & - tuna(k) + & + (eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & + eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv +c! write (*,*) "gheadtail(k,1,1) = ", gheadtail(k,1,1) + + pom = erhead(k)+facd2*(erhead(k)-erdxj*dC_norm(k,j+nres)) +c! this acts on hydrophobic center of interaction +c! gvdwx(k,j) = gvdwx(k,j) + gheadtail(k,2,1) = gheadtail(k,2,1) + & + dGCLdR * pom + & + dGGBdR * pom + & + dGCVdR * pom + & + dPOLdR1 * erhead_tail(k,1) + & + dPOLdR2 * condor + & + dGLJdR * pom + & + dQUADdR * pom + & + tuna(k) + & + (eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & + eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + +c! this acts on Calpha +c! gvdwc(k,i) = gvdwc(k,i) + gheadtail(k,3,1) = gheadtail(k,3,1) + & - dGCLdR * erhead(k) + & - dGGBdR * erhead(k) + & - dGCVdR * erhead(k) + & - dPOLdR1 * erhead_tail(k,1) + & - dPOLdR2 * erhead_tail(k,2) + & - dGLJdR * erhead(k) + & - dQUADdR * erhead(k) + & - tuna(k) + +c! this acts on Calpha +c! gvdwc(k,j) = gvdwc(k,j) + gheadtail(k,4,1) = gheadtail(k,4,1) + & + dGCLdR * erhead(k) + & + dGGBdR * erhead(k) + & + dGCVdR * erhead(k) + & + dPOLdR1 * erhead_tail(k,1) + & + dPOLdR2 * erhead_tail(k,2) + & + dGLJdR * erhead(k) + & + dQUADdR * erhead(k) + & + tuna(k) + END DO + ener(istate) = ECL + Egb + Epol + Fisocav + Elj + Equad +c! write (*,*) "ener(",istate,") = ", ener(istate) + eheadtail = eheadtail + & + wstate(istate, itypi, itypj) + & * dexp(-betaT * ener(istate)) +c! write (*,*) "wstate = ", wstate(istate, itypi, itypj) +c! write (*,*) "betaT = ", betaT +c! write (*,*) "-E1beta = ", (-betaT * ener(istate)) +c! write (*,*) "w1exp = ", (wstate(istate, itypi, itypj) +c! & * dexp(-betaT * ener(istate))) +c! foreach cartesian dimension + DO k = 1, 3 +c! foreach of two gvdwx and gvdwc + DO l = 1, 4 + gheadtail(k,l,2) = gheadtail(k,l,2) + & + wstate( istate, itypi, itypj ) + & * dexp(-betaT * ener(istate)) + & * gheadtail(k,l,1) + gheadtail(k,l,1) = 0.0d0 +c! write (*,*) "wstate = ", wstate(istate,itypi,itypj) +c! write (*,*) "-G1beta =", (-betaT * gheadtail(k,l,1)) +c! write (*,*) "top(",k,",",l,",",2,") = ", gheadtail(k,l,2) + END DO + END DO + END DO +c! Here ended the gigantic DO istate = 1, 4, which starts +c! at the beggining of the subroutine + + DO k = 1, 3 + DO l = 1, 4 + gheadtail(k,l,2) = gheadtail(k,l,2) / eheadtail +c! write (*,*) "eheadtail = ", eheadtail +c! write (*,*) "gheadtail(",k,",",l,",2) = ", +c! & gheadtail(k,l,2) + END DO + gvdwx(k,i) = gvdwx(k,i) + gheadtail(k,1,2) + gvdwx(k,j) = gvdwx(k,j) + gheadtail(k,2,2) + gvdwc(k,i) = gvdwc(k,i) + gheadtail(k,3,2) + gvdwc(k,j) = gvdwc(k,j) + gheadtail(k,4,2) + DO l = 1, 4 + gheadtail(k,l,1) = 0.0d0 + gheadtail(k,l,2) = 0.0d0 + END DO + END DO + eheadtail = (-dlog(eheadtail)) / betaT +c! write (*,*) "eheadtail_final = ", eheadtail + dPOLdOM1 = 0.0d0 + dPOLdOM2 = 0.0d0 + dQUADdOM1 = 0.0d0 + dQUADdOM2 = 0.0d0 + dQUADdOM12 = 0.0d0 + RETURN + END SUBROUTINE energy_quad + + +c!------------------------------------------------------------------- + + + SUBROUTINE eqn(Epol) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar + alphapol1 = alphapol(itypi,itypj) +c! R1 - distance between head of ith side chain and tail of jth sidechain + R1 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R1=R1+(ctail(k,2)-chead(k,1))**2 + END DO +c! Pitagoras + R1 = dsqrt(R1) +c-------------------------------------------------------------------- +c Polarization energy +c Epol + MomoFac1 = (1.0d0 - chi1 * sqom2) + RR1 = R1 * R1 / MomoFac1 + ee1 = exp(-( RR1 / (4.0d0 * a12sq) )) + fgb1 = sqrt( RR1 + a12sq * ee1) + epol = 332.0d0 * eps_inout_fac * (( alphapol1 / fgb1 )**4.0d0) +c!------------------------------------------------------------------ +c! derivative of Epol is Gpol... + dPOLdFGB1 = -(1328.0d0 * eps_inout_fac * alphapol1 ** 4.0d0) + & / (fgb1 ** 5.0d0) + + dFGBdR1 = ( (R1 / MomoFac1) + & * ( 2.0d0 - (0.5d0 * ee1) ) ) + & / ( 2.0d0 * fgb1 ) + + dFGBdOM2 = (((R1 * R1 * chi1 * om2) / (MomoFac1 * MomoFac1)) + & * (2.0d0 - 0.5d0 * ee1) ) + & / (2.0d0 * fgb1) + + dPOLdR1 = dPOLdFGB1 * dFGBdR1 + + dPOLdOM1 = 0.0d0 + + dPOLdOM2 = dPOLdFGB1 * dFGBdOM2 +c!------------------------------------------------------------------- +c! Return the results + DO k = 1, 3 + erhead_tail(k,1) = ((ctail(k,2)-chead(k,1))/R1) + END DO + + bat = scalar( erhead_tail(1,1), dC_norm(1,i+nres) ) + facd1 = d1 * vbld_inv(i+nres) + + DO k = 1, 3 + hawk = (erhead_tail(k,1) + + & facd1 * (erhead_tail(k,1) - bat * dC_norm(k,i+nres))) + + gvdwx(k,i) = gvdwx(k,i) + & - dPOLdR1 * hawk + + gvdwx(k,j) = gvdwx(k,j) + & + dPOLdR1 * erhead_tail(k,1) + + gvdwc(k,i) = gvdwc(k,i) + & - dPOLdR1 * erhead_tail(k,1) + + gvdwc(k,j) = gvdwc(k,j) + & + dPOLdR1 * erhead_tail(k,1) + + END DO + RETURN + END SUBROUTINE eqn + + +c!------------------------------------------------------------------- + + + + SUBROUTINE enq(Epol) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar + alphapol2 = alphapol(itypj,itypi) +c! R2 - distance between head of jth side chain and tail of ith sidechain + R2 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R2=R2+(chead(k,2)-ctail(k,1))**2 + END DO +c! Pitagoras + R2 = dsqrt(R2) +c------------------------------------------------------------------------ +c Polarization energy + MomoFac2 = (1.0d0 - chi2 * sqom1) + RR2 = R2 * R2 / MomoFac2 + ee2 = exp(-(RR2 / (4.0d0 * a12sq))) + fgb2 = sqrt(RR2 + a12sq * ee2) + epol = 332.0d0 * eps_inout_fac * ((alphapol2/fgb2) ** 4.0d0 ) +c!------------------------------------------------------------------- +c! derivative of Epol is Gpol... + dPOLdFGB2 = -(1328.0d0 * eps_inout_fac * alphapol2 ** 4.0d0) + & / (fgb2 ** 5.0d0) + + dFGBdR2 = ( (R2 / MomoFac2) + & * ( 2.0d0 - (0.5d0 * ee2) ) ) + & / (2.0d0 * fgb2) + + dFGBdOM1 = (((R2 * R2 * chi2 * om1) / (MomoFac2 * MomoFac2)) + & * (2.0d0 - 0.5d0 * ee2) ) + & / (2.0d0 * fgb2) + + dPOLdR2 = dPOLdFGB2 * dFGBdR2 + + dPOLdOM1 = dPOLdFGB2 * dFGBdOM1 + + dPOLdOM2 = 0.0d0 +c!------------------------------------------------------------------- +c! Return the results + DO k = 1, 3 + erhead_tail(k,2) = ((chead(k,2)-ctail(k,1))/R2) + END DO + eagle = scalar( erhead_tail(1,2), dC_norm(1,j+nres) ) + facd2 = d2 * vbld_inv(j+nres) + DO k = 1, 3 + condor = (erhead_tail(k,2) + & + facd2 * (erhead_tail(k,2) - eagle * dC_norm(k,j+nres))) + + gvdwx(k,i) = gvdwx(k,i) + & - dPOLdR2 * erhead_tail(k,2) + + gvdwx(k,j) = gvdwx(k,j) + & + dPOLdR2 * condor + + gvdwc(k,i) = gvdwc(k,i) + & - dPOLdR2 * erhead_tail(k,2) + + gvdwc(k,j) = gvdwc(k,j) + & + dPOLdR2 * erhead_tail(k,2) + + END DO + RETURN + END SUBROUTINE enq + + +c!------------------------------------------------------------------- + + + SUBROUTINE eqd(Ecl,Elj,Epol) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar + alphapol1 = alphapol(itypi,itypj) + w1 = wqdip(1,itypi,itypj) + w2 = wqdip(2,itypi,itypj) + pis = sig0head(itypi,itypj) + eps0 = epshead(itypi,itypj) +c!------------------------------------------------------------------- +c! R1 - distance between head of ith side chain and tail of jth sidechain + R1 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R1=R1+(ctail(k,2)-chead(k,1))**2 + END DO +c! Pitagoras + R1 = dsqrt(R1) + +c!------------------------------------------------------------------- +c! ecl + sparrow = w1 * Qi * om1 + hawk = w2 * Qi * Qi * (1.0d0 - sqom2) + Ecl = sparrow / Rhead**2.0d0 + & - hawk / Rhead**4.0d0 +c! Ecl = 0.0d0 +c! write (iout,*) "ECL = ", ECL +c!------------------------------------------------------------------- +c! derivative of ecl is Gcl +c! dF/dr part + dGCLdR = - 2.0d0 * sparrow / Rhead**3.0d0 + & + 4.0d0 * hawk / Rhead**5.0d0 +c! dGCLdR = 0.0d0 +c! dF/dom1 + dGCLdOM1 = (w1 * Qi) / (Rhead**2.0d0) +c! dGCLdOM1 = 0.0d0 +c! dF/dom2 + dGCLdOM2 = (2.0d0 * w2 * Qi * Qi * om2) / (Rhead ** 4.0d0) +c! dGCLdOM2 = 0.0d0 +c-------------------------------------------------------------------- +c Polarization energy +c Epol + MomoFac1 = (1.0d0 - chi1 * sqom2) + RR1 = R1 * R1 / MomoFac1 + ee1 = exp(-( RR1 / (4.0d0 * a12sq) )) + fgb1 = sqrt( RR1 + a12sq * ee1) + epol = 332.0d0 * eps_inout_fac * (( alphapol1 / fgb1 )**4.0d0) +c! epol = 0.0d0 +c! write (iout,*) "EPOL = ", EPOL +c!------------------------------------------------------------------ +c! derivative of Epol is Gpol... + dPOLdFGB1 = -(1328.0d0 * eps_inout_fac * alphapol1 ** 4.0d0) + & / (fgb1 ** 5.0d0) + dFGBdR1 = ( (R1 / MomoFac1) + & * ( 2.0d0 - (0.5d0 * ee1) ) ) + & / ( 2.0d0 * fgb1 ) + dFGBdOM2 = (((R1 * R1 * chi1 * om2) / (MomoFac1 * MomoFac1)) + & * (2.0d0 - 0.5d0 * ee1) ) + & / (2.0d0 * fgb1) + dPOLdR1 = dPOLdFGB1 * dFGBdR1 +c! dPOLdR1 = 0.0d0 + dPOLdOM1 = 0.0d0 + dPOLdOM2 = dPOLdFGB1 * dFGBdOM2 +c! dPOLdOM2 = 0.0d0 +c!------------------------------------------------------------------- +c! Elj + pom = (pis / Rhead)**6.0d0 + Elj = 4.0d0 * eps0 * pom * (pom-1.0d0) +c! write (*,*) "ELJ = ", ELJ +c! derivative of Elj is Glj + dGLJdR = 4.0d0 * eps0 + & * (((-12.0d0*pis**12.0d0)/(Rhead**13.0d0)) + & + (( 6.0d0*pis**6.0d0) /(Rhead**7.0d0))) +c!------------------------------------------------------------------- +c! Return the results + DO k = 1, 3 + erhead(k) = Rhead_distance(k)/Rhead + erhead_tail(k,1) = ((ctail(k,2)-chead(k,1))/R1) + END DO + + erdxi = scalar( erhead(1), dC_norm(1,i+nres) ) + erdxj = scalar( erhead(1), dC_norm(1,j+nres) ) + bat = scalar( erhead_tail(1,1), dC_norm(1,i+nres) ) + facd1 = d1 * vbld_inv(i+nres) + facd2 = d2 * vbld_inv(j+nres) + + DO k = 1, 3 + hawk = (erhead_tail(k,1) + + & facd1 * (erhead_tail(k,1) - bat * dC_norm(k,i+nres))) + + pom = erhead(k)+facd1*(erhead(k)-erdxi*dC_norm(k,i+nres)) + gvdwx(k,i) = gvdwx(k,i) + & - dGCLdR * pom + & - dPOLdR1 * hawk + & - dGLJdR * pom + + pom = erhead(k)+facd2*(erhead(k)-erdxj*dC_norm(k,j+nres)) + gvdwx(k,j) = gvdwx(k,j) + & + dGCLdR * pom + & + dPOLdR1 * erhead_tail(k,1) + & + dGLJdR * pom + + + gvdwc(k,i) = gvdwc(k,i) + & - dGCLdR * erhead(k) + & - dPOLdR1 * erhead_tail(k,1) + & - dGLJdR * erhead(k) + + gvdwc(k,j) = gvdwc(k,j) + & + dGCLdR * erhead(k) + & + dPOLdR1 * erhead_tail(k,1) + & + dGLJdR * erhead(k) + + END DO + RETURN + END SUBROUTINE eqd + + +c!------------------------------------------------------------------- + + + SUBROUTINE edq(Ecl,Elj,Epol) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar + alphapol2 = alphapol(itypj,itypi) + w1 = wqdip(1,itypi,itypj) + w2 = wqdip(2,itypi,itypj) + pis = sig0head(itypi,itypj) + eps0 = epshead(itypi,itypj) +c!------------------------------------------------------------------- +c! R2 - distance between head of jth side chain and tail of ith sidechain + R2 = 0.0d0 + DO k = 1, 3 +c! Calculate head-to-tail distances + R2=R2+(chead(k,2)-ctail(k,1))**2 + END DO +c! Pitagoras + R2 = dsqrt(R2) + +c!------------------------------------------------------------------- +c! ecl + sparrow = w1 * Qi * om1 + hawk = w2 * Qi * Qi * (1.0d0 - sqom2) + ECL = sparrow / Rhead**2.0d0 + & - hawk / Rhead**4.0d0 +c! write (iout,*) "ECL = ", ECL +c! Ecl = 0.0d0 +c!------------------------------------------------------------------- +c! derivative of ecl is Gcl +c! dF/dr part + dGCLdR = - 2.0d0 * sparrow / Rhead**3.0d0 + & + 4.0d0 * hawk / Rhead**5.0d0 +c! dGCLdR = 0.0d0 +c! dF/dom1 + dGCLdOM1 = (w1 * Qi) / (Rhead**2.0d0) +c! dGCLdOM1 = 0.0d0 +c! dF/dom2 + dGCLdOM2 = (2.0d0 * w2 * Qi * Qi * om2) / (Rhead ** 4.0d0) +c! dGCLdOM2 = 0.0d0 +c-------------------------------------------------------------------- +c Polarization energy +c Epol + MomoFac2 = (1.0d0 - chi2 * sqom1) + RR2 = R2 * R2 / MomoFac2 + ee2 = exp(-(RR2 / (4.0d0 * a12sq))) + fgb2 = sqrt(RR2 + a12sq * ee2) + epol = 332.0d0 * eps_inout_fac * ((alphapol2/fgb2) ** 4.0d0 ) +c! write (iout,*) "EPOL = ", EPOL +c! epol = 0.0d0 +c!------------------------------------------------------------------ +c! derivative of Epol is Gpol... + dPOLdFGB2 = -(1328.0d0 * eps_inout_fac * alphapol2 ** 4.0d0) + & / (fgb2 ** 5.0d0) + dFGBdR2 = ( (R2 / MomoFac2) + & * ( 2.0d0 - (0.5d0 * ee2) ) ) + & / (2.0d0 * fgb2) + dFGBdOM1 = (((R2 * R2 * chi2 * om1) / (MomoFac2 * MomoFac2)) + & * (2.0d0 - 0.5d0 * ee2) ) + & / (2.0d0 * fgb2) + dPOLdR2 = dPOLdFGB2 * dFGBdR2 +c! dPOLdR1 = 0.0d0 + dPOLdOM1 = dPOLdFGB2 * dFGBdOM1 +c! dPOLdOM1 = 0.0d0 + dPOLdOM2 = 0.0d0 +c!------------------------------------------------------------------- +c! Elj + pom = (pis / Rhead)**6.0d0 + Elj = 4.0d0 * eps0 * pom * (pom-1.0d0) +c! write (iout,*) "ELJ = ", ELJ +c! derivative of Elj is Glj + dGLJdR = 4.0d0 * eps0 + & * (((-12.0d0*pis**12.0d0)/(Rhead**13.0d0)) + & + (( 6.0d0*pis**6.0d0) /(Rhead**7.0d0))) +c!------------------------------------------------------------------- +c! Return the results + DO k = 1, 3 + erhead(k) = Rhead_distance(k)/Rhead + erhead_tail(k,2) = ((chead(k,2)-ctail(k,1))/R2) + END DO + + erdxi = scalar( erhead(1), dC_norm(1,i+nres) ) + erdxj = scalar( erhead(1), dC_norm(1,j+nres) ) + eagle = scalar( erhead_tail(1,2), dC_norm(1,j+nres) ) + facd1 = d1 * vbld_inv(i+nres) + facd2 = d2 * vbld_inv(j+nres) + + DO k = 1, 3 + condor = (erhead_tail(k,2) + & + facd2 * (erhead_tail(k,2) - eagle * dC_norm(k,j+nres))) + + pom = erhead(k)+facd1*(erhead(k)-erdxi*dC_norm(k,i+nres)) + gvdwx(k,i) = gvdwx(k,i) + & - dGCLdR * pom + & - dPOLdR2 * erhead_tail(k,2) + & - dGLJdR * pom + + pom = erhead(k)+facd2*(erhead(k)-erdxj*dC_norm(k,j+nres)) + gvdwx(k,j) = gvdwx(k,j) + & + dGCLdR * pom + & + dPOLdR2 * condor + & + dGLJdR * pom + + + gvdwc(k,i) = gvdwc(k,i) + & - dGCLdR * erhead(k) + & - dPOLdR2 * erhead_tail(k,2) + & - dGLJdR * erhead(k) + + gvdwc(k,j) = gvdwc(k,j) + & + dGCLdR * erhead(k) + & + dPOLdR2 * erhead_tail(k,2) + & + dGLJdR * erhead(k) + + END DO + RETURN + END SUBROUTINE edq + + +C-------------------------------------------------------------------- + + + SUBROUTINE edd(ECL) + IMPLICIT NONE + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.CONTROL' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.EMP' + INCLUDE 'COMMON.GEO' + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.LOCAL' + INCLUDE 'COMMON.NAMES' + INCLUDE 'COMMON.VAR' + double precision scalar + csig = sigiso(itypi,itypj) + w1 = wqdip(1,itypi,itypj) + w2 = wqdip(2,itypi,itypj) +c! intermediates + sparrow = -3.0d0 * w1 + rosella = 6.0d0 * w2 + hawk = Rhead**3.0d0 +c! bat = R^6 + bat = hawk**2.0d0 +c! condor = -3w1 / R^3 + condor = sparrow / hawk +c! eagle = 6w2 / R^6 + eagle = rosella / bat + fac = (om12 - 3.0d0 * om1 * om2) + c1 = (w1 / hawk) * fac + c2 = (w2 / Rhead ** 6.0d0) + & * (4.0d0 + fac * fac -3.0d0 * (sqom1 + sqom2)) + ECL = c1 - c2 +c!------------------------------------------------------------------- +c! dervative of ECL is GCL... +c! dECL/dr + c1 = (-3.0d0 * w1 * fac) / (Rhead ** 4.0d0) + c2 = (-6.0d0 * w2) / (Rhead ** 7.0d0) + & * (4.0d0 + fac * fac - 3.0d0 * (sqom1 + sqom2)) + dGCLdR = c1 - c2 +c! dECL/dom1 + c1 = (-3.0d0 * w1 * om2 ) / (Rhead**3.0d0) + c2 = (-6.0d0 * w2) / (Rhead**6.0d0) + & * ( om2 * om12 - 3.0d0 * om1 * sqom2 + om1 ) + dGCLdOM1 = c1 - c2 +c! dECL/dom2 + c1 = (-3.0d0 * w1 * om1 ) / (Rhead**3.0d0) + c2 = (-6.0d0 * w2) / (Rhead**6.0d0) + & * ( om1 * om12 - 3.0d0 * sqom1 * om2 + om2 ) + dGCLdOM2 = c1 - c2 +c! dECL/dom12 + c1 = w1 / (Rhead ** 3.0d0) + c2 = ( 2.0d0 * w2 * fac ) / Rhead ** 6.0d0 + dGCLdOM12 = c1 - c2 +c!------------------------------------------------------------------- +c! Return the results + DO k= 1, 3 + erhead(k) = Rhead_distance(k)/Rhead + END DO + erdxi = scalar( erhead(1), dC_norm(1,i+nres) ) + erdxj = scalar( erhead(1), dC_norm(1,j+nres) ) + facd1 = d1 * vbld_inv(i+nres) + facd2 = d2 * vbld_inv(j+nres) + DO k = 1, 3 + + pom = erhead(k)+facd1*(erhead(k)-erdxi*dC_norm(k,i+nres)) + gvdwx(k,i) = gvdwx(k,i) + & - dGCLdR * pom + pom = erhead(k)+facd2*(erhead(k)-erdxj*dC_norm(k,j+nres)) + gvdwx(k,j) = gvdwx(k,j) + & + dGCLdR * pom + + gvdwc(k,i) = gvdwc(k,i) + & - dGCLdR * erhead(k) + gvdwc(k,j) = gvdwc(k,j) + & + dGCLdR * erhead(k) + END DO + RETURN + END SUBROUTINE edd + + +c!------------------------------------------------------------------- + + + SUBROUTINE elgrad_init(eheadtail,Egb,Ecl,Elj,Equad,Epol) + IMPLICIT NONE +c! maxres + INCLUDE 'DIMENSIONS' +c! itypi, itypj, i, j, k, l, chead, + INCLUDE 'COMMON.CALC' +c! c, nres, dc_norm + INCLUDE 'COMMON.CHAIN' +c! gradc, gradx + INCLUDE 'COMMON.DERIV' +c! electrostatic gradients-specific variables + INCLUDE 'COMMON.EMP' +c! wquad, dhead, alphiso, alphasur, rborn, epsintab + INCLUDE 'COMMON.INTERACT' +c! Rb + INCLUDE 'COMMON.MD' +c! io for debug, disable it in final builds + INCLUDE 'COMMON.IOUNITS' +c!------------------------------------------------------------------- +c! Variable Init + +c! what amino acid is the aminoacid j'th? + itypj=itype(j) +c! 1/(Gas Constant * Thermostate temperature) = BetaT + BetaT = 1.0d0 / (t_bath * Rb) +c! write (*,*) "t_bath = ", t_bath, "Rb = ", Rb +c! write (*,'(a,f5.3)') " Betat = ", BetaT +c! Gay-berne var's + sig0ij = sigma( itypi,itypj ) + chi1 = chi( itypi, itypj ) + chi2 = chi( itypj, itypi ) + chi12 = chi1 * chi2 + chip1 = chipp( itypi, itypj ) + chip2 = chipp( itypj, itypi ) + chip12 = chip1 * chip2 +c! not used by momo potential, but needed by sc_angular which is shared +c! by all energy_potential subroutines + alf1 = 0.0d0 + alf2 = 0.0d0 + alf12 = 0.0d0 +c! location, location, location + xj = c( 1, nres+j ) - xi + yj = c( 2, nres+j ) - yi + zj = c( 3, nres+j ) - zi + dxj = dc_norm( 1, nres+j ) + dyj = dc_norm( 2, nres+j ) + dzj = dc_norm( 3, nres+j ) +c! distance from center of chain(?) to polar/charged head + d1 = dhead(1, 1, itypi, itypj) + d2 = dhead(2, 1, itypi, itypj) +c! ai*aj from Fgb + a12sq = rborn(itypi,itypj) + a12sq = a12sq * a12sq +c! charge of amino acid itypi is... + Qi = icharge(itypi) + Qj = icharge(itypj) + Qij = Qi * Qj +c! Eps'(i,j) for Elj + eps_head = epshead(itypi,itypj) +c! chis1,2,12 + chis1 = chis(itypi,itypj) + chis2 = chis(itypj,itypi) + chis12 = chis1 * chis2 + sig1 = sigmap(itypi,itypj) + sig2 = sigmap(itypj,itypi) +c! alpha factors from Fcav/Gcav + b1 = alphasur(1,itypi,itypj) + b2 = alphasur(2,itypi,itypj) + b3 = alphasur(3,itypi,itypj) + b4 = alphasur(4,itypi,itypj) +c! used to determine wheter we want to do quadrupole calculations + wqd = wquad(itypi, itypj) + eps_in = epsintab(itypi,itypj) + eps_inout_fac = ( (1.0d0/eps_in) - (1.0d0/eps_out)) +c! write (*,*) "eps_inout_fac = ", eps_inout_fac +c!------------------------------------------------------------------- +c! tail location and distance calculations +c! shameless ripoff from emomo + Rtail = 0.0d0 + DO k = 1, 3 + ctail(k,1)=c(k,i+nres)-dtail(k,itypi)*dc_norm(k,nres+i) + ctail(k,2)=c(k,j+nres)-dtail(k,itypj)*dc_norm(k,nres+j) + END DO +c! tail distances will be themselves usefull elswhere +c1 (in Gcav, for example) + Rtail_distance(1) = ctail( 1, 2 ) - ctail( 1,1 ) + Rtail_distance(2) = ctail( 2, 2 ) - ctail( 2,1 ) + Rtail_distance(3) = ctail( 3, 2 ) - ctail( 3,1 ) + Rtail = dsqrt( + & (Rtail_distance(1)*Rtail_distance(1)) + & + (Rtail_distance(2)*Rtail_distance(2)) + & + (Rtail_distance(3)*Rtail_distance(3))) +c!------------------------------------------------------------------- +c! Calculate location and distance between polar heads +c! distance between heads +c! for each one of our three dimensional space... + DO k = 1,3 +c! location of polar head is computed by taking hydrophobic centre +c! and moving by a d1 * dc_norm vector +c! see unres publications for very informative images + chead(k,1) = c(k, i+nres) + d1 * dc_norm(k, i+nres) + chead(k,2) = c(k, j+nres) + d2 * dc_norm(k, j+nres) +c! distance +c! Rsc_distance(k) = dabs(c(k, i+nres) - c(k, j+nres)) +c! Rsc(k) = Rsc_distance(k) * Rsc_distance(k) + Rhead_distance(k) = chead(k,2) - chead(k,1) + END DO +c! pitagoras (root of sum of squares) + Rhead = dsqrt( + & (Rhead_distance(1)*Rhead_distance(1)) + & + (Rhead_distance(2)*Rhead_distance(2)) + & + (Rhead_distance(3)*Rhead_distance(3))) +c!------------------------------------------------------------------- +c! zero everything that should be zero'ed + Egb = 0.0d0 + ECL = 0.0d0 + Elj = 0.0d0 + Equad = 0.0d0 + Epol = 0.0d0 + eheadtail = 0.0d0 + dGCLdR = 0.0d0 + dGCLdOM1 = 0.0d0 + dGCLdOM2 = 0.0d0 + dGCLdOM12 = 0.0d0 + dPOLdR1 = 0.0d0 + dPOLdOM1 = 0.0d0 + dPOLdOM2 = 0.0d0 + Glj = 0.0d0 + dGLJdR = 0.0d0 + dGLJdOM1 = 0.0d0 + dGLJdOM2 = 0.0d0 + dGLJdOM12 = 0.0d0 + RETURN + END SUBROUTINE elgrad_init + + +c!------------------------------------------------------------------- + + + SUBROUTINE sc_angular +C Calculate eps1,eps2,eps3,sigma, and parts of their derivatives in om1,om2, +C om12. Called by ebp, egb, egbv, and emomo + IMPLICIT NONE +c! ntyp needed in other commons + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CALC' +c! chi() + INCLUDE 'COMMON.INTERACT' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.EMP' + + erij(1) = xj * rij + erij(2) = yj * rij + erij(3) = zj * rij + om1 = dxi * erij(1) + dyi * erij(2) + dzi * erij(3) + om2 = dxj * erij(1) + dyj * erij(2) + dzj * erij(3) + om12 = dxi * dxj + dyi * dyj + dzi * dzj + chiom12 = chi12 * om12 +C Calculate eps1(om12) and its derivative in om12 + faceps1 = 1.0D0 - om12 * chiom12 + faceps1_inv = 1.0D0 / faceps1 + eps1 = dsqrt(faceps1_inv) +C Following variable is eps1*deps1/dom12 + eps1_om12 = faceps1_inv * chiom12 +C Calculate sigma(om1,om2,om12) and the derivatives of sigma**2 in om1,om2, +C and om12. + om1om2 = om1 * om2 + chiom1 = chi1 * om1 + chiom2 = chi2 * om2 + facsig = om1 * chiom1 + om2 * chiom2 + & - 2.0D0 * om1om2 * chiom12 + sigsq = 1.0D0 - facsig * faceps1_inv + sigsq_om1 = (chiom1 - chiom12 * om2) * faceps1_inv + sigsq_om2 = (chiom2 - chiom12 * om1) * faceps1_inv + sigsq_om12 = -chi12 * (om1om2 * faceps1 - om12 * facsig) + & * faceps1_inv**2 +C Calculate eps2 and its derivatives in om1, om2, and om12. + chipom1 = chip1 * om1 + chipom2 = chip2 * om2 + chipom12 = chip12 * om12 + facp = 1.0D0 - om12 * chipom12 + facp_inv = 1.0D0 / facp + facp1 = om1 * chipom1 + om2 * chipom2 + & -2.0D0 * om1om2 * chipom12 +C Following variable is the square root of eps2 + eps2rt = 1.0D0 - facp1 * facp_inv + +C Following three variables are the derivatives of the square root of eps +C in om1, om2, and om12. + eps2rt_om1 =-4.0D0 * (chipom1 - chipom12 * om2) * facp_inv + eps2rt_om2 =-4.0D0 * (chipom2 - chipom12 * om1) * facp_inv + eps2rt_om12 = 4.0D0 * chip12 + & * (om1om2*facp-om12*facp1)*facp_inv**2 + +c! Evaluate the "asymmetric" factor in the VDW constant, eps3 +c! Note that THIS is 0 in emomo, so we should probably move it out of sc_angular +c! Or frankly, we should restructurize the whole energy section + eps3rt = 1.0D0 - alf1 * om1 + alf2 * om2 - alf12 * om12 + +C Calculate whole angle-dependent part of epsilon and contributions +C to its derivatives + + RETURN + END SUBROUTINE sc_angular + + +C-------------------------------------------------------------------- + + + subroutine sc_grad_T + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.CALC' + include 'COMMON.IOUNITS' + double precision dcosom1(3),dcosom2(3) + eom1=eps2der*eps2rt_om1-2.0D0*alf1*eps3der+sigder*sigsq_om1 + eom2=eps2der*eps2rt_om2+2.0D0*alf2*eps3der+sigder*sigsq_om2 + eom12=evdwij*eps1_om12+eps2der*eps2rt_om12 + & -2.0D0*alf12*eps3der+sigder*sigsq_om12 +c diagnostics only +c eom1=0.0d0 +c eom2=0.0d0 +c eom12=evdwij*eps1_om12 +c end diagnostics +c write (iout,*) "eps2der",eps2der," eps3der",eps3der, +c & " sigder",sigder +c write (iout,*) "eps1_om12",eps1_om12," eps2rt_om12",eps2rt_om12 +c write (iout,*) "eom1",eom1," eom2",eom2," eom12",eom12 + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,nres+i)-om1*erij(k)) + dcosom2(k)=rij*(dc_norm(k,nres+j)-om2*erij(k)) + enddo + do k=1,3 + gg(k)=gg(k)+eom1*dcosom1(k)+eom2*dcosom2(k) + enddo +c write (iout,*) "gg",(gg(k),k=1,3) + do k=1,3 + gvdwxT(k,i)=gvdwxT(k,i)-gg(k) + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + gvdwxT(k,j)=gvdwxT(k,j)+gg(k) + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv +c write (iout,*)(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) +c & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv +c write (iout,*)(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) +c & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + enddo +C +C Calculate the components of the gradient in DC and X +C +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad gvdwc(l,k)=gvdwc(l,k)+gg(l) +cgrad enddo +cgrad enddo + do l=1,3 + gvdwcT(l,i)=gvdwcT(l,i)-gg(l) + gvdwcT(l,j)=gvdwcT(l,j)+gg(l) + enddo + return + end + + +C-------------------------------------------------------------------- + + + SUBROUTINE sc_grad + IMPLICIT real*8 (a-h,o-z) + INCLUDE 'DIMENSIONS' + INCLUDE 'COMMON.CHAIN' + INCLUDE 'COMMON.DERIV' + INCLUDE 'COMMON.CALC' + INCLUDE 'COMMON.IOUNITS' + INCLUDE 'COMMON.EMP' + double precision dcosom1(3),dcosom2(3) + +c! each eom holds sum of omega-angular derivatives of each component +c! of energy function. First GGB, then Gcav, dipole-dipole,... + eom1 = + & eps2der * eps2rt_om1 + & - 2.0D0 * alf1 * eps3der + & + sigder * sigsq_om1 + & + dCAVdOM1 + & + dGCLdOM1 + & + dPOLdOM1 + + eom2 = + & eps2der * eps2rt_om2 + & + 2.0D0 * alf2 * eps3der + & + sigder * sigsq_om2 + & + dCAVdOM2 + & + dGCLdOM2 + & + dPOLdOM2 + + eom12 = + & evdwij * eps1_om12 + & + eps2der * eps2rt_om12 + & - 2.0D0 * alf12 * eps3der + & + sigder *sigsq_om12 + & + dCAVdOM12 + & + dGCLdOM12 + +c! now some magical transformations to project gradient into +c! three cartesian vectors + + DO k = 1, 3 + dcosom1(k) = rij * (dc_norm(k,nres+i) - om1 * erij(k)) + dcosom2(k) = rij * (dc_norm(k,nres+j) - om2 * erij(k)) + gg(k) = gg(k) + eom1 * dcosom1(k) + eom2 * dcosom2(k) +c! this acts on hydrophobic center of interaction + gvdwx(k,i)= gvdwx(k,i) - gg(k) + & + (eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & + eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + gvdwx(k,j)= gvdwx(k,j) + gg(k) + & + (eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & + eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv +c! this acts on Calpha + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + END DO + RETURN + END SUBROUTINE sc_grad + + +C-------------------------------------------------------------------- + + + subroutine e_softsphere(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the LJ potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (accur=1.0d-10) + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.TORSION' + include 'COMMON.SBRIDGE' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.CONTACTS' + dimension gg(3) +cd print *,'Entering Esoft_sphere nnt=',nnt,' nct=',nct + evdw=0.0D0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) +cd write (iout,*) 'i=',i,' iint=',iint,' istart=',istart(i,iint), +cd & 'iend=',iend(i,iint) + do j=istart(i,iint),iend(i,iint) + itypj=itype(j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + rij=xj*xj+yj*yj+zj*zj +c write (iout,*)'i=',i,' j=',j,' itypi=',itypi,' itypj=',itypj + r0ij=r0(itypi,itypj) + r0ijsq=r0ij*r0ij +c print *,i,j,r0ij,dsqrt(rij) + if (rij.lt.r0ijsq) then + evdwij=0.25d0*(rij-r0ijsq)**2 + fac=rij-r0ijsq + else + evdwij=0.0d0 + fac=0.0d0 + endif + evdw=evdw+evdwij +C +C Calculate the components of the gradient in DC and X +C + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + gvdwx(k,j)=gvdwx(k,j)+gg(k) + gvdwc(k,i)=gvdwc(k,i)-gg(k) + gvdwc(k,j)=gvdwc(k,j)+gg(k) + enddo +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad gvdwc(l,k)=gvdwc(l,k)+gg(l) +cgrad enddo +cgrad enddo + enddo ! j + enddo ! iint + enddo ! i + return + end + + +C-------------------------------------------------------------------- + + + subroutine eelec_soft_sphere(ees,evdw1,eel_loc,eello_turn3, + & eello_turn4) +C +C Soft-sphere potential of p-p interaction +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + dimension ggg(3) +cd write(iout,*) 'In EELEC_soft_sphere' + ees=0.0D0 + evdw1=0.0D0 + eel_loc=0.0d0 + eello_turn3=0.0d0 + eello_turn4=0.0d0 + ind=0 + do i=iatel_s,iatel_e + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=0 +c write (iout,*) 'i',i,' ielstart',ielstart(i),' ielend',ielend(i) + do j=ielstart(i),ielend(i) + ind=ind+1 + iteli=itel(i) + itelj=itel(j) + if (j.eq.i+2 .and. itelj.eq.2) iteli=2 + r0ij=rpp(iteli,itelj) + r0ijsq=r0ij*r0ij + dxj=dc(1,j) + dyj=dc(2,j) + dzj=dc(3,j) + xj=c(1,j)+0.5D0*dxj-xmedi + yj=c(2,j)+0.5D0*dyj-ymedi + zj=c(3,j)+0.5D0*dzj-zmedi + rij=xj*xj+yj*yj+zj*zj + if (rij.lt.r0ijsq) then + evdw1ij=0.25d0*(rij-r0ijsq)**2 + fac=rij-r0ijsq + else + evdw1ij=0.0d0 + fac=0.0d0 + endif + evdw1=evdw1+evdw1ij +C +C Calculate contributions to the Cartesian gradient. +C + ggg(1)=fac*xj + ggg(2)=fac*yj + ggg(3)=fac*zj + do k=1,3 + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo + enddo ! j + enddo ! i +cgrad do i=nnt,nct-1 +cgrad do k=1,3 +cgrad gelc(k,i)=gelc(k,i)+0.5d0*gelc(k,i) +cgrad enddo +cgrad do j=i+1,nct-1 +cgrad do k=1,3 +cgrad gelc(k,i)=gelc(k,i)+gelc(k,j) +cgrad enddo +cgrad enddo +cgrad enddo + return + end + + +c-------------------------------------------------------------------- + + + subroutine vec_and_deriv + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.VECTORS' + include 'COMMON.SETUP' + include 'COMMON.TIME1' + dimension uyder(3,3,2),uzder(3,3,2),vbld_inv_temp(2) +C Compute the local reference systems. For reference system (i), the +C X-axis points from CA(i) to CA(i+1), the Y axis is in the +C CA(i)-CA(i+1)-CA(i+2) plane, and the Z axis is perpendicular to this plane. +#ifdef PARVEC + do i=ivec_start,ivec_end +#else + do i=1,nres-1 +#endif + if (i.eq.nres-1) then +C Case of the last full residue +C Compute the Z-axis + call vecpr(dc_norm(1,i),dc_norm(1,i-1),uz(1,i)) + costh=dcos(pi-theta(nres)) + fac=1.0d0/dsqrt(1.0d0-costh*costh) + do k=1,3 + uz(k,i)=fac*uz(k,i) + enddo +C Compute the derivatives of uz + uzder(1,1,1)= 0.0d0 + uzder(2,1,1)=-dc_norm(3,i-1) + uzder(3,1,1)= dc_norm(2,i-1) + uzder(1,2,1)= dc_norm(3,i-1) + uzder(2,2,1)= 0.0d0 + uzder(3,2,1)=-dc_norm(1,i-1) + uzder(1,3,1)=-dc_norm(2,i-1) + uzder(2,3,1)= dc_norm(1,i-1) + uzder(3,3,1)= 0.0d0 + uzder(1,1,2)= 0.0d0 + uzder(2,1,2)= dc_norm(3,i) + uzder(3,1,2)=-dc_norm(2,i) + uzder(1,2,2)=-dc_norm(3,i) + uzder(2,2,2)= 0.0d0 + uzder(3,2,2)= dc_norm(1,i) + uzder(1,3,2)= dc_norm(2,i) + uzder(2,3,2)=-dc_norm(1,i) + uzder(3,3,2)= 0.0d0 +C Compute the Y-axis + facy=fac + do k=1,3 + uy(k,i)=fac*(dc_norm(k,i-1)-costh*dc_norm(k,i)) + enddo +C Compute the derivatives of uy + do j=1,3 + do k=1,3 + uyder(k,j,1)=2*dc_norm(k,i-1)*dc_norm(j,i) + & -dc_norm(k,i)*dc_norm(j,i-1) + uyder(k,j,2)=-dc_norm(j,i)*dc_norm(k,i) + enddo + uyder(j,j,1)=uyder(j,j,1)-costh + uyder(j,j,2)=1.0d0+uyder(j,j,2) + enddo + do j=1,2 + do k=1,3 + do l=1,3 + uygrad(l,k,j,i)=uyder(l,k,j) + uzgrad(l,k,j,i)=uzder(l,k,j) + enddo + enddo + enddo + call unormderiv(uy(1,i),uyder(1,1,1),facy,uygrad(1,1,1,i)) + call unormderiv(uy(1,i),uyder(1,1,2),facy,uygrad(1,1,2,i)) + call unormderiv(uz(1,i),uzder(1,1,1),fac,uzgrad(1,1,1,i)) + call unormderiv(uz(1,i),uzder(1,1,2),fac,uzgrad(1,1,2,i)) + else +C Other residues +C Compute the Z-axis + call vecpr(dc_norm(1,i),dc_norm(1,i+1),uz(1,i)) + costh=dcos(pi-theta(i+2)) + fac=1.0d0/dsqrt(1.0d0-costh*costh) + do k=1,3 + uz(k,i)=fac*uz(k,i) + enddo +C Compute the derivatives of uz + uzder(1,1,1)= 0.0d0 + uzder(2,1,1)=-dc_norm(3,i+1) + uzder(3,1,1)= dc_norm(2,i+1) + uzder(1,2,1)= dc_norm(3,i+1) + uzder(2,2,1)= 0.0d0 + uzder(3,2,1)=-dc_norm(1,i+1) + uzder(1,3,1)=-dc_norm(2,i+1) + uzder(2,3,1)= dc_norm(1,i+1) + uzder(3,3,1)= 0.0d0 + uzder(1,1,2)= 0.0d0 + uzder(2,1,2)= dc_norm(3,i) + uzder(3,1,2)=-dc_norm(2,i) + uzder(1,2,2)=-dc_norm(3,i) + uzder(2,2,2)= 0.0d0 + uzder(3,2,2)= dc_norm(1,i) + uzder(1,3,2)= dc_norm(2,i) + uzder(2,3,2)=-dc_norm(1,i) + uzder(3,3,2)= 0.0d0 +C Compute the Y-axis + facy=fac + do k=1,3 + uy(k,i)=facy*(dc_norm(k,i+1)-costh*dc_norm(k,i)) + enddo +C Compute the derivatives of uy + do j=1,3 + do k=1,3 + uyder(k,j,1)=2*dc_norm(k,i+1)*dc_norm(j,i) + & -dc_norm(k,i)*dc_norm(j,i+1) + uyder(k,j,2)=-dc_norm(j,i)*dc_norm(k,i) + enddo + uyder(j,j,1)=uyder(j,j,1)-costh + uyder(j,j,2)=1.0d0+uyder(j,j,2) + enddo + do j=1,2 + do k=1,3 + do l=1,3 + uygrad(l,k,j,i)=uyder(l,k,j) + uzgrad(l,k,j,i)=uzder(l,k,j) + enddo + enddo + enddo + call unormderiv(uy(1,i),uyder(1,1,1),facy,uygrad(1,1,1,i)) + call unormderiv(uy(1,i),uyder(1,1,2),facy,uygrad(1,1,2,i)) + call unormderiv(uz(1,i),uzder(1,1,1),fac,uzgrad(1,1,1,i)) + call unormderiv(uz(1,i),uzder(1,1,2),fac,uzgrad(1,1,2,i)) + endif + enddo + do i=1,nres-1 + vbld_inv_temp(1)=vbld_inv(i+1) + if (i.lt.nres-1) then + vbld_inv_temp(2)=vbld_inv(i+2) + else + vbld_inv_temp(2)=vbld_inv(i) + endif + do j=1,2 + do k=1,3 + do l=1,3 + uygrad(l,k,j,i)=vbld_inv_temp(j)*uygrad(l,k,j,i) + uzgrad(l,k,j,i)=vbld_inv_temp(j)*uzgrad(l,k,j,i) + enddo + enddo + enddo + enddo +#if defined(PARVEC) && defined(MPI) + if (nfgtasks1.gt.1) then + time00=MPI_Wtime() +c print *,"Processor",fg_rank1,kolor1," ivec_start",ivec_start, +c & " ivec_displ",(ivec_displ(i),i=0,nfgtasks1-1), +c & " ivec_count",(ivec_count(i),i=0,nfgtasks1-1) + call MPI_Allgatherv(uy(1,ivec_start),ivec_count(fg_rank1), + & MPI_UYZ,uy(1,1),ivec_count(0),ivec_displ(0),MPI_UYZ, + & FG_COMM1,IERR) + call MPI_Allgatherv(uz(1,ivec_start),ivec_count(fg_rank1), + & MPI_UYZ,uz(1,1),ivec_count(0),ivec_displ(0),MPI_UYZ, + & FG_COMM1,IERR) + call MPI_Allgatherv(uygrad(1,1,1,ivec_start), + & ivec_count(fg_rank1),MPI_UYZGRAD,uygrad(1,1,1,1),ivec_count(0), + & ivec_displ(0),MPI_UYZGRAD,FG_COMM1,IERR) + call MPI_Allgatherv(uzgrad(1,1,1,ivec_start), + & ivec_count(fg_rank1),MPI_UYZGRAD,uzgrad(1,1,1,1),ivec_count(0), + & ivec_displ(0),MPI_UYZGRAD,FG_COMM1,IERR) + time_gather=time_gather+MPI_Wtime()-time00 + endif +c if (fg_rank.eq.0) then +c write (iout,*) "Arrays UY and UZ" +c do i=1,nres-1 +c write (iout,'(i5,3f10.5,5x,3f10.5)') i,(uy(k,i),k=1,3), +c & (uz(k,i),k=1,3) +c enddo +c endif +#endif + return + end + + +C-------------------------------------------------------------------- + + + subroutine check_vecgrad + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.VECTORS' + dimension uygradt(3,3,2,maxres),uzgradt(3,3,2,maxres) + dimension uyt(3,maxres),uzt(3,maxres) + dimension uygradn(3,3,2),uzgradn(3,3,2),erij(3) + double precision delta /1.0d-7/ + call vec_and_deriv +cd do i=1,nres +crc write(iout,'(2i5,2(3f10.5,5x))') i,1,dc_norm(:,i) +crc write(iout,'(2i5,2(3f10.5,5x))') i,2,uy(:,i) +crc write(iout,'(2i5,2(3f10.5,5x)/)')i,3,uz(:,i) +cd write(iout,'(2i5,2(3f10.5,5x))') i,1, +cd & (dc_norm(if90,i),if90=1,3) +cd write(iout,'(2i5,2(3f10.5,5x))') i,2,(uy(if90,i),if90=1,3) +cd write(iout,'(2i5,2(3f10.5,5x)/)')i,3,(uz(if90,i),if90=1,3) +cd write(iout,'(a)') +cd enddo + do i=1,nres + do j=1,2 + do k=1,3 + do l=1,3 + uygradt(l,k,j,i)=uygrad(l,k,j,i) + uzgradt(l,k,j,i)=uzgrad(l,k,j,i) + enddo + enddo + enddo + enddo + call vec_and_deriv + do i=1,nres + do j=1,3 + uyt(j,i)=uy(j,i) + uzt(j,i)=uz(j,i) + enddo + enddo + do i=1,nres +cd write (iout,*) 'i=',i + do k=1,3 + erij(k)=dc_norm(k,i) + enddo + do j=1,3 + do k=1,3 + dc_norm(k,i)=erij(k) + enddo + dc_norm(j,i)=dc_norm(j,i)+delta +c fac=dsqrt(scalar(dc_norm(1,i),dc_norm(1,i))) +c do k=1,3 +c dc_norm(k,i)=dc_norm(k,i)/fac +c enddo +c write (iout,*) (dc_norm(k,i),k=1,3) +c write (iout,*) (erij(k),k=1,3) + call vec_and_deriv + do k=1,3 + uygradn(k,j,1)=(uy(k,i)-uyt(k,i))/delta + uygradn(k,j,2)=(uy(k,i-1)-uyt(k,i-1))/delta + uzgradn(k,j,1)=(uz(k,i)-uzt(k,i))/delta + uzgradn(k,j,2)=(uz(k,i-1)-uzt(k,i-1))/delta + enddo +c write (iout,'(i5,3f8.5,3x,3f8.5,5x,3f8.5,3x,3f8.5)') +c & j,(uzgradt(k,j,1,i),k=1,3),(uzgradn(k,j,1),k=1,3), +c & (uzgradt(k,j,2,i-1),k=1,3),(uzgradn(k,j,2),k=1,3) + enddo + do k=1,3 + dc_norm(k,i)=erij(k) + enddo +cd do k=1,3 +cd write (iout,'(i5,3f8.5,3x,3f8.5,5x,3f8.5,3x,3f8.5)') +cd & k,(uygradt(k,l,1,i),l=1,3),(uygradn(k,l,1),l=1,3), +cd & (uygradt(k,l,2,i-1),l=1,3),(uygradn(k,l,2),l=1,3) +cd write (iout,'(i5,3f8.5,3x,3f8.5,5x,3f8.5,3x,3f8.5)') +cd & k,(uzgradt(k,l,1,i),l=1,3),(uzgradn(k,l,1),l=1,3), +cd & (uzgradt(k,l,2,i-1),l=1,3),(uzgradn(k,l,2),l=1,3) +cd write (iout,'(a)') +cd enddo + enddo + return + end + + +C-------------------------------------------------------------------------- + + + subroutine set_matrices + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" + include "COMMON.SETUP" + integer IERR + integer status(MPI_STATUS_SIZE) +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + double precision auxvec(2),auxmat(2,2) +C +C Compute the virtual-bond-torsional-angle dependent quantities needed +C to calculate the el-loc multibody terms of various order. +C +#ifdef PARMAT + do i=ivec_start+2,ivec_end+2 +#else + do i=3,nres+1 +#endif + if (i .lt. nres+1) then + sin1=dsin(phi(i)) + cos1=dcos(phi(i)) + sintab(i-2)=sin1 + costab(i-2)=cos1 + obrot(1,i-2)=cos1 + obrot(2,i-2)=sin1 + sin2=dsin(2*phi(i)) + cos2=dcos(2*phi(i)) + sintab2(i-2)=sin2 + costab2(i-2)=cos2 + obrot2(1,i-2)=cos2 + obrot2(2,i-2)=sin2 + Ug(1,1,i-2)=-cos1 + Ug(1,2,i-2)=-sin1 + Ug(2,1,i-2)=-sin1 + Ug(2,2,i-2)= cos1 + Ug2(1,1,i-2)=-cos2 + Ug2(1,2,i-2)=-sin2 + Ug2(2,1,i-2)=-sin2 + Ug2(2,2,i-2)= cos2 + else + costab(i-2)=1.0d0 + sintab(i-2)=0.0d0 + obrot(1,i-2)=1.0d0 + obrot(2,i-2)=0.0d0 + obrot2(1,i-2)=0.0d0 + obrot2(2,i-2)=0.0d0 + Ug(1,1,i-2)=1.0d0 + Ug(1,2,i-2)=0.0d0 + Ug(2,1,i-2)=0.0d0 + Ug(2,2,i-2)=1.0d0 + Ug2(1,1,i-2)=0.0d0 + Ug2(1,2,i-2)=0.0d0 + Ug2(2,1,i-2)=0.0d0 + Ug2(2,2,i-2)=0.0d0 + endif + if (i .gt. 3 .and. i .lt. nres+1) then + obrot_der(1,i-2)=-sin1 + obrot_der(2,i-2)= cos1 + Ugder(1,1,i-2)= sin1 + Ugder(1,2,i-2)=-cos1 + Ugder(2,1,i-2)=-cos1 + Ugder(2,2,i-2)=-sin1 + dwacos2=cos2+cos2 + dwasin2=sin2+sin2 + obrot2_der(1,i-2)=-dwasin2 + obrot2_der(2,i-2)= dwacos2 + Ug2der(1,1,i-2)= dwasin2 + Ug2der(1,2,i-2)=-dwacos2 + Ug2der(2,1,i-2)=-dwacos2 + Ug2der(2,2,i-2)=-dwasin2 + else + obrot_der(1,i-2)=0.0d0 + obrot_der(2,i-2)=0.0d0 + Ugder(1,1,i-2)=0.0d0 + Ugder(1,2,i-2)=0.0d0 + Ugder(2,1,i-2)=0.0d0 + Ugder(2,2,i-2)=0.0d0 + obrot2_der(1,i-2)=0.0d0 + obrot2_der(2,i-2)=0.0d0 + Ug2der(1,1,i-2)=0.0d0 + Ug2der(1,2,i-2)=0.0d0 + Ug2der(2,1,i-2)=0.0d0 + Ug2der(2,2,i-2)=0.0d0 + endif +c if (i.gt. iatel_s+2 .and. i.lt.iatel_e+5) then + if (i.gt. nnt+2 .and. i.lt.nct+2) then + iti = itortyp(itype(i-2)) + else + iti=ntortyp+1 + endif +c if (i.gt. iatel_s+1 .and. i.lt.iatel_e+4) then + if (i.gt. nnt+1 .and. i.lt.nct+1) then + iti1 = itortyp(itype(i-1)) + else + iti1=ntortyp+1 + endif +cd write (iout,*) '*******i',i,' iti1',iti +cd write (iout,*) 'b1',b1(:,iti) +cd write (iout,*) 'b2',b2(:,iti) +cd write (iout,*) 'Ug',Ug(:,:,i-2) +c if (i .gt. iatel_s+2) then + if (i .gt. nnt+2) then + call matvec2(Ug(1,1,i-2),b2(1,iti),Ub2(1,i-2)) + call matmat2(EE(1,1,iti),Ug(1,1,i-2),EUg(1,1,i-2)) + if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) + & then + call matmat2(CC(1,1,iti),Ug(1,1,i-2),CUg(1,1,i-2)) + call matmat2(DD(1,1,iti),Ug(1,1,i-2),DUg(1,1,i-2)) + call matmat2(Dtilde(1,1,iti),Ug2(1,1,i-2),DtUg2(1,1,i-2)) + call matvec2(Ctilde(1,1,iti1),obrot(1,i-2),Ctobr(1,i-2)) + call matvec2(Dtilde(1,1,iti),obrot2(1,i-2),Dtobr2(1,i-2)) + endif + else + do k=1,2 + Ub2(k,i-2)=0.0d0 + Ctobr(k,i-2)=0.0d0 + Dtobr2(k,i-2)=0.0d0 + do l=1,2 + EUg(l,k,i-2)=0.0d0 + CUg(l,k,i-2)=0.0d0 + DUg(l,k,i-2)=0.0d0 + DtUg2(l,k,i-2)=0.0d0 + enddo + enddo + endif + call matvec2(Ugder(1,1,i-2),b2(1,iti),Ub2der(1,i-2)) + call matmat2(EE(1,1,iti),Ugder(1,1,i-2),EUgder(1,1,i-2)) + do k=1,2 + muder(k,i-2)=Ub2der(k,i-2) + enddo +c if (i.gt. iatel_s+1 .and. i.lt.iatel_e+4) then + if (i.gt. nnt+1 .and. i.lt.nct+1) then + iti1 = itortyp(itype(i-1)) + else + iti1=ntortyp+1 + endif + do k=1,2 + mu(k,i-2)=Ub2(k,i-2)+b1(k,iti1) + enddo +cd write (iout,*) 'mu ',mu(:,i-2) +cd write (iout,*) 'mu1',mu1(:,i-2) +cd write (iout,*) 'mu2',mu2(:,i-2) + if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or.wcorr6.gt.0.0d0) + & then + call matmat2(CC(1,1,iti1),Ugder(1,1,i-2),CUgder(1,1,i-2)) + call matmat2(DD(1,1,iti),Ugder(1,1,i-2),DUgder(1,1,i-2)) + call matmat2(Dtilde(1,1,iti),Ug2der(1,1,i-2),DtUg2der(1,1,i-2)) + call matvec2(Ctilde(1,1,iti1),obrot_der(1,i-2),Ctobrder(1,i-2)) + call matvec2(Dtilde(1,1,iti),obrot2_der(1,i-2),Dtobr2der(1,i-2)) +C Vectors and matrices dependent on a single virtual-bond dihedral. + call matvec2(DD(1,1,iti),b1tilde(1,iti1),auxvec(1)) + call matvec2(Ug2(1,1,i-2),auxvec(1),Ug2Db1t(1,i-2)) + call matvec2(Ug2der(1,1,i-2),auxvec(1),Ug2Db1tder(1,i-2)) + call matvec2(CC(1,1,iti1),Ub2(1,i-2),CUgb2(1,i-2)) + call matvec2(CC(1,1,iti1),Ub2der(1,i-2),CUgb2der(1,i-2)) + call matmat2(EUg(1,1,i-2),CC(1,1,iti1),EUgC(1,1,i-2)) + call matmat2(EUgder(1,1,i-2),CC(1,1,iti1),EUgCder(1,1,i-2)) + call matmat2(EUg(1,1,i-2),DD(1,1,iti1),EUgD(1,1,i-2)) + call matmat2(EUgder(1,1,i-2),DD(1,1,iti1),EUgDder(1,1,i-2)) + endif + enddo +C Matrices dependent on two consecutive virtual-bond dihedrals. +C The order of matrices is from left to right. + if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or.wcorr6.gt.0.0d0) + &then +c do i=max0(ivec_start,2),ivec_end + do i=2,nres-1 + call matmat2(DtUg2(1,1,i-1),EUg(1,1,i),DtUg2EUg(1,1,i)) + call matmat2(DtUg2der(1,1,i-1),EUg(1,1,i),DtUg2EUgder(1,1,1,i)) + call matmat2(DtUg2(1,1,i-1),EUgder(1,1,i),DtUg2EUgder(1,1,2,i)) + call transpose2(DtUg2(1,1,i-1),auxmat(1,1)) + call matmat2(auxmat(1,1),EUg(1,1,i),Ug2DtEUg(1,1,i)) + call matmat2(auxmat(1,1),EUgder(1,1,i),Ug2DtEUgder(1,1,2,i)) + call transpose2(DtUg2der(1,1,i-1),auxmat(1,1)) + call matmat2(auxmat(1,1),EUg(1,1,i),Ug2DtEUgder(1,1,1,i)) + enddo + endif +#if defined(MPI) && defined(PARMAT) +#ifdef DEBUG +c if (fg_rank.eq.0) then + write (iout,*) "Arrays UG and UGDER before GATHER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & ((ug(l,k,i),l=1,2),k=1,2), + & ((ugder(l,k,i),l=1,2),k=1,2) + enddo + write (iout,*) "Arrays UG2 and UG2DER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & ((ug2(l,k,i),l=1,2),k=1,2), + & ((ug2der(l,k,i),l=1,2),k=1,2) + enddo + write (iout,*) "Arrays OBROT OBROT2 OBROTDER and OBROT2DER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & (obrot(k,i),k=1,2),(obrot2(k,i),k=1,2), + & (obrot_der(k,i),k=1,2),(obrot2_der(k,i),k=1,2) + enddo + write (iout,*) "Arrays COSTAB SINTAB COSTAB2 and SINTAB2" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & costab(i),sintab(i),costab2(i),sintab2(i) + enddo + write (iout,*) "Array MUDER" + do i=1,nres-1 + write (iout,'(i5,2f10.5)') i,muder(1,i),muder(2,i) + enddo +c endif +#endif + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +c write(iout,*)"Processor",fg_rank,kolor," ivec_start",ivec_start, +c & " ivec_displ",(ivec_displ(i),i=0,nfgtasks-1), +c & " ivec_count",(ivec_count(i),i=0,nfgtasks-1) +#ifdef MATGATHER + call MPI_Allgatherv(Ub2(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Ub2(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Ub2der(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Ub2der(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(mu(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,mu(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(muder(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,muder(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Eug(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Eug(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Eugder(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Eugder(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(costab(ivec_start),ivec_count(fg_rank1), + & MPI_DOUBLE_PRECISION,costab(1),ivec_count(0),ivec_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) + call MPI_Allgatherv(sintab(ivec_start),ivec_count(fg_rank1), + & MPI_DOUBLE_PRECISION,sintab(1),ivec_count(0),ivec_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) + call MPI_Allgatherv(costab2(ivec_start),ivec_count(fg_rank1), + & MPI_DOUBLE_PRECISION,costab2(1),ivec_count(0),ivec_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) + call MPI_Allgatherv(sintab2(ivec_start),ivec_count(fg_rank1), + & MPI_DOUBLE_PRECISION,sintab2(1),ivec_count(0),ivec_displ(0), + & MPI_DOUBLE_PRECISION,FG_COMM1,IERR) + if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) + & then + call MPI_Allgatherv(Ctobr(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Ctobr(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Ctobrder(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Ctobrder(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dtobr2(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Dtobr2(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dtobr2der(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Dtobr2der(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Ug2Db1t(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,Ug2Db1t(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Ug2Db1tder(1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MU,Ug2Db1tder(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(CUgb2(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,CUgb2(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(CUgb2der(1,ivec_start),ivec_count(fg_rank1), + & MPI_MU,CUgb2der(1,1),ivec_count(0),ivec_displ(0),MPI_MU, + & FG_COMM1,IERR) + call MPI_Allgatherv(Cug(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Cug(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Cugder(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Cugder(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dug(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Dug(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dugder(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Dugder(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dtug2(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,Dtug2(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Dtug2der(1,1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MAT1,Dtug2der(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(EugC(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,EugC(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(EugCder(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,EugCder(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(EugD(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,EugD(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(EugDder(1,1,ivec_start),ivec_count(fg_rank1), + & MPI_MAT1,EugDder(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(DtUg2EUg(1,1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MAT1,DtUg2EUg(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(Ug2DtEUg(1,1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MAT1,Ug2DtEUg(1,1,1),ivec_count(0),ivec_displ(0),MPI_MAT1, + & FG_COMM1,IERR) + call MPI_Allgatherv(DtUg2EUgder(1,1,1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MAT2,DtUg2EUgder(1,1,1,1),ivec_count(0),ivec_displ(0), + & MPI_MAT2,FG_COMM1,IERR) + call MPI_Allgatherv(Ug2DtEUgder(1,1,1,ivec_start), + & ivec_count(fg_rank1), + & MPI_MAT2,Ug2DtEUgder(1,1,1,1),ivec_count(0),ivec_displ(0), + & MPI_MAT2,FG_COMM1,IERR) + endif +#else +c Passes matrix info through the ring + isend=fg_rank1 + irecv=fg_rank1-1 + if (irecv.lt.0) irecv=nfgtasks1-1 + iprev=irecv + inext=fg_rank1+1 + if (inext.ge.nfgtasks1) inext=0 + do i=1,nfgtasks1-1 +c write (iout,*) "isend",isend," irecv",irecv +c call flush(iout) + lensend=lentyp(isend) + lenrecv=lentyp(irecv) +c write (iout,*) "lensend",lensend," lenrecv",lenrecv +c call MPI_SENDRECV(ug(1,1,ivec_displ(isend)+1),1, +c & MPI_ROTAT1(lensend),inext,2200+isend, +c & ug(1,1,ivec_displ(irecv)+1),1,MPI_ROTAT1(lenrecv), +c & iprev,2200+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather ROTAT1" +c call flush(iout) +c call MPI_SENDRECV(obrot(1,ivec_displ(isend)+1),1, +c & MPI_ROTAT2(lensend),inext,3300+isend, +c & obrot(1,ivec_displ(irecv)+1),1,MPI_ROTAT2(lenrecv), +c & iprev,3300+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather ROTAT2" +c call flush(iout) + call MPI_SENDRECV(costab(ivec_displ(isend)+1),1, + & MPI_ROTAT_OLD(lensend),inext,4400+isend, + & costab(ivec_displ(irecv)+1),1,MPI_ROTAT_OLD(lenrecv), + & iprev,4400+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather ROTAT_OLD" +c call flush(iout) + call MPI_SENDRECV(mu(1,ivec_displ(isend)+1),1, + & MPI_PRECOMP11(lensend),inext,5500+isend, + & mu(1,ivec_displ(irecv)+1),1,MPI_PRECOMP11(lenrecv), + & iprev,5500+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather PRECOMP11" +c call flush(iout) + call MPI_SENDRECV(Eug(1,1,ivec_displ(isend)+1),1, + & MPI_PRECOMP12(lensend),inext,6600+isend, + & Eug(1,1,ivec_displ(irecv)+1),1,MPI_PRECOMP12(lenrecv), + & iprev,6600+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather PRECOMP12" +c call flush(iout) + if (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) + & then + call MPI_SENDRECV(ug2db1t(1,ivec_displ(isend)+1),1, + & MPI_ROTAT2(lensend),inext,7700+isend, + & ug2db1t(1,ivec_displ(irecv)+1),1,MPI_ROTAT2(lenrecv), + & iprev,7700+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather PRECOMP21" +c call flush(iout) + call MPI_SENDRECV(EUgC(1,1,ivec_displ(isend)+1),1, + & MPI_PRECOMP22(lensend),inext,8800+isend, + & EUgC(1,1,ivec_displ(irecv)+1),1,MPI_PRECOMP22(lenrecv), + & iprev,8800+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather PRECOMP22" +c call flush(iout) + call MPI_SENDRECV(Ug2DtEUgder(1,1,1,ivec_displ(isend)+1),1, + & MPI_PRECOMP23(lensend),inext,9900+isend, + & Ug2DtEUgder(1,1,1,ivec_displ(irecv)+1),1, + & MPI_PRECOMP23(lenrecv), + & iprev,9900+irecv,FG_COMM,status,IERR) +c write (iout,*) "Gather PRECOMP23" +c call flush(iout) + endif + isend=irecv + irecv=irecv-1 + if (irecv.lt.0) irecv=nfgtasks1-1 + enddo +#endif + time_gather=time_gather+MPI_Wtime()-time00 + endif +#ifdef DEBUG +c if (fg_rank.eq.0) then + write (iout,*) "Arrays UG and UGDER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & ((ug(l,k,i),l=1,2),k=1,2), + & ((ugder(l,k,i),l=1,2),k=1,2) + enddo + write (iout,*) "Arrays UG2 and UG2DER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & ((ug2(l,k,i),l=1,2),k=1,2), + & ((ug2der(l,k,i),l=1,2),k=1,2) + enddo + write (iout,*) "Arrays OBROT OBROT2 OBROTDER and OBROT2DER" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & (obrot(k,i),k=1,2),(obrot2(k,i),k=1,2), + & (obrot_der(k,i),k=1,2),(obrot2_der(k,i),k=1,2) + enddo + write (iout,*) "Arrays COSTAB SINTAB COSTAB2 and SINTAB2" + do i=1,nres-1 + write (iout,'(i5,4f10.5,5x,4f10.5)') i, + & costab(i),sintab(i),costab2(i),sintab2(i) + enddo + write (iout,*) "Array MUDER" + do i=1,nres-1 + write (iout,'(i5,2f10.5)') i,muder(1,i),muder(2,i) + enddo +c endif +#endif +#endif +cd do i=1,nres +cd iti = itortyp(itype(i)) +cd write (iout,*) i +cd do j=1,2 +cd write (iout,'(2f10.5,5x,2f10.5,5x,2f10.5)') +cd & (EE(j,k,iti),k=1,2),(Ug(j,k,i),k=1,2),(EUg(j,k,i),k=1,2) +cd enddo +cd enddo + return + end + + +C-------------------------------------------------------------------------- + + + subroutine eelec(ees,evdw1,eel_loc,eello_turn3,eello_turn4) +C +C This subroutine calculates the average interaction energy and its gradient +C in the virtual-bond vectors between non-adjacent peptide groups, based on +C the potential described in Liwo et al., Protein Sci., 1993, 2, 1715. +C The potential depends both on the distance of peptide-group centers and on +C the orientation of the CA-CA virtual bonds. +C + implicit real*8 (a-h,o-z) +#ifdef MPI + include 'mpif.h' +#endif + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.TIME1' + dimension ggg(3),gggp(3),gggm(3),erij(3),dcosb(3),dcosg(3), + & erder(3,3),uryg(3,3),urzg(3,3),vryg(3,3),vrzg(3,3) + double precision acipa(2,2),agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions +#ifdef MOMENT + double precision scal_el /1.0d0/ +#else + double precision scal_el /0.5d0/ +#endif +C 12/13/98 +C 13-go grudnia roku pamietnego... + double precision unmat(3,3) /1.0d0,0.0d0,0.0d0, + & 0.0d0,1.0d0,0.0d0, + & 0.0d0,0.0d0,1.0d0/ +cd write(iout,*) 'In EELEC' +cd do i=1,nloctyp +cd write(iout,*) 'Type',i +cd write(iout,*) 'B1',B1(:,i) +cd write(iout,*) 'B2',B2(:,i) +cd write(iout,*) 'CC',CC(:,:,i) +cd write(iout,*) 'DD',DD(:,:,i) +cd write(iout,*) 'EE',EE(:,:,i) +cd enddo +cd call check_vecgrad +cd stop + if (icheckgrad.eq.1) then + do i=1,nres-1 + fac=1.0d0/dsqrt(scalar(dc(1,i),dc(1,i))) + do k=1,3 + dc_norm(k,i)=dc(k,i)*fac + enddo +c write (iout,*) 'i',i,' fac',fac + enddo + endif + if (wel_loc.gt.0.0d0 .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 + & .or. wcorr6.gt.0.0d0 .or. wturn3.gt.0.0d0 .or. + & wturn4.gt.0.0d0 .or. wturn6.gt.0.0d0) then +c call vec_and_deriv +#ifdef TIMING + time01=MPI_Wtime() +#endif + call set_matrices +#ifdef TIMING + time_mat=time_mat+MPI_Wtime()-time01 +#endif + endif +cd do i=1,nres-1 +cd write (iout,*) 'i=',i +cd do k=1,3 +cd write (iout,'(i5,2f10.5)') k,uy(k,i),uz(k,i) +cd enddo +cd do k=1,3 +cd write (iout,'(f10.5,2x,3f10.5,2x,3f10.5)') +cd & uz(k,i),(uzgrad(k,l,1,i),l=1,3),(uzgrad(k,l,2,i),l=1,3) +cd enddo +cd enddo + t_eelecij=0.0d0 + ees=0.0D0 + evdw1=0.0D0 + eel_loc=0.0d0 + eello_turn3=0.0d0 + eello_turn4=0.0d0 + ind=0 + do i=1,nres + num_cont_hb(i)=0 + enddo +cd print '(a)','Enter EELEC' +cd write (iout,*) 'iatel_s=',iatel_s,' iatel_e=',iatel_e + do i=1,nres + gel_loc_loc(i)=0.0d0 + gcorr_loc(i)=0.0d0 + enddo +c +c +c 9/27/08 AL Split the interaction loop to ensure load balancing of turn terms +C +C Loop over i,i+2 and i,i+3 pairs of the peptide groups +C + do i=iturn3_start,iturn3_end + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=0 + call eelecij(i,i+2,ees,evdw1,eel_loc) + if (wturn3.gt.0.0d0) call eturn3(i,eello_turn3) + num_cont_hb(i)=num_conti + enddo + do i=iturn4_start,iturn4_end + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi + num_conti=num_cont_hb(i) + call eelecij(i,i+3,ees,evdw1,eel_loc) + if (wturn4.gt.0.0d0) call eturn4(i,eello_turn4) + num_cont_hb(i)=num_conti + enddo ! i +c +c Loop over all pairs of interacting peptide groups except i,i+2 and i,i+3 +c + do i=iatel_s,iatel_e + dxi=dc(1,i) + dyi=dc(2,i) + dzi=dc(3,i) + dx_normi=dc_norm(1,i) + dy_normi=dc_norm(2,i) + dz_normi=dc_norm(3,i) + xmedi=c(1,i)+0.5d0*dxi + ymedi=c(2,i)+0.5d0*dyi + zmedi=c(3,i)+0.5d0*dzi +c write (iout,*) 'i',i,' ielstart',ielstart(i),' ielend',ielend(i) + num_conti=num_cont_hb(i) + do j=ielstart(i),ielend(i) + call eelecij(i,j,ees,evdw1,eel_loc) + enddo ! j + num_cont_hb(i)=num_conti + enddo ! i +c write (iout,*) "Number of loop steps in EELEC:",ind +cd do i=1,nres +cd write (iout,'(i3,3f10.5,5x,3f10.5)') +cd & i,(gel_loc(k,i),k=1,3),gel_loc_loc(i) +cd enddo +c 12/7/99 Adam eello_turn3 will be considered as a separate energy term +ccc eel_loc=eel_loc+eello_turn3 +cd print *,"Processor",fg_rank," t_eelecij",t_eelecij + return + end + + +C------------------------------------------------------------------------------- + + +cDEC$ ATTRIBUTES FORCEINLINE :: eelecij + subroutine eelecij(i,j,ees,evdw1,eel_loc) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.TIME1' + dimension ggg(3),gggp(3),gggm(3),erij(3),dcosb(3),dcosg(3), + & erder(3,3),uryg(3,3),urzg(3,3),vryg(3,3),vrzg(3,3) + double precision acipa(2,2),agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),muij(4) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 +c 4/26/02 - AL scaling factor for 1,4 repulsive VDW interactions +#ifdef MOMENT + double precision scal_el /1.0d0/ +#else + double precision scal_el /0.5d0/ +#endif +C 12/13/98 +C 13-go grudnia roku pamietnego... + double precision unmat(3,3) /1.0d0,0.0d0,0.0d0, + & 0.0d0,1.0d0,0.0d0, + & 0.0d0,0.0d0,1.0d0/ +c time00=MPI_Wtime() +cd write (iout,*) "eelecij",i,j +c ind=ind+1 + iteli=itel(i) + itelj=itel(j) + if (j.eq.i+2 .and. itelj.eq.2) iteli=2 + aaa=app(iteli,itelj) + bbb=bpp(iteli,itelj) + ael6i=ael6(iteli,itelj) + ael3i=ael3(iteli,itelj) + dxj=dc(1,j) + dyj=dc(2,j) + dzj=dc(3,j) + dx_normj=dc_norm(1,j) + dy_normj=dc_norm(2,j) + dz_normj=dc_norm(3,j) + xj=c(1,j)+0.5D0*dxj-xmedi + yj=c(2,j)+0.5D0*dyj-ymedi + zj=c(3,j)+0.5D0*dzj-zmedi + rij=xj*xj+yj*yj+zj*zj + rrmij=1.0D0/rij + rij=dsqrt(rij) + rmij=1.0D0/rij + r3ij=rrmij*rmij + r6ij=r3ij*r3ij + cosa=dx_normi*dx_normj+dy_normi*dy_normj+dz_normi*dz_normj + cosb=(xj*dx_normi+yj*dy_normi+zj*dz_normi)*rmij + cosg=(xj*dx_normj+yj*dy_normj+zj*dz_normj)*rmij + fac=cosa-3.0D0*cosb*cosg + ev1=aaa*r6ij*r6ij +c 4/26/02 - AL scaling down 1,4 repulsive VDW interactions + if (j.eq.i+2) ev1=scal_el*ev1 + ev2=bbb*r6ij + fac3=ael6i*r6ij + fac4=ael3i*r3ij + evdwij=ev1+ev2 + el1=fac3*(4.0D0+fac*fac-3.0D0*(cosb*cosb+cosg*cosg)) + el2=fac4*fac + eesij=el1+el2 +C 12/26/95 - for the evaluation of multi-body H-bonding interactions + ees0ij=4.0D0+fac*fac-3.0D0*(cosb*cosb+cosg*cosg) + ees=ees+eesij + evdw1=evdw1+evdwij +cd write(iout,'(2(2i3,2x),7(1pd12.4)/2(3(1pd12.4),5x)/)') +cd & iteli,i,itelj,j,aaa,bbb,ael6i,ael3i, +cd & 1.0D0/dsqrt(rrmij),evdwij,eesij, +cd & xmedi,ymedi,zmedi,xj,yj,zj + + if (energy_dec) then + write (iout,'(a6,2i5,0pf7.3)') 'evdw1',i,j,evdwij + write (iout,'(a6,2i5,0pf7.3)') 'ees',i,j,eesij + endif + +C +C Calculate contributions to the Cartesian gradient. +C +#ifdef SPLITELE + facvdw=-6*rrmij*(ev1+evdwij) + facel=-3*rrmij*(el1+eesij) + fac1=fac + erij(1)=xj*rmij + erij(2)=yj*rmij + erij(3)=zj*rmij +* +* Radial derivatives. First process both termini of the fragment (i,j) +* + ggg(1)=facel*xj + ggg(2)=facel*yj + ggg(3)=facel*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c gelc(k,j)=gelc(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gelc_long(k,j)=gelc_long(k,j)+ggg(k) + gelc_long(k,i)=gelc_long(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gvdwpp(k,i)=gvdwpp(k,i)+ghalf +c gvdwpp(k,j)=gvdwpp(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gvdwpp(l,k)=gvdwpp(l,k)+ggg(l) +cgrad enddo +cgrad enddo +#else + facvdw=ev1+evdwij + facel=el1+eesij + fac1=fac + fac=-3*rrmij*(facvdw+facvdw+facel) + erij(1)=xj*rmij + erij(2)=yj*rmij + erij(3)=zj*rmij +* +* Radial derivatives. First process both termini of the fragment (i,j) +* + ggg(1)=fac*xj + ggg(2)=fac*yj + ggg(3)=fac*zj +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c gelc(k,j)=gelc(k,j)+ghalf +c enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + do k=1,3 + gelc_long(k,j)=gelc(k,j)+ggg(k) + gelc_long(k,i)=gelc(k,i)-ggg(k) + enddo +* +* Loop over residues i+1 thru j-1. +* +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo +c 9/28/08 AL Gradient compotents will be summed only at the end + ggg(1)=facvdw*xj + ggg(2)=facvdw*yj + ggg(3)=facvdw*zj + do k=1,3 + gvdwpp(k,j)=gvdwpp(k,j)+ggg(k) + gvdwpp(k,i)=gvdwpp(k,i)-ggg(k) + enddo +#endif +* +* Angular part +* + ecosa=2.0D0*fac3*fac1+fac4 + fac4=-3.0D0*fac4 + fac3=-6.0D0*fac3 + ecosb=(fac3*(fac1*cosg+cosb)+cosg*fac4) + ecosg=(fac3*(fac1*cosb+cosg)+cosb*fac4) + do k=1,3 + dcosb(k)=rmij*(dc_norm(k,i)-erij(k)*cosb) + dcosg(k)=rmij*(dc_norm(k,j)-erij(k)*cosg) + enddo +cd print '(2i3,2(3(1pd14.5),3x))',i,j,(dcosb(k),k=1,3), +cd & (dcosg(k),k=1,3) + do k=1,3 + ggg(k)=ecosb*dcosb(k)+ecosg*dcosg(k) + enddo +c do k=1,3 +c ghalf=0.5D0*ggg(k) +c gelc(k,i)=gelc(k,i)+ghalf +c & +(ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i)) +c & + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) +c gelc(k,j)=gelc(k,j)+ghalf +c & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) +c & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) +c enddo +cgrad do k=i+1,j-1 +cgrad do l=1,3 +cgrad gelc(l,k)=gelc(l,k)+ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gelc(k,i)=gelc(k,i) + & +(ecosa*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosb*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gelc(k,j)=gelc(k,j) + & +(ecosa*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosg*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gelc_long(k,j)=gelc_long(k,j)+ggg(k) + gelc_long(k,i)=gelc_long(k,i)-ggg(k) + enddo + IF (wel_loc.gt.0.0d0 .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 + & .or. wcorr6.gt.0.0d0 .or. wturn3.gt.0.0d0 + & .or. wturn4.gt.0.0d0 .or. wturn6.gt.0.0d0) THEN +C +C 9/25/99 Mixed third-order local-electrostatic terms. The local-interaction +C energy of a peptide unit is assumed in the form of a second-order +C Fourier series in the angles lambda1 and lambda2 (see Nishikawa et al. +C Macromolecules, 1974, 7, 797-806 for definition). This correlation terms +C are computed for EVERY pair of non-contiguous peptide groups. +C + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + kkk=0 + do k=1,2 + do l=1,2 + kkk=kkk+1 + muij(kkk)=mu(k,i)*mu(l,j) + enddo + enddo +cd write (iout,*) 'EELEC: i',i,' j',j +cd write (iout,*) 'j',j,' j1',j1,' j2',j2 +cd write(iout,*) 'muij',muij + ury=scalar(uy(1,i),erij) + urz=scalar(uz(1,i),erij) + vry=scalar(uy(1,j),erij) + vrz=scalar(uz(1,j),erij) + a22=scalar(uy(1,i),uy(1,j))-3*ury*vry + a23=scalar(uy(1,i),uz(1,j))-3*ury*vrz + a32=scalar(uz(1,i),uy(1,j))-3*urz*vry + a33=scalar(uz(1,i),uz(1,j))-3*urz*vrz + fac=dsqrt(-ael6i)*r3ij + a22=a22*fac + a23=a23*fac + a32=a32*fac + a33=a33*fac +cd write (iout,'(4i5,4f10.5)') +cd & i,itortyp(itype(i)),j,itortyp(itype(j)),a22,a23,a32,a33 +cd write (iout,'(6f10.5)') (muij(k),k=1,4),fac,eel_loc_ij +cd write (iout,'(2(3f10.5,5x)/2(3f10.5,5x))') uy(:,i),uz(:,i), +cd & uy(:,j),uz(:,j) +cd write (iout,'(4f10.5)') +cd & scalar(uy(1,i),uy(1,j)),scalar(uy(1,i),uz(1,j)), +cd & scalar(uz(1,i),uy(1,j)),scalar(uz(1,i),uz(1,j)) +cd write (iout,'(4f10.5)') ury,urz,vry,vrz +cd write (iout,'(9f10.5/)') +cd & fac22,a22,fac23,a23,fac32,a32,fac33,a33,eel_loc_ij +C Derivatives of the elements of A in virtual-bond vectors + call unormderiv(erij(1),unmat(1,1),rmij,erder(1,1)) + do k=1,3 + uryg(k,1)=scalar(erder(1,k),uy(1,i)) + uryg(k,2)=scalar(uygrad(1,k,1,i),erij(1)) + uryg(k,3)=scalar(uygrad(1,k,2,i),erij(1)) + urzg(k,1)=scalar(erder(1,k),uz(1,i)) + urzg(k,2)=scalar(uzgrad(1,k,1,i),erij(1)) + urzg(k,3)=scalar(uzgrad(1,k,2,i),erij(1)) + vryg(k,1)=scalar(erder(1,k),uy(1,j)) + vryg(k,2)=scalar(uygrad(1,k,1,j),erij(1)) + vryg(k,3)=scalar(uygrad(1,k,2,j),erij(1)) + vrzg(k,1)=scalar(erder(1,k),uz(1,j)) + vrzg(k,2)=scalar(uzgrad(1,k,1,j),erij(1)) + vrzg(k,3)=scalar(uzgrad(1,k,2,j),erij(1)) + enddo +C Compute radial contributions to the gradient + facr=-3.0d0*rrmij + a22der=a22*facr + a23der=a23*facr + a32der=a32*facr + a33der=a33*facr + agg(1,1)=a22der*xj + agg(2,1)=a22der*yj + agg(3,1)=a22der*zj + agg(1,2)=a23der*xj + agg(2,2)=a23der*yj + agg(3,2)=a23der*zj + agg(1,3)=a32der*xj + agg(2,3)=a32der*yj + agg(3,3)=a32der*zj + agg(1,4)=a33der*xj + agg(2,4)=a33der*yj + agg(3,4)=a33der*zj +C Add the contributions coming from er + fac3=-3.0d0*fac + do k=1,3 + agg(k,1)=agg(k,1)+fac3*(uryg(k,1)*vry+vryg(k,1)*ury) + agg(k,2)=agg(k,2)+fac3*(uryg(k,1)*vrz+vrzg(k,1)*ury) + agg(k,3)=agg(k,3)+fac3*(urzg(k,1)*vry+vryg(k,1)*urz) + agg(k,4)=agg(k,4)+fac3*(urzg(k,1)*vrz+vrzg(k,1)*urz) + enddo + do k=1,3 +C Derivatives in DC(i) +cgrad ghalf1=0.5d0*agg(k,1) +cgrad ghalf2=0.5d0*agg(k,2) +cgrad ghalf3=0.5d0*agg(k,3) +cgrad ghalf4=0.5d0*agg(k,4) + aggi(k,1)=fac*(scalar(uygrad(1,k,1,i),uy(1,j)) + & -3.0d0*uryg(k,2)*vry)!+ghalf1 + aggi(k,2)=fac*(scalar(uygrad(1,k,1,i),uz(1,j)) + & -3.0d0*uryg(k,2)*vrz)!+ghalf2 + aggi(k,3)=fac*(scalar(uzgrad(1,k,1,i),uy(1,j)) + & -3.0d0*urzg(k,2)*vry)!+ghalf3 + aggi(k,4)=fac*(scalar(uzgrad(1,k,1,i),uz(1,j)) + & -3.0d0*urzg(k,2)*vrz)!+ghalf4 +C Derivatives in DC(i+1) + aggi1(k,1)=fac*(scalar(uygrad(1,k,2,i),uy(1,j)) + & -3.0d0*uryg(k,3)*vry)!+agg(k,1) + aggi1(k,2)=fac*(scalar(uygrad(1,k,2,i),uz(1,j)) + & -3.0d0*uryg(k,3)*vrz)!+agg(k,2) + aggi1(k,3)=fac*(scalar(uzgrad(1,k,2,i),uy(1,j)) + & -3.0d0*urzg(k,3)*vry)!+agg(k,3) + aggi1(k,4)=fac*(scalar(uzgrad(1,k,2,i),uz(1,j)) + & -3.0d0*urzg(k,3)*vrz)!+agg(k,4) +C Derivatives in DC(j) + aggj(k,1)=fac*(scalar(uygrad(1,k,1,j),uy(1,i)) + & -3.0d0*vryg(k,2)*ury)!+ghalf1 + aggj(k,2)=fac*(scalar(uzgrad(1,k,1,j),uy(1,i)) + & -3.0d0*vrzg(k,2)*ury)!+ghalf2 + aggj(k,3)=fac*(scalar(uygrad(1,k,1,j),uz(1,i)) + & -3.0d0*vryg(k,2)*urz)!+ghalf3 + aggj(k,4)=fac*(scalar(uzgrad(1,k,1,j),uz(1,i)) + & -3.0d0*vrzg(k,2)*urz)!+ghalf4 +C Derivatives in DC(j+1) or DC(nres-1) + aggj1(k,1)=fac*(scalar(uygrad(1,k,2,j),uy(1,i)) + & -3.0d0*vryg(k,3)*ury) + aggj1(k,2)=fac*(scalar(uzgrad(1,k,2,j),uy(1,i)) + & -3.0d0*vrzg(k,3)*ury) + aggj1(k,3)=fac*(scalar(uygrad(1,k,2,j),uz(1,i)) + & -3.0d0*vryg(k,3)*urz) + aggj1(k,4)=fac*(scalar(uzgrad(1,k,2,j),uz(1,i)) + & -3.0d0*vrzg(k,3)*urz) +cgrad if (j.eq.nres-1 .and. i.lt.j-2) then +cgrad do l=1,4 +cgrad aggj1(k,l)=aggj1(k,l)+agg(k,l) +cgrad enddo +cgrad endif + enddo + acipa(1,1)=a22 + acipa(1,2)=a23 + acipa(2,1)=a32 + acipa(2,2)=a33 + a22=-a22 + a23=-a23 + do l=1,2 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + if (j.lt.nres-1) then + a22=-a22 + a32=-a32 + do l=1,3,2 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + else + a22=-a22 + a23=-a23 + a32=-a32 + a33=-a33 + do l=1,4 + do k=1,3 + agg(k,l)=-agg(k,l) + aggi(k,l)=-aggi(k,l) + aggi1(k,l)=-aggi1(k,l) + aggj(k,l)=-aggj(k,l) + aggj1(k,l)=-aggj1(k,l) + enddo + enddo + endif + ENDIF ! WCORR + IF (wel_loc.gt.0.0d0) THEN +C Contribution to the local-electrostatic energy coming from the i-j pair + eel_loc_ij=a22*muij(1)+a23*muij(2)+a32*muij(3) + & +a33*muij(4) +cd write (iout,*) 'i',i,' j',j,' eel_loc_ij',eel_loc_ij + + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'eelloc',i,j,eel_loc_ij + + eel_loc=eel_loc+eel_loc_ij +C Partial derivatives in virtual-bond dihedral angles gamma + if (i.gt.1) + & gel_loc_loc(i-1)=gel_loc_loc(i-1)+ + & a22*muder(1,i)*mu(1,j)+a23*muder(1,i)*mu(2,j) + & +a32*muder(2,i)*mu(1,j)+a33*muder(2,i)*mu(2,j) + gel_loc_loc(j-1)=gel_loc_loc(j-1)+ + & a22*mu(1,i)*muder(1,j)+a23*mu(1,i)*muder(2,j) + & +a32*mu(2,i)*muder(1,j)+a33*mu(2,i)*muder(2,j) +C Derivatives of eello in DC(i+1) thru DC(j-1) or DC(nres-2) + do l=1,3 + ggg(l)=agg(l,1)*muij(1)+ + & agg(l,2)*muij(2)+agg(l,3)*muij(3)+agg(l,4)*muij(4) + gel_loc_long(l,j)=gel_loc_long(l,j)+ggg(l) + gel_loc_long(l,i)=gel_loc_long(l,i)-ggg(l) +cgrad ghalf=0.5d0*ggg(l) +cgrad gel_loc(l,i)=gel_loc(l,i)+ghalf +cgrad gel_loc(l,j)=gel_loc(l,j)+ghalf + enddo +cgrad do k=i+1,j2 +cgrad do l=1,3 +cgrad gel_loc(l,k)=gel_loc(l,k)+ggg(l) +cgrad enddo +cgrad enddo +C Remaining derivatives of eello + do l=1,3 + gel_loc(l,i)=gel_loc(l,i)+aggi(l,1)*muij(1)+ + & aggi(l,2)*muij(2)+aggi(l,3)*muij(3)+aggi(l,4)*muij(4) + gel_loc(l,i+1)=gel_loc(l,i+1)+aggi1(l,1)*muij(1)+ + & aggi1(l,2)*muij(2)+aggi1(l,3)*muij(3)+aggi1(l,4)*muij(4) + gel_loc(l,j)=gel_loc(l,j)+aggj(l,1)*muij(1)+ + & aggj(l,2)*muij(2)+aggj(l,3)*muij(3)+aggj(l,4)*muij(4) + gel_loc(l,j1)=gel_loc(l,j1)+aggj1(l,1)*muij(1)+ + & aggj1(l,2)*muij(2)+aggj1(l,3)*muij(3)+aggj1(l,4)*muij(4) + enddo + ENDIF +C Change 12/26/95 to calculate four-body contributions to H-bonding energy +c if (j.gt.i+1 .and. num_conti.le.maxconts) then + if (wcorr+wcorr4+wcorr5+wcorr6.gt.0.0d0 + & .and. num_conti.le.maxconts) then +c write (iout,*) i,j," entered corr" +C +C Calculate the contact function. The ith column of the array JCONT will +C contain the numbers of atoms that make contacts with the atom I (of numbers +C greater than I). The arrays FACONT and GACONT will contain the values of +C the contact function and its derivative. +c r0ij=1.02D0*rpp(iteli,itelj) +c r0ij=1.11D0*rpp(iteli,itelj) + r0ij=2.20D0*rpp(iteli,itelj) +c r0ij=1.55D0*rpp(iteli,itelj) + call gcont(rij,r0ij,1.0D0,0.2d0*r0ij,fcont,fprimcont) + if (fcont.gt.0.0D0) then + num_conti=num_conti+1 + if (num_conti.gt.maxconts) then + write (iout,*) 'WARNING - max. # of contacts exceeded;', + & ' will skip next contacts for this conf.' + else + jcont_hb(num_conti,i)=j +cd write (iout,*) "i",i," j",j," num_conti",num_conti, +cd & " jcont_hb",jcont_hb(num_conti,i) + IF (wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. + & wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0) THEN +C 9/30/99 (AL) - store components necessary to evaluate higher-order loc-el +C terms. + d_cont(num_conti,i)=rij +cd write (2,'(3e15.5)') rij,r0ij+0.2d0*r0ij,rij +C --- Electrostatic-interaction matrix --- + a_chuj(1,1,num_conti,i)=a22 + a_chuj(1,2,num_conti,i)=a23 + a_chuj(2,1,num_conti,i)=a32 + a_chuj(2,2,num_conti,i)=a33 +C --- Gradient of rij + do kkk=1,3 + grij_hb_cont(kkk,num_conti,i)=erij(kkk) + enddo + kkll=0 + do k=1,2 + do l=1,2 + kkll=kkll+1 + do m=1,3 + a_chuj_der(k,l,m,1,num_conti,i)=agg(m,kkll) + a_chuj_der(k,l,m,2,num_conti,i)=aggi(m,kkll) + a_chuj_der(k,l,m,3,num_conti,i)=aggi1(m,kkll) + a_chuj_der(k,l,m,4,num_conti,i)=aggj(m,kkll) + a_chuj_der(k,l,m,5,num_conti,i)=aggj1(m,kkll) + enddo + enddo + enddo + ENDIF + IF (wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) THEN +C Calculate contact energies + cosa4=4.0D0*cosa + wij=cosa-3.0D0*cosb*cosg + cosbg1=cosb+cosg + cosbg2=cosb-cosg +c fac3=dsqrt(-ael6i)/r0ij**3 + fac3=dsqrt(-ael6i)*r3ij +c ees0pij=dsqrt(4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1) + ees0tmp=4.0D0+cosa4+wij*wij-3.0D0*cosbg1*cosbg1 + if (ees0tmp.gt.0) then + ees0pij=dsqrt(ees0tmp) + else + ees0pij=0 + endif +c ees0mij=dsqrt(4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2) + ees0tmp=4.0D0-cosa4+wij*wij-3.0D0*cosbg2*cosbg2 + if (ees0tmp.gt.0) then + ees0mij=dsqrt(ees0tmp) + else + ees0mij=0 + endif +c ees0mij=0.0D0 + ees0p(num_conti,i)=0.5D0*fac3*(ees0pij+ees0mij) + ees0m(num_conti,i)=0.5D0*fac3*(ees0pij-ees0mij) +C Diagnostics. Comment out or remove after debugging! +c ees0p(num_conti,i)=0.5D0*fac3*ees0pij +c ees0m(num_conti,i)=0.5D0*fac3*ees0mij +c ees0m(num_conti,i)=0.0D0 +C End diagnostics. +c write (iout,*) 'i=',i,' j=',j,' rij=',rij,' r0ij=',r0ij, +c & ' ees0ij=',ees0p(num_conti,i),ees0m(num_conti,i),' fcont=',fcont +C Angular derivatives of the contact function + ees0pij1=fac3/ees0pij + ees0mij1=fac3/ees0mij + fac3p=-3.0D0*fac3*rrmij + ees0pijp=0.5D0*fac3p*(ees0pij+ees0mij) + ees0mijp=0.5D0*fac3p*(ees0pij-ees0mij) +c ees0mij1=0.0D0 + ecosa1= ees0pij1*( 1.0D0+0.5D0*wij) + ecosb1=-1.5D0*ees0pij1*(wij*cosg+cosbg1) + ecosg1=-1.5D0*ees0pij1*(wij*cosb+cosbg1) + ecosa2= ees0mij1*(-1.0D0+0.5D0*wij) + ecosb2=-1.5D0*ees0mij1*(wij*cosg+cosbg2) + ecosg2=-1.5D0*ees0mij1*(wij*cosb-cosbg2) + ecosap=ecosa1+ecosa2 + ecosbp=ecosb1+ecosb2 + ecosgp=ecosg1+ecosg2 + ecosam=ecosa1-ecosa2 + ecosbm=ecosb1-ecosb2 + ecosgm=ecosg1-ecosg2 +C Diagnostics +c ecosap=ecosa1 +c ecosbp=ecosb1 +c ecosgp=ecosg1 +c ecosam=0.0D0 +c ecosbm=0.0D0 +c ecosgm=0.0D0 +C End diagnostics + facont_hb(num_conti,i)=fcont + fprimcont=fprimcont/rij +cd facont_hb(num_conti,i)=1.0D0 +C Following line is for diagnostics. +cd fprimcont=0.0D0 + do k=1,3 + dcosb(k)=rmij*(dc_norm(k,i)-erij(k)*cosb) + dcosg(k)=rmij*(dc_norm(k,j)-erij(k)*cosg) + enddo + do k=1,3 + gggp(k)=ecosbp*dcosb(k)+ecosgp*dcosg(k) + gggm(k)=ecosbm*dcosb(k)+ecosgm*dcosg(k) + enddo + gggp(1)=gggp(1)+ees0pijp*xj + gggp(2)=gggp(2)+ees0pijp*yj + gggp(3)=gggp(3)+ees0pijp*zj + gggm(1)=gggm(1)+ees0mijp*xj + gggm(2)=gggm(2)+ees0mijp*yj + gggm(3)=gggm(3)+ees0mijp*zj +C Derivatives due to the contact function + gacont_hbr(1,num_conti,i)=fprimcont*xj + gacont_hbr(2,num_conti,i)=fprimcont*yj + gacont_hbr(3,num_conti,i)=fprimcont*zj + do k=1,3 +c +c 10/24/08 cgrad and ! comments indicate the parts of the code removed +c following the change of gradient-summation algorithm. +c +cgrad ghalfp=0.5D0*gggp(k) +cgrad ghalfm=0.5D0*gggm(k) + gacontp_hb1(k,num_conti,i)=!ghalfp + & +(ecosap*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosbp*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gacontp_hb2(k,num_conti,i)=!ghalfp + & +(ecosap*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosgp*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gacontp_hb3(k,num_conti,i)=gggp(k) + gacontm_hb1(k,num_conti,i)=!ghalfm + & +(ecosam*(dc_norm(k,j)-cosa*dc_norm(k,i)) + & + ecosbm*(erij(k)-cosb*dc_norm(k,i)))*vbld_inv(i+1) + gacontm_hb2(k,num_conti,i)=!ghalfm + & +(ecosam*(dc_norm(k,i)-cosa*dc_norm(k,j)) + & + ecosgm*(erij(k)-cosg*dc_norm(k,j)))*vbld_inv(j+1) + gacontm_hb3(k,num_conti,i)=gggm(k) + enddo +C Diagnostics. Comment out or remove after debugging! +cdiag do k=1,3 +cdiag gacontp_hb1(k,num_conti,i)=0.0D0 +cdiag gacontp_hb2(k,num_conti,i)=0.0D0 +cdiag gacontp_hb3(k,num_conti,i)=0.0D0 +cdiag gacontm_hb1(k,num_conti,i)=0.0D0 +cdiag gacontm_hb2(k,num_conti,i)=0.0D0 +cdiag gacontm_hb3(k,num_conti,i)=0.0D0 +cdiag enddo + ENDIF ! wcorr + endif ! num_conti.le.maxconts + endif ! fcont.gt.0 + endif ! j.gt.i+1 + if (wturn3.gt.0.0d0 .or. wturn4.gt.0.0d0) then + do k=1,4 + do l=1,3 + ghalf=0.5d0*agg(l,k) + aggi(l,k)=aggi(l,k)+ghalf + aggi1(l,k)=aggi1(l,k)+agg(l,k) + aggj(l,k)=aggj(l,k)+ghalf + enddo + enddo + if (j.eq.nres-1 .and. i.lt.j-2) then + do k=1,4 + do l=1,3 + aggj1(l,k)=aggj1(l,k)+agg(l,k) + enddo + enddo + endif + endif +c t_eelecij=t_eelecij+MPI_Wtime()-time00 + return + end + + +C-------------------------------------------------------------------- + + + subroutine eturn3(i,eello_turn3) +C Third- and fourth-order contributions from turns + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + dimension ggg(3) + double precision auxmat(2,2),auxmat1(2,2),auxmat2(2,2),pizda(2,2), + & e1t(2,2),e2t(2,2),e3t(2,2),e1tder(2,2),e2tder(2,2),e3tder(2,2), + & e1a(2,2),ae3(2,2),ae3e2(2,2),auxvec(2),auxvec1(2) + double precision agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),auxmat3(2,2) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 + j=i+2 +c write (iout,*) "eturn3",i,j,j1,j2 + a_temp(1,1)=a22 + a_temp(1,2)=a23 + a_temp(2,1)=a32 + a_temp(2,2)=a33 +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C Third-order contributions +C +C (i+2)o----(i+3) +C | | +C | | +C (i+1)o----i +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd call checkint_turn3(i,a_temp,eello_turn3_num) + call matmat2(EUg(1,1,i+1),EUg(1,1,i+2),auxmat(1,1)) + call transpose2(auxmat(1,1),auxmat1(1,1)) + call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1)) + eello_turn3=eello_turn3+0.5d0*(pizda(1,1)+pizda(2,2)) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'eturn3',i,j,0.5d0*(pizda(1,1)+pizda(2,2)) +cd write (2,*) 'i,',i,' j',j,'eello_turn3', +cd & 0.5d0*(pizda(1,1)+pizda(2,2)), +cd & ' eello_turn3_num',4*eello_turn3_num +C Derivatives in gamma(i) + call matmat2(EUgder(1,1,i+1),EUg(1,1,i+2),auxmat2(1,1)) + call transpose2(auxmat2(1,1),auxmat3(1,1)) + call matmat2(a_temp(1,1),auxmat3(1,1),pizda(1,1)) + gel_loc_turn3(i)=gel_loc_turn3(i)+0.5d0*(pizda(1,1)+pizda(2,2)) +C Derivatives in gamma(i+1) + call matmat2(EUg(1,1,i+1),EUgder(1,1,i+2),auxmat2(1,1)) + call transpose2(auxmat2(1,1),auxmat3(1,1)) + call matmat2(a_temp(1,1),auxmat3(1,1),pizda(1,1)) + gel_loc_turn3(i+1)=gel_loc_turn3(i+1) + & +0.5d0*(pizda(1,1)+pizda(2,2)) +C Cartesian derivatives + do l=1,3 +c ghalf1=0.5d0*agg(l,1) +c ghalf2=0.5d0*agg(l,2) +c ghalf3=0.5d0*agg(l,3) +c ghalf4=0.5d0*agg(l,4) + a_temp(1,1)=aggi(l,1)!+ghalf1 + a_temp(1,2)=aggi(l,2)!+ghalf2 + a_temp(2,1)=aggi(l,3)!+ghalf3 + a_temp(2,2)=aggi(l,4)!+ghalf4 + call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1)) + gcorr3_turn(l,i)=gcorr3_turn(l,i) + & +0.5d0*(pizda(1,1)+pizda(2,2)) + a_temp(1,1)=aggi1(l,1)!+agg(l,1) + a_temp(1,2)=aggi1(l,2)!+agg(l,2) + a_temp(2,1)=aggi1(l,3)!+agg(l,3) + a_temp(2,2)=aggi1(l,4)!+agg(l,4) + call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1)) + gcorr3_turn(l,i+1)=gcorr3_turn(l,i+1) + & +0.5d0*(pizda(1,1)+pizda(2,2)) + a_temp(1,1)=aggj(l,1)!+ghalf1 + a_temp(1,2)=aggj(l,2)!+ghalf2 + a_temp(2,1)=aggj(l,3)!+ghalf3 + a_temp(2,2)=aggj(l,4)!+ghalf4 + call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1)) + gcorr3_turn(l,j)=gcorr3_turn(l,j) + & +0.5d0*(pizda(1,1)+pizda(2,2)) + a_temp(1,1)=aggj1(l,1) + a_temp(1,2)=aggj1(l,2) + a_temp(2,1)=aggj1(l,3) + a_temp(2,2)=aggj1(l,4) + call matmat2(a_temp(1,1),auxmat1(1,1),pizda(1,1)) + gcorr3_turn(l,j1)=gcorr3_turn(l,j1) + & +0.5d0*(pizda(1,1)+pizda(2,2)) + enddo + return + end + + +C------------------------------------------------------------------------------- + + + subroutine eturn4(i,eello_turn4) +C Third- and fourth-order contributions from turns + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VECTORS' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + dimension ggg(3) + double precision auxmat(2,2),auxmat1(2,2),auxmat2(2,2),pizda(2,2), + & e1t(2,2),e2t(2,2),e3t(2,2),e1tder(2,2),e2tder(2,2),e3tder(2,2), + & e1a(2,2),ae3(2,2),ae3e2(2,2),auxvec(2),auxvec1(2) + double precision agg(3,4),aggi(3,4),aggi1(3,4), + & aggj(3,4),aggj1(3,4),a_temp(2,2),auxmat3(2,2) + common /locel/ a_temp,agg,aggi,aggi1,aggj,aggj1,a22,a23,a32,a33, + & dxi,dyi,dzi,dx_normi,dy_normi,dz_normi,xmedi,ymedi,zmedi, + & num_conti,j1,j2 + j=i+3 +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C Fourth-order contributions +C +C (i+3)o----(i+4) +C / | +C (i+2)o | +C \ | +C (i+1)o----i +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd call checkint_turn4(i,a_temp,eello_turn4_num) +c write (iout,*) "eturn4 i",i," j",j," j1",j1," j2",j2 + a_temp(1,1)=a22 + a_temp(1,2)=a23 + a_temp(2,1)=a32 + a_temp(2,2)=a33 + iti1=itortyp(itype(i+1)) + iti2=itortyp(itype(i+2)) + iti3=itortyp(itype(i+3)) +c write(iout,*) "iti1",iti1," iti2",iti2," iti3",iti3 + call transpose2(EUg(1,1,i+1),e1t(1,1)) + call transpose2(Eug(1,1,i+2),e2t(1,1)) + call transpose2(Eug(1,1,i+3),e3t(1,1)) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + eello_turn4=eello_turn4-(s1+s2+s3) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'eturn4',i,j,-(s1+s2+s3) +cd write (2,*) 'i,',i,' j',j,'eello_turn4',-(s1+s2+s3), +cd & ' eello_turn4_num',8*eello_turn4_num +C Derivatives in gamma(i) + call transpose2(EUgder(1,1,i+1),e1tder(1,1)) + call matmat2(e1tder(1,1),a_temp(1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(ae3e2(1,1),e1tder(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gel_loc_turn4(i)=gel_loc_turn4(i)-(s1+s3) +C Derivatives in gamma(i+1) + call transpose2(EUgder(1,1,i+2),e2tder(1,1)) + call matvec2(ae3(1,1),Ub2der(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2tder(1,1),auxmat(1,1)) + call matmat2(auxmat(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gel_loc_turn4(i+1)=gel_loc_turn4(i+1)-(s2+s3) +C Derivatives in gamma(i+2) + call transpose2(EUgder(1,1,i+3),e3tder(1,1)) + call matvec2(e1a(1,1),Ub2der(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3tder(1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(auxmat(1,1),e2t(1,1),auxmat3(1,1)) + call matmat2(auxmat3(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gel_loc_turn4(i+2)=gel_loc_turn4(i+2)-(s1+s2+s3) +C Cartesian derivatives +C Derivatives of this turn contributions in DC(i+2) + if (j.lt.nres-1) then + do l=1,3 + a_temp(1,1)=agg(l,1) + a_temp(1,2)=agg(l,2) + a_temp(2,1)=agg(l,3) + a_temp(2,2)=agg(l,4) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + ggg(l)=-(s1+s2+s3) + gcorr4_turn(l,i+2)=gcorr4_turn(l,i+2)-(s1+s2+s3) + enddo + endif +C Remaining derivatives of this turn contribution + do l=1,3 + a_temp(1,1)=aggi(l,1) + a_temp(1,2)=aggi(l,2) + a_temp(2,1)=aggi(l,3) + a_temp(2,2)=aggi(l,4) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gcorr4_turn(l,i)=gcorr4_turn(l,i)-(s1+s2+s3) + a_temp(1,1)=aggi1(l,1) + a_temp(1,2)=aggi1(l,2) + a_temp(2,1)=aggi1(l,3) + a_temp(2,2)=aggi1(l,4) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gcorr4_turn(l,i+1)=gcorr4_turn(l,i+1)-(s1+s2+s3) + a_temp(1,1)=aggj(l,1) + a_temp(1,2)=aggj(l,2) + a_temp(2,1)=aggj(l,3) + a_temp(2,2)=aggj(l,4) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) + gcorr4_turn(l,j)=gcorr4_turn(l,j)-(s1+s2+s3) + a_temp(1,1)=aggj1(l,1) + a_temp(1,2)=aggj1(l,2) + a_temp(2,1)=aggj1(l,3) + a_temp(2,2)=aggj1(l,4) + call matmat2(e1t(1,1),a_temp(1,1),e1a(1,1)) + call matvec2(e1a(1,1),Ub2(1,i+3),auxvec(1)) + s1=scalar2(b1(1,iti2),auxvec(1)) + call matmat2(a_temp(1,1),e3t(1,1),ae3(1,1)) + call matvec2(ae3(1,1),Ub2(1,i+2),auxvec(1)) + s2=scalar2(b1(1,iti1),auxvec(1)) + call matmat2(ae3(1,1),e2t(1,1),ae3e2(1,1)) + call matmat2(ae3e2(1,1),e1t(1,1),pizda(1,1)) + s3=0.5d0*(pizda(1,1)+pizda(2,2)) +c write (iout,*) "s1",s1," s2",s2," s3",s3," s1+s2+s3",s1+s2+s3 + gcorr4_turn(l,j1)=gcorr4_turn(l,j1)-(s1+s2+s3) + enddo + return + end + + +C----------------------------------------------------------------------------- + + + subroutine vecpr(u,v,w) + implicit real*8(a-h,o-z) + dimension u(3),v(3),w(3) + w(1)=u(2)*v(3)-u(3)*v(2) + w(2)=-u(1)*v(3)+u(3)*v(1) + w(3)=u(1)*v(2)-u(2)*v(1) + return + end + + +C-------------------------------------------------------------------- + + + subroutine unormderiv(u,ugrad,unorm,ungrad) +C This subroutine computes the derivatives of a normalized vector u, given +C the derivatives computed without normalization conditions, ugrad. Returns +C ungrad. + implicit none + double precision u(3),ugrad(3,3),unorm,ungrad(3,3) + double precision vec(3) + double precision scalar + integer i,j +c write (2,*) 'ugrad',ugrad +c write (2,*) 'u',u + do i=1,3 + vec(i)=scalar(ugrad(1,i),u(1)) + enddo +c write (2,*) 'vec',vec + do i=1,3 + do j=1,3 + ungrad(j,i)=(ugrad(j,i)-u(j)*vec(i))*unorm + enddo + enddo +c write (2,*) 'ungrad',ungrad + return + end + + +C-------------------------------------------------------------------- + + + subroutine escp_soft_sphere(evdw2,evdw2_14) +C +C This subroutine calculates the excluded-volume interaction energy between +C peptide-group centers and side chains and its gradient in virtual-bond and +C side-chain vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 + r0_scp=4.5d0 +cd print '(a)','Enter ESCP' +cd write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e + do i=iatscp_s,iatscp_e + iteli=itel(i) + xi=0.5D0*(c(1,i)+c(1,i+1)) + yi=0.5D0*(c(2,i)+c(2,i+1)) + zi=0.5D0*(c(3,i)+c(3,i+1)) + + do iint=1,nscp_gr(i) + + do j=iscpstart(i,iint),iscpend(i,iint) + itypj=itype(j) +C Uncomment following three lines for SC-p interactions +c xj=c(1,nres+j)-xi +c yj=c(2,nres+j)-yi +c zj=c(3,nres+j)-zi +C Uncomment following three lines for Ca-p interactions + xj=c(1,j)-xi + yj=c(2,j)-yi + zj=c(3,j)-zi + rij=xj*xj+yj*yj+zj*zj + r0ij=r0_scp + r0ijsq=r0ij*r0ij + if (rij.lt.r0ijsq) then + evdwij=0.25d0*(rij-r0ijsq)**2 + fac=rij-r0ijsq + else + evdwij=0.0d0 + fac=0.0d0 + endif + evdw2=evdw2+evdwij +C +C Calculate contributions to the gradient in the virtual-bond and SC vectors. +C + ggg(1)=xj*fac + ggg(2)=yj*fac + ggg(3)=zj*fac +cgrad if (j.lt.i) then +cd write (iout,*) 'ji' +cgrad do k=1,3 +cgrad ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +c gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) +cgrad enddo +cgrad endif +cgrad do k=1,3 +cgrad gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) +cgrad enddo +cgrad kstart=min0(i+1,j) +cgrad kend=max0(i-1,j-1) +cd write (iout,*) 'i=',i,' j=',j,' kstart=',kstart,' kend=',kend +cd write (iout,*) ggg(1),ggg(2),ggg(3) +cgrad do k=kstart,kend +cgrad do l=1,3 +cgrad gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + enddo + + enddo ! iint + enddo ! i + return + end + + +C----------------------------------------------------------------------------- + + + subroutine escp(evdw2,evdw2_14) +C +C This subroutine calculates the excluded-volume interaction energy between +C peptide-group centers and side chains and its gradient in virtual-bond and +C side-chain vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + dimension ggg(3) + evdw2=0.0D0 + evdw2_14=0.0d0 +cd print '(a)','Enter ESCP' +cd write (iout,*) 'iatscp_s=',iatscp_s,' iatscp_e=',iatscp_e + do i=iatscp_s,iatscp_e + iteli=itel(i) + xi=0.5D0*(c(1,i)+c(1,i+1)) + yi=0.5D0*(c(2,i)+c(2,i+1)) + zi=0.5D0*(c(3,i)+c(3,i+1)) + + do iint=1,nscp_gr(i) + + do j=iscpstart(i,iint),iscpend(i,iint) + itypj=itype(j) +C Uncomment following three lines for SC-p interactions +c xj=c(1,nres+j)-xi +c yj=c(2,nres+j)-yi +c zj=c(3,nres+j)-zi +C Uncomment following three lines for Ca-p interactions + xj=c(1,j)-xi + yj=c(2,j)-yi + zj=c(3,j)-zi + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + fac=rrij**expon2 + e1=fac*fac*aad(itypj,iteli) + e2=fac*bad(itypj,iteli) + if (iabs(j-i) .le. 2) then + e1=scal14*e1 + e2=scal14*e2 + evdw2_14=evdw2_14+e1+e2 + endif + evdwij=e1+e2 + evdw2=evdw2+evdwij + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw2',i,j,evdwij +C +C Calculate contributions to the gradient in the virtual-bond and SC vectors. +C + fac=-(evdwij+e1)*rrij + ggg(1)=xj*fac + ggg(2)=yj*fac + ggg(3)=zj*fac +cgrad if (j.lt.i) then +cd write (iout,*) 'ji' +cgrad do k=1,3 +cgrad ggg(k)=-ggg(k) +C Uncomment following line for SC-p interactions +ccgrad gradx_scp(k,j)=gradx_scp(k,j)-ggg(k) +c gradx_scp(k,j)=gradx_scp(k,j)+ggg(k) +cgrad enddo +cgrad endif +cgrad do k=1,3 +cgrad gvdwc_scp(k,i)=gvdwc_scp(k,i)-0.5D0*ggg(k) +cgrad enddo +cgrad kstart=min0(i+1,j) +cgrad kend=max0(i-1,j-1) +cd write (iout,*) 'i=',i,' j=',j,' kstart=',kstart,' kend=',kend +cd write (iout,*) ggg(1),ggg(2),ggg(3) +cgrad do k=kstart,kend +cgrad do l=1,3 +cgrad gvdwc_scp(l,k)=gvdwc_scp(l,k)-ggg(l) +cgrad enddo +cgrad enddo + do k=1,3 + gvdwc_scpp(k,i)=gvdwc_scpp(k,i)-ggg(k) + gvdwc_scp(k,j)=gvdwc_scp(k,j)+ggg(k) + enddo + enddo + + enddo ! iint + enddo ! i + do i=1,nct + do j=1,3 + gvdwc_scp(j,i)=expon*gvdwc_scp(j,i) + gvdwc_scpp(j,i)=expon*gvdwc_scpp(j,i) + gradx_scp(j,i)=expon*gradx_scp(j,i) + enddo + enddo +C****************************************************************************** +C +C N O T E !!! +C +C To save time the factor EXPON has been extracted from ALL components +C of GVDWC and GRADX. Remember to multiply them by this factor before further +C use! +C +C****************************************************************************** + return + end + + +C-------------------------------------------------------------------- + + + subroutine edis(ehpb) +C +C Evaluate bridge-strain energy and its gradient in virtual-bond and SC vectors. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + dimension ggg(3) + ehpb=0.0D0 +cd write(iout,*)'edis: nhpb=',nhpb,' fbr=',fbr +cd write(iout,*)'link_start=',link_start,' link_end=',link_end + if (link_end.eq.0) return + do i=link_start,link_end +C If ihpb(i) and jhpb(i) > NRES, this is a SC-SC distance, otherwise a +C CA-CA distance used in regularization of structure. + ii=ihpb(i) + jj=jhpb(i) +C iii and jjj point to the residues for which the distance is assigned. + if (ii.gt.nres) then + iii=ii-nres + jjj=jj-nres + else + iii=ii + jjj=jj + endif +cd write (iout,*) "i",i," ii",ii," iii",iii," jj",jj," jjj",jjj +C 24/11/03 AL: SS bridges handled separately because of introducing a specific +C distance and angle dependent SS bond potential. + if (ii.gt.nres .and. itype(iii).eq.1 .and. itype(jjj).eq.1) then + call ssbond_ene(iii,jjj,eij) + ehpb=ehpb+2*eij +cd write (iout,*) "eij",eij + else +C Calculate the distance between the two points and its difference from the +C target distance. + dd=dist(ii,jj) + rdis=dd-dhpb(i) +C Get the force constant corresponding to this distance. + waga=forcon(i) +C Calculate the contribution to energy. + ehpb=ehpb+waga*rdis*rdis +C +C Evaluate gradient. +C + fac=waga*rdis/dd +cd print *,'i=',i,' ii=',ii,' jj=',jj,' dhpb=',dhpb(i),' dd=',dd, +cd & ' waga=',waga,' fac=',fac + do j=1,3 + ggg(j)=fac*(c(j,jj)-c(j,ii)) + enddo +cd print '(i3,3(1pe14.5))',i,(ggg(j),j=1,3) +C If this is a SC-SC distance, we need to calculate the contributions to the +C Cartesian gradient in the SC vectors (ghpbx). + if (iii.lt.ii) then + do j=1,3 + ghpbx(j,iii)=ghpbx(j,iii)-ggg(j) + ghpbx(j,jjj)=ghpbx(j,jjj)+ggg(j) + enddo + endif +cgrad do j=iii,jjj-1 +cgrad do k=1,3 +cgrad ghpbc(k,j)=ghpbc(k,j)+ggg(k) +cgrad enddo +cgrad enddo + do k=1,3 + ghpbc(k,jjj)=ghpbc(k,jjj)+ggg(k) + ghpbc(k,iii)=ghpbc(k,iii)-ggg(k) + enddo + endif + enddo + ehpb=0.5D0*ehpb + return + end + + +C-------------------------------------------------------------------- + + + subroutine ssbond_ene(i,j,eij) +C +C Calculate the distance and angle dependent SS-bond potential energy +C using a free-energy function derived based on RHF/6-31G** ab initio +C calculations of diethyl disulfide. +C +C A. Liwo and U. Kozlowska, 11/24/03 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + double precision erij(3),dcosom1(3),dcosom2(3),gg(3) + itypi=itype(i) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) +c dsci_inv=dsc_inv(itypi) + dsci_inv=vbld_inv(nres+i) + itypj=itype(j) +c dscj_inv=dsc_inv(itypj) + dscj_inv=vbld_inv(nres+j) + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + erij(1)=xj*rij + erij(2)=yj*rij + erij(3)=zj*rij + om1=dxi*erij(1)+dyi*erij(2)+dzi*erij(3) + om2=dxj*erij(1)+dyj*erij(2)+dzj*erij(3) + om12=dxi*dxj+dyi*dyj+dzi*dzj + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,nres+i)-om1*erij(k)) + dcosom2(k)=rij*(dc_norm(k,nres+j)-om2*erij(k)) + enddo + rij=1.0d0/rij + deltad=rij-d0cm + deltat1=1.0d0-om1 + deltat2=1.0d0+om2 + deltat12=om2-om1+2.0d0 + cosphi=om12-om1*om2 + eij=akcm*deltad*deltad+akth*(deltat1*deltat1+deltat2*deltat2) + & +akct*deltad*deltat12 + & +v1ss*cosphi+v2ss*cosphi*cosphi+v3ss*cosphi*cosphi*cosphi +c write(iout,*) i,j,"rij",rij,"d0cm",d0cm," akcm",akcm," akth",akth, +c & " akct",akct," deltad",deltad," deltat",deltat1,deltat2, +c & " deltat12",deltat12," eij",eij + ed=2*akcm*deltad+akct*deltat12 + pom1=akct*deltad + pom2=v1ss+2*v2ss*cosphi+3*v3ss*cosphi*cosphi + eom1=-2*akth*deltat1-pom1-om2*pom2 + eom2= 2*akth*deltat2+pom1-om1*pom2 + eom12=pom2 + do k=1,3 + ggk=ed*erij(k)+eom1*dcosom1(k)+eom2*dcosom2(k) + ghpbx(k,i)=ghpbx(k,i)-ggk + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + ghpbx(k,j)=ghpbx(k,j)+ggk + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + ghpbc(k,i)=ghpbc(k,i)-ggk + ghpbc(k,j)=ghpbc(k,j)+ggk + enddo +C +C Calculate the components of the gradient in DC and X +C +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad ghpbc(l,k)=ghpbc(l,k)+gg(l) +cgrad enddo +cgrad enddo + return + end + + +C-------------------------------------------------------------------- + + + subroutine ebond(estr) +c +c Evaluate the energy of stretching of the CA-CA and CA-SC virtual bonds +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + double precision u(3),ud(3) + estr=0.0d0 + do i=ibondp_start,ibondp_end + diff = vbld(i)-vbldp0 +c write (iout,*) i,vbld(i),vbldp0,diff,AKP*diff*diff + estr=estr+diff*diff + do j=1,3 + gradb(j,i-1)=AKP*diff*dc(j,i-1)/vbld(i) + enddo +c write (iout,'(i5,3f10.5)') i,(gradb(j,i-1),j=1,3) + enddo + estr=0.5d0*AKP*estr +c +c 09/18/07 AL: multimodal bond potential based on AM1 CA-SC PMF's included +c + do i=ibond_start,ibond_end + iti=itype(i) + if (iti.ne.10) then + nbi=nbondterm(iti) + if (nbi.eq.1) then + diff=vbld(i+nres)-vbldsc0(1,iti) +c write (iout,*) i,iti,vbld(i+nres),vbldsc0(1,iti),diff, +c & AKSC(1,iti),AKSC(1,iti)*diff*diff + estr=estr+0.5d0*AKSC(1,iti)*diff*diff + do j=1,3 + gradbx(j,i)=AKSC(1,iti)*diff*dc(j,i+nres)/vbld(i+nres) + enddo + else + do j=1,nbi + diff=vbld(i+nres)-vbldsc0(j,iti) + ud(j)=aksc(j,iti)*diff + u(j)=abond0(j,iti)+0.5d0*ud(j)*diff + enddo + uprod=u(1) + do j=2,nbi + uprod=uprod*u(j) + enddo + usum=0.0d0 + usumsqder=0.0d0 + do j=1,nbi + uprod1=1.0d0 + uprod2=1.0d0 + do k=1,nbi + if (k.ne.j) then + uprod1=uprod1*u(k) + uprod2=uprod2*u(k)*u(k) + endif + enddo + usum=usum+uprod1 + usumsqder=usumsqder+ud(j)*uprod2 + enddo + estr=estr+uprod/usum + do j=1,3 + gradbx(j,i)=usumsqder/(usum*usum)*dc(j,i+nres)/vbld(i+nres) + enddo + endif + endif + enddo + return + end +#ifdef CRYST_THETA + + +C-------------------------------------------------------------------- + + + subroutine ebend(etheta) +C +C Evaluate the virtual-bond-angle energy given the virtual-bond dihedral +C angles gamma and its derivatives in consecutive thetas and gammas. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it + double precision y(2),z(2) + delta=0.02d0*pi +c time11=dexp(-2*time) +c time12=1.0d0 + etheta=0.0D0 +c write (*,'(a,i2)') 'EBEND ICG=',icg + do i=ithet_start,ithet_end +C Zero the energy function and its derivative at 0 or pi. + call splinthet(theta(i),0.5d0*delta,ss,ssd) + it=itype(i-1) + if (i.gt.3) then +#ifdef OSF + phii=phi(i) + if (phii.ne.phii) phii=150.0 +#else + phii=phi(i) +#endif + y(1)=dcos(phii) + y(2)=dsin(phii) + else + y(1)=0.0D0 + y(2)=0.0D0 + endif + if (i.lt.nres) then +#ifdef OSF + phii1=phi(i+1) + if (phii1.ne.phii1) phii1=150.0 + phii1=pinorm(phii1) + z(1)=cos(phii1) +#else + phii1=phi(i+1) + z(1)=dcos(phii1) +#endif + z(2)=dsin(phii1) + else + z(1)=0.0D0 + z(2)=0.0D0 + endif +C Calculate the "mean" value of theta from the part of the distribution +C dependent on the adjacent virtual-bond-valence angles (gamma1 & gamma2). +C In following comments this theta will be referred to as t_c. + thet_pred_mean=0.0d0 + do k=1,2 + athetk=athet(k,it) + bthetk=bthet(k,it) + thet_pred_mean=thet_pred_mean+athetk*y(k)+bthetk*z(k) + enddo + dthett=thet_pred_mean*ssd + thet_pred_mean=thet_pred_mean*ss+a0thet(it) +C Derivatives of the "mean" values in gamma1 and gamma2. + dthetg1=(-athet(1,it)*y(2)+athet(2,it)*y(1))*ss + dthetg2=(-bthet(1,it)*z(2)+bthet(2,it)*z(1))*ss + if (theta(i).gt.pi-delta) then + call theteng(pi-delta,thet_pred_mean,theta0(it),f0,fprim0, + & E_tc0) + call mixder(pi-delta,thet_pred_mean,theta0(it),fprim_tc0) + call theteng(pi,thet_pred_mean,theta0(it),f1,fprim1,E_tc1) + call spline1(theta(i),pi-delta,delta,f0,f1,fprim0,ethetai, + & E_theta) + call spline2(theta(i),pi-delta,delta,E_tc0,E_tc1,fprim_tc0, + & E_tc) + else if (theta(i).lt.delta) then + call theteng(delta,thet_pred_mean,theta0(it),f0,fprim0,E_tc0) + call theteng(0.0d0,thet_pred_mean,theta0(it),f1,fprim1,E_tc1) + call spline1(theta(i),delta,-delta,f0,f1,fprim0,ethetai, + & E_theta) + call mixder(delta,thet_pred_mean,theta0(it),fprim_tc0) + call spline2(theta(i),delta,-delta,E_tc0,E_tc1,fprim_tc0, + & E_tc) + else + call theteng(theta(i),thet_pred_mean,theta0(it),ethetai, + & E_theta,E_tc) + endif + etheta=etheta+ethetai + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'ebend',i,ethetai + if (i.gt.3) gloc(i-3,icg)=gloc(i-3,icg)+wang*E_tc*dthetg1 + if (i.lt.nres) gloc(i-2,icg)=gloc(i-2,icg)+wang*E_tc*dthetg2 + gloc(nphi+i-2,icg)=wang*(E_theta+E_tc*dthett) + enddo +C Ufff.... We've done all this!!! + return + end + + +C--------------------------------------------------------------------------- + + + subroutine theteng(thetai,thet_pred_mean,theta0i,ethetai,E_theta, + & E_tc) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it +C Calculate the contributions to both Gaussian lobes. +C 6/6/97 - Deform the Gaussians using the factor of 1/(1+time) +C The "polynomial part" of the "standard deviation" of this part of +C the distribution. + sig=polthet(3,it) + do j=2,0,-1 + sig=sig*thet_pred_mean+polthet(j,it) + enddo +C Derivative of the "interior part" of the "standard deviation of the" +C gamma-dependent Gaussian lobe in t_c. + sigtc=3*polthet(3,it) + do j=2,1,-1 + sigtc=sigtc*thet_pred_mean+j*polthet(j,it) + enddo + sigtc=sig*sigtc +C Set the parameters of both Gaussian lobes of the distribution. +C "Standard deviation" of the gamma-dependent Gaussian lobe (sigtc) + fac=sig*sig+sigc0(it) + sigcsq=fac+fac + sigc=1.0D0/sigcsq +C Following variable (sigsqtc) is -(1/2)d[sigma(t_c)**(-2))]/dt_c + sigsqtc=-4.0D0*sigcsq*sigtc +c print *,i,sig,sigtc,sigsqtc +C Following variable (sigtc) is d[sigma(t_c)]/dt_c + sigtc=-sigtc/(fac*fac) +C Following variable is sigma(t_c)**(-2) + sigcsq=sigcsq*sigcsq + sig0i=sig0(it) + sig0inv=1.0D0/sig0i**2 + delthec=thetai-thet_pred_mean + delthe0=thetai-theta0i + term1=-0.5D0*sigcsq*delthec*delthec + term2=-0.5D0*sig0inv*delthe0*delthe0 +C Following fuzzy logic is to avoid underflows in dexp and subsequent INFs and +C NaNs in taking the logarithm. We extract the largest exponent which is added +C to the energy (this being the log of the distribution) at the end of energy +C term evaluation for this virtual-bond angle. + if (term1.gt.term2) then + termm=term1 + term2=dexp(term2-termm) + term1=1.0d0 + else + termm=term2 + term1=dexp(term1-termm) + term2=1.0d0 + endif +C The ratio between the gamma-independent and gamma-dependent lobes of +C the distribution is a Gaussian function of thet_pred_mean too. + diffak=gthet(2,it)-thet_pred_mean + ratak=diffak/gthet(3,it)**2 + ak=dexp(gthet(1,it)-0.5D0*diffak*ratak) +C Let's differentiate it in thet_pred_mean NOW. + aktc=ak*ratak +C Now put together the distribution terms to make complete distribution. + termexp=term1+ak*term2 + termpre=sigc+ak*sig0i +C Contribution of the bending energy from this theta is just the -log of +C the sum of the contributions from the two lobes and the pre-exponential +C factor. Simple enough, isn't it? + ethetai=(-dlog(termexp)-termm+dlog(termpre)) +C NOW the derivatives!!! +C 6/6/97 Take into account the deformation. + E_theta=(delthec*sigcsq*term1 + & +ak*delthe0*sig0inv*term2)/termexp + E_tc=((sigtc+aktc*sig0i)/termpre + & -((delthec*sigcsq+delthec*delthec*sigsqtc)*term1+ + & aktc*term2)/termexp) + return + end + + +c-------------------------------------------------------------------- + + + subroutine mixder(thetai,thet_pred_mean,theta0i,E_tc_t) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /calcthet/ term1,term2,termm,diffak,ratak, + & ak,aktc,termpre,termexp,sigc,sig0i,time11,time12,sigcsq, + & delthe0,sig0inv,sigtc,sigsqtc,delthec,it + delthec=thetai-thet_pred_mean + delthe0=thetai-theta0i +C "Thank you" to MAPLE (probably spared one day of hand-differentiation). + t3 = thetai-thet_pred_mean + t6 = t3**2 + t9 = term1 + t12 = t3*sigcsq + t14 = t12+t6*sigsqtc + t16 = 1.0d0 + t21 = thetai-theta0i + t23 = t21**2 + t26 = term2 + t27 = t21*t26 + t32 = termexp + t40 = t32**2 + E_tc_t = -((sigcsq+2.D0*t3*sigsqtc)*t9-t14*sigcsq*t3*t16*t9 + & -aktc*sig0inv*t27)/t32+(t14*t9+aktc*t26)/t40 + & *(-t12*t9-ak*sig0inv*t27) + return + end +#else + + +C-------------------------------------------------------------------- + + + subroutine ebend(etheta) +C +C Evaluate the virtual-bond-angle energy given the virtual-bond dihedral +C angles gamma and its derivatives in consecutive thetas and gammas. +C ab initio-derived potentials from +c Kozlowska et al., J. Phys.: Condens. Matter 19 (2007) 285203 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + double precision coskt(mmaxtheterm),sinkt(mmaxtheterm), + & cosph1(maxsingle),sinph1(maxsingle),cosph2(maxsingle), + & sinph2(maxsingle),cosph1ph2(maxdouble,maxdouble), + & sinph1ph2(maxdouble,maxdouble) + logical lprn /.false./, lprn1 /.false./ + etheta=0.0D0 + do i=ithet_start,ithet_end + dethetai=0.0d0 + dephii=0.0d0 + dephii1=0.0d0 + theti2=0.5d0*theta(i) + ityp2=ithetyp(itype(i-1)) + do k=1,nntheterm + coskt(k)=dcos(k*theti2) + sinkt(k)=dsin(k*theti2) + enddo + if (i.gt.3) then +#ifdef OSF + phii=phi(i) + if (phii.ne.phii) phii=150.0 +#else + phii=phi(i) +#endif + ityp1=ithetyp(itype(i-2)) + do k=1,nsingle + cosph1(k)=dcos(k*phii) + sinph1(k)=dsin(k*phii) + enddo + else + phii=0.0d0 + ityp1=nthetyp+1 + do k=1,nsingle + cosph1(k)=0.0d0 + sinph1(k)=0.0d0 + enddo + endif + if (i.lt.nres) then +#ifdef OSF + phii1=phi(i+1) + if (phii1.ne.phii1) phii1=150.0 + phii1=pinorm(phii1) +#else + phii1=phi(i+1) +#endif + ityp3=ithetyp(itype(i)) + do k=1,nsingle + cosph2(k)=dcos(k*phii1) + sinph2(k)=dsin(k*phii1) + enddo + else + phii1=0.0d0 + ityp3=nthetyp+1 + do k=1,nsingle + cosph2(k)=0.0d0 + sinph2(k)=0.0d0 + enddo + endif + ethetai=aa0thet(ityp1,ityp2,ityp3) + do k=1,ndouble + do l=1,k-1 + ccl=cosph1(l)*cosph2(k-l) + ssl=sinph1(l)*sinph2(k-l) + scl=sinph1(l)*cosph2(k-l) + csl=cosph1(l)*sinph2(k-l) + cosph1ph2(l,k)=ccl-ssl + cosph1ph2(k,l)=ccl+ssl + sinph1ph2(l,k)=scl+csl + sinph1ph2(k,l)=scl-csl + enddo + enddo + if (lprn) then + write (iout,*) "i",i," ityp1",ityp1," ityp2",ityp2, + & " ityp3",ityp3," theti2",theti2," phii",phii," phii1",phii1 + write (iout,*) "coskt and sinkt" + do k=1,nntheterm + write (iout,*) k,coskt(k),sinkt(k) + enddo + endif + do k=1,ntheterm + ethetai=ethetai+aathet(k,ityp1,ityp2,ityp3)*sinkt(k) + dethetai=dethetai+0.5d0*k*aathet(k,ityp1,ityp2,ityp3) + & *coskt(k) + if (lprn) + & write (iout,*) "k",k," aathet",aathet(k,ityp1,ityp2,ityp3), + & " ethetai",ethetai + enddo + if (lprn) then + write (iout,*) "cosph and sinph" + do k=1,nsingle + write (iout,*) k,cosph1(k),sinph1(k),cosph2(k),sinph2(k) + enddo + write (iout,*) "cosph1ph2 and sinph2ph2" + do k=2,ndouble + do l=1,k-1 + write (iout,*) l,k,cosph1ph2(l,k),cosph1ph2(k,l), + & sinph1ph2(l,k),sinph1ph2(k,l) + enddo + enddo + write(iout,*) "ethetai",ethetai + endif + do m=1,ntheterm2 + do k=1,nsingle + aux=bbthet(k,m,ityp1,ityp2,ityp3)*cosph1(k) + & +ccthet(k,m,ityp1,ityp2,ityp3)*sinph1(k) + & +ddthet(k,m,ityp1,ityp2,ityp3)*cosph2(k) + & +eethet(k,m,ityp1,ityp2,ityp3)*sinph2(k) + ethetai=ethetai+sinkt(m)*aux + dethetai=dethetai+0.5d0*m*aux*coskt(m) + dephii=dephii+k*sinkt(m)*( + & ccthet(k,m,ityp1,ityp2,ityp3)*cosph1(k)- + & bbthet(k,m,ityp1,ityp2,ityp3)*sinph1(k)) + dephii1=dephii1+k*sinkt(m)*( + & eethet(k,m,ityp1,ityp2,ityp3)*cosph2(k)- + & ddthet(k,m,ityp1,ityp2,ityp3)*sinph2(k)) + if (lprn) + & write (iout,*) "m",m," k",k," bbthet", + & bbthet(k,m,ityp1,ityp2,ityp3)," ccthet", + & ccthet(k,m,ityp1,ityp2,ityp3)," ddthet", + & ddthet(k,m,ityp1,ityp2,ityp3)," eethet", + & eethet(k,m,ityp1,ityp2,ityp3)," ethetai",ethetai + enddo + enddo + if (lprn) + & write(iout,*) "ethetai",ethetai + do m=1,ntheterm3 + do k=2,ndouble + do l=1,k-1 + aux=ffthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)+ + & ffthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)+ + & ggthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l) + ethetai=ethetai+sinkt(m)*aux + dethetai=dethetai+0.5d0*m*coskt(m)*aux + dephii=dephii+l*sinkt(m)*( + & -ffthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)- + & ffthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)+ + & ggthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)) + dephii1=dephii1+(k-l)*sinkt(m)*( + & -ffthet(l,k,m,ityp1,ityp2,ityp3)*sinph1ph2(l,k)+ + & ffthet(k,l,m,ityp1,ityp2,ityp3)*sinph1ph2(k,l)+ + & ggthet(l,k,m,ityp1,ityp2,ityp3)*cosph1ph2(l,k)- + & ggthet(k,l,m,ityp1,ityp2,ityp3)*cosph1ph2(k,l)) + if (lprn) then + write (iout,*) "m",m," k",k," l",l," ffthet", + & ffthet(l,k,m,ityp1,ityp2,ityp3), + & ffthet(k,l,m,ityp1,ityp2,ityp3)," ggthet", + & ggthet(l,k,m,ityp1,ityp2,ityp3), + & ggthet(k,l,m,ityp1,ityp2,ityp3)," ethetai",ethetai + write (iout,*) cosph1ph2(l,k)*sinkt(m), + & cosph1ph2(k,l)*sinkt(m), + & sinph1ph2(l,k)*sinkt(m),sinph1ph2(k,l)*sinkt(m) + endif + enddo + enddo + enddo +10 continue + if (lprn1) write (iout,'(i2,3f8.1,9h ethetai ,f10.5)') + & i,theta(i)*rad2deg,phii*rad2deg, + & phii1*rad2deg,ethetai + etheta=etheta+ethetai + if (i.gt.3) gloc(i-3,icg)=gloc(i-3,icg)+wang*dephii + if (i.lt.nres) gloc(i-2,icg)=gloc(i-2,icg)+wang*dephii1 + gloc(nphi+i-2,icg)=wang*dethetai + enddo + return + end +#endif +#ifdef CRYST_SC + + +c-------------------------------------------------------------------- + + + subroutine esc(escloc) +C Calculate the local energy of a side chain and its derivatives in the +C corresponding virtual-bond valence angles THETA and the spherical angles +C ALPHA and OMEGA. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + double precision x(3),dersc(3),xemp(3),dersc0(3),dersc1(3), + & ddersc0(3),ddummy(3),xtemp(3),temp(3) + common /sccalc/ time11,time12,time112,theti,it,nlobit + delta=0.02d0*pi + escloc=0.0D0 +c write (iout,'(a)') 'ESC' + do i=loc_start,loc_end + it=itype(i) + if (it.eq.10) goto 1 + nlobit=nlob(it) +c print *,'i=',i,' it=',it,' nlobit=',nlobit +c write (iout,*) 'i=',i,' ssa=',ssa,' ssad=',ssad + theti=theta(i+1)-pipol + x(1)=dtan(theti) + x(2)=alph(i) + x(3)=omeg(i) + + if (x(2).gt.pi-delta) then + xtemp(1)=x(1) + xtemp(2)=pi-delta + xtemp(3)=x(3) + call enesc(xtemp,escloci0,dersc0,ddersc0,.true.) + xtemp(2)=pi + call enesc(xtemp,escloci1,dersc1,ddummy,.false.) + call spline1(x(2),pi-delta,delta,escloci0,escloci1,dersc0(2), + & escloci,dersc(2)) + call spline2(x(2),pi-delta,delta,dersc0(1),dersc1(1), + & ddersc0(1),dersc(1)) + call spline2(x(2),pi-delta,delta,dersc0(3),dersc1(3), + & ddersc0(3),dersc(3)) + xtemp(2)=pi-delta + call enesc_bound(xtemp,esclocbi0,dersc0,dersc12,.true.) + xtemp(2)=pi + call enesc_bound(xtemp,esclocbi1,dersc1,chuju,.false.) + call spline1(x(2),pi-delta,delta,esclocbi0,esclocbi1, + & dersc0(2),esclocbi,dersc02) + call spline2(x(2),pi-delta,delta,dersc0(1),dersc1(1), + & dersc12,dersc01) + call splinthet(x(2),0.5d0*delta,ss,ssd) + dersc0(1)=dersc01 + dersc0(2)=dersc02 + dersc0(3)=0.0d0 + do k=1,3 + dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k) + enddo + dersc(2)=dersc(2)+ssd*(escloci-esclocbi) +c write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci, +c & esclocbi,ss,ssd + escloci=ss*escloci+(1.0d0-ss)*esclocbi +c escloci=esclocbi +c write (iout,*) escloci + else if (x(2).lt.delta) then + xtemp(1)=x(1) + xtemp(2)=delta + xtemp(3)=x(3) + call enesc(xtemp,escloci0,dersc0,ddersc0,.true.) + xtemp(2)=0.0d0 + call enesc(xtemp,escloci1,dersc1,ddummy,.false.) + call spline1(x(2),delta,-delta,escloci0,escloci1,dersc0(2), + & escloci,dersc(2)) + call spline2(x(2),delta,-delta,dersc0(1),dersc1(1), + & ddersc0(1),dersc(1)) + call spline2(x(2),delta,-delta,dersc0(3),dersc1(3), + & ddersc0(3),dersc(3)) + xtemp(2)=delta + call enesc_bound(xtemp,esclocbi0,dersc0,dersc12,.true.) + xtemp(2)=0.0d0 + call enesc_bound(xtemp,esclocbi1,dersc1,chuju,.false.) + call spline1(x(2),delta,-delta,esclocbi0,esclocbi1, + & dersc0(2),esclocbi,dersc02) + call spline2(x(2),delta,-delta,dersc0(1),dersc1(1), + & dersc12,dersc01) + dersc0(1)=dersc01 + dersc0(2)=dersc02 + dersc0(3)=0.0d0 + call splinthet(x(2),0.5d0*delta,ss,ssd) + do k=1,3 + dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k) + enddo + dersc(2)=dersc(2)+ssd*(escloci-esclocbi) +c write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci, +c & esclocbi,ss,ssd + escloci=ss*escloci+(1.0d0-ss)*esclocbi +c write (iout,*) escloci + else + call enesc(x,escloci,dersc,ddummy,.false.) + endif + + escloc=escloc+escloci + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'escloc',i,escloci +c write (iout,*) 'i=',i,' escloci=',escloci,' dersc=',dersc + + gloc(nphi+i-1,icg)=gloc(nphi+i-1,icg)+ + & wscloc*dersc(1) + gloc(ialph(i,1),icg)=wscloc*dersc(2) + gloc(ialph(i,1)+nside,icg)=wscloc*dersc(3) + 1 continue + enddo + return + end + + +C-------------------------------------------------------------------- + + + subroutine enesc(x,escloci,dersc,ddersc,mixed) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /sccalc/ time11,time12,time112,theti,it,nlobit + double precision x(3),z(3),Ax(3,maxlob,-1:1),dersc(3),ddersc(3) + double precision contr(maxlob,-1:1) + logical mixed +c write (iout,*) 'it=',it,' nlobit=',nlobit + escloc_i=0.0D0 + do j=1,3 + dersc(j)=0.0D0 + if (mixed) ddersc(j)=0.0d0 + enddo + x3=x(3) + +C Because of periodicity of the dependence of the SC energy in omega we have +C to add up the contributions from x(3)-2*pi, x(3), and x(3+2*pi). +C To avoid underflows, first compute & store the exponents. + + do iii=-1,1 + + x(3)=x3+iii*dwapi + + do j=1,nlobit + do k=1,3 + z(k)=x(k)-censc(k,j,it) + enddo + do k=1,3 + Axk=0.0D0 + do l=1,3 + Axk=Axk+gaussc(l,k,j,it)*z(l) + enddo + Ax(k,j,iii)=Axk + enddo + expfac=0.0D0 + do k=1,3 + expfac=expfac+Ax(k,j,iii)*z(k) + enddo + contr(j,iii)=expfac + enddo ! j + + enddo ! iii + + x(3)=x3 +C As in the case of ebend, we want to avoid underflows in exponentiation and +C subsequent NaNs and INFs in energy calculation. +C Find the largest exponent + emin=contr(1,-1) + do iii=-1,1 + do j=1,nlobit + if (emin.gt.contr(j,iii)) emin=contr(j,iii) + enddo + enddo + emin=0.5D0*emin +cd print *,'it=',it,' emin=',emin + +C Compute the contribution to SC energy and derivatives + do iii=-1,1 + + do j=1,nlobit +#ifdef OSF + adexp=bsc(j,it)-0.5D0*contr(j,iii)+emin + if(adexp.ne.adexp) adexp=1.0 + expfac=dexp(adexp) +#else + expfac=dexp(bsc(j,it)-0.5D0*contr(j,iii)+emin) +#endif +cd print *,'j=',j,' expfac=',expfac + escloc_i=escloc_i+expfac + do k=1,3 + dersc(k)=dersc(k)+Ax(k,j,iii)*expfac + enddo + if (mixed) then + do k=1,3,2 + ddersc(k)=ddersc(k)+(-Ax(2,j,iii)*Ax(k,j,iii) + & +gaussc(k,2,j,it))*expfac + enddo + endif + enddo + + enddo ! iii + + dersc(1)=dersc(1)/cos(theti)**2 + ddersc(1)=ddersc(1)/cos(theti)**2 + ddersc(3)=ddersc(3) + + escloci=-(dlog(escloc_i)-emin) + do j=1,3 + dersc(j)=dersc(j)/escloc_i + enddo + if (mixed) then + do j=1,3,2 + ddersc(j)=(ddersc(j)/escloc_i+dersc(2)*dersc(j)) + enddo + endif + return + end + + +C-------------------------------------------------------------------- + + + subroutine enesc_bound(x,escloci,dersc,dersc12,mixed) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + common /sccalc/ time11,time12,time112,theti,it,nlobit + double precision x(3),z(3),Ax(3,maxlob),dersc(3) + double precision contr(maxlob) + logical mixed + + escloc_i=0.0D0 + + do j=1,3 + dersc(j)=0.0D0 + enddo + + do j=1,nlobit + do k=1,2 + z(k)=x(k)-censc(k,j,it) + enddo + z(3)=dwapi + do k=1,3 + Axk=0.0D0 + do l=1,3 + Axk=Axk+gaussc(l,k,j,it)*z(l) + enddo + Ax(k,j)=Axk + enddo + expfac=0.0D0 + do k=1,3 + expfac=expfac+Ax(k,j)*z(k) + enddo + contr(j)=expfac + enddo ! j + +C As in the case of ebend, we want to avoid underflows in exponentiation and +C subsequent NaNs and INFs in energy calculation. +C Find the largest exponent + emin=contr(1) + do j=1,nlobit + if (emin.gt.contr(j)) emin=contr(j) + enddo + emin=0.5D0*emin + +C Compute the contribution to SC energy and derivatives + + dersc12=0.0d0 + do j=1,nlobit + expfac=dexp(bsc(j,it)-0.5D0*contr(j)+emin) + escloc_i=escloc_i+expfac + do k=1,2 + dersc(k)=dersc(k)+Ax(k,j)*expfac + enddo + if (mixed) dersc12=dersc12+(-Ax(2,j)*Ax(1,j) + & +gaussc(1,2,j,it))*expfac + dersc(3)=0.0d0 + enddo + + dersc(1)=dersc(1)/cos(theti)**2 + dersc12=dersc12/cos(theti)**2 + escloci=-(dlog(escloc_i)-emin) + do j=1,2 + dersc(j)=dersc(j)/escloc_i + enddo + if (mixed) dersc12=(dersc12/escloc_i+dersc(2)*dersc(1)) + return + end +#else + + +c-------------------------------------------------------------------- + + + subroutine esc(escloc) +C Calculate the local energy of a side chain and its derivatives in the +C corresponding virtual-bond valence angles THETA and the spherical angles +C ALPHA and OMEGA derived from AM1 all-atom calculations. +C added by Urszula Kozlowska. 07/11/2007 +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.SCROT' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + include 'COMMON.VECTORS' + double precision x_prime(3),y_prime(3),z_prime(3) + & , sumene,dsc_i,dp2_i,x(65), + & xx,yy,zz,sumene1,sumene2,sumene3,sumene4,s1,s1_6,s2,s2_6, + & de_dxx,de_dyy,de_dzz,de_dt + double precision s1_t,s1_6_t,s2_t,s2_6_t + double precision + & dXX_Ci1(3),dYY_Ci1(3),dZZ_Ci1(3),dXX_Ci(3), + & dYY_Ci(3),dZZ_Ci(3),dXX_XYZ(3),dYY_XYZ(3),dZZ_XYZ(3), + & dt_dCi(3),dt_dCi1(3) + common /sccalc/ time11,time12,time112,theti,it,nlobit + delta=0.02d0*pi + escloc=0.0D0 + do i=loc_start,loc_end + costtab(i+1) =dcos(theta(i+1)) + sinttab(i+1) =dsqrt(1-costtab(i+1)*costtab(i+1)) + cost2tab(i+1)=dsqrt(0.5d0*(1.0d0+costtab(i+1))) + sint2tab(i+1)=dsqrt(0.5d0*(1.0d0-costtab(i+1))) + cosfac2=0.5d0/(1.0d0+costtab(i+1)) + cosfac=dsqrt(cosfac2) + sinfac2=0.5d0/(1.0d0-costtab(i+1)) + sinfac=dsqrt(sinfac2) + it=itype(i) + if (it.eq.10) goto 1 +c +C Compute the axes of tghe local cartesian coordinates system; store in +c x_prime, y_prime and z_prime +c + do j=1,3 + x_prime(j) = 0.00 + y_prime(j) = 0.00 + z_prime(j) = 0.00 + enddo +C write(2,*) "dc_norm", dc_norm(1,i+nres),dc_norm(2,i+nres), +C & dc_norm(3,i+nres) + do j = 1,3 + x_prime(j) = (dc_norm(j,i) - dc_norm(j,i-1))*cosfac + y_prime(j) = (dc_norm(j,i) + dc_norm(j,i-1))*sinfac + enddo + do j = 1,3 + z_prime(j) = -uz(j,i-1) + enddo +c write (2,*) "i",i +c write (2,*) "x_prime",(x_prime(j),j=1,3) +c write (2,*) "y_prime",(y_prime(j),j=1,3) +c write (2,*) "z_prime",(z_prime(j),j=1,3) +c write (2,*) "xx",scalar(x_prime(1),x_prime(1)), +c & " xy",scalar(x_prime(1),y_prime(1)), +c & " xz",scalar(x_prime(1),z_prime(1)), +c & " yy",scalar(y_prime(1),y_prime(1)), +c & " yz",scalar(y_prime(1),z_prime(1)), +c & " zz",scalar(z_prime(1),z_prime(1)) +c +C Transform the unit vector of the ith side-chain centroid, dC_norm(*,i), +C to local coordinate system. Store in xx, yy, zz. +c + xx=0.0d0 + yy=0.0d0 + zz=0.0d0 + do j = 1,3 + xx = xx + x_prime(j)*dc_norm(j,i+nres) + yy = yy + y_prime(j)*dc_norm(j,i+nres) + zz = zz + z_prime(j)*dc_norm(j,i+nres) + enddo + + xxtab(i)=xx + yytab(i)=yy + zztab(i)=zz +C +C Compute the energy of the ith side cbain +C +c write (2,*) "xx",xx," yy",yy," zz",zz + it=itype(i) + do j = 1,65 + x(j) = sc_parmin(j,it) + enddo +#ifdef CHECK_COORD +Cc diagnostics - remove later + xx1 = dcos(alph(2)) + yy1 = dsin(alph(2))*dcos(omeg(2)) + zz1 = -dsin(alph(2))*dsin(omeg(2)) + write(2,'(3f8.1,3f9.3,1x,3f9.3)') + & alph(2)*rad2deg,omeg(2)*rad2deg,theta(3)*rad2deg,xx,yy,zz, + & xx1,yy1,zz1 +C," --- ", xx_w,yy_w,zz_w +c end diagnostics +#endif + sumene1= x(1)+ x(2)*xx+ x(3)*yy+ x(4)*zz+ x(5)*xx**2 + & + x(6)*yy**2+ x(7)*zz**2+ x(8)*xx*zz+ x(9)*xx*yy + & + x(10)*yy*zz + sumene2= x(11) + x(12)*xx + x(13)*yy + x(14)*zz + x(15)*xx**2 + & + x(16)*yy**2 + x(17)*zz**2 + x(18)*xx*zz + x(19)*xx*yy + & + x(20)*yy*zz + sumene3= x(21) +x(22)*xx +x(23)*yy +x(24)*zz +x(25)*xx**2 + & +x(26)*yy**2 +x(27)*zz**2 +x(28)*xx*zz +x(29)*xx*yy + & +x(30)*yy*zz +x(31)*xx**3 +x(32)*yy**3 +x(33)*zz**3 + & +x(34)*(xx**2)*yy +x(35)*(xx**2)*zz +x(36)*(yy**2)*xx + & +x(37)*(yy**2)*zz +x(38)*(zz**2)*xx +x(39)*(zz**2)*yy + & +x(40)*xx*yy*zz + sumene4= x(41) +x(42)*xx +x(43)*yy +x(44)*zz +x(45)*xx**2 + & +x(46)*yy**2 +x(47)*zz**2 +x(48)*xx*zz +x(49)*xx*yy + & +x(50)*yy*zz +x(51)*xx**3 +x(52)*yy**3 +x(53)*zz**3 + & +x(54)*(xx**2)*yy +x(55)*(xx**2)*zz +x(56)*(yy**2)*xx + & +x(57)*(yy**2)*zz +x(58)*(zz**2)*xx +x(59)*(zz**2)*yy + & +x(60)*xx*yy*zz + dsc_i = 0.743d0+x(61) + dp2_i = 1.9d0+x(62) + dscp1=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2tab(i+1)+yy*sint2tab(i+1))) + dscp2=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2tab(i+1)-yy*sint2tab(i+1))) + s1=(1+x(63))/(0.1d0 + dscp1) + s1_6=(1+x(64))/(0.1d0 + dscp1**6) + s2=(1+x(65))/(0.1d0 + dscp2) + s2_6=(1+x(65))/(0.1d0 + dscp2**6) + sumene = ( sumene3*sint2tab(i+1) + sumene1)*(s1+s1_6) + & + (sumene4*cost2tab(i+1) +sumene2)*(s2+s2_6) +c write(2,'(i2," sumene",7f9.3)') i,sumene1,sumene2,sumene3, +c & sumene4, +c & dscp1,dscp2,sumene +c sumene = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + escloc = escloc + sumene +c write (2,*) "i",i," escloc",sumene,escloc +#ifdef DEBUG +C +C This section to check the numerical derivatives of the energy of ith side +C chain in xx, yy, zz, and theta. Use the -DDEBUG compiler option or insert +C #define DEBUG in the code to turn it on. +C + write (2,*) "sumene =",sumene + aincr=1.0d-7 + xxsave=xx + xx=xx+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dxx_num=(sumenep-sumene)/aincr + xx=xxsave + write (2,*) "xx+ sumene from enesc=",sumenep + yysave=yy + yy=yy+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dyy_num=(sumenep-sumene)/aincr + yy=yysave + write (2,*) "yy+ sumene from enesc=",sumenep + zzsave=zz + zz=zz+aincr + write (2,*) xx,yy,zz + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dzz_num=(sumenep-sumene)/aincr + zz=zzsave + write (2,*) "zz+ sumene from enesc=",sumenep + costsave=cost2tab(i+1) + sintsave=sint2tab(i+1) + cost2tab(i+1)=dcos(0.5d0*(theta(i+1)+aincr)) + sint2tab(i+1)=dsin(0.5d0*(theta(i+1)+aincr)) + sumenep = enesc(x,xx,yy,zz,cost2tab(i+1),sint2tab(i+1)) + de_dt_num=(sumenep-sumene)/aincr + write (2,*) " t+ sumene from enesc=",sumenep + cost2tab(i+1)=costsave + sint2tab(i+1)=sintsave +C End of diagnostics section. +#endif +C +C Compute the gradient of esc +C + pom_s1=(1.0d0+x(63))/(0.1d0 + dscp1)**2 + pom_s16=6*(1.0d0+x(64))/(0.1d0 + dscp1**6)**2 + pom_s2=(1.0d0+x(65))/(0.1d0 + dscp2)**2 + pom_s26=6*(1.0d0+x(65))/(0.1d0 + dscp2**6)**2 + pom_dx=dsc_i*dp2_i*cost2tab(i+1) + pom_dy=dsc_i*dp2_i*sint2tab(i+1) + pom_dt1=-0.5d0*dsc_i*dp2_i*(xx*sint2tab(i+1)-yy*cost2tab(i+1)) + pom_dt2=-0.5d0*dsc_i*dp2_i*(xx*sint2tab(i+1)+yy*cost2tab(i+1)) + pom1=(sumene3*sint2tab(i+1)+sumene1) + & *(pom_s1/dscp1+pom_s16*dscp1**4) + pom2=(sumene4*cost2tab(i+1)+sumene2) + & *(pom_s2/dscp2+pom_s26*dscp2**4) + sumene1x=x(2)+2*x(5)*xx+x(8)*zz+ x(9)*yy + sumene3x=x(22)+2*x(25)*xx+x(28)*zz+x(29)*yy+3*x(31)*xx**2 + & +2*x(34)*xx*yy +2*x(35)*xx*zz +x(36)*(yy**2) +x(38)*(zz**2) + & +x(40)*yy*zz + sumene2x=x(12)+2*x(15)*xx+x(18)*zz+ x(19)*yy + sumene4x=x(42)+2*x(45)*xx +x(48)*zz +x(49)*yy +3*x(51)*xx**2 + & +2*x(54)*xx*yy+2*x(55)*xx*zz+x(56)*(yy**2)+x(58)*(zz**2) + & +x(60)*yy*zz + de_dxx =(sumene1x+sumene3x*sint2tab(i+1))*(s1+s1_6) + & +(sumene2x+sumene4x*cost2tab(i+1))*(s2+s2_6) + & +(pom1+pom2)*pom_dx +#ifdef DEBUG + write(2,*), "de_dxx = ", de_dxx,de_dxx_num +#endif +C + sumene1y=x(3) + 2*x(6)*yy + x(9)*xx + x(10)*zz + sumene3y=x(23) +2*x(26)*yy +x(29)*xx +x(30)*zz +3*x(32)*yy**2 + & +x(34)*(xx**2) +2*x(36)*yy*xx +2*x(37)*yy*zz +x(39)*(zz**2) + & +x(40)*xx*zz + sumene2y=x(13) + 2*x(16)*yy + x(19)*xx + x(20)*zz + sumene4y=x(43)+2*x(46)*yy+x(49)*xx +x(50)*zz + & +3*x(52)*yy**2+x(54)*xx**2+2*x(56)*yy*xx +2*x(57)*yy*zz + & +x(59)*zz**2 +x(60)*xx*zz + de_dyy =(sumene1y+sumene3y*sint2tab(i+1))*(s1+s1_6) + & +(sumene2y+sumene4y*cost2tab(i+1))*(s2+s2_6) + & +(pom1-pom2)*pom_dy +#ifdef DEBUG + write(2,*), "de_dyy = ", de_dyy,de_dyy_num +#endif +C + de_dzz =(x(24) +2*x(27)*zz +x(28)*xx +x(30)*yy + & +3*x(33)*zz**2 +x(35)*xx**2 +x(37)*yy**2 +2*x(38)*zz*xx + & +2*x(39)*zz*yy +x(40)*xx*yy)*sint2tab(i+1)*(s1+s1_6) + & +(x(4) + 2*x(7)*zz+ x(8)*xx + x(10)*yy)*(s1+s1_6) + & +(x(44)+2*x(47)*zz +x(48)*xx +x(50)*yy +3*x(53)*zz**2 + & +x(55)*xx**2 +x(57)*(yy**2)+2*x(58)*zz*xx +2*x(59)*zz*yy + & +x(60)*xx*yy)*cost2tab(i+1)*(s2+s2_6) + & + ( x(14) + 2*x(17)*zz+ x(18)*xx + x(20)*yy)*(s2+s2_6) +#ifdef DEBUG + write(2,*), "de_dzz = ", de_dzz,de_dzz_num +#endif +C + de_dt = 0.5d0*sumene3*cost2tab(i+1)*(s1+s1_6) + & -0.5d0*sumene4*sint2tab(i+1)*(s2+s2_6) + & +pom1*pom_dt1+pom2*pom_dt2 +#ifdef DEBUG + write(2,*), "de_dt = ", de_dt,de_dt_num +#endif +c +C + cossc=scalar(dc_norm(1,i),dc_norm(1,i+nres)) + cossc1=scalar(dc_norm(1,i-1),dc_norm(1,i+nres)) + cosfac2xx=cosfac2*xx + sinfac2yy=sinfac2*yy + do k = 1,3 + dt_dCi(k) = -(dc_norm(k,i-1)+costtab(i+1)*dc_norm(k,i))* + & vbld_inv(i+1) + dt_dCi1(k)= -(dc_norm(k,i)+costtab(i+1)*dc_norm(k,i-1))* + & vbld_inv(i) + pom=(dC_norm(k,i+nres)-cossc*dC_norm(k,i))*vbld_inv(i+1) + pom1=(dC_norm(k,i+nres)-cossc1*dC_norm(k,i-1))*vbld_inv(i) +c write (iout,*) "i",i," k",k," pom",pom," pom1",pom1, +c & " dt_dCi",dt_dCi(k)," dt_dCi1",dt_dCi1(k) +c write (iout,*) "dC_norm",(dC_norm(j,i),j=1,3), +c & (dC_norm(j,i-1),j=1,3)," vbld_inv",vbld_inv(i+1),vbld_inv(i) + dXX_Ci(k)=pom*cosfac-dt_dCi(k)*cosfac2xx + dXX_Ci1(k)=-pom1*cosfac-dt_dCi1(k)*cosfac2xx + dYY_Ci(k)=pom*sinfac+dt_dCi(k)*sinfac2yy + dYY_Ci1(k)=pom1*sinfac+dt_dCi1(k)*sinfac2yy + dZZ_Ci1(k)=0.0d0 + dZZ_Ci(k)=0.0d0 + do j=1,3 + dZZ_Ci(k)=dZZ_Ci(k)-uzgrad(j,k,2,i-1)*dC_norm(j,i+nres) + dZZ_Ci1(k)=dZZ_Ci1(k)-uzgrad(j,k,1,i-1)*dC_norm(j,i+nres) + enddo + + dXX_XYZ(k)=vbld_inv(i+nres)*(x_prime(k)-xx*dC_norm(k,i+nres)) + dYY_XYZ(k)=vbld_inv(i+nres)*(y_prime(k)-yy*dC_norm(k,i+nres)) + dZZ_XYZ(k)=vbld_inv(i+nres)*(z_prime(k)-zz*dC_norm(k,i+nres)) +c + dt_dCi(k) = -dt_dCi(k)/sinttab(i+1) + dt_dCi1(k)= -dt_dCi1(k)/sinttab(i+1) + enddo + + do k=1,3 + dXX_Ctab(k,i)=dXX_Ci(k) + dXX_C1tab(k,i)=dXX_Ci1(k) + dYY_Ctab(k,i)=dYY_Ci(k) + dYY_C1tab(k,i)=dYY_Ci1(k) + dZZ_Ctab(k,i)=dZZ_Ci(k) + dZZ_C1tab(k,i)=dZZ_Ci1(k) + dXX_XYZtab(k,i)=dXX_XYZ(k) + dYY_XYZtab(k,i)=dYY_XYZ(k) + dZZ_XYZtab(k,i)=dZZ_XYZ(k) + enddo + + do k = 1,3 +c write (iout,*) "k",k," dxx_ci1",dxx_ci1(k)," dyy_ci1", +c & dyy_ci1(k)," dzz_ci1",dzz_ci1(k) +c write (iout,*) "k",k," dxx_ci",dxx_ci(k)," dyy_ci", +c & dyy_ci(k)," dzz_ci",dzz_ci(k) +c write (iout,*) "k",k," dt_dci",dt_dci(k)," dt_dci", +c & dt_dci(k) +c write (iout,*) "k",k," dxx_XYZ",dxx_XYZ(k)," dyy_XYZ", +c & dyy_XYZ(k)," dzz_XYZ",dzz_XYZ(k) + gscloc(k,i-1)=gscloc(k,i-1)+de_dxx*dxx_ci1(k) + & +de_dyy*dyy_ci1(k)+de_dzz*dzz_ci1(k)+de_dt*dt_dCi1(k) + gscloc(k,i)=gscloc(k,i)+de_dxx*dxx_Ci(k) + & +de_dyy*dyy_Ci(k)+de_dzz*dzz_Ci(k)+de_dt*dt_dCi(k) + gsclocx(k,i)= de_dxx*dxx_XYZ(k) + & +de_dyy*dyy_XYZ(k)+de_dzz*dzz_XYZ(k) + enddo +c write(iout,*) "ENERGY GRAD = ", (gscloc(k,i-1),k=1,3), +c & (gscloc(k,i),k=1,3),(gsclocx(k,i),k=1,3) + +C to check gradient call subroutine check_grad + + 1 continue + enddo + return + end + + +c-------------------------------------------------------------------- + + + double precision function enesc(x,xx,yy,zz,cost2,sint2) + implicit none + double precision x(65),xx,yy,zz,cost2,sint2,sumene1,sumene2, + & sumene3,sumene4,sumene,dsc_i,dp2_i,dscp1,dscp2,s1,s1_6,s2,s2_6 + sumene1= x(1)+ x(2)*xx+ x(3)*yy+ x(4)*zz+ x(5)*xx**2 + & + x(6)*yy**2+ x(7)*zz**2+ x(8)*xx*zz+ x(9)*xx*yy + & + x(10)*yy*zz + sumene2= x(11) + x(12)*xx + x(13)*yy + x(14)*zz + x(15)*xx**2 + & + x(16)*yy**2 + x(17)*zz**2 + x(18)*xx*zz + x(19)*xx*yy + & + x(20)*yy*zz + sumene3= x(21) +x(22)*xx +x(23)*yy +x(24)*zz +x(25)*xx**2 + & +x(26)*yy**2 +x(27)*zz**2 +x(28)*xx*zz +x(29)*xx*yy + & +x(30)*yy*zz +x(31)*xx**3 +x(32)*yy**3 +x(33)*zz**3 + & +x(34)*(xx**2)*yy +x(35)*(xx**2)*zz +x(36)*(yy**2)*xx + & +x(37)*(yy**2)*zz +x(38)*(zz**2)*xx +x(39)*(zz**2)*yy + & +x(40)*xx*yy*zz + sumene4= x(41) +x(42)*xx +x(43)*yy +x(44)*zz +x(45)*xx**2 + & +x(46)*yy**2 +x(47)*zz**2 +x(48)*xx*zz +x(49)*xx*yy + & +x(50)*yy*zz +x(51)*xx**3 +x(52)*yy**3 +x(53)*zz**3 + & +x(54)*(xx**2)*yy +x(55)*(xx**2)*zz +x(56)*(yy**2)*xx + & +x(57)*(yy**2)*zz +x(58)*(zz**2)*xx +x(59)*(zz**2)*yy + & +x(60)*xx*yy*zz + dsc_i = 0.743d0+x(61) + dp2_i = 1.9d0+x(62) + dscp1=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2+yy*sint2)) + dscp2=dsqrt(dsc_i**2+dp2_i**2-2*dsc_i*dp2_i + & *(xx*cost2-yy*sint2)) + s1=(1+x(63))/(0.1d0 + dscp1) + s1_6=(1+x(64))/(0.1d0 + dscp1**6) + s2=(1+x(65))/(0.1d0 + dscp2) + s2_6=(1+x(65))/(0.1d0 + dscp2**6) + sumene = ( sumene3*sint2 + sumene1)*(s1+s1_6) + & + (sumene4*cost2 +sumene2)*(s2+s2_6) + enesc=sumene + return + end +#endif + + +c-------------------------------------------------------------------- + + + subroutine gcont(rij,r0ij,eps0ij,delta,fcont,fprimcont) +C +C This procedure calculates two-body contact function g(rij) and its derivative: +C +C eps0ij ! x < -1 +C g(rij) = esp0ij*(-0.9375*x+0.625*x**3-0.1875*x**5) ! -1 =< x =< 1 +C 0 ! x > 1 +C +C where x=(rij-r0ij)/delta +C +C rij - interbody distance, r0ij - contact distance, eps0ij - contact energy +C + implicit none + double precision rij,r0ij,eps0ij,fcont,fprimcont + double precision x,x2,x4,delta +c delta=0.02D0*r0ij +c delta=0.2D0*r0ij + x=(rij-r0ij)/delta + if (x.lt.-1.0D0) then + fcont=eps0ij + fprimcont=0.0D0 + else if (x.le.1.0D0) then + x2=x*x + x4=x2*x2 + fcont=eps0ij*(x*(-0.9375D0+0.6250D0*x2-0.1875D0*x4)+0.5D0) + fprimcont=eps0ij * (-0.9375D0+1.8750D0*x2-0.9375D0*x4)/delta + else + fcont=0.0D0 + fprimcont=0.0D0 + endif + return + end + + +c-------------------------------------------------------------------- + + + subroutine splinthet(theti,delta,ss,ssder) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + thetup=pi-delta + thetlow=delta + if (theti.gt.pipol) then + call gcont(theti,thetup,1.0d0,delta,ss,ssder) + else + call gcont(-theti,-thetlow,1.0d0,delta,ss,ssder) + ssder=-ssder + endif + return + end + + +c-------------------------------------------------------------------- + + + subroutine spline1(x,x0,delta,f0,f1,fprim0,f,fprim) + implicit none + double precision x,x0,delta,f0,f1,fprim0,f,fprim + double precision ksi,ksi2,ksi3,a1,a2,a3 + a1=fprim0*delta/(f1-f0) + a2=3.0d0-2.0d0*a1 + a3=a1-2.0d0 + ksi=(x-x0)/delta + ksi2=ksi*ksi + ksi3=ksi2*ksi + f=f0+(f1-f0)*ksi*(a1+ksi*(a2+a3*ksi)) + fprim=(f1-f0)/delta*(a1+ksi*(2*a2+3*ksi*a3)) + return + end + + +c-------------------------------------------------------------------- + + + subroutine spline2(x,x0,delta,f0x,f1x,fprim0x,fx) + implicit none + double precision x,x0,delta,f0x,f1x,fprim0x,fx + double precision ksi,ksi2,ksi3,a1,a2,a3 + ksi=(x-x0)/delta + ksi2=ksi*ksi + ksi3=ksi2*ksi + a1=fprim0x*delta + a2=3*(f1x-f0x)-2*fprim0x*delta + a3=fprim0x*delta-2*(f1x-f0x) + fx=f0x+a1*ksi+a2*ksi2+a3*ksi3 + return + end + + +C-------------------------------------------------------------------- +#ifdef CRYST_TOR +C-------------------------------------------------------------------- + + + subroutine etor(etors,edihcnstr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors=0.0D0 + do i=iphi_start,iphi_end + etors_ii=0.0D0 + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + phii=phi(i) + gloci=0.0D0 +C Proline-Proline pair is a special case... + if (itori.eq.3 .and. itori1.eq.3) then + if (phii.gt.-dwapi3) then + cosphi=dcos(3*phii) + fac=1.0D0/(1.0D0-cosphi) + etorsi=v1(1,3,3)*fac + etorsi=etorsi+etorsi + etors=etors+etorsi-v1(1,3,3) + if (energy_dec) etors_ii=etors_ii+etorsi-v1(1,3,3) + gloci=gloci-3*fac*etorsi*dsin(3*phii) + endif + do j=1,3 + v1ij=v1(j+1,itori,itori1) + v2ij=v2(j+1,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + if (energy_dec) etors_ii=etors_ii+ + & v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + else + do j=1,nterm_old + v1ij=v1(j,itori,itori1) + v2ij=v2(j,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + if (energy_dec) etors_ii=etors_ii+ + & v1ij*cosphi+v2ij*sinphi+dabs(v1ij)+dabs(v2ij) + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + endif + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'etor',i,etors_ii + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1(j,itori,itori1),j=1,6),(v2(j,itori,itori1),j=1,6) + gloc(i-3,icg)=gloc(i-3,icg)+wtor*gloci +c write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg) + enddo +! 6/20/98 - dihedral angle constraints + edihcnstr=0.0d0 + do i=1,ndih_constr + itori=idih_constr(i) + phii=phi(itori) + difi=phii-phi0(i) + if (difi.gt.drange(i)) then + difi=difi-drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else if (difi.lt.-drange(i)) then + difi=difi+drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + endif +! write (iout,'(2i5,2f8.3,2e14.5)') i,itori,rad2deg*phii, +! & rad2deg*difi,0.25d0*ftors*difi**4,gloc(itori-3,icg) + enddo +! write (iout,*) 'edihcnstr',edihcnstr + return + end + + +c-------------------------------------------------------------------- + + + subroutine etor_d(etors_d) + etors_d=0.0d0 + return + end + + +c-------------------------------------------------------------------- + + +#else + subroutine etor(etors,edihcnstr) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + include 'COMMON.CONTROL' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors=0.0D0 + do i=iphi_start,iphi_end + etors_ii=0.0D0 + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + phii=phi(i) + gloci=0.0D0 +C Regular cosine and sine terms + do j=1,nterm(itori,itori1) + v1ij=v1(j,itori,itori1) + v2ij=v2(j,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + etors=etors+v1ij*cosphi+v2ij*sinphi + if (energy_dec) etors_ii=etors_ii+ + & v1ij*cosphi+v2ij*sinphi + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo +C Lorentz terms +C v1 +C E = SUM ----------------------------------- - v1 +C [v2 cos(phi/2)+v3 sin(phi/2)]^2 + 1 +C + cosphi=dcos(0.5d0*phii) + sinphi=dsin(0.5d0*phii) + do j=1,nlor(itori,itori1) + vl1ij=vlor1(j,itori,itori1) + vl2ij=vlor2(j,itori,itori1) + vl3ij=vlor3(j,itori,itori1) + pom=vl2ij*cosphi+vl3ij*sinphi + pom1=1.0d0/(pom*pom+1.0d0) + etors=etors+vl1ij*pom1 + if (energy_dec) etors_ii=etors_ii+ + & vl1ij*pom1 + pom=-pom*pom1*pom1 + gloci=gloci+vl1ij*(vl3ij*cosphi-vl2ij*sinphi)*pom + enddo +C Subtract the constant term + etors=etors-v0(itori,itori1) + if (energy_dec) write (iout,'(a6,i5,0pf7.3)') + & 'etor',i,etors_ii-v0(itori,itori1) + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1(j,itori,itori1),j=1,6),(v2(j,itori,itori1),j=1,6) + gloc(i-3,icg)=gloc(i-3,icg)+wtor*gloci +c write (iout,*) 'i=',i,' gloc=',gloc(i-3,icg) + enddo +! 6/20/98 - dihedral angle constraints + edihcnstr=0.0d0 +c do i=1,ndih_constr + do i=idihconstr_start,idihconstr_end + itori=idih_constr(i) + phii=phi(itori) + difi=pinorm(phii-phi0(i)) + if (difi.gt.drange(i)) then + difi=difi-drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else if (difi.lt.-drange(i)) then + difi=difi+drange(i) + edihcnstr=edihcnstr+0.25d0*ftors*difi**4 + gloc(itori-3,icg)=gloc(itori-3,icg)+ftors*difi**3 + else + difi=0.0 + endif +cd write (iout,'(2i5,4f8.3,2e14.5)') i,itori,rad2deg*phii, +cd & rad2deg*phi0(i), rad2deg*drange(i), +cd & rad2deg*difi,0.25d0*ftors*difi**4,gloc(itori-3,icg) + enddo +cd write (iout,*) 'edihcnstr',edihcnstr + return + end + + +c-------------------------------------------------------------------- + + + subroutine etor_d(etors_d) +C 6/23/01 Compute double torsional energy + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.TORCNSTR' + logical lprn +C Set lprn=.true. for debugging + lprn=.false. +c lprn=.true. + etors_d=0.0D0 + do i=iphid_start,iphid_end + itori=itortyp(itype(i-2)) + itori1=itortyp(itype(i-1)) + itori2=itortyp(itype(i)) + phii=phi(i) + phii1=phi(i+1) + gloci1=0.0D0 + gloci2=0.0D0 +C Regular cosine and sine terms + do j=1,ntermd_1(itori,itori1,itori2) + v1cij=v1c(1,j,itori,itori1,itori2) + v1sij=v1s(1,j,itori,itori1,itori2) + v2cij=v1c(2,j,itori,itori1,itori2) + v2sij=v1s(2,j,itori,itori1,itori2) + cosphi1=dcos(j*phii) + sinphi1=dsin(j*phii) + cosphi2=dcos(j*phii1) + sinphi2=dsin(j*phii1) + etors_d=etors_d+v1cij*cosphi1+v1sij*sinphi1+ + & v2cij*cosphi2+v2sij*sinphi2 + gloci1=gloci1+j*(v1sij*cosphi1-v1cij*sinphi1) + gloci2=gloci2+j*(v2sij*cosphi2-v2cij*sinphi2) + enddo + do k=2,ntermd_2(itori,itori1,itori2) + do l=1,k-1 + v1cdij = v2c(k,l,itori,itori1,itori2) + v2cdij = v2c(l,k,itori,itori1,itori2) + v1sdij = v2s(k,l,itori,itori1,itori2) + v2sdij = v2s(l,k,itori,itori1,itori2) + cosphi1p2=dcos(l*phii+(k-l)*phii1) + cosphi1m2=dcos(l*phii-(k-l)*phii1) + sinphi1p2=dsin(l*phii+(k-l)*phii1) + sinphi1m2=dsin(l*phii-(k-l)*phii1) + etors_d=etors_d+v1cdij*cosphi1p2+v2cdij*cosphi1m2+ + & v1sdij*sinphi1p2+v2sdij*sinphi1m2 + gloci1=gloci1+l*(v1sdij*cosphi1p2+v2sdij*cosphi1m2 + & -v1cdij*sinphi1p2-v2cdij*sinphi1m2) + gloci2=gloci2+(k-l)*(v1sdij*cosphi1p2-v2sdij*cosphi1m2 + & -v1cdij*sinphi1p2+v2cdij*sinphi1m2) + enddo + enddo + gloc(i-3,icg)=gloc(i-3,icg)+wtor_d*gloci1 + gloc(i-2,icg)=gloc(i-2,icg)+wtor_d*gloci2 + enddo + return + end +#endif + + +c-------------------------------------------------------------------- + + + subroutine eback_sc_corr(esccor) +c 7/21/2007 Correlations between the backbone-local and side-chain-local +c conformational states; temporarily implemented as differences +c between UNRES torsional potentials (dependent on three types of +c residues) and the torsional potentials dependent on all 20 types +c of residues computed from AM1 energy surfaces of terminally-blocked +c amino-acid residues. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.SCCOR' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.CONTROL' + logical lprn +C Set lprn=.true. for debugging + write (*,*) "eback_sc_corr 01" + lprn=.false. +c lprn=.true. +c write (iout,*) "EBACK_SC_COR",iphi_start,iphi_end,nterm_sccor + esccor=0.0D0 + do i=iphi_start,iphi_end + write (*,*) "eback_sc_corr 02" + esccor_ii=0.0D0 + itori=itype(i-2) + itori1=itype(i-1) + phii=phi(i) + gloci=0.0D0 + do j=1,nterm_sccor + write (*,*) "eback_sc_corr 03" + v1ij=v1sccor(j,itori,itori1) + v2ij=v2sccor(j,itori,itori1) + cosphi=dcos(j*phii) + sinphi=dsin(j*phii) + esccor=esccor+v1ij*cosphi+v2ij*sinphi + gloci=gloci+j*(v2ij*cosphi-v1ij*sinphi) + enddo + if (lprn) + & write (iout,'(2(a3,2x,i3,2x),2i3,6f8.3/26x,6f8.3/)') + & restyp(itype(i-2)),i-2,restyp(itype(i-1)),i-1,itori,itori1, + & (v1sccor(j,itori,itori1),j=1,6),(v2sccor(j,itori,itori1),j=1,6) + gsccor_loc(i-3)=gsccor_loc(i-3)+gloci + enddo + write (*,*) "eback_sc_corr 04" + return + end + + +c-------------------------------------------------------------------- + + + subroutine multibody(ecorr) +C This subroutine calculates multi-body contributions to energy following +C the idea of Skolnick et al. If side chains I and J make a contact and +C at the same time side chains I+1 and J+1 make a contact, an extra +C contribution equal to sqrt(eps(i,j)*eps(i+1,j+1)) is added. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + +C Set lprn=.true. for debugging + lprn=.false. + + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(i2,20(1x,i2,f10.5))') + & i,(jcont(j,i),facont(j,i),j=1,num_cont(i)) + enddo + endif + ecorr=0.0D0 + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo + do i=nnt,nct-2 + + DO ISHIFT = 3,4 + + i1=i+ishift + num_conti=num_cont(i) + num_conti1=num_cont(i1) + do jj=1,num_conti + j=jcont(jj,i) + do kk=1,num_conti1 + j1=jcont(kk,i1) + if (j1.eq.j+ishift .or. j1.eq.j-ishift) then +cd write(iout,*)'i=',i,' j=',j,' i1=',i1,' j1=',j1, +cd & ' ishift=',ishift +C Contacts I--J and I+ISHIFT--J+-ISHIFT1 occur simultaneously. +C The system gains extra energy. + ecorr=ecorr+esccorr(i,j,i1,j1,jj,kk) + endif ! j1==j+-ishift + enddo ! kk + enddo ! jj + + ENDDO ! ISHIFT + + enddo ! i + return + end + + +c-------------------------------------------------------------------- + + + double precision function esccorr(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + lprn=.false. + eij=facont(jj,i) + ekl=facont(kk,k) +cd write (iout,'(4i5,3f10.5)') i,j,k,l,eij,ekl,-eij*ekl +C Calculate the multi-body contribution to energy. +C Calculate multi-body contributions to the gradient. +cd write (iout,'(2(2i3,3f10.5))')i,j,(gacont(m,jj,i),m=1,3), +cd & k,l,(gacont(m,kk,k),m=1,3) + do m=1,3 + gx(m) =ekl*gacont(m,jj,i) + gx1(m)=eij*gacont(m,kk,k) + gradxorr(m,i)=gradxorr(m,i)-gx(m) + gradxorr(m,j)=gradxorr(m,j)+gx(m) + gradxorr(m,k)=gradxorr(m,k)-gx1(m) + gradxorr(m,l)=gradxorr(m,l)+gx1(m) + enddo + do m=i,j-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+gx(ll) + enddo + enddo + do m=k,l-1 + do ll=1,3 + gradcorr(ll,m)=gradcorr(ll,m)+gx1(ll) + enddo + enddo + esccorr=-eij*ekl + return + end + + +c-------------------------------------------------------------------- + + + subroutine multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) +C This subroutine calculates multi-body contributions to hydrogen-bonding + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPI + include "mpif.h" + parameter (max_cont=maxconts) + parameter (max_dim=26) + integer source,CorrelType,CorrelID,CorrelType1,CorrelID1,Error + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer status(MPI_STATUS_SIZE),req(maxconts*2), + & status_array(MPI_STATUS_SIZE,maxconts*2) +#endif + include 'COMMON.SETUP' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.LOCAL' + double precision gx(3),gx1(3),time00 + logical lprn,ldone + +C Set lprn=.true. for debugging + lprn=.false. +#ifdef MPI + n_corr=0 + n_corr1=0 + if (nfgtasks.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values before RECEIVE:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + call flush(iout) + do i=1,ntask_cont_from + ncont_recv(i)=0 + enddo + do i=1,ntask_cont_to + ncont_sent(i)=0 + enddo +c write (iout,*) "ntask_cont_from",ntask_cont_from," ntask_cont_to", +c & ntask_cont_to +C Make the list of contacts to send to send to other procesors +c write (iout,*) "limits",max0(iturn4_end-1,iatel_s),iturn3_end +c call flush(iout) + do i=iturn3_start,iturn3_end +c write (iout,*) "make contact list turn3",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact(i,i+2,iturn3_sent_local(1,i)) + enddo + do i=iturn4_start,iturn4_end +c write (iout,*) "make contact list turn4",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact(i,i+3,iturn4_sent_local(1,i)) + enddo + do ii=1,nat_sent + i=iat_sent(ii) +c write (iout,*) "make contact list longrange",i,ii," num_cont", +c & num_cont_hb(i) + do j=1,num_cont_hb(i) + do k=1,4 + jjc=jcont_hb(j,i) + iproc=iint_sent_local(k,jjc,ii) +c write (iout,*) "i",i," j",j," k",k," jjc",jjc," iproc",iproc + if (iproc.gt.0) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=i + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=facont_hb(j,i) + zapas(4,nn,iproc)=ees0p(j,i) + zapas(5,nn,iproc)=ees0m(j,i) + zapas(6,nn,iproc)=gacont_hbr(1,j,i) + zapas(7,nn,iproc)=gacont_hbr(2,j,i) + zapas(8,nn,iproc)=gacont_hbr(3,j,i) + zapas(9,nn,iproc)=gacontm_hb1(1,j,i) + zapas(10,nn,iproc)=gacontm_hb1(2,j,i) + zapas(11,nn,iproc)=gacontm_hb1(3,j,i) + zapas(12,nn,iproc)=gacontp_hb1(1,j,i) + zapas(13,nn,iproc)=gacontp_hb1(2,j,i) + zapas(14,nn,iproc)=gacontp_hb1(3,j,i) + zapas(15,nn,iproc)=gacontm_hb2(1,j,i) + zapas(16,nn,iproc)=gacontm_hb2(2,j,i) + zapas(17,nn,iproc)=gacontm_hb2(3,j,i) + zapas(18,nn,iproc)=gacontp_hb2(1,j,i) + zapas(19,nn,iproc)=gacontp_hb2(2,j,i) + zapas(20,nn,iproc)=gacontp_hb2(3,j,i) + zapas(21,nn,iproc)=gacontm_hb3(1,j,i) + zapas(22,nn,iproc)=gacontm_hb3(2,j,i) + zapas(23,nn,iproc)=gacontm_hb3(3,j,i) + zapas(24,nn,iproc)=gacontp_hb3(1,j,i) + zapas(25,nn,iproc)=gacontp_hb3(2,j,i) + zapas(26,nn,iproc)=gacontp_hb3(3,j,i) + endif + enddo + enddo + enddo + if (lprn) then + write (iout,*) + & "Numbers of contacts to be sent to other processors", + & (ncont_sent(i),i=1,ntask_cont_to) + write (iout,*) "Contacts sent" + do ii=1,ntask_cont_to + nn=ncont_sent(ii) + iproc=itask_cont_to(ii) + write (iout,*) nn," contacts to processor",iproc, + & " of CONT_TO_COMM group" + do i=1,nn + write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) + enddo + enddo + call flush(iout) + endif + CorrelType=477 + CorrelID=fg_rank+1 + CorrelType1=478 + CorrelID1=nfgtasks+fg_rank+1 + ireq=0 +C Receive the numbers of needed contacts from other processors + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + ireq=ireq+1 + call MPI_Irecv(ncont_recv(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "IRECV ended" +c call flush(iout) +C Send the number of contacts needed by other processors + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + ireq=ireq+1 + call MPI_Isend(ncont_sent(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "ISEND ended" +c write (iout,*) "number of requests (nn)",ireq + call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) +c write (iout,*) +c & "Numbers of contacts to be received from other processors", +c & (ncont_recv(i),i=1,ntask_cont_from) +c call flush(iout) +C Receive contacts + ireq=0 + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + nn=ncont_recv(ii) +c write (iout,*) "Receiving",nn," contacts from processor",iproc, +c & " of CONT_TO_COMM group" + call flush(iout) + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Irecv(zapas_recv(1,1,ii),nn*max_dim, + & MPI_DOUBLE_PRECISION,iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) + endif + enddo +C Send the contacts to processors that need them + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + nn=ncont_sent(ii) +c write (iout,*) nn," contacts to processor",iproc, +c & " of CONT_TO_COMM group" + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Isend(zapas(1,1,ii),nn*max_dim,MPI_DOUBLE_PRECISION, + & iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) +c do i=1,nn +c write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) +c enddo + endif + enddo +c write (iout,*) "number of requests (contacts)",ireq +c write (iout,*) "req",(req(i),i=1,4) +c call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) + do iii=1,ntask_cont_from + iproc=itask_cont_from(iii) + nn=ncont_recv(iii) + if (lprn) then + write (iout,*) "Received",nn," contacts from processor",iproc, + & " of CONT_FROM_COMM group" + call flush(iout) + do i=1,nn + write(iout,'(2f5.0,4f10.5)')(zapas_recv(j,i,iii),j=1,5) + enddo + call flush(iout) + endif + do i=1,nn + ii=zapas_recv(1,i,iii) +c Flag the received contacts to prevent double-counting + jj=-zapas_recv(2,i,iii) +c write (iout,*) "iii",iii," i",i," ii",ii," jj",jj +c call flush(iout) + nnn=num_cont_hb(ii)+1 + num_cont_hb(ii)=nnn + jcont_hb(nnn,ii)=jj + facont_hb(nnn,ii)=zapas_recv(3,i,iii) + ees0p(nnn,ii)=zapas_recv(4,i,iii) + ees0m(nnn,ii)=zapas_recv(5,i,iii) + gacont_hbr(1,nnn,ii)=zapas_recv(6,i,iii) + gacont_hbr(2,nnn,ii)=zapas_recv(7,i,iii) + gacont_hbr(3,nnn,ii)=zapas_recv(8,i,iii) + gacontm_hb1(1,nnn,ii)=zapas_recv(9,i,iii) + gacontm_hb1(2,nnn,ii)=zapas_recv(10,i,iii) + gacontm_hb1(3,nnn,ii)=zapas_recv(11,i,iii) + gacontp_hb1(1,nnn,ii)=zapas_recv(12,i,iii) + gacontp_hb1(2,nnn,ii)=zapas_recv(13,i,iii) + gacontp_hb1(3,nnn,ii)=zapas_recv(14,i,iii) + gacontm_hb2(1,nnn,ii)=zapas_recv(15,i,iii) + gacontm_hb2(2,nnn,ii)=zapas_recv(16,i,iii) + gacontm_hb2(3,nnn,ii)=zapas_recv(17,i,iii) + gacontp_hb2(1,nnn,ii)=zapas_recv(18,i,iii) + gacontp_hb2(2,nnn,ii)=zapas_recv(19,i,iii) + gacontp_hb2(3,nnn,ii)=zapas_recv(20,i,iii) + gacontm_hb3(1,nnn,ii)=zapas_recv(21,i,iii) + gacontm_hb3(2,nnn,ii)=zapas_recv(22,i,iii) + gacontm_hb3(3,nnn,ii)=zapas_recv(23,i,iii) + gacontp_hb3(1,nnn,ii)=zapas_recv(24,i,iii) + gacontp_hb3(2,nnn,ii)=zapas_recv(25,i,iii) + gacontp_hb3(3,nnn,ii)=zapas_recv(26,i,iii) + enddo + enddo + call flush(iout) + if (lprn) then + write (iout,'(a)') 'Contact function values after receive:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + call flush(iout) + endif + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + ecorr=0.0D0 +C Remove the loop below after debugging !!! + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo +C Calculate the local-electrostatic correlation terms + do i=min0(iatel_s,iturn4_start),max0(iatel_e,iturn3_end) + i1=i+1 + num_conti=num_cont_hb(i) + num_conti1=num_cont_hb(i+1) + do jj=1,num_conti + j=jcont_hb(jj,i) + jp=iabs(j) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) + jp1=iabs(j1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if ((j.gt.0 .and. j1.gt.0 .or. j.gt.0 .and. j1.lt.0 + & .or. j.lt.0 .and. j1.gt.0) .and. + & (jp1.eq.jp+1 .or. jp1.eq.jp-1)) then +C Contacts I-J and (I+1)-(J+1) or (I+1)-(J-1) occur simultaneously. +C The system gains extra energy. + ecorr=ecorr+ehbcorr(i,jp,i+1,jp1,jj,kk,0.72D0,0.32D0) + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'ecorrh',i,j,ehbcorr(i,j,i+1,j1,jj,kk,0.72D0,0.32D0) + n_corr=n_corr+1 + else if (j1.eq.j) then +C Contacts I-J and I-(J+1) occur simultaneously. +C The system loses extra energy. +c ecorr=ecorr+ehbcorr(i,j,i+1,j,jj,kk,0.60D0,-0.40D0) + endif + enddo ! kk + do kk=1,num_conti + j1=jcont_hb(kk,i) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk + if (j1.eq.j+1) then +C Contacts I-J and (I+1)-J occur simultaneously. +C The system loses extra energy. +c ecorr=ecorr+ehbcorr(i,j,i,j+1,jj,kk,0.60D0,-0.40D0) + endif ! j1==j+1 + enddo ! kk + enddo ! jj + enddo ! i + return + end + + +c-------------------------------------------------------------------- + + + subroutine add_hb_contact(ii,jj,itask) + implicit real*8 (a-h,o-z) + include "DIMENSIONS" + include "COMMON.IOUNITS" + integer max_cont + integer max_dim + parameter (max_cont=maxconts) + parameter (max_dim=26) + include "COMMON.CONTACTS" + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer i,j,ii,jj,iproc,itask(4),nn +c write (iout,*) "itask",itask + do i=1,2 + iproc=itask(i) + if (iproc.gt.0) then + do j=1,num_cont_hb(ii) + jjc=jcont_hb(j,ii) +c write (iout,*) "i",ii," j",jj," jjc",jjc + if (jjc.eq.jj) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=ii + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=facont_hb(j,ii) + zapas(4,nn,iproc)=ees0p(j,ii) + zapas(5,nn,iproc)=ees0m(j,ii) + zapas(6,nn,iproc)=gacont_hbr(1,j,ii) + zapas(7,nn,iproc)=gacont_hbr(2,j,ii) + zapas(8,nn,iproc)=gacont_hbr(3,j,ii) + zapas(9,nn,iproc)=gacontm_hb1(1,j,ii) + zapas(10,nn,iproc)=gacontm_hb1(2,j,ii) + zapas(11,nn,iproc)=gacontm_hb1(3,j,ii) + zapas(12,nn,iproc)=gacontp_hb1(1,j,ii) + zapas(13,nn,iproc)=gacontp_hb1(2,j,ii) + zapas(14,nn,iproc)=gacontp_hb1(3,j,ii) + zapas(15,nn,iproc)=gacontm_hb2(1,j,ii) + zapas(16,nn,iproc)=gacontm_hb2(2,j,ii) + zapas(17,nn,iproc)=gacontm_hb2(3,j,ii) + zapas(18,nn,iproc)=gacontp_hb2(1,j,ii) + zapas(19,nn,iproc)=gacontp_hb2(2,j,ii) + zapas(20,nn,iproc)=gacontp_hb2(3,j,ii) + zapas(21,nn,iproc)=gacontm_hb3(1,j,ii) + zapas(22,nn,iproc)=gacontm_hb3(2,j,ii) + zapas(23,nn,iproc)=gacontm_hb3(3,j,ii) + zapas(24,nn,iproc)=gacontp_hb3(1,j,ii) + zapas(25,nn,iproc)=gacontp_hb3(2,j,ii) + zapas(26,nn,iproc)=gacontp_hb3(3,j,ii) + exit + endif + enddo + endif + enddo + return + end + + +c-------------------------------------------------------------------- + + + subroutine multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr, + & n_corr1) +C This subroutine calculates multi-body contributions to hydrogen-bonding + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPI + include "mpif.h" + parameter (max_cont=maxconts) + parameter (max_dim=70) + integer source,CorrelType,CorrelID,CorrelType1,CorrelID1,Error + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer status(MPI_STATUS_SIZE),req(maxconts*2), + & status_array(MPI_STATUS_SIZE,maxconts*2) +#endif + include 'COMMON.SETUP' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.CONTROL' + double precision gx(3),gx1(3) + integer num_cont_hb_old(maxres) + logical lprn,ldone + double precision eello4,eello5,eelo6,eello_turn6 + external eello4,eello5,eello6,eello_turn6 +C Set lprn=.true. for debugging + lprn=.false. + eturn6=0.0d0 +#ifdef MPI + do i=1,nres + num_cont_hb_old(i)=num_cont_hb(i) + enddo + n_corr=0 + n_corr1=0 + if (nfgtasks.le.1) goto 30 + if (lprn) then + write (iout,'(a)') 'Contact function values before RECEIVE:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,f5.2))') + & i,num_cont_hb(i),(jcont_hb(j,i),facont_hb(j,i), + & j=1,num_cont_hb(i)) + enddo + endif + call flush(iout) + do i=1,ntask_cont_from + ncont_recv(i)=0 + enddo + do i=1,ntask_cont_to + ncont_sent(i)=0 + enddo +c write (iout,*) "ntask_cont_from",ntask_cont_from," ntask_cont_to", +c & ntask_cont_to +C Make the list of contacts to send to send to other procesors + do i=iturn3_start,iturn3_end +c write (iout,*) "make contact list turn3",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact_eello(i,i+2,iturn3_sent_local(1,i)) + enddo + do i=iturn4_start,iturn4_end +c write (iout,*) "make contact list turn4",i," num_cont", +c & num_cont_hb(i) + call add_hb_contact_eello(i,i+3,iturn4_sent_local(1,i)) + enddo + do ii=1,nat_sent + i=iat_sent(ii) +c write (iout,*) "make contact list longrange",i,ii," num_cont", +c & num_cont_hb(i) + do j=1,num_cont_hb(i) + do k=1,4 + jjc=jcont_hb(j,i) + iproc=iint_sent_local(k,jjc,ii) +c write (iout,*) "i",i," j",j," k",k," jjc",jjc," iproc",iproc + if (iproc.ne.0) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=i + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=d_cont(j,i) + ind=3 + do kk=1,3 + ind=ind+1 + zapas(ind,nn,iproc)=grij_hb_cont(kk,j,i) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj(ll,kk,j,i) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj_der(mm,ll,kk,jj,j,i) + enddo + enddo + enddo + enddo + endif + enddo + enddo + enddo + if (lprn) then + write (iout,*) + & "Numbers of contacts to be sent to other processors", + & (ncont_sent(i),i=1,ntask_cont_to) + write (iout,*) "Contacts sent" + do ii=1,ntask_cont_to + nn=ncont_sent(ii) + iproc=itask_cont_to(ii) + write (iout,*) nn," contacts to processor",iproc, + & " of CONT_TO_COMM group" + do i=1,nn + write(iout,'(2f5.0,10f10.5)')(zapas(j,i,ii),j=1,10) + enddo + enddo + call flush(iout) + endif + CorrelType=477 + CorrelID=fg_rank+1 + CorrelType1=478 + CorrelID1=nfgtasks+fg_rank+1 + ireq=0 +C Receive the numbers of needed contacts from other processors + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + ireq=ireq+1 + call MPI_Irecv(ncont_recv(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "IRECV ended" +c call flush(iout) +C Send the number of contacts needed by other processors + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + ireq=ireq+1 + call MPI_Isend(ncont_sent(ii),1,MPI_INTEGER,iproc,CorrelType, + & FG_COMM,req(ireq),IERR) + enddo +c write (iout,*) "ISEND ended" +c write (iout,*) "number of requests (nn)",ireq + call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) +c write (iout,*) +c & "Numbers of contacts to be received from other processors", +c & (ncont_recv(i),i=1,ntask_cont_from) +c call flush(iout) +C Receive contacts + ireq=0 + do ii=1,ntask_cont_from + iproc=itask_cont_from(ii) + nn=ncont_recv(ii) +c write (iout,*) "Receiving",nn," contacts from processor",iproc, +c & " of CONT_TO_COMM group" + call flush(iout) + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Irecv(zapas_recv(1,1,ii),nn*max_dim, + & MPI_DOUBLE_PRECISION,iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) + endif + enddo +C Send the contacts to processors that need them + do ii=1,ntask_cont_to + iproc=itask_cont_to(ii) + nn=ncont_sent(ii) +c write (iout,*) nn," contacts to processor",iproc, +c & " of CONT_TO_COMM group" + if (nn.gt.0) then + ireq=ireq+1 + call MPI_Isend(zapas(1,1,ii),nn*max_dim,MPI_DOUBLE_PRECISION, + & iproc,CorrelType1,FG_COMM,req(ireq),IERR) +c write (iout,*) "ireq,req",ireq,req(ireq) +c do i=1,nn +c write(iout,'(2f5.0,4f10.5)')(zapas(j,i,ii),j=1,5) +c enddo + endif + enddo +c write (iout,*) "number of requests (contacts)",ireq +c write (iout,*) "req",(req(i),i=1,4) +c call flush(iout) + if (ireq.gt.0) + & call MPI_Waitall(ireq,req,status_array,ierr) + do iii=1,ntask_cont_from + iproc=itask_cont_from(iii) + nn=ncont_recv(iii) + if (lprn) then + write (iout,*) "Received",nn," contacts from processor",iproc, + & " of CONT_FROM_COMM group" + call flush(iout) + do i=1,nn + write(iout,'(2f5.0,10f10.5)')(zapas_recv(j,i,iii),j=1,10) + enddo + call flush(iout) + endif + do i=1,nn + ii=zapas_recv(1,i,iii) +c Flag the received contacts to prevent double-counting + jj=-zapas_recv(2,i,iii) +c write (iout,*) "iii",iii," i",i," ii",ii," jj",jj +c call flush(iout) + nnn=num_cont_hb(ii)+1 + num_cont_hb(ii)=nnn + jcont_hb(nnn,ii)=jj + d_cont(nnn,ii)=zapas_recv(3,i,iii) + ind=3 + do kk=1,3 + ind=ind+1 + grij_hb_cont(kk,nnn,ii)=zapas_recv(ind,i,iii) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + a_chuj(ll,kk,nnn,ii)=zapas_recv(ind,i,iii) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + a_chuj_der(mm,ll,kk,jj,nnn,ii)=zapas_recv(ind,i,iii) + enddo + enddo + enddo + enddo + enddo + enddo + call flush(iout) + if (lprn) then + write (iout,'(a)') 'Contact function values after receive:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i3,5f6.3))') + & i,num_cont_hb(i),(jcont_hb(j,i),d_cont(j,i), + & ((a_chuj(ll,kk,j,i),ll=1,2),kk=1,2),j=1,num_cont_hb(i)) + enddo + call flush(iout) + endif + 30 continue +#endif + if (lprn) then + write (iout,'(a)') 'Contact function values:' + do i=nnt,nct-2 + write (iout,'(2i3,50(1x,i2,5f6.3))') + & i,num_cont_hb(i),(jcont_hb(j,i),d_cont(j,i), + & ((a_chuj(ll,kk,j,i),ll=1,2),kk=1,2),j=1,num_cont_hb(i)) + enddo + endif + ecorr=0.0D0 + ecorr5=0.0d0 + ecorr6=0.0d0 +C Remove the loop below after debugging !!! + do i=nnt,nct + do j=1,3 + gradcorr(j,i)=0.0D0 + gradxorr(j,i)=0.0D0 + enddo + enddo +C Calculate the dipole-dipole interaction energies + if (wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0) then + do i=iatel_s,iatel_e+1 + num_conti=num_cont_hb(i) + do jj=1,num_conti + j=jcont_hb(jj,i) +#ifdef MOMENT + call dipole(i,j,jj) +#endif + enddo + enddo + endif +C Calculate the local-electrostatic correlation terms +c write (iout,*) "gradcorr5 in eello5 before loop" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + do i=min0(iatel_s,iturn4_start),max0(iatel_e+1,iturn3_end+1) +c write (iout,*) "corr loop i",i + i1=i+1 + num_conti=num_cont_hb(i) + num_conti1=num_cont_hb(i+1) + do jj=1,num_conti + j=jcont_hb(jj,i) + jp=iabs(j) + do kk=1,num_conti1 + j1=jcont_hb(kk,i1) + jp1=iabs(j1) +c write (iout,*) 'i=',i,' j=',j,' i1=',i1,' j1=',j1, +c & ' jj=',jj,' kk=',kk +c if (j1.eq.j+1 .or. j1.eq.j-1) then + if ((j.gt.0 .and. j1.gt.0 .or. j.gt.0 .and. j1.lt.0 + & .or. j.lt.0 .and. j1.gt.0) .and. + & (jp1.eq.jp+1 .or. jp1.eq.jp-1)) then +C Contacts I-J and (I+1)-(J+1) or (I+1)-(J-1) occur simultaneously. +C The system gains extra energy. + n_corr=n_corr+1 + sqd1=dsqrt(d_cont(jj,i)) + sqd2=dsqrt(d_cont(kk,i1)) + sred_geom = sqd1*sqd2 + IF (sred_geom.lt.cutoff_corr) THEN + call gcont(sred_geom,r0_corr,1.0D0,delt_corr, + & ekont,fprimcont) +cd write (iout,*) 'i=',i,' j=',jp,' i1=',i1,' j1=',jp1, +cd & ' jj=',jj,' kk=',kk + fac_prim1=0.5d0*sqd2/sqd1*fprimcont + fac_prim2=0.5d0*sqd1/sqd2*fprimcont + do l=1,3 + g_contij(l,1)=fac_prim1*grij_hb_cont(l,jj,i) + g_contij(l,2)=fac_prim2*grij_hb_cont(l,kk,i1) + enddo + n_corr1=n_corr1+1 +cd write (iout,*) 'sred_geom=',sred_geom, +cd & ' ekont=',ekont,' fprim=',fprimcont, +cd & ' fac_prim1',fac_prim1,' fac_prim2',fac_prim2 +cd write (iout,*) "g_contij",g_contij +cd write (iout,*) "grij_hb_cont i",grij_hb_cont(:,jj,i) +cd write (iout,*) "grij_hb_cont i1",grij_hb_cont(:,jj,i1) + call calc_eello(i,jp,i+1,jp1,jj,kk) + if (wcorr4.gt.0.0d0) + & ecorr=ecorr+eello4(i,jp,i+1,jp1,jj,kk) + if (energy_dec.and.wcorr4.gt.0.0d0) + 1 write (iout,'(a6,4i5,0pf7.3)') + 2 'ecorr4',i,j,i+1,j1,eello4(i,jp,i+1,jp1,jj,kk) +c write (iout,*) "gradcorr5 before eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + if (wcorr5.gt.0.0d0) + & ecorr5=ecorr5+eello5(i,jp,i+1,jp1,jj,kk) +c write (iout,*) "gradcorr5 after eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + if (energy_dec.and.wcorr5.gt.0.0d0) + 1 write (iout,'(a6,4i5,0pf7.3)') + 2 'ecorr5',i,j,i+1,j1,eello5(i,jp,i+1,jp1,jj,kk) +cd write(2,*)'wcorr6',wcorr6,' wturn6',wturn6 +cd write(2,*)'ijkl',i,jp,i+1,jp1 + if (wcorr6.gt.0.0d0 .and. (jp.ne.i+4 .or. jp1.ne.i+3 + & .or. wturn6.eq.0.0d0))then +cd write (iout,*) '******ecorr6: i,j,i+1,j1',i,j,i+1,j1 + ecorr6=ecorr6+eello6(i,jp,i+1,jp1,jj,kk) + if (energy_dec) write (iout,'(a6,4i5,0pf7.3)') + 1 'ecorr6',i,j,i+1,j1,eello6(i,jp,i+1,jp1,jj,kk) +cd write (iout,*) 'ecorr',ecorr,' ecorr5=',ecorr5, +cd & 'ecorr6=',ecorr6 +cd write (iout,'(4e15.5)') sred_geom, +cd & dabs(eello4(i,jp,i+1,jp1,jj,kk)), +cd & dabs(eello5(i,jp,i+1,jp1,jj,kk)), +cd & dabs(eello6(i,jp,i+1,jp1,jj,kk)) + else if (wturn6.gt.0.0d0 + & .and. (jp.eq.i+4 .and. jp1.eq.i+3)) then +cd write (iout,*) '******eturn6: i,j,i+1,j1',i,jip,i+1,jp1 + eturn6=eturn6+eello_turn6(i,jj,kk) + if (energy_dec) write (iout,'(a6,4i5,0pf7.3)') + 1 'eturn6',i,j,i+1,j1,eello_turn6(i,jj,kk) +cd write (2,*) 'multibody_eello:eturn6',eturn6 + endif + ENDIF +1111 continue + endif + enddo ! kk + enddo ! jj + enddo ! i + do i=1,nres + num_cont_hb(i)=num_cont_hb_old(i) + enddo +c write (iout,*) "gradcorr5 in eello5" +c do iii=1,nres +c write (iout,'(i5,3f10.5)') +c & iii,(gradcorr5(jjj,iii),jjj=1,3) +c enddo + return + end + + +c-------------------------------------------------------------------- + + + subroutine add_hb_contact_eello(ii,jj,itask) + implicit real*8 (a-h,o-z) + include "DIMENSIONS" + include "COMMON.IOUNITS" + integer max_cont + integer max_dim + parameter (max_cont=maxconts) + parameter (max_dim=70) + include "COMMON.CONTACTS" + double precision zapas(max_dim,maxconts,max_fg_procs), + & zapas_recv(max_dim,maxconts,max_fg_procs) + common /przechowalnia/ zapas + integer i,j,ii,jj,iproc,itask(4),nn +c write (iout,*) "itask",itask + do i=1,2 + iproc=itask(i) + if (iproc.gt.0) then + do j=1,num_cont_hb(ii) + jjc=jcont_hb(j,ii) +c write (iout,*) "send turns i",ii," j",jj," jjc",jjc + if (jjc.eq.jj) then + ncont_sent(iproc)=ncont_sent(iproc)+1 + nn=ncont_sent(iproc) + zapas(1,nn,iproc)=ii + zapas(2,nn,iproc)=jjc + zapas(3,nn,iproc)=d_cont(j,ii) + ind=3 + do kk=1,3 + ind=ind+1 + zapas(ind,nn,iproc)=grij_hb_cont(kk,j,ii) + enddo + do kk=1,2 + do ll=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj(ll,kk,j,ii) + enddo + enddo + do jj=1,5 + do kk=1,3 + do ll=1,2 + do mm=1,2 + ind=ind+1 + zapas(ind,nn,iproc)=a_chuj_der(mm,ll,kk,jj,j,ii) + enddo + enddo + enddo + enddo + exit + endif + enddo + endif + enddo + return + end + + +c-------------------------------------------------------------------- + + + double precision function ehbcorr(i,j,k,l,jj,kk,coeffp,coeffm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + double precision gx(3),gx1(3) + logical lprn + lprn=.false. + eij=facont_hb(jj,i) + ekl=facont_hb(kk,k) + ees0pij=ees0p(jj,i) + ees0pkl=ees0p(kk,k) + ees0mij=ees0m(jj,i) + ees0mkl=ees0m(kk,k) + ekont=eij*ekl + ees=-(coeffp*ees0pij*ees0pkl+coeffm*ees0mij*ees0mkl) +cd ees=-(coeffp*ees0pkl+coeffm*ees0mkl) +C Following 4 lines for diagnostics. +cd ees0pkl=0.0D0 +cd ees0pij=1.0D0 +cd ees0mkl=0.0D0 +cd ees0mij=1.0D0 +c write (iout,'(2(a,2i3,a,f10.5,a,2f10.5),a,f10.5,a,$)') +c & 'Contacts ',i,j, +c & ' eij',eij,' eesij',ees0pij,ees0mij,' and ',k,l +c & ,' fcont ',ekl,' eeskl',ees0pkl,ees0mkl,' energy=',ekont*ees, +c & 'gradcorr_long' +C Calculate the multi-body contribution to energy. +c ecorr=ecorr+ekont*ees +C Calculate multi-body contributions to the gradient. + coeffpees0pij=coeffp*ees0pij + coeffmees0mij=coeffm*ees0mij + coeffpees0pkl=coeffp*ees0pkl + coeffmees0mkl=coeffm*ees0mkl + do ll=1,3 +cgrad ghalfi=ees*ekl*gacont_hbr(ll,jj,i) + gradcorr(ll,i)=gradcorr(ll,i)!+0.5d0*ghalfi + & -ekont*(coeffpees0pkl*gacontp_hb1(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb1(ll,jj,i)) + gradcorr(ll,j)=gradcorr(ll,j)!+0.5d0*ghalfi + & -ekont*(coeffpees0pkl*gacontp_hb2(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb2(ll,jj,i)) +cgrad ghalfk=ees*eij*gacont_hbr(ll,kk,k) + gradcorr(ll,k)=gradcorr(ll,k)!+0.5d0*ghalfk + & -ekont*(coeffpees0pij*gacontp_hb1(ll,kk,k)+ + & coeffmees0mij*gacontm_hb1(ll,kk,k)) + gradcorr(ll,l)=gradcorr(ll,l)!+0.5d0*ghalfk + & -ekont*(coeffpees0pij*gacontp_hb2(ll,kk,k)+ + & coeffmees0mij*gacontm_hb2(ll,kk,k)) + gradlongij=ees*ekl*gacont_hbr(ll,jj,i)- + & ekont*(coeffpees0pkl*gacontp_hb3(ll,jj,i)+ + & coeffmees0mkl*gacontm_hb3(ll,jj,i)) + gradcorr_long(ll,j)=gradcorr_long(ll,j)+gradlongij + gradcorr_long(ll,i)=gradcorr_long(ll,i)-gradlongij + gradlongkl=ees*eij*gacont_hbr(ll,kk,k)- + & ekont*(coeffpees0pij*gacontp_hb3(ll,kk,k)+ + & coeffmees0mij*gacontm_hb3(ll,kk,k)) + gradcorr_long(ll,l)=gradcorr_long(ll,l)+gradlongkl + gradcorr_long(ll,k)=gradcorr_long(ll,k)-gradlongkl +c write (iout,'(2f10.5,2x,$)') gradlongij,gradlongkl + enddo +c write (iout,*) +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ +cgrad & ees*ekl*gacont_hbr(ll,jj,i)- +cgrad & ekont*(coeffp*ees0pkl*gacontp_hb3(ll,jj,i)+ +cgrad & coeffm*ees0mkl*gacontm_hb3(ll,jj,i)) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ +cgrad & ees*eij*gacont_hbr(ll,kk,k)- +cgrad & ekont*(coeffp*ees0pij*gacontp_hb3(ll,kk,k)+ +cgrad & coeffm*ees0mij*gacontm_hb3(ll,kk,k)) +cgrad enddo +cgrad enddo +c write (iout,*) "ehbcorr",ekont*ees + ehbcorr=ekont*ees + return + end +#ifdef MOMENT + + +C-------------------------------------------------------------------- + + + subroutine dipole(i,j,jj) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + dimension dipi(2,2),dipj(2,2),dipderi(2),dipderj(2),auxvec(2), + & auxmat(2,2) + iti1 = itortyp(itype(i+1)) + if (j.lt.nres-1) then + itj1 = itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + do iii=1,2 + dipi(iii,1)=Ub2(iii,i) + dipderi(iii)=Ub2der(iii,i) + dipi(iii,2)=b1(iii,iti1) + dipj(iii,1)=Ub2(iii,j) + dipderj(iii)=Ub2der(iii,j) + dipj(iii,2)=b1(iii,itj1) + enddo + kkk=0 + do iii=1,2 + call matvec2(a_chuj(1,1,jj,i),dipj(1,iii),auxvec(1)) + do jjj=1,2 + kkk=kkk+1 + dip(kkk,jj,i)=scalar2(dipi(1,jjj),auxvec(1)) + enddo + enddo + do kkk=1,5 + do lll=1,3 + mmm=0 + do iii=1,2 + call matvec2(a_chuj_der(1,1,lll,kkk,jj,i),dipj(1,iii), + & auxvec(1)) + do jjj=1,2 + mmm=mmm+1 + dipderx(lll,kkk,mmm,jj,i)=scalar2(dipi(1,jjj),auxvec(1)) + enddo + enddo + enddo + enddo + call transpose2(a_chuj(1,1,jj,i),auxmat(1,1)) + call matvec2(auxmat(1,1),dipderi(1),auxvec(1)) + do iii=1,2 + dipderg(iii,jj,i)=scalar2(auxvec(1),dipj(1,iii)) + enddo + call matvec2(a_chuj(1,1,jj,i),dipderj(1),auxvec(1)) + do iii=1,2 + dipderg(iii+2,jj,i)=scalar2(auxvec(1),dipi(1,iii)) + enddo + return + end +#endif + + +C-------------------------------------------------------------------- + + + subroutine calc_eello(i,j,k,l,jj,kk) +C +C This subroutine computes matrices and vectors needed to calculate +C the fourth-, fifth-, and sixth-order local-electrostatic terms. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision aa1(2,2),aa2(2,2),aa1t(2,2),aa2t(2,2), + & aa1tder(2,2,3,5),aa2tder(2,2,3,5),auxmat(2,2) + logical lprn + common /kutas/ lprn +cd write (iout,*) 'calc_eello: i=',i,' j=',j,' k=',k,' l=',l, +cd & ' jj=',jj,' kk=',kk +cd if (i.ne.2 .or. j.ne.4 .or. k.ne.3 .or. l.ne.5) return +cd write (iout,*) "a_chujij",((a_chuj(iii,jjj,jj,i),iii=1,2),jjj=1,2) +cd write (iout,*) "a_chujkl",((a_chuj(iii,jjj,kk,k),iii=1,2),jjj=1,2) + do iii=1,2 + do jjj=1,2 + aa1(iii,jjj)=a_chuj(iii,jjj,jj,i) + aa2(iii,jjj)=a_chuj(iii,jjj,kk,k) + enddo + enddo + call transpose2(aa1(1,1),aa1t(1,1)) + call transpose2(aa2(1,1),aa2t(1,1)) + do kkk=1,5 + do lll=1,3 + call transpose2(a_chuj_der(1,1,lll,kkk,jj,i), + & aa1tder(1,1,lll,kkk)) + call transpose2(a_chuj_der(1,1,lll,kkk,kk,k), + & aa2tder(1,1,lll,kkk)) + enddo + enddo + if (l.eq.j+1) then +C parallel orientation of the two CA-CA-CA frames. + if (i.gt.1) then + iti=itortyp(itype(i)) + else + iti=ntortyp+1 + endif + itk1=itortyp(itype(k+1)) + itj=itortyp(itype(j)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +C A1 kernel(j+1) A2T +cd do iii=1,2 +cd write (iout,'(3f10.5,5x,3f10.5)') +cd & (EUg(iii,jjj,k),jjj=1,2),(EUg(iii,jjj,l),jjj=1,2) +cd enddo + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.false.,EUg(1,1,l),EUgder(1,1,l), + & AEA(1,1,1),AEAderg(1,1,1),AEAderx(1,1,1,1,1,1)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0) THEN + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.false.,EUgC(1,1,l),EUgCder(1,1,l), + & AECA(1,1,1),AECAderg(1,1,1),AECAderx(1,1,1,1,1,1)) + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.false.,Ug2DtEUg(1,1,l), + & Ug2DtEUgder(1,1,1,l),ADtEA(1,1,1),ADtEAderg(1,1,1,1), + & ADtEAderx(1,1,1,1,1,1)) + lprn=.false. + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.false.,DtUg2EUg(1,1,l), + & DtUg2EUgder(1,1,1,l),ADtEA1(1,1,1),ADtEA1derg(1,1,1,1), + & ADtEA1derx(1,1,1,1,1,1)) + ENDIF +C End 6-th order cumulants +cd lprn=.false. +cd if (lprn) then +cd write (2,*) 'In calc_eello6' +cd do iii=1,2 +cd write (2,*) 'iii=',iii +cd do kkk=1,5 +cd write (2,*) 'kkk=',kkk +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & ((ADtEA1derx(jjj,mmm,lll,kkk,iii,1),mmm=1,2),lll=1,3) +cd enddo +cd enddo +cd enddo +cd endif + call transpose2(EUgder(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,1,1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEA(1,1,1)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),EAEAderg(1,1,2,1)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & EAEAderx(1,1,lll,kkk,iii,1)) + enddo + enddo + enddo +C A1T kernel(i+1) A2 + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),1,.false.,EUg(1,1,k),EUgder(1,1,k), + & AEA(1,1,2),AEAderg(1,1,2),AEAderx(1,1,1,1,1,2)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0) THEN + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),1,.false.,EUgC(1,1,k),EUgCder(1,1,k), + & AECA(1,1,2),AECAderg(1,1,2),AECAderx(1,1,1,1,1,2)) + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),2,.false.,Ug2DtEUg(1,1,k), + & Ug2DtEUgder(1,1,1,k),ADtEA(1,1,2),ADtEAderg(1,1,1,2), + & ADtEAderx(1,1,1,1,1,2)) + call kernel(aa1t(1,1),aa2(1,1),aa1tder(1,1,1,1), + & a_chuj_der(1,1,1,1,kk,k),2,.false.,DtUg2EUg(1,1,k), + & DtUg2EUgder(1,1,1,k),ADtEA1(1,1,2),ADtEA1derg(1,1,1,2), + & ADtEA1derx(1,1,1,1,1,2)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,l),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEAderg(1,1,1,2)) + call transpose2(EUg(1,1,l),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEA(1,1,2)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),EAEAderg(1,1,2,2)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & EAEAderx(1,1,lll,kkk,iii,2)) + enddo + enddo + enddo +C AEAb1 and AEAb2 +C Calculate the vectors and their derivatives in virtual-bond dihedral angles. +C They are needed only when the fifth- or the sixth-order cumulants are +C indluded. + IF (wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0) THEN + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2(1,1,1)) + call matvec2(auxmat(1,1),Ub2der(1,i),AEAb2derg(1,2,1,1)) + call transpose2(AEAderg(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1derg(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2derg(1,1,1,1)) + call matvec2(AEA(1,1,1),b1(1,itk1),AEAb1(1,2,1)) + call matvec2(AEAderg(1,1,1),b1(1,itk1),AEAb1derg(1,2,1)) + call matvec2(AEA(1,1,1),Ub2(1,k+1),AEAb2(1,2,1)) + call matvec2(AEAderg(1,1,1),Ub2(1,k+1),AEAb2derg(1,1,2,1)) + call matvec2(AEA(1,1,1),Ub2der(1,k+1),AEAb2derg(1,2,2,1)) + call transpose2(AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j),AEAb2(1,1,2)) + call matvec2(auxmat(1,1),Ub2der(1,j),AEAb2derg(1,2,1,2)) + call transpose2(AEAderg(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj),AEAb1derg(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j),AEAb2derg(1,1,1,2)) + call matvec2(AEA(1,1,2),b1(1,itl1),AEAb1(1,2,2)) + call matvec2(AEAderg(1,1,2),b1(1,itl1),AEAb1derg(1,2,2)) + call matvec2(AEA(1,1,2),Ub2(1,l+1),AEAb2(1,2,2)) + call matvec2(AEAderg(1,1,2),Ub2(1,l+1),AEAb2derg(1,1,2,2)) + call matvec2(AEA(1,1,2),Ub2der(1,l+1),AEAb2derg(1,2,2,2)) +C Calculate the Cartesian derivatives of the vectors. + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti), + & AEAb1derx(1,lll,kkk,iii,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i), + & AEAb2derx(1,lll,kkk,iii,1,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & AEAb1derx(1,lll,kkk,iii,2,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),Ub2(1,k+1), + & AEAb2derx(1,lll,kkk,iii,2,1)) + call transpose2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj), + & AEAb1derx(1,lll,kkk,iii,1,2)) + call matvec2(auxmat(1,1),Ub2(1,j), + & AEAb2derx(1,lll,kkk,iii,1,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,itl1), + & AEAb1derx(1,lll,kkk,iii,2,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),Ub2(1,l+1), + & AEAb2derx(1,lll,kkk,iii,2,2)) + enddo + enddo + enddo + ENDIF +C End vectors + else +C Antiparallel orientation of the two CA-CA-CA frames. + if (i.gt.1) then + iti=itortyp(itype(i)) + else + iti=ntortyp+1 + endif + itk1=itortyp(itype(k+1)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif +C A2 kernel(j-1)T A1T + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.true.,EUg(1,1,j),EUgder(1,1,j), + & AEA(1,1,1),AEAderg(1,1,1),AEAderx(1,1,1,1,1,1)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0 .or. (wturn6.gt.0.0d0 .and. + & j.eq.i+4 .and. l.eq.i+3)) THEN + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),1,.true.,EUgC(1,1,j),EUgCder(1,1,j), + & AECA(1,1,1),AECAderg(1,1,1),AECAderx(1,1,1,1,1,1)) + call kernel(aa2(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.true.,Ug2DtEUg(1,1,j), + & Ug2DtEUgder(1,1,1,j),ADtEA(1,1,1),ADtEAderg(1,1,1,1), + & ADtEAderx(1,1,1,1,1,1)) + call kernel(aa1(1,1),aa2t(1,1),a_chuj_der(1,1,1,1,jj,i), + & aa2tder(1,1,1,1),2,.true.,DtUg2EUg(1,1,j), + & DtUg2EUgder(1,1,1,j),ADtEA1(1,1,1),ADtEA1derg(1,1,1,1), + & ADtEA1derx(1,1,1,1,1,1)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,1,1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEA(1,1,1)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),EAEAderg(1,1,2,1)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & EAEAderx(1,1,lll,kkk,iii,1)) + enddo + enddo + enddo +C A2T kernel(i+1)T A1 + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),1,.true.,EUg(1,1,k),EUgder(1,1,k), + & AEA(1,1,2),AEAderg(1,1,2),AEAderx(1,1,1,1,1,2)) +C Following matrices are needed only for 6-th order cumulants + IF (wcorr6.gt.0.0d0 .or. (wturn6.gt.0.0d0 .and. + & j.eq.i+4 .and. l.eq.i+3)) THEN + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),1,.true.,EUgC(1,1,k),EUgCder(1,1,k), + & AECA(1,1,2),AECAderg(1,1,2),AECAderx(1,1,1,1,1,2)) + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),2,.true.,Ug2DtEUg(1,1,k), + & Ug2DtEUgder(1,1,1,k),ADtEA(1,1,2),ADtEAderg(1,1,1,2), + & ADtEAderx(1,1,1,1,1,2)) + call kernel(aa2t(1,1),aa1(1,1),aa2tder(1,1,1,1), + & a_chuj_der(1,1,1,1,jj,i),2,.true.,DtUg2EUg(1,1,k), + & DtUg2EUgder(1,1,1,k),ADtEA1(1,1,2),ADtEA1derg(1,1,1,2), + & ADtEA1derx(1,1,1,1,1,2)) + ENDIF +C End 6-th order cumulants + call transpose2(EUgder(1,1,j),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),EAEAderg(1,1,2,2)) + call transpose2(EUg(1,1,j),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),EAEA(1,1,2)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),EAEAderg(1,1,2,2)) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & EAEAderx(1,1,lll,kkk,iii,2)) + enddo + enddo + enddo +C AEAb1 and AEAb2 +C Calculate the vectors and their derivatives in virtual-bond dihedral angles. +C They are needed only when the fifth- or the sixth-order cumulants are +C indluded. + IF (wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 .or. + & (wturn6.gt.0.0d0 .and. j.eq.i+4 .and. l.eq.i+3)) THEN + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2(1,1,1)) + call matvec2(auxmat(1,1),Ub2der(1,i),AEAb2derg(1,2,1,1)) + call transpose2(AEAderg(1,1,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti),AEAb1derg(1,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i),AEAb2derg(1,1,1,1)) + call matvec2(AEA(1,1,1),b1(1,itk1),AEAb1(1,2,1)) + call matvec2(AEAderg(1,1,1),b1(1,itk1),AEAb1derg(1,2,1)) + call matvec2(AEA(1,1,1),Ub2(1,k+1),AEAb2(1,2,1)) + call matvec2(AEAderg(1,1,1),Ub2(1,k+1),AEAb2derg(1,1,2,1)) + call matvec2(AEA(1,1,1),Ub2der(1,k+1),AEAb2derg(1,2,2,1)) + call transpose2(AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itj1),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l),AEAb2(1,1,2)) + call matvec2(auxmat(1,1),Ub2der(1,l),AEAb2derg(1,2,1,2)) + call transpose2(AEAderg(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itl),AEAb1(1,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l),AEAb2derg(1,1,1,2)) + call matvec2(AEA(1,1,2),b1(1,itj1),AEAb1(1,2,2)) + call matvec2(AEAderg(1,1,2),b1(1,itj1),AEAb1derg(1,2,2)) + call matvec2(AEA(1,1,2),Ub2(1,j),AEAb2(1,2,2)) + call matvec2(AEAderg(1,1,2),Ub2(1,j),AEAb2derg(1,1,2,2)) + call matvec2(AEA(1,1,2),Ub2der(1,j),AEAb2derg(1,2,2,2)) +C Calculate the Cartesian derivatives of the vectors. + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,iti), + & AEAb1derx(1,lll,kkk,iii,1,1)) + call matvec2(auxmat(1,1),Ub2(1,i), + & AEAb2derx(1,lll,kkk,iii,1,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & AEAb1derx(1,lll,kkk,iii,2,1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),Ub2(1,k+1), + & AEAb2derx(1,lll,kkk,iii,2,1)) + call transpose2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1)) + call matvec2(auxmat(1,1),b1(1,itl), + & AEAb1derx(1,lll,kkk,iii,1,2)) + call matvec2(auxmat(1,1),Ub2(1,l), + & AEAb2derx(1,lll,kkk,iii,1,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),b1(1,itj1), + & AEAb1derx(1,lll,kkk,iii,2,2)) + call matvec2(AEAderx(1,1,lll,kkk,iii,2),Ub2(1,j), + & AEAb2derx(1,lll,kkk,iii,2,2)) + enddo + enddo + enddo + ENDIF +C End vectors + endif + return + end + + +C-------------------------------------------------------------------- + + + subroutine kernel(aa1,aa2t,aa1derx,aa2tderx,nderg,transp, + & KK,KKderg,AKA,AKAderg,AKAderx) + implicit none + integer nderg + logical transp + double precision aa1(2,2),aa2t(2,2),aa1derx(2,2,3,5), + & aa2tderx(2,2,3,5),KK(2,2),KKderg(2,2,nderg),AKA(2,2), + & AKAderg(2,2,nderg),AKAderx(2,2,3,5,2) + integer iii,kkk,lll + integer jjj,mmm + logical lprn + common /kutas/ lprn + call prodmat3(aa1(1,1),aa2t(1,1),KK(1,1),transp,AKA(1,1)) + do iii=1,nderg + call prodmat3(aa1(1,1),aa2t(1,1),KKderg(1,1,iii),transp, + & AKAderg(1,1,iii)) + enddo +cd if (lprn) write (2,*) 'In kernel' + do kkk=1,5 +cd if (lprn) write (2,*) 'kkk=',kkk + do lll=1,3 + call prodmat3(aa1derx(1,1,lll,kkk),aa2t(1,1), + & KK(1,1),transp,AKAderx(1,1,lll,kkk,1)) +cd if (lprn) then +cd write (2,*) 'lll=',lll +cd write (2,*) 'iii=1' +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & (AKAderx(jjj,mmm,lll,kkk,1),mmm=1,2) +cd enddo +cd endif + call prodmat3(aa1(1,1),aa2tderx(1,1,lll,kkk), + & KK(1,1),transp,AKAderx(1,1,lll,kkk,2)) +cd if (lprn) then +cd write (2,*) 'lll=',lll +cd write (2,*) 'iii=2' +cd do jjj=1,2 +cd write (2,'(3(2f10.5),5x)') +cd & (AKAderx(jjj,mmm,lll,kkk,2),mmm=1,2) +cd enddo +cd endif + enddo + enddo + return + end + + +C-------------------------------------------------------------------- + + + double precision function eello4(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision pizda(2,2),ggg1(3),ggg2(3) +cd if (i.ne.1 .or. j.ne.5 .or. k.ne.2 .or.l.ne.4) then +cd eello4=0.0d0 +cd return +cd endif +cd print *,'eello4:',i,j,k,l,jj,kk +cd write (2,*) 'i',i,' j',j,' k',k,' l',l +cd call checkint4(i,j,k,l,jj,kk,eel4_num) +cold eij=facont_hb(jj,i) +cold ekl=facont_hb(kk,k) +cold ekont=eij*ekl + eel4=-EAEA(1,1,1)-EAEA(2,2,1) +cd eel41=-EAEA(1,1,2)-EAEA(2,2,2) + gcorr_loc(k-1)=gcorr_loc(k-1) + & -ekont*(EAEAderg(1,1,1,1)+EAEAderg(2,2,1,1)) + if (l.eq.j+1) then + gcorr_loc(l-1)=gcorr_loc(l-1) + & -ekont*(EAEAderg(1,1,2,1)+EAEAderg(2,2,2,1)) + else + gcorr_loc(j-1)=gcorr_loc(j-1) + & -ekont*(EAEAderg(1,1,2,1)+EAEAderg(2,2,2,1)) + endif + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=-EAEAderx(1,1,lll,kkk,iii,1) + & -EAEAderx(2,2,lll,kkk,iii,1) +cd derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd gcorr_loc(l-1)=0.0d0 +cd gcorr_loc(j-1)=0.0d0 +cd gcorr_loc(k-1)=0.0d0 +cd eel4=1.0d0 +cd write (iout,*)'Contacts have occurred for peptide groups', +cd & i,j,' fcont:',eij,' eij',' and ',k,l, +cd & ' fcont ',ekl,' eel4=',eel4,' eel4_num',16*eel4_num + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel4*g_contij(ll,1) +cgrad ggg2(ll)=eel4*g_contij(ll,2) + glongij=eel4*g_contij(ll,1)+ekont*derx(ll,1,1) + glongkl=eel4*g_contij(ll,2)+ekont*derx(ll,1,2) +cgrad ghalf=0.5d0*ggg1(ll) + gradcorr(ll,i)=gradcorr(ll,i)+ekont*derx(ll,2,1) + gradcorr(ll,i+1)=gradcorr(ll,i+1)+ekont*derx(ll,3,1) + gradcorr(ll,j)=gradcorr(ll,j)+ekont*derx(ll,4,1) + gradcorr(ll,j1)=gradcorr(ll,j1)+ekont*derx(ll,5,1) + gradcorr_long(ll,j)=gradcorr_long(ll,j)+glongij + gradcorr_long(ll,i)=gradcorr_long(ll,i)-glongij +cgrad ghalf=0.5d0*ggg2(ll) + gradcorr(ll,k)=gradcorr(ll,k)+ekont*derx(ll,2,2) + gradcorr(ll,k+1)=gradcorr(ll,k+1)+ekont*derx(ll,3,2) + gradcorr(ll,l)=gradcorr(ll,l)+ekont*derx(ll,4,2) + gradcorr(ll,l1)=gradcorr(ll,l1)+ekont*derx(ll,5,2) + gradcorr_long(ll,l)=gradcorr_long(ll,l)+glongkl + gradcorr_long(ll,k)=gradcorr_long(ll,k)-glongkl + enddo +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr(ll,m)=gradcorr(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,gcorr_loc(iii) +cd enddo + eello4=ekont*eel4 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello4',ekont*eel4 + return + end + + +C-------------------------------------------------------------------- + + + double precision function eello5(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision pizda(2,2),auxmat(2,2),auxmat1(2,2),vv(2) + double precision ggg1(3),ggg2(3) +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C Parallel chains C +C C +C o o o o C +C /l\ / \ \ / \ / \ / C +C / \ / \ \ / \ / \ / C +C j| o |l1 | o | o| o | | o |o C +C \ |/k\| |/ \| / |/ \| |/ \| C +C \i/ \ / \ / / \ / \ C +C o k1 o C +C (I) (II) (III) (IV) C +C C +C eello5_1 eello5_2 eello5_3 eello5_4 C +C C +C Antiparallel chains C +C C +C o o o o C +C /j\ / \ \ / \ / \ / C +C / \ / \ \ / \ / \ / C +C j1| o |l | o | o| o | | o |o C +C \ |/k\| |/ \| / |/ \| |/ \| C +C \i/ \ / \ / / \ / \ C +C o k1 o C +C (I) (II) (III) (IV) C +C C +C eello5_1 eello5_2 eello5_3 eello5_4 C +C C +C o denotes a local interaction, vertical lines an electrostatic interaction. C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd if (i.ne.2 .or. j.ne.6 .or. k.ne.3 .or. l.ne.5) then +cd eello5=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO5: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l + itk=itortyp(itype(k)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) + eello5_1=0.0d0 + eello5_2=0.0d0 + eello5_3=0.0d0 + eello5_4=0.0d0 +cd call checkint5(i,j,k,l,jj,kk,eel5_1_num,eel5_2_num, +cd & eel5_3_num,eel5_4_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=facont_hb(jj,i) +cd ekl=facont_hb(kk,k) +cd ekont=eij*ekl +cd write (iout,*)'Contacts have occurred for peptide groups', +cd & i,j,' fcont:',eij,' eij',' and ',k,l +cd goto 1111 +C Contribution from the graph I. +cd write (2,*) 'AEA ',AEA(1,1,1),AEA(2,1,1),AEA(1,2,1),AEA(2,2,1) +cd write (2,*) 'AEAb2',AEAb2(1,1,1),AEAb2(2,1,1) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_1=scalar2(AEAb2(1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i)) +C Explicit gradient in virtual-dihedral angles. + if (i.gt.1) g_corr5_loc(i-1)=g_corr5_loc(i-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,i))) + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(AEA(1,1,1),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2(1,1,1),Ub2der(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + call matmat2(AEAderg(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + if (l.eq.j+1) then + if (l.lt.nres-1) g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + else + if (j.lt.nres-1) g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i))) + endif +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,1),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,1),Ub2(1,k)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,i)) + enddo + enddo + enddo +c goto 1112 +c1111 continue +C Contribution from graph II + call transpose2(EE(1,1,itk),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_2=scalar2(AEAb1(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,k)) + call matmat2(auxmat(1,1),AEAderg(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + if (l.eq.j+1) then + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k))) + else + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb1derg(1,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k))) + endif +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,1), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,1),b1(1,itk)) + & -0.5d0*scalar2(vv(1),Ctobr(1,k)) + enddo + enddo + enddo +cd goto 1112 +cd1111 continue + if (l.eq.j+1) then +cd goto 1110 +C Parallel orientation +C Contribution from graph III + call transpose2(EUg(1,1,l),auxmat(1,1)) + call matmat2(AEA(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_3=scalar2(AEAb2(1,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,j))) + call matmat2(AEAderg(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j))) + call transpose2(EUgder(1,1,l),auxmat1(1,1)) + call matmat2(AEA(1,1,2),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2(1,1,2),Ub2der(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,2),Ub2(1,l)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,j)) + enddo + enddo + enddo +cd goto 1112 +C Contribution from graph IV +cd1110 continue + call transpose2(EE(1,1,itl),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_4=scalar2(AEAb1(1,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,l)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,iii)=derx(lll,kkk,iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,itl)) + & -0.5d0*scalar2(vv(1),Ctobr(1,l)) + enddo + enddo + enddo + else +C Antiparallel orientation +C Contribution from graph III +c goto 1110 + call transpose2(EUg(1,1,j),auxmat(1,1)) + call matmat2(AEA(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + eello5_3=scalar2(AEAb2(1,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(l-1)=g_corr5_loc(l-1) + & +ekont*(scalar2(AEAb2derg(1,2,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2der(1,l))) + call matmat2(AEAderg(1,1,2),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb2derg(1,1,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l))) + call transpose2(EUgder(1,1,j),auxmat1(1,1)) + call matmat2(AEA(1,1,2),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & +ekont*(scalar2(AEAb2(1,1,2),Ub2der(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(AEAderx(1,1,lll,kkk,iii,2),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii) + & +scalar2(AEAb2derx(1,lll,kkk,iii,1,2),Ub2(1,j)) + & +0.5d0*scalar2(vv(1),Dtobr2(1,l)) + enddo + enddo + enddo +cd goto 1112 +C Contribution from graph IV +1110 continue + call transpose2(EE(1,1,itj),auxmat(1,1)) + call matmat2(auxmat(1,1),AEA(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + eello5_4=scalar2(AEAb1(1,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j)) +C Explicit gradient in virtual-dihedral angles. + g_corr5_loc(j-1)=g_corr5_loc(j-1) + & -0.5d0*ekont*scalar2(vv(1),Ctobrder(1,j)) + call matmat2(auxmat(1,1),AEAderg(1,1,2),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + g_corr5_loc(k-1)=g_corr5_loc(k-1) + & +ekont*(scalar2(AEAb1derg(1,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j))) +C Cartesian gradient + do iii=1,2 + do kkk=1,5 + do lll=1,3 + call matmat2(auxmat(1,1),AEAderx(1,1,lll,kkk,iii,2), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii) + & +scalar2(AEAb1derx(1,lll,kkk,iii,2,2),b1(1,itj)) + & -0.5d0*scalar2(vv(1),Ctobr(1,j)) + enddo + enddo + enddo + endif +1112 continue + eel5=eello5_1+eello5_2+eello5_3+eello5_4 +cd if (i.eq.2 .and. j.eq.8 .and. k.eq.3 .and. l.eq.7) then +cd write (2,*) 'ijkl',i,j,k,l +cd write (2,*) 'eello5_1',eello5_1,' eello5_2',eello5_2, +cd & ' eello5_3',eello5_3,' eello5_4',eello5_4 +cd endif +cd write(iout,*) 'eello5_1',eello5_1,' eel5_1_num',16*eel5_1_num +cd write(iout,*) 'eello5_2',eello5_2,' eel5_2_num',16*eel5_2_num +cd write(iout,*) 'eello5_3',eello5_3,' eel5_3_num',16*eel5_3_num +cd write(iout,*) 'eello5_4',eello5_4,' eel5_4_num',16*eel5_4_num + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 +cd write (2,*) 'eij',eij,' ekl',ekl,' ekont',ekont +C 2/11/08 AL Gradients over DC's connecting interacting sites will be +C summed up outside the subrouine as for the other subroutines +C handling long-range interactions. The old code is commented out +C with "cgrad" to keep track of changes. + do ll=1,3 +cgrad ggg1(ll)=eel5*g_contij(ll,1) +cgrad ggg2(ll)=eel5*g_contij(ll,2) + gradcorr5ij=eel5*g_contij(ll,1)+ekont*derx(ll,1,1) + gradcorr5kl=eel5*g_contij(ll,2)+ekont*derx(ll,1,2) +c write (iout,'(a,3i3,a,5f8.3,2i3,a,5f8.3,a,f8.3)') +c & "ecorr5",ll,i,j," derx",derx(ll,2,1),derx(ll,3,1),derx(ll,4,1), +c & derx(ll,5,1),k,l," derx",derx(ll,2,2),derx(ll,3,2), +c & derx(ll,4,2),derx(ll,5,2)," ekont",ekont +c write (iout,'(a,3i3,a,3f8.3,2i3,a,3f8.3)') +c & "ecorr5",ll,i,j," gradcorr5",g_contij(ll,1),derx(ll,1,1), +c & gradcorr5ij, +c & k,l," gradcorr5",g_contij(ll,2),derx(ll,1,2),gradcorr5kl +cold ghalf=0.5d0*eel5*ekl*gacont_hbr(ll,jj,i) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr5(ll,i)=gradcorr5(ll,i)+ekont*derx(ll,2,1) + gradcorr5(ll,i+1)=gradcorr5(ll,i+1)+ekont*derx(ll,3,1) + gradcorr5(ll,j)=gradcorr5(ll,j)+ekont*derx(ll,4,1) + gradcorr5(ll,j1)=gradcorr5(ll,j1)+ekont*derx(ll,5,1) + gradcorr5_long(ll,j)=gradcorr5_long(ll,j)+gradcorr5ij + gradcorr5_long(ll,i)=gradcorr5_long(ll,i)-gradcorr5ij +cold ghalf=0.5d0*eel5*eij*gacont_hbr(ll,kk,k) +cgrad ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gradcorr5(ll,k)=gradcorr5(ll,k)+ghalf+ekont*derx(ll,2,2) + gradcorr5(ll,k+1)=gradcorr5(ll,k+1)+ekont*derx(ll,3,2) + gradcorr5(ll,l)=gradcorr5(ll,l)+ghalf+ekont*derx(ll,4,2) + gradcorr5(ll,l1)=gradcorr5(ll,l1)+ekont*derx(ll,5,2) + gradcorr5_long(ll,l)=gradcorr5_long(ll,l)+gradcorr5kl + gradcorr5_long(ll,k)=gradcorr5_long(ll,k)-gradcorr5kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*ekl*gacont_hbr(ll,jj,i) +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cold gradcorr5(ll,m)=gradcorr5(ll,m)+eel5*eij*gacont_hbr(ll,kk,k) +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +c1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr5(ll,m)=gradcorr5(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr5_loc(iii) +cd enddo + eello5=ekont*eel5 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello5',ekont*eel5 + return + end + + +c-------------------------------------------------------------------- + + + double precision function eello6(i,j,k,l,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision ggg1(3),ggg2(3) +cd if (i.ne.1 .or. j.ne.3 .or. k.ne.2 .or. l.ne.4) then +cd eello6=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO6: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l + eello6_1=0.0d0 + eello6_2=0.0d0 + eello6_3=0.0d0 + eello6_4=0.0d0 + eello6_5=0.0d0 + eello6_6=0.0d0 +cd call checkint6(i,j,k,l,jj,kk,eel6_1_num,eel6_2_num, +cd & eel6_3_num,eel6_4_num,eel6_5_num,eel6_6_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=facont_hb(jj,i) +cd ekl=facont_hb(kk,k) +cd ekont=eij*ekl +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 + if (l.eq.j+1) then + eello6_1=eello6_graph1(i,j,k,l,1,.false.) + eello6_2=eello6_graph1(j,i,l,k,2,.false.) + eello6_3=eello6_graph2(i,j,k,l,jj,kk,.false.) + eello6_4=eello6_graph4(i,j,k,l,jj,kk,1,.false.) + eello6_5=eello6_graph4(j,i,l,k,jj,kk,2,.false.) + eello6_6=eello6_graph3(i,j,k,l,jj,kk,.false.) + else + eello6_1=eello6_graph1(i,j,k,l,1,.false.) + eello6_2=eello6_graph1(l,k,j,i,2,.true.) + eello6_3=eello6_graph2(i,l,k,j,jj,kk,.true.) + eello6_4=eello6_graph4(i,j,k,l,jj,kk,1,.false.) + if (wturn6.eq.0.0d0 .or. j.ne.i+4) then + eello6_5=eello6_graph4(l,k,j,i,kk,jj,2,.true.) + else + eello6_5=0.0d0 + endif + eello6_6=eello6_graph3(i,l,k,j,jj,kk,.true.) + endif +C If turn contributions are considered, they will be handled separately. + eel6=eello6_1+eello6_2+eello6_3+eello6_4+eello6_5+eello6_6 +cd write(iout,*) 'eello6_1',eello6_1!,' eel6_1_num',16*eel6_1_num +cd write(iout,*) 'eello6_2',eello6_2!,' eel6_2_num',16*eel6_2_num +cd write(iout,*) 'eello6_3',eello6_3!,' eel6_3_num',16*eel6_3_num +cd write(iout,*) 'eello6_4',eello6_4!,' eel6_4_num',16*eel6_4_num +cd write(iout,*) 'eello6_5',eello6_5!,' eel6_5_num',16*eel6_5_num +cd write(iout,*) 'eello6_6',eello6_6!,' eel6_6_num',16*eel6_6_num +cd goto 1112 + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel6*g_contij(ll,1) +cgrad ggg2(ll)=eel6*g_contij(ll,2) +cold ghalf=0.5d0*eel6*ekl*gacont_hbr(ll,jj,i) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gradcorr6ij=eel6*g_contij(ll,1)+ekont*derx(ll,1,1) + gradcorr6kl=eel6*g_contij(ll,2)+ekont*derx(ll,1,2) + gradcorr6(ll,i)=gradcorr6(ll,i)+ekont*derx(ll,2,1) + gradcorr6(ll,i+1)=gradcorr6(ll,i+1)+ekont*derx(ll,3,1) + gradcorr6(ll,j)=gradcorr6(ll,j)+ekont*derx(ll,4,1) + gradcorr6(ll,j1)=gradcorr6(ll,j1)+ekont*derx(ll,5,1) + gradcorr6_long(ll,j)=gradcorr6_long(ll,j)+gradcorr6ij + gradcorr6_long(ll,i)=gradcorr6_long(ll,i)-gradcorr6ij +cgrad ghalf=0.5d0*ggg2(ll) +cold ghalf=0.5d0*eel6*eij*gacont_hbr(ll,kk,k) +cd ghalf=0.0d0 + gradcorr6(ll,k)=gradcorr6(ll,k)+ekont*derx(ll,2,2) + gradcorr6(ll,k+1)=gradcorr6(ll,k+1)+ekont*derx(ll,3,2) + gradcorr6(ll,l)=gradcorr6(ll,l)+ekont*derx(ll,4,2) + gradcorr6(ll,l1)=gradcorr6(ll,l1)+ekont*derx(ll,5,2) + gradcorr6_long(ll,l)=gradcorr6_long(ll,l)+gradcorr6kl + gradcorr6_long(ll,k)=gradcorr6_long(ll,k)-gradcorr6kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*ekl*gacont_hbr(ll,jj,i) +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cold gradcorr6(ll,m)=gradcorr6(ll,m)+eel6*eij*gacont_hbr(ll,kk,k) +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gradcorr6(ll,m)=gradcorr6(ll,m)+ekont*derx(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + eello6=ekont*eel6 +cd write (2,*) 'ekont',ekont +cd write (iout,*) 'eello6',ekont*eel6 + return + end + + +c-------------------------------------------------------------------- + + + double precision function eello6_graph1(i,j,k,l,imat,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vv(2),vv1(2),pizda(2,2),auxmat(2,2),pizda1(2,2) + logical swap + logical lprn + common /kutas/ lprn +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C Parallel Antiparallel +C +C o o +C /l\ /j\ +C / \ / \ +C /| o | | o |\ +C \ j|/k\| / \ |/k\|l / +C \ / \ / \ / \ / +C o o o o +C i i +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + itk=itortyp(itype(k)) + s1= scalar2(AEAb1(1,2,imat),CUgb2(1,i)) + s2=-scalar2(AEAb2(1,1,imat),Ug2Db1t(1,k)) + s3= scalar2(AEAb2(1,1,imat),CUgb2(1,k)) + call transpose2(EUgC(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + s4=0.5d0*scalar2(vv1(1),Dtobr2(1,i)) + vv(1)=AEAb1(1,2,imat)*b1(1,itk)-AEAb1(2,2,imat)*b1(2,itk) + vv(2)=AEAb1(1,2,imat)*b1(2,itk)+AEAb1(2,2,imat)*b1(1,itk) + s5=scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4', s4,' s5',s5 + eello6_graph1=-0.5d0*(s1+s2+s3+s4+s5) + if (i.gt.1) g_corr6_loc(i-1)=g_corr6_loc(i-1) + & -0.5d0*ekont*(scalar2(AEAb1(1,2,imat),CUgb2der(1,i)) + & -scalar2(AEAb2derg(1,2,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,2,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2der(1,i)) + & +scalar2(vv(1),Dtobr2der(1,i))) + call matmat2(AEAderg(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + vv(1)=AEAb1derg(1,2,imat)*b1(1,itk)-AEAb1derg(2,2,imat)*b1(2,itk) + vv(2)=AEAb1derg(1,2,imat)*b1(2,itk)+AEAb1derg(2,2,imat)*b1(1,itk) + if (l.eq.j+1) then + g_corr6_loc(l-1)=g_corr6_loc(l-1) + & +ekont*(-0.5d0*(scalar2(AEAb1derg(1,2,imat),CUgb2(1,i)) + & -scalar2(AEAb2derg(1,1,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,1,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i))+scalar2(vv(1),Dtobr2(1,i)))) + else + g_corr6_loc(j-1)=g_corr6_loc(j-1) + & +ekont*(-0.5d0*(scalar2(AEAb1derg(1,2,imat),CUgb2(1,i)) + & -scalar2(AEAb2derg(1,1,1,imat),Ug2Db1t(1,k)) + & +scalar2(AEAb2derg(1,1,1,imat),CUgb2(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i))+scalar2(vv(1),Dtobr2(1,i)))) + endif + call transpose2(EUgCder(1,1,k),auxmat(1,1)) + call matmat2(AEA(1,1,imat),auxmat(1,1),pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + if (k.gt.1) g_corr6_loc(k-1)=g_corr6_loc(k-1) + & +ekont*(-0.5d0*(-scalar2(AEAb2(1,1,imat),Ug2Db1tder(1,k)) + & +scalar2(AEAb2(1,1,imat),CUgb2der(1,k)) + & +0.5d0*scalar2(vv1(1),Dtobr2(1,i)))) + do iii=1,2 + if (swap) then + ind=3-iii + else + ind=iii + endif + do kkk=1,5 + do lll=1,3 + s1= scalar2(AEAb1derx(1,lll,kkk,iii,2,imat),CUgb2(1,i)) + s2=-scalar2(AEAb2derx(1,lll,kkk,iii,1,imat),Ug2Db1t(1,k)) + s3= scalar2(AEAb2derx(1,lll,kkk,iii,1,imat),CUgb2(1,k)) + call transpose2(EUgC(1,1,k),auxmat(1,1)) + call matmat2(AEAderx(1,1,lll,kkk,iii,imat),auxmat(1,1), + & pizda1(1,1)) + vv1(1)=pizda1(1,1)-pizda1(2,2) + vv1(2)=pizda1(1,2)+pizda1(2,1) + s4=0.5d0*scalar2(vv1(1),Dtobr2(1,i)) + vv(1)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(1,itk) + & -AEAb1derx(2,lll,kkk,iii,2,imat)*b1(2,itk) + vv(2)=AEAb1derx(1,lll,kkk,iii,2,imat)*b1(2,itk) + & +AEAb1derx(2,lll,kkk,iii,2,imat)*b1(1,itk) + s5=scalar2(vv(1),Dtobr2(1,i)) + derx(lll,kkk,ind)=derx(lll,kkk,ind)-0.5d0*(s1+s2+s3+s4+s5) + enddo + enddo + enddo + return + end + + +c-------------------------------------------------------------------- + + + double precision function eello6_graph2(i,j,k,l,jj,kk,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + logical swap + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2), + & auxvec1(2),auxvec2(1),auxmat1(2,2) + logical lprn + common /kutas/ lprn +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C Parallel Antiparallel +C +C o o +C \ /l\ /j\ / +C \ / \ / \ / +C o| o | | o |o +C \ j|/k\| \ |/k\|l +C \ / \ \ / \ +C o o +C i i +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +cd write (2,*) 'eello6_graph2: i,',i,' j',j,' k',k,' l',l +C AL 7/4/01 s1 would occur in the sixth-order moment, +C but not in a cluster cumulant +#ifdef MOMENT + s1=dip(1,jj,i)*dip(1,kk,k) +#endif + call matvec2(ADtEA1(1,1,1),Ub2(1,k),auxvec(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matvec2(ADtEA(1,1,2),Ub2(1,l),auxvec1(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec1(1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(ADtEA1(1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 'eello6_graph2:','s1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + eello6_graph2=-(s1+s2+s3+s4) +#else + eello6_graph2=-(s2+s3+s4) +#endif +c eello6_graph2=-s3 +C Derivatives in gamma(i-1) + if (i.gt.1) then +#ifdef MOMENT + s1=dipderg(1,jj,i)*dip(1,kk,k) +#endif + s2=-0.5d0*scalar2(Ub2der(1,i),auxvec(1)) + call matvec2(ADtEAderg(1,1,1,2),Ub2(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + s4=-0.25d0*scalar2(vv(1),Dtobr2der(1,i)) +#ifdef MOMENT + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s2+s3+s4) +#endif +c g_corr6_loc(i-1)=g_corr6_loc(i-1)-s3 + endif +C Derivatives in gamma(k-1) +#ifdef MOMENT + s1=dip(1,jj,i)*dipderg(1,kk,k) +#endif + call matvec2(ADtEA1(1,1,1),Ub2der(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + call matvec2(ADtEAderg(1,1,2,2),Ub2(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(ADtEA1(1,1,1),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s2+s3+s4) +#endif +c g_corr6_loc(k-1)=g_corr6_loc(k-1)-s3 +C Derivatives in gamma(j-1) or gamma(l-1) + if (j.gt.1) then +#ifdef MOMENT + s1=dipderg(3,jj,i)*dip(1,kk,k) +#endif + call matvec2(ADtEA1derg(1,1,1,1),Ub2(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2der(1,j),auxvec1(1)) + call matmat2(ADtEA1derg(1,1,1,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + if (swap) then + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*s1 + else + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*s1 + endif +#endif + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*(s2+s3+s4) +c g_corr6_loc(j-1)=g_corr6_loc(j-1)-s3 + endif +C Derivatives in gamma(l-1) or gamma(j-1) + if (l.gt.1) then +#ifdef MOMENT + s1=dip(1,jj,i)*dipderg(3,kk,k) +#endif + call matvec2(ADtEA1derg(1,1,2,1),Ub2(1,k),auxvec2(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec2(1)) + call matvec2(ADtEA(1,1,2),Ub2der(1,l),auxvec2(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec2(1)) + call matmat2(ADtEA1derg(1,1,2,1),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +#ifdef MOMENT + if (swap) then + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*s1 + else + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*s1 + endif +#endif + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s3+s4) +c g_corr6_loc(l-1)=g_corr6_loc(l-1)-s3 + endif +C Cartesian derivatives. + if (lprn) then + write (2,*) 'In eello6_graph2' + do iii=1,2 + write (2,*) 'iii=',iii + do kkk=1,5 + write (2,*) 'kkk=',kkk + do jjj=1,2 + write (2,'(3(2f10.5),5x)') + & ((ADtEA1derx(jjj,mmm,lll,kkk,iii,1),mmm=1,2),lll=1,3) + enddo + enddo + enddo + endif + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + s1=dipderx(lll,kkk,1,jj,i)*dip(1,kk,k) + else + s1=dip(1,jj,i)*dipderx(lll,kkk,1,kk,k) + endif +#endif + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,1),Ub2(1,k), + & auxvec(1)) + s2=-0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matvec2(ADtEAderx(1,1,lll,kkk,iii,2),Ub2(1,l), + & auxvec(1)) + s3=-0.5d0*scalar2(Ub2(1,j),auxvec(1)) + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(ADtEA1derx(1,1,lll,kkk,iii,1),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(1,2)+pizda(2,1) + s4=-0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 's1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (swap) then + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif + enddo + enddo + enddo + return + end + + +c-------------------------------------------------------------------- + + + double precision function eello6_graph3(i,j,k,l,jj,kk,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2) + logical swap +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C Parallel Antiparallel +C +C o o +C /l\ / \ /j\ +C / \ / \ / \ +C /| o |o o| o |\ +C j|/k\| / |/k\|l / +C / \ / / \ / +C / o / o +C i i +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C 4/7/01 AL Component s1 was removed, because it pertains to the respective +C energy moment and not to the cluster cumulant. + iti=itortyp(itype(i)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + itk=itortyp(itype(k)) + itk1=itortyp(itype(k+1)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +#ifdef MOMENT + s1=dip(4,jj,i)*dip(4,kk,k) +#endif + call matvec2(AECA(1,1,1),b1(1,itk1),auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matvec2(AECA(1,1,2),b1(1,itl1),auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + call transpose2(EE(1,1,itk),auxmat(1,1)) + call matmat2(auxmat(1,1),AECA(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) +cd write (2,*) 'eello6_graph3:','s1',s1,' s2',s2,' s3',s3,' s4',s4, +cd & "sum",-(s2+s3+s4) +#ifdef MOMENT + eello6_graph3=-(s1+s2+s3+s4) +#else + eello6_graph3=-(s2+s3+s4) +#endif +c eello6_graph3=-s4 +C Derivatives in gamma(k-1) + call matvec2(AECAderg(1,1,2),b1(1,itl1),auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + s4=-0.25d0*scalar2(vv(1),Ctobrder(1,k)) + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s3+s4) +C Derivatives in gamma(l-1) + call matvec2(AECAderg(1,1,1),b1(1,itk1),auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matmat2(auxmat(1,1),AECAderg(1,1,1),pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s4) +C Cartesian derivatives. + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + s1=dipderx(lll,kkk,4,jj,i)*dip(4,kk,k) + else + s1=dip(4,jj,i)*dipderx(lll,kkk,4,kk,k) + endif +#endif + call matvec2(AECAderx(1,1,lll,kkk,iii,1),b1(1,itk1), + & auxvec(1)) + s2=0.5d0*scalar2(b1(1,itk),auxvec(1)) + call matvec2(AECAderx(1,1,lll,kkk,iii,2),b1(1,itl1), + & auxvec(1)) + s3=0.5d0*scalar2(b1(1,itj1),auxvec(1)) + call matmat2(auxmat(1,1),AECAderx(1,1,lll,kkk,iii,1), + & pizda(1,1)) + vv(1)=pizda(1,1)+pizda(2,2) + vv(2)=pizda(2,1)-pizda(1,2) + s4=-0.25d0*scalar2(vv(1),Ctobr(1,k)) +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (swap) then + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif +c derx(lll,kkk,iii)=derx(lll,kkk,iii)-s4 + enddo + enddo + enddo + return + end + + +c-------------------------------------------------------------------- + + + double precision function eello6_graph4(i,j,k,l,jj,kk,imat,swap) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + double precision vv(2),pizda(2,2),auxmat(2,2),auxvec(2), + & auxvec1(2),auxmat1(2,2) + logical swap +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C Parallel Antiparallel +C +C o o +C /l\ / \ /j\ +C / \ / \ / \ +C /| o |o o| o |\ +C \ j|/k\| \ |/k\|l +C \ / \ \ / \ +C o \ o \ +C i i +C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C +C 4/7/01 AL Component s1 was removed, because it pertains to the respective +C energy moment and not to the cluster cumulant. +cd write (2,*) 'eello_graph4: wturn6',wturn6 + iti=itortyp(itype(i)) + itj=itortyp(itype(j)) + if (j.lt.nres-1) then + itj1=itortyp(itype(j+1)) + else + itj1=ntortyp+1 + endif + itk=itortyp(itype(k)) + if (k.lt.nres-1) then + itk1=itortyp(itype(k+1)) + else + itk1=ntortyp+1 + endif + itl=itortyp(itype(l)) + if (l.lt.nres-1) then + itl1=itortyp(itype(l+1)) + else + itl1=ntortyp+1 + endif +cd write (2,*) 'eello6_graph4:','i',i,' j',j,' k',k,' l',l +cd write (2,*) 'iti',iti,' itj',itj,' itj1',itj1,' itk',itk, +cd & ' itl',itl,' itl1',itl1 +#ifdef MOMENT + if (imat.eq.1) then + s1=dip(3,jj,i)*dip(3,kk,k) + else + s1=dip(2,jj,j)*dip(2,kk,l) + endif +#endif + call matvec2(AECA(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1(1,1,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1(1,1,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + call transpose2(EUg(1,1,k),auxmat(1,1)) + call matmat2(AECA(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) +cd write (2,*) 'eello6_graph4:','s1',s1,' s2',s2,' s3',s3,' s4',s4 +#ifdef MOMENT + eello6_graph4=-(s1+s2+s3+s4) +#else + eello6_graph4=-(s2+s3+s4) +#endif +C Derivatives in gamma(i-1) + if (i.gt.1) then +#ifdef MOMENT + if (imat.eq.1) then + s1=dipderg(2,jj,i)*dip(3,kk,k) + else + s1=dipderg(4,jj,j)*dip(2,kk,l) + endif +#endif + s2=0.5d0*scalar2(Ub2der(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1derg(1,1,1,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + s4=0.25d0*scalar2(vv(1),Dtobr2der(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +cd write (2,*) 'turn6 derivatives' +#ifdef MOMENT + gel_loc_turn6(i-1)=gel_loc_turn6(i-1)-ekont*(s1+s2+s3+s4) +#else + gel_loc_turn6(i-1)=gel_loc_turn6(i-1)-ekont*(s2+s3+s4) +#endif + else +#ifdef MOMENT + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(i-1)=g_corr6_loc(i-1)-ekont*(s2+s3+s4) +#endif + endif + endif +C Derivatives in gamma(k-1) +#ifdef MOMENT + if (imat.eq.1) then + s1=dip(3,jj,i)*dipderg(2,kk,k) + else + s1=dip(2,jj,j)*dipderg(4,kk,l) + endif +#endif + call matvec2(AECA(1,1,imat),Ub2der(1,k),auxvec1(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec1(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,itj1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec1(1)) + else + call matvec2(ADtEA1derg(1,1,2,3-imat),b1(1,itl1),auxvec1(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec1(1)) + endif + call transpose2(EUgder(1,1,k),auxmat1(1,1)) + call matmat2(AECA(1,1,imat),auxmat1(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +#ifdef MOMENT + gel_loc_turn6(k-1)=gel_loc_turn6(k-1)-ekont*(s1+s2+s3+s4) +#else + gel_loc_turn6(k-1)=gel_loc_turn6(k-1)-ekont*(s2+s3+s4) +#endif + else +#ifdef MOMENT + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s1+s2+s3+s4) +#else + g_corr6_loc(k-1)=g_corr6_loc(k-1)-ekont*(s2+s3+s4) +#endif + endif +C Derivatives in gamma(j-1) or gamma(l-1) + if (l.eq.j+1 .and. l.gt.1) then + call matvec2(AECAderg(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matmat2(AECAderg(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + g_corr6_loc(l-1)=g_corr6_loc(l-1)-ekont*(s2+s4) + else if (j.gt.1) then + call matvec2(AECAderg(1,1,imat),Ub2(1,k),auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + call matmat2(AECAderg(1,1,imat),auxmat(1,1),pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then + gel_loc_turn6(j-1)=gel_loc_turn6(j-1)-ekont*(s2+s4) + else + g_corr6_loc(j-1)=g_corr6_loc(j-1)-ekont*(s2+s4) + endif + endif +C Cartesian derivatives. + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + if (iii.eq.1) then + if (imat.eq.1) then + s1=dipderx(lll,kkk,3,jj,i)*dip(3,kk,k) + else + s1=dipderx(lll,kkk,2,jj,j)*dip(2,kk,l) + endif + else + if (imat.eq.1) then + s1=dip(3,jj,i)*dipderx(lll,kkk,3,kk,k) + else + s1=dip(2,jj,j)*dipderx(lll,kkk,2,kk,l) + endif + endif +#endif + call matvec2(AECAderx(1,1,lll,kkk,iii,imat),Ub2(1,k), + & auxvec(1)) + s2=0.5d0*scalar2(Ub2(1,i),auxvec(1)) + if (j.eq.l+1) then + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat), + & b1(1,itj1),auxvec(1)) + s3=-0.5d0*scalar2(b1(1,itj),auxvec(1)) + else + call matvec2(ADtEA1derx(1,1,lll,kkk,iii,3-imat), + & b1(1,itl1),auxvec(1)) + s3=-0.5d0*scalar2(b1(1,itl),auxvec(1)) + endif + call matmat2(AECAderx(1,1,lll,kkk,iii,imat),auxmat(1,1), + & pizda(1,1)) + vv(1)=pizda(1,1)-pizda(2,2) + vv(2)=pizda(2,1)+pizda(1,2) + s4=0.25d0*scalar2(vv(1),Dtobr2(1,i)) + if (swap) then + if (wturn6.gt.0.0d0 .and. k.eq.l+4 .and. i.eq.j+2) then +#ifdef MOMENT + derx_turn(lll,kkk,3-iii)=derx_turn(lll,kkk,3-iii) + & -(s1+s2+s4) +#else + derx_turn(lll,kkk,3-iii)=derx_turn(lll,kkk,3-iii) + & -(s2+s4) +#endif + derx_turn(lll,kkk,iii)=derx_turn(lll,kkk,iii)-s3 + else +#ifdef MOMENT + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-(s1+s2+s4) +#else + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-(s2+s4) +#endif + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + endif + else +#ifdef MOMENT + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s1+s2+s4) +#else + derx(lll,kkk,iii)=derx(lll,kkk,iii)-(s2+s4) +#endif + if (l.eq.j+1) then + derx(lll,kkk,iii)=derx(lll,kkk,iii)-s3 + else + derx(lll,kkk,3-iii)=derx(lll,kkk,3-iii)-s3 + endif + endif + enddo + enddo + enddo + return + end + + +c-------------------------------------------------------------------- + + + double precision function eello_turn6(i,jj,kk) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.CONTACTS' + include 'COMMON.TORSION' + include 'COMMON.VAR' + include 'COMMON.GEO' + double precision vtemp1(2),vtemp2(2),vtemp3(2),vtemp4(2), + & atemp(2,2),auxmat(2,2),achuj_temp(2,2),gtemp(2,2),gvec(2), + & ggg1(3),ggg2(3) + double precision vtemp1d(2),vtemp2d(2),vtemp3d(2),vtemp4d(2), + & atempd(2,2),auxmatd(2,2),achuj_tempd(2,2),gtempd(2,2),gvecd(2) +C 4/7/01 AL Components s1, s8, and s13 were removed, because they pertain to +C the respective energy moment and not to the cluster cumulant. + s1=0.0d0 + s8=0.0d0 + s13=0.0d0 +c + eello_turn6=0.0d0 + j=i+4 + k=i+1 + l=i+3 + iti=itortyp(itype(i)) + itk=itortyp(itype(k)) + itk1=itortyp(itype(k+1)) + itl=itortyp(itype(l)) + itj=itortyp(itype(j)) +cd write (2,*) 'itk',itk,' itk1',itk1,' itl',itl,' itj',itj +cd write (2,*) 'i',i,' k',k,' j',j,' l',l +cd if (i.ne.1 .or. j.ne.3 .or. k.ne.2 .or. l.ne.4) then +cd eello6=0.0d0 +cd return +cd endif +cd write (iout,*) +cd & 'EELLO6: Contacts have occurred for peptide groups',i,j, +cd & ' and',k,l +cd call checkint_turn6(i,jj,kk,eel_turn6_num) + do iii=1,2 + do kkk=1,5 + do lll=1,3 + derx_turn(lll,kkk,iii)=0.0d0 + enddo + enddo + enddo +cd eij=1.0d0 +cd ekl=1.0d0 +cd ekont=1.0d0 + eello6_5=eello6_graph4(l,k,j,i,kk,jj,2,.true.) +cd eello6_5=0.0d0 +cd write (2,*) 'eello6_5',eello6_5 +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmat(1,1)) + call matmat2(EUg(1,1,i+1),auxmat(1,1),auxmat(1,1)) + ss1=scalar2(Ub2(1,i+2),b1(1,itl)) + s1 = (auxmat(1,1)+auxmat(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1(1)) + call matvec2(AEA(1,1,1),vtemp1(1),vtemp1(1)) + s2 = scalar2(b1(1,itk),vtemp1(1)) +#ifdef MOMENT + call transpose2(AEA(1,1,2),atemp(1,1)) + call matmat2(atemp(1,1),EUg(1,1,i+4),atemp(1,1)) + call matvec2(Ug2(1,1,i+2),dd(1,1,itk1),vtemp2(1)) + s8 = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEA(1,1,2),auxmat(1,1)) + call matvec2(auxmat(1,1),Ub2(1,i+4),vtemp3(1)) + s12 = scalar2(Ub2(1,i+2),vtemp3(1)) +#ifdef MOMENT + call transpose2(a_chuj(1,1,kk,i+1),achuj_temp(1,1)) + call matmat2(achuj_temp(1,1),EUg(1,1,i+2),gtemp(1,1)) + call matmat2(gtemp(1,1),EUg(1,1,i+3),gtemp(1,1)) + call matvec2(a_chuj(1,1,jj,i),Ub2(1,i+4),vtemp4(1)) + ss13 = scalar2(b1(1,itk),vtemp4(1)) + s13 = (gtemp(1,1)+gtemp(2,2))*ss13 +#endif +c write (2,*) 's1,s2,s8,s12,s13',s1,s2,s8,s12,s13 +c s1=0.0d0 +c s2=0.0d0 +c s8=0.0d0 +c s12=0.0d0 +c s13=0.0d0 + eel_turn6 = eello6_5 - 0.5d0*(s1+s2+s12+s8+s13) +C Derivatives in gamma(i+2) + s1d =0.0d0 + s8d =0.0d0 +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmatd(1,1)) + call matmat2(EUgder(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 + call transpose2(AEAderg(1,1,2),atempd(1,1)) + call matmat2(atempd(1,1),EUg(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEAderg(1,1,2),auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 + gel_loc_turn6(i)=gel_loc_turn6(i)-0.5d0*ekont*(s1d+s8d+s12d) +C Derivatives in gamma(i+3) +#ifdef MOMENT + call transpose2(AEA(1,1,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + ss1d=scalar2(Ub2der(1,i+2),b1(1,itl)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1d +#endif + call matvec2(EUgder(1,1,i+2),b1(1,itl),vtemp1d(1)) + call matvec2(AEA(1,1,1),vtemp1d(1),vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call matvec2(Ug2der(1,1,i+2),dd(1,1,itk1),vtemp2d(1)) + s8d = -(atemp(1,1)+atemp(2,2))*scalar2(cc(1,1,itl),vtemp2d(1)) +#endif + s12d = scalar2(Ub2der(1,i+2),vtemp3(1)) +#ifdef MOMENT + call matmat2(achuj_temp(1,1),EUgder(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUg(1,1,i+3),gtempd(1,1)) + s13d = (gtempd(1,1)+gtempd(2,2))*ss13 +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+1)=gel_loc_turn6(i+1) + & -0.5d0*ekont*(s1d+s2d+s8d+s12d+s13d) +#else + gel_loc_turn6(i+1)=gel_loc_turn6(i+1) + & -0.5d0*ekont*(s2d+s12d) +#endif +C Derivatives in gamma(i+4) + call matmat2(EUgder(1,1,i+3),AEA(1,1,2),auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +#ifdef MOMENT + call matmat2(achuj_temp(1,1),EUg(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUgder(1,1,i+3),gtempd(1,1)) + s13d = (gtempd(1,1)+gtempd(2,2))*ss13 +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +C s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+2)=gel_loc_turn6(i+2)-0.5d0*ekont*(s12d+s13d) +#else + gel_loc_turn6(i+2)=gel_loc_turn6(i+2)-0.5d0*ekont*(s12d) +#endif +C Derivatives in gamma(i+5) +#ifdef MOMENT + call transpose2(AEAderg(1,1,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1d(1)) + call matvec2(AEAderg(1,1,1),vtemp1d(1),vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call transpose2(AEA(1,1,2),atempd(1,1)) + call matmat2(atempd(1,1),EUgder(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))*scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matvec2(auxmat(1,1),Ub2der(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +#ifdef MOMENT + call matvec2(a_chuj(1,1,jj,i),Ub2der(1,i+4),vtemp4d(1)) + ss13d = scalar2(b1(1,itk),vtemp4d(1)) + s13d = (gtemp(1,1)+gtemp(2,2))*ss13d +#endif +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + gel_loc_turn6(i+3)=gel_loc_turn6(i+3) + & -0.5d0*ekont*(s1d+s2d+s8d+s12d+s13d) +#else + gel_loc_turn6(i+3)=gel_loc_turn6(i+3) + & -0.5d0*ekont*(s2d+s12d) +#endif +C Cartesian derivatives + do iii=1,2 + do kkk=1,5 + do lll=1,3 +#ifdef MOMENT + call transpose2(AEAderx(1,1,lll,kkk,iii,1),auxmatd(1,1)) + call matmat2(EUg(1,1,i+1),auxmatd(1,1),auxmatd(1,1)) + s1d = (auxmatd(1,1)+auxmatd(2,2))*ss1 +#endif + call matvec2(EUg(1,1,i+2),b1(1,itl),vtemp1(1)) + call matvec2(AEAderx(1,1,lll,kkk,iii,1),vtemp1(1), + & vtemp1d(1)) + s2d = scalar2(b1(1,itk),vtemp1d(1)) +#ifdef MOMENT + call transpose2(AEAderx(1,1,lll,kkk,iii,2),atempd(1,1)) + call matmat2(atempd(1,1),EUg(1,1,i+4),atempd(1,1)) + s8d = -(atempd(1,1)+atempd(2,2))* + & scalar2(cc(1,1,itl),vtemp2(1)) +#endif + call matmat2(EUg(1,1,i+3),AEAderx(1,1,lll,kkk,iii,2), + & auxmatd(1,1)) + call matvec2(auxmatd(1,1),Ub2(1,i+4),vtemp3d(1)) + s12d = scalar2(Ub2(1,i+2),vtemp3d(1)) +c s1d=0.0d0 +c s2d=0.0d0 +c s8d=0.0d0 +c s12d=0.0d0 +c s13d=0.0d0 +#ifdef MOMENT + derx_turn(lll,kkk,iii) = derx_turn(lll,kkk,iii) + & - 0.5d0*(s1d+s2d) +#else + derx_turn(lll,kkk,iii) = derx_turn(lll,kkk,iii) + & - 0.5d0*s2d +#endif +#ifdef MOMENT + derx_turn(lll,kkk,3-iii) = derx_turn(lll,kkk,3-iii) + & - 0.5d0*(s8d+s12d) +#else + derx_turn(lll,kkk,3-iii) = derx_turn(lll,kkk,3-iii) + & - 0.5d0*s12d +#endif + enddo + enddo + enddo +#ifdef MOMENT + do kkk=1,5 + do lll=1,3 + call transpose2(a_chuj_der(1,1,lll,kkk,kk,i+1), + & achuj_tempd(1,1)) + call matmat2(achuj_tempd(1,1),EUg(1,1,i+2),gtempd(1,1)) + call matmat2(gtempd(1,1),EUg(1,1,i+3),gtempd(1,1)) + s13d=(gtempd(1,1)+gtempd(2,2))*ss13 + derx_turn(lll,kkk,2) = derx_turn(lll,kkk,2)-0.5d0*s13d + call matvec2(a_chuj_der(1,1,lll,kkk,jj,i),Ub2(1,i+4), + & vtemp4d(1)) + ss13d = scalar2(b1(1,itk),vtemp4d(1)) + s13d = (gtemp(1,1)+gtemp(2,2))*ss13d + derx_turn(lll,kkk,1) = derx_turn(lll,kkk,1)-0.5d0*s13d + enddo + enddo +#endif +cd write(iout,*) 'eel6_turn6',eel_turn6,' eel_turn6_num', +cd & 16*eel_turn6_num +cd goto 1112 + if (j.lt.nres-1) then + j1=j+1 + j2=j-1 + else + j1=j-1 + j2=j-2 + endif + if (l.lt.nres-1) then + l1=l+1 + l2=l-1 + else + l1=l-1 + l2=l-2 + endif + do ll=1,3 +cgrad ggg1(ll)=eel_turn6*g_contij(ll,1) +cgrad ggg2(ll)=eel_turn6*g_contij(ll,2) +cgrad ghalf=0.5d0*ggg1(ll) +cd ghalf=0.0d0 + gturn6ij=eel_turn6*g_contij(ll,1)+ekont*derx_turn(ll,1,1) + gturn6kl=eel_turn6*g_contij(ll,2)+ekont*derx_turn(ll,1,2) + gcorr6_turn(ll,i)=gcorr6_turn(ll,i)!+ghalf + & +ekont*derx_turn(ll,2,1) + gcorr6_turn(ll,i+1)=gcorr6_turn(ll,i+1)+ekont*derx_turn(ll,3,1) + gcorr6_turn(ll,j)=gcorr6_turn(ll,j)!+ghalf + & +ekont*derx_turn(ll,4,1) + gcorr6_turn(ll,j1)=gcorr6_turn(ll,j1)+ekont*derx_turn(ll,5,1) + gcorr6_turn_long(ll,j)=gcorr6_turn_long(ll,j)+gturn6ij + gcorr6_turn_long(ll,i)=gcorr6_turn_long(ll,i)-gturn6ij +cgrad ghalf=0.5d0*ggg2(ll) +cd ghalf=0.0d0 + gcorr6_turn(ll,k)=gcorr6_turn(ll,k)!+ghalf + & +ekont*derx_turn(ll,2,2) + gcorr6_turn(ll,k+1)=gcorr6_turn(ll,k+1)+ekont*derx_turn(ll,3,2) + gcorr6_turn(ll,l)=gcorr6_turn(ll,l)!+ghalf + & +ekont*derx_turn(ll,4,2) + gcorr6_turn(ll,l1)=gcorr6_turn(ll,l1)+ekont*derx_turn(ll,5,2) + gcorr6_turn_long(ll,l)=gcorr6_turn_long(ll,l)+gturn6kl + gcorr6_turn_long(ll,k)=gcorr6_turn_long(ll,k)-gturn6kl + enddo +cd goto 1112 +cgrad do m=i+1,j-1 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg1(ll) +cgrad enddo +cgrad enddo +cgrad do m=k+1,l-1 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ggg2(ll) +cgrad enddo +cgrad enddo +cgrad1112 continue +cgrad do m=i+2,j2 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,1) +cgrad enddo +cgrad enddo +cgrad do m=k+2,l2 +cgrad do ll=1,3 +cgrad gcorr6_turn(ll,m)=gcorr6_turn(ll,m)+ekont*derx_turn(ll,1,2) +cgrad enddo +cgrad enddo +cd do iii=1,nres-3 +cd write (2,*) iii,g_corr6_loc(iii) +cd enddo + eello_turn6=ekont*eel_turn6 +cd write (2,*) 'ekont',ekont +cd write (2,*) 'eel_turn6',ekont*eel_turn6 + return + end + + +C-------------------------------------------------------------------- + + + double precision function scalar(u,v) +!DIR$ INLINEALWAYS scalar +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::scalar +#endif + implicit none + double precision u(3),v(3) +cd double precision sc +cd integer i +cd sc=0.0d0 +cd do i=1,3 +cd sc=sc+u(i)*v(i) +cd enddo +cd scalar=sc + + scalar=u(1)*v(1)+u(2)*v(2)+u(3)*v(3) + return + end + + +crc----------------------------------------------------------------- + + + SUBROUTINE MATVEC2(A1,V1,V2) +!DIR$ INLINEALWAYS MATVEC2 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::MATVEC2 +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A1(2,2),V1(2),V2(2) +c DO 1 I=1,2 +c VI=0.0 +c DO 3 K=1,2 +c 3 VI=VI+A1(I,K)*V1(K) +c Vaux(I)=VI +c 1 CONTINUE + + vaux1=a1(1,1)*v1(1)+a1(1,2)*v1(2) + vaux2=a1(2,1)*v1(1)+a1(2,2)*v1(2) + + v2(1)=vaux1 + v2(2)=vaux2 + END + + +C-------------------------------------------------------------------- + + + SUBROUTINE MATMAT2(A1,A2,A3) +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::MATMAT2 +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A1(2,2),A2(2,2),A3(2,2) +c DIMENSION AI3(2,2) +c DO J=1,2 +c A3IJ=0.0 +c DO K=1,2 +c A3IJ=A3IJ+A1(I,K)*A2(K,J) +c enddo +c A3(I,J)=A3IJ +c enddo +c enddo + + ai3_11=a1(1,1)*a2(1,1)+a1(1,2)*a2(2,1) + ai3_12=a1(1,1)*a2(1,2)+a1(1,2)*a2(2,2) + ai3_21=a1(2,1)*a2(1,1)+a1(2,2)*a2(2,1) + ai3_22=a1(2,1)*a2(1,2)+a1(2,2)*a2(2,2) + + A3(1,1)=AI3_11 + A3(2,1)=AI3_21 + A3(1,2)=AI3_12 + A3(2,2)=AI3_22 + END + + +c-------------------------------------------------------------------- + + + double precision function scalar2(u,v) +!DIR$ INLINEALWAYS scalar2 + implicit none + double precision u(2),v(2) + double precision sc + integer i + scalar2=u(1)*v(1)+u(2)*v(2) + return + end + + +C-------------------------------------------------------------------- + + + subroutine transpose2(a,at) +!DIR$ INLINEALWAYS transpose2 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::transpose2 +#endif + implicit none + double precision a(2,2),at(2,2) + at(1,1)=a(1,1) + at(1,2)=a(2,1) + at(2,1)=a(1,2) + at(2,2)=a(2,2) + return + end + + +c-------------------------------------------------------------------- + + + subroutine transpose(n,a,at) + implicit none + integer n,i,j + double precision a(n,n),at(n,n) + do i=1,n + do j=1,n + at(j,i)=a(i,j) + enddo + enddo + return + end + + +C-------------------------------------------------------------------- + + + subroutine prodmat3(a1,a2,kk,transp,prod) +!DIR$ INLINEALWAYS prodmat3 +#ifndef OSF +cDEC$ ATTRIBUTES FORCEINLINE::prodmat3 +#endif + implicit none + integer i,j + double precision a1(2,2),a2(2,2),a2t(2,2),kk(2,2),prod(2,2) + logical transp +crc double precision auxmat(2,2),prod_(2,2) + + if (transp) then +crc call transpose2(kk(1,1),auxmat(1,1)) +crc call matmat2(a1(1,1),auxmat(1,1),auxmat(1,1)) +crc call matmat2(auxmat(1,1),a2(1,1),prod_(1,1)) + + prod(1,1)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(1,2))*a2(1,1) + & +(a1(1,1)*kk(2,1)+a1(1,2)*kk(2,2))*a2(2,1) + prod(1,2)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(1,2))*a2(1,2) + & +(a1(1,1)*kk(2,1)+a1(1,2)*kk(2,2))*a2(2,2) + prod(2,1)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(1,2))*a2(1,1) + & +(a1(2,1)*kk(2,1)+a1(2,2)*kk(2,2))*a2(2,1) + prod(2,2)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(1,2))*a2(1,2) + & +(a1(2,1)*kk(2,1)+a1(2,2)*kk(2,2))*a2(2,2) + + else +crc call matmat2(a1(1,1),kk(1,1),auxmat(1,1)) +crc call matmat2(auxmat(1,1),a2(1,1),prod_(1,1)) + + prod(1,1)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(2,1))*a2(1,1) + & +(a1(1,1)*kk(1,2)+a1(1,2)*kk(2,2))*a2(2,1) + prod(1,2)=(a1(1,1)*kk(1,1)+a1(1,2)*kk(2,1))*a2(1,2) + & +(a1(1,1)*kk(1,2)+a1(1,2)*kk(2,2))*a2(2,2) + prod(2,1)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(2,1))*a2(1,1) + & +(a1(2,1)*kk(1,2)+a1(2,2)*kk(2,2))*a2(2,1) + prod(2,2)=(a1(2,1)*kk(1,1)+a1(2,2)*kk(2,1))*a2(1,2) + & +(a1(2,1)*kk(1,2)+a1(2,2)*kk(2,2))*a2(2,2) + + endif +c call transpose2(a2(1,1),a2t(1,1)) + +crc print *,transp +crc print *,((prod_(i,j),i=1,2),j=1,2) +crc print *,((prod(i,j),i=1,2),j=1,2) + + return + end + diff --git a/source/unres/src_MD-NEWSC/energy_split-sep.F b/source/unres/src_MD-NEWSC/energy_split-sep.F new file mode 100644 index 0000000..81e4d81 --- /dev/null +++ b/source/unres/src_MD-NEWSC/energy_split-sep.F @@ -0,0 +1,476 @@ + subroutine etotal_long(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +c +c Compute the long-range slow-varying contributions to the energy +c +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" + double precision weights_(n_ene) +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene) + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.MD' +c write(iout,'(a,i2)')'Calling etotal_long ipot=',ipot + if (modecalc.eq.12.or.modecalc.eq.14) then +#ifdef MPI +c if (fg_rank.eq.0) call int_from_cart1(.false.) +#else + call int_from_cart1(.false.) +#endif + endif +#ifdef MPI +c write(iout,*) "ETOTAL_LONG Processor",fg_rank, +c & " absolute rank",myrank," nfgtasks",nfgtasks + call flush(iout) + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (fg_rank.eq.0) then + call MPI_Bcast(3,1,MPI_INTEGER,king,FG_COMM,IERROR) +c write (iout,*) "Processor",myrank," BROADCAST iorder" +c call flush(iout) +C FG master sets up the WEIGHTS_ array which will be broadcast to the +C FG slaves as WEIGHTS array. + weights_(1)=wsc + weights_(2)=wscp + weights_(3)=welec + weights_(4)=wcorr + weights_(5)=wcorr5 + weights_(6)=wcorr6 + weights_(7)=wel_loc + weights_(8)=wturn3 + weights_(9)=wturn4 + weights_(10)=wturn6 + weights_(11)=wang + weights_(12)=wscloc + weights_(13)=wtor + weights_(14)=wtor_d + weights_(15)=wstrain + weights_(16)=wvdwpp + weights_(17)=wbond + weights_(18)=scal14 + weights_(21)=wsccor +C FG Master broadcasts the WEIGHTS_ array + call MPI_Bcast(weights_(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + else +C FG slaves receive the WEIGHTS array + call MPI_Bcast(weights(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + wsc=weights(1) + wscp=weights(2) + welec=weights(3) + wcorr=weights(4) + wcorr5=weights(5) + wcorr6=weights(6) + wel_loc=weights(7) + wturn3=weights(8) + wturn4=weights(9) + wturn6=weights(10) + wang=weights(11) + wscloc=weights(12) + wtor=weights(13) + wtor_d=weights(14) + wstrain=weights(15) + wvdwpp=weights(16) + wbond=weights(17) + scal14=weights(18) + wsccor=weights(21) + endif + call MPI_Bcast(dc(1,1),6*nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 + time_Bcastw=time_Bcastw+MPI_Wtime()-time00 +c call chainbuild_cart +c call int_from_cart1(.false.) + endif +c write (iout,*) 'Processor',myrank, +c & ' calling etotal_short ipot=',ipot +c call flush(iout) +c print *,'Processor',myrank,' nnt=',nnt,' nct=',nct +#endif +cd print *,'nnt=',nnt,' nct=',nct +C +C Compute the side-chain and electrostatic interaction energy +C + goto (101,102,103,104,105,106) ipot +C Lennard-Jones potential. + 101 call elj_long(evdw) +cd print '(a)','Exit ELJ' + goto 107 +C Lennard-Jones-Kihara potential (shifted). + 102 call eljk_long(evdw) + goto 107 +C Berne-Pechukas potential (dilated LJ, angular dependence). + 103 call ebp_long(evdw) + goto 107 +C Gay-Berne potential (shifted LJ, angular dependence). + 104 call egb_long(evdw,evdw_p,evdw_m) + goto 107 +C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence). + 105 call egbv_long(evdw) + goto 107 +C Soft-sphere potential + 106 call e_softsphere(evdw) +C +C Calculate electrostatic (H-bonding) energy of the main chain. +C + 107 continue + call vec_and_deriv + if (ipot.lt.6) then +#ifdef SPLITELE + if (welec.gt.0d0.or.wvdwpp.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#else + if (welec.gt.0d0.or.wel_loc.gt.0d0.or. + & wturn3.gt.0d0.or.wturn4.gt.0d0 .or. wcorr.gt.0.0d0 + & .or. wcorr4.gt.0.0d0 .or. wcorr5.gt.0.d0 + & .or. wcorr6.gt.0.0d0 .or. wturn6.gt.0.0d0 ) then +#endif + call eelec_scale(ees,evdw1,eel_loc,eello_turn3,eello_turn4) + else + ees=0 + evdw1=0 + eel_loc=0 + eello_turn3=0 + eello_turn4=0 + endif + else +c write (iout,*) "Soft-spheer ELEC potential" + call eelec_soft_sphere(ees,evdw1,eel_loc,eello_turn3, + & eello_turn4) + endif +C +C Calculate excluded-volume interaction energy between peptide groups +C and side chains. +C + if (ipot.lt.6) then + if(wscp.gt.0d0) then + call escp_long(evdw2,evdw2_14) + else + evdw2=0 + evdw2_14=0 + endif + else + call escp_soft_sphere(evdw2,evdw2_14) + endif +C +C 12/1/95 Multi-body terms +C + n_corr=0 + n_corr1=0 + if ((wcorr4.gt.0.0d0 .or. wcorr5.gt.0.0d0 .or. wcorr6.gt.0.0d0 + & .or. wturn6.gt.0.0d0) .and. ipot.lt.6) then + call multibody_eello(ecorr,ecorr5,ecorr6,eturn6,n_corr,n_corr1) +c write (2,*) 'n_corr=',n_corr,' n_corr1=',n_corr1, +c &" ecorr",ecorr," ecorr5",ecorr5," ecorr6",ecorr6," eturn6",eturn6 + else + ecorr=0.0d0 + ecorr5=0.0d0 + ecorr6=0.0d0 + eturn6=0.0d0 + endif + if ((wcorr4.eq.0.0d0 .and. wcorr.gt.0.0d0) .and. ipot.lt.6) then + call multibody_hb(ecorr,ecorr5,ecorr6,n_corr,n_corr1) + endif +C +C If performing constraint dynamics, call the constraint energy +C after the equilibration time + if(usampl.and.totT.gt.eq_time) then + call EconstrQ + call Econstr_back + else + Uconst=0.0d0 + Uconst_back=0.0d0 + endif +C +C Sum the energies +C + do i=1,n_ene + energia(i)=0.0d0 + enddo + energia(1)=evdw +#ifdef SCP14 + energia(2)=evdw2-evdw2_14 + energia(18)=evdw2_14 +#else + energia(2)=evdw2 + energia(18)=0.0d0 +#endif +#ifdef SPLITELE + energia(3)=ees + energia(16)=evdw1 +#else + energia(3)=ees+evdw1 + energia(16)=0.0d0 +#endif + energia(4)=ecorr + energia(5)=ecorr5 + energia(6)=ecorr6 + energia(7)=eel_loc + energia(8)=eello_turn3 + energia(9)=eello_turn4 + energia(10)=eturn6 + energia(20)=Uconst+Uconst_back + energia(22)=evdw_p + energia(23)=evdw_m + call sum_energy(energia,.true.) +c write (iout,*) "Exit ETOTAL_LONG" + call flush(iout) + return + end +c------------------------------------------------------------------------------ + subroutine etotal_short(energia) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +c +c Compute the short-range fast-varying contributions to the energy +c +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif +#ifdef MPI + include "mpif.h" + double precision weights_(n_ene) +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energia(0:n_ene) + include 'COMMON.FFIELD' + include 'COMMON.DERIV' + include 'COMMON.INTERACT' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + +c write(iout,'(a,i2)')'Calling etotal_short ipot=',ipot +c call flush(iout) + if (modecalc.eq.12.or.modecalc.eq.14) then +#ifdef MPI + if (fg_rank.eq.0) call int_from_cart1(.false.) +#else + call int_from_cart1(.false.) +#endif + endif +#ifdef MPI +c write(iout,*) "ETOTAL_SHORT Processor",fg_rank, +c & " absolute rank",myrank," nfgtasks",nfgtasks +c call flush(iout) + if (nfgtasks.gt.1) then + time00=MPI_Wtime() +C FG slaves call the following matching MPI_Bcast in ERGASTULUM + if (fg_rank.eq.0) then + call MPI_Bcast(2,1,MPI_INTEGER,king,FG_COMM,IERROR) +c write (iout,*) "Processor",myrank," BROADCAST iorder" +c call flush(iout) +C FG master sets up the WEIGHTS_ array which will be broadcast to the +C FG slaves as WEIGHTS array. + weights_(1)=wsc + weights_(2)=wscp + weights_(3)=welec + weights_(4)=wcorr + weights_(5)=wcorr5 + weights_(6)=wcorr6 + weights_(7)=wel_loc + weights_(8)=wturn3 + weights_(9)=wturn4 + weights_(10)=wturn6 + weights_(11)=wang + weights_(12)=wscloc + weights_(13)=wtor + weights_(14)=wtor_d + weights_(15)=wstrain + weights_(16)=wvdwpp + weights_(17)=wbond + weights_(18)=scal14 + weights_(21)=wsccor +C FG Master broadcasts the WEIGHTS_ array + call MPI_Bcast(weights_(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + else +C FG slaves receive the WEIGHTS array + call MPI_Bcast(weights(1),n_ene, + & MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) + wsc=weights(1) + wscp=weights(2) + welec=weights(3) + wcorr=weights(4) + wcorr5=weights(5) + wcorr6=weights(6) + wel_loc=weights(7) + wturn3=weights(8) + wturn4=weights(9) + wturn6=weights(10) + wang=weights(11) + wscloc=weights(12) + wtor=weights(13) + wtor_d=weights(14) + wstrain=weights(15) + wvdwpp=weights(16) + wbond=weights(17) + scal14=weights(18) + wsccor=weights(21) + endif +c write (iout,*),"Processor",myrank," BROADCAST weights" + call MPI_Bcast(c(1,1),maxres6,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST c" + call MPI_Bcast(dc(1,1),maxres6,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST dc" + call MPI_Bcast(dc_norm(1,1),maxres6,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST dc_norm" + call MPI_Bcast(theta(1),nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST theta" + call MPI_Bcast(phi(1),nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST phi" + call MPI_Bcast(alph(1),nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST alph" + call MPI_Bcast(omeg(1),nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST omeg" + call MPI_Bcast(vbld(1),2*nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "Processor",myrank," BROADCAST vbld" + call MPI_Bcast(vbld_inv(1),2*nres,MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 +c write (iout,*) "Processor",myrank," BROADCAST vbld_inv" + endif +c write (iout,*) 'Processor',myrank, +c & ' calling etotal_short ipot=',ipot +c call flush(iout) +c print *,'Processor',myrank,' nnt=',nnt,' nct=',nct +#endif +c call int_from_cart1(.false.) +C +C Compute the side-chain and electrostatic interaction energy +C + goto (101,102,103,104,105,106) ipot +C Lennard-Jones potential. + 101 call elj_short(evdw) +cd print '(a)','Exit ELJ' + goto 107 +C Lennard-Jones-Kihara potential (shifted). + 102 call eljk_short(evdw) + goto 107 +C Berne-Pechukas potential (dilated LJ, angular dependence). + 103 call ebp_short(evdw) + goto 107 +C Gay-Berne potential (shifted LJ, angular dependence). + 104 call egb_short(evdw,evdw_p,evdw_m) + goto 107 +C Gay-Berne-Vorobjev potential (shifted LJ, angular dependence). + 105 call egbv_short(evdw) + goto 107 +C Soft-sphere potential - already dealt with in the long-range part + 106 evdw=0.0d0 +c 106 call e_softsphere_short(evdw) +C +C Calculate electrostatic (H-bonding) energy of the main chain. +C + 107 continue +c +c Calculate the short-range part of Evdwpp +c + call evdwpp_short(evdw1) +c +c Calculate the short-range part of ESCp +c + if (ipot.lt.6) then + call escp_short(evdw2,evdw2_14) + endif +c +c Calculate the bond-stretching energy +c + call ebond(estr) +C +C Calculate the disulfide-bridge and other energy and the contributions +C from other distance constraints. + call edis(ehpb) +C +C Calculate the virtual-bond-angle energy. +C + call ebend(ebe) +C +C Calculate the SC local energy. +C + call vec_and_deriv + call esc(escloc) +C +C Calculate the virtual-bond torsional energy. +C + call etor(etors,edihcnstr) +C +C 6/23/01 Calculate double-torsional energy +C + call etor_d(etors_d) +C +C 21/5/07 Calculate local sicdechain correlation energy +C + if (wsccor.gt.0.0d0) then + call eback_sc_corr(esccor) + else + esccor=0.0d0 + endif +C +C Put energy components into an array +C + do i=1,n_ene + energia(i)=0.0d0 + enddo + energia(1)=evdw +#ifdef SCP14 + energia(2)=evdw2-evdw2_14 + energia(18)=evdw2_14 +#else + energia(2)=evdw2 + energia(18)=0.0d0 +#endif +#ifdef SPLITELE + energia(16)=evdw1 +#else + energia(3)=evdw1 +#endif + energia(11)=ebe + energia(12)=escloc + energia(13)=etors + energia(14)=etors_d + energia(15)=ehpb + energia(17)=estr + energia(19)=edihcnstr + energia(21)=esccor + energia(22)=evdw_p + energia(23)=evdw_m +c write (iout,*) "ETOTAL_SHORT before SUM_ENERGY" + call flush(iout) + call sum_energy(energia,.true.) +c write (iout,*) "Exit ETOTAL_SHORT" + call flush(iout) + return + end diff --git a/source/unres/src_MD-NEWSC/entmcm.F b/source/unres/src_MD-NEWSC/entmcm.F new file mode 100644 index 0000000..3c2dc5a --- /dev/null +++ b/source/unres/src_MD-NEWSC/entmcm.F @@ -0,0 +1,684 @@ + subroutine entmcm +C Does modified entropic sampling in the space of minima. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.THREAD' + include 'COMMON.NAMES' + logical accepted,not_done,over,ovrtim,error,lprint + integer MoveType,nbond + integer conf_comp + double precision RandOrPert + double precision varia(maxvar),elowest,ehighest,eold + double precision przes(3),obr(3,3) + double precision varold(maxvar) + logical non_conv + double precision energia(0:n_ene),energia_ave(0:n_ene) +C +cd write (iout,*) 'print_mc=',print_mc + WhatsUp=0 + maxtrial_iter=50 +c--------------------------------------------------------------------------- +C Initialize counters. +c--------------------------------------------------------------------------- +C Total number of generated confs. + ngen=0 +C Total number of moves. In general this won't be equal to the number of +C attempted moves, because we may want to reject some "bad" confs just by +C overlap check. + nmove=0 +C Total number of shift (nbond_move(1)), spike, crankshaft, three-bond,... +C motions. + do i=1,nres + nbond_move(i)=0 + enddo +C Initialize total and accepted number of moves of various kind. + do i=0,MaxMoveType + moves(i)=0 + moves_acc(i)=0 + enddo +C Total number of energy evaluations. + neneval=0 + nfun=0 + indminn=-max_ene + indmaxx=max_ene + delte=0.5D0 + facee=1.0D0/(maxacc*delte) + conste=dlog(facee) +C Read entropy from previous simulations. + if (ent_read) then + read (ientin,*) indminn,indmaxx,emin,emax + print *,'indminn=',indminn,' indmaxx=',indmaxx,' emin=',emin, + & ' emax=',emax + do i=-max_ene,max_ene + entropy(i)=(emin+i*delte)*betbol + enddo + read (ientin,*) (ijunk,ejunk,entropy(i),i=indminn,indmaxx) + indmin=indminn + indmax=indmaxx + write (iout,*) 'indminn=',indminn,' indmaxx=',indmaxx, + & ' emin=',emin,' emax=',emax + write (iout,'(/a)') 'Initial entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + endif ! ent_read +C Read the pool of conformations + call read_pool +C---------------------------------------------------------------------------- +C Entropy-sampling simulations with continually updated entropy +C Loop thru simulations +C---------------------------------------------------------------------------- + DO ISWEEP=1,NSWEEP +C---------------------------------------------------------------------------- +C Take a conformation from the pool +C---------------------------------------------------------------------------- + if (npool.gt.0) then + ii=iran_num(1,npool) + do i=1,nvar + varia(i)=xpool(i,ii) + enddo + write (iout,*) 'Took conformation',ii,' from the pool energy=', + & epool(ii) + call var_to_geom(nvar,varia) +C Print internal coordinates of the initial conformation + call intout + else + call gen_rand_conf(1,*20) + endif +C---------------------------------------------------------------------------- +C Compute and print initial energies. +C---------------------------------------------------------------------------- + nsave=0 +#ifdef MPL + if (MyID.eq.MasterID) then + do i=1,nctasks + nsave_part(i)=0 + enddo + endif +#endif + Kwita=0 + WhatsUp=0 + write (iout,'(/80(1h*)/a,i2/80(1h*)/)') 'MCE iteration #',isweep + write (iout,'(/80(1h*)/a)') 'Initial energies:' + call chainbuild + call etotal(energia(0)) + etot = energia(0) + call enerprint(energia(0)) +C Minimize the energy of the first conformation. + if (minim) then + call geom_to_var(nvar,varia) + call minimize(etot,varia,iretcode,nfun) + call etotal(energia(0)) + etot = energia(0) + write (iout,'(/80(1h*)/a/80(1h*))') + & 'Results of the first energy minimization:' + call enerprint(energia(0)) + endif + if (refstr) then + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup,przes, + & obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order:',co + write (istat,'(i5,11(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene),etot,rms,frac,co + else + write (istat,'(i5,9(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif + close(istat) + neneval=neneval+nfun+1 + if (.not. ent_read) then +C Initialize the entropy array + do i=-max_ene,max_ene + emin=etot +C Uncomment the line below for actual entropic sampling (start with uniform +C energy distribution). +c entropy(i)=0.0D0 +C Uncomment the line below for multicanonical sampling (start with Boltzmann +C distribution). + entropy(i)=(emin+i*delte)*betbol + enddo + emax=10000000.0D0 + emin=etot + write (iout,'(/a)') 'Initial entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + endif ! ent_read +#ifdef MPL + call recv_stop_sig(Kwita) + if (whatsup.eq.1) then + call send_stop_sig(-2) + not_done=.false. + else if (whatsup.le.-2) then + not_done=.false. + else if (whatsup.eq.2) then + not_done=.false. + else + not_done=.true. + endif +#else + not_done = (iretcode.ne.11) +#endif + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Enter Monte Carlo procedure.' + close(igeom) + call briefout(0,etot) + do i=1,nvar + varold(i)=varia(i) + enddo + eold=etot + indeold=(eold-emin)/delte + deix=eold-(emin+indeold*delte) + dent=entropy(indeold+1)-entropy(indeold) +cd write (iout,*) 'indeold=',indeold,' deix=',deix,' dent=',dent +cd write (*,*) 'Processor',MyID,' indeold=',indeold,' deix=',deix, +cd & ' dent=',dent + sold=entropy(indeold)+(dent/delte)*deix + elowest=etot + write (iout,*) 'eold=',eold,' sold=',sold,' elowest=',etot + write (*,*) 'Processor',MyID,' eold=',eold,' sold=',sold, + & ' elowest=',etot + if (minim) call zapis(varia,etot) + nminima(1)=1.0D0 +C NACC is the counter for the accepted conformations of a given processor + nacc=0 +C NACC_TOT counts the total number of accepted conformations + nacc_tot=0 +#ifdef MPL + if (MyID.eq.MasterID) then + call receive_MCM_info + else + call send_MCM_info(2) + endif +#endif + do iene=indminn,indmaxx + nhist(iene)=0.0D0 + enddo + do i=2,maxsave + nminima(i)=0.0D0 + enddo +C Main loop. +c---------------------------------------------------------------------------- + elowest=1.0D10 + ehighest=-1.0D10 + it=0 + do while (not_done) + it=it+1 + if (print_mc.gt.0) write (iout,'(80(1h*)/20x,a,i7)') + & 'Beginning iteration #',it +C Initialize local counter. + ntrial=0 ! # of generated non-overlapping confs. + noverlap=0 ! # of overlapping confs. + accepted=.false. + do while (.not. accepted .and. WhatsUp.eq.0 .and. Kwita.eq.0) + ntrial=ntrial+1 +C Retrieve the angles of previously accepted conformation + do j=1,nvar + varia(j)=varold(j) + enddo +cd write (iout,'(a)') 'Old variables:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + call var_to_geom(nvar,varia) +C Rebuild the chain. + call chainbuild + MoveType=0 + nbond=0 + lprint=.true. +C Decide whether to generate a random conformation or perturb the old one + RandOrPert=ran_number(0.0D0,1.0D0) + if (RandOrPert.gt.RanFract) then + if (print_mc.gt.0) + & write (iout,'(a)') 'Perturbation-generated conformation.' + call perturb(error,lprint,MoveType,nbond,1.0D0) + if (error) goto 20 + if (MoveType.lt.1 .or. MoveType.gt.MaxMoveType) then + write (iout,'(/a,i7,a/)') 'Error - unknown MoveType=', + & MoveType,' returned from PERTURB.' + goto 20 + endif + call chainbuild + else + MoveType=0 + moves(0)=moves(0)+1 + nstart_grow=iran_num(3,nres) + if (print_mc.gt.0) + & write (iout,'(2a,i3)') 'Random-generated conformation', + & ' - chain regrown from residue',nstart_grow + call gen_rand_conf(nstart_grow,*30) + endif + call geom_to_var(nvar,varia) +cd write (iout,'(a)') 'New variables:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + ngen=ngen+1 + if (print_mc.gt.0) write (iout,'(a,i5,a,i10,a,i10)') + & 'Processor',MyId,' trial move',ntrial,' total generated:',ngen + if (print_mc.gt.0) write (*,'(a,i5,a,i10,a,i10)') + & 'Processor',MyId,' trial move',ntrial,' total generated:',ngen + call etotal(energia(0)) + etot = energia(0) +c call enerprint(energia(0)) +c write (iout,'(2(a,1pe14.5))') 'Etot=',Etot,' Elowest=',Elowest + if (etot-elowest.gt.overlap_cut) then + write (iout,'(a,i5,a,1pe14.5)') 'Iteration',it, + & ' Overlap detected in the current conf.; energy is',etot + neneval=neneval+1 + accepted=.false. + noverlap=noverlap+1 + if (noverlap.gt.maxoverlap) then + write (iout,'(a)') 'Too many overlapping confs.' + goto 20 + endif + else + if (minim) then + call minimize(etot,varia,iretcode,nfun) +cd write (iout,'(a)') 'Variables after minimization:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + call etotal(energia(0)) + etot = energia(0) + neneval=neneval+nfun+1 + endif + if (print_mc.gt.2) then + write (iout,'(a)') 'Total energies of trial conf:' + call enerprint(energia(0)) + else if (print_mc.eq.1) then + write (iout,'(a,i6,a,1pe16.6)') + & 'Trial conformation:',ngen,' energy:',etot + endif +C-------------------------------------------------------------------------- +C... Acceptance test +C-------------------------------------------------------------------------- + accepted=.false. + if (WhatsUp.eq.0) + & call accepting(etot,eold,scur,sold,varia,varold, + & accepted) + if (accepted) then + nacc=nacc+1 + nacc_tot=nacc_tot+1 + if (elowest.gt.etot) elowest=etot + if (ehighest.lt.etot) ehighest=etot + moves_acc(MoveType)=moves_acc(MoveType)+1 + if (MoveType.eq.1) then + nbond_acc(nbond)=nbond_acc(nbond)+1 + endif +C Check against conformation repetitions. + irep=conf_comp(varia,etot) +#if defined(AIX) || defined(PGI) + open (istat,file=statname,position='append') +#else + open (istat,file=statname,access='append') +#endif + if (refstr) then + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup, + & przes,obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + if (print_mc.gt.0) + & write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order:',co + if (print_stat) + & write (istat,'(i5,11(1pe14.5))') it, + & (energia(print_order(i)),i=1,nprint_ene),etot, + & rms,frac,co + elseif (print_stat) then + write (istat,'(i5,10(1pe14.5))') it, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif + close(istat) + if (print_mc.gt.1) + & call statprint(nacc,nfun,iretcode,etot,elowest) +C Print internal coordinates. + if (print_int) call briefout(nacc,etot) +#ifdef MPL + if (MyID.ne.MasterID) then + call recv_stop_sig(Kwita) +cd print *,'Processor:',MyID,' STOP=',Kwita + if (irep.eq.0) then + call send_MCM_info(2) + else + call send_MCM_info(1) + endif + endif +#endif +C Store the accepted conf. and its energy. + eold=etot + sold=scur + do i=1,nvar + varold(i)=varia(i) + enddo + if (irep.eq.0) then + irep=nsave+1 +cd write (iout,*) 'Accepted conformation:' +cd write (iout,*) (rad2deg*varia(i),i=1,nphi) + if (minim) call zapis(varia,etot) + do i=1,n_ene + ener(i,nsave)=energia(i) + enddo + ener(n_ene+1,nsave)=etot + ener(n_ene+2,nsave)=frac + endif + nminima(irep)=nminima(irep)+1.0D0 +c print *,'irep=',irep,' nminima=',nminima(irep) +#ifdef MPL + if (Kwita.eq.0) call recv_stop_sig(kwita) +#endif + endif ! accepted + endif ! overlap +#ifdef MPL + if (MyID.eq.MasterID) then + call receive_MCM_info + if (nacc_tot.ge.maxacc) accepted=.true. + endif +#endif + if (ntrial.gt.maxtrial_iter .and. npool.gt.0) then +C Take a conformation from the pool + ii=iran_num(1,npool) + do i=1,nvar + varia(i)=xpool(i,ii) + enddo + write (iout,*) 'Iteration',it,' max. # of trials exceeded.' + write (iout,*) + & 'Take conformation',ii,' from the pool energy=',epool(ii) + if (print_mc.gt.2) + & write (iout,'(10f8.3)') (rad2deg*varia(i),i=1,nvar) + ntrial=0 + endif ! (ntrial.gt.maxtrial_iter .and. npool.gt.0) + 30 continue + enddo ! accepted +#ifdef MPL + if (MyID.eq.MasterID) then + call receive_MCM_info + endif + if (Kwita.eq.0) call recv_stop_sig(kwita) +#endif + if (ovrtim()) WhatsUp=-1 +cd write (iout,*) 'WhatsUp=',WhatsUp,' Kwita=',Kwita + not_done = (nacc_tot.lt.maxacc) .and. (WhatsUp.eq.0) + & .and. (Kwita.eq.0) +cd write (iout,*) 'not_done=',not_done +#ifdef MPL + if (Kwita.lt.0) then + print *,'Processor',MyID, + & ' has received STOP signal =',Kwita,' in EntSamp.' +cd print *,'not_done=',not_done + if (Kwita.lt.-1) WhatsUp=Kwita + else if (nacc_tot.ge.maxacc) then + print *,'Processor',MyID,' calls send_stop_sig,', + & ' because a sufficient # of confs. have been collected.' +cd print *,'not_done=',not_done + call send_stop_sig(-1) + else if (WhatsUp.eq.-1) then + print *,'Processor',MyID, + & ' calls send_stop_sig because of timeout.' +cd print *,'not_done=',not_done + call send_stop_sig(-2) + endif +#endif + enddo ! not_done + +C----------------------------------------------------------------- +C... Construct energy histogram & update entropy +C----------------------------------------------------------------- + go to 21 + 20 WhatsUp=-3 +#ifdef MPL + write (iout,*) 'Processor',MyID, + & ' is broadcasting ERROR-STOP signal.' + write (*,*) 'Processor',MyID, + & ' is broadcasting ERROR-STOP signal.' + call send_stop_sig(-3) +#endif + 21 continue +#ifdef MPL + if (MyID.eq.MasterID) then +c call receive_MCM_results + call receive_energies +#endif + do i=1,nsave + if (esave(i).lt.elowest) elowest=esave(i) + if (esave(i).gt.ehighest) ehighest=esave(i) + enddo + write (iout,'(a,i10)') '# of accepted confs:',nacc_tot + write (iout,'(a,f10.5,a,f10.5)') 'Lowest energy:',elowest, + & ' Highest energy',ehighest + if (isweep.eq.1 .and. .not.ent_read) then + emin=elowest + emax=ehighest + write (iout,*) 'EMAX=',emax + indminn=0 + indmaxx=(ehighest-emin)/delte + indmin=indminn + indmax=indmaxx + do i=-max_ene,max_ene + entropy(i)=(emin+i*delte)*betbol + enddo + ent_read=.true. + else + indmin=(elowest-emin)/delte + indmax=(ehighest-emin)/delte + if (indmin.lt.indminn) indminn=indmin + if (indmax.gt.indmaxx) indmaxx=indmax + endif + write(iout,*)'indminn=',indminn,' indmaxx=',indmaxx +C Construct energy histogram + do i=1,nsave + inde=(esave(i)-emin)/delte + nhist(inde)=nhist(inde)+nminima(i) + enddo +C Update entropy (density of states) + do i=indmin,indmax + if (nhist(i).gt.0) then + entropy(i)=entropy(i)+dlog(nhist(i)+0.0D0) + endif + enddo +Cd do i=indmaxx+1 +Cd entropy(i)=1.0D+10 +Cd enddo + write (iout,'(/80(1h*)/a,i2/80(1h*)/)') + & 'End of macroiteration',isweep + write (iout,'(a,f10.5,a,f10.5)') 'Elowest=',elowest, + & ' Ehighest=',ehighest + write (iout,'(a)') 'Frequecies of minima' + do i=1,nsave + write (iout,'(i5,f5.0,f10.5)') i,nminima(i),esave(i) + enddo + write (iout,'(/a)') 'Energy histogram' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,nhist(i) + enddo + write (iout,'(/a)') 'Entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo +C----------------------------------------------------------------- +C... End of energy histogram construction +C----------------------------------------------------------------- +#ifdef MPL + entropy(-max_ene-4)=dfloat(indminn) + entropy(-max_ene-3)=dfloat(indmaxx) + entropy(-max_ene-2)=emin + entropy(-max_ene-1)=emax + call send_MCM_update +cd print *,entname,ientout + open (ientout,file=entname,status='unknown') + write (ientout,'(2i5,2e25.17)') indminn,indmaxx,emin,emax + do i=indminn,indmaxx + write (ientout,'(i5,f10.5,f20.15)') i,emin+i*delte,entropy(i) + enddo + close(ientout) + else + write (iout,'(a)') 'Frequecies of minima' + do i=1,nsave + write (iout,'(i5,f5.0,f10.5)') i,nminima(i),esave(i) + enddo +c call send_MCM_results + call send_energies + call receive_MCM_update + indminn=entropy(-max_ene-4) + indmaxx=entropy(-max_ene-3) + emin=entropy(-max_ene-2) + emax=entropy(-max_ene-1) + write (iout,*) 'Received from master:' + write (iout,*) 'indminn=',indminn,' indmaxx=',indmaxx, + & ' emin=',emin,' emax=',emax + write (iout,'(/a)') 'Entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + endif + if (WhatsUp.lt.-1) return +#else + if (ovrtim() .or. WhatsUp.lt.0) return +#endif + + write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:' + call statprint(nacc,nfun,iretcode,etot,elowest) + write (iout,'(a)') + & 'Statistics of multiple-bond motions. Total motions:' + write (iout,'(16i5)') (nbond_move(i),i=1,Nbm) + write (iout,'(a)') 'Accepted motions:' + write (iout,'(16i5)') (nbond_acc(i),i=1,Nbm) + write (iout,'(a,i10)') 'Number of chain regrowths:',nregrow + write (iout,'(a,i10)') 'Accepted chain regrowths:',nregrow_acc + +C--------------------------------------------------------------------------- + ENDDO ! ISWEEP +C--------------------------------------------------------------------------- + + runtime=tcpu() + + if (isweep.eq.nsweep .and. it.ge.maxacc) + &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.' + return + end +c------------------------------------------------------------------------------ + subroutine accepting(ecur,eold,scur,sold,x,xold,accepted) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.GEO' + double precision ecur,eold,xx,ran_number,bol + double precision x(maxvar),xold(maxvar) + double precision tole /1.0D-1/, tola /5.0D0/ + logical accepted +C Check if the conformation is similar. +cd write (iout,*) 'Enter ACCEPTING' +cd write (iout,*) 'Old PHI angles:' +cd write (iout,*) (rad2deg*xold(i),i=1,nphi) +cd write (iout,*) 'Current angles' +cd write (iout,*) (rad2deg*x(i),i=1,nphi) +cd ddif=dif_ang(nphi,x,xold) +cd write (iout,*) 'Angle norm:',ddif +cd write (iout,*) 'ecur=',ecur,' emax=',emax + if (ecur.gt.emax) then + accepted=.false. + if (print_mc.gt.0) + & write (iout,'(a)') 'Conformation rejected as too high in energy' + return + else if (dabs(ecur-eold).lt.tole .and. + & dif_ang(nphi,x,xold).lt.tola) then + accepted=.false. + if (print_mc.gt.0) + & write (iout,'(a)') 'Conformation rejected as too similar' + return + endif +C Else evaluate the entropy of the conf and compare it with that of the previous +C one. + indecur=(ecur-emin)/delte + if (iabs(indecur).gt.max_ene) then + write (iout,'(a,2i5)') + & 'Accepting: Index out of range:',indecur + scur=1000.0D0 + else if (indecur.eq.indmaxx) then + scur=entropy(indecur) + if (print_mc.gt.0) write (iout,*)'Energy boundary reached', + & indmaxx,indecur,entropy(indecur) + else + deix=ecur-(emin+indecur*delte) + dent=entropy(indecur+1)-entropy(indecur) + scur=entropy(indecur)+(dent/delte)*deix + endif +cd print *,'Processor',MyID,' ecur=',ecur,' indecur=',indecur, +cd & ' scur=',scur,' eold=',eold,' sold=',sold +cd print *,'deix=',deix,' dent=',dent,' delte=',delte + if (print_mc.gt.1) then + write(iout,*)'ecur=',ecur,' indecur=',indecur,' scur=',scur + write(iout,*)'eold=',eold,' sold=',sold + endif + if (scur.le.sold) then + accepted=.true. + else +C Else carry out acceptance test + xx=ran_number(0.0D0,1.0D0) + xxh=scur-sold + if (xxh.gt.50.0D0) then + bol=0.0D0 + else + bol=exp(-xxh) + endif + if (bol.gt.xx) then + accepted=.true. + if (print_mc.gt.0) write (iout,'(a)') + & 'Conformation accepted.' + else + accepted=.false. + if (print_mc.gt.0) write (iout,'(a)') + & 'Conformation rejected.' + endif + endif + return + end +c----------------------------------------------------------------------------- + subroutine read_pool + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.VAR' + double precision varia(maxvar) + print '(a)','Call READ_POOL' + do npool=1,max_pool + print *,'i=',i + read (intin,'(i5,f10.5)',end=10,err=10) iconf,epool(npool) + if (epool(npool).eq.0.0D0) goto 10 + call read_angles(intin,*10) + call geom_to_var(nvar,xpool(1,npool)) + enddo + goto 11 + 10 npool=npool-1 + 11 write (iout,'(a,i5)') 'Number of pool conformations:',npool + if (print_mc.gt.2) then + do i=1,npool + write (iout,'(a,i5,a,1pe14.5)') 'Pool conformation',i,' energy', + & epool(i) + write (iout,'(10f8.3)') (rad2deg*xpool(j,i),j=1,nvar) + enddo + endif ! (print_mc.gt.2) + return + end diff --git a/source/unres/src_MD-NEWSC/fitsq.f b/source/unres/src_MD-NEWSC/fitsq.f new file mode 100644 index 0000000..36cbd30 --- /dev/null +++ b/source/unres/src_MD-NEWSC/fitsq.f @@ -0,0 +1,364 @@ + subroutine fitsq(rms,x,y,nn,t,b,non_conv) + implicit real*8 (a-h,o-z) + include 'COMMON.IOUNITS' +c x and y are the vectors of coordinates (dimensioned (3,n)) of the two +c structures to be superimposed. nn is 3*n, where n is the number of +c points. t and b are respectively the translation vector and the +c rotation matrix that transforms the second set of coordinates to the +c frame of the first set. +c eta = machine-specific variable + + dimension x(3*nn),y(3*nn),t(3) + dimension b(3,3),q(3,3),r(3,3),v(3),xav(3),yav(3),e(3),c(3,3) + logical non_conv +c eta = z00100000 +c small=25.0*rmdcon(3) +c small=25.0*eta +c small=25.0*10.e-10 +c the following is a very lenient value for 'small' + small = 0.0001D0 + non_conv=.false. + fn=nn + do 10 i=1,3 + xav(i)=0.0D0 + yav(i)=0.0D0 + do 10 j=1,3 + 10 b(j,i)=0.0D0 + nc=0 +c + do 30 n=1,nn + do 20 i=1,3 +c write(iout,*)'x = ',x(nc+i),' y = ',y(nc+i) + xav(i)=xav(i)+x(nc+i)/fn + 20 yav(i)=yav(i)+y(nc+i)/fn + 30 nc=nc+3 +c + do i=1,3 + t(i)=yav(i)-xav(i) + enddo + + rms=0.0d0 + do n=1,nn + do i=1,3 + rms=rms+(y(3*(n-1)+i)-x(3*(n-1)+i)-t(i))**2 + enddo + enddo + rms=dabs(rms/fn) + +c write(iout,*)'xav = ',(xav(j),j=1,3) +c write(iout,*)'yav = ',(yav(j),j=1,3) +c write(iout,*)'t = ',(t(j),j=1,3) +c write(iout,*)'rms=',rms + if (rms.lt.small) return + + + nc=0 + rms=0.0D0 + do 50 n=1,nn + do 40 i=1,3 + rms=rms+((x(nc+i)-xav(i))**2+(y(nc+i)-yav(i))**2)/fn + do 40 j=1,3 + b(j,i)=b(j,i)+(x(nc+i)-xav(i))*(y(nc+j)-yav(j))/fn + 40 c(j,i)=b(j,i) + 50 nc=nc+3 + call sivade(b,q,r,d,non_conv) + sn3=dsign(1.0d0,d) + do 120 i=1,3 + do 120 j=1,3 + 120 b(j,i)=-q(j,1)*r(i,1)-q(j,2)*r(i,2)-sn3*q(j,3)*r(i,3) + call mvvad(b,xav,yav,t) + do 130 i=1,3 + do 130 j=1,3 + rms=rms+2.0*c(j,i)*b(j,i) + 130 b(j,i)=-b(j,i) + if (dabs(rms).gt.small) go to 140 +* write (6,301) + return + 140 if (rms.gt.0.0d0) go to 150 +c write (iout,303) rms + rms=0.0d0 +* stop +c 150 write (iout,302) dsqrt(rms) + 150 continue + return + 301 format (5x,'rms deviation negligible') + 302 format (5x,'rms deviation ',f14.6) + 303 format (//,5x,'negative ms deviation - ',f14.6) + end +c + subroutine sivade(x,q,r,dt,non_conv) + implicit real*8(a-h,o-z) +c computes q,e and r such that q(t)xr = diag(e) + dimension x(3,3),q(3,3),r(3,3),e(3) + dimension h(3,3),p(3,3),u(3,3),d(3) + logical non_conv +c eta = z00100000 +c write (2,*) "SIVADE" + nit = 0 + small=25.0*10.d-10 +c small=25.0*eta +c small=2.0*rmdcon(3) + xnrm=0.0d0 + do 20 i=1,3 + do 10 j=1,3 + xnrm=xnrm+x(j,i)*x(j,i) + u(j,i)=0.0d0 + r(j,i)=0.0d0 + 10 h(j,i)=0.0d0 + u(i,i)=1.0 + 20 r(i,i)=1.0 + xnrm=dsqrt(xnrm) + do 110 n=1,2 + xmax=0.0d0 + do 30 j=n,3 + 30 if (dabs(x(j,n)).gt.xmax) xmax=dabs(x(j,n)) + a=0.0d0 + do 40 j=n,3 + h(j,n)=x(j,n)/xmax + 40 a=a+h(j,n)*h(j,n) + a=dsqrt(a) + den=a*(a+dabs(h(n,n))) + d(n)=1.0/den + h(n,n)=h(n,n)+dsign(a,h(n,n)) + do 70 i=n,3 + s=0.0d0 + do 50 j=n,3 + 50 s=s+h(j,n)*x(j,i) + s=d(n)*s + do 60 j=n,3 + 60 x(j,i)=x(j,i)-s*h(j,n) + 70 continue + if (n.gt.1) go to 110 + xmax=dmax1(dabs(x(1,2)),dabs(x(1,3))) + h(2,3)=x(1,2)/xmax + h(3,3)=x(1,3)/xmax + a=dsqrt(h(2,3)*h(2,3)+h(3,3)*h(3,3)) + den=a*(a+dabs(h(2,3))) + d(3)=1.0/den + h(2,3)=h(2,3)+sign(a,h(2,3)) + do 100 i=1,3 + s=0.0d0 + do 80 j=2,3 + 80 s=s+h(j,3)*x(i,j) + s=d(3)*s + do 90 j=2,3 + 90 x(i,j)=x(i,j)-s*h(j,3) + 100 continue + 110 continue + do 130 i=1,3 + do 120 j=1,3 + 120 p(j,i)=-d(1)*h(j,1)*h(i,1) + 130 p(i,i)=1.0+p(i,i) + do 140 i=2,3 + do 140 j=2,3 + u(j,i)=u(j,i)-d(2)*h(j,2)*h(i,2) + 140 r(j,i)=r(j,i)-d(3)*h(j,3)*h(i,3) + call mmmul(p,u,q) + 150 np=1 + nq=1 + nit=nit+1 +c write (2,*) "nit",nit," e",(x(i,i),i=1,3) + if (nit.gt.10000) then + print '(a)','!!!! Over 10000 iterations in SIVADE!!!!!' + non_conv=.true. + return + endif + if (dabs(x(2,3)).gt.small*(dabs(x(2,2))+abs(x(3,3)))) go to 160 + x(2,3)=0.0d0 + nq=nq+1 + 160 if (dabs(x(1,2)).gt.small*(dabs(x(1,1))+dabs(x(2,2)))) go to 180 + x(1,2)=0.0d0 + if (x(2,3).ne.0.0d0) go to 170 + nq=nq+1 + go to 180 + 170 np=np+1 + 180 if (nq.eq.3) go to 310 + npq=4-np-nq +c write (2,*) "np",np," npq",npq + if (np.gt.npq) go to 230 + n0=0 + do 220 n=np,npq + nn=n+np-1 +c write (2,*) "nn",nn + if (dabs(x(nn,nn)).gt.small*xnrm) go to 220 + x(nn,nn)=0.0d0 + if (x(nn,nn+1).eq.0.0d0) go to 220 + n0=n0+1 +c write (2,*) "nn",nn + go to (190,210,220),nn + 190 do 200 j=2,3 + 200 call givns(x,q,1,j) + go to 220 + 210 call givns(x,q,2,3) + 220 continue +c write (2,*) "nn",nn," np",np," nq",nq," n0",n0 +c write (2,*) "x",(x(i,i),i=1,3) + if (n0.ne.0) go to 150 + 230 nn=3-nq + a=x(nn,nn)*x(nn,nn) + if (nn.gt.1) a=a+x(nn-1,nn)*x(nn-1,nn) + b=x(nn+1,nn+1)*x(nn+1,nn+1)+x(nn,nn+1)*x(nn,nn+1) + c=x(nn,nn)*x(nn,nn+1) + dd=0.5*(a-b) + xn2=c*c + rt=b-xn2/(dd+sign(dsqrt(dd*dd+xn2),dd)) + y=x(np,np)*x(np,np)-rt + z=x(np,np)*x(np,np+1) + do 300 n=np,nn +c write (2,*) "n",n," a",a," b",b," c",c," y",y," z",z + if (dabs(y).lt.dabs(z)) go to 240 + t=z/y + c=1.0/dsqrt(1.0d0+t*t) + s=c*t + go to 250 + 240 t=y/z + s=1.0/dsqrt(1.0d0+t*t) + c=s*t + 250 do 260 j=1,3 + v=x(j,n) + w=x(j,n+1) + x(j,n)=c*v+s*w + x(j,n+1)=-s*v+c*w + a=r(j,n) + b=r(j,n+1) + r(j,n)=c*a+s*b + 260 r(j,n+1)=-s*a+c*b + y=x(n,n) + z=x(n+1,n) + if (dabs(y).lt.dabs(z)) go to 270 + t=z/y + c=1.0/dsqrt(1.0+t*t) + s=c*t + go to 280 + 270 t=y/z + s=1.0/dsqrt(1.0+t*t) + c=s*t + 280 do 290 j=1,3 + v=x(n,j) + w=x(n+1,j) + a=q(j,n) + b=q(j,n+1) + x(n,j)=c*v+s*w + x(n+1,j)=-s*v+c*w + q(j,n)=c*a+s*b + 290 q(j,n+1)=-s*a+c*b + if (n.ge.nn) go to 300 + y=x(n,n+1) + z=x(n,n+2) + 300 continue + go to 150 + 310 do 320 i=1,3 + 320 e(i)=x(i,i) + nit=0 + 330 n0=0 + nit=nit+1 + if (nit.gt.10000) then + print '(a)','!!!! Over 10000 iterations in SIVADE!!!!!' + non_conv=.true. + return + endif +c write (2,*) "e",(e(i),i=1,3) + do 360 i=1,3 + if (e(i).ge.0.0d0) go to 350 + e(i)=-e(i) + do 340 j=1,3 + 340 q(j,i)=-q(j,i) + 350 if (i.eq.1) go to 360 + if (dabs(e(i)).lt.dabs(e(i-1))) go to 360 + call switch(i,1,q,r,e) + n0=n0+1 + 360 continue + if (n0.ne.0) go to 330 +c write (2,*) "e",(e(i),i=1,3) + if (dabs(e(3)).gt.small*xnrm) go to 370 + e(3)=0.0d0 + if (dabs(e(2)).gt.small*xnrm) go to 370 + e(2)=0.0d0 + 370 dt=det(q(1,1),q(1,2),q(1,3))*det(r(1,1),r(1,2),r(1,3)) +c write (2,*) "nit",nit +c write (2,501) (e(i),i=1,3) + return + 501 format (/,5x,'singular values - ',3e15.5) + end + subroutine givns(a,b,m,n) + implicit real*8 (a-h,o-z) + dimension a(3,3),b(3,3) + if (dabs(a(m,n)).lt.dabs(a(n,n))) go to 10 + t=a(n,n)/a(m,n) + s=1.0/dsqrt(1.0+t*t) + c=s*t + go to 20 + 10 t=a(m,n)/a(n,n) + c=1.0/dsqrt(1.0+t*t) + s=c*t + 20 do 30 j=1,3 + v=a(m,j) + w=a(n,j) + x=b(j,m) + y=b(j,n) + a(m,j)=c*v-s*w + a(n,j)=s*v+c*w + b(j,m)=c*x-s*y + 30 b(j,n)=s*x+c*y + return + end + subroutine switch(n,m,u,v,d) + implicit real*8 (a-h,o-z) + dimension u(3,3),v(3,3),d(3) + do 10 i=1,3 + tem=u(i,n) + u(i,n)=u(i,n-1) + u(i,n-1)=tem + if (m.eq.0) go to 10 + tem=v(i,n) + v(i,n)=v(i,n-1) + v(i,n-1)=tem + 10 continue + tem=d(n) + d(n)=d(n-1) + d(n-1)=tem + return + end + subroutine mvvad(b,xav,yav,t) + implicit real*8 (a-h,o-z) + dimension b(3,3),xav(3),yav(3),t(3) +c dimension a(3,3),b(3),c(3),d(3) +c do 10 j=1,3 +c d(j)=c(j) +c do 10 i=1,3 +c 10 d(j)=d(j)+a(j,i)*b(i) + do 10 j=1,3 + t(j)=yav(j) + do 10 i=1,3 + 10 t(j)=t(j)+b(j,i)*xav(i) + return + end + double precision function det (a,b,c) + implicit real*8 (a-h,o-z) + dimension a(3),b(3),c(3) + det=a(1)*(b(2)*c(3)-b(3)*c(2))+a(2)*(b(3)*c(1)-b(1)*c(3)) + 1 +a(3)*(b(1)*c(2)-b(2)*c(1)) + return + end + subroutine mmmul(a,b,c) + implicit real*8 (a-h,o-z) + dimension a(3,3),b(3,3),c(3,3) + do 10 i=1,3 + do 10 j=1,3 + c(i,j)=0.0d0 + do 10 k=1,3 + 10 c(i,j)=c(i,j)+a(i,k)*b(k,j) + return + end + subroutine matvec(uvec,tmat,pvec,nback) + implicit real*8 (a-h,o-z) + real*8 tmat(3,3),uvec(3,nback), pvec(3,nback) +c + do 2 j=1,nback + do 1 i=1,3 + uvec(i,j) = 0.0d0 + do 1 k=1,3 + 1 uvec(i,j)=uvec(i,j)+tmat(i,k)*pvec(k,j) + 2 continue + return + end diff --git a/source/unres/src_MD-NEWSC/gauss.f b/source/unres/src_MD-NEWSC/gauss.f new file mode 100644 index 0000000..7ba6e1d --- /dev/null +++ b/source/unres/src_MD-NEWSC/gauss.f @@ -0,0 +1,69 @@ + subroutine gauss(RO,AP,MT,M,N,*) +c +c CALCULATES (RO**(-1))*AP BY GAUSS ELIMINATION +c RO IS A SQUARE MATRIX +c THE CALCULATED PRODUCT IS STORED IN AP +c ABNORMAL EXIT IF RO IS SINGULAR +c + integer MT, M, N, M1,I,J,IM, + & I1,MI,MI1 + double precision RO(MT,M),AP(MT,N),X,RM,PR, + & Y + if(M.ne.1)goto 10 + X=RO(1,1) + if(dabs(X).le.1.0D-13) return 1 + X=1.0/X + do 16 I=1,N +16 AP(1,I)=AP(1,I)*X + return +10 continue + M1=M-1 + DO1 I=1,M1 + IM=I + RM=DABS(RO(I,I)) + I1=I+1 + do 2 J=I1,M + if(DABS(RO(J,I)).LE.RM) goto 2 + RM=DABS(RO(J,I)) + IM=J +2 continue + If(IM.eq.I)goto 17 + do 3 J=1,N + PR=AP(I,J) + AP(I,J)=AP(IM,J) +3 AP(IM,J)=PR + do 4 J=I,M + PR=RO(I,J) + RO(I,J)=RO(IM,J) +4 RO(IM,J)=PR +17 X=RO(I,I) + if(dabs(X).le.1.0E-13) return 1 + X=1.0/X + do 5 J=1,N +5 AP(I,J)=X*AP(I,J) + do 6 J=I1,M +6 RO(I,J)=X*RO(I,J) + do 7 J=I1,M + Y=RO(J,I) + do 8 K=1,N +8 AP(J,K)=AP(J,K)-Y*AP(I,K) + do 9 K=I1,M +9 RO(J,K)=RO(J,K)-Y*RO(I,K) +7 continue +1 continue + X=RO(M,M) + if(dabs(X).le.1.0E-13) return 1 + X=1.0/X + do 11 J=1,N +11 AP(M,J)=X*AP(M,J) + do 12 I=1,M1 + MI=M-I + MI1=MI+1 + do 14 J=1,N + X=AP(MI,J) + do 15 K=MI1,M +15 X=X-AP(K,J)*RO(MI,K) +14 AP(MI,J)=X +12 continue + return + end diff --git a/source/unres/src_MD-NEWSC/gen_rand_conf.F b/source/unres/src_MD-NEWSC/gen_rand_conf.F new file mode 100644 index 0000000..6cc31ba --- /dev/null +++ b/source/unres/src_MD-NEWSC/gen_rand_conf.F @@ -0,0 +1,910 @@ + subroutine gen_rand_conf(nstart,*) +C Generate random conformation or chain cut and regrowth. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.MCM' + include 'COMMON.GEO' + include 'COMMON.CONTROL' + logical overlap,back,fail +cd print *,' CG Processor',me,' maxgen=',maxgen + maxsi=100 +cd write (iout,*) 'Gen_Rand_conf: nstart=',nstart + if (nstart.lt.5) then + it1=itype(2) + phi(4)=gen_phi(4,itype(2),itype(3)) +c write(iout,*)'phi(4)=',rad2deg*phi(4) + if (nstart.lt.3) theta(3)=gen_theta(itype(2),pi,phi(4)) +c write(iout,*)'theta(3)=',rad2deg*theta(3) + if (it1.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(it1,theta(3),alph(2),omeg(2),fail) + nsi=nsi+1 + enddo + if (nsi.gt.maxsi) return1 + endif ! it1.ne.10 + call orig_frame + i=4 + nstart=4 + else + i=nstart + nstart=max0(i,4) + endif + + maxnit=0 + + nit=0 + niter=0 + back=.false. + do while (i.le.nres .and. niter.lt.maxgen) + if (i.lt.nstart) then + if(iprint.gt.1) then + write (iout,'(/80(1h*)/2a/80(1h*))') + & 'Generation procedure went down to ', + & 'chain beginning. Cannot continue...' + write (*,'(/80(1h*)/2a/80(1h*))') + & 'Generation procedure went down to ', + & 'chain beginning. Cannot continue...' + endif + return1 + endif + it1=itype(i-1) + it2=itype(i-2) + it=itype(i) +c print *,'Gen_Rand_Conf: i=',i,' it=',it,' it1=',it1,' it2=',it2, +c & ' nit=',nit,' niter=',niter,' maxgen=',maxgen + phi(i+1)=gen_phi(i+1,it1,it) + if (back) then + phi(i)=gen_phi(i+1,it2,it1) +c print *,'phi(',i,')=',phi(i) + theta(i-1)=gen_theta(it2,phi(i-1),phi(i)) + if (it2.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(it2,theta(i-1),alph(i-2),omeg(i-2),fail) + nsi=nsi+1 + enddo + if (nsi.gt.maxsi) return1 + endif + call locate_next_res(i-1) + endif + theta(i)=gen_theta(it1,phi(i),phi(i+1)) + if (it1.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(it1,theta(i),alph(i-1),omeg(i-1),fail) + nsi=nsi+1 + enddo + if (nsi.gt.maxsi) return1 + endif + call locate_next_res(i) + if (overlap(i-1)) then + if (nit.lt.maxnit) then + back=.true. + nit=nit+1 + else + nit=0 + if (i.gt.3) then + back=.true. + i=i-1 + else + write (iout,'(a)') + & 'Cannot generate non-overlaping conformation. Increase MAXNIT.' + write (*,'(a)') + & 'Cannot generate non-overlaping conformation. Increase MAXNIT.' + return1 + endif + endif + else + back=.false. + nit=0 + i=i+1 + endif + niter=niter+1 + enddo + if (niter.ge.maxgen) then + write (iout,'(a,2i5)') + & 'Too many trials in conformation generation',niter,maxgen + write (*,'(a,2i5)') + & 'Too many trials in conformation generation',niter,maxgen + return1 + endif + do j=1,3 + c(j,nres+1)=c(j,1) + c(j,nres+nres)=c(j,nres) + enddo + return + end +c------------------------------------------------------------------------- + logical function overlap(i) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + data redfac /0.5D0/ + overlap=.false. + iti=itype(i) + if (iti.gt.ntyp) return +C Check for SC-SC overlaps. +cd print *,'nnt=',nnt,' nct=',nct + do j=nnt,i-1 + itj=itype(j) + if (j.lt.i-1 .or. ipot.ne.4) then + rcomp=sigmaii(iti,itj) + else + rcomp=sigma(iti,itj) + endif +cd print *,'j=',j + if (dist(nres+i,nres+j).lt.redfac*rcomp) then + overlap=.true. +c print *,'overlap, SC-SC: i=',i,' j=',j, +c & ' dist=',dist(nres+i,nres+j),' rcomp=', +c & rcomp + return + endif + enddo +C Check for overlaps between the added peptide group and the preceding +C SCs. + iteli=itel(i) + do j=1,3 + c(j,maxres2+1)=0.5D0*(c(j,i)+c(j,i+1)) + enddo + do j=nnt,i-2 + itj=itype(j) +cd print *,'overlap, p-Sc: i=',i,' j=',j, +cd & ' dist=',dist(nres+j,maxres2+1) + if (dist(nres+j,maxres2+1).lt.4.0D0*redfac) then + overlap=.true. + return + endif + enddo +C Check for overlaps between the added side chain and the preceding peptide +C groups. + do j=1,nnt-2 + do k=1,3 + c(k,maxres2+1)=0.5D0*(c(k,j)+c(k,j+1)) + enddo +cd print *,'overlap, SC-p: i=',i,' j=',j, +cd & ' dist=',dist(nres+i,maxres2+1) + if (dist(nres+i,maxres2+1).lt.4.0D0*redfac) then + overlap=.true. + return + endif + enddo +C Check for p-p overlaps + do j=1,3 + c(j,maxres2+2)=0.5D0*(c(j,i)+c(j,i+1)) + enddo + do j=nnt,i-2 + itelj=itel(j) + do k=1,3 + c(k,maxres2+2)=0.5D0*(c(k,j)+c(k,j+1)) + enddo +cd print *,'overlap, p-p: i=',i,' j=',j, +cd & ' dist=',dist(maxres2+1,maxres2+2) + if(iteli.ne.0.and.itelj.ne.0)then + if (dist(maxres2+1,maxres2+2).lt.rpp(iteli,itelj)*redfac) then + overlap=.true. + return + endif + endif + enddo + return + end +c-------------------------------------------------------------------------- + double precision function gen_phi(i,it1,it2) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.BOUNDS' +c gen_phi=ran_number(-pi,pi) +C 8/13/98 Generate phi using pre-defined boundaries + gen_phi=ran_number(phibound(1,i),phibound(2,i)) + return + end +c--------------------------------------------------------------------------- + double precision function gen_theta(it,gama,gama1) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + double precision y(2),z(2) + double precision theta_max,theta_min +c print *,'gen_theta: it=',it + theta_min=0.05D0*pi + theta_max=0.95D0*pi + if (dabs(gama).gt.dwapi) then + y(1)=dcos(gama) + y(2)=dsin(gama) + else + y(1)=0.0D0 + y(2)=0.0D0 + endif + if (dabs(gama1).gt.dwapi) then + z(1)=dcos(gama1) + z(2)=dsin(gama1) + else + z(1)=0.0D0 + z(2)=0.0D0 + endif + thet_pred_mean=a0thet(it) + do k=1,2 + thet_pred_mean=thet_pred_mean+athet(k,it)*y(k)+bthet(k,it)*z(k) + enddo + sig=polthet(3,it) + do j=2,0,-1 + sig=sig*thet_pred_mean+polthet(j,it) + enddo + sig=0.5D0/(sig*sig+sigc0(it)) + ak=dexp(gthet(1,it)- + &0.5D0*((gthet(2,it)-thet_pred_mean)/gthet(3,it))**2) +c print '(i5,5(1pe14.4))',it,(gthet(j,it),j=1,3) +c print '(5(1pe14.4))',thet_pred_mean,theta0(it),sig,sig0(it),ak + theta_temp=binorm(thet_pred_mean,theta0(it),sig,sig0(it),ak) + if (theta_temp.lt.theta_min) theta_temp=theta_min + if (theta_temp.gt.theta_max) theta_temp=theta_max + gen_theta=theta_temp +c print '(a)','Exiting GENTHETA.' + return + end +c------------------------------------------------------------------------- + subroutine gen_side(it,the,al,om,fail) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision MaxBoxLen /10.0D0/ + double precision Ap_inv(3,3),a(3,3),z(3,maxlob),W1(maxlob), + & sumW(0:maxlob),y(2),cm(2),eig(2),box(2,2),work(100),detAp(maxlob) + double precision eig_limit /1.0D-8/ + double precision Big /10.0D0/ + double precision vec(3,3) + logical lprint,fail,lcheck + lcheck=.false. + lprint=.false. + fail=.false. + if (the.eq.0.0D0 .or. the.eq.pi) then +#ifdef MPI + write (*,'(a,i4,a,i3,a,1pe14.5)') + & 'CG Processor:',me,' Error in GenSide: it=',it,' theta=',the +#else +cd write (iout,'(a,i3,a,1pe14.5)') +cd & 'Error in GenSide: it=',it,' theta=',the +#endif + fail=.true. + return + endif + tant=dtan(the-pipol) + nlobit=nlob(it) + if (lprint) then +#ifdef MPI + print '(a,i4,a)','CG Processor:',me,' Enter Gen_Side.' + write (iout,'(a,i4,a)') 'Processor:',me,' Enter Gen_Side.' +#endif + print *,'it=',it,' nlobit=',nlobit,' the=',the,' tant=',tant + write (iout,*) 'it=',it,' nlobit=',nlobit,' the=',the, + & ' tant=',tant + endif + do i=1,nlobit + zz1=tant-censc(1,i,it) + do k=1,3 + do l=1,3 + a(k,l)=gaussc(k,l,i,it) + enddo + enddo + detApi=a(2,2)*a(3,3)-a(2,3)**2 + Ap_inv(2,2)=a(3,3)/detApi + Ap_inv(2,3)=-a(2,3)/detApi + Ap_inv(3,2)=Ap_inv(2,3) + Ap_inv(3,3)=a(2,2)/detApi + if (lprint) then + write (*,'(/a,i2/)') 'Cluster #',i + write (*,'(3(1pe14.5),5x,1pe14.5)') + & ((a(l,k),l=1,3),censc(k,i,it),k=1,3) + write (iout,'(/a,i2/)') 'Cluster #',i + write (iout,'(3(1pe14.5),5x,1pe14.5)') + & ((a(l,k),l=1,3),censc(k,i,it),k=1,3) + endif + W1i=0.0D0 + do k=2,3 + do l=2,3 + W1i=W1i+a(k,1)*a(l,1)*Ap_inv(k,l) + enddo + enddo + W1i=a(1,1)-W1i + W1(i)=dexp(bsc(i,it)-0.5D0*W1i*zz1*zz1) +c if (lprint) write(*,'(a,3(1pe15.5)/)') +c & 'detAp, W1, anormi',detApi,W1i,anormi + do k=2,3 + zk=censc(k,i,it) + do l=2,3 + zk=zk+zz1*Ap_inv(k,l)*a(l,1) + enddo + z(k,i)=zk + enddo + detAp(i)=dsqrt(detApi) + enddo + + if (lprint) then + print *,'W1:',(w1(i),i=1,nlobit) + print *,'detAp:',(detAp(i),i=1,nlobit) + print *,'Z' + do i=1,nlobit + print '(i2,3f10.5)',i,(rad2deg*z(j,i),j=2,3) + enddo + write (iout,*) 'W1:',(w1(i),i=1,nlobit) + write (iout,*) 'detAp:',(detAp(i),i=1,nlobit) + write (iout,*) 'Z' + do i=1,nlobit + write (iout,'(i2,3f10.5)') i,(rad2deg*z(j,i),j=2,3) + enddo + endif + if (lcheck) then +C Writing the distribution just to check the procedure + fac=0.0D0 + dV=deg2rad**2*10.0D0 + sum=0.0D0 + sum1=0.0D0 + do i=1,nlobit + fac=fac+W1(i)/detAp(i) + enddo + fac=1.0D0/(2.0D0*fac*pi) +cd print *,it,'fac=',fac + do ial=90,180,2 + y(1)=deg2rad*ial + do iom=-180,180,5 + y(2)=deg2rad*iom + wart=0.0D0 + do i=1,nlobit + do j=2,3 + do k=2,3 + a(j-1,k-1)=gaussc(j,k,i,it) + enddo + enddo + y2=y(2) + + do iii=-1,1 + + y(2)=y2+iii*dwapi + + wykl=0.0D0 + do j=1,2 + do k=1,2 + wykl=wykl+a(j,k)*(y(j)-z(j+1,i))*(y(k)-z(k+1,i)) + enddo + enddo + wart=wart+W1(i)*dexp(-0.5D0*wykl) + + enddo + + y(2)=y2 + + enddo +c print *,'y',y(1),y(2),' fac=',fac + wart=fac*wart + write (20,'(2f10.3,1pd15.5)') y(1)*rad2deg,y(2)*rad2deg,wart + sum=sum+wart + sum1=sum1+1.0D0 + enddo + enddo +c print *,'it=',it,' sum=',sum*dV,' sum1=',sum1*dV + return + endif + +C Calculate the CM of the system +C + do i=1,nlobit + W1(i)=W1(i)/detAp(i) + enddo + sumW(0)=0.0D0 + do i=1,nlobit + sumW(i)=sumW(i-1)+W1(i) + enddo + cm(1)=z(2,1)*W1(1) + cm(2)=z(3,1)*W1(1) + do j=2,nlobit + cm(1)=cm(1)+z(2,j)*W1(j) + cm(2)=cm(2)+W1(j)*(z(3,1)+pinorm(z(3,j)-z(3,1))) + enddo + cm(1)=cm(1)/sumW(nlobit) + cm(2)=cm(2)/sumW(nlobit) + if (cm(1).gt.Big .or. cm(1).lt.-Big .or. + & cm(2).gt.Big .or. cm(2).lt.-Big) then +cd write (iout,'(a)') +cd & 'Unexpected error in GenSide - CM coordinates too large.' +cd write (iout,'(i5,2(1pe14.5))') it,cm(1),cm(2) +cd write (*,'(a)') +cd & 'Unexpected error in GenSide - CM coordinates too large.' +cd write (*,'(i5,2(1pe14.5))') it,cm(1),cm(2) + fail=.true. + return + endif +cd print *,'CM:',cm(1),cm(2) +C +C Find the largest search distance from CM +C + radmax=0.0D0 + do i=1,nlobit + do j=2,3 + do k=2,3 + a(j-1,k-1)=gaussc(j,k,i,it) + enddo + enddo +#ifdef NAG + call f02faf('N','U',2,a,3,eig,work,100,ifail) +#else + call djacob(2,3,10000,1.0d-10,a,vec,eig) +#endif +#ifdef MPI + if (lprint) then + print *,'*************** CG Processor',me + print *,'CM:',cm(1),cm(2) + write (iout,*) '*************** CG Processor',me + write (iout,*) 'CM:',cm(1),cm(2) + print '(A,8f10.5)','Eigenvalues: ',(1.0/dsqrt(eig(k)),k=1,2) + write (iout,'(A,8f10.5)') + & 'Eigenvalues: ',(1.0/dsqrt(eig(k)),k=1,2) + endif +#endif + if (eig(1).lt.eig_limit) then + write(iout,'(a)') + & 'From Mult_Norm: Eigenvalues of A are too small.' + write(*,'(a)') + & 'From Mult_Norm: Eigenvalues of A are too small.' + fail=.true. + return + endif + radius=0.0D0 +cd print *,'i=',i + do j=1,2 + radius=radius+pinorm(z(j+1,i)-cm(j))**2 + enddo + radius=dsqrt(radius)+3.0D0/dsqrt(eig(1)) + if (radius.gt.radmax) radmax=radius + enddo + if (radmax.gt.pi) radmax=pi +C +C Determine the boundaries of the search rectangle. +C + if (lprint) then + print '(a,4(1pe14.4))','W1: ',(W1(i),i=1,nlob(it) ) + print '(a,4(1pe14.4))','radmax: ',radmax + endif + box(1,1)=dmax1(cm(1)-radmax,0.0D0) + box(2,1)=dmin1(cm(1)+radmax,pi) + box(1,2)=cm(2)-radmax + box(2,2)=cm(2)+radmax + if (lprint) then +#ifdef MPI + print *,'CG Processor',me,' Array BOX:' +#else + print *,'Array BOX:' +#endif + print '(4(1pe14.4))',((box(k,j),k=1,2),j=1,2) + print '(a,4(1pe14.4))','sumW: ',(sumW(i),i=0,nlob(it) ) +#ifdef MPI + write (iout,*)'CG Processor',me,' Array BOX:' +#else + write (iout,*)'Array BOX:' +#endif + write(iout,'(4(1pe14.4))') ((box(k,j),k=1,2),j=1,2) + write(iout,'(a,4(1pe14.4))')'sumW: ',(sumW(i),i=0,nlob(it) ) + endif + if (box(1,2).lt.-MaxBoxLen .or. box(2,2).gt.MaxBoxLen) then +#ifdef MPI + write (iout,'(a,i4,a)') 'CG Processor:',me,': bad sampling box.' + write (*,'(a,i4,a)') 'CG Processor:',me,': bad sampling box.' +#else +c write (iout,'(a)') 'Bad sampling box.' +#endif + fail=.true. + return + endif + which_lobe=ran_number(0.0D0,sumW(nlobit)) +c print '(a,1pe14.4)','which_lobe=',which_lobe + do i=1,nlobit + if (sumW(i-1).le.which_lobe .and. sumW(i).ge.which_lobe) goto 1 + enddo + 1 ilob=i +c print *,'ilob=',ilob,' nlob=',nlob(it) + do i=2,3 + cm(i-1)=z(i,ilob) + do j=2,3 + a(i-1,j-1)=gaussc(i,j,ilob,it) + enddo + enddo +cd print '(a,i4,a)','CG Processor',me,' Calling MultNorm1.' + call mult_norm1(3,2,a,cm,box,y,fail) + if (fail) return + al=y(1) + om=pinorm(y(2)) +cd print *,'al=',al,' om=',om +cd stop + return + end +c--------------------------------------------------------------------------- + double precision function ran_number(x1,x2) +C Calculate a random real number from the range (x1,x2). + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + double precision x1,x2,fctor + data fctor /2147483647.0D0/ +#ifdef MPI + include "mpif.h" + include 'COMMON.SETUP' + ran_number=x1+(x2-x1)*prng_next(me) +#else + call vrnd(ix,1) + ran_number=x1+(x2-x1)*ix/fctor +#endif + return + end +c-------------------------------------------------------------------------- + integer function iran_num(n1,n2) +C Calculate a random integer number from the range (n1,n2). + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer n1,n2,ix + real fctor /2147483647.0/ +#ifdef MPI + include "mpif.h" + include 'COMMON.SETUP' + ix=n1+(n2-n1+1)*prng_next(me) + if (ix.lt.n1) ix=n1 + if (ix.gt.n2) ix=n2 + iran_num=ix +#else + call vrnd(ix,1) + ix=n1+(n2-n1+1)*(ix/fctor) + if (ix.gt.n2) ix=n2 + iran_num=ix +#endif + return + end +c-------------------------------------------------------------------------- + double precision function binorm(x1,x2,sigma1,sigma2,ak) + implicit real*8 (a-h,o-z) +c print '(a)','Enter BINORM.' + alowb=dmin1(x1-3.0D0*sigma1,x2-3.0D0*sigma2) + aupb=dmax1(x1+3.0D0*sigma1,x2+3.0D0*sigma2) + seg=sigma1/(sigma1+ak*sigma2) + alen=ran_number(0.0D0,1.0D0) + if (alen.lt.seg) then + binorm=anorm_distr(x1,sigma1,alowb,aupb) + else + binorm=anorm_distr(x2,sigma2,alowb,aupb) + endif +c print '(a)','Exiting BINORM.' + return + end +c----------------------------------------------------------------------- +c double precision function anorm_distr(x,sigma,alowb,aupb) +c implicit real*8 (a-h,o-z) +c print '(a)','Enter ANORM_DISTR.' +c 10 y=ran_number(alowb,aupb) +c expon=dexp(-0.5D0*((y-x)/sigma)**2) +c ran=ran_number(0.0D0,1.0D0) +c if (expon.lt.ran) goto 10 +c anorm_distr=y +c print '(a)','Exiting ANORM_DISTR.' +c return +c end +c----------------------------------------------------------------------- + double precision function anorm_distr(x,sigma,alowb,aupb) + implicit real*8 (a-h,o-z) +c to make a normally distributed deviate with zero mean and unit variance +c + integer iset + real fac,gset,rsq,v1,v2,ran1 + save iset,gset + data iset/0/ + if(iset.eq.0) then +1 v1=2.0d0*ran_number(0.0d0,1.0d0)-1.0d0 + v2=2.0d0*ran_number(0.0d0,1.0d0)-1.0d0 + rsq=v1**2+v2**2 + if(rsq.ge.1.d0.or.rsq.eq.0.0d0) goto 1 + fac=sqrt(-2.0d0*log(rsq)/rsq) + gset=v1*fac + gaussdev=v2*fac + iset=1 + else + gaussdev=gset + iset=0 + endif + anorm_distr=x+gaussdev*sigma + return + end +c------------------------------------------------------------------------ + subroutine mult_norm(lda,n,a,x,fail) +C +C Generate the vector X whose elements obey the multiple-normal distribution +C from exp(-0.5*X'AX). LDA is the leading dimension of the moment matrix A, +C n is the dimension of the problem. FAIL is set at .TRUE., if the smallest +C eigenvalue of the matrix A is close to 0. +C + implicit double precision (a-h,o-z) + double precision a(lda,n),x(n),eig(100),vec(3,3),work(100) + double precision eig_limit /1.0D-8/ + logical fail + fail=.false. +c print '(a)','Enter MULT_NORM.' +C +C Find the smallest eigenvalue of the matrix A. +C +c do i=1,n +c print '(8f10.5)',(a(i,j),j=1,n) +c enddo +#ifdef NAG + call f02faf('V','U',2,a,lda,eig,work,100,ifail) +#else + call djacob(2,lda,10000,1.0d-10,a,vec,eig) +#endif +c print '(8f10.5)',(eig(i),i=1,n) +C print '(a)' +c do i=1,n +c print '(8f10.5)',(a(i,j),j=1,n) +c enddo + if (eig(1).lt.eig_limit) then + print *,'From Mult_Norm: Eigenvalues of A are too small.' + fail=.true. + return + endif +C +C Generate points following the normal distributions along the principal +C axes of the moment matrix. Store in WORK. +C + do i=1,n + sigma=1.0D0/dsqrt(eig(i)) + alim=-3.0D0*sigma + work(i)=anorm_distr(0.0D0,sigma,-alim,alim) + enddo +C +C Transform the vector of normal variables back to the original basis. +C + do i=1,n + xi=0.0D0 + do j=1,n + xi=xi+a(i,j)*work(j) + enddo + x(i)=xi + enddo + return + end +c------------------------------------------------------------------------ + subroutine mult_norm1(lda,n,a,z,box,x,fail) +C +C Generate the vector X whose elements obey the multi-gaussian multi-dimensional +C distribution from sum_{i=1}^m W(i)exp[-0.5*X'(i)A(i)X(i)]. LDA is the +C leading dimension of the moment matrix A, n is the dimension of the +C distribution, nlob is the number of lobes. FAIL is set at .TRUE., if the +C smallest eigenvalue of the matrix A is close to 0. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + double precision a(lda,n),z(n),x(n),box(n,n) + double precision etmp + include 'COMMON.IOUNITS' +#ifdef MP + include 'COMMON.SETUP' +#endif + logical fail +C +C Generate points following the normal distributions along the principal +C axes of the moment matrix. Store in WORK. +C +cd print *,'CG Processor',me,' entered MultNorm1.' +cd print '(2(1pe14.4),3x,1pe14.4)',((a(i,j),j=1,2),z(i),i=1,2) +cd do i=1,n +cd print *,i,box(1,i),box(2,i) +cd enddo + istep = 0 + 10 istep = istep + 1 + if (istep.gt.10000) then +c write (iout,'(a,i4,2a)') 'CG Processor: ',me,': too many steps', +c & ' in MultNorm1.' +c write (*,'(a,i4,2a)') 'CG Processor: ',me,': too many steps', +c & ' in MultNorm1.' +c write (iout,*) 'box',box +c write (iout,*) 'a',a +c write (iout,*) 'z',z + fail=.true. + return + endif + do i=1,n + x(i)=ran_number(box(1,i),box(2,i)) + enddo + ww=0.0D0 + do i=1,n + xi=pinorm(x(i)-z(i)) + ww=ww+0.5D0*a(i,i)*xi*xi + do j=i+1,n + ww=ww+a(i,j)*xi*pinorm(x(j)-z(j)) + enddo + enddo + dec=ran_number(0.0D0,1.0D0) +c print *,(x(i),i=1,n),ww,dexp(-ww),dec +crc if (dec.gt.dexp(-ww)) goto 10 + if(-ww.lt.100) then + etmp=dexp(-ww) + else + return + endif + if (dec.gt.etmp) goto 10 +cd print *,'CG Processor',me,' exitting MultNorm1.' + return + end +c +crc-------------------------------------- + subroutine overlap_sc(scfail) +c Internal and cartesian coordinates must be consistent as input, +c and will be up-to-date on return. +c At the end of this procedure, scfail is true if there are +c overlapping residues left, or false otherwise (success) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.VAR' + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' + logical had_overlaps,fail,scfail + integer ioverlap(maxres),ioverlap_last + + had_overlaps=.false. + call overlap_sc_list(ioverlap,ioverlap_last) + if (ioverlap_last.gt.0) then + write (iout,*) '#OVERLAPing residues ',ioverlap_last + write (iout,'(20i4)') (ioverlap(k),k=1,ioverlap_last) + had_overlaps=.true. + endif + + maxsi=1000 + do k=1,1000 + if (ioverlap_last.eq.0) exit + + do ires=1,ioverlap_last + i=ioverlap(ires) + iti=itype(i) + if (iti.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(iti,theta(i+1),alph(i),omeg(i),fail) + nsi=nsi+1 + enddo + if(fail) goto 999 + endif + enddo + + call chainbuild + call overlap_sc_list(ioverlap,ioverlap_last) +c write (iout,*) 'Overlaping residues ',ioverlap_last, +c & (ioverlap(j),j=1,ioverlap_last) + enddo + + if (k.le.1000.and.ioverlap_last.eq.0) then + scfail=.false. + if (had_overlaps) then + write (iout,*) '#OVERLAPing all corrected after ',k, + & ' random generation' + endif + else + scfail=.true. + write (iout,*) '#OVERLAPing NOT all corrected ',ioverlap_last + write (iout,'(20i4)') (ioverlap(j),j=1,ioverlap_last) + endif + + return + + 999 continue + write (iout,'(a30,i5,a12,i4)') + & '#OVERLAP FAIL in gen_side after',maxsi, + & 'iter for RES',i + scfail=.true. + return + end + + subroutine overlap_sc_list(ioverlap,ioverlap_last) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.VAR' + include 'COMMON.CALC' + logical fail + integer ioverlap(maxres),ioverlap_last + data redfac /0.5D0/ + + ioverlap_last=0 +C Check for SC-SC overlaps and mark residues +c print *,'>>overlap_sc nnt=',nnt,' nct=',nct + ind=0 + do i=iatsc_s,iatsc_e + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) + dsci_inv=dsc_inv(itypi) +c + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + ind=ind+1 + itypj=itype(j) + dscj_inv=dsc_inv(itypj) + sig0ij=sigma(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + if (j.gt.i+1) then + rcomp=sigmaii(itypi,itypj) + else + rcomp=sigma(itypi,itypj) + endif +c print '(2(a3,2i3),a3,2f10.5)', +c & ' i=',i,iti,' j=',j,itj,' d=',dist(nres+i,nres+j) +c & ,rcomp + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+sig0ij + +ct if ( 1.0/rij .lt. redfac*rcomp .or. +ct & rij_shift.le.0.0D0 ) then + if ( rij_shift.le.0.0D0 ) then +cd write (iout,'(a,i3,a,i3,a,f10.5,a,3f10.5)') +cd & 'overlap SC-SC: i=',i,' j=',j, +cd & ' dist=',dist(nres+i,nres+j),' rcomp=', +cd & rcomp,1.0/rij,rij_shift + ioverlap_last=ioverlap_last+1 + ioverlap(ioverlap_last)=i + do k=1,ioverlap_last-1 + if (ioverlap(k).eq.i) ioverlap_last=ioverlap_last-1 + enddo + ioverlap_last=ioverlap_last+1 + ioverlap(ioverlap_last)=j + do k=1,ioverlap_last-1 + if (ioverlap(k).eq.j) ioverlap_last=ioverlap_last-1 + enddo + endif + enddo + enddo + enddo + return + end diff --git a/source/unres/src_MD-NEWSC/geomout.F b/source/unres/src_MD-NEWSC/geomout.F new file mode 100644 index 0000000..0a46b14 --- /dev/null +++ b/source/unres/src_MD-NEWSC/geomout.F @@ -0,0 +1,507 @@ + subroutine pdbout(etot,tytul,iunit) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + include 'COMMON.DISTFIT' + include 'COMMON.MD' + character*50 tytul + dimension ica(maxres) + write (iunit,'(3a,1pe15.5)') 'REMARK ',tytul,' ENERGY ',etot +cmodel write (iunit,'(a5,i6)') 'MODEL',1 + if (nhfrag.gt.0) then + do j=1,nhfrag + iti=itype(hfrag(1,j)) + itj=itype(hfrag(2,j)) + if (j.lt.10) then + write (iunit,'(a5,i5,1x,a1,i1,2x,a3,i7,2x,a3,i7,i3,t76,i5)') + & 'HELIX',j,'H',j, + & restyp(iti),hfrag(1,j)-1, + & restyp(itj),hfrag(2,j)-1,1,hfrag(2,j)-hfrag(1,j) + else + write (iunit,'(a5,i5,1x,a1,i2,1x,a3,i7,2x,a3,i7,i3)') + & 'HELIX',j,'H',j, + & restyp(iti),hfrag(1,j)-1, + & restyp(itj),hfrag(2,j)-1,1,hfrag(2,j)-hfrag(1,j) + endif + enddo + endif + + if (nbfrag.gt.0) then + + do j=1,nbfrag + + iti=itype(bfrag(1,j)) + itj=itype(bfrag(2,j)-1) + + write (iunit,'(a5,i5,1x,a1,i1,i3,1x,a3,i6,2x,a3,i6,i3)') + & 'SHEET',1,'B',j,2, + & restyp(iti),bfrag(1,j)-1, + & restyp(itj),bfrag(2,j)-2,0 + + if (bfrag(3,j).gt.bfrag(4,j)) then + + itk=itype(bfrag(3,j)) + itl=itype(bfrag(4,j)+1) + + write (iunit,'(a5,i5,1x,a1,i1,i3,1x,a3,i6,2x,a3,i6,i3, + & 2x,a1,2x,a3,i6,3x,a1,2x,a3,i6)') + & 'SHEET',2,'B',j,2, + & restyp(itl),bfrag(4,j), + & restyp(itk),bfrag(3,j)-1,-1, + & "N",restyp(itk),bfrag(3,j)-1, + & "O",restyp(iti),bfrag(1,j)-1 + + else + + itk=itype(bfrag(3,j)) + itl=itype(bfrag(4,j)-1) + + + write (iunit,'(a5,i5,1x,a1,i1,i3,1x,a3,i6,2x,a3,i6,i3, + & 2x,a1,2x,a3,i6,3x,a1,2x,a3,i6)') + & 'SHEET',2,'B',j,2, + & restyp(itk),bfrag(3,j)-1, + & restyp(itl),bfrag(4,j)-2,1, + & "N",restyp(itk),bfrag(3,j)-1, + & "O",restyp(iti),bfrag(1,j)-1 + + + + endif + + enddo + endif + + if (nss.gt.0) then + do i=1,nss + if (dyn_ss) then + write(iunit,'(a6,i4,1x,a3,i7,4x,a3,i7)') + & 'SSBOND',i,'CYS',idssb(i)-nnt+1, + & 'CYS',jdssb(i)-nnt+1 + else + write(iunit,'(a6,i4,1x,a3,i7,4x,a3,i7)') + & 'SSBOND',i,'CYS',ihpb(i)-nnt+1-nres, + & 'CYS',jhpb(i)-nnt+1-nres + endif + enddo + endif + + iatom=0 + do i=nnt,nct + ires=i-nnt+1 + iatom=iatom+1 + ica(i)=iatom + iti=itype(i) + write (iunit,10) iatom,restyp(iti),ires,(c(j,i),j=1,3),vtot(i) + if (iti.ne.10) then + iatom=iatom+1 + write (iunit,20) iatom,restyp(iti),ires,(c(j,nres+i),j=1,3), + & vtot(i+nres) + endif + enddo + write (iunit,'(a)') 'TER' + do i=nnt,nct-1 + if (itype(i).eq.10) then + write (iunit,30) ica(i),ica(i+1) + else + write (iunit,30) ica(i),ica(i+1),ica(i)+1 + endif + enddo + if (itype(nct).ne.10) then + write (iunit,30) ica(nct),ica(nct)+1 + endif + do i=1,nss + if (dyn_ss) then + write (iunit,30) ica(idssb(i))+1,ica(jdssb(i))+1 + else + write (iunit,30) ica(ihpb(i)-nres)+1,ica(jhpb(i)-nres)+1 + endif + enddo + write (iunit,'(a6)') 'ENDMDL' + 10 FORMAT ('ATOM',I7,' CA ',A3,I6,4X,3F8.3,f15.3) + 20 FORMAT ('ATOM',I7,' CB ',A3,I6,4X,3F8.3,f15.3) + 30 FORMAT ('CONECT',8I5) + return + end +c------------------------------------------------------------------------------ + subroutine MOL2out(etot,tytul) +C Prints the Cartesian coordinates of the alpha-carbons in the Tripos mol2 +C format. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + character*32 tytul,fd + character*3 zahl + character*6 res_num,pom,ucase +#ifdef AIX + call fdate_(fd) +#elif (defined CRAY) + call date(fd) +#else + call fdate(fd) +#endif + write (imol2,'(a)') '#' + write (imol2,'(a)') + & '# Creating user name: unres' + write (imol2,'(2a)') '# Creation time: ', + & fd + write (imol2,'(/a)') '\@MOLECULE' + write (imol2,'(a)') tytul + write (imol2,'(5i5)') nct-nnt+1,nct-nnt+nss+1,nct-nnt+nss+1,0,0 + write (imol2,'(a)') 'SMALL' + write (imol2,'(a)') 'USER_CHARGES' + write (imol2,'(a)') '\@ATOM' + do i=nnt,nct + write (zahl,'(i3)') i + pom=ucase(restyp(itype(i))) + res_num = pom(:3)//zahl(2:) + write (imol2,10) i,(c(j,i),j=1,3),i,res_num,0.0 + enddo + write (imol2,'(a)') '\@BOND' + do i=nnt,nct-1 + write (imol2,'(i5,2i6,i2)') i-nnt+1,i-nnt+1,i-nnt+2,1 + enddo + do i=1,nss + write (imol2,'(i5,2i6,i2)') nct-nnt+i,ihpb(i),jhpb(i),1 + enddo + write (imol2,'(a)') '\@SUBSTRUCTURE' + do i=nnt,nct + write (zahl,'(i3)') i + pom = ucase(restyp(itype(i))) + res_num = pom(:3)//zahl(2:) + write (imol2,30) i-nnt+1,res_num,i-nnt+1,0 + enddo + 10 FORMAT (I7,' CA ',3F10.4,' C.3',I8,1X,A,F11.4,' ****') + 30 FORMAT (I7,1x,A,I14,' RESIDUE',I13,' **** ****') + return + end +c------------------------------------------------------------------------ + subroutine intout + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + write (iout,'(/a)') 'Geometry of the virtual chain.' + write (iout,'(7a)') ' Res ',' d',' Theta', + & ' Gamma',' Dsc',' Alpha',' Beta ' + do i=1,nres + iti=itype(i) + write (iout,'(a3,i4,6f10.3)') restyp(iti),i,vbld(i), + & rad2deg*theta(i),rad2deg*phi(i),vbld(nres+i),rad2deg*alph(i), + & rad2deg*omeg(i) + enddo + return + end +c--------------------------------------------------------------------------- + subroutine briefout(it,ener) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.SBRIDGE' +c print '(a,i5)',intname,igeom +#if defined(AIX) || defined(PGI) + open (igeom,file=intname,position='append') +#else + open (igeom,file=intname,access='append') +#endif + IF (NSS.LE.9) THEN + WRITE (igeom,180) IT,ENER,NSS,(IHPB(I),JHPB(I),I=1,NSS) + ELSE + WRITE (igeom,180) IT,ENER,NSS,(IHPB(I),JHPB(I),I=1,9) + WRITE (igeom,190) (IHPB(I),JHPB(I),I=10,NSS) + ENDIF +c IF (nvar.gt.nphi) WRITE (igeom,200) (RAD2DEG*THETA(I),I=3,NRES) + WRITE (igeom,200) (RAD2DEG*THETA(I),I=3,NRES) + WRITE (igeom,200) (RAD2DEG*PHI(I),I=4,NRES) +c if (nvar.gt.nphi+ntheta) then + write (igeom,200) (rad2deg*alph(i),i=2,nres-1) + write (igeom,200) (rad2deg*omeg(i),i=2,nres-1) +c endif + close(igeom) + 180 format (I5,F12.3,I2,9(1X,2I3)) + 190 format (3X,11(1X,2I3)) + 200 format (8F10.4) + return + end +#ifdef WINIFL + subroutine fdate(fd) + character*32 fd + write(fd,'(32x)') + return + end +#endif +c---------------------------------------------------------------- +#ifdef NOXDR + subroutine cartout(time) +#else + subroutine cartoutx(time) +#endif + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + include 'COMMON.DISTFIT' + include 'COMMON.MD' + double precision time +#if defined(AIX) || defined(PGI) + open(icart,file=cartname,position="append") +#else + open(icart,file=cartname,access="append") +#endif + write (icart,'(e15.8,2e15.5,f12.5,$)') time,potE,uconst,t_bath + write (icart,'(i4,$)') + & nss,(ihpb(j),jhpb(j),j=1,nss) + write (icart,'(i4,20f7.4)') nfrag+npair+3*nfrag_back, + & (qfrag(i),i=1,nfrag),(qpair(i),i=1,npair), + & (utheta(i),ugamma(i),uscdiff(i),i=1,nfrag_back) + write (icart,'(8f10.5)') + & ((c(k,j),k=1,3),j=1,nres), + & ((c(k,j+nres),k=1,3),j=nnt,nct) + close(icart) + return + end +c----------------------------------------------------------------- +#ifndef NOXDR + subroutine cartout(time) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + include 'COMMON.SETUP' +#else + parameter (me=0) +#endif + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + include 'COMMON.DISTFIT' + include 'COMMON.MD' + double precision time + integer iret,itmp + real xcoord(3,maxres2+2),prec + +#ifdef AIX + call xdrfopen_(ixdrf,cartname, "a", iret) + call xdrffloat_(ixdrf, real(time), iret) + call xdrffloat_(ixdrf, real(potE), iret) + call xdrffloat_(ixdrf, real(uconst), iret) + call xdrffloat_(ixdrf, real(uconst_back), iret) + call xdrffloat_(ixdrf, real(t_bath), iret) + call xdrfint_(ixdrf, nss, iret) + do j=1,nss + call xdrfint_(ixdrf, ihpb(j), iret) + call xdrfint_(ixdrf, jhpb(j), iret) + enddo + call xdrfint_(ixdrf, nfrag+npair+3*nfrag_back, iret) + do i=1,nfrag + call xdrffloat_(ixdrf, real(qfrag(i)), iret) + enddo + do i=1,npair + call xdrffloat_(ixdrf, real(qpair(i)), iret) + enddo + do i=1,nfrag_back + call xdrffloat_(ixdrf, real(utheta(i)), iret) + call xdrffloat_(ixdrf, real(ugamma(i)), iret) + call xdrffloat_(ixdrf, real(uscdiff(i)), iret) + enddo +#else + call xdrfopen(ixdrf,cartname, "a", iret) + call xdrffloat(ixdrf, real(time), iret) + call xdrffloat(ixdrf, real(potE), iret) + call xdrffloat(ixdrf, real(uconst), iret) + call xdrffloat(ixdrf, real(uconst_back), iret) + call xdrffloat(ixdrf, real(t_bath), iret) + call xdrfint(ixdrf, nss, iret) + do j=1,nss + call xdrfint(ixdrf, ihpb(j), iret) + call xdrfint(ixdrf, jhpb(j), iret) + enddo + call xdrfint(ixdrf, nfrag+npair+3*nfrag_back, iret) + do i=1,nfrag + call xdrffloat(ixdrf, real(qfrag(i)), iret) + enddo + do i=1,npair + call xdrffloat(ixdrf, real(qpair(i)), iret) + enddo + do i=1,nfrag_back + call xdrffloat(ixdrf, real(utheta(i)), iret) + call xdrffloat(ixdrf, real(ugamma(i)), iret) + call xdrffloat(ixdrf, real(uscdiff(i)), iret) + enddo +#endif + prec=10000.0 + do i=1,nres + do j=1,3 + xcoord(j,i)=c(j,i) + enddo + enddo + do i=nnt,nct + do j=1,3 + xcoord(j,nres+i-nnt+1)=c(j,i+nres) + enddo + enddo + + itmp=nres+nct-nnt+1 +#ifdef AIX + call xdrf3dfcoord_(ixdrf, xcoord, itmp, prec, iret) + call xdrfclose_(ixdrf, iret) +#else + call xdrf3dfcoord(ixdrf, xcoord, itmp, prec, iret) + call xdrfclose(ixdrf, iret) +#endif + return + end +#endif +c----------------------------------------------------------------- + subroutine statout(itime) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + include 'COMMON.DISTFIT' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + integer itime + double precision energia(0:n_ene) + double precision gyrate + external gyrate + common /gucio/ cm + character*256 line1,line2 + character*4 format1,format2 + character*30 format +#ifdef AIX + if(itime.eq.0) then + open(istat,file=statname,position="append") + endif +#else +#ifdef PGI + open(istat,file=statname,position="append") +#else + open(istat,file=statname,access="append") +#endif +#endif + if (refstr) then + call rms_nac_nnc(rms,frac,frac_nn,co,.false.) + if(tnp .or. tnp1 .or. tnh) then + write (line1,'(i10,f15.2,3f12.3,f12.6,f7.2,4f6.3,3f12.3,i5,$)') + & itime,totT,EK,potE,totE,hhh, + & rms,frac,frac_nn,co,amax,kinetic_T,t_bath,gyrate(),me + format1="a145" + else + write (line1,'(i10,f15.2,3f12.3,f7.2,4f6.3,3f12.3,i5,$)') + & itime,totT,EK,potE,totE, + & rms,frac,frac_nn,co,amax,kinetic_T,t_bath,gyrate(),me + format1="a133" + endif + else + if(tnp .or. tnp1 .or. tnh) then + write (line1,'(i10,f15.2,7f12.3,f12.6,i5,$)') + & itime,totT,EK,potE,totE,hhh, + & amax,kinetic_T,t_bath,gyrate(),me + format1="a126" + else + write (line1,'(i10,f15.2,7f12.3,i5,$)') + & itime,totT,EK,potE,totE, + & amax,kinetic_T,t_bath,gyrate(),me + format1="a114" + endif + endif + if(usampl.and.totT.gt.eq_time) then + write(line2,'(i5,2f9.4,300f7.4)') iset,uconst,uconst_back, + & (qfrag(ii1),ii1=1,nfrag),(qpair(ii2),ii2=1,npair), + & (utheta(i),ugamma(i),uscdiff(i),i=1,nfrag_back) + write(format2,'(a1,i3.3)') "a",23+7*nfrag+7*npair + & +21*nfrag_back + elseif(hremd.gt.0) then + write(line2,'(i5)') iset + format2="a005" + else + format2="a001" + line2=' ' + endif + if (print_compon) then + if(itime.eq.0) then + write(format,'(a1,a4,a1,a4,a10)') "(",format1,",",format2, + & ",20a12)" + write (istat,format) "#","", + & (ename(print_order(i)),i=1,nprint_ene) + endif + write(format,'(a1,a4,a1,a4,a10)') "(",format1,",",format2, + & ",20f12.3)" + write (istat,format) line1,line2, + & (potEcomp(print_order(i)),i=1,nprint_ene) + else + write(format,'(a1,a4,a1,a4,a1)') "(",format1,",",format2,")" + write (istat,format) line1,line2 + endif +#if defined(AIX) + call flush(istat) +#else + close(istat) +#endif + return + end +c--------------------------------------------------------------- + double precision function gyrate() + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.INTERACT' + include 'COMMON.CHAIN' + double precision cen(3),rg + + do j=1,3 + cen(j)=0.0d0 + enddo + + do i=nnt,nct + do j=1,3 + cen(j)=cen(j)+c(j,i) + enddo + enddo + do j=1,3 + cen(j)=cen(j)/dble(nct-nnt+1) + enddo + rg = 0.0d0 + do i = nnt, nct + do j=1,3 + rg = rg + (c(j,i)-cen(j))**2 + enddo + end do + gyrate = sqrt(rg/dble(nct-nnt+1)) + return + end + diff --git a/source/unres/src_MD-NEWSC/gnmr1.f b/source/unres/src_MD-NEWSC/gnmr1.f new file mode 100644 index 0000000..905e746 --- /dev/null +++ b/source/unres/src_MD-NEWSC/gnmr1.f @@ -0,0 +1,43 @@ + double precision function gnmr1(y,ymin,ymax) + implicit none + double precision y,ymin,ymax + double precision wykl /4.0d0/ + if (y.lt.ymin) then + gnmr1=(ymin-y)**wykl/wykl + else if (y.gt.ymax) then + gnmr1=(y-ymax)**wykl/wykl + else + gnmr1=0.0d0 + endif + return + end +c------------------------------------------------------------------------------ + double precision function gnmr1prim(y,ymin,ymax) + implicit none + double precision y,ymin,ymax + double precision wykl /4.0d0/ + if (y.lt.ymin) then + gnmr1prim=-(ymin-y)**(wykl-1) + else if (y.gt.ymax) then + gnmr1prim=(y-ymax)**(wykl-1) + else + gnmr1prim=0.0d0 + endif + return + end +c------------------------------------------------------------------------------ + double precision function harmonic(y,ymax) + implicit none + double precision y,ymax + double precision wykl /2.0d0/ + harmonic=(y-ymax)**wykl + return + end +c------------------------------------------------------------------------------- + double precision function harmonicprim(y,ymax) + double precision y,ymin,ymax + double precision wykl /2.0d0/ + harmonicprim=(y-ymax)*wykl + return + end +c--------------------------------------------------------------------------------- diff --git a/source/unres/src_MD-NEWSC/gradient_p.F b/source/unres/src_MD-NEWSC/gradient_p.F new file mode 100644 index 0000000..7fec1e8 --- /dev/null +++ b/source/unres/src_MD-NEWSC/gradient_p.F @@ -0,0 +1,421 @@ + subroutine gradient(n,x,nf,g,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.SCCOR' + external ufparm + integer uiparm(1) + double precision urparm(1) + dimension x(maxvar),g(maxvar) +c +c This subroutine calculates total internal coordinate gradient. +c Depending on the number of function evaluations, either whole energy +c is evaluated beforehand, Cartesian coordinates and their derivatives in +c internal coordinates are reevaluated or only the cartesian-in-internal +c coordinate derivatives are evaluated. The subroutine was designed to work +c with SUMSL. +c +c + icg=mod(nf,2)+1 + +cd print *,'grad',nf,icg + if (nf-nfl+1) 20,30,40 + 20 call func(n,x,nf,f,uiparm,urparm,ufparm) +c write (iout,*) 'grad 20' + if (nf.eq.0) return + goto 40 + 30 call var_to_geom(n,x) + call chainbuild +c write (iout,*) 'grad 30' +C +C Evaluate the derivatives of virtual bond lengths and SC vectors in variables. +C + 40 call cartder +c write (iout,*) 'grad 40' +c print *,'GRADIENT: nnt=',nnt,' nct=',nct,' expon=',expon +C +C Convert the Cartesian gradient into internal-coordinate gradient. +C + ind=0 + ind1=0 + do i=1,nres-2 + gthetai=0.0D0 + gphii=0.0D0 + do j=i+1,nres-1 + ind=ind+1 +c ind=indmat(i,j) +c print *,'GRAD: i=',i,' jc=',j,' ind=',ind + do k=1,3 + gthetai=gthetai+dcdv(k,ind)*gradc(k,j,icg) + enddo + do k=1,3 + gphii=gphii+dcdv(k+3,ind)*gradc(k,j,icg) + enddo + enddo + do j=i+1,nres-1 + ind1=ind1+1 +c ind1=indmat(i,j) +c print *,'GRAD: i=',i,' jx=',j,' ind1=',ind1 + do k=1,3 + gthetai=gthetai+dxdv(k,ind1)*gradx(k,j,icg) + gphii=gphii+dxdv(k+3,ind1)*gradx(k,j,icg) + enddo + enddo + if (i.gt.1) g(i-1)=gphii + if (n.gt.nphi) g(nphi+i)=gthetai + enddo + if (n.le.nphi+ntheta) goto 10 + do i=2,nres-1 + if (itype(i).ne.10) then + galphai=0.0D0 + gomegai=0.0D0 + do k=1,3 + galphai=galphai+dxds(k,i)*gradx(k,i,icg) + enddo + do k=1,3 + gomegai=gomegai+dxds(k+3,i)*gradx(k,i,icg) + enddo + g(ialph(i,1))=galphai + g(ialph(i,1)+nside)=gomegai + endif + enddo +C +C Add the components corresponding to local energy terms. +C + 10 continue + do i=1,nvar +cd write (iout,*) 'i=',i,'g=',g(i),' gloc=',gloc(i,icg) + g(i)=g(i)+gloc(i,icg) + enddo +C Uncomment following three lines for diagnostics. +cd call intout +cd call briefout(0,0.0d0) +cd write (iout,'(i3,1pe15.5)') (k,g(k),k=1,n) + return + end +C------------------------------------------------------------------------- + subroutine grad_restr(n,x,nf,g,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + external ufparm + integer uiparm(1) + double precision urparm(1) + dimension x(maxvar),g(maxvar) + + icg=mod(nf,2)+1 + if (nf-nfl+1) 20,30,40 + 20 call func_restr(n,x,nf,f,uiparm,urparm,ufparm) +c write (iout,*) 'grad 20' + if (nf.eq.0) return + goto 40 + 30 continue +#ifdef OSF +c Intercept NaNs in the coordinates +c write(iout,*) (var(i),i=1,nvar) + x_sum=0.D0 + do i=1,n + x_sum=x_sum+x(i) + enddo + if (x_sum.ne.x_sum) then + write(iout,*)" *** grad_restr : Found NaN in coordinates" + call flush(iout) + print *," *** grad_restr : Found NaN in coordinates" + return + endif +#endif + call var_to_geom_restr(n,x) + call chainbuild +C +C Evaluate the derivatives of virtual bond lengths and SC vectors in variables. +C + 40 call cartder +C +C Convert the Cartesian gradient into internal-coordinate gradient. +C + + ig=0 + ind=nres-2 + do i=2,nres-2 + IF (mask_phi(i+2).eq.1) THEN + gphii=0.0D0 + do j=i+1,nres-1 + ind=ind+1 + do k=1,3 + gphii=gphii+dcdv(k+3,ind)*gradc(k,j,icg) + gphii=gphii+dxdv(k+3,ind)*gradx(k,j,icg) + enddo + enddo + ig=ig+1 + g(ig)=gphii + ELSE + ind=ind+nres-1-i + ENDIF + enddo + + + ind=0 + do i=1,nres-2 + IF (mask_theta(i+2).eq.1) THEN + ig=ig+1 + gthetai=0.0D0 + do j=i+1,nres-1 + ind=ind+1 + do k=1,3 + gthetai=gthetai+dcdv(k,ind)*gradc(k,j,icg) + gthetai=gthetai+dxdv(k,ind)*gradx(k,j,icg) + enddo + enddo + g(ig)=gthetai + ELSE + ind=ind+nres-1-i + ENDIF + enddo + + do i=2,nres-1 + if (itype(i).ne.10) then + IF (mask_side(i).eq.1) THEN + ig=ig+1 + galphai=0.0D0 + do k=1,3 + galphai=galphai+dxds(k,i)*gradx(k,i,icg) + enddo + g(ig)=galphai + ENDIF + endif + enddo + + + do i=2,nres-1 + if (itype(i).ne.10) then + IF (mask_side(i).eq.1) THEN + ig=ig+1 + gomegai=0.0D0 + do k=1,3 + gomegai=gomegai+dxds(k+3,i)*gradx(k,i,icg) + enddo + g(ig)=gomegai + ENDIF + endif + enddo + +C +C Add the components corresponding to local energy terms. +C + + ig=0 + igall=0 + do i=4,nres + igall=igall+1 + if (mask_phi(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + enddo + + do i=3,nres + igall=igall+1 + if (mask_theta(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + enddo + + do ij=1,2 + do i=2,nres-1 + if (itype(i).ne.10) then + igall=igall+1 + if (mask_side(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + endif + enddo + enddo + +cd do i=1,ig +cd write (iout,'(a2,i5,a3,f25.8)') 'i=',i,' g=',g(i) +cd enddo + return + end +C------------------------------------------------------------------------- + subroutine cartgrad + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.SCCOR' +c +c This subrouting calculates total Cartesian coordinate gradient. +c The subroutine chainbuild_cart and energy MUST be called beforehand. +c +c do i=1,nres +c write (iout,*) "przed sum_grad", gloc_sc(1,i,icg),gloc(i,icg) +c enddo + +#ifdef TIMING + time00=MPI_Wtime() +#endif + icg=1 + call sum_gradient +#ifdef TIMING +#endif +c do i=1,nres +c write (iout,*) "checkgrad", gloc_sc(1,i,icg),gloc(i,icg) +c enddo +cd write (iout,*) "After sum_gradient" +cd do i=1,nres-1 +cd write (iout,*) i," gradc ",(gradc(j,i,icg),j=1,3) +cd write (iout,*) i," gradx ",(gradx(j,i,icg),j=1,3) +cd enddo +c If performing constraint dynamics, add the gradients of the constraint energy + if(usampl.and.totT.gt.eq_time) then + do i=1,nct + do j=1,3 + gradc(j,i,icg)=gradc(j,i,icg)+dudconst(j,i)+duscdiff(j,i) + gradx(j,i,icg)=gradx(j,i,icg)+dudxconst(j,i)+duscdiffx(j,i) + enddo + enddo + do i=1,nres-3 + gloc(i,icg)=gloc(i,icg)+dugamma(i) + enddo + do i=1,nres-2 + gloc(nphi+i,icg)=gloc(nphi+i,icg)+dutheta(i) + enddo + endif +#ifdef TIMING + time01=MPI_Wtime() +#endif + call intcartderiv +#ifdef TIMING + time_intcartderiv=time_intcartderiv+MPI_Wtime()-time01 +#endif +cd call checkintcartgrad +cd write(iout,*) 'calling int_to_cart' +cd write (iout,*) "gcart, gxcart, gloc before int_to_cart" + do i=1,nct + do j=1,3 + gcart(j,i)=gradc(j,i,icg) + gxcart(j,i)=gradx(j,i,icg) + enddo +cd write (iout,'(i5,2(3f10.5,5x),f10.5)') i,(gcart(j,i),j=1,3), +cd & (gxcart(j,i),j=1,3),gloc(i,icg) + enddo +#ifdef TIMING + time01=MPI_Wtime() +#endif + call int_to_cart +#ifdef TIMING + time_inttocart=time_inttocart+MPI_Wtime()-time01 +#endif +cd write (iout,*) "gcart and gxcart after int_to_cart" +cd do i=0,nres-1 +cd write (iout,'(i5,3f10.5,5x,3f10.5)') i,(gcart(j,i),j=1,3), +cd & (gxcart(j,i),j=1,3) +cd enddo +#ifdef TIMING + time_cartgrad=time_cartgrad+MPI_Wtime()-time00 +#endif + return + end +C------------------------------------------------------------------------- + subroutine zerograd + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.DERIV' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.SCCOR' +C +C Initialize Cartesian-coordinate gradient +C + do i=1,nres + do j=1,3 + gvdwx(j,i)=0.0D0 + gvdwxT(j,i)=0.0D0 + gradx_scp(j,i)=0.0D0 + gvdwc(j,i)=0.0D0 + gvdwcT(j,i)=0.0D0 + gvdwc_scp(j,i)=0.0D0 + gvdwc_scpp(j,i)=0.0d0 + gelc (j,i)=0.0D0 + gelc_long(j,i)=0.0D0 + gradb(j,i)=0.0d0 + gradbx(j,i)=0.0d0 + gvdwpp(j,i)=0.0d0 + gel_loc(j,i)=0.0d0 + gel_loc_long(j,i)=0.0d0 + ghpbc(j,i)=0.0D0 + ghpbx(j,i)=0.0D0 + gcorr3_turn(j,i)=0.0d0 + gcorr4_turn(j,i)=0.0d0 + gradcorr(j,i)=0.0d0 + gradcorr_long(j,i)=0.0d0 + gradcorr5_long(j,i)=0.0d0 + gradcorr6_long(j,i)=0.0d0 + gcorr6_turn_long(j,i)=0.0d0 + gradcorr5(j,i)=0.0d0 + gradcorr6(j,i)=0.0d0 + gcorr6_turn(j,i)=0.0d0 + gsccorc(j,i)=0.0d0 + gsccorx(j,i)=0.0d0 + gradc(j,i,icg)=0.0d0 + gradx(j,i,icg)=0.0d0 + gscloc(j,i)=0.0d0 + gsclocx(j,i)=0.0d0 + do intertyp=1,3 + gloc_sc(intertyp,i,icg)=0.0d0 + enddo + enddo + enddo +C +C Initialize the gradient of local energy terms. +C + do i=1,4*nres + gloc(i,icg)=0.0D0 + enddo + do i=1,nres + gel_loc_loc(i)=0.0d0 + gcorr_loc(i)=0.0d0 + g_corr5_loc(i)=0.0d0 + g_corr6_loc(i)=0.0d0 + gel_loc_turn3(i)=0.0d0 + gel_loc_turn4(i)=0.0d0 + gel_loc_turn6(i)=0.0d0 + gsccor_loc(i)=0.0d0 + enddo +c initialize gcart and gxcart + do i=0,nres + do j=1,3 + gcart(j,i)=0.0d0 + gxcart(j,i)=0.0d0 + enddo + enddo + return + end +c------------------------------------------------------------------------- + double precision function fdum() + fdum=0.0D0 + return + end diff --git a/source/unres/src_MD-NEWSC/initialize_p.F b/source/unres/src_MD-NEWSC/initialize_p.F new file mode 100644 index 0000000..3c989e3 --- /dev/null +++ b/source/unres/src_MD-NEWSC/initialize_p.F @@ -0,0 +1,1399 @@ + block data + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.MD' + include 'COMMON.INTERACT' + data MovTypID + & /'pool','chain regrow','multi-bond','phi','theta','side chain', + & 'total'/ +c Conversion from poises to molecular unit and the gas constant + data cPoise /2.9361d0/, Rb /0.001986d0/ +c Dielectric constant of water + data eps_out /80.0d0/ + end +c-------------------------------------------------------------------------- + subroutine initialize +C +C Define constants and zero out tables. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif +#ifndef ISNAN + external proc_proc +#ifdef WINPGI +cMS$ATTRIBUTES C :: proc_proc +#endif +#endif + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.MCM' + include 'COMMON.MINIM' + include 'COMMON.DERIV' + include 'COMMON.SPLITELE' +c Common blocks from the diagonalization routines + COMMON /IOFILE/ IR,IW,IP,IJK,IPK,IDAF,NAV,IODA(400) + COMMON /MACHSW/ KDIAG,ICORFL,IXDR + logical mask_r +c real*8 text1 /'initial_i'/ + + mask_r=.false. +#ifndef ISNAN +c NaNQ initialization + i=-1 + arg=100.0d0 + rr=dacos(arg) +#ifdef WINPGI + idumm=proc_proc(rr,i) +#else + call proc_proc(rr,i) +#endif +#endif + + kdiag=0 + icorfl=0 + iw=2 +C +C The following is just to define auxiliary variables used in angle conversion +C + pi=4.0D0*datan(1.0D0) + dwapi=2.0D0*pi + dwapi3=dwapi/3.0D0 + pipol=0.5D0*pi + deg2rad=pi/180.0D0 + rad2deg=1.0D0/deg2rad + angmin=10.0D0*deg2rad +C +C Define I/O units. +C + inp= 1 + iout= 2 + ipdbin= 3 + ipdb= 7 + icart = 30 + imol2= 4 + igeom= 8 + intin= 9 + ithep= 11 + ithep_pdb=51 + irotam=12 + irotam_pdb=52 + itorp= 13 + itordp= 23 + ielep= 14 + isidep=15 + iscpp=25 + icbase=16 + ifourier=20 + istat= 17 + irest1=55 + irest2=56 + iifrag=57 + ientin=18 + ientout=19 + ibond = 28 + isccor = 29 +crc for write_rmsbank1 + izs1=21 +cdr include secondary structure prediction bias + isecpred=27 +C +C CSA I/O units (separated from others especially for Jooyoung) +C + icsa_rbank=30 + icsa_seed=31 + icsa_history=32 + icsa_bank=33 + icsa_bank1=34 + icsa_alpha=35 + icsa_alpha1=36 + icsa_bankt=37 + icsa_int=39 + icsa_bank_reminimized=38 + icsa_native_int=41 + icsa_in=40 +crc for ifc error 118 + icsa_pdb=42 +C +C Set default weights of the energy terms. +C + wlong=1.0D0 + welec=1.0D0 + wtor =1.0D0 + wang =1.0D0 + wscloc=1.0D0 + wstrain=1.0D0 +C +C Zero out tables. +C + print '(a,$)','Inside initialize' +c call memmon_print_usage() + do i=1,maxres2 + do j=1,3 + c(j,i)=0.0D0 + dc(j,i)=0.0D0 + enddo + enddo + do i=1,maxres + do j=1,3 + xloc(j,i)=0.0D0 + enddo + enddo + do i=1,ntyp + do j=1,ntyp + aa(i,j)=0.0D0 + bb(i,j)=0.0D0 + augm(i,j)=0.0D0 + sigma(i,j)=0.0D0 + r0(i,j)=0.0D0 + chi(i,j)=0.0D0 + enddo + do j=1,2 + bad(i,j)=0.0D0 + enddo + chip(i)=0.0D0 + alp(i)=0.0D0 + sigma0(i)=0.0D0 + sigii(i)=0.0D0 + rr0(i)=0.0D0 + a0thet(i)=0.0D0 + do j=1,2 + athet(j,i)=0.0D0 + bthet(j,i)=0.0D0 + enddo + do j=0,3 + polthet(j,i)=0.0D0 + enddo + do j=1,3 + gthet(j,i)=0.0D0 + enddo + theta0(i)=0.0D0 + sig0(i)=0.0D0 + sigc0(i)=0.0D0 + do j=1,maxlob + bsc(j,i)=0.0D0 + do k=1,3 + censc(k,j,i)=0.0D0 + enddo + do k=1,3 + do l=1,3 + gaussc(l,k,j,i)=0.0D0 + enddo + enddo + nlob(i)=0 + enddo + enddo + nlob(ntyp1)=0 + dsc(ntyp1)=0.0D0 + do i=1,maxtor + itortyp(i)=0 + do j=1,maxtor + do k=1,maxterm + v1(k,j,i)=0.0D0 + v2(k,j,i)=0.0D0 + enddo + enddo + enddo + do i=1,maxres + itype(i)=0 + itel(i)=0 + enddo +C Initialize the bridge arrays + ns=0 + nss=0 + nhpb=0 + do i=1,maxss + iss(i)=0 + enddo + do i=1,maxdim + dhpb(i)=0.0D0 + enddo + do i=1,maxres + ihpb(i)=0 + jhpb(i)=0 + enddo +C +C Initialize timing. +C + call set_timers +C +C Initialize variables used in minimization. +C +c maxfun=5000 +c maxit=2000 + maxfun=500 + maxit=200 + tolf=1.0D-2 + rtolf=5.0D-4 +C +C Initialize the variables responsible for the mode of gradient storage. +C + nfl=0 + icg=1 +C +C Initialize constants used to split the energy into long- and short-range +C components +C + r_cut=2.0d0 + rlamb=0.3d0 +#ifndef SPLITELE + nprint_ene=nprint_ene-1 +#endif + return + end +c------------------------------------------------------------------------- + block data nazwy + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.NAMES' + include 'COMMON.FFIELD' + data restyp / + &'CYS','MET','PHE','ILE','LEU','VAL','TRP','TYR','ALA','GLY','THR', + &'SER','GLN','ASN','GLU','ASP','HIS','ARG','LYS','PRO','D'/ + data onelet / + &'C','M','F','I','L','V','W','Y','A','G','T', + &'S','Q','N','E','D','H','R','K','P','X'/ + data potname /'LJ','LJK','BP','GB','GBV','MOMO'/ + data ename / + & "EVDW SC-SC","EVDW2 SC-p","EES p-p","ECORR4 ","ECORR5 ", + & "ECORR6 ","EELLO ","ETURN3 ","ETURN4 ","ETURN6 ", + & "EBE bend","ESC SCloc","ETORS ","ETORSD ","EHPB ","EVDWPP ", + & "ESTR ","EVDW2_14 ","UCONST ", " ","ESCCOR"," "," "/ + data wname / + & "WSC","WSCP","WELEC","WCORR","WCORR5","WCORR6","WEL_LOC", + & "WTURN3","WTURN4","WTURN6","WANG","WSCLOC","WTOR","WTORD", + & "WSTRAIN","WVDWPP","WBOND","SCAL14"," "," ","WSCCOR", + & " "," "/ + data nprint_ene /20/ + data print_order/1,2,3,11,12,13,14,4,5,6,7,8,9,10,19,18,15,17,16, + & 21,0,0,0/ + end +c--------------------------------------------------------------------------- + subroutine init_int_table + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer blocklengths(15),displs(15) +#endif + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.SBRIDGE' + include 'COMMON.TORCNSTR' + include 'COMMON.IOUNITS' + include 'COMMON.DERIV' + include 'COMMON.CONTACTS' + common /przechowalnia/ iturn3_start_all(0:max_fg_procs), + & iturn3_end_all(0:max_fg_procs),iturn4_start_all(0:max_fg_procs), + & iturn4_end_all(0:max_fg_procs),iatel_s_all(0:max_fg_procs), + &iatel_e_all(0:max_fg_procs),ielstart_all(maxres,0:max_fg_procs-1), + & ielend_all(maxres,0:max_fg_procs-1), + & ntask_cont_from_all(0:max_fg_procs-1), + & itask_cont_from_all(0:max_fg_procs-1,0:max_fg_procs-1), + & ntask_cont_to_all(0:max_fg_procs-1), + & itask_cont_to_all(0:max_fg_procs-1,0:max_fg_procs-1) + integer FG_GROUP,CONT_FROM_GROUP,CONT_TO_GROUP + logical scheck,lprint,flag +#ifdef MPI + integer my_sc_int(0:max_fg_Procs-1),my_sc_intt(0:max_fg_Procs), + & my_ele_int(0:max_fg_Procs-1),my_ele_intt(0:max_fg_Procs) +C... Determine the numbers of start and end SC-SC interaction +C... to deal with by current processor. + do i=0,nfgtasks-1 + itask_cont_from(i)=fg_rank + itask_cont_to(i)=fg_rank + enddo + lprint=energy_dec + if (lprint) + &write (iout,*) 'INIT_INT_TABLE nres=',nres,' nnt=',nnt,' nct=',nct + n_sc_int_tot=(nct-nnt+1)*(nct-nnt)/2-nss + call int_bounds(n_sc_int_tot,my_sc_inds,my_sc_inde) + if (lprint) + & write (iout,*) 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',MyRank, + & ' n_sc_int_tot',n_sc_int_tot,' my_sc_inds=',my_sc_inds, + & ' my_sc_inde',my_sc_inde + ind_sctint=0 + iatsc_s=0 + iatsc_e=0 +#endif +c lprint=.false. + do i=1,maxres + nint_gr(i)=0 + nscp_gr(i)=0 + do j=1,maxint_gr + istart(i,1)=0 + iend(i,1)=0 + ielstart(i)=0 + ielend(i)=0 + iscpstart(i,1)=0 + iscpend(i,1)=0 + enddo + enddo + ind_scint=0 + ind_scint_old=0 +cd write (iout,*) 'ns=',ns,' nss=',nss,' ihpb,jhpb', +cd & (ihpb(i),jhpb(i),i=1,nss) + do i=nnt,nct-1 + scheck=.false. + if (dyn_ss) goto 10 + do ii=1,nss + if (ihpb(ii).eq.i+nres) then + scheck=.true. + jj=jhpb(ii)-nres + goto 10 + endif + enddo + 10 continue +cd write (iout,*) 'i=',i,' scheck=',scheck,' jj=',jj + if (scheck) then + if (jj.eq.i+1) then +#ifdef MPI +c write (iout,*) 'jj=i+1' + call int_partition(ind_scint,my_sc_inds,my_sc_inde,i, + & iatsc_s,iatsc_e,i+2,nct,nint_gr(i),istart(i,1),iend(i,1),*12) +#else + nint_gr(i)=1 + istart(i,1)=i+2 + iend(i,1)=nct +#endif + else if (jj.eq.nct) then +#ifdef MPI +c write (iout,*) 'jj=nct' + call int_partition(ind_scint,my_sc_inds,my_sc_inde,i, + & iatsc_s,iatsc_e,i+1,nct-1,nint_gr(i),istart(i,1),iend(i,1),*12) +#else + nint_gr(i)=1 + istart(i,1)=i+1 + iend(i,1)=nct-1 +#endif + else +#ifdef MPI + call int_partition(ind_scint,my_sc_inds,my_sc_inde,i, + & iatsc_s,iatsc_e,i+1,jj-1,nint_gr(i),istart(i,1),iend(i,1),*12) + ii=nint_gr(i)+1 + call int_partition(ind_scint,my_sc_inds,my_sc_inde,i, + & iatsc_s,iatsc_e,jj+1,nct,nint_gr(i),istart(i,ii),iend(i,ii),*12) +#else + nint_gr(i)=2 + istart(i,1)=i+1 + iend(i,1)=jj-1 + istart(i,2)=jj+1 + iend(i,2)=nct +#endif + endif + else +#ifdef MPI + call int_partition(ind_scint,my_sc_inds,my_sc_inde,i, + & iatsc_s,iatsc_e,i+1,nct,nint_gr(i),istart(i,1),iend(i,1),*12) +#else + nint_gr(i)=1 + istart(i,1)=i+1 + iend(i,1)=nct + ind_scint=ind_scint+nct-i +#endif + endif +#ifdef MPI + ind_scint_old=ind_scint +#endif + enddo + 12 continue +#ifndef MPI + iatsc_s=nnt + iatsc_e=nct-1 +#endif + if (iatsc_s.eq.0) iatsc_s=1 +#ifdef MPI + if (lprint) write (*,*) 'Processor',fg_rank,' CG Group',kolor, + & ' absolute rank',myrank,' iatsc_s=',iatsc_s,' iatsc_e=',iatsc_e +#endif + if (lprint) then + write (iout,'(a)') 'Interaction array:' + do i=iatsc_s,iatsc_e + write (iout,'(i3,2(2x,2i3))') + & i,(istart(i,iint),iend(i,iint),iint=1,nint_gr(i)) + enddo + endif + ispp=4 +#ifdef MPI +C Now partition the electrostatic-interaction array + npept=nct-nnt + nele_int_tot=(npept-ispp)*(npept-ispp+1)/2 + call int_bounds(nele_int_tot,my_ele_inds,my_ele_inde) + if (lprint) + & write (*,*) 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',MyRank, + & ' nele_int_tot',nele_int_tot,' my_ele_inds=',my_ele_inds, + & ' my_ele_inde',my_ele_inde + iatel_s=0 + iatel_e=0 + ind_eleint=0 + ind_eleint_old=0 + do i=nnt,nct-3 + ijunk=0 + call int_partition(ind_eleint,my_ele_inds,my_ele_inde,i, + & iatel_s,iatel_e,i+ispp,nct-1,ijunk,ielstart(i),ielend(i),*13) + enddo ! i + 13 continue + if (iatel_s.eq.0) iatel_s=1 + nele_int_tot_vdw=(npept-2)*(npept-2+1)/2 +c write (iout,*) "nele_int_tot_vdw",nele_int_tot_vdw + call int_bounds(nele_int_tot_vdw,my_ele_inds_vdw,my_ele_inde_vdw) +c write (iout,*) "my_ele_inds_vdw",my_ele_inds_vdw, +c & " my_ele_inde_vdw",my_ele_inde_vdw + ind_eleint_vdw=0 + ind_eleint_vdw_old=0 + iatel_s_vdw=0 + iatel_e_vdw=0 + do i=nnt,nct-3 + ijunk=0 + call int_partition(ind_eleint_vdw,my_ele_inds_vdw, + & my_ele_inde_vdw,i, + & iatel_s_vdw,iatel_e_vdw,i+2,nct-1,ijunk,ielstart_vdw(i), + & ielend_vdw(i),*15) +c write (iout,*) i," ielstart_vdw",ielstart_vdw(i), +c & " ielend_vdw",ielend_vdw(i) + enddo ! i + if (iatel_s_vdw.eq.0) iatel_s_vdw=1 + 15 continue +#else + iatel_s=nnt + iatel_e=nct-5 + do i=iatel_s,iatel_e + ielstart(i)=i+4 + ielend(i)=nct-1 + enddo + iatel_s_vdw=nnt + iatel_e_vdw=nct-3 + do i=iatel_s_vdw,iatel_e_vdw + ielstart_vdw(i)=i+2 + ielend_vdw(i)=nct-1 + enddo +#endif + if (lprint) then + write (*,'(a)') 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',MyRank + write (iout,*) 'Electrostatic interaction array:' + do i=iatel_s,iatel_e + write (iout,'(i3,2(2x,2i3))') i,ielstart(i),ielend(i) + enddo + endif ! lprint +c iscp=3 + iscp=2 +C Partition the SC-p interaction array +#ifdef MPI + nscp_int_tot=(npept-iscp+1)*(npept-iscp+1) + call int_bounds(nscp_int_tot,my_scp_inds,my_scp_inde) + if (lprint) write (iout,*) 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',myrank, + & ' nscp_int_tot',nscp_int_tot,' my_scp_inds=',my_scp_inds, + & ' my_scp_inde',my_scp_inde + iatscp_s=0 + iatscp_e=0 + ind_scpint=0 + ind_scpint_old=0 + do i=nnt,nct-1 + if (i.lt.nnt+iscp) then +cd write (iout,*) 'i.le.nnt+iscp' + call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i, + & iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,1), + & iscpend(i,1),*14) + else if (i.gt.nct-iscp) then +cd write (iout,*) 'i.gt.nct-iscp' + call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i, + & iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1), + & iscpend(i,1),*14) + else + call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i, + & iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1), + & iscpend(i,1),*14) + ii=nscp_gr(i)+1 + call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i, + & iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,ii), + & iscpend(i,ii),*14) + endif + enddo ! i + 14 continue +#else + iatscp_s=nnt + iatscp_e=nct-1 + do i=nnt,nct-1 + if (i.lt.nnt+iscp) then + nscp_gr(i)=1 + iscpstart(i,1)=i+iscp + iscpend(i,1)=nct + elseif (i.gt.nct-iscp) then + nscp_gr(i)=1 + iscpstart(i,1)=nnt + iscpend(i,1)=i-iscp + else + nscp_gr(i)=2 + iscpstart(i,1)=nnt + iscpend(i,1)=i-iscp + iscpstart(i,2)=i+iscp + iscpend(i,2)=nct + endif + enddo ! i +#endif + if (iatscp_s.eq.0) iatscp_s=1 + if (lprint) then + write (iout,'(a)') 'SC-p interaction array:' + do i=iatscp_s,iatscp_e + write (iout,'(i3,2(2x,2i3))') + & i,(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i)) + enddo + endif ! lprint +C Partition local interactions +#ifdef MPI + call int_bounds(nres-2,loc_start,loc_end) + loc_start=loc_start+1 + loc_end=loc_end+1 + call int_bounds(nres-2,ithet_start,ithet_end) + ithet_start=ithet_start+2 + ithet_end=ithet_end+2 + call int_bounds(nct-nnt-2,iturn3_start,iturn3_end) + iturn3_start=iturn3_start+nnt + iphi_start=iturn3_start+2 + iturn3_end=iturn3_end+nnt + iphi_end=iturn3_end+2 + iturn3_start=iturn3_start-1 + iturn3_end=iturn3_end-1 + call int_bounds(nres-3,itau_start,itau_end) + itau_start=itau_start+3 + itau_end=itau_end+3 + call int_bounds(nres-3,iphi1_start,iphi1_end) + iphi1_start=iphi1_start+3 + iphi1_end=iphi1_end+3 + call int_bounds(nct-nnt-3,iturn4_start,iturn4_end) + iturn4_start=iturn4_start+nnt + iphid_start=iturn4_start+2 + iturn4_end=iturn4_end+nnt + iphid_end=iturn4_end+2 + iturn4_start=iturn4_start-1 + iturn4_end=iturn4_end-1 + call int_bounds(nres-2,ibond_start,ibond_end) + ibond_start=ibond_start+1 + ibond_end=ibond_end+1 + call int_bounds(nct-nnt,ibondp_start,ibondp_end) + ibondp_start=ibondp_start+nnt + ibondp_end=ibondp_end+nnt + call int_bounds1(nres-1,ivec_start,ivec_end) + print *,"Processor",myrank,fg_rank,fg_rank1, + & " ivec_start",ivec_start," ivec_end",ivec_end + iset_start=loc_start+2 + iset_end=loc_end+2 + if (ndih_constr.eq.0) then + idihconstr_start=1 + idihconstr_end=0 + else + call int_bounds(ndih_constr,idihconstr_start,idihconstr_end) + endif + nsumgrad=(nres-nnt)*(nres-nnt+1)/2 + nlen=nres-nnt+1 + call int_bounds(nsumgrad,ngrad_start,ngrad_end) + igrad_start=((2*nlen+1) + & -sqrt(float((2*nlen-1)**2-8*(ngrad_start-1))))/2 + jgrad_start(igrad_start)= + & ngrad_start-(2*nlen-igrad_start)*(igrad_start-1)/2 + & +igrad_start + jgrad_end(igrad_start)=nres + igrad_end=((2*nlen+1) + & -sqrt(float((2*nlen-1)**2-8*(ngrad_end-1))))/2 + if (igrad_end.gt.igrad_start) jgrad_start(igrad_end)=igrad_end+1 + jgrad_end(igrad_end)=ngrad_end-(2*nlen-igrad_end)*(igrad_end-1)/2 + & +igrad_end + do i=igrad_start+1,igrad_end-1 + jgrad_start(i)=i+1 + jgrad_end(i)=nres + enddo + if (lprint) then + write (*,*) 'Processor:',fg_rank,' CG group',kolor, + & ' absolute rank',myrank, + & ' loc_start',loc_start,' loc_end',loc_end, + & ' ithet_start',ithet_start,' ithet_end',ithet_end, + & ' iphi_start',iphi_start,' iphi_end',iphi_end, + & ' iphid_start',iphid_start,' iphid_end',iphid_end, + & ' ibond_start',ibond_start,' ibond_end',ibond_end, + & ' ibondp_start',ibondp_start,' ibondp_end',ibondp_end, + & ' iturn3_start',iturn3_start,' iturn3_end',iturn3_end, + & ' iturn4_start',iturn4_start,' iturn4_end',iturn4_end, + & ' ivec_start',ivec_start,' ivec_end',ivec_end, + & ' iset_start',iset_start,' iset_end',iset_end, + & ' idihconstr_start',idihconstr_start,' idihconstr_end', + & idihconstr_end + write (*,*) 'Processor:',fg_rank,myrank,' igrad_start', + & igrad_start,' igrad_end',igrad_end,' ngrad_start',ngrad_start, + & ' ngrad_end',ngrad_end + do i=igrad_start,igrad_end + write(*,*) 'Processor:',fg_rank,myrank,i, + & jgrad_start(i),jgrad_end(i) + enddo + endif + if (nfgtasks.gt.1) then + call MPI_Allgather(ivec_start,1,MPI_INTEGER,ivec_displ(0),1, + & MPI_INTEGER,FG_COMM1,IERROR) + iaux=ivec_end-ivec_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,ivec_count(0),1, + & MPI_INTEGER,FG_COMM1,IERROR) + call MPI_Allgather(iset_start-2,1,MPI_INTEGER,iset_displ(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + iaux=iset_end-iset_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,iset_count(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(ibond_start,1,MPI_INTEGER,ibond_displ(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + iaux=ibond_end-ibond_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,ibond_count(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(ithet_start,1,MPI_INTEGER,ithet_displ(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + iaux=ithet_end-ithet_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,ithet_count(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iphi_start,1,MPI_INTEGER,iphi_displ(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + iaux=iphi_end-iphi_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,iphi_count(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iphi1_start,1,MPI_INTEGER,iphi1_displ(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + iaux=iphi1_end-iphi1_start+1 + call MPI_Allgather(iaux,1,MPI_INTEGER,iphi1_count(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + do i=0,maxprocs-1 + do j=1,maxres + ielstart_all(j,i)=0 + ielend_all(j,i)=0 + enddo + enddo + call MPI_Allgather(iturn3_start,1,MPI_INTEGER, + & iturn3_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iturn4_start,1,MPI_INTEGER, + & iturn4_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iturn3_end,1,MPI_INTEGER, + & iturn3_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iturn4_end,1,MPI_INTEGER, + & iturn4_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iatel_s,1,MPI_INTEGER, + & iatel_s_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(iatel_e,1,MPI_INTEGER, + & iatel_e_all(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(ielstart(1),maxres,MPI_INTEGER, + & ielstart_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(ielend(1),maxres,MPI_INTEGER, + & ielend_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR) + if (lprint) then + write (iout,*) "iatel_s_all",(iatel_s_all(i),i=0,nfgtasks) + write (iout,*) "iatel_e_all",(iatel_e_all(i),i=0,nfgtasks) + write (iout,*) "iturn3_start_all", + & (iturn3_start_all(i),i=0,nfgtasks-1) + write (iout,*) "iturn3_end_all", + & (iturn3_end_all(i),i=0,nfgtasks-1) + write (iout,*) "iturn4_start_all", + & (iturn4_start_all(i),i=0,nfgtasks-1) + write (iout,*) "iturn4_end_all", + & (iturn4_end_all(i),i=0,nfgtasks-1) + write (iout,*) "The ielstart_all array" + do i=nnt,nct + write (iout,'(20i4)') i,(ielstart_all(i,j),j=0,nfgtasks-1) + enddo + write (iout,*) "The ielend_all array" + do i=nnt,nct + write (iout,'(20i4)') i,(ielend_all(i,j),j=0,nfgtasks-1) + enddo + call flush(iout) + endif + ntask_cont_from=0 + ntask_cont_to=0 + itask_cont_from(0)=fg_rank + itask_cont_to(0)=fg_rank + flag=.false. + do ii=iturn3_start,iturn3_end + call add_int(ii,ii+2,iturn3_sent(1,ii), + & ntask_cont_to,itask_cont_to,flag) + enddo + do ii=iturn4_start,iturn4_end + call add_int(ii,ii+3,iturn4_sent(1,ii), + & ntask_cont_to,itask_cont_to,flag) + enddo + do ii=iturn3_start,iturn3_end + call add_int_from(ii,ii+2,ntask_cont_from,itask_cont_from) + enddo + do ii=iturn4_start,iturn4_end + call add_int_from(ii,ii+3,ntask_cont_from,itask_cont_from) + enddo + if (lprint) then + write (iout,*) "After turn3 ntask_cont_from",ntask_cont_from, + & " ntask_cont_to",ntask_cont_to + write (iout,*) "itask_cont_from", + & (itask_cont_from(i),i=1,ntask_cont_from) + write (iout,*) "itask_cont_to", + & (itask_cont_to(i),i=1,ntask_cont_to) + call flush(iout) + endif +c write (iout,*) "Loop forward" +c call flush(iout) + do i=iatel_s,iatel_e +c write (iout,*) "from loop i=",i +c call flush(iout) + do j=ielstart(i),ielend(i) + call add_int_from(i,j,ntask_cont_from,itask_cont_from) + enddo + enddo +c write (iout,*) "Loop backward iatel_e-1",iatel_e-1, +c & " iatel_e",iatel_e +c call flush(iout) + nat_sent=0 + do i=iatel_s,iatel_e +c write (iout,*) "i",i," ielstart",ielstart(i), +c & " ielend",ielend(i) +c call flush(iout) + flag=.false. + do j=ielstart(i),ielend(i) + call add_int(i,j,iint_sent(1,j,nat_sent+1),ntask_cont_to, + & itask_cont_to,flag) + enddo + if (flag) then + nat_sent=nat_sent+1 + iat_sent(nat_sent)=i + endif + enddo + if (lprint) then + write (iout,*)"After longrange ntask_cont_from",ntask_cont_from, + & " ntask_cont_to",ntask_cont_to + write (iout,*) "itask_cont_from", + & (itask_cont_from(i),i=1,ntask_cont_from) + write (iout,*) "itask_cont_to", + & (itask_cont_to(i),i=1,ntask_cont_to) + call flush(iout) + write (iout,*) "iint_sent" + do i=1,nat_sent + ii=iat_sent(i) + write (iout,'(20i4)') ii,(j,(iint_sent(k,j,i),k=1,4), + & j=ielstart(ii),ielend(ii)) + enddo + write (iout,*) "iturn3_sent iturn3_start",iturn3_start, + & " iturn3_end",iturn3_end + write (iout,'(20i4)') (i,(iturn3_sent(j,i),j=1,4), + & i=iturn3_start,iturn3_end) + write (iout,*) "iturn4_sent iturn4_start",iturn4_start, + & " iturn4_end",iturn4_end + write (iout,'(20i4)') (i,(iturn4_sent(j,i),j=1,4), + & i=iturn4_start,iturn4_end) + call flush(iout) + endif + call MPI_Gather(ntask_cont_from,1,MPI_INTEGER, + & ntask_cont_from_all,1,MPI_INTEGER,king,FG_COMM,IERR) +c write (iout,*) "Gather ntask_cont_from ended" +c call flush(iout) + call MPI_Gather(itask_cont_from(0),max_fg_procs,MPI_INTEGER, + & itask_cont_from_all(0,0),max_fg_procs,MPI_INTEGER,king, + & FG_COMM,IERR) +c write (iout,*) "Gather itask_cont_from ended" +c call flush(iout) + call MPI_Gather(ntask_cont_to,1,MPI_INTEGER,ntask_cont_to_all, + & 1,MPI_INTEGER,king,FG_COMM,IERR) +c write (iout,*) "Gather ntask_cont_to ended" +c call flush(iout) + call MPI_Gather(itask_cont_to,max_fg_procs,MPI_INTEGER, + & itask_cont_to_all,max_fg_procs,MPI_INTEGER,king,FG_COMM,IERR) +c write (iout,*) "Gather itask_cont_to ended" +c call flush(iout) + if (fg_rank.eq.king) then + write (iout,*)"Contact receive task map (proc, #tasks, tasks)" + do i=0,nfgtasks-1 + write (iout,'(20i4)') i,ntask_cont_from_all(i), + & (itask_cont_from_all(j,i),j=1,ntask_cont_from_all(i)) + enddo + write (iout,*) + call flush(iout) + write (iout,*) "Contact send task map (proc, #tasks, tasks)" + do i=0,nfgtasks-1 + write (iout,'(20i4)') i,ntask_cont_to_all(i), + & (itask_cont_to_all(j,i),j=1,ntask_cont_to_all(i)) + enddo + write (iout,*) + call flush(iout) +C Check if every send will have a matching receive + ncheck_to=0 + ncheck_from=0 + do i=0,nfgtasks-1 + ncheck_to=ncheck_to+ntask_cont_to_all(i) + ncheck_from=ncheck_from+ntask_cont_from_all(i) + enddo + write (iout,*) "Control sums",ncheck_from,ncheck_to + if (ncheck_from.ne.ncheck_to) then + write (iout,*) "Error: #receive differs from #send." + write (iout,*) "Terminating program...!" + call flush(iout) + flag=.false. + else + flag=.true. + do i=0,nfgtasks-1 + do j=1,ntask_cont_to_all(i) + ii=itask_cont_to_all(j,i) + do k=1,ntask_cont_from_all(ii) + if (itask_cont_from_all(k,ii).eq.i) then + if(lprint)write(iout,*)"Matching send/receive",i,ii + exit + endif + enddo + if (k.eq.ntask_cont_from_all(ii)+1) then + flag=.false. + write (iout,*) "Error: send by",j," to",ii, + & " would have no matching receive" + endif + enddo + enddo + endif + if (.not.flag) then + write (iout,*) "Unmatched sends; terminating program" + call flush(iout) + endif + endif + call MPI_Bcast(flag,1,MPI_LOGICAL,king,FG_COMM,IERROR) +c write (iout,*) "flag broadcast ended flag=",flag +c call flush(iout) + if (.not.flag) then + call MPI_Finalize(IERROR) + stop "Error in INIT_INT_TABLE: unmatched send/receive." + endif + call MPI_Comm_group(FG_COMM,fg_group,IERR) +c write (iout,*) "MPI_Comm_group ended" +c call flush(iout) + call MPI_Group_incl(fg_group,ntask_cont_from+1, + & itask_cont_from(0),CONT_FROM_GROUP,IERR) + call MPI_Group_incl(fg_group,ntask_cont_to+1,itask_cont_to(0), + & CONT_TO_GROUP,IERR) + do i=1,nat_sent + ii=iat_sent(i) + iaux=4*(ielend(ii)-ielstart(ii)+1) + call MPI_Group_translate_ranks(fg_group,iaux, + & iint_sent(1,ielstart(ii),i),CONT_TO_GROUP, + & iint_sent_local(1,ielstart(ii),i),IERR ) +c write (iout,*) "Ranks translated i=",i +c call flush(iout) + enddo + iaux=4*(iturn3_end-iturn3_start+1) + call MPI_Group_translate_ranks(fg_group,iaux, + & iturn3_sent(1,iturn3_start),CONT_TO_GROUP, + & iturn3_sent_local(1,iturn3_start),IERR) + iaux=4*(iturn4_end-iturn4_start+1) + call MPI_Group_translate_ranks(fg_group,iaux, + & iturn4_sent(1,iturn4_start),CONT_TO_GROUP, + & iturn4_sent_local(1,iturn4_start),IERR) + if (lprint) then + write (iout,*) "iint_sent_local" + do i=1,nat_sent + ii=iat_sent(i) + write (iout,'(20i4)') ii,(j,(iint_sent_local(k,j,i),k=1,4), + & j=ielstart(ii),ielend(ii)) + call flush(iout) + enddo + write (iout,*) "iturn3_sent_local iturn3_start",iturn3_start, + & " iturn3_end",iturn3_end + write (iout,'(20i4)') (i,(iturn3_sent_local(j,i),j=1,4), + & i=iturn3_start,iturn3_end) + write (iout,*) "iturn4_sent_local iturn4_start",iturn4_start, + & " iturn4_end",iturn4_end + write (iout,'(20i4)') (i,(iturn4_sent_local(j,i),j=1,4), + & i=iturn4_start,iturn4_end) + call flush(iout) + endif + call MPI_Group_free(fg_group,ierr) + call MPI_Group_free(cont_from_group,ierr) + call MPI_Group_free(cont_to_group,ierr) + call MPI_Type_contiguous(3,MPI_DOUBLE_PRECISION,MPI_UYZ,IERROR) + call MPI_Type_commit(MPI_UYZ,IERROR) + call MPI_Type_contiguous(18,MPI_DOUBLE_PRECISION,MPI_UYZGRAD, + & IERROR) + call MPI_Type_commit(MPI_UYZGRAD,IERROR) + call MPI_Type_contiguous(2,MPI_DOUBLE_PRECISION,MPI_MU,IERROR) + call MPI_Type_commit(MPI_MU,IERROR) + call MPI_Type_contiguous(4,MPI_DOUBLE_PRECISION,MPI_MAT1,IERROR) + call MPI_Type_commit(MPI_MAT1,IERROR) + call MPI_Type_contiguous(8,MPI_DOUBLE_PRECISION,MPI_MAT2,IERROR) + call MPI_Type_commit(MPI_MAT2,IERROR) + call MPI_Type_contiguous(6,MPI_DOUBLE_PRECISION,MPI_THET,IERROR) + call MPI_Type_commit(MPI_THET,IERROR) + call MPI_Type_contiguous(9,MPI_DOUBLE_PRECISION,MPI_GAM,IERROR) + call MPI_Type_commit(MPI_GAM,IERROR) +#ifndef MATGATHER +c 9/22/08 Derived types to send matrices which appear in correlation terms + do i=0,nfgtasks-1 + if (ivec_count(i).eq.ivec_count(0)) then + lentyp(i)=0 + else + lentyp(i)=1 + endif + enddo + do ind_typ=lentyp(0),lentyp(nfgtasks-1) + if (ind_typ.eq.0) then + ichunk=ivec_count(0) + else + ichunk=ivec_count(1) + endif +c do i=1,4 +c blocklengths(i)=4 +c enddo +c displs(1)=0 +c do i=2,4 +c displs(i)=displs(i-1)+blocklengths(i-1)*maxres +c enddo +c do i=1,4 +c blocklengths(i)=blocklengths(i)*ichunk +c enddo +c write (iout,*) "blocklengths and displs" +c do i=1,4 +c write (iout,*) i,blocklengths(i),displs(i) +c enddo +c call flush(iout) +c call MPI_Type_indexed(4,blocklengths(1),displs(1), +c & MPI_DOUBLE_PRECISION,MPI_ROTAT1(ind_typ),IERROR) +c call MPI_Type_commit(MPI_ROTAT1(ind_typ),IERROR) +c write (iout,*) "MPI_ROTAT1",MPI_ROTAT1 +c do i=1,4 +c blocklengths(i)=2 +c enddo +c displs(1)=0 +c do i=2,4 +c displs(i)=displs(i-1)+blocklengths(i-1)*maxres +c enddo +c do i=1,4 +c blocklengths(i)=blocklengths(i)*ichunk +c enddo +c write (iout,*) "blocklengths and displs" +c do i=1,4 +c write (iout,*) i,blocklengths(i),displs(i) +c enddo +c call flush(iout) +c call MPI_Type_indexed(4,blocklengths(1),displs(1), +c & MPI_DOUBLE_PRECISION,MPI_ROTAT2(ind_typ),IERROR) +c call MPI_Type_commit(MPI_ROTAT2(ind_typ),IERROR) +c write (iout,*) "MPI_ROTAT2",MPI_ROTAT2 + do i=1,8 + blocklengths(i)=2 + enddo + displs(1)=0 + do i=2,8 + displs(i)=displs(i-1)+blocklengths(i-1)*maxres + enddo + do i=1,15 + blocklengths(i)=blocklengths(i)*ichunk + enddo + call MPI_Type_indexed(8,blocklengths,displs, + & MPI_DOUBLE_PRECISION,MPI_PRECOMP11(ind_typ),IERROR) + call MPI_Type_commit(MPI_PRECOMP11(ind_typ),IERROR) + do i=1,8 + blocklengths(i)=4 + enddo + displs(1)=0 + do i=2,8 + displs(i)=displs(i-1)+blocklengths(i-1)*maxres + enddo + do i=1,15 + blocklengths(i)=blocklengths(i)*ichunk + enddo + call MPI_Type_indexed(8,blocklengths,displs, + & MPI_DOUBLE_PRECISION,MPI_PRECOMP12(ind_typ),IERROR) + call MPI_Type_commit(MPI_PRECOMP12(ind_typ),IERROR) + do i=1,6 + blocklengths(i)=4 + enddo + displs(1)=0 + do i=2,6 + displs(i)=displs(i-1)+blocklengths(i-1)*maxres + enddo + do i=1,6 + blocklengths(i)=blocklengths(i)*ichunk + enddo + call MPI_Type_indexed(6,blocklengths,displs, + & MPI_DOUBLE_PRECISION,MPI_PRECOMP22(ind_typ),IERROR) + call MPI_Type_commit(MPI_PRECOMP22(ind_typ),IERROR) + do i=1,2 + blocklengths(i)=8 + enddo + displs(1)=0 + do i=2,2 + displs(i)=displs(i-1)+blocklengths(i-1)*maxres + enddo + do i=1,2 + blocklengths(i)=blocklengths(i)*ichunk + enddo + call MPI_Type_indexed(2,blocklengths,displs, + & MPI_DOUBLE_PRECISION,MPI_PRECOMP23(ind_typ),IERROR) + call MPI_Type_commit(MPI_PRECOMP23(ind_typ),IERROR) + do i=1,4 + blocklengths(i)=1 + enddo + displs(1)=0 + do i=2,4 + displs(i)=displs(i-1)+blocklengths(i-1)*maxres + enddo + do i=1,4 + blocklengths(i)=blocklengths(i)*ichunk + enddo + call MPI_Type_indexed(4,blocklengths,displs, + & MPI_DOUBLE_PRECISION,MPI_ROTAT_OLD(ind_typ),IERROR) + call MPI_Type_commit(MPI_ROTAT_OLD(ind_typ),IERROR) + enddo +#endif + endif + iint_start=ivec_start+1 + iint_end=ivec_end+1 + do i=0,nfgtasks-1 + iint_count(i)=ivec_count(i) + iint_displ(i)=ivec_displ(i) + ivec_displ(i)=ivec_displ(i)-1 + iset_displ(i)=iset_displ(i)-1 + ithet_displ(i)=ithet_displ(i)-1 + iphi_displ(i)=iphi_displ(i)-1 + iphi1_displ(i)=iphi1_displ(i)-1 + ibond_displ(i)=ibond_displ(i)-1 + enddo + if (nfgtasks.gt.1 .and. fg_rank.eq.king + & .and. (me.eq.0 .or. out1file)) then + write (iout,*) "IVEC_DISPL, IVEC_COUNT, ISET_START, ISET_COUNT" + do i=0,nfgtasks-1 + write (iout,*) i,ivec_displ(i),ivec_count(i),iset_displ(i), + & iset_count(i) + enddo + write (iout,*) "iphi_start",iphi_start," iphi_end",iphi_end, + & " iphi1_start",iphi1_start," iphi1_end",iphi1_end + write (iout,*)"IPHI_COUNT, IPHI_DISPL, IPHI1_COUNT, IPHI1_DISPL" + do i=0,nfgtasks-1 + write (iout,*) i,iphi_count(i),iphi_displ(i),iphi1_count(i), + & iphi1_displ(i) + enddo + write(iout,'(i10,a,i10,a,i10,a/a,i3,a)') n_sc_int_tot,' SC-SC ', + & nele_int_tot,' electrostatic and ',nscp_int_tot, + & ' SC-p interactions','were distributed among',nfgtasks, + & ' fine-grain processors.' + endif +#else + loc_start=2 + loc_end=nres-1 + ithet_start=3 + ithet_end=nres + iturn3_start=nnt + iturn3_end=nct-3 + iturn4_start=nnt + iturn4_end=nct-4 + iphi_start=nnt+3 + iphi_end=nct + iphi1_start=4 + iphi1_end=nres + idihconstr_start=1 + idihconstr_end=ndih_constr + iphid_start=iphi_start + iphid_end=iphi_end-1 + itau_start=4 + itau_end=nres + ibond_start=2 + ibond_end=nres-1 + ibondp_start=nnt+1 + ibondp_end=nct + ivec_start=1 + ivec_end=nres-1 + iset_start=3 + iset_end=nres+1 + iint_start=2 + iint_end=nres-1 +#endif + return + end +#ifdef MPI +c--------------------------------------------------------------------------- + subroutine add_int(ii,jj,itask,ntask_cont_to,itask_cont_to,flag) + implicit none + include "DIMENSIONS" + include "COMMON.INTERACT" + include "COMMON.SETUP" + include "COMMON.IOUNITS" + integer ii,jj,itask(4), + & ntask_cont_to,itask_cont_to(0:max_fg_procs-1) + logical flag + integer iturn3_start_all,iturn3_end_all,iturn4_start_all, + & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all + common /przechowalnia/ iturn3_start_all(0:max_fg_procs), + & iturn3_end_all(0:max_fg_procs),iturn4_start_all(0:max_fg_procs), + & iturn4_end_all(0:max_fg_procs),iatel_s_all(0:max_fg_procs), + &iatel_e_all(0:max_fg_procs),ielstart_all(maxres,0:max_fg_procs-1), + & ielend_all(maxres,0:max_fg_procs-1) + integer iproc,isent,k,l +c Determines whether to send interaction ii,jj to other processors; a given +c interaction can be sent to at most 2 processors. +c Sets flag=.true. if interaction ii,jj needs to be sent to at least +c one processor, otherwise flag is unchanged from the input value. + isent=0 + itask(1)=fg_rank + itask(2)=fg_rank + itask(3)=fg_rank + itask(4)=fg_rank +c write (iout,*) "ii",ii," jj",jj +c Loop over processors to check if anybody could need interaction ii,jj + do iproc=0,fg_rank-1 +c Check if the interaction matches any turn3 at iproc + do k=iturn3_start_all(iproc),iturn3_end_all(iproc) + l=k+2 + if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1 + & .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1) + & then +c write (iout,*) "turn3 to iproc",iproc," ij",ii,jj,"kl",k,l +c call flush(iout) + flag=.true. + if (iproc.ne.itask(1).and.iproc.ne.itask(2) + & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then + isent=isent+1 + itask(isent)=iproc + call add_task(iproc,ntask_cont_to,itask_cont_to) + endif + endif + enddo +C Check if the interaction matches any turn4 at iproc + do k=iturn4_start_all(iproc),iturn4_end_all(iproc) + l=k+3 + if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1 + & .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1) + & then +c write (iout,*) "turn3 to iproc",iproc," ij",ii,jj," kl",k,l +c call flush(iout) + flag=.true. + if (iproc.ne.itask(1).and.iproc.ne.itask(2) + & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then + isent=isent+1 + itask(isent)=iproc + call add_task(iproc,ntask_cont_to,itask_cont_to) + endif + endif + enddo + if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0 .and. + & iatel_s_all(iproc).le.ii-1 .and. iatel_e_all(iproc).ge.ii-1)then + if (ielstart_all(ii-1,iproc).le.jj-1.and. + & ielend_all(ii-1,iproc).ge.jj-1) then + flag=.true. + if (iproc.ne.itask(1).and.iproc.ne.itask(2) + & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then + isent=isent+1 + itask(isent)=iproc + call add_task(iproc,ntask_cont_to,itask_cont_to) + endif + endif + if (ielstart_all(ii-1,iproc).le.jj+1.and. + & ielend_all(ii-1,iproc).ge.jj+1) then + flag=.true. + if (iproc.ne.itask(1).and.iproc.ne.itask(2) + & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then + isent=isent+1 + itask(isent)=iproc + call add_task(iproc,ntask_cont_to,itask_cont_to) + endif + endif + endif + enddo + return + end +c--------------------------------------------------------------------------- + subroutine add_int_from(ii,jj,ntask_cont_from,itask_cont_from) + implicit none + include "DIMENSIONS" + include "COMMON.INTERACT" + include "COMMON.SETUP" + include "COMMON.IOUNITS" + integer ii,jj,itask(2),ntask_cont_from, + & itask_cont_from(0:max_fg_procs-1) + logical flag + integer iturn3_start_all,iturn3_end_all,iturn4_start_all, + & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all + common /przechowalnia/ iturn3_start_all(0:max_fg_procs), + & iturn3_end_all(0:max_fg_procs),iturn4_start_all(0:max_fg_procs), + & iturn4_end_all(0:max_fg_procs),iatel_s_all(0:max_fg_procs), + &iatel_e_all(0:max_fg_procs),ielstart_all(maxres,0:max_fg_procs-1), + & ielend_all(maxres,0:max_fg_procs-1) + integer iproc,k,l + do iproc=fg_rank+1,nfgtasks-1 + do k=iturn3_start_all(iproc),iturn3_end_all(iproc) + l=k+2 + if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1 + & .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1) + & then +c write (iout,*)"turn3 from iproc",iproc," ij",ii,jj," kl",k,l + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + enddo + do k=iturn4_start_all(iproc),iturn4_end_all(iproc) + l=k+3 + if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1 + & .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1) + & then +c write (iout,*)"turn4 from iproc",iproc," ij",ii,jj," kl",k,l + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + enddo + if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0) then + if (ii+1.ge.iatel_s_all(iproc).and.ii+1.le.iatel_e_all(iproc)) + & then + if (jj+1.ge.ielstart_all(ii+1,iproc).and. + & jj+1.le.ielend_all(ii+1,iproc)) then + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + if (jj-1.ge.ielstart_all(ii+1,iproc).and. + & jj-1.le.ielend_all(ii+1,iproc)) then + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + endif + if (ii-1.ge.iatel_s_all(iproc).and.ii-1.le.iatel_e_all(iproc)) + & then + if (jj-1.ge.ielstart_all(ii-1,iproc).and. + & jj-1.le.ielend_all(ii-1,iproc)) then + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + if (jj+1.ge.ielstart_all(ii-1,iproc).and. + & jj+1.le.ielend_all(ii-1,iproc)) then + call add_task(iproc,ntask_cont_from,itask_cont_from) + endif + endif + endif + enddo + return + end +c--------------------------------------------------------------------------- + subroutine add_task(iproc,ntask_cont,itask_cont) + implicit none + include "DIMENSIONS" + integer iproc,ntask_cont,itask_cont(0:max_fg_procs-1) + integer ii + do ii=1,ntask_cont + if (itask_cont(ii).eq.iproc) return + enddo + ntask_cont=ntask_cont+1 + itask_cont(ntask_cont)=iproc + return + end +c--------------------------------------------------------------------------- + subroutine int_bounds(total_ints,lower_bound,upper_bound) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SETUP' + integer total_ints,lower_bound,upper_bound + integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs) + nint=total_ints/nfgtasks + do i=1,nfgtasks + int4proc(i-1)=nint + enddo + nexcess=total_ints-nint*nfgtasks + do i=1,nexcess + int4proc(nfgtasks-i)=int4proc(nfgtasks-i)+1 + enddo + lower_bound=0 + do i=0,fg_rank-1 + lower_bound=lower_bound+int4proc(i) + enddo + upper_bound=lower_bound+int4proc(fg_rank) + lower_bound=lower_bound+1 + return + end +c--------------------------------------------------------------------------- + subroutine int_bounds1(total_ints,lower_bound,upper_bound) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.SETUP' + integer total_ints,lower_bound,upper_bound + integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs) + nint=total_ints/nfgtasks1 + do i=1,nfgtasks1 + int4proc(i-1)=nint + enddo + nexcess=total_ints-nint*nfgtasks1 + do i=1,nexcess + int4proc(nfgtasks1-i)=int4proc(nfgtasks1-i)+1 + enddo + lower_bound=0 + do i=0,fg_rank1-1 + lower_bound=lower_bound+int4proc(i) + enddo + upper_bound=lower_bound+int4proc(fg_rank1) + lower_bound=lower_bound+1 + return + end +c--------------------------------------------------------------------------- + subroutine int_partition(int_index,lower_index,upper_index,atom, + & at_start,at_end,first_atom,last_atom,int_gr,jat_start,jat_end,*) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + integer int_index,lower_index,upper_index,atom,at_start,at_end, + & first_atom,last_atom,int_gr,jat_start,jat_end + logical lprn + lprn=.false. + if (lprn) write (iout,*) 'int_index=',int_index + int_index_old=int_index + int_index=int_index+last_atom-first_atom+1 + if (lprn) + & write (iout,*) 'int_index=',int_index, + & ' int_index_old',int_index_old, + & ' lower_index=',lower_index, + & ' upper_index=',upper_index, + & ' atom=',atom,' first_atom=',first_atom, + & ' last_atom=',last_atom + if (int_index.ge.lower_index) then + int_gr=int_gr+1 + if (at_start.eq.0) then + at_start=atom + jat_start=first_atom-1+lower_index-int_index_old + else + jat_start=first_atom + endif + if (lprn) write (iout,*) 'jat_start',jat_start + if (int_index.ge.upper_index) then + at_end=atom + jat_end=first_atom-1+upper_index-int_index_old + return1 + else + jat_end=last_atom + endif + if (lprn) write (iout,*) 'jat_end',jat_end + endif + return + end +#endif +c------------------------------------------------------------------------------ + subroutine hpb_partition + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' + include 'COMMON.SETUP' + include 'COMMON.CONTROL' +c write(2,*)"hpb_partition: nhpb=",nhpb +#ifdef MPI + call int_bounds(nhpb,link_start,link_end) + if (.not. out1file) + & write (iout,*) 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',MyRank, + & ' nhpb',nhpb,' link_start=',link_start, + & ' link_end',link_end +#else + link_start=1 + link_end=nhpb +#endif +c write(2,*)"hpb_partition: link_start=",nhpb," link_end=",link_end + return + end diff --git a/source/unres/src_MD-NEWSC/int_to_cart.f b/source/unres/src_MD-NEWSC/int_to_cart.f new file mode 100644 index 0000000..73e8384 --- /dev/null +++ b/source/unres/src_MD-NEWSC/int_to_cart.f @@ -0,0 +1,278 @@ + subroutine int_to_cart +c-------------------------------------------------------------- +c This subroutine converts the energy derivatives from internal +c coordinates to cartesian coordinates +c------------------------------------------------------------- + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.SCCOR' +c calculating dE/ddc1 + if (nres.lt.3) goto 18 +c do i=1,nres +c c do intertyp=1,3 +c write (iout,*) "przed tosyjnymi",i,intertyp,gcart(intertyp,i) +c &,gloc_sc(1,i,icg),gloc(i,icg) +c enddo +c enddo + do j=1,3 + gcart(j,1)=gcart(j,1)+gloc(1,icg)*dphi(j,1,4) + & +gloc(nres-2,icg)*dtheta(j,1,3) + if(itype(2).ne.10) then + gcart(j,1)=gcart(j,1)+gloc(ialph(2,1),icg)*dalpha(j,1,2)+ + & gloc(ialph(2,1)+nside,icg)*domega(j,1,2) + endif + enddo +c Calculating the remainder of dE/ddc2 + do j=1,3 + gcart(j,2)=gcart(j,2)+gloc(1,icg)*dphi(j,2,4)+ + & gloc(nres-2,icg)*dtheta(j,2,3)+gloc(nres-1,icg)*dtheta(j,1,4) + if(itype(2).ne.10) then + gcart(j,2)=gcart(j,2)+gloc(ialph(2,1),icg)*dalpha(j,2,2)+ + & gloc(ialph(2,1)+nside,icg)*domega(j,2,2) + endif + if(itype(3).ne.10) then + gcart(j,2)=gcart(j,2)+gloc(ialph(3,1),icg)*dalpha(j,1,3)+ + & gloc(ialph(3,1)+nside,icg)*domega(j,1,3) + endif + if(nres.gt.4) then + gcart(j,2)=gcart(j,2)+gloc(2,icg)*dphi(j,1,5) + endif + enddo +c If there are only five residues + if(nres.eq.5) then + do j=1,3 + gcart(j,3)=gcart(j,3)+gloc(1,icg)*dphi(j,3,4)+gloc(2,icg)* + & dphi(j,2,5)+gloc(nres-1,icg)*dtheta(j,2,4)+gloc(nres,icg)* + & dtheta(j,1,5) + if(itype(3).ne.10) then + gcart(j,3)=gcart(j,3)+gloc(ialph(3,1),icg)* + & dalpha(j,2,3)+gloc(ialph(3,1)+nside,icg)*domega(j,2,3) + endif + if(itype(4).ne.10) then + gcart(j,3)=gcart(j,3)+gloc(ialph(4,1),icg)* + & dalpha(j,1,4)+gloc(ialph(4,1)+nside,icg)*domega(j,1,4) + endif + enddo + endif +c If there are more than five residues + if(nres.gt.5) then + do i=3,nres-3 + do j=1,3 + gcart(j,i)=gcart(j,i)+gloc(i-2,icg)*dphi(j,3,i+1) + & +gloc(i-1,icg)*dphi(j,2,i+2)+ + & gloc(i,icg)*dphi(j,1,i+3)+gloc(nres+i-4,icg)*dtheta(j,2,i+1)+ + & gloc(nres+i-3,icg)*dtheta(j,1,i+2) + if(itype(i).ne.10) then + gcart(j,i)=gcart(j,i)+gloc(ialph(i,1),icg)*dalpha(j,2,i)+ + & gloc(ialph(i,1)+nside,icg)*domega(j,2,i) + endif + if(itype(i+1).ne.10) then + gcart(j,i)=gcart(j,i)+gloc(ialph(i+1,1),icg)*dalpha(j,1,i+1) + & +gloc(ialph(i+1,1)+nside,icg)*domega(j,1,i+1) + endif + enddo + enddo + endif +c Setting dE/ddnres-2 + if(nres.gt.5) then + do j=1,3 + gcart(j,nres-2)=gcart(j,nres-2)+gloc(nres-4,icg)* + & dphi(j,3,nres-1)+gloc(nres-3,icg)*dphi(j,2,nres) + & +gloc(2*nres-6,icg)* + & dtheta(j,2,nres-1)+gloc(2*nres-5,icg)*dtheta(j,1,nres) + if(itype(nres-2).ne.10) then + gcart(j,nres-2)=gcart(j,nres-2)+gloc(ialph(nres-2,1),icg)* + & dalpha(j,2,nres-2)+gloc(ialph(nres-2,1)+nside,icg)* + & domega(j,2,nres-2) + endif + if(itype(nres-1).ne.10) then + gcart(j,nres-2)=gcart(j,nres-2)+gloc(ialph(nres-1,1),icg)* + & dalpha(j,1,nres-1)+gloc(ialph(nres-1,1)+nside,icg)* + & domega(j,1,nres-1) + endif + enddo + endif +c Settind dE/ddnres-1 + do j=1,3 + gcart(j,nres-1)=gcart(j,nres-1)+gloc(nres-3,icg)*dphi(j,3,nres)+ + & gloc(2*nres-5,icg)*dtheta(j,2,nres) + if(itype(nres-1).ne.10) then + gcart(j,nres-1)=gcart(j,nres-1)+gloc(ialph(nres-1,1),icg)* + & dalpha(j,2,nres-1)+gloc(ialph(nres-1,1)+nside,icg)* + & domega(j,2,nres-1) + endif + enddo +c The side-chain vector derivatives + do i=2,nres-1 + if(itype(i).ne.10) then + do j=1,3 + gxcart(j,i)=gxcart(j,i)+gloc(ialph(i,1),icg)*dalpha(j,3,i) + & +gloc(ialph(i,1)+nside,icg)*domega(j,3,i) + enddo + endif + enddo +c---------------------------------------------------------------------- +C INTERTYP=1 SC...Ca...Ca...Ca +C INTERTYP=2 Ca...Ca...Ca...SC +C INTERTYP=3 SC...Ca...Ca...SC +c calculating dE/ddc1 + 18 continue +c do i=1,nres +c gloc(i,icg)=0.0D0 +c write (iout,*) "poczotkoawy",i,gloc_sc(1,i,icg) +c enddo + if (nres.lt.2) return + if ((nres.lt.3).and.(itype(1).eq.10)) return + if ((itype(1).ne.10).and.(itype(1).ne.21)) then + do j=1,3 +cc Derviative was calculated for oposite vector of side chain therefore +c there is "-" sign before gloc_sc + gxcart(j,1)=gxcart(j,1)-gloc_sc(1,0,icg)* + & dtauangle(j,1,1,3) + gcart(j,1)=gcart(j,1)+gloc_sc(1,0,icg)* + & dtauangle(j,1,2,3) + if ((itype(2).ne.10).and.(itype(2).ne.21)) then + gxcart(j,1)= gxcart(j,1) + & -gloc_sc(3,0,icg)*dtauangle(j,3,1,3) + gcart(j,1)=gcart(j,1)+gloc_sc(3,0,icg)* + & dtauangle(j,3,2,3) + endif + enddo + endif + if ((nres.ge.3).and.(itype(3).ne.10).and.(itype(3).ne.21)) + & then + do j=1,3 + gcart(j,1)=gcart(j,1)+gloc_sc(2,1,icg)*dtauangle(j,2,1,4) + enddo + endif +c As potetnial DO NOT depend on omicron anlge their derivative is +c ommited +c & +gloc_sc(intertyp,nres-2,icg)*dtheta(j,1,3) + +c Calculating the remainder of dE/ddc2 + do j=1,3 + if((itype(2).ne.10).and.(itype(2).ne.21)) then + if (itype(1).ne.10) gxcart(j,2)=gxcart(j,2)+ + & gloc_sc(3,0,icg)*dtauangle(j,3,3,3) + if ((itype(3).ne.10).and.(nres.ge.3).and.(itype(3).ne.21)) then + gxcart(j,2)=gxcart(j,2)-gloc_sc(3,1,icg)*dtauangle(j,3,1,4) +cc the - above is due to different vector direction + gcart(j,2)=gcart(j,2)+gloc_sc(3,1,icg)*dtauangle(j,3,2,4) + endif + if (nres.gt.3) then + gxcart(j,2)=gxcart(j,2)-gloc_sc(1,1,icg)*dtauangle(j,1,1,4) +cc the - above is due to different vector direction + gcart(j,2)=gcart(j,2)+gloc_sc(1,1,icg)*dtauangle(j,1,2,4) +c write(iout,*) gloc_sc(1,1,icg),dtauangle(j,1,2,4),"gcart" +c write(iout,*) gloc_sc(1,1,icg),dtauangle(j,1,1,4),"gx" + endif + endif + if ((itype(1).ne.10).and.(itype(1).ne.21)) then + gcart(j,2)=gcart(j,2)+gloc_sc(1,0,icg)*dtauangle(j,1,3,3) +c write(iout,*) gloc_sc(1,0,icg),dtauangle(j,1,3,3) + endif + if ((itype(3).ne.10).and.(nres.ge.3)) then + gcart(j,2)=gcart(j,2)+gloc_sc(2,1,icg)*dtauangle(j,2,2,4) +c write(iout,*) gloc_sc(2,1,icg),dtauangle(j,2,2,4) + endif + if ((itype(4).ne.10).and.(nres.ge.4)) then + gcart(j,2)=gcart(j,2)+gloc_sc(2,2,icg)*dtauangle(j,2,1,5) +c write(iout,*) gloc_sc(2,2,icg),dtauangle(j,2,1,5) + endif + +c write(iout,*) gcart(j,2),itype(2),itype(1),itype(3), "gcart2" + enddo +c If there are more than five residues + if(nres.ge.5) then + do i=3,nres-2 + do j=1,3 +c write(iout,*) "before", gcart(j,i) + if (itype(i).ne.10) then + gxcart(j,i)=gxcart(j,i)+gloc_sc(2,i-2,icg) + & *dtauangle(j,2,3,i+1) + & -gloc_sc(1,i-1,icg)*dtauangle(j,1,1,i+2) + gcart(j,i)=gcart(j,i)+gloc_sc(1,i-1,icg) + & *dtauangle(j,1,2,i+2) +c write(iout,*) "new",j,i, +c & gcart(j,i),gloc_sc(1,i-1,icg),dtauangle(j,1,2,i+2) + + if (itype(i-1).ne.10) then + gxcart(j,i)=gxcart(j,i)+gloc_sc(3,i-2,icg) + &*dtauangle(j,3,3,i+1) + endif + if (itype(i+1).ne.10) then + gxcart(j,i)=gxcart(j,i)-gloc_sc(3,i-1,icg) + &*dtauangle(j,3,1,i+2) + gcart(j,i)=gcart(j,i)+gloc_sc(3,i-1,icg) + &*dtauangle(j,3,2,i+2) + endif + endif + if (itype(i-1).ne.10) then + gcart(j,i)=gcart(j,i)+gloc_sc(1,i-2,icg)* + & dtauangle(j,1,3,i+1) + endif + if (itype(i+1).ne.10) then + gcart(j,i)=gcart(j,i)+gloc_sc(2,i-1,icg)* + & dtauangle(j,2,2,i+2) +c write(iout,*) "numer",i,gloc_sc(2,i-1,icg), +c & dtauangle(j,2,2,i+2) + endif + if (itype(i+2).ne.10) then + gcart(j,i)=gcart(j,i)+gloc_sc(2,i,icg)* + & dtauangle(j,2,1,i+3) + endif + enddo + enddo + endif +c Setting dE/ddnres-1 + if(nres.ge.4) then + do j=1,3 + if ((itype(nres-1).ne.10).and.(itype(nres-1).ne.21)) then + gxcart(j,nres-1)=gxcart(j,nres-1)+gloc_sc(2,nres-3,icg) + & *dtauangle(j,2,3,nres) +c write (iout,*) "gxcart(nres-1)", gloc_sc(2,nres-3,icg), +c & dtauangle(j,2,3,nres), gxcart(j,nres-1) + if (itype(nres-2).ne.10) then + gxcart(j,nres-1)=gxcart(j,nres-1)+gloc_sc(3,nres-3,icg) + & *dtauangle(j,3,3,nres) + endif + if ((itype(nres).ne.10).and.(itype(nres).ne.21)) then + gxcart(j,nres-1)=gxcart(j,nres-1)-gloc_sc(3,nres-2,icg) + & *dtauangle(j,3,1,nres+1) + gcart(j,nres-1)=gcart(j,nres-1)+gloc_sc(3,nres-2,icg) + & *dtauangle(j,3,2,nres+1) + endif + endif + if ((itype(nres-2).ne.10).and.(itype(nres-2).ne.21)) then + gcart(j,nres-1)=gcart(j,nres-1)+gloc_sc(1,nres-3,icg)* + & dtauangle(j,1,3,nres) + endif + if ((itype(nres).ne.10).and.(itype(nres).ne.21)) then + gcart(j,nres-1)=gcart(j,nres-1)+gloc_sc(2,nres-2,icg)* + & dtauangle(j,2,2,nres+1) +c write (iout,*) "gcart(nres-1)", gloc_sc(2,nres-2,icg), +c & dtauangle(j,2,2,nres+1), itype(nres-1),itype(nres) + endif + enddo + endif +c Settind dE/ddnres + if ((nres.ge.3).and.(itype(nres).ne.10))then + do j=1,3 + gxcart(j,nres)=gxcart(j,nres)+gloc_sc(3,nres-2,icg) + & *dtauangle(j,3,3,nres+1)+gloc_sc(2,nres-2,icg) + & *dtauangle(j,2,3,nres+1) + enddo + endif +c The side-chain vector derivatives + return + end + + diff --git a/source/unres/src_MD-NEWSC/intcartderiv.F b/source/unres/src_MD-NEWSC/intcartderiv.F new file mode 100644 index 0000000..c220540 --- /dev/null +++ b/source/unres/src_MD-NEWSC/intcartderiv.F @@ -0,0 +1,725 @@ + subroutine intcartderiv + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.LOCAL' + include 'COMMON.SCCOR' + double precision dcostheta(3,2,maxres), + & dcosphi(3,3,maxres),dsinphi(3,3,maxres), + & dcosalpha(3,3,maxres),dcosomega(3,3,maxres), + & dsinomega(3,3,maxres),vo1(3),vo2(3),vo3(3), + & dummy(3),vp1(3),vp2(3),vp3(3),vpp1(3),n(3) + +#if defined(MPI) && defined(PARINTDER) + if (nfgtasks.gt.1 .and. me.eq.king) + & call MPI_Bcast(8,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif + pi4 = 0.5d0*pipol + pi34 = 3*pi4 + +c write (iout,*) "iphi1_start",iphi1_start," iphi1_end",iphi1_end +c Derivatives of theta's +#if defined(MPI) && defined(PARINTDER) +c We need dtheta(:,:,i-1) to compute dphi(:,:,i) + do i=max0(ithet_start-1,3),ithet_end +#else + do i=3,nres +#endif + cost=dcos(theta(i)) + sint=sqrt(1-cost*cost) + do j=1,3 + dcostheta(j,1,i)=-(dc_norm(j,i-1)+cost*dc_norm(j,i-2))/ + & vbld(i-1) + dtheta(j,1,i)=-1/sint*dcostheta(j,1,i) + dcostheta(j,2,i)=-(dc_norm(j,i-2)+cost*dc_norm(j,i-1))/ + & vbld(i) + dtheta(j,2,i)=-1/sint*dcostheta(j,2,i) + enddo + enddo + +#if defined(MPI) && defined(PARINTDER) +c We need dtheta(:,:,i-1) to compute dphi(:,:,i) + do i=max0(ithet_start-1,3),ithet_end +#else + do i=3,nres +#endif + if ((itype(i-1).ne.10).and.(itype(i-1).ne.21)) then + cost1=dcos(omicron(1,i)) + sint1=sqrt(1-cost1*cost1) + cost2=dcos(omicron(2,i)) + sint2=sqrt(1-cost2*cost2) + do j=1,3 +CC Calculate derivative over first omicron (Cai-2,Cai-1,SCi-1) + dcosomicron(j,1,1,i)=-(dc_norm(j,i-1+nres)+ + & cost1*dc_norm(j,i-2))/ + & vbld(i-1) + domicron(j,1,1,i)=-1/sint1*dcosomicron(j,1,1,i) + dcosomicron(j,1,2,i)=-(dc_norm(j,i-2) + & +cost1*(dc_norm(j,i-1+nres)))/ + & vbld(i-1+nres) + domicron(j,1,2,i)=-1/sint1*dcosomicron(j,1,2,i) +CC Calculate derivative over second omicron Sci-1,Cai-1 Cai +CC Looks messy but better than if in loop + dcosomicron(j,2,1,i)=-(-dc_norm(j,i-1+nres) + & +cost2*dc_norm(j,i-1))/ + & vbld(i) + domicron(j,2,1,i)=-1/sint2*dcosomicron(j,2,1,i) + dcosomicron(j,2,2,i)=-(dc_norm(j,i-1) + & +cost2*(-dc_norm(j,i-1+nres)))/ + & vbld(i-1+nres) +c write(iout,*) "vbld", i,itype(i),vbld(i-1+nres) + domicron(j,2,2,i)=-1/sint2*dcosomicron(j,2,2,i) + enddo + endif + enddo + + + +c Derivatives of phi: +c If phi is 0 or 180 degrees, then the formulas +c have to be derived by power series expansion of the +c conventional formulas around 0 and 180. +#ifdef PARINTDER + do i=iphi1_start,iphi1_end +#else + do i=4,nres +#endif +c the conventional case + sint=dsin(theta(i)) + sint1=dsin(theta(i-1)) + sing=dsin(phi(i)) + cost=dcos(theta(i)) + cost1=dcos(theta(i-1)) + cosg=dcos(phi(i)) + scalp=scalar(dc_norm(1,i-3),dc_norm(1,i-1)) + fac0=1.0d0/(sint1*sint) + fac1=cost*fac0 + fac2=cost1*fac0 + fac3=cosg*cost1/(sint1*sint1) + fac4=cosg*cost/(sint*sint) +c Obtaining the gamma derivatives from sine derivative + if (phi(i).gt.-pi4.and.phi(i).le.pi4.or. + & phi(i).gt.pi34.and.phi(i).le.pi.or. + & phi(i).gt.-pi.and.phi(i).le.-pi34) then + call vecpr(dc_norm(1,i-1),dc_norm(1,i-2),vp1) + call vecpr(dc_norm(1,i-3),dc_norm(1,i-1),vp2) + call vecpr(dc_norm(1,i-3),dc_norm(1,i-2),vp3) + do j=1,3 + ctgt=cost/sint + ctgt1=cost1/sint1 + cosg_inv=1.0d0/cosg + dsinphi(j,1,i)=-sing*ctgt1*dtheta(j,1,i-1) + & -(fac0*vp1(j)+sing*dc_norm(j,i-3))*vbld_inv(i-2) + dphi(j,1,i)=cosg_inv*dsinphi(j,1,i) + dsinphi(j,2,i)= + & -sing*(ctgt1*dtheta(j,2,i-1)+ctgt*dtheta(j,1,i)) + & -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1) + dphi(j,2,i)=cosg_inv*dsinphi(j,2,i) +c Bug fixed 3/24/05 (AL) + dsinphi(j,3,i)=-sing*ctgt*dtheta(j,2,i) + & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i) +c & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1) + dphi(j,3,i)=cosg_inv*dsinphi(j,3,i) + enddo +c Obtaining the gamma derivatives from cosine derivative + else + do j=1,3 + dcosphi(j,1,i)=fac1*dcostheta(j,1,i-1)+fac3* + & dcostheta(j,1,i-1)-fac0*(dc_norm(j,i-1)-scalp* + & dc_norm(j,i-3))/vbld(i-2) + dphi(j,1,i)=-1/sing*dcosphi(j,1,i) + dcosphi(j,2,i)=fac1*dcostheta(j,2,i-1)+fac2* + & dcostheta(j,1,i)+fac3*dcostheta(j,2,i-1)+fac4* + & dcostheta(j,1,i) + dphi(j,2,i)=-1/sing*dcosphi(j,2,i) + dcosphi(j,3,i)=fac2*dcostheta(j,2,i)+fac4* + & dcostheta(j,2,i)-fac0*(dc_norm(j,i-3)-scalp* + & dc_norm(j,i-1))/vbld(i) + dphi(j,3,i)=-1/sing*dcosphi(j,3,i) + enddo + endif + enddo + +Calculate derivative of Tauangle +#ifdef PARINTDER + do i=itau_start,itau_end +#else + do i=3,nres +#endif + if ((itype(i-2).eq.21).or.(itype(i-2).eq.10)) cycle +cc dtauangle(j,intertyp,dervityp,residue number) +cc INTERTYP=1 SC...Ca...Ca..Ca +c the conventional case + sint=dsin(theta(i)) + sint1=dsin(omicron(2,i-1)) + sing=dsin(tauangle(1,i)) + cost=dcos(theta(i)) + cost1=dcos(omicron(2,i-1)) + cosg=dcos(tauangle(1,i)) + do j=1,3 + dc_norm2(j,i-2+nres)=-dc_norm(j,i-2+nres) +cc write(iout,*) dc_norm2(j,i-2+nres),"dcnorm" + enddo + scalp=scalar(dc_norm2(1,i-2+nres),dc_norm(1,i-1)) + fac0=1.0d0/(sint1*sint) + fac1=cost*fac0 + fac2=cost1*fac0 + fac3=cosg*cost1/(sint1*sint1) + fac4=cosg*cost/(sint*sint) +cc write(iout,*) "faki",fac0,fac1,fac2,fac3,fac4 +c Obtaining the gamma derivatives from sine derivative + if (tauangle(1,i).gt.-pi4.and.tauangle(1,i).le.pi4.or. + & tauangle(1,i).gt.pi34.and.tauangle(1,i).le.pi.or. + & tauangle(1,i).gt.-pi.and.tauangle(1,i).le.-pi34) then + call vecpr(dc_norm(1,i-1),dc_norm(1,i-2),vp1) + call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-1),vp2) + call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-2),vp3) + do j=1,3 + ctgt=cost/sint + ctgt1=cost1/sint1 + cosg_inv=1.0d0/cosg + dsintau(j,1,1,i)=-sing*ctgt1*domicron(j,2,2,i-1) + &-(fac0*vp1(j)+sing*(dc_norm2(j,i-2+nres))) + & *vbld_inv(i-2+nres) + dtauangle(j,1,1,i)=cosg_inv*dsintau(j,1,1,i) + dsintau(j,1,2,i)= + & -sing*(ctgt1*domicron(j,2,1,i-1)+ctgt*dtheta(j,1,i)) + & -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1) +c write(iout,*) "dsintau", dsintau(j,1,2,i) + dtauangle(j,1,2,i)=cosg_inv*dsintau(j,1,2,i) +c Bug fixed 3/24/05 (AL) + dsintau(j,1,3,i)=-sing*ctgt*dtheta(j,2,i) + & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i) +c & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1) + dtauangle(j,1,3,i)=cosg_inv*dsintau(j,1,3,i) + enddo +c Obtaining the gamma derivatives from cosine derivative + else + do j=1,3 + dcostau(j,1,1,i)=fac1*dcosomicron(j,2,2,i-1)+fac3* + & dcosomicron(j,2,2,i-1)-fac0*(dc_norm(j,i-1)-scalp* + & (dc_norm2(j,i-2+nres)))/vbld(i-2+nres) + dtauangle(j,1,1,i)=-1/sing*dcostau(j,1,1,i) + dcostau(j,1,2,i)=fac1*dcosomicron(j,2,1,i-1)+fac2* + & dcostheta(j,1,i)+fac3*dcosomicron(j,2,1,i-1)+fac4* + & dcostheta(j,1,i) + dtauangle(j,1,2,i)=-1/sing*dcostau(j,1,2,i) + dcostau(j,1,3,i)=fac2*dcostheta(j,2,i)+fac4* + & dcostheta(j,2,i)-fac0*(-dc_norm(j,i-2+nres)-scalp* + & dc_norm(j,i-1))/vbld(i) + dtauangle(j,1,3,i)=-1/sing*dcostau(j,1,3,i) +c write (iout,*) "else",i + enddo + endif +c do k=1,3 +c write(iout,*) "tu",i,k,(dtauangle(j,1,k,i),j=1,3) +c enddo + enddo +CC Second case Ca...Ca...Ca...SC +#ifdef PARINTDER + do i=itau_start,itau_end +#else + do i=4,nres +#endif + if ((itype(i-1).eq.21).or.(itype(i-1).eq.10)) cycle +c the conventional case + sint=dsin(omicron(1,i)) + sint1=dsin(theta(i-1)) + sing=dsin(tauangle(2,i)) + cost=dcos(omicron(1,i)) + cost1=dcos(theta(i-1)) + cosg=dcos(tauangle(2,i)) +c do j=1,3 +c dc_norm2(j,i-1+nres)=-dc_norm(j,i-1+nres) +c enddo + scalp=scalar(dc_norm(1,i-3),dc_norm(1,i-1+nres)) + fac0=1.0d0/(sint1*sint) + fac1=cost*fac0 + fac2=cost1*fac0 + fac3=cosg*cost1/(sint1*sint1) + fac4=cosg*cost/(sint*sint) +c Obtaining the gamma derivatives from sine derivative + if (tauangle(2,i).gt.-pi4.and.tauangle(2,i).le.pi4.or. + & tauangle(2,i).gt.pi34.and.tauangle(2,i).le.pi.or. + & tauangle(2,i).gt.-pi.and.tauangle(2,i).le.-pi34) then + call vecpr(dc_norm2(1,i-1+nres),dc_norm(1,i-2),vp1) + call vecpr(dc_norm(1,i-3),dc_norm(1,i-1+nres),vp2) + call vecpr(dc_norm(1,i-3),dc_norm(1,i-2),vp3) + do j=1,3 + ctgt=cost/sint + ctgt1=cost1/sint1 + cosg_inv=1.0d0/cosg + dsintau(j,2,1,i)=-sing*ctgt1*dtheta(j,1,i-1) + & +(fac0*vp1(j)-sing*dc_norm(j,i-3))*vbld_inv(i-2) +c write(iout,*) i,j,dsintau(j,2,1,i),sing*ctgt1*dtheta(j,1,i-1), +c &fac0*vp1(j),sing*dc_norm(j,i-3),vbld_inv(i-2),"dsintau(2,1)" + dtauangle(j,2,1,i)=cosg_inv*dsintau(j,2,1,i) + dsintau(j,2,2,i)= + & -sing*(ctgt1*dtheta(j,2,i-1)+ctgt*domicron(j,1,1,i)) + & -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1) +c write(iout,*) "sprawdzenie",i,j,sing*ctgt1*dtheta(j,2,i-1), +c & sing*ctgt*domicron(j,1,2,i), +c & (fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1) + dtauangle(j,2,2,i)=cosg_inv*dsintau(j,2,2,i) +c Bug fixed 3/24/05 (AL) + dsintau(j,2,3,i)=-sing*ctgt*domicron(j,1,2,i) + & +(fac0*vp3(j)-sing*dc_norm(j,i-1+nres))*vbld_inv(i-1+nres) +c & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1) + dtauangle(j,2,3,i)=cosg_inv*dsintau(j,2,3,i) + enddo +c Obtaining the gamma derivatives from cosine derivative + else + do j=1,3 + dcostau(j,2,1,i)=fac1*dcostheta(j,1,i-1)+fac3* + & dcostheta(j,1,i-1)-fac0*(dc_norm(j,i-1+nres)-scalp* + & dc_norm(j,i-3))/vbld(i-2) + dtauangle(j,2,1,i)=-1/sing*dcostau(j,2,1,i) + dcostau(j,2,2,i)=fac1*dcostheta(j,2,i-1)+fac2* + & dcosomicron(j,1,1,i)+fac3*dcostheta(j,2,i-1)+fac4* + & dcosomicron(j,1,1,i) + dtauangle(j,2,2,i)=-1/sing*dcostau(j,2,2,i) + dcostau(j,2,3,i)=fac2*dcosomicron(j,1,2,i)+fac4* + & dcosomicron(j,1,2,i)-fac0*(dc_norm(j,i-3)-scalp* + & dc_norm(j,i-1+nres))/vbld(i-1+nres) + dtauangle(j,2,3,i)=-1/sing*dcostau(j,2,3,i) +c write(iout,*) i,j,"else", dtauangle(j,2,3,i) + enddo + endif + enddo + + +CCC third case SC...Ca...Ca...SC +#ifdef PARINTDER + + do i=itau_start,itau_end +#else + do i=3,nres +#endif +c the conventional case + if ((itype(i-1).eq.21).or.(itype(i-1).eq.10).or. + &(itype(i-2).eq.21).or.(itype(i-2).eq.10)) cycle + sint=dsin(omicron(1,i)) + sint1=dsin(omicron(2,i-1)) + sing=dsin(tauangle(3,i)) + cost=dcos(omicron(1,i)) + cost1=dcos(omicron(2,i-1)) + cosg=dcos(tauangle(3,i)) + do j=1,3 + dc_norm2(j,i-2+nres)=-dc_norm(j,i-2+nres) +c dc_norm2(j,i-1+nres)=-dc_norm(j,i-1+nres) + enddo + scalp=scalar(dc_norm2(1,i-2+nres),dc_norm(1,i-1+nres)) + fac0=1.0d0/(sint1*sint) + fac1=cost*fac0 + fac2=cost1*fac0 + fac3=cosg*cost1/(sint1*sint1) + fac4=cosg*cost/(sint*sint) +c Obtaining the gamma derivatives from sine derivative + if (tauangle(3,i).gt.-pi4.and.tauangle(3,i).le.pi4.or. + & tauangle(3,i).gt.pi34.and.tauangle(3,i).le.pi.or. + & tauangle(3,i).gt.-pi.and.tauangle(3,i).le.-pi34) then + call vecpr(dc_norm(1,i-1+nres),dc_norm(1,i-2),vp1) + call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-1+nres),vp2) + call vecpr(dc_norm2(1,i-2+nres),dc_norm(1,i-2),vp3) + do j=1,3 + ctgt=cost/sint + ctgt1=cost1/sint1 + cosg_inv=1.0d0/cosg + dsintau(j,3,1,i)=-sing*ctgt1*domicron(j,2,2,i-1) + & -(fac0*vp1(j)-sing*dc_norm(j,i-2+nres)) + & *vbld_inv(i-2+nres) + dtauangle(j,3,1,i)=cosg_inv*dsintau(j,3,1,i) + dsintau(j,3,2,i)= + & -sing*(ctgt1*domicron(j,2,1,i-1)+ctgt*domicron(j,1,1,i)) + & -(fac0*vp2(j)+sing*dc_norm(j,i-2))*vbld_inv(i-1) + dtauangle(j,3,2,i)=cosg_inv*dsintau(j,3,2,i) +c Bug fixed 3/24/05 (AL) + dsintau(j,3,3,i)=-sing*ctgt*domicron(j,1,2,i) + & +(fac0*vp3(j)-sing*dc_norm(j,i-1+nres)) + & *vbld_inv(i-1+nres) +c & +(fac0*vp3(j)-sing*dc_norm(j,i-1))*vbld_inv(i-1) + dtauangle(j,3,3,i)=cosg_inv*dsintau(j,3,3,i) + enddo +c Obtaining the gamma derivatives from cosine derivative + else + do j=1,3 + dcostau(j,3,1,i)=fac1*dcosomicron(j,2,2,i-1)+fac3* + & dcosomicron(j,2,2,i-1)-fac0*(dc_norm(j,i-1+nres)-scalp* + & dc_norm2(j,i-2+nres))/vbld(i-2+nres) + dtauangle(j,3,1,i)=-1/sing*dcostau(j,3,1,i) + dcostau(j,3,2,i)=fac1*dcosomicron(j,2,1,i-1)+fac2* + & dcosomicron(j,1,1,i)+fac3*dcosomicron(j,2,1,i-1)+fac4* + & dcosomicron(j,1,1,i) + dtauangle(j,3,2,i)=-1/sing*dcostau(j,3,2,i) + dcostau(j,3,3,i)=fac2*dcosomicron(j,1,2,i)+fac4* + & dcosomicron(j,1,2,i)-fac0*(dc_norm2(j,i-2+nres)-scalp* + & dc_norm(j,i-1+nres))/vbld(i-1+nres) + dtauangle(j,3,3,i)=-1/sing*dcostau(j,3,3,i) +c write(iout,*) "else",i + enddo + endif + enddo +#ifdef CRYST_SC +c Derivatives of side-chain angles alpha and omega +#if defined(MPI) && defined(PARINTDER) + do i=ibond_start,ibond_end +#else + do i=2,nres-1 +#endif + if(itype(i).ne.10) then + fac5=1.0d0/dsqrt(2*(1+dcos(theta(i+1)))) + fac6=fac5/vbld(i) + fac7=fac5*fac5 + fac8=fac5/vbld(i+1) + fac9=fac5/vbld(i+nres) + scala1=scalar(dc_norm(1,i-1),dc_norm(1,i+nres)) + scala2=scalar(dc_norm(1,i),dc_norm(1,i+nres)) + cosa=dsqrt(0.5d0/(1.0d0+dcos(theta(i+1))))*( + & scalar(dC_norm(1,i),dC_norm(1,i+nres)) + & -scalar(dC_norm(1,i-1),dC_norm(1,i+nres))) + sina=sqrt(1-cosa*cosa) + sino=dsin(omeg(i)) + do j=1,3 + dcosalpha(j,1,i)=fac6*(scala1*dc_norm(j,i-1)- + & dc_norm(j,i+nres))-cosa*fac7*dcostheta(j,1,i+1) + dalpha(j,1,i)=-1/sina*dcosalpha(j,1,i) + dcosalpha(j,2,i)=fac8*(dc_norm(j,i+nres)- + & scala2*dc_norm(j,i))-cosa*fac7*dcostheta(j,2,i+1) + dalpha(j,2,i)=-1/sina*dcosalpha(j,2,i) + dcosalpha(j,3,i)=(fac9*(dc_norm(j,i)- + & dc_norm(j,i-1))-(cosa*dc_norm(j,i+nres))/ + & vbld(i+nres)) + dalpha(j,3,i)=-1/sina*dcosalpha(j,3,i) + enddo +c obtaining the derivatives of omega from sines + if(omeg(i).gt.-pi4.and.omeg(i).le.pi4.or. + & omeg(i).gt.pi34.and.omeg(i).le.pi.or. + & omeg(i).gt.-pi.and.omeg(i).le.-pi34) then + fac15=dcos(theta(i+1))/(dsin(theta(i+1))* + & dsin(theta(i+1))) + fac16=dcos(alph(i))/(dsin(alph(i))*dsin(alph(i))) + fac17=1.0d0/(dsin(theta(i+1))*dsin(alph(i))) + call vecpr(dc_norm(1,i+nres),dc_norm(1,i),vo1) + call vecpr(dc_norm(1,i+nres),dc_norm(1,i-1),vo2) + call vecpr(dc_norm(1,i),dc_norm(1,i-1),vo3) + coso_inv=1.0d0/dcos(omeg(i)) + do j=1,3 + dsinomega(j,1,i)=sino*(fac15*dcostheta(j,1,i+1) + & +fac16*dcosalpha(j,1,i))-fac17/vbld(i)*vo1(j)-( + & sino*dc_norm(j,i-1))/vbld(i) + domega(j,1,i)=coso_inv*dsinomega(j,1,i) + dsinomega(j,2,i)=sino*(fac15*dcostheta(j,2,i+1) + & +fac16*dcosalpha(j,2,i))+fac17/vbld(i+1)*vo2(j) + & -sino*dc_norm(j,i)/vbld(i+1) + domega(j,2,i)=coso_inv*dsinomega(j,2,i) + dsinomega(j,3,i)=sino*fac16*dcosalpha(j,3,i)- + & fac17/vbld(i+nres)*vo3(j)-sino*dc_norm(j,i+nres)/ + & vbld(i+nres) + domega(j,3,i)=coso_inv*dsinomega(j,3,i) + enddo + else +c obtaining the derivatives of omega from cosines + fac10=sqrt(0.5d0*(1-dcos(theta(i+1)))) + fac11=sqrt(0.5d0*(1+dcos(theta(i+1)))) + fac12=fac10*sina + fac13=fac12*fac12 + fac14=sina*sina + do j=1,3 + dcosomega(j,1,i)=(-(0.25d0*cosa/fac11* + & dcostheta(j,1,i+1)+fac11*dcosalpha(j,1,i))*fac12+ + & (0.25d0/fac10*sina*dcostheta(j,1,i+1)+cosa/sina* + & fac10*dcosalpha(j,1,i))*(scala2-fac11*cosa))/fac13 + domega(j,1,i)=-1/sino*dcosomega(j,1,i) + dcosomega(j,2,i)=(((dc_norm(j,i+nres)-scala2* + & dc_norm(j,i))/vbld(i+1)-0.25d0*cosa/fac11* + & dcostheta(j,2,i+1)-fac11*dcosalpha(j,2,i))*fac12+ + & (scala2-fac11*cosa)*(0.25d0*sina/fac10* + & dcostheta(j,2,i+1)+fac10*cosa/sina*dcosalpha(j,2,i) + & ))/fac13 + domega(j,2,i)=-1/sino*dcosomega(j,2,i) + dcosomega(j,3,i)=1/fac10*((1/vbld(i+nres)*(dc_norm(j,i)- + & scala2*dc_norm(j,i+nres))-fac11*dcosalpha(j,3,i))*sina+ + & (scala2-fac11*cosa)*(cosa/sina*dcosalpha(j,3,i)))/fac14 + domega(j,3,i)=-1/sino*dcosomega(j,3,i) + enddo + endif + endif + enddo +#endif +#if defined(MPI) && defined(PARINTDER) + if (nfgtasks.gt.1) then +#ifdef DEBUG + write (iout,*) "Gather dtheta" +cd call flush(iout) +c write (iout,*) "dtheta before gather" +c do i=1,nres +c write (iout,'(i3,3(3f8.5,3x))') i,((dtheta(j,k,i),k=1,3),j=1,2) +c enddo +#endif + call MPI_Gatherv(dtheta(1,1,ithet_start),ithet_count(fg_rank), + & MPI_THET,dtheta(1,1,1),ithet_count(0),ithet_displ(0),MPI_THET, + & king,FG_COMM,IERROR) +#ifdef DEBUG +cd write (iout,*) "Gather dphi" +cd call flush(iout) + write (iout,*) "dphi before gather" + do i=1,nres + write (iout,'(i3,3(3f8.5,3x))') i,((dphi(j,k,i),k=1,3),j=1,3) + enddo +#endif + call MPI_Gatherv(dphi(1,1,iphi1_start),iphi1_count(fg_rank), + & MPI_GAM,dphi(1,1,1),iphi1_count(0),iphi1_displ(0),MPI_GAM, + & king,FG_COMM,IERROR) +cd write (iout,*) "Gather dalpha" +cd call flush(iout) +#ifdef CRYST_SC + call MPI_Gatherv(dalpha(1,1,ibond_start),ibond_count(fg_rank), + & MPI_GAM,dalpha(1,1,1),ibond_count(0),ibond_displ(0),MPI_GAM, + & king,FG_COMM,IERROR) +cd write (iout,*) "Gather domega" +cd call flush(iout) + call MPI_Gatherv(domega(1,1,ibond_start),ibond_count(fg_rank), + & MPI_GAM,domega(1,1,1),ibond_count(0),ibond_displ(0),MPI_GAM, + & king,FG_COMM,IERROR) +#endif + endif +#endif +#ifdef DEBUG + write (iout,*) "dtheta after gather" + do i=1,nres + write (iout,'(i3,3(3f8.5,3x))') i,((dtheta(j,k,i),j=1,3),j=1,2) + enddo + write (iout,*) "dphi after gather" + do i=1,nres + write (iout,'(i3,3(3f8.5,3x))') i,((dphi(j,k,i),j=1,3),k=1,3) + enddo +#endif + return + end + + subroutine checkintcartgrad + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.INTERACT' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.SETUP' + double precision dthetanum(3,2,maxres),dphinum(3,3,maxres) + & ,dalphanum(3,3,maxres), domeganum(3,3,maxres) + double precision theta_s(maxres),phi_s(maxres),alph_s(maxres), + & omeg_s(maxres),dc_norm_s(3) + double precision aincr /1.0d-5/ + + do i=1,nres + phi_s(i)=phi(i) + theta_s(i)=theta(i) + alph_s(i)=alph(i) + omeg_s(i)=omeg(i) + enddo +c Check theta gradient + write (iout,*) + & "Analytical (upper) and numerical (lower) gradient of theta" + write (iout,*) + do i=3,nres + do j=1,3 + dcji=dc(j,i-2) + dc(j,i-2)=dcji+aincr + call chainbuild_cart + call int_from_cart1(.false.) + dthetanum(j,1,i)=(theta(i)-theta_s(i))/aincr + dc(j,i-2)=dcji + dcji=dc(j,i-1) + dc(j,i-1)=dc(j,i-1)+aincr + call chainbuild_cart + dthetanum(j,2,i)=(theta(i)-theta_s(i))/aincr + dc(j,i-1)=dcji + enddo + write (iout,'(i5,3f10.5,5x,3f10.5)') i,(dtheta(j,1,i),j=1,3), + & (dtheta(j,2,i),j=1,3) + write (iout,'(5x,3f10.5,5x,3f10.5)') (dthetanum(j,1,i),j=1,3), + & (dthetanum(j,2,i),j=1,3) + write (iout,'(5x,3f10.5,5x,3f10.5)') + & (dthetanum(j,1,i)/dtheta(j,1,i),j=1,3), + & (dthetanum(j,2,i)/dtheta(j,2,i),j=1,3) + write (iout,*) + enddo +c Check gamma gradient + write (iout,*) + & "Analytical (upper) and numerical (lower) gradient of gamma" + do i=4,nres + do j=1,3 + dcji=dc(j,i-3) + dc(j,i-3)=dcji+aincr + call chainbuild_cart + dphinum(j,1,i)=(phi(i)-phi_s(i))/aincr + dc(j,i-3)=dcji + dcji=dc(j,i-2) + dc(j,i-2)=dcji+aincr + call chainbuild_cart + dphinum(j,2,i)=(phi(i)-phi_s(i))/aincr + dc(j,i-2)=dcji + dcji=dc(j,i-1) + dc(j,i-1)=dc(j,i-1)+aincr + call chainbuild_cart + dphinum(j,3,i)=(phi(i)-phi_s(i))/aincr + dc(j,i-1)=dcji + enddo + write (iout,'(i5,3(3f10.5,5x))') i,(dphi(j,1,i),j=1,3), + & (dphi(j,2,i),j=1,3),(dphi(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') (dphinum(j,1,i),j=1,3), + & (dphinum(j,2,i),j=1,3),(dphinum(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') + & (dphinum(j,1,i)/dphi(j,1,i),j=1,3), + & (dphinum(j,2,i)/dphi(j,2,i),j=1,3), + & (dphinum(j,3,i)/dphi(j,3,i),j=1,3) + write (iout,*) + enddo +c Check alpha gradient + write (iout,*) + & "Analytical (upper) and numerical (lower) gradient of alpha" + do i=2,nres-1 + if(itype(i).ne.10) then + do j=1,3 + dcji=dc(j,i-1) + dc(j,i-1)=dcji+aincr + call chainbuild_cart + dalphanum(j,1,i)=(alph(i)-alph_s(i)) + & /aincr + dc(j,i-1)=dcji + dcji=dc(j,i) + dc(j,i)=dcji+aincr + call chainbuild_cart + dalphanum(j,2,i)=(alph(i)-alph_s(i)) + & /aincr + dc(j,i)=dcji + dcji=dc(j,i+nres) + dc(j,i+nres)=dc(j,i+nres)+aincr + call chainbuild_cart + dalphanum(j,3,i)=(alph(i)-alph_s(i)) + & /aincr + dc(j,i+nres)=dcji + enddo + endif + write (iout,'(i5,3(3f10.5,5x))') i,(dalpha(j,1,i),j=1,3), + & (dalpha(j,2,i),j=1,3),(dalpha(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') (dalphanum(j,1,i),j=1,3), + & (dalphanum(j,2,i),j=1,3),(dalphanum(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') + & (dalphanum(j,1,i)/dalpha(j,1,i),j=1,3), + & (dalphanum(j,2,i)/dalpha(j,2,i),j=1,3), + & (dalphanum(j,3,i)/dalpha(j,3,i),j=1,3) + write (iout,*) + enddo +c Check omega gradient + write (iout,*) + & "Analytical (upper) and numerical (lower) gradient of omega" + do i=2,nres-1 + if(itype(i).ne.10) then + do j=1,3 + dcji=dc(j,i-1) + dc(j,i-1)=dcji+aincr + call chainbuild_cart + domeganum(j,1,i)=(omeg(i)-omeg_s(i)) + & /aincr + dc(j,i-1)=dcji + dcji=dc(j,i) + dc(j,i)=dcji+aincr + call chainbuild_cart + domeganum(j,2,i)=(omeg(i)-omeg_s(i)) + & /aincr + dc(j,i)=dcji + dcji=dc(j,i+nres) + dc(j,i+nres)=dc(j,i+nres)+aincr + call chainbuild_cart + domeganum(j,3,i)=(omeg(i)-omeg_s(i)) + & /aincr + dc(j,i+nres)=dcji + enddo + endif + write (iout,'(i5,3(3f10.5,5x))') i,(domega(j,1,i),j=1,3), + & (domega(j,2,i),j=1,3),(domega(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') (domeganum(j,1,i),j=1,3), + & (domeganum(j,2,i),j=1,3),(domeganum(j,3,i),j=1,3) + write (iout,'(5x,3(3f10.5,5x))') + & (domeganum(j,1,i)/domega(j,1,i),j=1,3), + & (domeganum(j,2,i)/domega(j,2,i),j=1,3), + & (domeganum(j,3,i)/domega(j,3,i),j=1,3) + write (iout,*) + enddo + return + end + + subroutine chainbuild_cart + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.LOCAL' + include 'COMMON.TIME1' + include 'COMMON.IOUNITS' + +#ifdef MPI + if (nfgtasks.gt.1) then +c write (iout,*) "BCAST in chainbuild_cart" +c call flush(iout) +c Broadcast the order to build the chain and compute internal coordinates +c to the slaves. The slaves receive the order in ERGASTULUM. + time00=MPI_Wtime() +c write (iout,*) "CHAINBUILD_CART: DC before BCAST" +c do i=0,nres +c write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3), +c & (dc(j,i+nres),j=1,3) +c enddo + if (fg_rank.eq.0) + & call MPI_Bcast(7,1,MPI_INTEGER,king,FG_COMM,IERROR) + time_bcast7=time_bcast7+MPI_Wtime()-time00 + time01=MPI_Wtime() + call MPI_Bcast(dc(1,0),6*(nres+1),MPI_DOUBLE_PRECISION, + & king,FG_COMM,IERR) +c write (iout,*) "CHAINBUILD_CART: DC after BCAST" +c do i=0,nres +c write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3), +c & (dc(j,i+nres),j=1,3) +c enddo +c write (iout,*) "End BCAST in chainbuild_cart" +c call flush(iout) + time_bcast=time_bcast+MPI_Wtime()-time00 + time_bcastc=time_bcastc+MPI_Wtime()-time01 + endif +#endif + do j=1,3 + c(j,1)=dc(j,0) + enddo + do i=2,nres + do j=1,3 + c(j,i)=c(j,i-1)+dc(j,i-1) + enddo + enddo + do i=1,nres + do j=1,3 + c(j,i+nres)=c(j,i)+dc(j,i+nres) + enddo + enddo +c write (iout,*) "CHAINBUILD_CART" +c call cartprint + call int_from_cart1(.false.) + return + end diff --git a/source/unres/src_MD-NEWSC/intcor.f b/source/unres/src_MD-NEWSC/intcor.f new file mode 100644 index 0000000..a3cd5d0 --- /dev/null +++ b/source/unres/src_MD-NEWSC/intcor.f @@ -0,0 +1,91 @@ +C +C------------------------------------------------------------------------------ +C + double precision function alpha(i1,i2,i3) +c +c Calculates the planar angle between atoms (i1), (i2), and (i3). +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + x12=c(1,i1)-c(1,i2) + x23=c(1,i3)-c(1,i2) + y12=c(2,i1)-c(2,i2) + y23=c(2,i3)-c(2,i2) + z12=c(3,i1)-c(3,i2) + z23=c(3,i3)-c(3,i2) + vnorm=dsqrt(x12*x12+y12*y12+z12*z12) + wnorm=dsqrt(x23*x23+y23*y23+z23*z23) + scalar=(x12*x23+y12*y23+z12*z23)/(vnorm*wnorm) + alpha=arcos(scalar) + return + end +C +C------------------------------------------------------------------------------ +C + double precision function beta(i1,i2,i3,i4) +c +c Calculates the dihedral angle between atoms (i1), (i2), (i3) and (i4) +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + x12=c(1,i1)-c(1,i2) + x23=c(1,i3)-c(1,i2) + x34=c(1,i4)-c(1,i3) + y12=c(2,i1)-c(2,i2) + y23=c(2,i3)-c(2,i2) + y34=c(2,i4)-c(2,i3) + z12=c(3,i1)-c(3,i2) + z23=c(3,i3)-c(3,i2) + z34=c(3,i4)-c(3,i3) +cd print '(2i3,3f10.5)',i1,i2,x12,y12,z12 +cd print '(2i3,3f10.5)',i2,i3,x23,y23,z23 +cd print '(2i3,3f10.5)',i3,i4,x34,y34,z34 + wx=-y23*z34+y34*z23 + wy=x23*z34-z23*x34 + wz=-x23*y34+y23*x34 + wnorm=dsqrt(wx*wx+wy*wy+wz*wz) + vx=y12*z23-z12*y23 + vy=-x12*z23+z12*x23 + vz=x12*y23-y12*x23 + vnorm=dsqrt(vx*vx+vy*vy+vz*vz) + if (vnorm.gt.1.0D-13 .and. wnorm.gt.1.0D-13) then + scalar=(vx*wx+vy*wy+vz*wz)/(vnorm*wnorm) + if (dabs(scalar).gt.1.0D0) + &scalar=0.99999999999999D0*scalar/dabs(scalar) + angle=dacos(scalar) +cd print '(2i4,10f7.3)',i2,i3,vx,vy,vz,wx,wy,wz,vnorm,wnorm, +cd &scalar,angle + else + angle=pi + endif +c if (angle.le.0.0D0) angle=pi+angle + tx=vy*wz-vz*wy + ty=-vx*wz+vz*wx + tz=vx*wy-vy*wx + scalar=tx*x23+ty*y23+tz*z23 + if (scalar.lt.0.0D0) angle=-angle + beta=angle + return + end +C +C------------------------------------------------------------------------------ +C + function dist(i1,i2) +c +c Calculates the distance between atoms (i1) and (i2). +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + x12=c(1,i1)-c(1,i2) + y12=c(2,i1)-c(2,i2) + z12=c(3,i1)-c(3,i2) + dist=dsqrt(x12*x12+y12*y12+z12*z12) + return + end +C diff --git a/source/unres/src_MD-NEWSC/intlocal.f b/source/unres/src_MD-NEWSC/intlocal.f new file mode 100644 index 0000000..2dbcc88 --- /dev/null +++ b/source/unres/src_MD-NEWSC/intlocal.f @@ -0,0 +1,517 @@ + subroutine integral(gamma1,gamma2,gamma3,gamma4,ity1,ity2,a1,a2, + & si1,si2,si3,si4,transp,q) + implicit none + integer ity1,ity2 + integer ilam1,ilam2,ilam3,ilam4,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4 + logical transp + double precision elocal,ele + double precision delta,delta2,sum,ene,sumene,boltz + double precision q,a1(2,2),a2(2,2),si1,si2,si3,si4 + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=20 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta +cd write(2,*) gamma1,gamma2,ity1,ity2,a1,a2,si1,si2,si3,si4,transp + +cd do ilam1=-180,180,5 +cd do ilam2=-180,180,5 +cd lambda1=ilam1*conv+delta2 +cd lambda2=ilam2*conv+delta2 +cd write(2,'(2i5,2f10.5)') ilam1,ilam2,elocal(2,lambda1,lambda2), +cd & ele(lambda1,lambda2,a1,1.0d0,1.d00) +cd enddo +cd enddo +cd stop + + sum=0.0d0 + sumene=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 +cd write (2,*) ilam1,ilam2,ilam3,ilam4 +cd write (2,*) lambda1,lambda2,lambda3,lambda4 + ene= + & -elocal(ity1,lambda1,lambda2,.false.)* + & elocal(ity2,lambda3,lambda4,transp)* + & ele(si1*lambda1+gamma1,si3*lambda3+gamma3,a1)* + & ele(si2*lambda2+gamma2,si4*lambda4+gamma4,a2) +cd write (2,*) elocal(ity1,lambda1,gamma1-pi-lambda2), +cd & elocal(ity2,lambda3,gamma2-pi-lambda4), +cd & ele(lambda1,lambda2,a1,si1,si3), +cd & ele(lambda3,lambda4,a2,si2,si4) + sum=sum+ene + enddo + enddo + enddo + enddo + q=sum/(2*pi)**4*delta**4 + write (2,* )'sum',sum,' q',q + return + end +c--------------------------------------------------------------------------- + subroutine integral3(gamma1,gamma2,ity1,ity2,ity3,ity4, + & a1,koniec,q1,q2,q3,q4) + implicit none + integer ity1,ity2,ity3,ity4 + integer ilam1,ilam2,ilam3,ilam4,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,lambda1, + & lambda2,lambda3,lambda4 + logical koniec + double precision elocal,ele + double precision delta,delta2,sum1,sum2,sum3,sum4, + & ene1,ene2,ene3,ene4,boltz + double precision q1,q2,q3,q4,a1(2,2),a2(2,2) + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta + write(2,*) gamma1,gamma2,ity1,ity2,ity3,ity4,a1,koniec + +cd do ilam1=-180,180,5 +cd do ilam2=-180,180,5 +cd lambda1=ilam1*conv+delta2 +cd lambda2=ilam2*conv+delta2 +cd write(2,'(2i5,2f10.5)') ilam1,ilam2,elocal(2,lambda1,lambda2), +cd & ele(lambda1,lambda2,a1,1.0d0,1.d00) +cd enddo +cd enddo +cd stop + + sum1=0.0d0 + sum2=0.0d0 + sum3=0.0d0 + sum4=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 +cd write (2,*) ilam1,ilam2,ilam3,ilam4 +cd write (2,*) lambda1,lambda2,lambda3,lambda4 + if (.not.koniec) then + ene1= + & elocal(ity1,lambda1,gamma1-pi-lambda2,.false.)* + & elocal(ity3,lambda3,gamma2-pi-lambda4,.false.)* + & ele(lambda2,lambda4,a1) + else + ene1= + & elocal(ity1,lambda1,gamma1-pi-lambda2,.false.)* + & elocal(ity3,lambda3,lambda4,.false.)* + & ele(lambda2,-lambda4,a1) + endif + ene2= + & elocal(ity1,lambda1,gamma1-pi-lambda2,.false.)* + & elocal(ity4,lambda3,lambda4,.false.)* + & ele(lambda2,lambda3,a1) + if (.not.koniec) then + ene3= + & elocal(ity2,lambda1,lambda2,.false.)* + & elocal(ity3,lambda3,gamma2-pi-lambda4,.false.)* + & ele(lambda1,lambda4,a1) + else + ene3= + & elocal(ity2,lambda1,lambda2,.false.)* + & elocal(ity3,lambda3,lambda4,.false.)* + & ele(lambda1,-lambda4,a1) + endif + ene4= + & elocal(ity2,lambda1,lambda2,.false.)* + & elocal(ity4,lambda3,lambda4,.false.)* + & ele(lambda1,lambda3,a1) + sum1=sum1+ene1 + sum2=sum2+ene2 + sum3=sum3+ene3 + sum4=sum4+ene4 + enddo + enddo + enddo + enddo + q1=sum1/(2*pi)**4*delta**4 + q2=sum2/(2*pi)**4*delta**4 + q3=sum3/(2*pi)**4*delta**4 + q4=sum4/(2*pi)**4*delta**4 + write (2,* )'sum',sum1,sum2,sum3,sum4,' q',q1,q2,q3,q4 + return + end +c------------------------------------------------------------------------- + subroutine integral5(gamma1,gamma2,gamma3,gamma4,ity1,ity2,ity3, + & ity4,ity5,ity6,a1,a2,si1,si2,si3,si4,transp,ene1,ene2,ene3,ene4) + implicit none + integer ity1,ity2,ity3,ity4,ity5,ity6 + integer ilam1,ilam2,ilam3,ilam4,ilam5,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4,lambda5 + logical transp + double precision elocal,ele + double precision eloc1,eloc2,eloc3,eloc4,eloc5,eloc6,ele1,ele2 + double precision delta,delta2,sum,ene,sumene,pom + double precision ene1,ene2,ene3,ene4,sum1,sum2,sum3,sum4, + & a1(2,2),a2(2,2) + integer si1,si2,si3,si4 + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta +cd write(2,*) 'gamma1=',gamma1,' gamma2=',gamma2, +cd & ' gamma3=',gamma3,' gamma4=',gamma4 +cd write(2,*) ity1,ity2,ity3,ity4,ity5,ity6 +cd write(2,*) 'a1=',a1 +cd write(2,*) 'a2=',a2 +cd write(2,*) si1,si2,si3,si4,transp + + sum1=0.0d0 + sum2=0.0d0 + sum3=0.0d0 + sum4=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + do ilam5=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 + lambda5=ilam5*conv+delta2 + if (transp) then + ele1=ele(lambda1,si4*lambda4,a1) + ele2=ele(lambda2,lambda3,a2) + else + ele1=ele(lambda1,lambda3,a1) + ele2=ele(lambda2,si4*lambda4,a2) + endif + eloc2=elocal(ity2,lambda1,gamma2-pi-lambda2,.false.) + eloc5=elocal(ity5,lambda3,gamma4-pi-si4*lambda4,.false.) + pom=ele1*ele2*eloc2*eloc5 + if (si1.gt.0) then + eloc1=elocal(ity1,lambda5,gamma1-pi-lambda1,.false.) + sum1=sum1+pom*eloc1 + endif + eloc3=elocal(ity3,lambda2,lambda5,.false.) + sum2=sum2+pom*eloc3 + eloc4=elocal(ity4,lambda5,gamma3-pi-lambda3,.false.) + sum3=sum3+pom*eloc4 + if (si4.gt.0) then + eloc6=elocal(ity6,lambda4,lambda5,.false.) + sum4=sum4+pom*eloc6 + endif + enddo + enddo + enddo + enddo + enddo + pom=1.0d0/(2*pi)**5*delta**5 + ene1=sum1*pom + ene2=sum2*pom + ene3=sum3*pom + ene4=sum4*pom +c write (2,* )'sum',sum1,sum2,sum3,sum4,' q',ene1,ene2,ene3,ene4 + return + end +c------------------------------------------------------------------------- + subroutine integral_turn6(gamma1,gamma2,gamma3,gamma4,ity1,ity2, + & ity3,ity4,ity5,ity6,a1,a2,ene_turn6) + implicit none + integer ity1,ity2,ity3,ity4,ity5,ity6 + integer ilam1,ilam2,ilam3,ilam4,ilam5,ilam6,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4,lambda5,lambda6 + logical transp + double precision elocal,ele + double precision eloc1,eloc2,eloc3,eloc4,eloc41,eloc5,eloc6, + & eloc61,ele1,ele2 + double precision delta,delta2,sum,ene,sumene,pom,ene5 + double precision ene_turn6,sum5,a1(2,2),a2(2,2) + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta + write(2,*) 'gamma1=',gamma1,' gamma2=',gamma2, + & ' gamma3=',gamma3,' gamma4=',gamma4 + write(2,*) ity1,ity2,ity3,ity4,ity5,ity6 + write(2,*) 'a1=',a1 + write(2,*) 'a2=',a2 + + sum5=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + do ilam5=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 + lambda5=ilam5*conv+delta2 + ele1=ele(lambda1,-lambda4,a1) + ele2=ele(lambda2,lambda3,a2) + eloc2=elocal(ity2,lambda1,gamma2-pi-lambda2,.false.) + eloc5=elocal(ity5,lambda3,lambda4,.false.) + pom=ele1*ele2*eloc2*eloc5 + eloc3=elocal(ity3,lambda2,gamma3-pi-lambda5,.false.) + eloc4=elocal(ity4,lambda5,gamma4-pi-lambda3,.false.) + sum5=sum5+pom*eloc3*eloc4 + enddo + enddo + enddo + enddo + enddo + pom=-1.0d0/(2*pi)**5*delta**5 + ene_turn6=sum5*pom +c print *,'sum6',sum6,' ene6',ene6 + return + end +c------------------------------------------------------------------------- + subroutine integral6(gamma1,gamma2,gamma3,gamma4,ity1,ity2,ity3, + & ity4,ity5,ity6,a1,a2,si1,si2,si3,si4,transp,ene1,ene2,ene3,ene4, + & ene5,ene6) + implicit none + integer ity1,ity2,ity3,ity4,ity5,ity6 + integer ilam1,ilam2,ilam3,ilam4,ilam5,ilam6,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4,lambda5,lambda6 + logical transp + double precision elocal,ele + double precision eloc1,eloc2,eloc3,eloc4,eloc41,eloc5,eloc6, + & eloc61,ele1,ele2 + double precision delta,delta2,sum,ene,sumene,pom + double precision ene1,ene2,ene3,ene4,ene5,ene6,sum1,sum2,sum3, + & sum4,sum5,sum6,a1(2,2),a2(2,2) + integer si1,si2,si3,si4 + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta +cd write(2,*) 'gamma1=',gamma1,' gamma2=',gamma2, +cd & ' gamma3=',gamma3,' gamma4=',gamma4 +cd write(2,*) ity1,ity2,ity3,ity4,ity5,ity6 +cd write(2,*) 'a1=',a1 +cd write(2,*) 'a2=',a2 +cd write(2,*) si1,si2,si3,si4,transp + + sum1=0.0d0 + sum2=0.0d0 + sum3=0.0d0 + sum4=0.0d0 + sum5=0.0d0 + sum6=0.0d0 + eloc1=0.0d0 + eloc6=0.0d0 + eloc61=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + do ilam5=-180,179,iincr + do ilam6=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 + lambda5=ilam5*conv+delta2 + lambda6=ilam6*conv+delta2 + if (transp) then + ele1=ele(lambda1,si4*lambda4,a1) + ele2=ele(lambda2,lambda3,a2) + else + ele1=ele(lambda1,lambda3,a1) + ele2=ele(lambda2,si4*lambda4,a2) + endif + eloc2=elocal(ity2,lambda1,gamma2-pi-lambda2,.false.) + eloc5=elocal(ity5,lambda3,gamma4-pi-si4*lambda4,.false.) + pom=ele1*ele2*eloc2*eloc5 + if (si1.gt.0) then + eloc1=elocal(ity1,lambda5,gamma1-pi-lambda1,.false.) + endif + eloc3=elocal(ity3,lambda2,lambda6,.false.) + sum1=sum1+pom*eloc1*eloc3 + eloc4=elocal(ity4,lambda5,gamma3-pi-lambda3,.false.) + if (si4.gt.0) then + eloc6=elocal(ity6,lambda4,lambda6,.false.) + eloc61=elocal(ity6,lambda4,lambda5,.false.) + endif + sum2=sum2+pom*eloc4*eloc6 + eloc41=elocal(ity4,lambda6,gamma3-pi-lambda3,.false.) + sum3=sum3+pom*eloc1*eloc41 + sum4=sum4+pom*eloc1*eloc6 + sum5=sum5+pom*eloc3*eloc4 + sum6=sum6+pom*eloc3*eloc61 + enddo + enddo + enddo + enddo + enddo + enddo + pom=-1.0d0/(2*pi)**6*delta**6 + ene1=sum1*pom + ene2=sum2*pom + ene3=sum3*pom + ene4=sum4*pom + ene5=sum5*pom + ene6=sum6*pom +c print *,'sum6',sum6,' ene6',ene6 + return + end +c------------------------------------------------------------------------- + subroutine integral3a(gamma1,gamma2,ity1,ity2,a1,si1,ene1) + implicit none + integer ity1,ity2,ity3,ity4,ity5,ity6 + integer ilam1,ilam2,ilam3,ilam4,ilam5,ilam6,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4,lambda5,lambda6 + logical transp + double precision elocal,ele + double precision eloc1,eloc2,eloc3,eloc4,eloc41,eloc5,eloc6, + & eloc61,ele1,ele2 + double precision delta,delta2,sum,ene,sumene,pom + double precision ene1,ene2,ene3,ene4,ene5,ene6,sum1,sum2,sum3, + & sum4,sum5,sum6,a1(2,2),a2(2,2) + integer si1,si2,si3,si4 + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta +cd write(2,*) 'gamma1=',gamma1,' gamma2=',gamma2 +cd write(2,*) ity1,ity2 +cd write(2,*) 'a1=',a1 +cd write(2,*) si1, + + sum1=0.0d0 + eloc1=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + ele1=ele(lambda1,si1*lambda3,a1) + eloc1=elocal(ity1,lambda1,gamma1-pi-lambda2,.false.) + if (si1.gt.0) then + eloc2=elocal(ity2,lambda2,gamma2-pi-lambda3,.false.) + else + eloc2=elocal(ity2,lambda2,lambda3,.false.) + endif + sum1=sum1+ele1*eloc1*eloc2 + enddo + enddo + enddo + pom=1.0d0/(2*pi)**3*delta**3 + ene1=sum1*pom + return + end +c------------------------------------------------------------------------- + subroutine integral4a(gamma1,gamma2,gamma3,ity1,ity2,ity3,a1,si1, + & ene1) + implicit none + integer ity1,ity2,ity3,ity4,ity5,ity6 + integer ilam1,ilam2,ilam3,ilam4,ilam5,ilam6,iincr + double precision gamma1,gamma2,gamma3,gamma4,beta,b(2,90),lambda1, + & lambda2,lambda3,lambda4,lambda5,lambda6 + logical transp + double precision elocal,ele + double precision eloc1,eloc2,eloc3,eloc4,eloc41,eloc5,eloc6, + & eloc61,ele1,ele2 + double precision delta,delta2,sum,ene,sumene,pom + double precision ene1,ene2,ene3,ene4,ene5,ene6,sum1,sum2,sum3, + & sum4,sum5,sum6,a1(2,2),a2(2,2) + integer si1,si2,si3,si4 + double precision conv /.01745329252d0/,pi /3.141592654d0/ + + iincr=60 + delta=iincr*conv + delta2=0.5d0*delta +cd print *,'iincr',iincr,' delta',delta +cd write(2,*) 'gamma1=',gamma1,' gamma2=',gamma2, +cd & ' gamma3=',gamma3 +cd write(2,*) ity1,ity2,ity3 +cd write(2,*) 'a1=',a1 +cd write(2,*) 'si1=',si1 + sum1=0.0d0 + do ilam1=-180,179,iincr + do ilam2=-180,179,iincr + do ilam3=-180,179,iincr + do ilam4=-180,179,iincr + lambda1=ilam1*conv+delta2 + lambda2=ilam2*conv+delta2 + lambda3=ilam3*conv+delta2 + lambda4=ilam4*conv+delta2 + ele1=ele(lambda1,si1*lambda4,a1) + eloc1=elocal(ity1,lambda1,gamma1-pi-lambda2,.false.) + eloc2=elocal(ity2,lambda2,gamma2-pi-lambda3,.false.) + if (si1.gt.0) then + eloc3=elocal(ity3,lambda3,gamma3-pi-lambda4,.false.) + else + eloc3=elocal(ity3,lambda3,lambda4,.false.) + endif + sum1=sum1+ele1*eloc1*eloc2*eloc3 + enddo + enddo + enddo + enddo + pom=-1.0d0/(2*pi)**4*delta**4 + ene1=sum1*pom + return + end +c------------------------------------------------------------------------- + double precision function elocal(i,x,y,transp) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.TORSION' + integer i + double precision x,y,u(2),v(2),cu(2),dv(2),ev(2) + double precision scalar2 + logical transp + u(1)=dcos(x) + u(2)=dsin(x) + v(1)=dcos(y) + v(2)=dsin(y) + if (transp) then + call matvec2(cc(1,1,i),v,cu) + call matvec2(dd(1,1,i),u,dv) + call matvec2(ee(1,1,i),u,ev) + elocal=scalar2(b1(1,i),v)+scalar2(b2(1,i),u)+scalar2(cu,v)+ + & scalar2(dv,u)+scalar2(ev,v) + else + call matvec2(cc(1,1,i),u,cu) + call matvec2(dd(1,1,i),v,dv) + call matvec2(ee(1,1,i),v,ev) + elocal=scalar2(b1(1,i),u)+scalar2(b2(1,i),v)+scalar2(cu,u)+ + & scalar2(dv,v)+scalar2(ev,u) + endif + return + end +c------------------------------------------------------------------------- + double precision function ele(x,y,a) + implicit none + double precision x,y,a(2,2),si1,si2,u(2),v(2),av(2) + double precision scalar2 + u(1)=-cos(x) + u(2)= sin(x) + v(1)=-cos(y) + v(2)= sin(y) + call matvec2(a,v,av) + ele=scalar2(u,av) + return + end diff --git a/source/unres/src_MD-NEWSC/kinetic_lesyng.f b/source/unres/src_MD-NEWSC/kinetic_lesyng.f new file mode 100644 index 0000000..8535f5d --- /dev/null +++ b/source/unres/src_MD-NEWSC/kinetic_lesyng.f @@ -0,0 +1,104 @@ + subroutine kinetic(KE_total) +c---------------------------------------------------------------- +c This subroutine calculates the total kinetic energy of the chain +c----------------------------------------------------------------- + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + double precision KE_total + + integer i,j,k + double precision KEt_p,KEt_sc,KEr_p,KEr_sc,incr(3), + & mag1,mag2,v(3) + + KEt_p=0.0d0 + KEt_sc=0.0d0 +c write (iout,*) "ISC",(isc(itype(i)),i=1,nres) +c The translational part for peptide virtual bonds + do j=1,3 + incr(j)=d_t(j,0) + enddo + do i=nnt,nct-1 +c write (iout,*) "Kinetic trp:",i,(incr(j),j=1,3) + do j=1,3 + v(j)=incr(j)+0.5d0*d_t(j,i) + enddo + vtot(i)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3) + KEt_p=KEt_p+(v(1)*v(1)+v(2)*v(2)+v(3)*v(3)) + do j=1,3 + incr(j)=incr(j)+d_t(j,i) + enddo + enddo +c write(iout,*) 'KEt_p', KEt_p +c The translational part for the side chain virtual bond +c Only now we can initialize incr with zeros. It must be equal +c to the velocities of the first Calpha. + do j=1,3 + incr(j)=d_t(j,0) + enddo + do i=nnt,nct + iti=itype(i) + if (itype(i).eq.10) then + do j=1,3 + v(j)=incr(j) + enddo + else + do j=1,3 + v(j)=incr(j)+d_t(j,nres+i) + enddo + endif +c write (iout,*) "Kinetic trsc:",i,(incr(j),j=1,3) +c write (iout,*) "i",i," msc",msc(iti)," v",(v(j),j=1,3) + KEt_sc=KEt_sc+msc(iti)*(v(1)*v(1)+v(2)*v(2)+v(3)*v(3)) + vtot(i+nres)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3) + do j=1,3 + incr(j)=incr(j)+d_t(j,i) + enddo + enddo +c goto 111 +c write(iout,*) 'KEt_sc', KEt_sc +c The part due to stretching and rotation of the peptide groups + KEr_p=0.0D0 + do i=nnt,nct-1 +c write (iout,*) "i",i +c write (iout,*) "i",i," mag1",mag1," mag2",mag2 + do j=1,3 + incr(j)=d_t(j,i) + enddo +c write (iout,*) "Kinetic rotp:",i,(incr(j),j=1,3) + KEr_p=KEr_p+(incr(1)*incr(1)+incr(2)*incr(2) + & +incr(3)*incr(3)) + enddo +c goto 111 +c write(iout,*) 'KEr_p', KEr_p +c The rotational part of the side chain virtual bond + KEr_sc=0.0D0 + do i=nnt,nct + iti=itype(i) + if (itype(i).ne.10) then + do j=1,3 + incr(j)=d_t(j,nres+i) + enddo +c write (iout,*) "Kinetic rotsc:",i,(incr(j),j=1,3) + KEr_sc=KEr_sc+Isc(iti)*(incr(1)*incr(1)+incr(2)*incr(2)+ + & incr(3)*incr(3)) + endif + enddo +c The total kinetic energy + 111 continue +c write(iout,*) 'KEr_sc', KEr_sc + KE_total=0.5d0*(mp*KEt_p+KEt_sc+0.25d0*Ip*KEr_p+KEr_sc) +c write (iout,*) "KE_total",KE_total + return + end + + + + diff --git a/source/unres/src_MD-NEWSC/lagrangian_lesyng.F b/source/unres/src_MD-NEWSC/lagrangian_lesyng.F new file mode 100644 index 0000000..8a9163a --- /dev/null +++ b/source/unres/src_MD-NEWSC/lagrangian_lesyng.F @@ -0,0 +1,726 @@ + subroutine lagrangian +c------------------------------------------------------------------------- +c This subroutine contains the total lagrangain from which the accelerations +c are obtained. For numerical gradient checking, the derivetive of the +c lagrangian in the velocities and coordinates are calculated seperately +c------------------------------------------------------------------------- + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include 'COMMON.MUCA' + include 'COMMON.TIME1' + + integer i,j,ind + double precision zapas(MAXRES6),muca_factor + logical lprn /.false./ + common /cipiszcze/ itime + +#ifdef TIMING + time00=MPI_Wtime() +#endif + do j=1,3 + zapas(j)=-gcart(j,0) + enddo + ind=3 + if (lprn) then + write (iout,*) "Potential forces backbone" + endif + do i=nnt,nct-1 + if (lprn) write (iout,'(i5,3e15.5,5x,3e15.5)') + & i,(-gcart(j,i),j=1,3) + do j=1,3 + ind=ind+1 + zapas(ind)=-gcart(j,i) + enddo + enddo + if (lprn) write (iout,*) "Potential forces sidechain" + do i=nnt,nct + if (itype(i).ne.10) then + if (lprn) write (iout,'(i5,3e15.5,5x,3e15.5)') + & i,(-gcart(j,i),j=1,3) + do j=1,3 + ind=ind+1 + zapas(ind)=-gxcart(j,i) + enddo + endif + enddo + + call ginv_mult(zapas,d_a_work) + + do j=1,3 + d_a(j,0)=d_a_work(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + ind=ind+1 + d_a(j,i)=d_a_work(ind) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + ind=ind+1 + d_a(j,i+nres)=d_a_work(ind) + enddo + endif + enddo + + if(lmuca) then + imtime=imtime+1 + if(mucadyn.gt.0) call muca_update(potE) + factor=muca_factor(potE)*t_bath*Rb + +cd print *,'lmuca ',factor,potE + do j=1,3 + d_a(j,0)=d_a(j,0)*factor + enddo + do i=nnt,nct-1 + do j=1,3 + d_a(j,i)=d_a(j,i)*factor + enddo + enddo + do i=nnt,nct + do j=1,3 + d_a(j,i+nres)=d_a(j,i+nres)*factor + enddo + enddo + + endif + + if (lprn) then + write(iout,*) 'acceleration 3D' + write (iout,'(i3,3f10.5,3x,3f10.5)') 0,(d_a(j,0),j=1,3) + do i=nnt,nct-1 + write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3) + enddo + do i=nnt,nct + write (iout,'(i3,3f10.5,3x,3f10.5)') + & i+nres,(d_a(j,i+nres),j=1,3) + enddo + endif +#ifdef TIMING + time_lagrangian=time_lagrangian+MPI_Wtime()-time00 +#endif + return + end +c------------------------------------------------------------------ + subroutine setup_MD_matrices + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer ierror +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + integer i,j + logical lprn /.false./ + logical osob + double precision dtdi,massvec(maxres2),Gcopy(maxres2,maxres2), + & Ghalf(mmaxres2),sqreig(maxres2), invsqreig(maxres2), Gcopytmp, + & Gsqrptmp, Gsqrmtmp, Gvec2tmp,Gvectmp(maxres2,maxres2) + double precision work(8*maxres6) + integer iwork(maxres6) + common /przechowalnia/ Gcopy,Ghalf,invsqreig,Gvectmp +c +c Set up the matrix of the (dC,dX)-->(C,X) transformation (A), the +c inertia matrix (Gmat) and the inverse of the inertia matrix (Ginv) +c +c Determine the number of degrees of freedom (dimen) and the number of +c sites (dimen1) + dimen=(nct-nnt+1)+nside + dimen1=(nct-nnt)+(nct-nnt+1) + dimen3=dimen*3 +#ifdef MPI + if (nfgtasks.gt.1) then + time00=MPI_Wtime() + call MPI_Bcast(5,1,MPI_INTEGER,king,FG_COMM,IERROR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 + call int_bounds(dimen,igmult_start,igmult_end) + igmult_start=igmult_start-1 + call MPI_Allgather(3*igmult_start,1,MPI_INTEGER, + & ng_start(0),1,MPI_INTEGER,FG_COMM,IERROR) + my_ng_count=igmult_end-igmult_start + call MPI_Allgather(3*my_ng_count,1,MPI_INTEGER,ng_counts(0),1, + & MPI_INTEGER,FG_COMM,IERROR) + write (iout,*) 'Processor:',fg_rank,' CG group',kolor, + & ' absolute rank',myrank,' igmult_start',igmult_start, + & ' igmult_end',igmult_end,' count',my_ng_count + write (iout,*) "ng_start",(ng_start(i),i=0,nfgtasks-1) + write (iout,*) "ng_counts",(ng_counts(i),i=0,nfgtasks-1) + call flush(iout) + else +#endif + igmult_start=1 + igmult_end=dimen + my_ng_count=dimen +#ifdef MPI + endif +#endif +c write (iout,*) "dimen",dimen," dimen1",dimen1," dimen3",dimen3 +c Zeroing out A and fricmat + do i=1,dimen + do j=1,dimen + A(i,j)=0.0D0 + enddo + enddo +c Diagonal elements of the dC part of A and the respective friction coefficients + ind=1 + ind1=0 + do i=nnt,nct-1 + ind=ind+1 + ind1=ind1+1 + coeff=0.25d0*IP + massvec(ind1)=mp + Gmat(ind,ind)=coeff + A(ind1,ind)=0.5d0 + enddo + +c Off-diagonal elements of the dC part of A + k=3 + do i=1,nct-nnt + do j=1,i + A(i,j)=1.0d0 + enddo + enddo +c Diagonal elements of the dX part of A and the respective friction coefficients + m=nct-nnt + m1=nct-nnt+1 + ind=0 + ind1=0 + do i=nnt,nct + ind=ind+1 + ii = ind+m + iti=itype(i) + massvec(ii)=msc(iti) + if (iti.ne.10) then + ind1=ind1+1 + ii1= ind1+m1 + A(ii,ii1)=1.0d0 + Gmat(ii1,ii1)=ISC(iti) + endif + enddo +c Off-diagonal elements of the dX part of A + ind=0 + k=nct-nnt + do i=nnt,nct + iti=itype(i) + ind=ind+1 + do j=nnt,i + ii = ind + jj = j-nnt+1 + A(k+ii,jj)=1.0d0 + enddo + enddo + if (lprn) then + write (iout,*) + write (iout,*) "Vector massvec" + do i=1,dimen1 + write (iout,*) i,massvec(i) + enddo + write (iout,'(//a)') "A" + call matout(dimen,dimen1,maxres2,maxres2,A) + endif + +c Calculate the G matrix (store in Gmat) + do k=1,dimen + do i=1,dimen + dtdi=0.0d0 + do j=1,dimen1 + dtdi=dtdi+A(j,k)*A(j,i)*massvec(j) + enddo + Gmat(k,i)=Gmat(k,i)+dtdi + enddo + enddo + + if (lprn) then + write (iout,'(//a)') "Gmat" + call matout(dimen,dimen,maxres2,maxres2,Gmat) + endif + do i=1,dimen + do j=1,dimen + Ginv(i,j)=0.0d0 + Gcopy(i,j)=Gmat(i,j) + enddo + Ginv(i,i)=1.0d0 + enddo +c Invert the G matrix + call MATINVERT(dimen,maxres2,Gcopy,Ginv,osob) + if (lprn) then + write (iout,'(//a)') "Ginv" + call matout(dimen,dimen,maxres2,maxres2,Ginv) + endif +#ifdef MPI + if (nfgtasks.gt.1) then + myginv_ng_count=maxres2*my_ng_count + call MPI_Allgather(maxres2*igmult_start,1,MPI_INTEGER, + & nginv_start(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(myginv_ng_count,1,MPI_INTEGER, + & nginv_counts(0),1,MPI_INTEGER,FG_COMM,IERROR) + if (lprn .and. (me.eq.king .or. .not. out1file) ) then + write (iout,*) "nginv_start",(nginv_start(i),i=0,nfgtasks-1) + write (iout,*) "nginv_counts",(nginv_counts(i),i=0,nfgtasks-1) + call flush(iout) + endif +c call MPI_Scatterv(ginv(1,1),nginv_counts(0), +c & nginv_start(0),MPI_DOUBLE_PRECISION,ginv, +c & myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERR) +c call MPI_Barrier(FG_COMM,IERR) + time00=MPI_Wtime() + call MPI_Scatterv(ginv(1,1),nginv_counts(0), + & nginv_start(0),MPI_DOUBLE_PRECISION,gcopy(1,1), + & myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERR) +#ifdef TIMING + time_scatter_ginv=time_scatter_ginv+MPI_Wtime()-time00 +#endif + do i=1,dimen + do j=1,2*my_ng_count + ginv(j,i)=gcopy(i,j) + enddo + enddo +c write (iout,*) "Master's chunk of ginv" +c call MATOUT2(my_ng_count,dimen,maxres2,maxres2,ginv) + endif +#endif + if (osob) then + write (iout,*) "The G matrix is singular." + stop + endif +c Compute G**(-1/2) and G**(1/2) + ind=0 + do i=1,dimen + do j=1,i + ind=ind+1 + Ghalf(ind)=Gmat(i,j) + enddo + enddo + call gldiag(maxres2,dimen,dimen,Ghalf,work,Geigen,Gvec, + & ierr,iwork) + if (lprn) then + write (iout,'(//a)') + & "Eigenvectors and eigenvalues of the G matrix" + call eigout(dimen,dimen,maxres2,maxres2,Gvec,Geigen) + endif + + do i=1,dimen + sqreig(i)=dsqrt(Geigen(i)) + invsqreig(i)=1.d0/sqreig(i) + enddo + do i=1,dimen + do j=1,dimen + Gvectmp(i,j)=Gvec(j,i) + enddo + enddo + + do i=1,dimen + do j=1,dimen + Gsqrptmp=0.0d0 + Gsqrmtmp=0.0d0 + Gcopytmp=0.0d0 + do k=1,dimen +c Gvec2tmp=Gvec(i,k)*Gvec(j,k) + Gvec2tmp=Gvec(k,i)*Gvec(k,j) + Gsqrptmp=Gsqrptmp+Gvec2tmp*sqreig(k) + Gsqrmtmp=Gsqrmtmp+Gvec2tmp*invsqreig(k) + Gcopytmp=Gcopytmp+Gvec2tmp*Geigen(k) + enddo + Gsqrp(i,j)=Gsqrptmp + Gsqrm(i,j)=Gsqrmtmp + Gcopy(i,j)=Gcopytmp + enddo + enddo + + do i=1,dimen + do j=1,dimen + Gvec(i,j)=Gvectmp(j,i) + enddo + enddo + + if (lprn) then + write (iout,*) "Comparison of original and restored G" + do i=1,dimen + do j=1,dimen + write (iout,'(2i5,5f10.5)') i,j,Gmat(i,j),Gcopy(i,j), + & Gmat(i,j)-Gcopy(i,j),Gsqrp(i,j),Gsqrm(i,j) + enddo + enddo + endif + return + end +c------------------------------------------------------------------------------- + SUBROUTINE EIGOUT(NC,NR,LM2,LM3,A,B) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + double precision A(LM2,LM3),B(LM2) + KA=1 + KC=6 + 1 KB=MIN0(KC,NC) + WRITE(IOUT,600) (I,I=KA,KB) + WRITE(IOUT,601) (B(I),I=KA,KB) + WRITE(IOUT,602) + 2 N=0 + DO 3 I=1,NR + WRITE(IOUT,603) I,(A(I,J),J=KA,KB) + N=N+1 + IF(N.LT.10) GO TO 3 + WRITE(IOUT,602) + N=0 + 3 CONTINUE + 4 IF (KB.EQ.NC) RETURN + KA=KC+1 + KC=KC+6 + GO TO 1 + 600 FORMAT (// 9H ROOT NO.,I4,9I11) + 601 FORMAT (/5X,10(1PE11.4)) + 602 FORMAT (2H ) + 603 FORMAT (I5,10F11.5) + 604 FORMAT (1H1) + END +c------------------------------------------------------------------------------- + SUBROUTINE MATOUT(NC,NR,LM2,LM3,A) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + double precision A(LM2,LM3) + KA=1 + KC=6 + 1 KB=MIN0(KC,NC) + WRITE(IOUT,600) (I,I=KA,KB) + WRITE(IOUT,602) + 2 N=0 + DO 3 I=1,NR + WRITE(IOUT,603) I,(A(I,J),J=KA,KB) + N=N+1 + IF(N.LT.10) GO TO 3 + WRITE(IOUT,602) + N=0 + 3 CONTINUE + 4 IF (KB.EQ.NC) RETURN + KA=KC+1 + KC=KC+6 + GO TO 1 + 600 FORMAT (//5x,9I11) + 602 FORMAT (2H ) + 603 FORMAT (I5,10F11.3) + 604 FORMAT (1H1) + END +c------------------------------------------------------------------------------- + SUBROUTINE MATOUT1(NC,NR,LM2,LM3,A) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + double precision A(LM2,LM3) + KA=1 + KC=21 + 1 KB=MIN0(KC,NC) + WRITE(IOUT,600) (I,I=KA,KB) + WRITE(IOUT,602) + 2 N=0 + DO 3 I=1,NR + WRITE(IOUT,603) I,(A(I,J),J=KA,KB) + N=N+1 + IF(N.LT.3) GO TO 3 + WRITE(IOUT,602) + N=0 + 3 CONTINUE + 4 IF (KB.EQ.NC) RETURN + KA=KC+1 + KC=KC+21 + GO TO 1 + 600 FORMAT (//5x,7(3I5,2x)) + 602 FORMAT (2H ) + 603 FORMAT (I5,7(3F5.1,2x)) + 604 FORMAT (1H1) + END +c------------------------------------------------------------------------------- + SUBROUTINE MATOUT2(NC,NR,LM2,LM3,A) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + double precision A(LM2,LM3) + KA=1 + KC=12 + 1 KB=MIN0(KC,NC) + WRITE(IOUT,600) (I,I=KA,KB) + WRITE(IOUT,602) + 2 N=0 + DO 3 I=1,NR + WRITE(IOUT,603) I,(A(I,J),J=KA,KB) + N=N+1 + IF(N.LT.3) GO TO 3 + WRITE(IOUT,602) + N=0 + 3 CONTINUE + 4 IF (KB.EQ.NC) RETURN + KA=KC+1 + KC=KC+12 + GO TO 1 + 600 FORMAT (//5x,4(3I9,2x)) + 602 FORMAT (2H ) + 603 FORMAT (I5,4(3F9.3,2x)) + 604 FORMAT (1H1) + END +c--------------------------------------------------------------------------- + SUBROUTINE ginv_mult(z,d_a_tmp) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer ierr +#endif + include 'COMMON.SETUP' + include 'COMMON.TIME1' + include 'COMMON.MD' + double precision z(dimen3),d_a_tmp(dimen3),temp(maxres6),time00 + &time01 +#ifdef MPI + if (nfgtasks.gt.1) then + if (fg_rank.eq.0) then +c The matching BROADCAST for fg processors is called in ERGASTULUM + time00=MPI_Wtime() + call MPI_Bcast(4,1,MPI_INTEGER,king,FG_COMM,IERROR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 +c print *,"Processor",myrank," BROADCAST iorder in GINV_MULT" + endif +c write (2,*) "time00",time00 +c write (2,*) "Before Scatterv" +c call flush(2) +c write (2,*) "Whole z (for FG master)" +c do i=1,dimen +c write (2,*) i,z(i) +c enddo +c call MPI_Barrier(FG_COMM,IERROR) + time00=MPI_Wtime() + call MPI_Scatterv(z,ng_counts(0),ng_start(0), + & MPI_DOUBLE_PRECISION, + & z,3*my_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERR) +c write (2,*) "My chunk of z" +c do i=1,3*my_ng_count +c write (2,*) i,z(i) +c enddo +c write (2,*) "After SCATTERV" +c call flush(2) +c write (2,*) "MPI_Wtime",MPI_Wtime() + time_scatter=time_scatter+MPI_Wtime()-time00 +#ifdef TIMING + time_scatter_ginvmult=time_scatter_ginvmult+MPI_Wtime()-time00 +#endif +c write (2,*) "time_scatter",time_scatter +c write (2,*) "dimen",dimen," dimen3",dimen3," my_ng_count", +c & my_ng_count +c call flush(2) + time01=MPI_Wtime() + do k=0,2 + do i=1,dimen + ind=(i-1)*3+k+1 + temp(ind)=0.0d0 + do j=1,my_ng_count +c write (2,*) "k,i,j,ind",k,i,j,ind,(j-1)*3+k+1, +c & Ginv(i,j),z((j-1)*3+k+1), +c & Ginv(i,j)*z((j-1)*3+k+1) +c temp(ind)=temp(ind)+Ginv(i,j)*z((j-1)*3+k+1) + temp(ind)=temp(ind)+Ginv(j,i)*z((j-1)*3+k+1) + enddo + enddo + enddo + time_ginvmult=time_ginvmult+MPI_Wtime()-time01 +c write (2,*) "Before REDUCE" +c call flush(2) +c write (2,*) "z before reduce" +c do i=1,dimen +c write (2,*) i,temp(i) +c enddo + time00=MPI_Wtime() + call MPI_Reduce(temp(1),d_a_tmp(1),dimen3,MPI_DOUBLE_PRECISION, + & MPI_SUM,king,FG_COMM,IERR) + time_reduce=time_reduce+MPI_Wtime()-time00 +c write (2,*) "After REDUCE" +c call flush(2) + else +#endif +#ifdef TIMING + time01=MPI_Wtime() +#endif + do k=0,2 + do i=1,dimen + ind=(i-1)*3+k+1 + d_a_tmp(ind)=0.0d0 + do j=1,dimen +c write (2,*) "k,i,j,ind",k,i,j,ind,(j-1)*3+k+1 +c call flush(2) +c & Ginv(i,j),z((j-1)*3+k+1), +c & Ginv(i,j)*z((j-1)*3+k+1) + d_a_tmp(ind)=d_a_tmp(ind) + & +Ginv(j,i)*z((j-1)*3+k+1) +c d_a_tmp(ind)=d_a_tmp(ind) +c & +Ginv(i,j)*z((j-1)*3+k+1) + enddo + enddo + enddo +#ifdef TIMING + time_ginvmult=time_ginvmult+MPI_Wtime()-time01 +#endif +#ifdef MPI + endif +#endif + return + end +c--------------------------------------------------------------------------- +#ifdef GINV_MULT + SUBROUTINE ginv_mult_test(z,d_a_tmp) + include 'DIMENSIONS' + integer dimen +c include 'COMMON.MD' + double precision z(dimen),d_a_tmp(dimen) + double precision ztmp(dimen/3),dtmp(dimen/3) + +c do i=1,dimen +c d_a_tmp(i)=0.0d0 +c do j=1,dimen +c d_a_tmp(i)=d_a_tmp(i)+Ginv(i,j)*z(j) +c enddo +c enddo +c +c return + +!ibm* unroll(3) + do k=0,2 + do j=1,dimen/3 + ztmp(j)=z((j-1)*3+k+1) + enddo + + call alignx(16,ztmp(1)) + call alignx(16,dtmp(1)) + call alignx(16,Ginv(1,1)) + + do i=1,dimen/3 + dtmp(i)=0.0d0 + do j=1,dimen/3 + dtmp(i)=dtmp(i)+Ginv(i,j)*ztmp(j) + enddo + enddo + do i=1,dimen/3 + ind=(i-1)*3+k+1 + d_a_tmp(ind)=dtmp(i) + enddo + enddo + return + end +#endif +c--------------------------------------------------------------------------- + SUBROUTINE fricmat_mult(z,d_a_tmp) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer IERROR +#endif + include 'COMMON.MD' + include 'COMMON.IOUNITS' + include 'COMMON.SETUP' + include 'COMMON.TIME1' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + double precision z(dimen3),d_a_tmp(dimen3),temp(maxres6),time00 + &time01 +#ifdef MPI + if (nfgtasks.gt.1) then + if (fg_rank.eq.0) then +c The matching BROADCAST for fg processors is called in ERGASTULUM + time00=MPI_Wtime() + call MPI_Bcast(9,1,MPI_INTEGER,king,FG_COMM,IERROR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 +c print *,"Processor",myrank," BROADCAST iorder in FRICMAT_MULT" + endif +c call MPI_Barrier(FG_COMM,IERROR) + time00=MPI_Wtime() + call MPI_Scatterv(z,ng_counts(0),ng_start(0), + & MPI_DOUBLE_PRECISION, + & z,3*my_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERR) +c write (2,*) "My chunk of z" +c do i=1,3*my_ng_count +c write (2,*) i,z(i) +c enddo + time_scatter=time_scatter+MPI_Wtime()-time00 +#ifdef TIMING + time_scatter_fmatmult=time_scatter_fmatmult+MPI_Wtime()-time00 +#endif + time01=MPI_Wtime() + do k=0,2 + do i=1,dimen + ind=(i-1)*3+k+1 + temp(ind)=0.0d0 + do j=1,my_ng_count + temp(ind)=temp(ind)-fricmat(j,i)*z((j-1)*3+k+1) + enddo + enddo + enddo + time_fricmatmult=time_fricmatmult+MPI_Wtime()-time01 +c write (2,*) "Before REDUCE" +c write (2,*) "d_a_tmp before reduce" +c do i=1,dimen3 +c write (2,*) i,temp(i) +c enddo +c call flush(2) + time00=MPI_Wtime() + call MPI_Reduce(temp(1),d_a_tmp(1),dimen3,MPI_DOUBLE_PRECISION, + & MPI_SUM,king,FG_COMM,IERR) + time_reduce=time_reduce+MPI_Wtime()-time00 +c write (2,*) "After REDUCE" +c call flush(2) + else +#endif +#ifdef TIMING + time01=MPI_Wtime() +#endif + do k=0,2 + do i=1,dimen + ind=(i-1)*3+k+1 + d_a_tmp(ind)=0.0d0 + do j=1,dimen + d_a_tmp(ind)=d_a_tmp(ind) + & -fricmat(j,i)*z((j-1)*3+k+1) + enddo + enddo + enddo +#ifdef TIMING + time_fricmatmult=time_fricmatmult+MPI_Wtime()-time01 +#endif +#ifdef MPI + endif +#endif +c write (iout,*) "Vector d_a" +c do i=1,dimen3 +c write (2,*) i,d_a_tmp(i) +c enddo + return + end diff --git a/source/unres/src_MD-NEWSC/local_move.f b/source/unres/src_MD-NEWSC/local_move.f new file mode 100644 index 0000000..7a7e125 --- /dev/null +++ b/source/unres/src_MD-NEWSC/local_move.f @@ -0,0 +1,972 @@ +c------------------------------------------------------------- + + subroutine local_move_init(debug) +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' ! Needed by COMMON.LOCAL + include 'COMMON.GEO' ! For pi, deg2rad + include 'COMMON.LOCAL' ! For vbl + include 'COMMON.LOCMOVE' + +c INPUT arguments + logical debug + + +c Determine wheter to do some debugging output + locmove_output=debug + +c Set the init_called flag to 1 + init_called=1 + +c The following are never changed + min_theta=60.D0*deg2rad ! (0,PI) + max_theta=175.D0*deg2rad ! (0,PI) + dmin2=vbl*vbl*2.*(1.-cos(min_theta)) + dmax2=vbl*vbl*2.*(1.-cos(max_theta)) + flag=1.0D300 + small=1.0D-5 + small2=0.5*small*small + +c Not really necessary... + a_n=0 + b_n=0 + res_n=0 + + return + end + +c------------------------------------------------------------- + + subroutine local_move(n_start, n_end, PHImin, PHImax) +c Perform a local move between residues m and n (inclusive) +c PHImin and PHImax [0,PI] determine the size of the move +c Works on whatever structure is in the variables theta and phi, +c sidechain variables are left untouched +c The final structure is NOT minimized, but both the cartesian +c variables c and the angles are up-to-date at the end (no further +c chainbuild is required) +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.MINIM' + include 'COMMON.SBRIDGE' + include 'COMMON.LOCMOVE' + +c External functions + integer move_res + external move_res + double precision ran_number + external ran_number + +c INPUT arguments + integer n_start, n_end ! First and last residues to move + double precision PHImin, PHImax ! min/max angles [0,PI] + +c Local variables + integer i,j + double precision min,max + integer iretcode + + +c Check if local_move_init was called. This assumes that it +c would not be 1 if not explicitely initialized + if (init_called.ne.1) then + write(6,*)' *** local_move_init not called!!!' + stop + endif + +c Quick check for crazy range + if (n_start.gt.n_end .or. n_start.lt.1 .or. n_end.gt.nres) then + write(6,'(a,i3,a,i3)') + + ' *** Cannot make local move between n_start = ', + + n_start,' and n_end = ',n_end + return + endif + +c Take care of end residues first... + if (n_start.eq.1) then +c Move residue 1 (completely random) + theta(3)=ran_number(min_theta,max_theta) + phi(4)=ran_number(-PI,PI) + i=2 + else + i=n_start + endif + if (n_end.eq.nres) then +c Move residue nres (completely random) + theta(nres)=ran_number(min_theta,max_theta) + phi(nres)=ran_number(-PI,PI) + j=nres-1 + else + j=n_end + endif + +c ...then go through all other residues one by one +c Start from the two extremes and converge + call chainbuild + do while (i.le.j) + min=PHImin + max=PHImax +c$$$c Move the first two residues by less than the others +c$$$ if (i-n_start.lt.3) then +c$$$ if (i-n_start.eq.0) then +c$$$ min=0.4*PHImin +c$$$ max=0.4*PHImax +c$$$ else if (i-n_start.eq.1) then +c$$$ min=0.8*PHImin +c$$$ max=0.8*PHImax +c$$$ else if (i-n_start.eq.2) then +c$$$ min=PHImin +c$$$ max=PHImax +c$$$ endif +c$$$ endif + +c The actual move, on residue i + iretcode=move_res(min,max,i) ! Discard iretcode + i=i+1 + + if (i.le.j) then + min=PHImin + max=PHImax +c$$$c Move the last two residues by less than the others +c$$$ if (n_end-j.lt.3) then +c$$$ if (n_end-j.eq.0) then +c$$$ min=0.4*PHImin +c$$$ max=0.4*PHImax +c$$$ else if (n_end-j.eq.1) then +c$$$ min=0.8*PHImin +c$$$ max=0.8*PHImax +c$$$ else if (n_end-j.eq.2) then +c$$$ min=PHImin +c$$$ max=PHImax +c$$$ endif +c$$$ endif + +c The actual move, on residue j + iretcode=move_res(min,max,j) ! Discard iretcode + j=j-1 + endif + enddo + + call int_from_cart(.false.,.false.) + + return + end + +c------------------------------------------------------------- + + subroutine output_tabs +c Prints out the contents of a_..., b_..., res_... + implicit none + +c Includes + include 'COMMON.GEO' + include 'COMMON.LOCMOVE' + +c Local variables + integer i,j + + + write(6,*)'a_...' + write(6,'(8f7.1)')(a_ang(i)*rad2deg,i=0,a_n-1) + write(6,'(8(2x,3l1,2x))')((a_tab(i,j),i=0,2),j=0,a_n-1) + + write(6,*)'b_...' + write(6,'(4f7.1)')(b_ang(i)*rad2deg,i=0,b_n-1) + write(6,'(4(2x,3l1,2x))')((b_tab(i,j),i=0,2),j=0,b_n-1) + + write(6,*)'res_...' + write(6,'(12f7.1)')(res_ang(i)*rad2deg,i=0,res_n-1) + write(6,'(12(2x,3l1,2x))')((res_tab(0,i,j),i=0,2),j=0,res_n-1) + write(6,'(12(2x,3l1,2x))')((res_tab(1,i,j),i=0,2),j=0,res_n-1) + write(6,'(12(2x,3l1,2x))')((res_tab(2,i,j),i=0,2),j=0,res_n-1) + + return + end + +c------------------------------------------------------------- + + subroutine angles2tab(PHImin,PHImax,n,ang,tab) +c Only uses angles if [0,PI] (but PHImin cannot be 0., +c and PHImax cannot be PI) + implicit none + +c Includes + include 'COMMON.GEO' + +c INPUT arguments + double precision PHImin,PHImax + +c OUTPUT arguments + integer n + double precision ang(0:3) + logical tab(0:2,0:3) + + + if (PHImin .eq. PHImax) then +c Special case with two 010's + n = 2; + ang(0) = -PHImin; + ang(1) = PHImin; + tab(0,0) = .false. + tab(2,0) = .false. + tab(0,1) = .false. + tab(2,1) = .false. + tab(1,0) = .true. + tab(1,1) = .true. + else if (PHImin .eq. PI) then +c Special case with one 010 + n = 1 + ang(0) = PI + tab(0,0) = .false. + tab(2,0) = .false. + tab(1,0) = .true. + else if (PHImax .eq. 0.) then +c Special case with one 010 + n = 1 + ang(0) = 0. + tab(0,0) = .false. + tab(2,0) = .false. + tab(1,0) = .true. + else +c Standard cases + n = 0 + if (PHImin .gt. 0.) then +c Start of range (011) + ang(n) = PHImin + tab(0,n) = .false. + tab(1,n) = .true. + tab(2,n) = .true. +c End of range (110) + ang(n+1) = -PHImin + tab(0,n+1) = .true. + tab(1,n+1) = .true. + tab(2,n+1) = .false. + n = n+2 + endif + if (PHImax .lt. PI) then +c Start of range (011) + ang(n) = -PHImax + tab(0,n) = .false. + tab(1,n) = .true. + tab(2,n) = .true. +c End of range (110) + ang(n+1) = PHImax + tab(0,n+1) = .true. + tab(1,n+1) = .true. + tab(2,n+1) = .false. + n = n+2 + endif + endif + + return + end + +c------------------------------------------------------------- + + subroutine minmax_angles(x,y,z,r,n,ang,tab) +c When solutions do not exist, assume all angles +c are acceptable - i.e., initial geometry must be correct + implicit none + +c Includes + include 'COMMON.GEO' + include 'COMMON.LOCMOVE' + +c Input arguments + double precision x,y,z,r + +c Output arguments + integer n + double precision ang(0:3) + logical tab(0:2,0:3) + +c Local variables + double precision num, denom, phi + double precision Kmin, Kmax + integer i + + + num = x*x + y*y + z*z + denom = x*x + y*y + n = 0 + if (denom .gt. 0.) then + phi = atan2(y,x) + denom = 2.*r*sqrt(denom) + num = num+r*r + Kmin = (num - dmin2)/denom + Kmax = (num - dmax2)/denom + +c Allowed values of K (else all angles are acceptable) +c -1 <= Kmin < 1 +c -1 < Kmax <= 1 + if (Kmin .gt. 1. .or. abs(Kmin-1.) .lt. small2) then + Kmin = -flag + else if (Kmin .lt. -1. .or. abs(Kmin+1.) .lt. small2) then + Kmin = PI + else + Kmin = acos(Kmin) + endif + + if (Kmax .lt. -1. .or. abs(Kmax+1.) .lt. small2) then + Kmax = flag + else if (Kmax .gt. 1. .or. abs(Kmax-1.) .lt. small2) then + Kmax = 0. + else + Kmax = acos(Kmax) + endif + + if (Kmax .lt. Kmin) Kmax = Kmin + + call angles2tab(Kmin, Kmax, n, ang, tab) + +c Add phi and check that angles are within range (-PI,PI] + do i=0,n-1 + ang(i) = ang(i)+phi + if (ang(i) .le. -PI) then + ang(i) = ang(i)+2.*PI + else if (ang(i) .gt. PI) then + ang(i) = ang(i)-2.*PI + endif + enddo + endif + + return + end + +c------------------------------------------------------------- + + subroutine construct_tab +c Take a_... and b_... values and produces the results res_... +c x_ang are assumed to be all different (diff > small) +c x_tab(1,i) must be 1 for all i (i.e., all x_ang are acceptable) + implicit none + +c Includes + include 'COMMON.LOCMOVE' + +c Local variables + integer n_max,i,j,index + logical done + double precision phi + + + n_max = a_n + b_n + if (n_max .eq. 0) then + res_n = 0 + return + endif + + do i=0,n_max-1 + do j=0,1 + res_tab(j,0,i) = .true. + res_tab(j,2,i) = .true. + res_tab(j,1,i) = .false. + enddo + enddo + + index = 0 + phi = -flag + done = .false. + do while (.not.done) + res_ang(index) = flag + +c Check a first... + do i=0,a_n-1 + if ((a_ang(i)-phi).gt.small .and. + + a_ang(i) .lt. res_ang(index)) then +c Found a lower angle + res_ang(index) = a_ang(i) +c Copy the values from a_tab into res_tab(0,,) + res_tab(0,0,index) = a_tab(0,i) + res_tab(0,1,index) = a_tab(1,i) + res_tab(0,2,index) = a_tab(2,i) +c Set default values for res_tab(1,,) + res_tab(1,0,index) = .true. + res_tab(1,1,index) = .false. + res_tab(1,2,index) = .true. + else if (abs(a_ang(i)-res_ang(index)).lt.small) then +c Found an equal angle (can only be equal to a b_ang) + res_tab(0,0,index) = a_tab(0,i) + res_tab(0,1,index) = a_tab(1,i) + res_tab(0,2,index) = a_tab(2,i) + endif + enddo +c ...then check b + do i=0,b_n-1 + if ((b_ang(i)-phi).gt.small .and. + + b_ang(i) .lt. res_ang(index)) then +c Found a lower angle + res_ang(index) = b_ang(i) +c Copy the values from b_tab into res_tab(1,,) + res_tab(1,0,index) = b_tab(0,i) + res_tab(1,1,index) = b_tab(1,i) + res_tab(1,2,index) = b_tab(2,i) +c Set default values for res_tab(0,,) + res_tab(0,0,index) = .true. + res_tab(0,1,index) = .false. + res_tab(0,2,index) = .true. + else if (abs(b_ang(i)-res_ang(index)).lt.small) then +c Found an equal angle (can only be equal to an a_ang) + res_tab(1,0,index) = b_tab(0,i) + res_tab(1,1,index) = b_tab(1,i) + res_tab(1,2,index) = b_tab(2,i) + endif + enddo + + if (res_ang(index) .eq. flag) then + res_n = index + done = .true. + else if (index .eq. n_max-1) then + res_n = n_max + done = .true. + else + phi = res_ang(index) ! Store previous angle + index = index+1 + endif + enddo + +c Fill the gaps +c First a... + index = 0 + if (a_n .gt. 0) then + do while (.not.res_tab(0,1,index)) + index=index+1 + enddo + done = res_tab(0,2,index) + do i=index+1,res_n-1 + if (res_tab(0,1,i)) then + done = res_tab(0,2,i) + else + res_tab(0,0,i) = done + res_tab(0,1,i) = done + res_tab(0,2,i) = done + endif + enddo + done = res_tab(0,0,index) + do i=index-1,0,-1 + if (res_tab(0,1,i)) then + done = res_tab(0,0,i) + else + res_tab(0,0,i) = done + res_tab(0,1,i) = done + res_tab(0,2,i) = done + endif + enddo + else + do i=0,res_n-1 + res_tab(0,0,i) = .true. + res_tab(0,1,i) = .true. + res_tab(0,2,i) = .true. + enddo + endif +c ...then b + index = 0 + if (b_n .gt. 0) then + do while (.not.res_tab(1,1,index)) + index=index+1 + enddo + done = res_tab(1,2,index) + do i=index+1,res_n-1 + if (res_tab(1,1,i)) then + done = res_tab(1,2,i) + else + res_tab(1,0,i) = done + res_tab(1,1,i) = done + res_tab(1,2,i) = done + endif + enddo + done = res_tab(1,0,index) + do i=index-1,0,-1 + if (res_tab(1,1,i)) then + done = res_tab(1,0,i) + else + res_tab(1,0,i) = done + res_tab(1,1,i) = done + res_tab(1,2,i) = done + endif + enddo + else + do i=0,res_n-1 + res_tab(1,0,i) = .true. + res_tab(1,1,i) = .true. + res_tab(1,2,i) = .true. + enddo + endif + +c Finally fill the last row with AND operation + do i=0,res_n-1 + do j=0,2 + res_tab(2,j,i) = (res_tab(0,j,i) .and. res_tab(1,j,i)) + enddo + enddo + + return + end + +c------------------------------------------------------------- + + subroutine construct_ranges(phi_n,phi_start,phi_end) +c Given the data in res_..., construct a table of +c min/max allowed angles + implicit none + +c Includes + include 'COMMON.GEO' + include 'COMMON.LOCMOVE' + +c Output arguments + integer phi_n + double precision phi_start(0:11),phi_end(0:11) + +c Local variables + logical done + integer index + + + if (res_n .eq. 0) then +c Any move is allowed + phi_n = 1 + phi_start(0) = -PI + phi_end(0) = PI + else + phi_n = 0 + index = 0 + done = .false. + do while (.not.done) +c Find start of range (01x) + done = .false. + do while (.not.done) + if (res_tab(2,0,index).or.(.not.res_tab(2,1,index))) then + index=index+1 + else + done = .true. + phi_start(phi_n) = res_ang(index) + endif + if (index .eq. res_n) done = .true. + enddo +c If a start was found (index < res_n), find the end of range (x10) +c It may not be found without wrapping around + if (index .lt. res_n) then + done = .false. + do while (.not.done) + if ((.not.res_tab(2,1,index)).or.res_tab(2,2,index)) then + index=index+1 + else + done = .true. + endif + if (index .eq. res_n) done = .true. + enddo + if (index .lt. res_n) then +c Found the end of the range + phi_end(phi_n) = res_ang(index) + phi_n=phi_n+1 + index=index+1 + if (index .eq. res_n) then + done = .true. + else + done = .false. + endif + else +c Need to wrap around + done = .true. + phi_end(phi_n) = flag + endif + endif + enddo +c Take care of the last one if need to wrap around + if (phi_end(phi_n) .eq. flag) then + index = 0 + do while ((.not.res_tab(2,1,index)).or.res_tab(2,2,index)) + index=index+1 + enddo + phi_end(phi_n) = res_ang(index) + 2.*PI + phi_n=phi_n+1 + endif + endif + + return + end + +c------------------------------------------------------------- + + subroutine fix_no_moves(phi) + implicit none + +c Includes + include 'COMMON.GEO' + include 'COMMON.LOCMOVE' + +c Output arguments + double precision phi + +c Local variables + integer index + double precision diff,temp + + +c Look for first 01x in gammas (there MUST be at least one) + diff = flag + index = 0 + do while (res_tab(1,0,index) .or. (.not.res_tab(1,1,index))) + index=index+1 + enddo + if (res_ang(index) .le. 0.D0) then ! Make sure it's from PHImax +c Try to increase PHImax + if (index .gt. 0) then + phi = res_ang(index-1) + diff = abs(res_ang(index) - res_ang(index-1)) + endif +c Look for last (corresponding) x10 + index = res_n - 1 + do while ((.not.res_tab(1,1,index)) .or. res_tab(1,2,index)) + index=index-1 + enddo + if (index .lt. res_n-1) then + temp = abs(res_ang(index) - res_ang(index+1)) + if (temp .lt. diff) then + phi = res_ang(index+1) + diff = temp + endif + endif + endif + +c If increasing PHImax didn't work, decreasing PHImin +c will (with one exception) +c Look for first x10 (there MUST be at least one) + index = 0 + do while ((.not.res_tab(1,1,index)) .or. res_tab(1,2,index)) + index=index+1 + enddo + if (res_ang(index) .lt. 0.D0) then ! Make sure it's from PHImin +c Try to decrease PHImin + if (index .lt. res_n-1) then + temp = abs(res_ang(index) - res_ang(index+1)) + if (res_ang(index+1) .le. 0.D0 .and. temp .lt. diff) then + phi = res_ang(index+1) + diff = temp + endif + endif +c Look for last (corresponding) 01x + index = res_n - 1 + do while (res_tab(1,0,index) .or. (.not.res_tab(1,1,index))) + index=index-1 + enddo + if (index .gt. 0) then + temp = abs(res_ang(index) - res_ang(index-1)) + if (res_ang(index-1) .ge. 0.D0 .and. temp .lt. diff) then + phi = res_ang(index-1) + diff = temp + endif + endif + endif + +c If it still didn't work, it must be PHImax == 0. or PHImin == PI + if (diff .eq. flag) then + index = 0 + if (res_tab(index,1,0) .or. (.not.res_tab(index,1,1)) .or. + + res_tab(index,1,2)) index = res_n - 1 +c This MUST work at this point + if (index .eq. 0) then + phi = res_ang(1) + else + phi = res_ang(index - 1) + endif + endif + + return + end + +c------------------------------------------------------------- + + integer function move_res(PHImin,PHImax,i_move) +c Moves residue i_move (in array c), leaving everything else fixed +c Starting geometry is not checked, it should be correct! +c R(,i_move) is the only residue that will move, but must have +c 1 < i_move < nres (i.e., cannot move ends) +c Whether any output is done is controlled by locmove_output +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.GEO' + include 'COMMON.LOCMOVE' + +c External functions + double precision ran_number + external ran_number + +c Input arguments + double precision PHImin,PHImax + integer i_move + +c RETURN VALUES: +c 0: move successfull +c 1: Dmin or Dmax had to be modified +c 2: move failed - check your input geometry + + +c Local variables + double precision X(0:2),Y(0:2),Z(0:2),Orig(0:2) + double precision P(0:2) + logical no_moves,done + integer index,i,j + double precision phi,temp,radius + double precision phi_start(0:11), phi_end(0:11) + integer phi_n + +c Set up the coordinate system + do i=0,2 + Orig(i)=0.5*(c(i+1,i_move-1)+c(i+1,i_move+1)) ! Position of origin + enddo + + do i=0,2 + Z(i)=c(i+1,i_move+1)-c(i+1,i_move-1) + enddo + temp=sqrt(Z(0)*Z(0)+Z(1)*Z(1)+Z(2)*Z(2)) + do i=0,2 + Z(i)=Z(i)/temp + enddo + + do i=0,2 + X(i)=c(i+1,i_move)-Orig(i) + enddo +c radius is the radius of the circle on which c(,i_move) can move + radius=sqrt(X(0)*X(0)+X(1)*X(1)+X(2)*X(2)) + do i=0,2 + X(i)=X(i)/radius + enddo + + Y(0)=Z(1)*X(2)-X(1)*Z(2) + Y(1)=X(0)*Z(2)-Z(0)*X(2) + Y(2)=Z(0)*X(1)-X(0)*Z(1) + +c Calculate min, max angles coming from dmin, dmax to c(,i_move-2) + if (i_move.gt.2) then + do i=0,2 + P(i)=c(i+1,i_move-2)-Orig(i) + enddo + call minmax_angles(P(0)*X(0)+P(1)*X(1)+P(2)*X(2), + + P(0)*Y(0)+P(1)*Y(1)+P(2)*Y(2), + + P(0)*Z(0)+P(1)*Z(1)+P(2)*Z(2), + + radius,a_n,a_ang,a_tab) + else + a_n=0 + endif + +c Calculate min, max angles coming from dmin, dmax to c(,i_move+2) + if (i_move.lt.nres-2) then + do i=0,2 + P(i)=c(i+1,i_move+2)-Orig(i) + enddo + call minmax_angles(P(0)*X(0)+P(1)*X(1)+P(2)*X(2), + + P(0)*Y(0)+P(1)*Y(1)+P(2)*Y(2), + + P(0)*Z(0)+P(1)*Z(1)+P(2)*Z(2), + + radius,b_n,b_ang,b_tab) + else + b_n=0 + endif + +c Construct the resulting table for alpha and beta + call construct_tab() + + if (locmove_output) then + print *,'ALPHAS & BETAS TABLE' + call output_tabs() + endif + +c Check that there is at least one possible move + no_moves = .true. + if (res_n .eq. 0) then + no_moves = .false. + else + index = 0 + do while ((index .lt. res_n) .and. no_moves) + if (res_tab(2,1,index)) no_moves = .false. + index=index+1 + enddo + endif + if (no_moves) then + if (locmove_output) print *,' *** Cannot move anywhere' + move_res=2 + return + endif + +c Transfer res_... into a_... + a_n = 0 + do i=0,res_n-1 + if ( (res_tab(2,0,i).neqv.res_tab(2,1,i)) .or. + + (res_tab(2,0,i).neqv.res_tab(2,2,i)) ) then + a_ang(a_n) = res_ang(i) + do j=0,2 + a_tab(j,a_n) = res_tab(2,j,i) + enddo + a_n=a_n+1 + endif + enddo + +c Check that the PHI's are within [0,PI] + if (PHImin .lt. 0. .or. abs(PHImin) .lt. small) PHImin = -flag + if (PHImin .gt. PI .or. abs(PHImin-PI) .lt. small) PHImin = PI + if (PHImax .gt. PI .or. abs(PHImax-PI) .lt. small) PHImax = flag + if (PHImax .lt. 0. .or. abs(PHImax) .lt. small) PHImax = 0. + if (PHImax .lt. PHImin) PHImax = PHImin +c Calculate min and max angles coming from PHImin and PHImax, +c and put them in b_... + call angles2tab(PHImin, PHImax, b_n, b_ang, b_tab) +c Construct the final table + call construct_tab() + + if (locmove_output) then + print *,'FINAL TABLE' + call output_tabs() + endif + +c Check that there is at least one possible move + no_moves = .true. + if (res_n .eq. 0) then + no_moves = .false. + else + index = 0 + do while ((index .lt. res_n) .and. no_moves) + if (res_tab(2,1,index)) no_moves = .false. + index=index+1 + enddo + endif + + if (no_moves) then +c Take care of the case where no solution exists... + call fix_no_moves(phi) + if (locmove_output) then + print *,' *** Had to modify PHImin or PHImax' + print *,'phi: ',phi*rad2deg + endif + move_res=1 + else +c ...or calculate the solution +c Construct phi_start/phi_end arrays + call construct_ranges(phi_n, phi_start, phi_end) +c Choose random angle phi in allowed range(s) + temp = 0. + do i=0,phi_n-1 + temp = temp + phi_end(i) - phi_start(i) + enddo + phi = ran_number(phi_start(0),phi_start(0)+temp) + index = 0 + done = .false. + do while (.not.done) + if (phi .lt. phi_end(index)) then + done = .true. + else + index=index+1 + endif + if (index .eq. phi_n) then + done = .true. + else if (.not.done) then + phi = phi + phi_start(index) - phi_end(index-1) + endif + enddo + if (index.eq.phi_n) phi=phi_end(phi_n-1) ! Fix numerical errors + if (phi .gt. PI) phi = phi-2.*PI + + if (locmove_output) then + print *,'ALLOWED RANGE(S)' + do i=0,phi_n-1 + print *,phi_start(i)*rad2deg,phi_end(i)*rad2deg + enddo + print *,'phi: ',phi*rad2deg + endif + move_res=0 + endif + +c Re-use radius as temp variable + temp=radius*cos(phi) + radius=radius*sin(phi) + do i=0,2 + c(i+1,i_move)=Orig(i)+temp*X(i)+radius*Y(i) + enddo + + return + end + +c------------------------------------------------------------- + + subroutine loc_test +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.LOCMOVE' + +c External functions + integer move_res + external move_res + +c Local variables + integer i,j + integer phi_n + double precision phi_start(0:11),phi_end(0:11) + double precision phi + double precision R(0:2,0:5) + + locmove_output=.true. + +c call angles2tab(30.*deg2rad,70.*deg2rad,a_n,a_ang,a_tab) +c call angles2tab(80.*deg2rad,130.*deg2rad,b_n,b_ang,b_tab) +c call minmax_angles(0.D0,3.8D0,0.D0,3.8D0,b_n,b_ang,b_tab) +c call construct_tab +c call output_tabs + +c call construct_ranges(phi_n,phi_start,phi_end) +c do i=0,phi_n-1 +c print *,phi_start(i)*rad2deg,phi_end(i)*rad2deg +c enddo + +c call fix_no_moves(phi) +c print *,'NO MOVES FOUND, BEST PHI IS',phi*rad2deg + + R(0,0)=0.D0 + R(1,0)=0.D0 + R(2,0)=0.D0 + R(0,1)=0.D0 + R(1,1)=-cos(28.D0*deg2rad) + R(2,1)=-0.5D0-sin(28.D0*deg2rad) + R(0,2)=0.D0 + R(1,2)=0.D0 + R(2,2)=-0.5D0 + R(0,3)=cos(30.D0*deg2rad) + R(1,3)=0.D0 + R(2,3)=0.D0 + R(0,4)=0.D0 + R(1,4)=0.D0 + R(2,4)=0.5D0 + R(0,5)=0.D0 + R(1,5)=cos(26.D0*deg2rad) + R(2,5)=0.5D0+sin(26.D0*deg2rad) + do i=1,5 + do j=0,2 + R(j,i)=vbl*R(j,i) + enddo + enddo +c i=move_res(R(0,1),0.D0*deg2rad,180.D0*deg2rad) + imov=nnt + i=move_res(0.D0*deg2rad,180.D0*deg2rad,imov) + print *,'RETURNED ',i + print *,(R(i,3)/vbl,i=0,2) + + return + end + +c------------------------------------------------------------- diff --git a/source/unres/src_MD-NEWSC/map.f b/source/unres/src_MD-NEWSC/map.f new file mode 100644 index 0000000..9dbe64e --- /dev/null +++ b/source/unres/src_MD-NEWSC/map.f @@ -0,0 +1,90 @@ + subroutine map + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MAP' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.CONTROL' + include 'COMMON.TORCNSTR' + double precision energia(0:n_ene) + character*5 angid(4) /'PHI','THETA','ALPHA','OMEGA'/ + double precision ang_list(10) + double precision g(maxvar),x(maxvar) + integer nn(10) + write (iout,'(a,i3,a)')'Energy map constructed in the following ', + & nmap,' groups of variables:' + do i=1,nmap + write (iout,'(2a,i3,a,i3)') angid(kang(i)),' of residues ', + & res1(i),' to ',res2(i) + enddo + nmax=nstep(1) + do i=2,nmap + if (nmax.lt.nstep(i)) nmax=nstep(i) + enddo + ntot=nmax**nmap + iii=0 + write (istat,'(1h#,a14,29a15)') (" ",k=1,nmap), + & (ename(print_order(k)),k=1,nprint_ene),"ETOT","GNORM" + do i=0,ntot-1 + ii=i + do j=1,nmap + nn(j)=mod(ii,nmax)+1 + ii=ii/nmax + enddo + do j=1,nmap + if (nn(j).gt.nstep(j)) goto 10 + enddo + iii=iii+1 +Cd write (iout,*) i,iii,(nn(j),j=1,nmap) + do j=1,nmap + ang_list(j)=ang_from(j) + & +(nn(j)-1)*(ang_to(j)-ang_from(j))/nstep(j) + do k=res1(j),res2(j) + goto (1,2,3,4), kang(j) + 1 phi(k)=deg2rad*ang_list(j) + if (minim) phi0(k-res1(j)+1)=deg2rad*ang_list(j) + goto 5 + 2 theta(k)=deg2rad*ang_list(j) + goto 5 + 3 alph(k)=deg2rad*ang_list(j) + goto 5 + 4 omeg(k)=deg2rad*ang_list(j) + 5 continue + enddo ! k + enddo ! j + call chainbuild + call int_from_cart1(.false.) + if (minim) then + call geom_to_var(nvar,x) + call minimize(etot,x,iretcode,nfun) + print *,'SUMSL return code is',iretcode,' eval ',nfun +c call intout + else + call zerograd + call geom_to_var(nvar,x) + endif + call etotal(energia(0)) + etot = energia(0) + nf=1 + nfl=3 + call gradient(nvar,x,nf,g,uiparm,urparm,fdum) + gnorm=0.0d0 + do k=1,nvar + gnorm=gnorm+g(k)**2 + enddo + etot=energia(0) + + gnorm=dsqrt(gnorm) +c write (iout,'(6(1pe15.5))') (ang_list(k),k=1,nmap),etot,gnorm + write (istat,'(30e15.5)') (ang_list(k),k=1,nmap), + & (energia(print_order(ii)),ii=1,nprint_ene),etot,gnorm +c write (iout,*) 'POINT',I,' ANGLES:',(ang_list(k),k=1,nmap) +c call intout +c call enerprint(energia) + 10 continue + enddo ! i + return + end diff --git a/source/unres/src_MD-NEWSC/matmult.f b/source/unres/src_MD-NEWSC/matmult.f new file mode 100644 index 0000000..e9257cf --- /dev/null +++ b/source/unres/src_MD-NEWSC/matmult.f @@ -0,0 +1,18 @@ + SUBROUTINE MATMULT(A1,A2,A3) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + DIMENSION A1(3,3),A2(3,3),A3(3,3) + DIMENSION AI3(3,3) + DO 1 I=1,3 + DO 2 J=1,3 + A3IJ=0.0 + DO 3 K=1,3 + 3 A3IJ=A3IJ+A1(I,K)*A2(K,J) + AI3(I,J)=A3IJ + 2 CONTINUE + 1 CONTINUE + DO 4 I=1,3 + DO 4 J=1,3 + 4 A3(I,J)=AI3(I,J) + RETURN + END diff --git a/source/unres/src_MD-NEWSC/mc.F b/source/unres/src_MD-NEWSC/mc.F new file mode 100644 index 0000000..0f39d48 --- /dev/null +++ b/source/unres/src_MD-NEWSC/mc.F @@ -0,0 +1,819 @@ + subroutine monte_carlo +C Does Boltzmann and entropic sampling without energy minimization + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.THREAD' + include 'COMMON.NAMES' + logical accepted,not_done,over,ovrtim,error,lprint + integer MoveType,nbond,nbins + integer conf_comp + double precision RandOrPert + double precision varia(maxvar),elowest,elowest1, + & ehighest,ehighest1,eold + double precision przes(3),obr(3,3) + double precision varold(maxvar) + logical non_conv + integer moves1(-1:MaxMoveType+1,0:MaxProcs-1), + & moves_acc1(-1:MaxMoveType+1,0:MaxProcs-1) +#ifdef MPL + double precision etot_temp,etot_all(0:MaxProcs) + external d_vadd,d_vmin,d_vmax + double precision entropy1(-max_ene:max_ene), + & nhist1(-max_ene:max_ene) + integer nbond_move1(maxres*(MaxProcs+1)), + & nbond_acc1(maxres*(MaxProcs+1)),itemp(2) +#endif + double precision var_lowest(maxvar) + double precision energia(0:n_ene),energia_ave(0:n_ene) +C + write(iout,'(a,i8,2x,a,f10.5)') + & 'pool_read_freq=',pool_read_freq,' pool_fraction=',pool_fraction + open (istat,file=statname) + WhatsUp=0 + indminn=-max_ene + indmaxx=max_ene + facee=1.0D0/(maxacc*delte) +C Number of bins in energy histogram + nbins=e_up/delte-1 + write (iout,*) 'NBINS=',nbins + conste=dlog(facee) +C Read entropy from previous simulations. + if (ent_read) then + read (ientin,*) indminn,indmaxx,emin,emax + print *,'indminn=',indminn,' indmaxx=',indmaxx,' emin=',emin, + & ' emax=',emax + do i=-max_ene,max_ene + entropy(i)=0.0D0 + enddo + read (ientin,*) (ijunk,ejunk,entropy(i),i=indminn,indmaxx) + indmin=indminn + indmax=indmaxx + write (iout,*) 'indminn=',indminn,' indmaxx=',indmaxx, + & ' emin=',emin,' emax=',emax + write (iout,'(/a)') 'Initial entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + endif ! ent_read +C Read the pool of conformations + call read_pool + elowest=1.0D+10 + ehighest=-1.0D+10 +C---------------------------------------------------------------------------- +C Entropy-sampling simulations with continually updated entropy; +C set NSWEEP=1 for Boltzmann sampling. +C Loop thru simulations +C---------------------------------------------------------------------------- + DO ISWEEP=1,NSWEEP +C +C Initialize the IFINISH array. +C +#ifdef MPL + do i=1,nctasks + ifinish(i)=0 + enddo +#endif +c--------------------------------------------------------------------------- +C Initialize counters. +c--------------------------------------------------------------------------- +C Total number of generated confs. + ngen=0 +C Total number of moves. In general this won't be equal to the number of +C attempted moves, because we may want to reject some "bad" confs just by +C overlap check. + nmove=0 +C Total number of shift (nbond_move(1)), spike, crankshaft, three-bond,... +C motions. + do i=1,nres + nbond_move(i)=0 + nbond_acc(i)=0 + enddo +C Initialize total and accepted number of moves of various kind. + do i=-1,MaxMoveType + moves(i)=0 + moves_acc(i)=0 + enddo +C Total number of energy evaluations. + neneval=0 + nfun=0 +C---------------------------------------------------------------------------- +C Take a conformation from the pool +C---------------------------------------------------------------------------- + rewind(istat) + write (iout,*) 'emin=',emin,' emax=',emax + if (npool.gt.0) then + ii=iran_num(1,npool) + do i=1,nvar + varia(i)=xpool(i,ii) + enddo + write (iout,*) 'Took conformation',ii,' from the pool energy=', + & epool(ii) + call var_to_geom(nvar,varia) +C Print internal coordinates of the initial conformation + call intout + else if (isweep.gt.1) then + if (eold.lt.emax) then + do i=1,nvar + varia(i)=varold(i) + enddo + else + do i=1,nvar + varia(i)=var_lowest(i) + enddo + endif + call var_to_geom(nvar,varia) + endif +C---------------------------------------------------------------------------- +C Compute and print initial energies. +C---------------------------------------------------------------------------- + nsave=0 + Kwita=0 + WhatsUp=0 + write (iout,'(/80(1h*)/a,i2/80(1h*)/)') 'MCE iteration #',isweep + write (iout,'(/80(1h*)/a)') 'Initial energies:' + call chainbuild + call geom_to_var(nvar,varia) + call etotal(energia(0)) + etot = energia(0) + call enerprint(energia(0)) + if (refstr) then + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup,przes, + & obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order',co + write (istat,'(i10,16(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene), + & etot,rms,frac,co + else + write (istat,'(i10,14(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif +c close(istat) + neneval=neneval+1 + if (.not. ent_read) then +C Initialize the entropy array +#ifdef MPL +C Collect total energies from other processors. + etot_temp=etot + etot_all(0)=etot + call mp_gather(etot_temp,etot_all,8,MasterID,cgGroupID) + if (MyID.eq.MasterID) then +C Get the lowest and the highest energy. + print *,'MASTER: etot_temp: ',(etot_all(i),i=0,nprocs-1), + & ' emin=',emin,' emax=',emax + emin=1.0D10 + emax=-1.0D10 + do i=0,nprocs + if (emin.gt.etot_all(i)) emin=etot_all(i) + if (emax.lt.etot_all(i)) emax=etot_all(i) + enddo + emax=emin+e_up + endif ! MyID.eq.MasterID + etot_all(1)=emin + etot_all(2)=emax + print *,'Processor',MyID,' calls MP_BCAST to send/recv etot_all' + call mp_bcast(etot_all(1),16,MasterID,cgGroupID) + print *,'Processor',MyID,' MP_BCAST to send/recv etot_all ended' + if (MyID.ne.MasterID) then + print *,'Processor:',MyID,etot_all(1),etot_all(2), + & etot_all(1),etot_all(2) + emin=etot_all(1) + emax=etot_all(2) + endif ! MyID.ne.MasterID + write (iout,*) 'After MP_GATHER etot_temp=', + & etot_temp,' emin=',emin +#else + emin=etot + emax=emin+e_up + indminn=0 + indmin=0 +#endif + IF (MULTICAN) THEN +C Multicanonical sampling - start from Boltzmann distribution + do i=-max_ene,max_ene + entropy(i)=(emin+i*delte)*betbol + enddo + ELSE +C Entropic sampling - start from uniform distribution of the density of states + do i=-max_ene,max_ene + entropy(i)=0.0D0 + enddo + ENDIF ! MULTICAN + write (iout,'(/a)') 'Initial entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + if (isweep.eq.1) then + emax=emin+e_up + indminn=0 + indmin=0 + indmaxx=indminn+nbins + indmax=indmaxx + endif ! isweep.eq.1 + endif ! .not. ent_read +#ifdef MPL + call recv_stop_sig(Kwita) + if (whatsup.eq.1) then + call send_stop_sig(-2) + not_done=.false. + else if (whatsup.le.-2) then + not_done=.false. + else if (whatsup.eq.2) then + not_done=.false. + else + not_done=.true. + endif +#else + not_done=.true. +#endif + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Enter Monte Carlo procedure.' + close(igeom) + call briefout(0,etot) + do i=1,nvar + varold(i)=varia(i) + enddo + eold=etot + call entropia(eold,sold,indeold) +C NACC is the counter for the accepted conformations of a given processor + nacc=0 +C NACC_TOT counts the total number of accepted conformations + nacc_tot=0 +C Main loop. +c---------------------------------------------------------------------------- +C Zero out average energies + do i=0,n_ene + energia_ave(i)=0.0d0 + enddo +C Initialize energy histogram + do i=-max_ene,max_ene + nhist(i)=0.0D0 + enddo ! i +C Zero out iteration counter. + it=0 + do j=1,nvar + varold(j)=varia(j) + enddo +C Begin MC iteration loop. + do while (not_done) + it=it+1 +C Initialize local counter. + ntrial=0 ! # of generated non-overlapping confs. + noverlap=0 ! # of overlapping confs. + accepted=.false. + do while (.not. accepted .and. WhatsUp.eq.0 .and. Kwita.eq.0) + ntrial=ntrial+1 +C Retrieve the angles of previously accepted conformation + do j=1,nvar + varia(j)=varold(j) + enddo + call var_to_geom(nvar,varia) +C Rebuild the chain. + call chainbuild + MoveType=0 + nbond=0 + lprint=.true. +C Decide whether to take a conformation from the pool or generate/perturb one +C randomly + from_pool=ran_number(0.0D0,1.0D0) + if (npool.gt.0 .and. from_pool.lt.pool_fraction) then +C Throw a dice to choose the conformation from the pool + ii=iran_num(1,npool) + do i=1,nvar + varia(i)=xpool(i,ii) + enddo + call var_to_geom(nvar,varia) + call chainbuild +cd call intout +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a,i3,a,f10.5)') + & 'Try conformation',ii,' from the pool energy=',epool(ii) + MoveType=-1 + moves(-1)=moves(-1)+1 + else +C Decide whether to generate a random conformation or perturb the old one + RandOrPert=ran_number(0.0D0,1.0D0) + if (RandOrPert.gt.RanFract) then + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a)') 'Perturbation-generated conformation.' + call perturb(error,lprint,MoveType,nbond,0.1D0) + if (error) goto 20 + if (MoveType.lt.1 .or. MoveType.gt.MaxMoveType) then + write (iout,'(/a,i7,a/)') 'Error - unknown MoveType=', + & MoveType,' returned from PERTURB.' + goto 20 + endif + call chainbuild + else + MoveType=0 + moves(0)=moves(0)+1 + nstart_grow=iran_num(3,nres) + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(2a,i3)') 'Random-generated conformation', + & ' - chain regrown from residue',nstart_grow + call gen_rand_conf(nstart_grow,*30) + endif + call geom_to_var(nvar,varia) + endif ! pool +Cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + ngen=ngen+1 + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a,i5,a,i10,a,i10)') + & 'Processor',MyId,' trial move',ntrial,' total generated:',ngen + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (*,'(a,i5,a,i10,a,i10)') + & 'Processor',MyId,' trial move',ntrial,' total generated:',ngen + call etotal(energia(0)) + etot = energia(0) + neneval=neneval+1 +cd call enerprint(energia(0)) +cd write(iout,*)'it=',it,' etot=',etot + if (etot-elowest.gt.overlap_cut) then + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a,i5,a,1pe14.5)') 'Iteration',it, + & ' Overlap detected in the current conf.; energy is',etot + accepted=.false. + noverlap=noverlap+1 + if (noverlap.gt.maxoverlap) then + write (iout,'(a)') 'Too many overlapping confs.' + goto 20 + endif + else +C-------------------------------------------------------------------------- +C... Acceptance test +C-------------------------------------------------------------------------- + accepted=.false. + if (WhatsUp.eq.0) + & call accept_mc(it,etot,eold,scur,sold,varia,varold,accepted) + if (accepted) then + nacc=nacc+1 + nacc_tot=nacc_tot+1 + if (elowest.gt.etot) then + elowest=etot + do i=1,nvar + var_lowest(i)=varia(i) + enddo + endif + if (ehighest.lt.etot) ehighest=etot + moves_acc(MoveType)=moves_acc(MoveType)+1 + if (MoveType.eq.1) then + nbond_acc(nbond)=nbond_acc(nbond)+1 + endif +C Compare with reference structure. + if (refstr) then + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup), + & nsup,przes,obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + endif ! refstr +C +C Periodically save average energies and confs. +C + do i=0,n_ene + energia_ave(i)=energia_ave(i)+energia(i) + enddo + moves(MaxMoveType+1)=nmove + moves_acc(MaxMoveType+1)=nacc + IF ((it/save_frequency)*save_frequency.eq.it) THEN + do i=0,n_ene + energia_ave(i)=energia_ave(i)/save_frequency + enddo + etot_ave=energia_ave(0) +C#ifdef AIX +C open (istat,file=statname,position='append') +C#else +C open (istat,file=statname,access='append') +Cendif + if (print_mc.gt.0) + & write (iout,'(80(1h*)/20x,a,i20)') + & 'Iteration #',it + if (refstr .and. print_mc.gt.0) then + write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order:',co + endif + if (print_stat) then + if (refstr) then + write (istat,'(i10,10(1pe14.5))') it, + & (energia_ave(print_order(i)),i=1,nprint_ene), + & etot_ave,rms_ave,frac_ave + else + write (istat,'(i10,10(1pe14.5))') it, + & (energia_ave(print_order(i)),i=1,nprint_ene), + & etot_ave + endif + endif +c close(istat) + if (print_mc.gt.0) + & call statprint(nacc,nfun,iretcode,etot,elowest) +C Print internal coordinates. + if (print_int) call briefout(nacc,etot) + do i=0,n_ene + energia_ave(i)=0.0d0 + enddo + ENDIF ! ( (it/save_frequency)*save_frequency.eq.it) +C Update histogram + inde=icialosc((etot-emin)/delte) + nhist(inde)=nhist(inde)+1.0D0 +#ifdef MPL + if ( (it/message_frequency)*message_frequency.eq.it + & .and. (MyID.ne.MasterID) ) then + call recv_stop_sig(Kwita) + call send_MCM_info(message_frequency) + endif +#endif +C Store the accepted conf. and its energy. + eold=etot + sold=scur + do i=1,nvar + varold(i)=varia(i) + enddo +#ifdef MPL + if (Kwita.eq.0) call recv_stop_sig(kwita) +#endif + endif ! accepted + endif ! overlap +#ifdef MPL + if (MyID.eq.MasterID .and. + & (it/message_frequency)*message_frequency.eq.it) then + call receive_MC_info + if (nacc_tot.ge.maxacc) accepted=.true. + endif +#endif +C if ((ntrial.gt.maxtrial_iter +C & .or. (it/pool_read_freq)*pool_read_freq.eq.it) +C & .and. npool.gt.0) then +C Take a conformation from the pool +C ii=iran_num(1,npool) +C do i=1,nvar +C varold(i)=xpool(i,ii) +C enddo +C if (ntrial.gt.maxtrial_iter) +C & write (iout,*) 'Iteration',it,' max. # of trials exceeded.' +C write (iout,*) +C & 'Take conformation',ii,' from the pool energy=',epool(ii) +C if (print_mc.gt.2) +C & write (iout,'(10f8.3)') (rad2deg*varold(i),i=1,nvar) +C ntrial=0 +C eold=epool(ii) +C call entropia(eold,sold,indeold) +C accepted=.true. +C endif ! (ntrial.gt.maxtrial_iter .and. npool.gt.0) + 30 continue + enddo ! accepted +#ifdef MPL + if (MyID.eq.MasterID .and. + & (it/message_frequency)*message_frequency.eq.it) then + call receive_MC_info + endif + if (Kwita.eq.0) call recv_stop_sig(kwita) +#endif + if (ovrtim()) WhatsUp=-1 +cd write (iout,*) 'WhatsUp=',WhatsUp,' Kwita=',Kwita + not_done = (nacc_tot.lt.maxacc) .and. (WhatsUp.eq.0) + & .and. (Kwita.eq.0) +cd write (iout,*) 'not_done=',not_done +#ifdef MPL + if (Kwita.lt.0) then + print *,'Processor',MyID, + & ' has received STOP signal =',Kwita,' in EntSamp.' +cd print *,'not_done=',not_done + if (Kwita.lt.-1) WhatsUp=Kwita + if (MyID.ne.MasterID) call send_MCM_info(-1) + else if (nacc_tot.ge.maxacc) then + print *,'Processor',MyID,' calls send_stop_sig,', + & ' because a sufficient # of confs. have been collected.' +cd print *,'not_done=',not_done + call send_stop_sig(-1) + if (MyID.ne.MasterID) call send_MCM_info(-1) + else if (WhatsUp.eq.-1) then + print *,'Processor',MyID, + & ' calls send_stop_sig because of timeout.' +cd print *,'not_done=',not_done + call send_stop_sig(-2) + if (MyID.ne.MasterID) call send_MCM_info(-1) + endif +#endif + enddo ! not_done + +C----------------------------------------------------------------- +C... Construct energy histogram & update entropy +C----------------------------------------------------------------- + go to 21 + 20 WhatsUp=-3 +#ifdef MPL + write (iout,*) 'Processor',MyID, + & ' is broadcasting ERROR-STOP signal.' + write (*,*) 'Processor',MyID, + & ' is broadcasting ERROR-STOP signal.' + call send_stop_sig(-3) + if (MyID.ne.MasterID) call send_MCM_info(-1) +#endif + 21 continue + write (iout,'(/a)') 'Energy histogram' + do i=-100,100 + write (iout,'(i5,2f20.5)') i,emin+i*delte,nhist(i) + enddo +#ifdef MPL +C Wait until every processor has sent complete MC info. + if (MyID.eq.MasterID) then + not_done=.true. + do while (not_done) +C write (*,*) 'The IFINISH array:' +C write (*,*) (ifinish(i),i=1,nctasks) + not_done=.false. + do i=2,nctasks + not_done=not_done.or.(ifinish(i).ge.0) + enddo + if (not_done) call receive_MC_info + enddo + endif +C Make collective histogram from the work of all processors. + msglen=(2*max_ene+1)*8 + print *, + & 'Processor',MyID,' calls MP_REDUCE to send/receive histograms', + & ' msglen=',msglen + call mp_reduce(nhist,nhist1,msglen,MasterID,d_vadd, + & cgGroupID) + print *,'Processor',MyID,' MP_REDUCE accomplished for histogr.' + do i=-max_ene,max_ene + nhist(i)=nhist1(i) + enddo +C Collect min. and max. energy + print *, + &'Processor',MyID,' calls MP_REDUCE to send/receive energy borders' + call mp_reduce(elowest,elowest1,8,MasterID,d_vmin,cgGroupID) + call mp_reduce(ehighest,ehighest1,8,MasterID,d_vmax,cgGroupID) + print *,'Processor',MyID,' MP_REDUCE accomplished for energies.' + IF (MyID.eq.MasterID) THEN + elowest=elowest1 + ehighest=ehighest1 +#endif + write (iout,'(a,i10)') '# of accepted confs:',nacc_tot + write (iout,'(a,f10.5,a,f10.5)') 'Lowest energy:',elowest, + & ' Highest energy',ehighest + indmin=icialosc((elowest-emin)/delte) + imdmax=icialosc((ehighest-emin)/delte) + if (indmin.lt.indminn) then + emax=emin+indmin*delte+e_up + indmaxx=indmin+nbins + indminn=indmin + endif + if (.not.ent_read) ent_read=.true. + write(iout,*)'indminn=',indminn,' indmaxx=',indmaxx +C Update entropy (density of states) + do i=indmin,indmax + if (nhist(i).gt.0) then + entropy(i)=entropy(i)+dlog(nhist(i)+0.0D0) + endif + enddo + write (iout,'(/80(1h*)/a,i2/80(1h*)/)') + & 'End of macroiteration',isweep + write (iout,'(a,f10.5,a,f10.5)') 'Elowest=',elowest, + & ' Ehighest=',ehighest + write (iout,'(/a)') 'Energy histogram' + do i=indminn,indmaxx + write (iout,'(i5,2f20.5)') i,emin+i*delte,nhist(i) + enddo + write (iout,'(/a)') 'Entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f20.5)') i,emin+i*delte,entropy(i) + enddo +C----------------------------------------------------------------- +C... End of energy histogram construction +C----------------------------------------------------------------- +#ifdef MPL + ELSE + if (.not. ent_read) ent_read=.true. + ENDIF ! MyID .eq. MaterID + if (MyID.eq.MasterID) then + itemp(1)=indminn + itemp(2)=indmaxx + endif + print *,'before mp_bcast processor',MyID,' indminn=',indminn, + & ' indmaxx=',indmaxx,' itemp=',itemp(1),itemp(2) + call mp_bcast(itemp(1),8,MasterID,cgGroupID) + call mp_bcast(emax,8,MasterID,cgGroupID) + print *,'after mp_bcast processor',MyID,' indminn=',indminn, + & ' indmaxx=',indmaxx,' itemp=',itemp(1),itemp(2) + if (MyID .ne. MasterID) then + indminn=itemp(1) + indmaxx=itemp(2) + endif + msglen=(indmaxx-indminn+1)*8 + print *,'processor',MyID,' calling mp_bcast msglen=',msglen, + & ' indminn=',indminn,' indmaxx=',indmaxx,' isweep=',isweep + call mp_bcast(entropy(indminn),msglen,MasterID,cgGroupID) + IF(MyID.eq.MasterID .and. .not. ovrtim() .and. WhatsUp.ge.0)THEN + open (ientout,file=entname,status='unknown') + write (ientout,'(2i5,2e25.17)') indminn,indmaxx,emin,emax + do i=indminn,indmaxx + write (ientout,'(i5,f10.5,f20.15)') i,emin+i*delte,entropy(i) + enddo + close(ientout) + ELSE + write (iout,*) 'Received from master:' + write (iout,*) 'indminn=',indminn,' indmaxx=',indmaxx, + & ' emin=',emin,' emax=',emax + write (iout,'(/a)') 'Entropy' + do i=indminn,indmaxx + write (iout,'(i5,2f10.5)') i,emin+i*delte,entropy(i) + enddo + ENDIF ! MyID.eq.MasterID + print *,'Processor',MyID,' calls MP_GATHER' + call mp_gather(nbond_move,nbond_move1,4*Nbm,MasterID, + & cgGroupID) + call mp_gather(nbond_acc,nbond_acc1,4*Nbm,MasterID, + & cgGroupID) + print *,'Processor',MyID,' MP_GATHER call accomplished' + if (MyID.eq.MasterID) then + + write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:' + call statprint(nacc_tot,nfun,iretcode,etot,elowest) + write (iout,'(a)') + & 'Statistics of multiple-bond motions. Total motions:' + write (iout,'(8i10)') (nbond_move(i),i=1,Nbm) + write (iout,'(a)') 'Accepted motions:' + write (iout,'(8i10)') (nbond_acc(i),i=1,Nbm) + + write (iout,'(a)') + & 'Statistics of multi-bond moves of respective processors:' + do iproc=1,Nprocs-1 + do i=1,Nbm + ind=iproc*nbm+i + nbond_move(i)=nbond_move(i)+nbond_move1(ind) + nbond_acc(i)=nbond_acc(i)+nbond_acc1(ind) + enddo + enddo + do iproc=0,NProcs-1 + write (iout,*) 'Processor',iproc,' nbond_move:', + & (nbond_move1(iproc*nbm+i),i=1,Nbm), + & ' nbond_acc:',(nbond_acc1(iproc*nbm+i),i=1,Nbm) + enddo + endif + call mp_gather(moves,moves1,4*(MaxMoveType+3),MasterID, + & cgGroupID) + call mp_gather(moves_acc,moves_acc1,4*(MaxMoveType+3), + & MasterID,cgGroupID) + if (MyID.eq.MasterID) then + do iproc=1,Nprocs-1 + do i=-1,MaxMoveType+1 + moves(i)=moves(i)+moves1(i,iproc) + moves_acc(i)=moves_acc(i)+moves_acc1(i,iproc) + enddo + enddo + nmove=0 + do i=0,MaxMoveType+1 + nmove=nmove+moves(i) + enddo + do iproc=0,NProcs-1 + write (iout,*) 'Processor',iproc,' moves', + & (moves1(i,iproc),i=0,MaxMoveType+1), + & ' moves_acc:',(moves_acc1(i,iproc),i=0,MaxMoveType+1) + enddo + endif +#else + open (ientout,file=entname,status='unknown') + write (ientout,'(2i5,2e25.17)') indminn,indmaxx,emin,emax + do i=indminn,indmaxx + write (ientout,'(i5,f10.5,f20.15)') i,emin+i*delte,entropy(i) + enddo + close(ientout) +#endif + write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:' + call statprint(nacc_tot,nfun,iretcode,etot,elowest) + write (iout,'(a)') + & 'Statistics of multiple-bond motions. Total motions:' + write (iout,'(8i10)') (nbond_move(i),i=1,Nbm) + write (iout,'(a)') 'Accepted motions:' + write (iout,'(8i10)') (nbond_acc(i),i=1,Nbm) + if (ovrtim() .or. WhatsUp.lt.0) return + +C--------------------------------------------------------------------------- + ENDDO ! ISWEEP +C--------------------------------------------------------------------------- + + runtime=tcpu() + + if (isweep.eq.nsweep .and. it.ge.maxacc) + &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.' + return + end +c------------------------------------------------------------------------------ + subroutine accept_mc(it,ecur,eold,scur,sold,x,xold,accepted) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' +#ifdef MPL + include 'COMMON.INFO' +#endif + include 'COMMON.GEO' + double precision ecur,eold,xx,ran_number,bol + double precision x(maxvar),xold(maxvar) + logical accepted +C Check if the conformation is similar. +cd write (iout,*) 'Enter ACCEPTING' +cd write (iout,*) 'Old PHI angles:' +cd write (iout,*) (rad2deg*xold(i),i=1,nphi) +cd write (iout,*) 'Current angles' +cd write (iout,*) (rad2deg*x(i),i=1,nphi) +cd ddif=dif_ang(nphi,x,xold) +cd write (iout,*) 'Angle norm:',ddif +cd write (iout,*) 'ecur=',ecur,' emax=',emax + if (ecur.gt.emax) then + accepted=.false. + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a)') 'Conformation rejected as too high in energy' + return + endif +C Else evaluate the entropy of the conf and compare it with that of the previous +C one. + call entropia(ecur,scur,indecur) +cd print *,'Processor',MyID,' ecur=',ecur,' indecur=',indecur, +cd & ' scur=',scur,' eold=',eold,' sold=',sold +cd print *,'deix=',deix,' dent=',dent,' delte=',delte + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) then + write(iout,*)'it=',it,'ecur=',ecur,' indecur=',indecur, + & ' scur=',scur + write(iout,*)'eold=',eold,' sold=',sold + endif + if (scur.le.sold) then + accepted=.true. + else +C Else carry out acceptance test + xx=ran_number(0.0D0,1.0D0) + xxh=scur-sold + if (xxh.gt.50.0D0) then + bol=0.0D0 + else + bol=exp(-xxh) + endif + if (bol.gt.xx) then + accepted=.true. + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a)') 'Conformation accepted.' + else + accepted=.false. + if (print_mc.gt.0 .and. (it/print_freq)*print_freq.eq.it) + & write (iout,'(a)') 'Conformation rejected.' + endif + endif + return + end +c-------------------------------------------------------------------------- + integer function icialosc(x) + double precision x + if (x.lt.0.0D0) then + icialosc=dint(x)-1 + else + icialosc=dint(x) + endif + return + end +c-------------------------------------------------------------------------- + subroutine entropia(ecur,scur,indecur) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.IOUNITS' + double precision ecur,scur + integer indecur + indecur=icialosc((ecur-emin)/delte) + if (iabs(indecur).gt.max_ene) then + if ((it/print_freq)*it.eq.it) write (iout,'(a,2i5)') + & 'Accepting: Index out of range:',indecur + scur=1000.0D0 + else if (indecur.ge.indmaxx) then + scur=entropy(indecur) + if (print_mc.gt.0 .and. (it/print_freq)*it.eq.it) + & write (iout,*)'Energy boundary reached', + & indmaxx,indecur,entropy(indecur) + else + deix=ecur-(emin+indecur*delte) + dent=entropy(indecur+1)-entropy(indecur) + scur=entropy(indecur)+(dent/delte)*deix + endif + return + end diff --git a/source/unres/src_MD-NEWSC/mcm.F b/source/unres/src_MD-NEWSC/mcm.F new file mode 100644 index 0000000..d9ca9ad --- /dev/null +++ b/source/unres/src_MD-NEWSC/mcm.F @@ -0,0 +1,1481 @@ + subroutine mcm_setup + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.MCM' + include 'COMMON.CONTROL' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.VAR' +C +C Set up variables used in MC/MCM. +C + write (iout,'(80(1h*)/20x,a/80(1h*))') 'MCM control parameters:' + write (iout,'(5(a,i7))') 'Maxacc:',maxacc,' MaxTrial:',MaxTrial, + & ' MaxRepm:',MaxRepm,' MaxGen:',MaxGen,' MaxOverlap:',MaxOverlap + write (iout,'(4(a,f8.1)/2(a,i3))') + & 'Tmin:',Tmin,' Tmax:',Tmax,' TstepH:',TstepH, + & ' TstepC:',TstepC,'NstepH:',NstepH,' NstepC:',NstepC + if (nwindow.gt.0) then + write (iout,'(a)') 'Perturbation windows:' + do i=1,nwindow + i1=winstart(i) + i2=winend(i) + it1=itype(i1) + it2=itype(i2) + write (iout,'(a,i3,a,i3,a,i3)') restyp(it1),i1,restyp(it2),i2, + & ' length',winlen(i) + enddo + endif +C Rbolt=8.3143D-3*2.388459D-01 kcal/(mol*K) + RBol=1.9858D-3 +C Number of "end bonds". + koniecl=0 +c koniecl=nphi + print *,'koniecl=',koniecl + write (iout,'(a)') 'Probabilities of move types:' + write (*,'(a)') 'Probabilities of move types:' + do i=1,MaxMoveType + write (iout,'(a,f10.5)') MovTypID(i), + & sumpro_type(i)-sumpro_type(i-1) + write (*,'(a,f10.5)') MovTypID(i), + & sumpro_type(i)-sumpro_type(i-1) + enddo + write (iout,*) +C Maximum length of N-bond segment to be moved +c nbm=nres-1-(2*koniecl-1) + if (nwindow.gt.0) then + maxwinlen=winlen(1) + do i=2,nwindow + if (winlen(i).gt.maxwinlen) maxwinlen=winlen(i) + enddo + nbm=min0(maxwinlen,6) + write (iout,'(a,i3,a,i3)') 'Nbm=',Nbm,' Maxwinlen=',Maxwinlen + else + nbm=min0(6,nres-2) + endif + sumpro_bond(0)=0.0D0 + sumpro_bond(1)=0.0D0 + do i=2,nbm + sumpro_bond(i)=sumpro_bond(i-1)+1.0D0/dfloat(i) + enddo + write (iout,'(a)') 'The SumPro_Bond array:' + write (iout,'(8f10.5)') (sumpro_bond(i),i=1,nbm) + write (*,'(a)') 'The SumPro_Bond array:' + write (*,'(8f10.5)') (sumpro_bond(i),i=1,nbm) +C Maximum number of side chains moved simultaneously +c print *,'nnt=',nnt,' nct=',nct + ngly=0 + do i=nnt,nct + if (itype(i).eq.10) ngly=ngly+1 + enddo + mmm=nct-nnt-ngly+1 + if (mmm.gt.0) then + MaxSideMove=min0((nct-nnt+1)/2,mmm) + endif +c print *,'MaxSideMove=',MaxSideMove +C Max. number of generated confs (not used at present). + maxgen=10000 +C Set initial temperature + Tcur=Tmin + betbol=1.0D0/(Rbol*Tcur) + write (iout,'(a,f8.1,a,f10.5)') 'Initial temperature:',Tcur, + & ' BetBol:',betbol + write (iout,*) 'RanFract=',ranfract + return + end +c------------------------------------------------------------------------------ +#ifndef MPI + subroutine do_mcm(i_orig) +C Monte-Carlo-with-Minimization calculations - serial code. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.MCM' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.CACHE' +crc include 'COMMON.DEFORM' +crc include 'COMMON.DEFORM1' + include 'COMMON.NAMES' + logical accepted,over,ovrtim,error,lprint,not_done,my_conf, + & enelower,non_conv + integer MoveType,nbond,conf_comp + integer ifeed(max_cache) + double precision varia(maxvar),varold(maxvar),elowest,eold, + & przes(3),obr(3,3) + double precision energia(0:n_ene) + double precision coord1(maxres,3) + +C--------------------------------------------------------------------------- +C Initialize counters. +C--------------------------------------------------------------------------- +C Total number of generated confs. + ngen=0 +C Total number of moves. In general this won't be equal to the number of +C attempted moves, because we may want to reject some "bad" confs just by +C overlap check. + nmove=0 +C Total number of temperature jumps. + ntherm=0 +C Total number of shift (nbond_move(1)), spike, crankshaft, three-bond,... +C motions. + ncache=0 + do i=1,nres + nbond_move(i)=0 + enddo +C Initialize total and accepted number of moves of various kind. + do i=0,MaxMoveType + moves(i)=0 + moves_acc(i)=0 + enddo +C Total number of energy evaluations. + neneval=0 + nfun=0 + nsave=0 + + write (iout,*) 'RanFract=',RanFract + + WhatsUp=0 + Kwita=0 + +c---------------------------------------------------------------------------- +C Compute and print initial energies. +c---------------------------------------------------------------------------- + call intout + write (iout,'(/80(1h*)/a)') 'Initial energies:' + call chainbuild + nf=0 + + call etotal(energia(0)) + etot = energia(0) +C Minimize the energy of the first conformation. + if (minim) then + call geom_to_var(nvar,varia) +! write (iout,*) 'The VARIA array' +! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar) + call minimize(etot,varia,iretcode,nfun) + call var_to_geom(nvar,varia) + call chainbuild + write (iout,*) 'etot from MINIMIZE:',etot +! write (iout,*) 'Tha VARIA array' +! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar) + + call etotal(energia(0)) + etot=energia(0) + call enerprint(energia(0)) + endif + if (refstr) then + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup,przes, + & obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order:',co + if (print_stat) + & write (istat,'(i5,17(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene), + & etot,rms,frac,co + else + if (print_stat) write (istat,'(i5,16(1pe14.5))') 0, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif + if (print_stat) close(istat) + neneval=neneval+nfun+1 + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Enter Monte Carlo procedure.' + if (print_int) then + close(igeom) + call briefout(0,etot) + endif + eold=etot + do i=1,nvar + varold(i)=varia(i) + enddo + elowest=etot + call zapis(varia,etot) + nacc=0 ! total # of accepted confs of the current processor. + nacc_tot=0 ! total # of accepted confs of all processors. + + not_done = (iretcode.ne.11) + +C---------------------------------------------------------------------------- +C Main loop. +c---------------------------------------------------------------------------- + it=0 + nout=0 + do while (not_done) + it=it+1 + write (iout,'(80(1h*)/20x,a,i7)') + & 'Beginning iteration #',it +C Initialize local counter. + ntrial=0 ! # of generated non-overlapping confs. + accepted=.false. + do while (.not. accepted) + +C Retrieve the angles of previously accepted conformation + noverlap=0 ! # of overlapping confs. + do j=1,nvar + varia(j)=varold(j) + enddo + call var_to_geom(nvar,varia) +C Rebuild the chain. + call chainbuild +C Heat up the system, if necessary. + call heat(over) +C If temperature cannot be further increased, stop. + if (over) goto 20 + MoveType=0 + nbond=0 + lprint=.true. +cd write (iout,'(a)') 'Old variables:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) +C Decide whether to generate a random conformation or perturb the old one + RandOrPert=ran_number(0.0D0,1.0D0) + if (RandOrPert.gt.RanFract) then + if (print_mc.gt.0) + & write (iout,'(a)') 'Perturbation-generated conformation.' + call perturb(error,lprint,MoveType,nbond,1.0D0) + if (error) goto 20 + if (MoveType.lt.1 .or. MoveType.gt.MaxMoveType) then + write (iout,'(/a,i7,a/)') 'Error - unknown MoveType=', + & MoveType,' returned from PERTURB.' + goto 20 + endif + call chainbuild + else + MoveType=0 + moves(0)=moves(0)+1 + nstart_grow=iran_num(3,nres) + if (print_mc.gt.0) + & write (iout,'(2a,i3)') 'Random-generated conformation', + & ' - chain regrown from residue',nstart_grow + call gen_rand_conf(nstart_grow,*30) + endif + call geom_to_var(nvar,varia) +cd write (iout,'(a)') 'New variables:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + ngen=ngen+1 + + call etotal(energia(0)) + etot=energia(0) +c call enerprint(energia(0)) +c write (iout,'(2(a,1pe14.5))') 'Etot=',Etot,' Elowest=',Elowest + if (etot-elowest.gt.overlap_cut) then + if(iprint.gt.1.or.etot.lt.1d20) + & write (iout,'(a,1pe14.5)') + & 'Overlap detected in the current conf.; energy is',etot + neneval=neneval+1 + accepted=.false. + noverlap=noverlap+1 + if (noverlap.gt.maxoverlap) then + write (iout,'(a)') 'Too many overlapping confs.' + goto 20 + endif + else + if (minim) then + call minimize(etot,varia,iretcode,nfun) +cd write (iout,*) 'etot from MINIMIZE:',etot +cd write (iout,'(a)') 'Variables after minimization:' +cd write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) + + call etotal(energia(0)) + etot = energia(0) + neneval=neneval+nfun+2 + endif +c call enerprint(energia(0)) + write (iout,'(a,i6,a,1pe16.6)') 'Conformation:',ngen, + & ' energy:',etot +C-------------------------------------------------------------------------- +C... Do Metropolis test +C-------------------------------------------------------------------------- + accepted=.false. + my_conf=.false. + + if (WhatsUp.eq.0 .and. Kwita.eq.0) then + call metropolis(nvar,varia,varold,etot,eold,accepted, + & my_conf,EneLower) + endif + write (iout,*) 'My_Conf=',My_Conf,' EneLower=',EneLower + if (accepted) then + + nacc=nacc+1 + nacc_tot=nacc_tot+1 + if (elowest.gt.etot) elowest=etot + moves_acc(MoveType)=moves_acc(MoveType)+1 + if (MoveType.eq.1) then + nbond_acc(nbond)=nbond_acc(nbond)+1 + endif +C Check against conformation repetitions. + irepet=conf_comp(varia,etot) + if (print_stat) then +#if defined(AIX) || defined(PGI) + open (istat,file=statname,position='append') +#else + open (istat,file=statname,access='append') +#endif + endif + call statprint(nacc,nfun,iretcode,etot,elowest) + if (refstr) then + call var_to_geom(nvar,varia) + call chainbuild + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup), + & nsup,przes,obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + write (iout,'(a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order',co + endif ! refstr + if (My_Conf) then + nout=nout+1 + write (iout,*) 'Writing new conformation',nout + if (refstr) then + write (istat,'(i5,16(1pe14.5))') nout, + & (energia(print_order(i)),i=1,nprint_ene), + & etot,rms,frac + else + if (print_stat) + & write (istat,'(i5,17(1pe14.5))') nout, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif ! refstr + if (print_stat) close(istat) +C Print internal coordinates. + if (print_int) call briefout(nout,etot) +C Accumulate the newly accepted conf in the coord1 array, if it is different +C from all confs that are already there. + call compare_s1(n_thr,max_thread2,etot,varia,ii, + & enetb1,coord1,rms_deform,.true.,iprint) + write (iout,*) 'After compare_ss: n_thr=',n_thr + if (ii.eq.1 .or. ii.eq.3) then + write (iout,'(8f10.4)') + & (rad2deg*coord1(i,n_thr),i=1,nvar) + endif + else + write (iout,*) 'Conformation from cache, not written.' + endif ! My_Conf + + if (nrepm.gt.maxrepm) then + write (iout,'(a)') 'Too many conformation repetitions.' + goto 20 + endif +C Store the accepted conf. and its energy. + eold=etot + do i=1,nvar + varold(i)=varia(i) + enddo + if (irepet.eq.0) call zapis(varia,etot) +C Lower the temperature, if necessary. + call cool + + else + + ntrial=ntrial+1 + endif ! accepted + endif ! overlap + + 30 continue + enddo ! accepted +C Check for time limit. + if (ovrtim()) WhatsUp=-1 + not_done = (nacc_tot.lt.maxacc) .and. (WhatsUp.eq.0) + & .and. (Kwita.eq.0) + + enddo ! not_done + goto 21 + 20 WhatsUp=-3 + + 21 continue + runtime=tcpu() + write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:' + call statprint(nacc,nfun,iretcode,etot,elowest) + write (iout,'(a)') + & 'Statistics of multiple-bond motions. Total motions:' + write (iout,'(16i5)') (nbond_move(i),i=1,Nbm) + write (iout,'(a)') 'Accepted motions:' + write (iout,'(16i5)') (nbond_acc(i),i=1,Nbm) + if (it.ge.maxacc) + &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.' + + return + end +#endif +#ifdef MPI +c------------------------------------------------------------------------------ + subroutine do_mcm(i_orig) +C Monte-Carlo-with-Minimization calculations - parallel code. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.MCM' + include 'COMMON.CONTACTS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.INFO' + include 'COMMON.CACHE' +crc include 'COMMON.DEFORM' +crc include 'COMMON.DEFORM1' +crc include 'COMMON.DEFORM2' + include 'COMMON.MINIM' + include 'COMMON.NAMES' + logical accepted,over,ovrtim,error,lprint,not_done,similar, + & enelower,non_conv,flag,finish + integer MoveType,nbond,conf_comp + double precision varia(maxvar),varold(maxvar),elowest,eold, + & x1(maxvar), varold1(maxvar), przes(3),obr(3,3) + integer iparentx(max_threadss2) + integer iparentx1(max_threadss2) + integer imtasks(150),imtasks_n + double precision energia(0:n_ene) + + print *,'Master entered DO_MCM' + nodenum = nprocs + + finish=.false. + imtasks_n=0 + do i=1,nodenum-1 + imtasks(i)=0 + enddo +C--------------------------------------------------------------------------- +C Initialize counters. +C--------------------------------------------------------------------------- +C Total number of generated confs. + ngen=0 +C Total number of moves. In general this won`t be equal to the number of +C attempted moves, because we may want to reject some "bad" confs just by +C overlap check. + nmove=0 +C Total number of temperature jumps. + ntherm=0 +C Total number of shift (nbond_move(1)), spike, crankshaft, three-bond,... +C motions. + ncache=0 + do i=1,nres + nbond_move(i)=0 + enddo +C Initialize total and accepted number of moves of various kind. + do i=0,MaxMoveType + moves(i)=0 + moves_acc(i)=0 + enddo +C Total number of energy evaluations. + neneval=0 + nfun=0 + nsave=0 +c write (iout,*) 'RanFract=',RanFract + WhatsUp=0 + Kwita=0 +c---------------------------------------------------------------------------- +C Compute and print initial energies. +c---------------------------------------------------------------------------- + call intout + write (iout,'(/80(1h*)/a)') 'Initial energies:' + call chainbuild + nf=0 + call etotal(energia(0)) + etot = energia(0) + call enerprint(energia(0)) +C Request energy computation from slave processors. + call geom_to_var(nvar,varia) +! write (iout,*) 'The VARIA array' +! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar) + call minimize(etot,varia,iretcode,nfun) + call var_to_geom(nvar,varia) + call chainbuild + write (iout,*) 'etot from MINIMIZE:',etot +! write (iout,*) 'Tha VARIA array' +! write (iout,'(8f10.4)') (rad2deg*varia(i),i=1,nvar) + neneval=0 + eneglobal=1.0d99 + if (print_mc .gt. 0) write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Enter Monte Carlo procedure.' + if (print_mc .gt. 0) write (iout,'(i5,1pe14.5)' ) i_orig,etot + eold=etot + do i=1,nvar + varold(i)=varia(i) + enddo + elowest=etot + call zapis(varia,etot) +c diagnostics + call var_to_geom(nvar,varia) + call chainbuild + call etotal(energia(0)) + if (print_mc.gt.0) write (iout,*) 'Initial energy:',etot +c end diagnostics + nacc=0 ! total # of accepted confs of the current processor. + nacc_tot=0 ! total # of accepted confs of all processors. + not_done=.true. +C---------------------------------------------------------------------------- +C Main loop. +c---------------------------------------------------------------------------- + it=0 + nout=0 + LOOP1:do while (not_done) + it=it+1 + if (print_mc.gt.0) write (iout,'(80(1h*)/20x,a,i7)') + & 'Beginning iteration #',it +C Initialize local counter. + ntrial=0 ! # of generated non-overlapping confs. + noverlap=0 ! # of overlapping confs. + accepted=.false. + LOOP2:do while (.not. accepted) + + LOOP3:do while (imtasks_n.lt.nodenum-1.and..not.finish) + do i=1,nodenum-1 + if(imtasks(i).eq.0) then + is=i + exit + endif + enddo +C Retrieve the angles of previously accepted conformation + do j=1,nvar + varia(j)=varold(j) + enddo + call var_to_geom(nvar,varia) +C Rebuild the chain. + call chainbuild +C Heat up the system, if necessary. + call heat(over) +C If temperature cannot be further increased, stop. + if (over) then + finish=.true. + endif + MoveType=0 + nbond=0 +c write (iout,'(a)') 'Old variables:' +c write (iout,'(10f8.1)') (rad2deg*varia(i),i=1,nvar) +C Decide whether to generate a random conformation or perturb the old one + RandOrPert=ran_number(0.0D0,1.0D0) + if (RandOrPert.gt.RanFract) then + if (print_mc.gt.0) + & write (iout,'(a)') 'Perturbation-generated conformation.' + call perturb(error,lprint,MoveType,nbond,1.0D0) +c print *,'after perturb',error,finish + if (error) finish = .true. + if (MoveType.lt.1 .or. MoveType.gt.MaxMoveType) then + write (iout,'(/a,i7,a/)') 'Error - unknown MoveType=', + & MoveType,' returned from PERTURB.' + finish=.true. + write (*,'(/a,i7,a/)') 'Error - unknown MoveType=', + & MoveType,' returned from PERTURB.' + endif + call chainbuild + else + MoveType=0 + moves(0)=moves(0)+1 + nstart_grow=iran_num(3,nres) + if (print_mc.gt.0) + & write (iout,'(2a,i3)') 'Random-generated conformation', + & ' - chain regrown from residue',nstart_grow + call gen_rand_conf(nstart_grow,*30) + endif + call geom_to_var(nvar,varia) + ngen=ngen+1 +c print *,'finish=',finish + if (etot-elowest.gt.overlap_cut) then + if (print_mc.gt.1) write (iout,'(a,1pe14.5)') + & 'Overlap detected in the current conf.; energy is',etot + if(iprint.gt.1.or.etot.lt.1d19) print *, + & 'Overlap detected in the current conf.; energy is',etot + neneval=neneval+1 + accepted=.false. + noverlap=noverlap+1 + if (noverlap.gt.maxoverlap) then + write (iout,*) 'Too many overlapping confs.', + & ' etot, elowest, overlap_cut', etot, elowest, overlap_cut + finish=.true. + endif + else if (.not. finish) then +C Distribute tasks to processors +c print *,'Master sending order' + call MPI_SEND(12, 1, MPI_INTEGER, is, tag, + & CG_COMM, ierr) +c write (iout,*) '12: tag=',tag +c print *,'Master sent order to processor',is + call MPI_SEND(it, 1, MPI_INTEGER, is, tag, + & CG_COMM, ierr) +c write (iout,*) 'it: tag=',tag + call MPI_SEND(eold, 1, MPI_DOUBLE_PRECISION, is, tag, + & CG_COMM, ierr) +c write (iout,*) 'eold: tag=',tag + call MPI_SEND(varia(1), nvar, MPI_DOUBLE_PRECISION, + & is, tag, + & CG_COMM, ierr) +c write (iout,*) 'varia: tag=',tag + call MPI_SEND(varold(1), nvar, MPI_DOUBLE_PRECISION, + & is, tag, + & CG_COMM, ierr) +c write (iout,*) 'varold: tag=',tag +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif + imtasks(is)=1 + imtasks_n=imtasks_n+1 +C End distribution + endif ! overlap + enddo LOOP3 + + flag = .false. + LOOP_RECV:do while(.not.flag) + do is=1, nodenum-1 + call MPI_IPROBE(is,tag,CG_COMM,flag,status,ierr) + if(flag) then + call MPI_RECV(iitt, 1, MPI_INTEGER, is, tag, + & CG_COMM, status, ierr) + call MPI_RECV(eold1, 1, MPI_DOUBLE_PRECISION, is, tag, + & CG_COMM, status, ierr) + call MPI_RECV(etot, 1, MPI_DOUBLE_PRECISION, is, tag, + & CG_COMM, status, ierr) + call MPI_RECV(varia(1), nvar, MPI_DOUBLE_PRECISION,is,tag, + & CG_COMM, status, ierr) + call MPI_RECV(varold1(1), nvar, MPI_DOUBLE_PRECISION, is, + & tag, CG_COMM, status, ierr) + call MPI_RECV(ii_grnum_d, 1, MPI_INTEGER, is, tag, + & CG_COMM, status, ierr) + call MPI_RECV(ii_ennum_d, 1, MPI_INTEGER, is, tag, + & CG_COMM, status, ierr) + call MPI_RECV(ii_hesnum_d, 1, MPI_INTEGER, is, tag, + & CG_COMM, status, ierr) + i_grnum_d=i_grnum_d+ii_grnum_d + i_ennum_d=i_ennum_d+ii_ennum_d + neneval = neneval+ii_ennum_d + i_hesnum_d=i_hesnum_d+ii_hesnum_d + i_minimiz=i_minimiz+1 + imtasks(is)=0 + imtasks_n=imtasks_n-1 + exit + endif + enddo + enddo LOOP_RECV + + if(print_mc.gt.0) write (iout,'(a,i6,a,i6,a,i6,a,1pe16.6)') + & 'From Worker #',is,' iitt',iitt, + & ' Conformation:',ngen,' energy:',etot +C-------------------------------------------------------------------------- +C... Do Metropolis test +C-------------------------------------------------------------------------- + call metropolis(nvar,varia,varold1,etot,eold1,accepted, + & similar,EneLower) + if(iitt.ne.it.and..not.similar) then + call metropolis(nvar,varia,varold,etot,eold,accepted, + & similar,EneLower) + accepted=enelower + endif + if(etot.lt.eneglobal)eneglobal=etot +c if(mod(it,100).eq.0) + write(iout,*)'CHUJOJEB ',neneval,eneglobal + if (accepted) then +C Write the accepted conformation. + nout=nout+1 + if (refstr) then + call var_to_geom(nvar,varia) + call chainbuild + call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup), + & nsup,przes,obr,non_conv) + rms=dsqrt(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + write (iout,'(a,f8.3,a,f8.3,a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100,' contact order:',co + endif ! refstr + if (print_mc.gt.0) + & write (iout,*) 'Writing new conformation',nout + if (print_stat) then + call var_to_geom(nvar,varia) +#if defined(AIX) || defined(PGI) + open (istat,file=statname,position='append') +#else + open (istat,file=statname,access='append') +#endif + if (refstr) then + write (istat,'(i5,16(1pe14.5))') nout, + & (energia(print_order(i)),i=1,nprint_ene), + & etot,rms,frac + else + write (istat,'(i5,16(1pe14.5))') nout, + & (energia(print_order(i)),i=1,nprint_ene),etot + endif ! refstr + close(istat) + endif ! print_stat +C Print internal coordinates. + if (print_int) call briefout(nout,etot) + nacc=nacc+1 + nacc_tot=nacc_tot+1 + if (elowest.gt.etot) elowest=etot + moves_acc(MoveType)=moves_acc(MoveType)+1 + if (MoveType.eq.1) then + nbond_acc(nbond)=nbond_acc(nbond)+1 + endif +C Check against conformation repetitions. + irepet=conf_comp(varia,etot) + if (nrepm.gt.maxrepm) then + if (print_mc.gt.0) + & write (iout,'(a)') 'Too many conformation repetitions.' + finish=.true. + endif +C Store the accepted conf. and its energy. + eold=etot + do i=1,nvar + varold(i)=varia(i) + enddo + if (irepet.eq.0) call zapis(varia,etot) +C Lower the temperature, if necessary. + call cool + else + ntrial=ntrial+1 + endif ! accepted + 30 continue + if(finish.and.imtasks_n.eq.0)exit LOOP2 + enddo LOOP2 ! accepted +C Check for time limit. + not_done = (it.lt.max_mcm_it) .and. (nacc_tot.lt.maxacc) + if(.not.not_done .or. finish) then + if(imtasks_n.gt.0) then + not_done=.true. + else + not_done=.false. + endif + finish=.true. + endif + enddo LOOP1 ! not_done + runtime=tcpu() + if (print_mc.gt.0) then + write (iout,'(/80(1h*)/20x,a)') 'Summary run statistics:' + call statprint(nacc,nfun,iretcode,etot,elowest) + write (iout,'(a)') + & 'Statistics of multiple-bond motions. Total motions:' + write (iout,'(16i5)') (nbond_move(i),i=1,Nbm) + write (iout,'(a)') 'Accepted motions:' + write (iout,'(16i5)') (nbond_acc(i),i=1,Nbm) + if (it.ge.maxacc) + &write (iout,'(/80(1h*)/20x,a/80(1h*)/)') 'All iterations done.' + endif +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif + do is=1,nodenum-1 + call MPI_SEND(999, 1, MPI_INTEGER, is, tag, + & CG_COMM, ierr) + enddo + return + end +c------------------------------------------------------------------------------ + subroutine execute_slave(nodeinfo,iprint) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'mpif.h' + include 'COMMON.TIME1' + include 'COMMON.IOUNITS' +crc include 'COMMON.DEFORM' +crc include 'COMMON.DEFORM1' +crc include 'COMMON.DEFORM2' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.INFO' + include 'COMMON.MINIM' + character*10 nodeinfo + double precision x(maxvar),x1(maxvar) + nodeinfo='chujwdupe' +c print *,'Processor:',MyID,' Entering execute_slave' + tag=0 +c call MPI_SEND(nodeinfo, 10, MPI_CHARACTER, 0, tag, +c & CG_COMM, ierr) + +1001 call MPI_RECV(i_switch, 1, MPI_INTEGER, 0, tag, + & CG_COMM, status, ierr) +c write(iout,*)'12: tag=',tag + if(iprint.ge.2)print *, MyID,' recv order ',i_switch + if (i_switch.eq.12) then + i_grnum_d=0 + i_ennum_d=0 + i_hesnum_d=0 + call MPI_RECV(iitt, 1, MPI_INTEGER, 0, tag, + & CG_COMM, status, ierr) +c write(iout,*)'12: tag=',tag + call MPI_RECV(ener, 1, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, status, ierr) +c write(iout,*)'ener: tag=',tag + call MPI_RECV(x(1), nvar, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, status, ierr) +c write(iout,*)'x: tag=',tag + call MPI_RECV(x1(1), nvar, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, status, ierr) +c write(iout,*)'x1: tag=',tag +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif +c print *,'calling minimize' + call minimize(energyx,x,iretcode,nfun) + if(iprint.gt.0) + & write(iout,100)'minimized energy = ',energyx, + & ' # funeval:',nfun,' iret ',iretcode + write(*,100)'minimized energy = ',energyx, + & ' # funeval:',nfun,' iret ',iretcode + 100 format(a20,f10.5,a12,i5,a6,i2) + if(iretcode.eq.10) then + do iminrep=2,3 + if(iprint.gt.1) + & write(iout,*)' ... not converged - trying again ',iminrep + call minimize(energyx,x,iretcode,nfun) + if(iprint.gt.1) + & write(iout,*)'minimized energy = ',energyx, + & ' # funeval:',nfun,' iret ',iretcode + if(iretcode.ne.10)go to 812 + enddo + if(iretcode.eq.10) then + if(iprint.gt.1) + & write(iout,*)' ... not converged again - giving up' + go to 812 + endif + endif +812 continue +c print *,'Sending results' + call MPI_SEND(iitt, 1, MPI_INTEGER, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(ener, 1, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(energyx, 1, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(x(1), nvar, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(x1(1), nvar, MPI_DOUBLE_PRECISION, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(i_grnum_d, 1, MPI_INTEGER, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(nfun, 1, MPI_INTEGER, 0, tag, + & CG_COMM, ierr) + call MPI_SEND(i_hesnum_d, 1, MPI_INTEGER, 0, tag, + & CG_COMM, ierr) +c print *,'End sending' + go to 1001 + endif + + return + end +#endif +c------------------------------------------------------------------------------ + subroutine statprint(it,nfun,iretcode,etot,elowest) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include 'COMMON.MCM' + if (minim) then + write (iout, + & '(80(1h*)/a,i5,a,1pe14.5,a,1pe14.5/a,i3,a,i10,a,i5,a,i5)') + & 'Finished iteration #',it,' energy is',etot, + & ' lowest energy:',elowest, + & 'SUMSL return code:',iretcode, + & ' # of energy evaluations:',neneval, + & '# of temperature jumps:',ntherm, + & ' # of minima repetitions:',nrepm + else + write (iout,'(80(1h*)/a,i8,a,1pe14.5,a,1pe14.5)') + & 'Finished iteration #',it,' energy is',etot, + & ' lowest energy:',elowest + endif + write (iout,'(/4a)') + & 'Kind of move ',' total',' accepted', + & ' fraction' + write (iout,'(58(1h-))') + do i=-1,MaxMoveType + if (moves(i).eq.0) then + fr_mov_i=0.0d0 + else + fr_mov_i=dfloat(moves_acc(i))/dfloat(moves(i)) + endif + write(iout,'(a,2i15,f10.5)')MovTypID(i),moves(i),moves_acc(i), + & fr_mov_i + enddo + write (iout,'(a,2i15,f10.5)') 'total ',nmove,nacc_tot, + & dfloat(nacc_tot)/dfloat(nmove) + write (iout,'(58(1h-))') + write (iout,'(a,1pe12.4)') 'Elapsed time:',tcpu() + return + end +c------------------------------------------------------------------------------ + subroutine heat(over) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + logical over +C Check if there`s a need to increase temperature. + if (ntrial.gt.maxtrial) then + if (NstepH.gt.0) then + if (dabs(Tcur-TMax).lt.1.0D-7) then + if (print_mc.gt.0) + & write (iout,'(/80(1h*)/a,f8.3,a/80(1h*))') + & 'Upper limit of temperature reached. Terminating.' + over=.true. + Tcur=Tmin + else + Tcur=Tcur*TstepH + if (Tcur.gt.Tmax) Tcur=Tmax + betbol=1.0D0/(Rbol*Tcur) + if (print_mc.gt.0) + & write (iout,'(/80(1h*)/a,f8.3,a,f10.5/80(1h*))') + & 'System heated up to ',Tcur,' K; BetBol:',betbol + ntherm=ntherm+1 + ntrial=0 + over=.false. + endif + else + if (print_mc.gt.0) + & write (iout,'(a)') + & 'Maximum number of trials in a single MCM iteration exceeded.' + over=.true. + Tcur=Tmin + endif + else + over=.false. + endif + return + end +c------------------------------------------------------------------------------ + subroutine cool + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + if (nstepC.gt.0 .and. dabs(Tcur-Tmin).gt.1.0D-7) then + Tcur=Tcur/TstepC + if (Tcur.lt.Tmin) Tcur=Tmin + betbol=1.0D0/(Rbol*Tcur) + if (print_mc.gt.0) + & write (iout,'(/80(1h*)/a,f8.3,a,f10.5/80(1h*))') + & 'System cooled down up to ',Tcur,' K; BetBol:',betbol + endif + return + end +C--------------------------------------------------------------------------- + subroutine zapis(varia,etot) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MP + include 'mpif.h' + include 'COMMON.INFO' +#endif + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + integer itemp(maxsave) + double precision varia(maxvar) + logical lprint + lprint=.false. + if (lprint) then + write (iout,'(a,i5,a,i5)') 'Enter ZAPIS NSave=',Nsave, + & ' MaxSave=',MaxSave + write (iout,'(a)') 'Current energy and conformation:' + write (iout,'(1pe14.5)') etot + write (iout,'(10f8.3)') (rad2deg*varia(i),i=1,nvar) + endif +C Shift the contents of the esave and varsave arrays if filled up. + call add2cache(maxvar,maxsave,nsave,nvar,MyID,itemp, + & etot,varia,esave,varsave) + if (lprint) then + write (iout,'(a)') 'Energies and the VarSave array.' + do i=1,nsave + write (iout,'(i5,1pe14.5)') i,esave(i) + write (iout,'(10f8.3)') (rad2deg*varsave(j,i),j=1,nvar) + enddo + endif + return + end +C--------------------------------------------------------------------------- + subroutine perturb(error,lprint,MoveType,nbond,max_phi) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (MMaxSideMove=100) + include 'COMMON.MCM' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' +crc include 'COMMON.DEFORM1' + logical error,lprint,fail + integer MoveType,nbond,end_select,ind_side(MMaxSideMove) + double precision max_phi + double precision psi,gen_psi + external iran_num + integer iran_num + integer ifour + data ifour /4/ + error=.false. + lprint=.false. +C Perturb the conformation according to a randomly selected move. + call SelectMove(MoveType) +c write (iout,*) 'MoveType=',MoveType + itrial=0 + goto (100,200,300,400,500) MoveType +C------------------------------------------------------------------------------ +C Backbone N-bond move. +C Select the number of bonds (length of the segment to perturb). + 100 continue + if (itrial.gt.1000) then + write (iout,'(a)') 'Too many attempts at multiple-bond move.' + error=.true. + return + endif + bond_prob=ran_number(0.0D0,sumpro_bond(nbm)) +c print *,'sumpro_bond(nbm)=',sumpro_bond(nbm), +c & ' Bond_prob=',Bond_Prob + do i=1,nbm-1 +c print *,i,Bond_Prob,sumpro_bond(i),sumpro_bond(i+1) + if (bond_prob.ge.sumpro_bond(i) .and. + & bond_prob.le.sumpro_bond(i+1)) then + nbond=i+1 + goto 10 + endif + enddo + write (iout,'(2a)') 'In PERTURB: Error - number of bonds', + & ' to move out of range.' + error=.true. + return + 10 continue + if (nwindow.gt.0) then +C Select the first residue to perturb + iwindow=iran_num(1,nwindow) + print *,'iwindow=',iwindow + iiwin=1 + do while (winlen(iwindow).lt.nbond) + iwindow=iran_num(1,nwindow) + iiwin=iiwin+1 + if (iiwin.gt.1000) then + write (iout,'(a)') 'Cannot select moveable residues.' + error=.true. + return + endif + enddo + nstart=iran_num(winstart(iwindow),winend(iwindow)) + else + nstart = iran_num(koniecl+2,nres-nbond-koniecl) +cd print *,'nres=',nres,' nbond=',nbond,' koniecl=',koniecl, +cd & ' nstart=',nstart + endif + psi = gen_psi() + if (psi.eq.0.0) then + error=.true. + return + endif + if (print_mc.gt.1) write (iout,'(a,i4,a,i4,a,f8.3)') + & 'PERTURB: nbond=',nbond,' nstart=',nstart,' psi=',psi*rad2deg +cd print *,'nstart=',nstart + call bond_move(nbond,nstart,psi,.false.,error) + if (error) then + write (iout,'(2a)') + & 'Could not define reference system in bond_move, ', + & 'choosing ahother segment.' + itrial=itrial+1 + goto 100 + endif + nbond_move(nbond)=nbond_move(nbond)+1 + moves(1)=moves(1)+1 + nmove=nmove+1 + return +C------------------------------------------------------------------------------ +C Backbone endmove. Perturb a SINGLE angle of a residue close to the end of +C the chain. + 200 continue + lprint=.true. +c end_select=iran_num(1,2*koniecl) +c if (end_select.gt.koniecl) then +c end_select=nphi-(end_select-koniecl) +c else +c end_select=koniecl+3 +c endif +c if (nwindow.gt.0) then +c iwin=iran_num(1,nwindow) +c i1=max0(4,winstart(iwin)) +c i2=min0(winend(imin)+2,nres) +c end_select=iran_num(i1,i2) +c else +c iselect = iran_num(1,nmov_var) +c jj = 0 +c do i=1,nphi +c if (isearch_tab(i).eq.1) jj = jj+1 +c if (jj.eq.iselect) then +c end_select=i+3 +c exit +c endif +c enddo +c endif + end_select = iran_num(4,nres) + psi=max_phi*gen_psi() + if (psi.eq.0.0D0) then + error=.true. + return + endif + phi(end_select)=pinorm(phi(end_select)+psi) + if (print_mc.gt.1) write (iout,'(a,i4,a,f8.3,a,f8.3)') + & 'End angle',end_select,' moved by ',psi*rad2deg,' new angle:', + & phi(end_select)*rad2deg +c if (end_select.gt.3) +c & theta(end_select-1)=gen_theta(itype(end_select-2), +c & phi(end_select-1),phi(end_select)) +c if (end_select.lt.nres) +c & theta(end_select)=gen_theta(itype(end_select-1), +c & phi(end_select),phi(end_select+1)) +cd print *,'nres=',nres,' end_select=',end_select +cd print *,'theta',end_select-1,theta(end_select-1) +cd print *,'theta',end_select,theta(end_select) + moves(2)=moves(2)+1 + nmove=nmove+1 + lprint=.false. + return +C------------------------------------------------------------------------------ +C Side chain move. +C Select the number of SCs to perturb. + 300 isctry=0 + 301 nside_move=iran_num(1,MaxSideMove) +c print *,'nside_move=',nside_move,' MaxSideMove',MaxSideMove +C Select the indices. + do i=1,nside_move + icount=0 + 111 inds=iran_num(nnt,nct) + icount=icount+1 + if (icount.gt.1000) then + write (iout,'(a)')'Error - cannot select side chains to move.' + error=.true. + return + endif + if (itype(inds).eq.10) goto 111 + do j=1,i-1 + if (inds.eq.ind_side(j)) goto 111 + enddo + do j=1,i-1 + if (inds.lt.ind_side(j)) then + indx=j + goto 112 + endif + enddo + indx=i + 112 do j=i,indx+1,-1 + ind_side(j)=ind_side(j-1) + enddo + 113 ind_side(indx)=inds + enddo +C Carry out perturbation. + do i=1,nside_move + ii=ind_side(i) + iti=itype(ii) + call gen_side(iti,theta(ii+1),alph(ii),omeg(ii),fail) + if (fail) then + isctry=isctry+1 + if (isctry.gt.1000) then + write (iout,'(a)') 'Too many errors in SC generation.' + error=.true. + return + endif + goto 301 + endif + if (print_mc.gt.1) write (iout,'(2a,i4,a,2f8.3)') + & 'Side chain ',restyp(iti),ii,' moved to ', + & alph(ii)*rad2deg,omeg(ii)*rad2deg + enddo + moves(3)=moves(3)+1 + nmove=nmove+1 + return +C------------------------------------------------------------------------------ +C THETA move + 400 end_select=iran_num(3,nres) + theta_new=gen_theta(itype(end_select),phi(end_select), + & phi(end_select+1)) + if (print_mc.gt.1) write (iout,'(a,i3,a,f8.3,a,f8.3)') + & 'Theta ',end_select,' moved from',theta(end_select)*rad2deg, + & ' to ',theta_new*rad2deg + theta(end_select)=theta_new + moves(4)=moves(4)+1 + nmove=nmove+1 + return +C------------------------------------------------------------------------------ +C Error returned from SelectMove. + 500 error=.true. + return + end +C------------------------------------------------------------------------------ + subroutine SelectMove(MoveType) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + what_move=ran_number(0.0D0,sumpro_type(MaxMoveType)) + do i=1,MaxMoveType + if (what_move.ge.sumpro_type(i-1).and. + & what_move.lt.sumpro_type(i)) then + MoveType=i + return + endif + enddo + write (iout,'(a)') + & 'Fatal error in SelectMoveType: cannot select move.' + MoveType=MaxMoveType+1 + return + end +c---------------------------------------------------------------------------- + double precision function gen_psi() + implicit none + integer i + double precision x,ran_number + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + x=0.0D0 + do i=1,100 + x=ran_number(-pi,pi) + if (dabs(x).gt.angmin) then + gen_psi=x + return + endif + enddo + write (iout,'(a)')'From Gen_Psi: Cannot generate angle increment.' + gen_psi=0.0D0 + return + end +c---------------------------------------------------------------------------- + subroutine metropolis(n,xcur,xold,ecur,eold,accepted,similar, + & enelower) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.GEO' +crc include 'COMMON.DEFORM' + double precision ecur,eold,xx,ran_number,bol + double precision xcur(n),xold(n) + double precision ecut1 ,ecut2 ,tola + logical accepted,similar,not_done,enelower + logical lprn + data ecut1 /-1.0D-5/,ecut2 /5.0D-3/,tola/5.0D0/ +! ecut1=-5*enedif +! ecut2=50*enedif +! tola=5.0d0 +C Set lprn=.true. for debugging. + lprn=.false. + if (lprn) + &write(iout,*)'enedif',enedif,' ecut1',ecut1,' ecut2',ecut2 + similar=.false. + enelower=.false. + accepted=.false. +C Check if the conformation is similar. + difene=ecur-eold + reldife=difene/dmax1(dabs(eold),dabs(ecur),1.0D0) + if (lprn) then + write (iout,*) 'Metropolis' + write(iout,*)'ecur,eold,difene,reldife',ecur,eold,difene,reldife + endif +C If energy went down remarkably, we accept the new conformation +C unconditionally. +cjp if (reldife.lt.ecut1) then + if (difene.lt.ecut1) then + accepted=.true. + EneLower=.true. + if (lprn) write (iout,'(a)') + & 'Conformation accepted, because energy has lowered remarkably.' +! elseif (reldife.lt.ecut2 .and. dif_ang(nphi,xcur,xold).lt.tola) +cjp elseif (reldife.lt.ecut2) + elseif (difene.lt.ecut2) + & then +C Reject the conf. if energy has changed insignificantly and there is not +C much change in conformation. + if (lprn) + & write (iout,'(2a)') 'Conformation rejected, because it is', + & ' similar to the preceding one.' + accepted=.false. + similar=.true. + else +C Else carry out Metropolis test. + EneLower=.false. + xx=ran_number(0.0D0,1.0D0) + xxh=betbol*difene + if (lprn) + & write (iout,*) 'betbol=',betbol,' difene=',difene,' xxh=',xxh + if (xxh.gt.50.0D0) then + bol=0.0D0 + else + bol=exp(-xxh) + endif + if (lprn) write (iout,*) 'bol=',bol,' xx=',xx + if (bol.gt.xx) then + accepted=.true. + if (lprn) write (iout,'(a)') + & 'Conformation accepted, because it passed Metropolis test.' + else + accepted=.false. + if (lprn) write (iout,'(a)') + & 'Conformation rejected, because it did not pass Metropolis test.' + endif + endif +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif + return + end +c------------------------------------------------------------------------------ + integer function conf_comp(x,ene) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + double precision etol , angtol + double precision x(maxvar) + double precision dif_ang,difa + data etol /0.1D0/, angtol /20.0D0/ + do ii=nsave,1,-1 +c write (iout,*) 'ii=',ii,'ene=',ene,esave(ii),dabs(ene-esave(ii)) + if (dabs(ene-esave(ii)).lt.etol) then + difa=dif_ang(nphi,x,varsave(1,ii)) +c do i=1,nphi +c write(iout,'(i3,3f8.3)')i,rad2deg*x(i), +c & rad2deg*varsave(i,ii) +c enddo +c write(iout,*) 'ii=',ii,' difa=',difa,' angtol=',angtol + if (difa.le.angtol) then + if (print_mc.gt.0) then + write (iout,'(a,i5,2(a,1pe15.4))') + & 'Current conformation matches #',ii, + & ' in the store array ene=',ene,' esave=',esave(ii) +c write (*,'(a,i5,a)') 'Current conformation matches #',ii, +c & ' in the store array.' + endif ! print_mc.gt.0 + if (print_mc.gt.1) then + do i=1,nphi + write(iout,'(i3,3f8.3)')i,rad2deg*x(i), + & rad2deg*varsave(i,ii) + enddo + endif ! print_mc.gt.1 + nrepm=nrepm+1 + conf_comp=ii + return + endif + endif + enddo + conf_comp=0 + return + end +C---------------------------------------------------------------------------- + double precision function dif_ang(n,x,y) + implicit none + integer i,n + double precision x(n),y(n) + double precision w,wa,dif,difa + double precision pinorm + include 'COMMON.GEO' + wa=0.0D0 + difa=0.0D0 + do i=1,n + dif=dabs(pinorm(y(i)-x(i))) + if (dabs(dif-dwapi).lt.dif) dif=dabs(dif-dwapi) + w=1.0D0-(2.0D0*(i-1)/(n-1)-1.0D0)**2+1.0D0/n + wa=wa+w + difa=difa+dif*dif*w + enddo + dif_ang=rad2deg*dsqrt(difa/wa) + return + end +c-------------------------------------------------------------------------- + subroutine add2cache(n1,n2,ncache,nvar,SourceID,CachSrc, + & ecur,xcur,ecache,xcache) + implicit none + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + integer n1,n2,ncache,nvar,SourceID,CachSrc(n2) + integer i,ii,j + double precision ecur,xcur(nvar),ecache(n2),xcache(n1,n2) +cd write (iout,*) 'Enter ADD2CACHE ncache=',ncache ,' ecur',ecur +cd write (iout,'(10f8.3)') (rad2deg*xcur(i),i=1,nvar) +cd write (iout,*) 'Old CACHE array:' +cd do i=1,ncache +cd write (iout,*) 'i=',i,' ecache=',ecache(i),' CachSrc',CachSrc(i) +cd write (iout,'(10f8.3)') (rad2deg*xcache(j,i),j=1,nvar) +cd enddo + + i=ncache + do while (i.gt.0 .and. ecur.lt.ecache(i)) + i=i-1 + enddo + i=i+1 +cd write (iout,*) 'i=',i,' ncache=',ncache + if (ncache.eq.n2) then + write (iout,*) 'Cache dimension exceeded',ncache,n2 + write (iout,*) 'Highest-energy conformation will be removed.' + ncache=ncache-1 + endif + do ii=ncache,i,-1 + ecache(ii+1)=ecache(ii) + CachSrc(ii+1)=CachSrc(ii) + do j=1,nvar + xcache(j,ii+1)=xcache(j,ii) + enddo + enddo + ecache(i)=ecur + CachSrc(i)=SourceID + do j=1,nvar + xcache(j,i)=xcur(j) + enddo + ncache=ncache+1 +cd write (iout,*) 'New CACHE array:' +cd do i=1,ncache +cd write (iout,*) 'i=',i,' ecache=',ecache(i),' CachSrc',CachSrc(i) +cd write (iout,'(10f8.3)') (rad2deg*xcache(j,i),j=1,nvar) +cd enddo + return + end +c-------------------------------------------------------------------------- + subroutine rm_from_cache(i,n1,n2,ncache,nvar,CachSrc,ecache, + & xcache) + implicit none + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + integer n1,n2,ncache,nvar,CachSrc(n2) + integer i,ii,j + double precision ecache(n2),xcache(n1,n2) + +cd write (iout,*) 'Enter RM_FROM_CACHE' +cd write (iout,*) 'Old CACHE array:' +cd do ii=1,ncache +cd write (iout,*)'i=',ii,' ecache=',ecache(ii),' CachSrc',CachSrc(ii) +cd write (iout,'(10f8.3)') (rad2deg*xcache(j,ii),j=1,nvar) +cd enddo + + do ii=i+1,ncache + ecache(ii-1)=ecache(ii) + CachSrc(ii-1)=CachSrc(ii) + do j=1,nvar + xcache(j,ii-1)=xcache(j,ii) + enddo + enddo + ncache=ncache-1 +cd write (iout,*) 'New CACHE array:' +cd do i=1,ncache +cd write (iout,*) 'i=',i,' ecache=',ecache(i),' CachSrc',CachSrc(i) +cd write (iout,'(10f8.3)') (rad2deg*xcache(j,i),j=1,nvar) +cd enddo + return + end diff --git a/source/unres/src_MD-NEWSC/minim_mcmf.F b/source/unres/src_MD-NEWSC/minim_mcmf.F new file mode 100644 index 0000000..beb3d4c --- /dev/null +++ b/source/unres/src_MD-NEWSC/minim_mcmf.F @@ -0,0 +1,121 @@ +#ifdef MPI + subroutine minim_mcmf + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.MINIM' + include 'mpif.h' + external func,gradient,fdum + real ran1,ran2,ran3 + include 'COMMON.SETUP' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + dimension muster(mpi_status_size) + dimension var(maxvar),erg(mxch*(mxch+1)/2+1) + double precision d(maxvar),v(1:lv+1),garbage(maxvar) + dimension indx(6) + dimension iv(liv) + dimension idum(1),rdum(1) + double precision przes(3),obrot(3,3) + logical non_conv + data rad /1.745329252d-2/ + common /przechowalnia/ v + + ichuj=0 + 10 continue + ichuj = ichuj + 1 + call mpi_recv(indx,6,mpi_integer,king,idint,CG_COMM, + * muster,ierr) + if (indx(1).eq.0) return +c print *, 'worker ',me,' received order ',n,ichuj + call mpi_recv(var,nvar,mpi_double_precision, + * king,idreal,CG_COMM,muster,ierr) + call mpi_recv(ene0,1,mpi_double_precision, + * king,idreal,CG_COMM,muster,ierr) +c print *, 'worker ',me,' var read ' + + + call deflt(2,iv,liv,lv,v) +* 12 means fresh start, dont call deflt + iv(1)=12 +* max num of fun calls + if (maxfun.eq.0) maxfun=500 + iv(17)=maxfun +* max num of iterations + if (maxmin.eq.0) maxmin=1000 + iv(18)=maxmin +* controls output + iv(19)=2 +* selects output unit +c iv(21)=iout + iv(21)=0 +* 1 means to print out result + iv(22)=0 +* 1 means to print out summary stats + iv(23)=0 +* 1 means to print initial x and d + iv(24)=0 +* min val for v(radfac) default is 0.1 + v(24)=0.1D0 +* max val for v(radfac) default is 4.0 + v(25)=2.0D0 +* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +* the sumsl default is 0.1 + v(26)=0.1D0 +* false conv if (act fnctn decrease) .lt. v(34) +* the sumsl default is 100*machep + v(34)=v(34)/100.0D0 +* absolute convergence + if (tolf.eq.0.0D0) tolf=1.0D-4 + v(31)=tolf +* relative convergence + if (rtolf.eq.0.0D0) rtolf=1.0D-4 + v(32)=rtolf +* controls initial step size + v(35)=1.0D-1 +* large vals of d correspond to small components of step + do i=1,nphi + d(i)=1.0D-1 + enddo + do i=nphi+1,nvar + d(i)=1.0D-1 + enddo +c minimize energy + + call func(nvar,var,nf,eee,idum,rdum,fdum) + if(eee.gt.1.0d18) then +c print *,'MINIM_JLEE: ',me,' CHUJ NASTAPIL' +c print *,' energy before SUMSL =',eee +c print *,' aborting local minimization' + iv(1)=-1 + v(10)=eee + nf=1 + go to 201 + endif + + call sumsl(nvar,d,var,func,gradient,iv,liv,lv,v,idum,rdum,fdum) +c find which conformation was returned from sumsl + nf=iv(7)+1 + 201 continue +c total # of ftn evaluations (for iwf=0, it includes all minimizations). + indx(4)=nf + indx(5)=iv(1) + eee=v(10) + + call mpi_send(indx,6,mpi_integer,king,idint,CG_COMM, + * ierr) +c print '(a5,i3,15f10.5)', 'ENEX0',indx(1),v(10) + call mpi_send(var,nvar,mpi_double_precision, + * king,idreal,CG_COMM,ierr) + call mpi_send(eee,1,mpi_double_precision,king,idreal, + * CG_COMM,ierr) + call mpi_send(ene0,1,mpi_double_precision,king,idreal, + * CG_COMM,ierr) + go to 10 + + return + end +#endif diff --git a/source/unres/src_MD-NEWSC/minimize_p.F b/source/unres/src_MD-NEWSC/minimize_p.F new file mode 100644 index 0000000..c7922c7 --- /dev/null +++ b/source/unres/src_MD-NEWSC/minimize_p.F @@ -0,0 +1,641 @@ + subroutine minimize(etot,x,iretcode,nfun) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) +********************************************************************* +* OPTIMIZE sets up SUMSL or DFP and provides a simple interface for * +* the calling subprogram. * +* when d(i)=1.0, then v(35) is the length of the initial step, * +* calculated in the usual pythagorean way. * +* absolute convergence occurs when the function is within v(31) of * +* zero. unless you know the minimum value in advance, abs convg * +* is probably not useful. * +* relative convergence is when the model predicts that the function * +* will decrease by less than v(32)*abs(fun). * +********************************************************************* + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.MINIM' + common /srutu/ icall + dimension iv(liv) + double precision minval,x(maxvar),d(maxvar),v(1:lv),xx(maxvar) + double precision energia(0:n_ene) + external func,gradient,fdum + external func_restr,grad_restr + logical not_done,change,reduce +c common /przechowalnia/ v + + icall = 1 + + NOT_DONE=.TRUE. + +c DO WHILE (NOT_DONE) + + call deflt(2,iv,liv,lv,v) +* 12 means fresh start, dont call deflt + iv(1)=12 +* max num of fun calls + if (maxfun.eq.0) maxfun=500 + iv(17)=maxfun +* max num of iterations + if (maxmin.eq.0) maxmin=1000 + iv(18)=maxmin +* controls output + iv(19)=2 +* selects output unit + iv(21)=0 + if (print_min_ini+print_min_stat+print_min_res.gt.0) iv(21)=iout +* 1 means to print out result + iv(22)=print_min_res +* 1 means to print out summary stats + iv(23)=print_min_stat +* 1 means to print initial x and d + iv(24)=print_min_ini +* min val for v(radfac) default is 0.1 + v(24)=0.1D0 +* max val for v(radfac) default is 4.0 + v(25)=2.0D0 +c v(25)=4.0D0 +* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +* the sumsl default is 0.1 + v(26)=0.1D0 +* false conv if (act fnctn decrease) .lt. v(34) +* the sumsl default is 100*machep + v(34)=v(34)/100.0D0 +* absolute convergence + if (tolf.eq.0.0D0) tolf=1.0D-4 + v(31)=tolf +* relative convergence + if (rtolf.eq.0.0D0) rtolf=1.0D-4 + v(32)=rtolf +* controls initial step size + v(35)=1.0D-1 +* large vals of d correspond to small components of step + do i=1,nphi + d(i)=1.0D-1 + enddo + do i=nphi+1,nvar + d(i)=1.0D-1 + enddo +cd print *,'Calling SUMSL' +c call var_to_geom(nvar,x) +c call chainbuild +c call etotal(energia(0)) +c etot = energia(0) + IF (mask_r) THEN + call x2xx(x,xx,nvar_restr) + call sumsl(nvar_restr,d,xx,func_restr,grad_restr, + & iv,liv,lv,v,idum,rdum,fdum) + call xx2x(x,xx) + ELSE + call sumsl(nvar,d,x,func,gradient,iv,liv,lv,v,idum,rdum,fdum) + ENDIF + etot=v(10) + iretcode=iv(1) +cd print *,'Exit SUMSL; return code:',iretcode,' energy:',etot +cd write (iout,'(/a,i4/)') 'SUMSL return code:',iv(1) +c call intout +c change=reduce(x) + call var_to_geom(nvar,x) +c if (change) then +c write (iout,'(a)') 'Reduction worked, minimizing again...' +c else +c not_done=.false. +c endif + call chainbuild +c call etotal(energia(0)) +c etot=energia(0) +c call enerprint(energia(0)) + nfun=iv(6) + +c write (*,*) 'Processor',MyID,' leaves MINIMIZE.' + +c ENDDO ! NOT_DONE + + return + end +#ifdef MPI +c---------------------------------------------------------------------------- + subroutine ergastulum + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.SETUP' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.TIME1' + double precision z(maxres6),d_a_tmp(maxres6) + double precision edum(0:n_ene),time_order(0:10) + double precision Gcopy(maxres2,maxres2) + common /przechowalnia/ Gcopy + integer icall /0/ +C Workers wait for variables and NF, and NFL from the boss + iorder=0 + do while (iorder.ge.0) +c write (*,*) 'Processor',fg_rank,' CG group',kolor, +c & ' receives order from Master' + time00=MPI_Wtime() + call MPI_Bcast(iorder,1,MPI_INTEGER,king,FG_COMM,IERR) + time_Bcast=time_Bcast+MPI_Wtime()-time00 + if (icall.gt.4 .and. iorder.ge.0) + & time_order(iorder)=time_order(iorder)+MPI_Wtime()-time00 + icall=icall+1 +c write (*,*) +c & 'Processor',fg_rank,' completed receive MPI_BCAST order',iorder + if (iorder.eq.0) then + call zerograd + call etotal(edum) +c write (2,*) "After etotal" +c write (2,*) "dimen",dimen," dimen3",dimen3 +c call flush(2) + else if (iorder.eq.2) then + call zerograd + call etotal_short(edum) +c write (2,*) "After etotal_short" +c write (2,*) "dimen",dimen," dimen3",dimen3 +c call flush(2) + else if (iorder.eq.3) then + call zerograd + call etotal_long(edum) +c write (2,*) "After etotal_long" +c write (2,*) "dimen",dimen," dimen3",dimen3 +c call flush(2) + else if (iorder.eq.1) then + call sum_gradient +c write (2,*) "After sum_gradient" +c write (2,*) "dimen",dimen," dimen3",dimen3 +c call flush(2) + else if (iorder.eq.4) then + call ginv_mult(z,d_a_tmp) + else if (iorder.eq.5) then +c Setup MD things for a slave + dimen=(nct-nnt+1)+nside + dimen1=(nct-nnt)+(nct-nnt+1) + dimen3=dimen*3 +c write (2,*) "dimen",dimen," dimen3",dimen3 +c call flush(2) + call int_bounds(dimen,igmult_start,igmult_end) + igmult_start=igmult_start-1 + call MPI_Allgather(3*igmult_start,1,MPI_INTEGER, + & ng_start(0),1,MPI_INTEGER,FG_COMM,IERROR) + my_ng_count=igmult_end-igmult_start + call MPI_Allgather(3*my_ng_count,1,MPI_INTEGER,ng_counts(0),1, + & MPI_INTEGER,FG_COMM,IERROR) +c write (2,*) "ng_start",(ng_start(i),i=0,nfgtasks-1) +c write (2,*) "ng_counts",(ng_counts(i),i=0,nfgtasks-1) + myginv_ng_count=maxres2*my_ng_count +c write (2,*) "igmult_start",igmult_start," igmult_end", +c & igmult_end," my_ng_count",my_ng_count +c call flush(2) + call MPI_Allgather(maxres2*igmult_start,1,MPI_INTEGER, + & nginv_start(0),1,MPI_INTEGER,FG_COMM,IERROR) + call MPI_Allgather(myginv_ng_count,1,MPI_INTEGER, + & nginv_counts(0),1,MPI_INTEGER,FG_COMM,IERROR) +c write (2,*) "nginv_start",(nginv_start(i),i=0,nfgtasks-1) +c write (2,*) "nginv_counts",(nginv_counts(i),i=0,nfgtasks-1) +c call flush(2) +c call MPI_Barrier(FG_COMM,IERROR) + time00=MPI_Wtime() + call MPI_Scatterv(ginv(1,1),nginv_counts(0), + & nginv_start(0),MPI_DOUBLE_PRECISION,gcopy(1,1), + & myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERR) +#ifdef TIMING + time_scatter_ginv=time_scatter_ginv+MPI_Wtime()-time00 +#endif + do i=1,dimen + do j=1,2*my_ng_count + ginv(j,i)=gcopy(i,j) + enddo + enddo +c write (2,*) "dimen",dimen," dimen3",dimen3 +c write (2,*) "End MD setup" +c call flush(2) +c write (iout,*) "My chunk of ginv_block" +c call MATOUT2(my_ng_count,dimen3,maxres2,maxers2,ginv_block) + else if (iorder.eq.6) then + call int_from_cart1(.false.) + else if (iorder.eq.7) then + call chainbuild_cart + else if (iorder.eq.8) then + call intcartderiv + else if (iorder.eq.9) then + call fricmat_mult(z,d_a_tmp) + else if (iorder.eq.10) then + call setup_fricmat + endif + enddo + write (*,*) 'Processor',fg_rank,' CG group',kolor, + & ' absolute rank',myrank,' leves ERGASTULUM.' + write(*,*)'Processor',fg_rank,' wait times for respective orders', + & (' order[',i,']',time_order(i),i=0,10) + return + end +#endif +************************************************************************ + subroutine func(n,x,nf,f,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + common /chuju/ jjj + double precision energia(0:n_ene) + integer jjj + double precision ufparm + external ufparm + integer uiparm(1) + real*8 urparm(1) + dimension x(maxvar) +c if (jjj.gt.0) then +c write (iout,'(10f8.3)') (rad2deg*x(i),i=1,n) +c endif + nfl=nf + icg=mod(nf,2)+1 +cd print *,'func',nf,nfl,icg + call var_to_geom(n,x) + call zerograd + call chainbuild +cd write (iout,*) 'ETOTAL called from FUNC' + call etotal(energia(0)) + call sum_gradient + f=energia(0) +c if (jjj.gt.0) then +c write (iout,'(10f8.3)') (rad2deg*x(i),i=1,n) +c write (iout,*) 'f=',etot +c jjj=0 +c endif + return + end +************************************************************************ + subroutine func_restr(n,x,nf,f,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + common /chuju/ jjj + double precision energia(0:n_ene) + integer jjj + double precision ufparm + external ufparm + integer uiparm(1) + real*8 urparm(1) + dimension x(maxvar) +c if (jjj.gt.0) then +c write (iout,'(10f8.3)') (rad2deg*x(i),i=1,n) +c endif + nfl=nf + icg=mod(nf,2)+1 + call var_to_geom_restr(n,x) + call zerograd + call chainbuild +cd write (iout,*) 'ETOTAL called from FUNC' + call etotal(energia(0)) + call sum_gradient + f=energia(0) +c if (jjj.gt.0) then +c write (iout,'(10f8.3)') (rad2deg*x(i),i=1,n) +c write (iout,*) 'f=',etot +c jjj=0 +c endif + return + end +c------------------------------------------------------- + subroutine x2xx(x,xx,n) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + double precision xx(maxvar),x(maxvar) + + do i=1,nvar + varall(i)=x(i) + enddo + + ig=0 + igall=0 + do i=4,nres + igall=igall+1 + if (mask_phi(i).eq.1) then + ig=ig+1 + xx(ig)=x(igall) + endif + enddo + + do i=3,nres + igall=igall+1 + if (mask_theta(i).eq.1) then + ig=ig+1 + xx(ig)=x(igall) + endif + enddo + + do ij=1,2 + do i=2,nres-1 + if (itype(i).ne.10) then + igall=igall+1 + if (mask_side(i).eq.1) then + ig=ig+1 + xx(ig)=x(igall) + endif + endif + enddo + enddo + + n=ig + + return + end + + subroutine xx2x(x,xx) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + double precision xx(maxvar),x(maxvar) + + do i=1,nvar + x(i)=varall(i) + enddo + + ig=0 + igall=0 + do i=4,nres + igall=igall+1 + if (mask_phi(i).eq.1) then + ig=ig+1 + x(igall)=xx(ig) + endif + enddo + + do i=3,nres + igall=igall+1 + if (mask_theta(i).eq.1) then + ig=ig+1 + x(igall)=xx(ig) + endif + enddo + + do ij=1,2 + do i=2,nres-1 + if (itype(i).ne.10) then + igall=igall+1 + if (mask_side(i).eq.1) then + ig=ig+1 + x(igall)=xx(ig) + endif + endif + enddo + enddo + + return + end + +c---------------------------------------------------------- + subroutine minim_dc(etot,iretcode,nfun) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.MINIM' + include 'COMMON.CHAIN' + dimension iv(liv) + double precision minval,x(maxvar),d(maxvar),v(1:lv),xx(maxvar) +c common /przechowalnia/ v + + double precision energia(0:n_ene) + external func_dc,grad_dc,fdum + logical not_done,change,reduce + double precision g(maxvar),f1 + + call deflt(2,iv,liv,lv,v) +* 12 means fresh start, dont call deflt + iv(1)=12 +* max num of fun calls + if (maxfun.eq.0) maxfun=500 + iv(17)=maxfun +* max num of iterations + if (maxmin.eq.0) maxmin=1000 + iv(18)=maxmin +* controls output + iv(19)=2 +* selects output unit + iv(21)=0 + if (print_min_ini+print_min_stat+print_min_res.gt.0) iv(21)=iout +* 1 means to print out result + iv(22)=print_min_res +* 1 means to print out summary stats + iv(23)=print_min_stat +* 1 means to print initial x and d + iv(24)=print_min_ini +* min val for v(radfac) default is 0.1 + v(24)=0.1D0 +* max val for v(radfac) default is 4.0 + v(25)=2.0D0 +c v(25)=4.0D0 +* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +* the sumsl default is 0.1 + v(26)=0.1D0 +* false conv if (act fnctn decrease) .lt. v(34) +* the sumsl default is 100*machep + v(34)=v(34)/100.0D0 +* absolute convergence + if (tolf.eq.0.0D0) tolf=1.0D-4 + v(31)=tolf +* relative convergence + if (rtolf.eq.0.0D0) rtolf=1.0D-4 + v(32)=rtolf +* controls initial step size + v(35)=1.0D-1 +* large vals of d correspond to small components of step + do i=1,6*nres + d(i)=1.0D-1 + enddo + + k=0 + do i=1,nres-1 + do j=1,3 + k=k+1 + x(k)=dc(j,i) + enddo + enddo + do i=2,nres-1 + if (ialph(i,1).gt.0) then + do j=1,3 + k=k+1 + x(k)=dc(j,i+nres) + enddo + endif + enddo + + call sumsl(k,d,x,func_dc,grad_dc,iv,liv,lv,v,idum,rdum,fdum) + + k=0 + do i=1,nres-1 + do j=1,3 + k=k+1 + dc(j,i)=x(k) + enddo + enddo + do i=2,nres-1 + if (ialph(i,1).gt.0) then + do j=1,3 + k=k+1 + dc(j,i+nres)=x(k) + enddo + endif + enddo + call chainbuild_cart + +cd call zerograd +cd nf=0 +cd call func_dc(k,x,nf,f,idum,rdum,fdum) +cd call grad_dc(k,x,nf,g,idum,rdum,fdum) +cd +cd do i=1,k +cd x(i)=x(i)+1.0D-5 +cd call func_dc(k,x,nf,f1,idum,rdum,fdum) +cd x(i)=x(i)-1.0D-5 +cd print '(i5,2f15.5)',i,g(i),(f1-f)/1.0D-5 +cd enddo + + etot=v(10) + iretcode=iv(1) + nfun=iv(6) + return + end + + subroutine func_dc(n,x,nf,f,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + double precision energia(0:n_ene) + double precision ufparm + external ufparm + integer uiparm(1) + real*8 urparm(1) + dimension x(maxvar) + nfl=nf +cbad icg=mod(nf,2)+1 + icg=1 + + k=0 + do i=1,nres-1 + do j=1,3 + k=k+1 + dc(j,i)=x(k) + enddo + enddo + do i=2,nres-1 + if (ialph(i,1).gt.0) then + do j=1,3 + k=k+1 + dc(j,i+nres)=x(k) + enddo + endif + enddo + call chainbuild_cart + + call zerograd + call etotal(energia(0)) + f=energia(0) + +cd print *,'func_dc ',nf,nfl,f + + return + end + + subroutine grad_dc(n,x,nf,g,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.MD' + include 'COMMON.IOUNITS' + external ufparm + integer uiparm(1),k + double precision urparm(1) + dimension x(maxvar),g(maxvar) +c +c +c +cbad icg=mod(nf,2)+1 + icg=1 +cd print *,'grad_dc ',nf,nfl,nf-nfl+1,icg + if (nf-nfl+1) 20,30,40 + 20 call func_dc(n,x,nf,f,uiparm,urparm,ufparm) +cd print *,20 + if (nf.eq.0) return + goto 40 + 30 continue +cd print *,30 + k=0 + do i=1,nres-1 + do j=1,3 + k=k+1 + dc(j,i)=x(k) + enddo + enddo + do i=2,nres-1 + if (ialph(i,1).gt.0) then + do j=1,3 + k=k+1 + dc(j,i+nres)=x(k) + enddo + endif + enddo + call chainbuild_cart + +C +C Evaluate the derivatives of virtual bond lengths and SC vectors in variables. +C + 40 call cartgrad +cd print *,40 + k=0 + do i=1,nres-1 + do j=1,3 + k=k+1 + g(k)=gcart(j,i) + enddo + enddo + do i=2,nres-1 + if (ialph(i,1).gt.0) then + do j=1,3 + k=k+1 + g(k)=gxcart(j,i) + enddo + endif + enddo + + return + end diff --git a/source/unres/src_MD-NEWSC/misc.f b/source/unres/src_MD-NEWSC/misc.f new file mode 100644 index 0000000..e189839 --- /dev/null +++ b/source/unres/src_MD-NEWSC/misc.f @@ -0,0 +1,203 @@ +C $Date: 1994/10/12 17:24:21 $ +C $Revision: 2.5 $ +C +C +C + logical function find_arg(ipos,line,errflag) + parameter (maxlen=80) + character*80 line + character*1 empty /' '/,equal /'='/ + logical errflag +* This function returns .TRUE., if an argument follows keyword keywd; if so +* IPOS will point to the first non-blank character of the argument. Returns +* .FALSE., if no argument follows the keyword; in this case IPOS points +* to the first non-blank character of the next keyword. + do while (line(ipos:ipos) .eq. empty .and. ipos.le.maxlen) + ipos=ipos+1 + enddo + errflag=.false. + if (line(ipos:ipos).eq.equal) then + find_arg=.true. + ipos=ipos+1 + do while (line(ipos:ipos) .eq. empty .and. ipos.le.maxlen) + ipos=ipos+1 + enddo + if (ipos.gt.maxlen) errflag=.true. + else + find_arg=.false. + endif + return + end + logical function find_group(iunit,jout,key1) + character*(*) key1 + character*80 karta,ucase + integer ilen + external ilen + logical lcom + rewind (iunit) + karta=' ' + ll=ilen(key1) + do while (index(ucase(karta),key1(1:ll)).eq.0.or.lcom(1,karta)) + read (iunit,'(a)',end=10) karta + enddo + write (jout,'(2a)') '> ',karta(1:78) + find_group=.true. + return + 10 find_group=.false. + return + end + logical function iblnk(charc) + character*1 charc + integer n + n = ichar(charc) + iblnk = (n.eq.9) .or. (n.eq.10) .or. (charc.eq. ' ') + return + end + integer function ilen(string) + character*(*) string + logical iblnk + + ilen = len(string) +1 if ( ilen .gt. 0 ) then + if ( iblnk( string(ilen:ilen) ) ) then + ilen = ilen - 1 + goto 1 + endif + endif + return + end + integer function in_keywd_set(nkey,ikey,narg,keywd,keywdset) + character*16 keywd,keywdset(1:nkey,0:nkey) + character*16 ucase + do i=1,narg + if (ucase(keywd).eq.keywdset(i,ikey)) then +* Match found + in_keywd_set=i + return + endif + enddo +* No match to the allowed set of keywords if this point is reached. + in_keywd_set=0 + return + end + character*(*) function lcase(string) + integer i, k, idiff + character*(*) string + character*1 c + character*40 chtmp +c + i = len(lcase) + k = len(string) + if (i .lt. k) then + k = i + if (string(k+1:) .ne. ' ') then + chtmp = string + endif + endif + idiff = ichar('a') - ichar('A') + lcase = string + do 99 i = 1, k + c = string(i:i) + if (lge(c,'A') .and. lle(c,'Z')) then + lcase(i:i) = char(ichar(c) + idiff) + endif + 99 continue + return + end + logical function lcom(ipos,karta) + character*80 karta + character koment(2) /'!','#'/ + lcom=.false. + do i=1,2 + if (karta(ipos:ipos).eq.koment(i)) lcom=.true. + enddo + return + end + logical function lower_case(ch) + character*(*) ch + lower_case=(ch.ge.'a' .and. ch.le.'z') + return + end + subroutine mykey(line,keywd,ipos,blankline,errflag) +* This subroutine seeks a non-empty substring keywd in the string LINE. +* The substring begins with the first character different from blank and +* "=" encountered right to the pointer IPOS (inclusively) and terminates +* at the character left to the first blank or "=". When the subroutine is +* exited, the pointer IPOS is moved to the position of the terminator in LINE. +* The logical variable BLANKLINE is set at .TRUE., if LINE(IPOS:) contains +* only separators or the maximum length of the data line (80) has been reached. +* The logical variable ERRFLAG is set at .TRUE. if the string +* consists only from a "=". + parameter (maxlen=80) + character*1 empty /' '/,equal /'='/,comma /','/ + character*(*) keywd + character*80 line + logical blankline,errflag,lcom + errflag=.false. + do while (line(ipos:ipos).eq.empty .and. (ipos.le.maxlen)) + ipos=ipos+1 + enddo + if (ipos.gt.maxlen .or. lcom(ipos,line) ) then +* At this point the rest of the input line turned out to contain only blanks +* or to be commented out. + blankline=.true. + return + endif + blankline=.false. + istart=ipos +* Checks whether the current char is a separator. + do while (line(ipos:ipos).ne.empty .and. line(ipos:ipos).ne.equal + & .and. line(ipos:ipos).ne.comma .and. ipos.le.maxlen) + ipos=ipos+1 + enddo + iend=ipos-1 +* Error flag set to .true., if the length of the keyword was found less than 1. + if (iend.lt.istart) then + errflag=.true. + return + endif + keywd=line(istart:iend) + return + end + subroutine numstr(inum,numm) + character*10 huj /'0123456789'/ + character*(*) numm + inumm=inum + inum1=inumm/10 + inum2=inumm-10*inum1 + inumm=inum1 + numm(3:3)=huj(inum2+1:inum2+1) + inum1=inumm/10 + inum2=inumm-10*inum1 + inumm=inum1 + numm(2:2)=huj(inum2+1:inum2+1) + inum1=inumm/10 + inum2=inumm-10*inum1 + inumm=inum1 + numm(1:1)=huj(inum2+1:inum2+1) + return + end + character*(*) function ucase(string) + integer i, k, idiff + character*(*) string + character*1 c + character*40 chtmp +c + i = len(ucase) + k = len(string) + if (i .lt. k) then + k = i + if (string(k+1:) .ne. ' ') then + chtmp = string + endif + endif + idiff = ichar('a') - ichar('A') + ucase = string + do 99 i = 1, k + c = string(i:i) + if (lge(c,'a') .and. lle(c,'z')) then + ucase(i:i) = char(ichar(c) - idiff) + endif + 99 continue + return + end diff --git a/source/unres/src_MD-NEWSC/moments.f b/source/unres/src_MD-NEWSC/moments.f new file mode 100644 index 0000000..5adbf21 --- /dev/null +++ b/source/unres/src_MD-NEWSC/moments.f @@ -0,0 +1,328 @@ + subroutine inertia_tensor +c Calculating the intertia tensor for the entire protein in order to +c remove the perpendicular components of velocity matrix which cause +c the molecule to rotate. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + + double precision Im(3,3),Imcp(3,3),cm(3),pr(3),M_SC, + & eigvec(3,3),Id(3,3),eigval(3),L(3),vp(3),vrot(3), + & vpp(3,0:MAXRES),vs_p(3),pr1(3,3), + & pr2(3,3),pp(3),incr(3),v(3),mag,mag2 + common /gucio/ cm + integer iti,inres + do i=1,3 + do j=1,3 + Im(i,j)=0.0d0 + pr1(i,j)=0.0d0 + pr2(i,j)=0.0d0 + enddo + L(i)=0.0d0 + cm(i)=0.0d0 + vrot(i)=0.0d0 + enddo +c calculating the center of the mass of the protein + do i=nnt,nct-1 + do j=1,3 + cm(j)=cm(j)+c(j,i)+0.5d0*dc(j,i) + enddo + enddo + do j=1,3 + cm(j)=mp*cm(j) + enddo + M_SC=0.0d0 + do i=nnt,nct + iti=itype(i) + M_SC=M_SC+msc(iti) + inres=i+nres + do j=1,3 + cm(j)=cm(j)+msc(iti)*c(j,inres) + enddo + enddo + do j=1,3 + cm(j)=cm(j)/(M_SC+(nct-nnt)*mp) + enddo + + do i=nnt,nct-1 + do j=1,3 + pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j) + enddo + Im(1,1)=Im(1,1)+mp*(pr(2)*pr(2)+pr(3)*pr(3)) + Im(1,2)=Im(1,2)-mp*pr(1)*pr(2) + Im(1,3)=Im(1,3)-mp*pr(1)*pr(3) + Im(2,3)=Im(2,3)-mp*pr(2)*pr(3) + Im(2,2)=Im(2,2)+mp*(pr(3)*pr(3)+pr(1)*pr(1)) + Im(3,3)=Im(3,3)+mp*(pr(1)*pr(1)+pr(2)*pr(2)) + enddo + + do i=nnt,nct + iti=itype(i) + inres=i+nres + do j=1,3 + pr(j)=c(j,inres)-cm(j) + enddo + Im(1,1)=Im(1,1)+msc(iti)*(pr(2)*pr(2)+pr(3)*pr(3)) + Im(1,2)=Im(1,2)-msc(iti)*pr(1)*pr(2) + Im(1,3)=Im(1,3)-msc(iti)*pr(1)*pr(3) + Im(2,3)=Im(2,3)-msc(iti)*pr(2)*pr(3) + Im(2,2)=Im(2,2)+msc(iti)*(pr(3)*pr(3)+pr(1)*pr(1)) + Im(3,3)=Im(3,3)+msc(iti)*(pr(1)*pr(1)+pr(2)*pr(2)) + enddo + + do i=nnt,nct-1 + Im(1,1)=Im(1,1)+Ip*(1-dc_norm(1,i)*dc_norm(1,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + Im(1,2)=Im(1,2)+Ip*(-dc_norm(1,i)*dc_norm(2,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + Im(1,3)=Im(1,3)+Ip*(-dc_norm(1,i)*dc_norm(3,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + Im(2,3)=Im(2,3)+Ip*(-dc_norm(2,i)*dc_norm(3,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + Im(2,2)=Im(2,2)+Ip*(1-dc_norm(2,i)*dc_norm(2,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + Im(3,3)=Im(3,3)+Ip*(1-dc_norm(3,i)*dc_norm(3,i))* + & vbld(i+1)*vbld(i+1)*0.25d0 + enddo + + + do i=nnt,nct + if (itype(i).ne.10) then + iti=itype(i) + inres=i+nres + Im(1,1)=Im(1,1)+Isc(iti)*(1-dc_norm(1,inres)* + & dc_norm(1,inres))*vbld(inres)*vbld(inres) + Im(1,2)=Im(1,2)-Isc(iti)*(dc_norm(1,inres)* + & dc_norm(2,inres))*vbld(inres)*vbld(inres) + Im(1,3)=Im(1,3)-Isc(iti)*(dc_norm(1,inres)* + & dc_norm(3,inres))*vbld(inres)*vbld(inres) + Im(2,3)=Im(2,3)-Isc(iti)*(dc_norm(2,inres)* + & dc_norm(3,inres))*vbld(inres)*vbld(inres) + Im(2,2)=Im(2,2)+Isc(iti)*(1-dc_norm(2,inres)* + & dc_norm(2,inres))*vbld(inres)*vbld(inres) + Im(3,3)=Im(3,3)+Isc(iti)*(1-dc_norm(3,inres)* + & dc_norm(3,inres))*vbld(inres)*vbld(inres) + endif + enddo + + call angmom(cm,L) +c write(iout,*) "The angular momentum before adjustment:" +c write(iout,*) (L(j),j=1,3) + + Im(2,1)=Im(1,2) + Im(3,1)=Im(1,3) + Im(3,2)=Im(2,3) + +c Copying the Im matrix for the djacob subroutine + do i=1,3 + do j=1,3 + Imcp(i,j)=Im(i,j) + Id(i,j)=0.0d0 + enddo + enddo + +c Finding the eigenvectors and eignvalues of the inertia tensor + call djacob(3,3,10000,1.0d-10,Imcp,eigvec,eigval) +c write (iout,*) "Eigenvalues & Eigenvectors" +c write (iout,'(5x,3f10.5)') (eigval(i),i=1,3) +c write (iout,*) +c do i=1,3 +c write (iout,'(i5,3f10.5)') i,(eigvec(i,j),j=1,3) +c enddo +c Constructing the diagonalized matrix + do i=1,3 + if (dabs(eigval(i)).gt.1.0d-15) then + Id(i,i)=1.0d0/eigval(i) + else + Id(i,i)=0.0d0 + endif + enddo + do i=1,3 + do j=1,3 + Imcp(i,j)=eigvec(j,i) + enddo + enddo + do i=1,3 + do j=1,3 + do k=1,3 + pr1(i,j)=pr1(i,j)+Id(i,k)*Imcp(k,j) + enddo + enddo + enddo + do i=1,3 + do j=1,3 + do k=1,3 + pr2(i,j)=pr2(i,j)+eigvec(i,k)*pr1(k,j) + enddo + enddo + enddo +c Calculating the total rotational velocity of the molecule + do i=1,3 + do j=1,3 + vrot(i)=vrot(i)+pr2(i,j)*L(j) + enddo + enddo +c Resetting the velocities + do i=nnt,nct-1 + call vecpr(vrot(1),dc(1,i),vp) + do j=1,3 + d_t(j,i)=d_t(j,i)-vp(j) + enddo + enddo + do i=nnt,nct + if(itype(i).ne.10) then + inres=i+nres + call vecpr(vrot(1),dc(1,inres),vp) + do j=1,3 + d_t(j,inres)=d_t(j,inres)-vp(j) + enddo + endif + enddo + call angmom(cm,L) +c write(iout,*) "The angular momentum after adjustment:" +c write(iout,*) (L(j),j=1,3) + return + end +c---------------------------------------------------------------------------- + subroutine angmom(cm,L) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + + double precision L(3),cm(3),pr(3),vp(3),vrot(3),incr(3),v(3), + & pp(3) + integer iti,inres +c Calculate the angular momentum + do j=1,3 + L(j)=0.0d0 + enddo + do j=1,3 + incr(j)=d_t(j,0) + enddo + do i=nnt,nct-1 + do j=1,3 + pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j) + enddo + do j=1,3 + v(j)=incr(j)+0.5d0*d_t(j,i) + enddo + do j=1,3 + incr(j)=incr(j)+d_t(j,i) + enddo + call vecpr(pr(1),v(1),vp) + do j=1,3 + L(j)=L(j)+mp*vp(j) + enddo + do j=1,3 + pr(j)=0.5d0*dc(j,i) + pp(j)=0.5d0*d_t(j,i) + enddo + call vecpr(pr(1),pp(1),vp) + do j=1,3 + L(j)=L(j)+Ip*vp(j) + enddo + enddo + do j=1,3 + incr(j)=d_t(j,0) + enddo + do i=nnt,nct + iti=itype(i) + inres=i+nres + do j=1,3 + pr(j)=c(j,inres)-cm(j) + enddo + if (itype(i).ne.10) then + do j=1,3 + v(j)=incr(j)+d_t(j,inres) + enddo + else + do j=1,3 + v(j)=incr(j) + enddo + endif + call vecpr(pr(1),v(1),vp) +c write (iout,*) "i",i," iti",iti," pr",(pr(j),j=1,3), +c & " v",(v(j),j=1,3)," vp",(vp(j),j=1,3) + do j=1,3 + L(j)=L(j)+msc(iti)*vp(j) + enddo +c write (iout,*) "L",(l(j),j=1,3) + if (itype(i).ne.10) then + do j=1,3 + v(j)=incr(j)+d_t(j,inres) + enddo + call vecpr(dc(1,inres),d_t(1,inres),vp) + do j=1,3 + L(j)=L(j)+Isc(iti)*vp(j) + enddo + endif + do j=1,3 + incr(j)=incr(j)+d_t(j,i) + enddo + enddo + return + end +c------------------------------------------------------------------------------ + subroutine vcm_vel(vcm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.MD' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + double precision vcm(3),vv(3),summas,amas + do j=1,3 + vcm(j)=0.0d0 + vv(j)=d_t(j,0) + enddo + summas=0.0d0 + do i=nnt,nct + if (i.lt.nct) then + summas=summas+mp + do j=1,3 + vcm(j)=vcm(j)+mp*(vv(j)+0.5d0*d_t(j,i)) + enddo + endif + amas=msc(itype(i)) + summas=summas+amas + if (itype(i).ne.10) then + do j=1,3 + vcm(j)=vcm(j)+amas*(vv(j)+d_t(j,i+nres)) + enddo + else + do j=1,3 + vcm(j)=vcm(j)+amas*vv(j) + enddo + endif + do j=1,3 + vv(j)=vv(j)+d_t(j,i) + enddo + enddo +c write (iout,*) "vcm",(vcm(j),j=1,3)," summas",summas + do j=1,3 + vcm(j)=vcm(j)/summas + enddo + return + end diff --git a/source/unres/src_MD-NEWSC/muca_md.f b/source/unres/src_MD-NEWSC/muca_md.f new file mode 100644 index 0000000..c10a6a7 --- /dev/null +++ b/source/unres/src_MD-NEWSC/muca_md.f @@ -0,0 +1,334 @@ + subroutine muca_delta(remd_t_bath,remd_ene,i,iex,delta) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + include 'COMMON.MD' + double precision remd_t_bath(maxprocs) + double precision remd_ene(maxprocs) + double precision muca_ene + double precision betai,betaiex,delta + + betai=1.0/(Rb*remd_t_bath(i)) + betaiex=1.0/(Rb*remd_t_bath(iex)) + + delta=betai*(muca_ene(remd_ene(iex),i,remd_t_bath)- + & muca_ene(remd_ene(i),i,remd_t_bath)) + & -betaiex*(muca_ene(remd_ene(iex),iex,remd_t_bath)- + & muca_ene(remd_ene(i),iex,remd_t_bath)) + + return + end + + double precision function muca_ene(energy,i,remd_t_bath) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + include 'COMMON.MD' + double precision y,yp,energy + double precision remd_t_bath(maxprocs) + integer i + + if (energy.lt.elowi(i)) then + call splint(emuca,nemuca,nemuca2,nmuca,elowi(i),y,yp) + muca_ene=remd_t_bath(i)*Rb*(yp*(energy-elowi(i))+y) + elseif (energy.gt.ehighi(i)) then + call splint(emuca,nemuca,nemuca2,nmuca,ehighi(i),y,yp) + muca_ene=remd_t_bath(i)*Rb*(yp*(energy-ehighi(i))+y) + else + call splint(emuca,nemuca,nemuca2,nmuca,energy,y,yp) + muca_ene=remd_t_bath(i)*Rb*y + endif + return + end + + subroutine read_muca + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + include 'COMMON.CONTROL' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision yp1,ypn,yp,x,muca_factor,y,muca_ene + imtime=0 + do i=1,4*maxres + hist(i)=0 + enddo + if (modecalc.eq.14.and..not.remd_tlist) then + print *,"MUCAREMD works only with TLIST" + stop + endif + open(89,file='muca.input') + read(89,*) + read(89,*) + if (modecalc.eq.14) then + read(89,*) (elowi(i),ehighi(i),i=1,nrep) + if (remd_mlist) then + k=0 + do i=1,nrep + do j=1,remd_m(i) + i2rep(k)=i + k=k+1 + enddo + enddo + elow=elowi(i2rep(me)) + ehigh=ehighi(i2rep(me)) + elowi(me+1)=elow + ehighi(me+1)=ehigh + else + elow=elowi(me+1) + ehigh=ehighi(me+1) + endif + else + read(89,*) elow,ehigh + elowi(1)=elow + ehighi(1)=ehigh + endif + i=0 + do while(.true.) + i=i+1 + read(89,*,end=100) emuca(i),nemuca(i) +cd nemuca(i)=nemuca(i)*remd_t(me+1)*Rb + enddo + 100 continue + nmuca=i-1 + hbin=emuca(nmuca)-emuca(nmuca-1) + write (iout,*) 'hbin',hbin + write (iout,*) me,'elow,ehigh',elow,ehigh + yp1=0 + ypn=0 + call spline(emuca,nemuca,nmuca,yp1,ypn,nemuca2) + factor_min=0.0d0 + factor_min=muca_factor(ehigh) + call print_muca + return + end + + + subroutine print_muca + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + include 'COMMON.CONTROL' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision yp1,ypn,yp,x,muca_factor,y,muca_ene + double precision dummy(maxprocs) + + if (remd_mlist) then + k=0 + do i=1,nrep + do j=1,remd_m(i) + i2rep(k)=i + k=k+1 + enddo + enddo + endif + + do i=1,nmuca +c print *,'nemuca ',emuca(i),nemuca(i) + do j=0,4 + x=emuca(i)+hbin/5*j + if (modecalc.eq.14) then + if (remd_mlist) then + yp=muca_factor(x)*remd_t(i2rep(me))*Rb + dummy(me+1)=remd_t(i2rep(me)) + y=muca_ene(x,me+1,dummy) + else + yp=muca_factor(x)*remd_t(me+1)*Rb + y=muca_ene(x,me+1,remd_t) + endif + write (iout,'(i4,i12,a12,2f15.5,a10,f15.5)') me,imtime, + & 'muca factor ',x,yp,' muca ene',y + else + yp=muca_factor(x)*t_bath*Rb + dummy(1)=t_bath + y=muca_ene(x,1,dummy) + write (iout,'(i4,i12,a12,2f15.5,a10,f15.5)') me,imtime, + & 'muca factor ',x,yp,' muca ene',y + endif + enddo + enddo + if(mucadyn.gt.0) then + do i=1,nmuca + write(iout,'(a13,i8,2f12.5)') 'nemuca after ', + & imtime,emuca(i),nemuca(i) + enddo + endif + return + end + + subroutine muca_update(energy) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + include 'COMMON.CONTROL' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + double precision energy + double precision yp1,ypn + integer k + logical lnotend + + k=int((energy-emuca(1))/hbin)+1 + + IF(muca_smooth.eq.1.or.muca_smooth.eq.3) THEN + if(energy.ge.ehigh) + & write (iout,*) 'MUCA reject',energy,emuca(k) + if(energy.ge.ehigh.and.(energy-ehigh).lt.hbin) then + write (iout,*) 'MUCA ehigh',energy,emuca(k) + do i=k,nmuca + hist(i)=hist(i)+1 + enddo + endif + if(k.gt.0.and.energy.lt.ehigh) hist(k)=hist(k)+1 + ELSE + if(k.gt.0.and.k.lt.4*maxres) hist(k)=hist(k)+1 + ENDIF + if(mod(imtime,mucadyn).eq.0) then + + do i=1,nmuca + IF(muca_smooth.eq.2.or.muca_smooth.eq.3) THEN + nemuca(i)=nemuca(i)+dlog(hist(i)+1) + ELSE + if (hist(i).gt.0) hist(i)=dlog(hist(i)) + nemuca(i)=nemuca(i)+hist(i) + ENDIF + hist(i)=0 + write(iout,'(a24,i8,2f12.5)')'nemuca before smoothing ', + & imtime,emuca(i),nemuca(i) + enddo + + + lnotend=.true. + ismooth=0 + ist=2 + ien=nmuca-1 + IF(muca_smooth.eq.1.or.muca_smooth.eq.3) THEN +c lnotend=.false. +c do i=1,nmuca-1 +c do j=i+1,nmuca +c if(nemuca(j).lt.nemuca(i)) lnotend=.true. +c enddo +c enddo + do while(lnotend) + ismooth=ismooth+1 + write (iout,*) 'MUCA update smoothing',ist,ien + do i=ist,ien + nemuca(i)=(nemuca(i-1)+nemuca(i)+nemuca(i+1))/3 + enddo + lnotend=.false. + ist=0 + ien=0 + do i=1,nmuca-1 + do j=i+1,nmuca + if(nemuca(j).lt.nemuca(i)) then + lnotend=.true. + if(ist.eq.0) ist=i-1 + if(ien.lt.j+1) ien=j+1 + endif + enddo + enddo + enddo + ENDIF + + write (iout,*) 'MUCA update ',imtime,' smooth= ',ismooth + yp1=0 + ypn=0 + call spline(emuca,nemuca,nmuca,yp1,ypn,nemuca2) + call print_muca + + endif + return + end + + double precision function muca_factor(energy) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MUCA' + double precision y,yp,energy + + if (energy.lt.elow) then + call splint(emuca,nemuca,nemuca2,nmuca,elow,y,yp) + elseif (energy.gt.ehigh) then + call splint(emuca,nemuca,nemuca2,nmuca,ehigh,y,yp) + else + call splint(emuca,nemuca,nemuca2,nmuca,energy,y,yp) + endif + + if(yp.ge.factor_min) then + muca_factor=yp + else + muca_factor=factor_min + endif +cd print *,'energy, muca_factor',energy,muca_factor + return + end + + + SUBROUTINE spline(x,y,n,yp1,ypn,y2) + INTEGER n,NMAX + REAL*8 yp1,ypn,x(n),y(n),y2(n) + PARAMETER (NMAX=500) + INTEGER i,k + REAL*8 p,qn,sig,un,u(NMAX) + if (yp1.gt..99e30) then + y2(1)=0. + u(1)=0. + else + y2(1)=-0.5 + u(1)=(3./(x(2)-x(1)))*((y(2)-y(1))/(x(2)-x(1))-yp1) + endif + do i=2,n-1 + sig=(x(i)-x(i-1))/(x(i+1)-x(i-1)) + p=sig*y2(i-1)+2. + y2(i)=(sig-1.)/p + u(i)=(6.*((y(i+1)-y(i))/(x(i+1)-x(i))-(y(i)-y(i-1)) + * /(x(i)-x(i-1)))/(x(i+1)-x(i-1))-sig*u(i-1))/p + enddo + if (ypn.gt..99e30) then + qn=0. + un=0. + else + qn=0.5 + un=(3./(x(n)-x(n-1)))*(ypn-(y(n)-y(n-1))/(x(n)-x(n-1))) + endif + y2(n)=(un-qn*u(n-1))/(qn*y2(n-1)+1.) + do k=n-1,1,-1 + y2(k)=y2(k)*y2(k+1)+u(k) + enddo + return + END + + + SUBROUTINE splint(xa,ya,y2a,n,x,y,yp) + INTEGER n + REAL*8 x,y,xa(n),y2a(n),ya(n),yp + INTEGER k,khi,klo + REAL*8 a,b,h + klo=1 + khi=n + 1 if (khi-klo.gt.1) then + k=(khi+klo)/2 + if (xa(k).gt.x) then + khi=k + else + klo=k + endif + goto 1 + endif + h=xa(khi)-xa(klo) + if (h.eq.0.) pause 'bad xa input in splint' + a=(xa(khi)-x)/h + b=(x-xa(klo))/h + y=a*ya(klo)+b*ya(khi)+ + * ((a**3-a)*y2a(klo)+(b**3-b)*y2a(khi))*(h**2)/6. + yp=-ya(klo)/h+ya(khi)/h-3*(a**2)*y2a(klo)*h/6. + + +(3*(b**2)-1)*y2a(khi)*h/6. + return + END diff --git a/source/unres/src_MD-NEWSC/parmread.F b/source/unres/src_MD-NEWSC/parmread.F new file mode 100644 index 0000000..7fe7caf --- /dev/null +++ b/source/unres/src_MD-NEWSC/parmread.F @@ -0,0 +1,1223 @@ + subroutine parmread +C +C Read the parameters of the probability distributions of the virtual-bond +C valence angles and the side chains and energy parameters. +C +C Important! Energy-term weights ARE NOT read here; they are read from the +C main input file instead, because NO defaults have yet been set for these +C parameters. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" + integer IERROR +#endif + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.SCCOR' + include 'COMMON.SCROT' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + include 'COMMON.SBRIDGE' + include 'COMMON.MD' + include 'COMMON.SETUP' + character*1 t1,t2,t3 + character*1 onelett(4) /"G","A","P","D"/ + logical lprint,LaTeX + dimension blower(3,3,maxlob) + dimension b(13) + character*3 lancuch,ucase +C +C For printing parameters after they are read set the following in the UNRES +C C-shell script: +C +C setenv PRINT_PARM YES +C +C To print parameters in LaTeX format rather than as ASCII tables: +C +C setenv LATEX YES +C + call getenv_loc("PRINT_PARM",lancuch) + lprint = (ucase(lancuch).eq."YES" .or. ucase(lancuch).eq."Y") + call getenv_loc("LATEX",lancuch) + LaTeX = (ucase(lancuch).eq."YES" .or. ucase(lancuch).eq."Y") +C + dwa16=2.0d0**(1.0d0/6.0d0) + itypro=20 +C Assign virtual-bond length + vbl=3.8D0 + vblinv=1.0D0/vbl + vblinv2=vblinv*vblinv +c +c Read the virtual-bond parameters, masses, and moments of inertia +c and Stokes' radii of the peptide group and side chains +c +#ifdef CRYST_BOND + read (ibond,*) vbldp0,akp,mp,ip,pstok + do i=1,ntyp + nbondterm(i)=1 + read (ibond,*) vbldsc0(1,i),aksc(1,i),msc(i),isc(i),restok(i) + dsc(i) = vbldsc0(1,i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + enddo +#else + read (ibond,*) junk,vbldp0,akp,rjunk,mp,ip,pstok + do i=1,ntyp + read (ibond,*) nbondterm(i),(vbldsc0(j,i),aksc(j,i),abond0(j,i), + & j=1,nbondterm(i)),msc(i),isc(i),restok(i) + dsc(i) = vbldsc0(1,i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + enddo +#endif + if (lprint) then + write(iout,'(/a/)')"Dynamic constants of the interaction sites:" + write (iout,'(a10,a3,6a10)') 'Type','N','VBL','K','A0','mass', + & 'inertia','Pstok' + write(iout,'(a10,i3,6f10.5)') "p",1,vbldp0,akp,0.0d0,mp,ip,pstok + do i=1,ntyp + write (iout,'(a10,i3,6f10.5)') restyp(i),nbondterm(i), + & vbldsc0(1,i),aksc(1,i),abond0(1,i),msc(i),isc(i),restok(i) + do j=2,nbondterm(i) + write (iout,'(13x,3f10.5)') + & vbldsc0(j,i),aksc(j,i),abond0(j,i) + enddo + enddo + endif +#ifdef CRYST_THETA +C +C Read the parameters of the probability distribution/energy expression +C of the virtual-bond valence angles theta +C + do i=1,ntyp + read (ithep,*,err=111,end=111) a0thet(i),(athet(j,i),j=1,2), + & (bthet(j,i),j=1,2) + read (ithep,*,err=111,end=111) (polthet(j,i),j=0,3) + read (ithep,*,err=111,end=111) (gthet(j,i),j=1,3) + read (ithep,*,err=111,end=111) theta0(i),sig0(i),sigc0(i) + sigc0(i)=sigc0(i)**2 + enddo + close (ithep) + if (lprint) then + if (.not.LaTeX) then + write (iout,'(a)') + & 'Parameters of the virtual-bond valence angles:' + write (iout,'(/a/9x,5a/79(1h-))') 'Fourier coefficients:', + & ' ATHETA0 ',' A1 ',' A2 ', + & ' B1 ',' B2 ' + do i=1,ntyp + write(iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i, + & a0thet(i),(athet(j,i),j=1,2),(bthet(j,i),j=1,2) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the expression for sigma(theta_c):', + & ' ALPH0 ',' ALPH1 ',' ALPH2 ', + & ' ALPH3 ',' SIGMA0C ' + do i=1,ntyp + write (iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i, + & (polthet(j,i),j=0,3),sigc0(i) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the second gaussian:', + & ' THETA0 ',' SIGMA0 ',' G1 ', + & ' G2 ',' G3 ' + do i=1,ntyp + write (iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i,theta0(i), + & sig0(i),(gthet(j,i),j=1,3) + enddo + else + write (iout,'(a)') + & 'Parameters of the virtual-bond valence angles:' + write (iout,'(/a/9x,5a/79(1h-))') + & 'Coefficients of expansion', + & ' theta0 ',' a1*10^2 ',' a2*10^2 ', + & ' b1*10^1 ',' b2*10^1 ' + do i=1,ntyp + write(iout,'(a3,1h&,2x,5(f8.3,1h&))') restyp(i), + & a0thet(i),(100*athet(j,i),j=1,2),(10*bthet(j,i),j=1,2) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the expression for sigma(theta_c):', + & ' alpha0 ',' alph1 ',' alph2 ', + & ' alhp3 ',' sigma0c ' + do i=1,ntyp + write (iout,'(a3,1h&,2x,5(1pe12.3,1h&))') restyp(i), + & (polthet(j,i),j=0,3),sigc0(i) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the second gaussian:', + & ' theta0 ',' sigma0*10^2 ',' G1*10^-1', + & ' G2 ',' G3*10^1 ' + do i=1,ntyp + write (iout,'(a3,1h&,2x,5(f8.3,1h&))') restyp(i),theta0(i), + & 100*sig0(i),gthet(1,i)*0.1D0,gthet(2,i),gthet(3,i)*10.0D0 + enddo + endif + endif +#else +C +C Read the parameters of Utheta determined from ab initio surfaces +C Kozlowska et al., J. Phys.: Condens. Matter 19 (2007) 285203 +C + read (ithep,*,err=111,end=111) nthetyp,ntheterm,ntheterm2, + & ntheterm3,nsingle,ndouble + nntheterm=max0(ntheterm,ntheterm2,ntheterm3) + read (ithep,*,err=111,end=111) (ithetyp(i),i=1,ntyp1) + do i=1,maxthetyp + do j=1,maxthetyp + do k=1,maxthetyp + aa0thet(i,j,k)=0.0d0 + do l=1,ntheterm + aathet(l,i,j,k)=0.0d0 + enddo + do l=1,ntheterm2 + do m=1,nsingle + bbthet(m,l,i,j,k)=0.0d0 + ccthet(m,l,i,j,k)=0.0d0 + ddthet(m,l,i,j,k)=0.0d0 + eethet(m,l,i,j,k)=0.0d0 + enddo + enddo + do l=1,ntheterm3 + do m=1,ndouble + do mm=1,ndouble + ffthet(mm,m,l,i,j,k)=0.0d0 + ggthet(mm,m,l,i,j,k)=0.0d0 + enddo + enddo + enddo + enddo + enddo + enddo + do i=1,nthetyp + do j=1,nthetyp + do k=1,nthetyp + read (ithep,'(3a)',end=111,err=111) res1,res2,res3 + read (ithep,*,end=111,err=111) aa0thet(i,j,k) + read (ithep,*,end=111,err=111)(aathet(l,i,j,k),l=1,ntheterm) + read (ithep,*,end=111,err=111) + & ((bbthet(lll,ll,i,j,k),lll=1,nsingle), + & (ccthet(lll,ll,i,j,k),lll=1,nsingle), + & (ddthet(lll,ll,i,j,k),lll=1,nsingle), + & (eethet(lll,ll,i,j,k),lll=1,nsingle),ll=1,ntheterm2) + read (ithep,*,end=111,err=111) + & (((ffthet(llll,lll,ll,i,j,k),ffthet(lll,llll,ll,i,j,k), + & ggthet(llll,lll,ll,i,j,k),ggthet(lll,llll,ll,i,j,k), + & llll=1,lll-1),lll=2,ndouble),ll=1,ntheterm3) + enddo + enddo + enddo +C +C For dummy ends assign glycine-type coefficients of theta-only terms; the +C coefficients of theta-and-gamma-dependent terms are zero. +C + do i=1,nthetyp + do j=1,nthetyp + do l=1,ntheterm + aathet(l,i,j,nthetyp+1)=aathet(l,i,j,1) + aathet(l,nthetyp+1,i,j)=aathet(l,1,i,j) + enddo + aa0thet(i,j,nthetyp+1)=aa0thet(i,j,1) + aa0thet(nthetyp+1,i,j)=aa0thet(1,i,j) + enddo + do l=1,ntheterm + aathet(l,nthetyp+1,i,nthetyp+1)=aathet(l,1,i,1) + enddo + aa0thet(nthetyp+1,i,nthetyp+1)=aa0thet(1,i,1) + enddo +C +C Control printout of the coefficients of virtual-bond-angle potentials +C + if (lprint) then + write (iout,'(//a)') 'Parameter of virtual-bond-angle potential' + do i=1,nthetyp+1 + do j=1,nthetyp+1 + do k=1,nthetyp+1 + write (iout,'(//4a)') + & 'Type ',onelett(i),onelett(j),onelett(k) + write (iout,'(//a,10x,a)') " l","a[l]" + write (iout,'(i2,1pe15.5)') 0,aa0thet(i,j,k) + write (iout,'(i2,1pe15.5)') + & (l,aathet(l,i,j,k),l=1,ntheterm) + do l=1,ntheterm2 + write (iout,'(//2h m,4(9x,a,3h[m,,i1,1h]))') + & "b",l,"c",l,"d",l,"e",l + do m=1,nsingle + write (iout,'(i2,4(1pe15.5))') m, + & bbthet(m,l,i,j,k),ccthet(m,l,i,j,k), + & ddthet(m,l,i,j,k),eethet(m,l,i,j,k) + enddo + enddo + do l=1,ntheterm3 + write (iout,'(//3hm,n,4(6x,a,5h[m,n,,i1,1h]))') + & "f+",l,"f-",l,"g+",l,"g-",l + do m=2,ndouble + do n=1,m-1 + write (iout,'(i1,1x,i1,4(1pe15.5))') n,m, + & ffthet(n,m,l,i,j,k),ffthet(m,n,l,i,j,k), + & ggthet(n,m,l,i,j,k),ggthet(m,n,l,i,j,k) + enddo + enddo + enddo + enddo + enddo + enddo + call flush(iout) + endif + write (2,*) "Start reading THETA_PDB" + do i=1,ntyp + read (ithep_pdb,*,err=111,end=111) a0thet(i),(athet(j,i),j=1,2), + & (bthet(j,i),j=1,2) + read (ithep_pdb,*,err=111,end=111) (polthet(j,i),j=0,3) + read (ithep_pdb,*,err=111,end=111) (gthet(j,i),j=1,3) + read (ithep_pdb,*,err=111,end=111) theta0(i),sig0(i),sigc0(i) + sigc0(i)=sigc0(i)**2 + enddo + write (2,*) "End reading THETA_PDB" + close (ithep_pdb) +#endif + close(ithep) +#ifdef CRYST_SC +C +C Read the parameters of the probability distribution/energy expression +C of the side chains. +C + do i=1,ntyp + read (irotam,'(3x,i3,f8.3)',end=112,err=112) nlob(i),dsc(i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + if (i.ne.10) then + do j=1,nlob(i) + do k=1,3 + do l=1,3 + blower(l,k,j)=0.0D0 + enddo + enddo + enddo + bsc(1,i)=0.0D0 + read(irotam,*,end=112,err=112)(censc(k,1,i),k=1,3), + & ((blower(k,l,1),l=1,k),k=1,3) + do j=2,nlob(i) + read (irotam,*,end=112,err=112) bsc(j,i) + read (irotam,*,end=112,err=112) (censc(k,j,i),k=1,3), + & ((blower(k,l,j),l=1,k),k=1,3) + enddo + do j=1,nlob(i) + do k=1,3 + do l=1,k + akl=0.0D0 + do m=1,3 + akl=akl+blower(k,m,j)*blower(l,m,j) + enddo + gaussc(k,l,j,i)=akl + gaussc(l,k,j,i)=akl + enddo + enddo + enddo + endif + enddo + close (irotam) + if (lprint) then + write (iout,'(/a)') 'Parameters of side-chain local geometry' + do i=1,ntyp + nlobi=nlob(i) + if (nlobi.gt.0) then + if (LaTeX) then + write (iout,'(/3a,i2,a,f8.3)') 'Residue type: ',restyp(i), + & ' # of gaussian lobes:',nlobi,' dsc:',dsc(i) + write (iout,'(1h&,a,3(2h&&,f8.3,2h&&))') + & 'log h',(bsc(j,i),j=1,nlobi) + write (iout,'(1h&,a,3(1h&,f8.3,1h&,f8.3,1h&,f8.3,1h&))') + & 'x',((censc(k,j,i),k=1,3),j=1,nlobi) + do k=1,3 + write (iout,'(2h& ,5(2x,1h&,3(f7.3,1h&)))') + & ((gaussc(k,l,j,i),l=1,3),j=1,nlobi) + enddo + else + write (iout,'(/a,8x,i1,4(25x,i1))') 'Lobe:',(j,j=1,nlobi) + write (iout,'(a,f10.4,4(16x,f10.4))') + & 'Center ',(bsc(j,i),j=1,nlobi) + write (iout,'(5(2x,3f8.4))') ((censc(k,j,i),k=1,3), + & j=1,nlobi) + write (iout,'(a)') + endif + endif + enddo + endif +#else +C +C Read scrot parameters for potentials determined from all-atom AM1 calculations +C added by Urszula Kozlowska 07/11/2007 +C + do i=1,ntyp + read (irotam,*,end=112,err=112) + if (i.eq.10) then + read (irotam,*,end=112,err=112) + else + do j=1,65 + read(irotam,*,end=112,err=112) sc_parmin(j,i) + enddo + endif + enddo +C +C Read the parameters of the probability distribution/energy expression +C of the side chains. +C + do i=1,ntyp + read (irotam_pdb,'(3x,i3,f8.3)',end=112,err=112) nlob(i),dsc(i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + if (i.ne.10) then + do j=1,nlob(i) + do k=1,3 + do l=1,3 + blower(l,k,j)=0.0D0 + enddo + enddo + enddo + bsc(1,i)=0.0D0 + read(irotam_pdb,*,end=112,err=112)(censc(k,1,i),k=1,3), + & ((blower(k,l,1),l=1,k),k=1,3) + do j=2,nlob(i) + read (irotam_pdb,*,end=112,err=112) bsc(j,i) + read (irotam_pdb,*,end=112,err=112) (censc(k,j,i),k=1,3), + & ((blower(k,l,j),l=1,k),k=1,3) + enddo + do j=1,nlob(i) + do k=1,3 + do l=1,k + akl=0.0D0 + do m=1,3 + akl=akl+blower(k,m,j)*blower(l,m,j) + enddo + gaussc(k,l,j,i)=akl + gaussc(l,k,j,i)=akl + enddo + enddo + enddo + endif + enddo + close (irotam_pdb) +#endif + close(irotam) + +#ifdef CRYST_TOR +C +C Read torsional parameters in old format +C + read (itorp,*,end=113,err=113) ntortyp,nterm_old + if (lprint)write (iout,*) 'ntortyp,nterm',ntortyp,nterm_old + read (itorp,*,end=113,err=113) (itortyp(i),i=1,ntyp) + do i=1,ntortyp + do j=1,ntortyp + read (itorp,'(a)') + do k=1,nterm_old + read (itorp,*,end=113,err=113) kk,v1(k,j,i),v2(k,j,i) + enddo + enddo + enddo + close (itorp) + if (lprint) then + write (iout,'(/a/)') 'Torsional constants:' + do i=1,ntortyp + do j=1,ntortyp + write (iout,'(2i3,6f10.5)') i,j,(v1(k,i,j),k=1,nterm_old) + write (iout,'(6x,6f10.5)') (v2(k,i,j),k=1,nterm_old) + enddo + enddo + endif +#else +C +C Read torsional parameters +C + read (itorp,*,end=113,err=113) ntortyp + read (itorp,*,end=113,err=113) (itortyp(i),i=1,ntyp) +c write (iout,*) 'ntortyp',ntortyp + do i=1,ntortyp + do j=1,ntortyp + read (itorp,*,end=113,err=113) nterm(i,j),nlor(i,j) + v0ij=0.0d0 + si=-1.0d0 + do k=1,nterm(i,j) + read (itorp,*,end=113,err=113) kk,v1(k,i,j),v2(k,i,j) + v0ij=v0ij+si*v1(k,i,j) + si=-si + enddo + do k=1,nlor(i,j) + read (itorp,*,end=113,err=113) kk,vlor1(k,i,j), + & vlor2(k,i,j),vlor3(k,i,j) + v0ij=v0ij+vlor1(k,i,j)/(1+vlor3(k,i,j)**2) + enddo + v0(i,j)=v0ij + enddo + enddo + close (itorp) + if (lprint) then + write (iout,'(/a/)') 'Torsional constants:' + do i=1,ntortyp + do j=1,ntortyp + write (iout,*) 'ityp',i,' jtyp',j + write (iout,*) 'Fourier constants' + do k=1,nterm(i,j) + write (iout,'(2(1pe15.5))') v1(k,i,j),v2(k,i,j) + enddo + write (iout,*) 'Lorenz constants' + do k=1,nlor(i,j) + write (iout,'(3(1pe15.5))') + & vlor1(k,i,j),vlor2(k,i,j),vlor3(k,i,j) + enddo + enddo + enddo + endif +C +C 6/23/01 Read parameters for double torsionals +C + do i=1,ntortyp + do j=1,ntortyp + do k=1,ntortyp + read (itordp,'(3a1)',end=114,err=114) t1,t2,t3 + if (t1.ne.onelett(i) .or. t2.ne.onelett(j) + & .or. t3.ne.onelett(k)) then + write (iout,*) "Error in double torsional parameter file", + & i,j,k,t1,t2,t3 +#ifdef MPI + call MPI_Finalize(Ierror) +#endif + stop "Error in double torsional parameter file" + endif + read (itordp,*,end=114,err=114) ntermd_1(i,j,k), + & ntermd_2(i,j,k) + read (itordp,*,end=114,err=114) (v1c(1,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) (v1s(1,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) (v1c(2,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) (v1s(2,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) ((v2c(l,m,i,j,k), + & v2c(m,l,i,j,k),v2s(l,m,i,j,k),v2s(m,l,i,j,k), + & m=1,l-1),l=1,ntermd_2(i,j,k)) + enddo + enddo + enddo + if (lprint) then + write (iout,*) + write (iout,*) 'Constants for double torsionals' + do i=1,ntortyp + do j=1,ntortyp + do k=1,ntortyp + write (iout,*) 'ityp',i,' jtyp',j,' ktyp',k, + & ' nsingle',ntermd_1(i,j,k),' ndouble',ntermd_2(i,j,k) + write (iout,*) + write (iout,*) 'Single angles:' + do l=1,ntermd_1(i,j,k) + write (iout,'(i5,2f10.5,5x,2f10.5)') l, + & v1c(1,l,i,j,k),v1s(1,l,i,j,k), + & v1c(2,l,i,j,k),v1s(2,l,i,j,k) + enddo + write (iout,*) + write (iout,*) 'Pairs of angles:' + write (iout,'(3x,20i10)') (l,l=1,ntermd_2(i,j,k)) + do l=1,ntermd_2(i,j,k) + write (iout,'(i5,20f10.5)') + & l,(v2c(l,m,i,j,k),m=1,ntermd_2(i,j,k)) + enddo + write (iout,*) + write (iout,'(3x,20i10)') (l,l=1,ntermd_2(i,j,k)) + do l=1,ntermd_2(i,j,k) + write (iout,'(i5,20f10.5)') + & l,(v2s(l,m,i,j,k),m=1,ntermd_2(i,j,k)) + enddo + write (iout,*) + enddo + enddo + enddo + endif +#endif +C Read of Side-chain backbone correlation parameters +C Modified 11 May 2012 by Adasko +CCC +C + read (isccor,*,end=1113,err=1113) nsccortyp + read (isccor,*,end=1113,err=1113) (isccortyp(i),i=1,ntyp) + write (iout,*) 'ntortyp',ntortyp + maxinter = 3 +cc maxinter is maximum interaction sites + DO l = 1, maxinter + DO i = 1, nsccortyp + DO j = 1, nsccortyp + read (isccor,*,end=1113,err=1113) nterm_sccor(i,j), + & nlor_sccor(i,j) + v0ijsccor = 0.0d0 + si = -1.0d0 + + DO k = 1, nterm_sccor(i,j) + read (isccor,*,end=1113,err=1113) kk, v1sccor(k,l,i,j) + & ,v2sccor(k,l,i,j) + v0ijsccor = v0ijsccor + si * v1sccor(k,l,i,j) + si = -si + END DO + DO k = 1, nlor_sccor(i,j) + read (isccor,*,end=1113,err=1113) kk, vlor1sccor(k,i,j), + & vlor2sccor(k,i,j),vlor3sccor(k,i,j) + v0ijsccor = v0ijsccor + vlor1sccor(k,i,j) / + & (1 + vlor3sccor(k,i,j)**2) + END DO + v0sccor(i,j) = v0ijsccor + END DO + END DO + END DO + close (isccor) + + IF (lprint) THEN + write (iout,'(/a/)') 'Torsional constants:' + DO i=1,nsccortyp + DO j=1,nsccortyp + write (iout,*) 'ityp',i,' jtyp',j + write (iout,*) 'Fourier constants' + DO k=1,nterm_sccor(i,j) + write (iout,'(2(1pe15.5))') v1sccor(k,l,i,j),v2sccor(k,l,i,j) + END DO + write (iout,*) 'Lorenz constants' + DO k=1,nlor_sccor(i,j) + write (iout,'(3(1pe15.5))') + & vlor1sccor(k,i,j),vlor2sccor(k,i,j),vlor3sccor(k,i,j) + END DO + END DO + END DO + END IF +C +C +C 9/18/99 (AL) Read coefficients of the Fourier expansion of the local +C interaction energy of the Gly, Ala, and Pro prototypes. +C + IF (lprint) THEN + write (iout,*) + write (iout,*) "Coefficients of the cumulants" + END IF + read (ifourier,*) nloctyp + DO i=1,nloctyp + read (ifourier,*,end=115,err=115) + read (ifourier,*,end=115,err=115) (b(ii),ii=1,13) + IF (lprint) THEN + write (iout,*) 'Type',i + write (iout,'(a,i2,a,f10.5)') ('b(',ii,')=',b(ii),ii=1,13) + END IF + B1(1,i) = b(3) + B1(2,i) = b(5) +c b1(1,i)=0.0d0 +c b1(2,i)=0.0d0 + B1tilde(1,i) = b(3) + B1tilde(2,i) =-b(5) +c b1tilde(1,i)=0.0d0 +c b1tilde(2,i)=0.0d0 + B2(1,i) = b(2) + B2(2,i) = b(4) +c b2(1,i)=0.0d0 +c b2(2,i)=0.0d0 + CC(1,1,i)= b(7) + CC(2,2,i)=-b(7) + CC(2,1,i)= b(9) + CC(1,2,i)= b(9) +c CC(1,1,i)=0.0d0 +c CC(2,2,i)=0.0d0 +c CC(2,1,i)=0.0d0 +c CC(1,2,i)=0.0d0 + Ctilde(1,1,i)=b(7) + Ctilde(1,2,i)=b(9) + Ctilde(2,1,i)=-b(9) + Ctilde(2,2,i)=b(7) +c Ctilde(1,1,i)=0.0d0 +c Ctilde(1,2,i)=0.0d0 +c Ctilde(2,1,i)=0.0d0 +c Ctilde(2,2,i)=0.0d0 + DD(1,1,i)= b(6) + DD(2,2,i)=-b(6) + DD(2,1,i)= b(8) + DD(1,2,i)= b(8) +c DD(1,1,i)=0.0d0 +c DD(2,2,i)=0.0d0 +c DD(2,1,i)=0.0d0 +c DD(1,2,i)=0.0d0 + Dtilde(1,1,i)=b(6) + Dtilde(1,2,i)=b(8) + Dtilde(2,1,i)=-b(8) + Dtilde(2,2,i)=b(6) +c Dtilde(1,1,i)=0.0d0 +c Dtilde(1,2,i)=0.0d0 +c Dtilde(2,1,i)=0.0d0 +c Dtilde(2,2,i)=0.0d0 + EE(1,1,i)= b(10)+b(11) + EE(2,2,i)=-b(10)+b(11) + EE(2,1,i)= b(12)-b(13) + EE(1,2,i)= b(12)+b(13) +c ee(1,1,i)=1.0d0 +c ee(2,2,i)=1.0d0 +c ee(2,1,i)=0.0d0 +c ee(1,2,i)=0.0d0 +c ee(2,1,i)=ee(1,2,i) + enddo + if (lprint) then + do i=1,nloctyp + write (iout,*) 'Type',i + write (iout,*) 'B1' + write(iout,*) B1(1,i),B1(2,i) + write (iout,*) 'B2' + write(iout,*) B2(1,i),B2(2,i) + write (iout,*) 'CC' + do j=1,2 + write (iout,'(2f10.5)') CC(j,1,i),CC(j,2,i) + enddo + write(iout,*) 'DD' + do j=1,2 + write (iout,'(2f10.5)') DD(j,1,i),DD(j,2,i) + enddo + write(iout,*) 'EE' + do j=1,2 + write (iout,'(2f10.5)') EE(j,1,i),EE(j,2,i) + enddo + enddo + endif +C +C Read electrostatic-interaction parameters +C + if (lprint) then + write (iout,*) + write (iout,'(/a)') 'Electrostatic interaction constants:' + write (iout,'(1x,a,1x,a,10x,a,11x,a,11x,a,11x,a)') + & 'IT','JT','APP','BPP','AEL6','AEL3' + endif + read (ielep,*,end=116,err=116) ((epp(i,j),j=1,2),i=1,2) + read (ielep,*,end=116,err=116) ((rpp(i,j),j=1,2),i=1,2) + read (ielep,*,end=116,err=116) ((elpp6(i,j),j=1,2),i=1,2) + read (ielep,*,end=116,err=116) ((elpp3(i,j),j=1,2),i=1,2) + close (ielep) + do i=1,2 + do j=1,2 + rri=rpp(i,j)**6 + app (i,j)=epp(i,j)*rri*rri + bpp (i,j)=-2.0D0*epp(i,j)*rri + ael6(i,j)=elpp6(i,j)*4.2D0**6 + ael3(i,j)=elpp3(i,j)*4.2D0**3 + if (lprint) write(iout,'(2i3,4(1pe15.4))')i,j,app(i,j),bpp(i,j), + & ael6(i,j),ael3(i,j) + enddo + enddo +C +C Read side-chain interaction parameters. +C + read (isidep,*,end=117,err=117) ipot,expon + if (ipot.lt.1 .or. ipot.gt.6) then + write (iout,'(2a)') 'Error while reading SC interaction', + & 'potential file - unknown potential type.' +#ifdef MPI + call MPI_Finalize(Ierror) +#endif + stop + endif + expon2=expon/2 + if(me.eq.king) + & write(iout,'(/3a,2i3)') 'Potential is ',potname(ipot), + & ', exponents are ',expon,2*expon + goto (10,20,30,30,40,50) ipot +C----------------------- LJ potential --------------------------------- + 10 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp) + if (lprint) then + write (iout,'(/a/)') 'Parameters of the LJ potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,a)') 'residue','sigma' + write (iout,'(a3,6x,f10.5)') (restyp(i),sigma0(i),i=1,ntyp) + endif + goto 60 +C----------------------- LJK potential -------------------------------- + 20 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp),(rr0(i),i=1,ntyp) + if (lprint) then + write (iout,'(/a/)') 'Parameters of the LJK potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,2a)') 'residue',' sigma ',' r0 ' + write (iout,'(a3,6x,2f10.5)') (restyp(i),sigma0(i),rr0(i), + & i=1,ntyp) + endif + goto 60 +C---------------------- GB or BP potential ----------------------------- + 30 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp),(sigii(i),i=1,ntyp),(chip(i),i=1,ntyp), + & (alp(i),i=1,ntyp) +C For the GB potential convert sigma'**2 into chi' + if (ipot.eq.4) then + do i=1,ntyp + chip(i)=(chip(i)-1.0D0)/(chip(i)+1.0D0) + enddo + endif + if (lprint) then + write (iout,'(/a/)') 'Parameters of the GB or BP potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,4a)') 'residue',' sigma ','s||/s_|_^2', + & ' chip ',' alph ' + write (iout,'(a3,6x,4f10.5)') (restyp(i),sigma0(i),sigii(i), + & chip(i),alp(i),i=1,ntyp) + endif + goto 60 +C--------------------- GBV potential ----------------------------------- + 40 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp),(rr0(i),i=1,ntyp),(sigii(i),i=1,ntyp), + & (chip(i),i=1,ntyp),(alp(i),i=1,ntyp) + if (lprint) then + write (iout,'(/a/)') 'Parameters of the GBV potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,5a)') 'residue',' sigma ',' r0 ', + & 's||/s_|_^2',' chip ',' alph ' + write (iout,'(a3,6x,5f10.5)') (restyp(i),sigma0(i),rr0(i), + & sigii(i),chip(i),alp(i),i=1,ntyp) + endif + goto 60 + +C--------------------- Momo potential ----------------------------------- + + 50 continue + + read (isidep,*) (icharge(i),i=1,ntyp) +c write (2,*) "icharge",(icharge(i),i=1,ntyp) + do i=1,ntyp + do j=1,i +c! write (*,*) "Im in ", i, " ", j + read(isidep,*) + & eps(i,j),sigma(i,j),chi(i,j),chi(j,i),chipp(i,j),chipp(j,i), + & (alphasur(k,i,j),k=1,4),sigmap1(i,j),sigmap2(i,j), + & chis(i,j),chis(j,i), + & nstate(i,j),(wstate(k,i,j),k=1,4), + & dhead(1,1,i,j), + & dhead(1,2,i,j), + & dhead(2,1,i,j), + & dhead(2,2,i,j), + & dtail(1,i,j),dtail(2,i,j), + & epshead(i,j),sig0head(i,j), + & rborn(i,j),rborn(j,i), + & (wqdip(k,i,j),k=1,2),wquad(i,j), + & alphapol(i,j),alphapol(j,i), + & (alphiso(k,i,j),k=1,4),sigiso1(i,j),sigiso2(i,j),epsintab(i,j) + END DO + END DO +c! write (*,*) "nstate gly-gly", nstate(10,10) +c! THIS LOOP FILLS PARAMETERS FOR PAIRS OF AA's NOT EXPLICITLY +c! DEFINED IN SCPARM.MOMO. IT DOES SO BY TAKING THEM FROM SYMMETRIC +c! PAIR, FOR EG. IF ARG-HIS IS BLANK, IT WILL TAKE PARAMETERS +c! FROM HIS-ARG. +c! +c! DISABLE IT AT >>YOUR OWN PERIL<< +c! + DO i = 1, ntyp + DO j = i+1, ntyp + eps(i,j) = eps(j,i) + sigma(i,j) = sigma(j,i) + nstate(i,j) = nstate(j,i) + sigmap1(i,j) = sigmap1(j,i) + sigmap2(i,j) = sigmap2(j,i) + sigiso1(i,j) = sigiso1(j,i) + sigiso2(i,j) = sigiso2(j,i) + + DO k = 1, 4 + alphasur(k,i,j) = alphasur(k,j,i) + wstate(k,i,j) = wstate(k,j,i) + alphiso(k,i,j) = alphiso(k,j,i) + END DO + + dhead(2,1,i,j) = dhead(1,1,j,i) + dhead(2,2,i,j) = dhead(1,2,j,i) + dhead(1,1,i,j) = dhead(2,1,j,i) + dhead(1,2,i,j) = dhead(2,2,j,i) + dtail(1,i,j) = dtail(1,j,i) + dtail(2,i,j) = dtail(2,j,i) +c! DO k = 1, 2 +c! DO l = 1, 2 +c! write (*,*) "dhead(k,l,j,i) = ", dhead(k,l,j,i) +c! write (*,*) "dhead(k,l,i,j) = ", dhead(k,l,i,j) +c! dhead(l,k,i,j) = dhead(k,l,j,i) +c! END DO +c! END DO + + epshead(i,j) = epshead(j,i) + sig0head(i,j) = sig0head(j,i) + + DO k = 1, 2 + wqdip(k,i,j) = wqdip(k,j,i) + END DO + + wquad(i,j) = wquad(j,i) + epsintab(i,j) = epsintab(j,i) + + END DO + END DO + + if (.not.lprint) goto 70 + write (iout,'(a)') + & "Parameters of the new physics-based SC-SC interaction potential" + write (iout,'(/7a)') 'Residues',' epsGB',' rGB', + & ' chi1GB',' chi2GB',' chip1GB',' chip2GB' + do i=1,ntyp + do j=1,i + write (iout,'(2(a3,1x),1pe10.3,5(0pf10.3))') + & restyp(i),restyp(j),eps(i,j),sigma(i,j),chi(i,j),chi(j,i), + & chipp(i,j),chipp(j,i) + enddo + enddo + write (iout,'(/9a)') 'Residues',' alphasur1',' alphasur2', + & ' alphasur3',' alphasur4',' sigmap1',' sigmap2', + & ' chis1',' chis2' + do i=1,ntyp + do j=1,i + write (iout,'(2(a3,1x),8(0pf10.3))') + & restyp(i),restyp(j),(alphasur(k,i,j),k=1,4), + & sigmap1(i,j),sigmap2(j,i),chis(i,j),chis(j,i) + enddo + enddo + write (iout,'(/14a)') 'Residues',' nst ',' wst1', + & ' wst2',' wst3',' wst4',' dh11',' dh21', + & ' dh12',' dh22',' dt1',' dt2',' epsh1', + & ' sigh' + do i=1,ntyp + do j=1,i + write (iout,'(2(a3,1x),i3,4f8.3,6f7.2,f9.5,f7.2)') + & restyp(i),restyp(j),nstate(i,j),(wstate(k,i,j),k=1,4), + & ((dhead(l,k,i,j),l=1,2),k=1,2),dtail(1,i,j),dtail(2,i,j), + & epshead(i,j),sig0head(i,j) + enddo + enddo + write (iout,'(/12a)') 'Residues',' ch1',' ch2', + & ' rborn1',' rborn2',' wqdip1',' wqdip2', + & ' wquad' + do i=1,ntyp + do j=1,i + write (iout,'(2(a3,1x),2i4,5f10.3)') + & restyp(i),restyp(j),icharge(i),icharge(j), + & rborn(i,j),rborn(j,i),(wqdip(k,i,j),k=1,2),wquad(i,j) + enddo + enddo + write (iout,'(/12a)') 'Residues', + & ' alphpol1', + & ' alphpol2',' alphiso1',' alpiso2', + & ' alpiso3',' alpiso4',' sigiso1',' sigiso2', + & ' epsin' + do i=1,ntyp + do j=1,i + write (iout,'(2(a3,1x),11f10.3)') + & restyp(i),restyp(j),alphapol(i,j),alphapol(j,i), + & (alphiso(k,i,j),k=1,4),sigiso1(i,j),sigiso2(j,i), + & epsintab(i,j) + enddo + enddo + goto 70 + +C For the GB potential convert sigma'**2 into chi' + DO i=1,ntyp + chip(i)=(chip(i)-1.0D0)/(chip(i)+1.0D0) + END DO + IF (lprint) THEN + write (iout,'(/a/)') 'Parameters of the BP potential:' + write (iout,'(a/)') 'The epsilon array:' + CALL printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,4a)') 'residue',' sigma ','s||/s_|_^2', + & ' chip ',' alph ' + write (iout,'(a3,6x,4f10.5)') (restyp(i),sigma0(i),sigii(i), + & chip(i),alp(i),i=1,ntyp) + END IF + GOTO 60 + 60 CONTINUE + close (isidep) +C----------------------------------------------------------------------- +C Calculate the "working" parameters of SC interactions. + do i=2,ntyp + do j=1,i-1 + eps(i,j)=eps(j,i) + do k=1,4 + alphasur(k,j,i)=alphasur(k,i,j) + alphiso(k,j,i)=alphiso(k,i,j) + wstate(k,j,i)=wstate(k,i,j) + enddo + do k=1,2 + wqdip(k,j,i)=wqdip(k,i,j) + enddo + do k=1,2 + do l=1,2 + dhead(l,k,j,i)=dhead(l,k,i,j) + enddo + enddo + enddo + enddo + IF (ipot.LT.6) THEN + do i=1,ntyp + do j=i,ntyp + sigma(i,j)=dsqrt(sigma0(i)**2+sigma0(j)**2) + sigma(j,i)=sigma(i,j) + rs0(i,j)=dwa16*sigma(i,j) + rs0(j,i)=rs0(i,j) + enddo + enddo + END IF + + 70 continue + if (lprint) write (iout,'(/a/10x,7a/72(1h-))') + & 'Working parameters of the SC interactions:', + & ' a ',' b ',' augm ',' sigma ',' r0 ', + & ' chi1 ',' chi2 ' + do i=1,ntyp + do j=i,ntyp + epsij=eps(i,j) + if (ipot.eq.1 .or. ipot.eq.3 .or. ipot.eq.4 .or. ipot.eq.6 ) THEN + rrij=sigma(i,j) + else + rrij=rr0(i)+rr0(j) + endif + r0(i,j)=rrij + r0(j,i)=rrij + rrij=rrij**expon + epsij=eps(i,j) + sigeps=dsign(1.0D0,epsij) + epsij=dabs(epsij) + aa(i,j)=epsij*rrij*rrij + bb(i,j)=-sigeps*epsij*rrij + aa(j,i)=aa(i,j) + bb(j,i)=bb(i,j) + IF ((ipot.gt.2).AND.(ipot.LT.6)) THEN + sigt1sq=sigma0(i)**2 + sigt2sq=sigma0(j)**2 + sigii1=sigii(i) + sigii2=sigii(j) + ratsig1=sigt2sq/sigt1sq + ratsig2=1.0D0/ratsig1 + chi(i,j)=(sigii1-1.0D0)/(sigii1+ratsig1) + if (j.gt.i) chi(j,i)=(sigii2-1.0D0)/(sigii2+ratsig2) + rsum_max=dsqrt(sigii1*sigt1sq+sigii2*sigt2sq) + else + rsum_max=sigma(i,j) + endif +c if (ipot.eq.1 .or. ipot.eq.3 .or. ipot.eq.4) then + sigmaii(i,j)=rsum_max + sigmaii(j,i)=rsum_max +c else +c sigmaii(i,j)=r0(i,j) +c sigmaii(j,i)=r0(i,j) +c endif +cd write (iout,*) i,j,r0(i,j),sigma(i,j),rsum_max + if ((ipot.eq.2 .or. ipot.eq.5) .and. r0(i,j).gt.rsum_max) then + r_augm=sigma(i,j)*(rrij-sigma(i,j))/rrij + augm(i,j)=epsij*r_augm**(2*expon) +c augm(i,j)=0.5D0**(2*expon)*aa(i,j) + augm(j,i)=augm(i,j) + else + augm(i,j)=0.0D0 + augm(j,i)=0.0D0 + endif + if (lprint) then + if (ipot.lt.6) then + write (iout,'(2(a3,2x),3(1pe10.3),5(0pf8.3))') + & restyp(i),restyp(j),aa(i,j),bb(i,j),augm(i,j), + & sigma(i,j),r0(i,j),chi(i,j),chi(j,i) + else + write (iout,'(2(a3,2x),3(1pe10.3),5(0pf8.3),2i3,10f8.4, + & i3,40f10.4)') + & restyp(i),restyp(j),aa(i,j),bb(i,j),augm(i,j), + & sigma(i,j),r0(i,j),chi(i,j),chi(j,i), + & icharge(i),icharge(j),chipp(i,j),chipp(j,i), + & (alphasur(k,i,j),k=1,4),sigmap1(i,j),sigmap2(j,i), + & chis(i,j),chis(j,i), + & nstate(i,j),(wstate(k,i,j),k=1,4), + & ((dhead(l,k,i,j),l=1,2),k=1,2),dtail(1,i,j),dtail(2,i,j), + & epshead(i,j),sig0head(i,j), + & rborn(i,j),(wqdip(k,i,j),k=1,2),wquad(i,j), + & alphapol(i,j),alphapol(j,i), + & (alphiso(k,i,j),k=1,4),sigiso1(i,j),sigiso2(i,j) + + endif + endif + enddo + enddo +#ifdef OLDSCP +C +C Define the SC-p interaction constants (hard-coded; old style) +C + do i=1,20 +C "Soft" SC-p repulsion (causes helices to be too flat, but facilitates +C helix formation) +c aad(i,1)=0.3D0*4.0D0**12 +C Following line for constants currently implemented +C "Hard" SC-p repulsion (gives correct turn spacing in helices) + aad(i,1)=1.5D0*4.0D0**12 +c aad(i,1)=0.17D0*5.6D0**12 + aad(i,2)=aad(i,1) +C "Soft" SC-p repulsion + bad(i,1)=0.0D0 +C Following line for constants currently implemented +c aad(i,1)=0.3D0*4.0D0**6 +C "Hard" SC-p repulsion + bad(i,1)=3.0D0*4.0D0**6 +c bad(i,1)=-2.0D0*0.17D0*5.6D0**6 + bad(i,2)=bad(i,1) +c aad(i,1)=0.0D0 +c aad(i,2)=0.0D0 +c bad(i,1)=1228.8D0 +c bad(i,2)=1228.8D0 + enddo +#else +C +C 8/9/01 Read the SC-p interaction constants from file +C + do i=1,ntyp + read (iscpp,*,end=118,err=118) (eps_scp(i,j),rscp(i,j),j=1,2) + enddo + do i=1,ntyp + aad(i,1)=dabs(eps_scp(i,1))*rscp(i,1)**12 + aad(i,2)=dabs(eps_scp(i,2))*rscp(i,2)**12 + bad(i,1)=-2*eps_scp(i,1)*rscp(i,1)**6 + bad(i,2)=-2*eps_scp(i,2)*rscp(i,2)**6 + enddo + + if (lprint) then + write (iout,*) "Parameters of SC-p interactions:" + do i=1,20 + write (iout,'(4f8.3,4e12.4)') eps_scp(i,1),rscp(i,1), + & eps_scp(i,2),rscp(i,2),aad(i,1),bad(i,1),aad(i,2),bad(i,2) + enddo + endif +#endif +C +C Define the constants of the disulfide bridge +C + ebr=-5.50D0 +c +c Old arbitrary potential - commented out. +c +c dbr= 4.20D0 +c fbr= 3.30D0 +c +c Constants of the disulfide-bond potential determined based on the RHF/6-31G** +c energy surface of diethyl disulfide. +c A. Liwo and U. Kozlowska, 11/24/03 +c + D0CM = 3.78d0 + AKCM = 15.1d0 + AKTH = 11.0d0 + AKCT = 12.0d0 + V1SS =-1.08d0 + V2SS = 7.61d0 + V3SS = 13.7d0 +c akcm=0.0d0 +c akth=0.0d0 +c akct=0.0d0 +c v1ss=0.0d0 +c v2ss=0.0d0 +c v3ss=0.0d0 + + if(me.eq.king) then + write (iout,'(/a)') "Disulfide bridge parameters:" + write (iout,'(a,f10.2)') 'S-S bridge energy: ',ebr + write (iout,'(2(a,f10.2))') 'd0cm:',d0cm,' akcm:',akcm + write (iout,'(2(a,f10.2))') 'akth:',akth,' akct:',akct + write (iout,'(3(a,f10.2))') 'v1ss:',v1ss,' v2ss:',v2ss, + & ' v3ss:',v3ss + endif + return + 111 write (iout,*) "Error reading bending energy parameters." + goto 999 + 112 write (iout,*) "Error reading rotamer energy parameters." + goto 999 + 113 write (iout,*) "Error reading torsional energy parameters." + goto 999 + 1113 write (iout,*) + & "Error reading side-chain torsional energy parameters." + goto 999 + 114 write (iout,*) "Error reading double torsional energy parameters." + goto 999 + 115 write (iout,*) + & "Error reading cumulant (multibody energy) parameters." + goto 999 + 116 write (iout,*) "Error reading electrostatic energy parameters." + goto 999 + 117 write (iout,*) "Error reading side chain interaction parameters." + goto 999 + 118 write (iout,*) "Error reading SCp interaction parameters." + goto 999 + 119 write (iout,*) "Error reading SCCOR parameters" + 999 continue +#ifdef MPI + call MPI_Finalize(Ierror) +#endif + stop + return + end + + + subroutine getenv_loc(var, val) + character(*) var, val + +#ifdef WINIFL + character(2000) line + external ilen + + open (196,file='env',status='old',readonly,shared) + iread=0 +c write(*,*)'looking for ',var +10 read(196,*,err=11,end=11)line + iread=index(line,var) +c write(*,*)iread,' ',var,' ',line + if (iread.eq.0) go to 10 +c write(*,*)'---> ',line +11 continue + if(iread.eq.0) then +c write(*,*)'CHUJ' + val='' + else + iread=iread+ilen(var)+1 + read (line(iread:),*,err=12,end=12) val +c write(*,*)'OK: ',var,' = ',val + endif + close(196) + return +12 val='' + close(196) +#elif (defined CRAY) + integer lennam,lenval,ierror +c +c getenv using a POSIX call, useful on the T3D +c Sept 1996, comment out error check on advice of H. Pritchard +c + lennam = len(var) + if(lennam.le.0) stop '--error calling getenv--' + call pxfgetenv(var,lennam,val,lenval,ierror) +c-HP- if(ierror.ne.0) stop '--error returned by pxfgetenv--' +#else + call getenv(var,val) +#endif + + return + end diff --git a/source/unres/src_MD-NEWSC/parmread_v3ok1.F b/source/unres/src_MD-NEWSC/parmread_v3ok1.F new file mode 100644 index 0000000..6659970 --- /dev/null +++ b/source/unres/src_MD-NEWSC/parmread_v3ok1.F @@ -0,0 +1,1250 @@ + subroutine parmread +C +C Read the parameters of the probability distributions of the virtual-bond +C valence angles and the side chains and energy parameters. +C +C Important! Energy-term weights ARE NOT read here; they are read from the +C main input file instead, because NO defaults have yet been set for these +C parameters. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" + integer IERROR +#endif + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.TORSION' + include 'COMMON.SCCOR' + include 'COMMON.SCROT' + include 'COMMON.FFIELD' + include 'COMMON.NAMES' + include 'COMMON.SBRIDGE' + include 'COMMON.MD' + include 'COMMON.SETUP' + character*1 t1,t2,t3 + character*1 onelett(4) /"G","A","P","D"/ + logical lprint,LaTeX + dimension blower(3,3,maxlob) + dimension b(13) + character*3 lancuch,ucase +C +C For printing parameters after they are read set the following in the UNRES +C C-shell script: +C +C setenv PRINT_PARM YES +C +C To print parameters in LaTeX format rather than as ASCII tables: +C +C setenv LATEX YES +C + call getenv_loc("PRINT_PARM",lancuch) + lprint = (ucase(lancuch).eq."YES" .or. ucase(lancuch).eq."Y") + call getenv_loc("LATEX",lancuch) + LaTeX = (ucase(lancuch).eq."YES" .or. ucase(lancuch).eq."Y") +C + dwa16=2.0d0**(1.0d0/6.0d0) + itypro=20 +C Assign virtual-bond length + vbl=3.8D0 + vblinv=1.0D0/vbl + vblinv2=vblinv*vblinv +c +c Read the virtual-bond parameters, masses, and moments of inertia +c and Stokes' radii of the peptide group and side chains +c +#ifdef CRYST_BOND + read (ibond,*) vbldp0,akp,mp,ip,pstok + do i=1,ntyp + nbondterm(i)=1 + read (ibond,*) vbldsc0(1,i),aksc(1,i),msc(i),isc(i),restok(i) + dsc(i) = vbldsc0(1,i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + enddo +#else + read (ibond,*) junk,vbldp0,akp,rjunk,mp,ip,pstok + do i=1,ntyp + read (ibond,*) nbondterm(i),(vbldsc0(j,i),aksc(j,i),abond0(j,i), + & j=1,nbondterm(i)),msc(i),isc(i),restok(i) + dsc(i) = vbldsc0(1,i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + enddo +#endif + if (lprint) then + write(iout,'(/a/)')"Dynamic constants of the interaction sites:" + write (iout,'(a10,a3,6a10)') 'Type','N','VBL','K','A0','mass', + & 'inertia','Pstok' + write(iout,'(a10,i3,6f10.5)') "p",1,vbldp0,akp,0.0d0,mp,ip,pstok + do i=1,ntyp + write (iout,'(a10,i3,6f10.5)') restyp(i),nbondterm(i), + & vbldsc0(1,i),aksc(1,i),abond0(1,i),msc(i),isc(i),restok(i) + do j=2,nbondterm(i) + write (iout,'(13x,3f10.5)') + & vbldsc0(j,i),aksc(j,i),abond0(j,i) + enddo + enddo + endif +#ifdef CRYST_THETA +C +C Read the parameters of the probability distribution/energy expression +C of the virtual-bond valence angles theta +C + do i=1,ntyp + read (ithep,*,err=111,end=111) a0thet(i),(athet(j,i),j=1,2), + & (bthet(j,i),j=1,2) + read (ithep,*,err=111,end=111) (polthet(j,i),j=0,3) + read (ithep,*,err=111,end=111) (gthet(j,i),j=1,3) + read (ithep,*,err=111,end=111) theta0(i),sig0(i),sigc0(i) + sigc0(i)=sigc0(i)**2 + enddo + close (ithep) + if (lprint) then + if (.not.LaTeX) then + write (iout,'(a)') + & 'Parameters of the virtual-bond valence angles:' + write (iout,'(/a/9x,5a/79(1h-))') 'Fourier coefficients:', + & ' ATHETA0 ',' A1 ',' A2 ', + & ' B1 ',' B2 ' + do i=1,ntyp + write(iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i, + & a0thet(i),(athet(j,i),j=1,2),(bthet(j,i),j=1,2) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the expression for sigma(theta_c):', + & ' ALPH0 ',' ALPH1 ',' ALPH2 ', + & ' ALPH3 ',' SIGMA0C ' + do i=1,ntyp + write (iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i, + & (polthet(j,i),j=0,3),sigc0(i) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the second gaussian:', + & ' THETA0 ',' SIGMA0 ',' G1 ', + & ' G2 ',' G3 ' + do i=1,ntyp + write (iout,'(a3,i4,2x,5(1pe14.5))') restyp(i),i,theta0(i), + & sig0(i),(gthet(j,i),j=1,3) + enddo + else + write (iout,'(a)') + & 'Parameters of the virtual-bond valence angles:' + write (iout,'(/a/9x,5a/79(1h-))') + & 'Coefficients of expansion', + & ' theta0 ',' a1*10^2 ',' a2*10^2 ', + & ' b1*10^1 ',' b2*10^1 ' + do i=1,ntyp + write(iout,'(a3,1h&,2x,5(f8.3,1h&))') restyp(i), + & a0thet(i),(100*athet(j,i),j=1,2),(10*bthet(j,i),j=1,2) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the expression for sigma(theta_c):', + & ' alpha0 ',' alph1 ',' alph2 ', + & ' alhp3 ',' sigma0c ' + do i=1,ntyp + write (iout,'(a3,1h&,2x,5(1pe12.3,1h&))') restyp(i), + & (polthet(j,i),j=0,3),sigc0(i) + enddo + write (iout,'(/a/9x,5a/79(1h-))') + & 'Parameters of the second gaussian:', + & ' theta0 ',' sigma0*10^2 ',' G1*10^-1', + & ' G2 ',' G3*10^1 ' + do i=1,ntyp + write (iout,'(a3,1h&,2x,5(f8.3,1h&))') restyp(i),theta0(i), + & 100*sig0(i),gthet(1,i)*0.1D0,gthet(2,i),gthet(3,i)*10.0D0 + enddo + endif + endif +#else +C +C Read the parameters of Utheta determined from ab initio surfaces +C Kozlowska et al., J. Phys.: Condens. Matter 19 (2007) 285203 +C + read (ithep,*,err=111,end=111) nthetyp,ntheterm,ntheterm2, + & ntheterm3,nsingle,ndouble + nntheterm=max0(ntheterm,ntheterm2,ntheterm3) + read (ithep,*,err=111,end=111) (ithetyp(i),i=1,ntyp1) + do i=1,maxthetyp + do j=1,maxthetyp + do k=1,maxthetyp + aa0thet(i,j,k)=0.0d0 + do l=1,ntheterm + aathet(l,i,j,k)=0.0d0 + enddo + do l=1,ntheterm2 + do m=1,nsingle + bbthet(m,l,i,j,k)=0.0d0 + ccthet(m,l,i,j,k)=0.0d0 + ddthet(m,l,i,j,k)=0.0d0 + eethet(m,l,i,j,k)=0.0d0 + enddo + enddo + do l=1,ntheterm3 + do m=1,ndouble + do mm=1,ndouble + ffthet(mm,m,l,i,j,k)=0.0d0 + ggthet(mm,m,l,i,j,k)=0.0d0 + enddo + enddo + enddo + enddo + enddo + enddo + do i=1,nthetyp + do j=1,nthetyp + do k=1,nthetyp + read (ithep,'(3a)',end=111,err=111) res1,res2,res3 + read (ithep,*,end=111,err=111) aa0thet(i,j,k) + read (ithep,*,end=111,err=111)(aathet(l,i,j,k),l=1,ntheterm) + read (ithep,*,end=111,err=111) + & ((bbthet(lll,ll,i,j,k),lll=1,nsingle), + & (ccthet(lll,ll,i,j,k),lll=1,nsingle), + & (ddthet(lll,ll,i,j,k),lll=1,nsingle), + & (eethet(lll,ll,i,j,k),lll=1,nsingle),ll=1,ntheterm2) + read (ithep,*,end=111,err=111) + & (((ffthet(llll,lll,ll,i,j,k),ffthet(lll,llll,ll,i,j,k), + & ggthet(llll,lll,ll,i,j,k),ggthet(lll,llll,ll,i,j,k), + & llll=1,lll-1),lll=2,ndouble),ll=1,ntheterm3) + enddo + enddo + enddo +C +C For dummy ends assign glycine-type coefficients of theta-only terms; the +C coefficients of theta-and-gamma-dependent terms are zero. +C + do i=1,nthetyp + do j=1,nthetyp + do l=1,ntheterm + aathet(l,i,j,nthetyp+1)=aathet(l,i,j,1) + aathet(l,nthetyp+1,i,j)=aathet(l,1,i,j) + enddo + aa0thet(i,j,nthetyp+1)=aa0thet(i,j,1) + aa0thet(nthetyp+1,i,j)=aa0thet(1,i,j) + enddo + do l=1,ntheterm + aathet(l,nthetyp+1,i,nthetyp+1)=aathet(l,1,i,1) + enddo + aa0thet(nthetyp+1,i,nthetyp+1)=aa0thet(1,i,1) + enddo +C +C Control printout of the coefficients of virtual-bond-angle potentials +C + if (lprint) then + write (iout,'(//a)') 'Parameter of virtual-bond-angle potential' + do i=1,nthetyp+1 + do j=1,nthetyp+1 + do k=1,nthetyp+1 + write (iout,'(//4a)') + & 'Type ',onelett(i),onelett(j),onelett(k) + write (iout,'(//a,10x,a)') " l","a[l]" + write (iout,'(i2,1pe15.5)') 0,aa0thet(i,j,k) + write (iout,'(i2,1pe15.5)') + & (l,aathet(l,i,j,k),l=1,ntheterm) + do l=1,ntheterm2 + write (iout,'(//2h m,4(9x,a,3h[m,,i1,1h]))') + & "b",l,"c",l,"d",l,"e",l + do m=1,nsingle + write (iout,'(i2,4(1pe15.5))') m, + & bbthet(m,l,i,j,k),ccthet(m,l,i,j,k), + & ddthet(m,l,i,j,k),eethet(m,l,i,j,k) + enddo + enddo + do l=1,ntheterm3 + write (iout,'(//3hm,n,4(6x,a,5h[m,n,,i1,1h]))') + & "f+",l,"f-",l,"g+",l,"g-",l + do m=2,ndouble + do n=1,m-1 + write (iout,'(i1,1x,i1,4(1pe15.5))') n,m, + & ffthet(n,m,l,i,j,k),ffthet(m,n,l,i,j,k), + & ggthet(n,m,l,i,j,k),ggthet(m,n,l,i,j,k) + enddo + enddo + enddo + enddo + enddo + enddo + call flush(iout) + endif + write (2,*) "Start reading THETA_PDB" + do i=1,ntyp + read (ithep_pdb,*,err=111,end=111) a0thet(i),(athet(j,i),j=1,2), + & (bthet(j,i),j=1,2) + read (ithep_pdb,*,err=111,end=111) (polthet(j,i),j=0,3) + read (ithep_pdb,*,err=111,end=111) (gthet(j,i),j=1,3) + read (ithep_pdb,*,err=111,end=111) theta0(i),sig0(i),sigc0(i) + sigc0(i)=sigc0(i)**2 + enddo + write (2,*) "End reading THETA_PDB" + close (ithep_pdb) +#endif + close(ithep) +#ifdef CRYST_SC +C +C Read the parameters of the probability distribution/energy expression +C of the side chains. +C + do i=1,ntyp + read (irotam,'(3x,i3,f8.3)',end=112,err=112) nlob(i),dsc(i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + if (i.ne.10) then + do j=1,nlob(i) + do k=1,3 + do l=1,3 + blower(l,k,j)=0.0D0 + enddo + enddo + enddo + bsc(1,i)=0.0D0 + read(irotam,*,end=112,err=112)(censc(k,1,i),k=1,3), + & ((blower(k,l,1),l=1,k),k=1,3) + do j=2,nlob(i) + read (irotam,*,end=112,err=112) bsc(j,i) + read (irotam,*,end=112,err=112) (censc(k,j,i),k=1,3), + & ((blower(k,l,j),l=1,k),k=1,3) + enddo + do j=1,nlob(i) + do k=1,3 + do l=1,k + akl=0.0D0 + do m=1,3 + akl=akl+blower(k,m,j)*blower(l,m,j) + enddo + gaussc(k,l,j,i)=akl + gaussc(l,k,j,i)=akl + enddo + enddo + enddo + endif + enddo + close (irotam) + if (lprint) then + write (iout,'(/a)') 'Parameters of side-chain local geometry' + do i=1,ntyp + nlobi=nlob(i) + if (nlobi.gt.0) then + if (LaTeX) then + write (iout,'(/3a,i2,a,f8.3)') 'Residue type: ',restyp(i), + & ' # of gaussian lobes:',nlobi,' dsc:',dsc(i) + write (iout,'(1h&,a,3(2h&&,f8.3,2h&&))') + & 'log h',(bsc(j,i),j=1,nlobi) + write (iout,'(1h&,a,3(1h&,f8.3,1h&,f8.3,1h&,f8.3,1h&))') + & 'x',((censc(k,j,i),k=1,3),j=1,nlobi) + do k=1,3 + write (iout,'(2h& ,5(2x,1h&,3(f7.3,1h&)))') + & ((gaussc(k,l,j,i),l=1,3),j=1,nlobi) + enddo + else + write (iout,'(/a,8x,i1,4(25x,i1))') 'Lobe:',(j,j=1,nlobi) + write (iout,'(a,f10.4,4(16x,f10.4))') + & 'Center ',(bsc(j,i),j=1,nlobi) + write (iout,'(5(2x,3f8.4))') ((censc(k,j,i),k=1,3), + & j=1,nlobi) + write (iout,'(a)') + endif + endif + enddo + endif +#else +C +C Read scrot parameters for potentials determined from all-atom AM1 calculations +C added by Urszula Kozlowska 07/11/2007 +C + do i=1,ntyp + read (irotam,*,end=112,err=112) + if (i.eq.10) then + read (irotam,*,end=112,err=112) + else + do j=1,65 + read(irotam,*,end=112,err=112) sc_parmin(j,i) + enddo + endif + enddo +C +C Read the parameters of the probability distribution/energy expression +C of the side chains. +C + do i=1,ntyp + read (irotam_pdb,'(3x,i3,f8.3)',end=112,err=112) nlob(i),dsc(i) + if (i.eq.10) then + dsc_inv(i)=0.0D0 + else + dsc_inv(i)=1.0D0/dsc(i) + endif + if (i.ne.10) then + do j=1,nlob(i) + do k=1,3 + do l=1,3 + blower(l,k,j)=0.0D0 + enddo + enddo + enddo + bsc(1,i)=0.0D0 + read(irotam_pdb,*,end=112,err=112)(censc(k,1,i),k=1,3), + & ((blower(k,l,1),l=1,k),k=1,3) + do j=2,nlob(i) + read (irotam_pdb,*,end=112,err=112) bsc(j,i) + read (irotam_pdb,*,end=112,err=112) (censc(k,j,i),k=1,3), + & ((blower(k,l,j),l=1,k),k=1,3) + enddo + do j=1,nlob(i) + do k=1,3 + do l=1,k + akl=0.0D0 + do m=1,3 + akl=akl+blower(k,m,j)*blower(l,m,j) + enddo + gaussc(k,l,j,i)=akl + gaussc(l,k,j,i)=akl + enddo + enddo + enddo + endif + enddo + close (irotam_pdb) +#endif + close(irotam) + +#ifdef CRYST_TOR +C +C Read torsional parameters in old format +C + read (itorp,*,end=113,err=113) ntortyp,nterm_old + if (lprint)write (iout,*) 'ntortyp,nterm',ntortyp,nterm_old + read (itorp,*,end=113,err=113) (itortyp(i),i=1,ntyp) + do i=1,ntortyp + do j=1,ntortyp + read (itorp,'(a)') + do k=1,nterm_old + read (itorp,*,end=113,err=113) kk,v1(k,j,i),v2(k,j,i) + enddo + enddo + enddo + close (itorp) + if (lprint) then + write (iout,'(/a/)') 'Torsional constants:' + do i=1,ntortyp + do j=1,ntortyp + write (iout,'(2i3,6f10.5)') i,j,(v1(k,i,j),k=1,nterm_old) + write (iout,'(6x,6f10.5)') (v2(k,i,j),k=1,nterm_old) + enddo + enddo + endif +#else +C +C Read torsional parameters +C + read (itorp,*,end=113,err=113) ntortyp + read (itorp,*,end=113,err=113) (itortyp(i),i=1,ntyp) +c write (iout,*) 'ntortyp',ntortyp + do i=1,ntortyp + do j=1,ntortyp + read (itorp,*,end=113,err=113) nterm(i,j),nlor(i,j) + v0ij=0.0d0 + si=-1.0d0 + do k=1,nterm(i,j) + read (itorp,*,end=113,err=113) kk,v1(k,i,j),v2(k,i,j) + v0ij=v0ij+si*v1(k,i,j) + si=-si + enddo + do k=1,nlor(i,j) + read (itorp,*,end=113,err=113) kk,vlor1(k,i,j), + & vlor2(k,i,j),vlor3(k,i,j) + v0ij=v0ij+vlor1(k,i,j)/(1+vlor3(k,i,j)**2) + enddo + v0(i,j)=v0ij + enddo + enddo + close (itorp) + if (lprint) then + write (iout,'(/a/)') 'Torsional constants:' + do i=1,ntortyp + do j=1,ntortyp + write (iout,*) 'ityp',i,' jtyp',j + write (iout,*) 'Fourier constants' + do k=1,nterm(i,j) + write (iout,'(2(1pe15.5))') v1(k,i,j),v2(k,i,j) + enddo + write (iout,*) 'Lorenz constants' + do k=1,nlor(i,j) + write (iout,'(3(1pe15.5))') + & vlor1(k,i,j),vlor2(k,i,j),vlor3(k,i,j) + enddo + enddo + enddo + endif +C +C 6/23/01 Read parameters for double torsionals +C + do i=1,ntortyp + do j=1,ntortyp + do k=1,ntortyp + read (itordp,'(3a1)',end=114,err=114) t1,t2,t3 + if (t1.ne.onelett(i) .or. t2.ne.onelett(j) + & .or. t3.ne.onelett(k)) then + write (iout,*) "Error in double torsional parameter file", + & i,j,k,t1,t2,t3 +#ifdef MPI + call MPI_Finalize(Ierror) +#endif + stop "Error in double torsional parameter file" + endif + read (itordp,*,end=114,err=114) ntermd_1(i,j,k), + & ntermd_2(i,j,k) + read (itordp,*,end=114,err=114) (v1c(1,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) (v1s(1,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) (v1c(2,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) (v1s(2,l,i,j,k),l=1, + & ntermd_1(i,j,k)) + read (itordp,*,end=114,err=114) ((v2c(l,m,i,j,k), + & v2c(m,l,i,j,k),v2s(l,m,i,j,k),v2s(m,l,i,j,k), + & m=1,l-1),l=1,ntermd_2(i,j,k)) + enddo + enddo + enddo + if (lprint) then + write (iout,*) + write (iout,*) 'Constants for double torsionals' + do i=1,ntortyp + do j=1,ntortyp + do k=1,ntortyp + write (iout,*) 'ityp',i,' jtyp',j,' ktyp',k, + & ' nsingle',ntermd_1(i,j,k),' ndouble',ntermd_2(i,j,k) + write (iout,*) + write (iout,*) 'Single angles:' + do l=1,ntermd_1(i,j,k) + write (iout,'(i5,2f10.5,5x,2f10.5)') l, + & v1c(1,l,i,j,k),v1s(1,l,i,j,k), + & v1c(2,l,i,j,k),v1s(2,l,i,j,k) + enddo + write (iout,*) + write (iout,*) 'Pairs of angles:' + write (iout,'(3x,20i10)') (l,l=1,ntermd_2(i,j,k)) + do l=1,ntermd_2(i,j,k) + write (iout,'(i5,20f10.5)') + & l,(v2c(l,m,i,j,k),m=1,ntermd_2(i,j,k)) + enddo + write (iout,*) + write (iout,'(3x,20i10)') (l,l=1,ntermd_2(i,j,k)) + do l=1,ntermd_2(i,j,k) + write (iout,'(i5,20f10.5)') + & l,(v2s(l,m,i,j,k),m=1,ntermd_2(i,j,k)) + enddo + write (iout,*) + enddo + enddo + enddo + endif +#endif +C +C 5/21/07 (AL) Read coefficients of the backbone-local sidechain-local +C correlation energies. +C + read (isccor,*,end=119,err=119) nterm_sccor + do i=1,20 + do j=1,20 + read (isccor,'(a)') + do k=1,nterm_sccor + read (isccor,*,end=119,err=119) kk,v1sccor(k,i,j), + & v2sccor(k,i,j) + enddo + enddo + enddo + close (isccor) + if (lprint) then + write (iout,'(/a/)') 'Torsional constants of SCCORR:' + do i=1,20 + do j=1,20 + write (iout,*) 'ityp',i,' jtyp',j + do k=1,nterm_sccor + write (iout,'(2(1pe15.5))') v1sccor(k,i,j),v2sccor(k,i,j) + enddo + enddo + enddo + endif +C +C 9/18/99 (AL) Read coefficients of the Fourier expansion of the local +C interaction energy of the Gly, Ala, and Pro prototypes. +C + if (lprint) then + write (iout,*) + write (iout,*) "Coefficients of the cumulants" + endif + read (ifourier,*) nloctyp + do i=1,nloctyp + read (ifourier,*,end=115,err=115) + read (ifourier,*,end=115,err=115) (b(ii),ii=1,13) + if (lprint) then + write (iout,*) 'Type',i + write (iout,'(a,i2,a,f10.5)') ('b(',ii,')=',b(ii),ii=1,13) + endif + B1(1,i) = b(3) + B1(2,i) = b(5) +c b1(1,i)=0.0d0 +c b1(2,i)=0.0d0 + B1tilde(1,i) = b(3) + B1tilde(2,i) =-b(5) +c b1tilde(1,i)=0.0d0 +c b1tilde(2,i)=0.0d0 + B2(1,i) = b(2) + B2(2,i) = b(4) +c b2(1,i)=0.0d0 +c b2(2,i)=0.0d0 + CC(1,1,i)= b(7) + CC(2,2,i)=-b(7) + CC(2,1,i)= b(9) + CC(1,2,i)= b(9) +c CC(1,1,i)=0.0d0 +c CC(2,2,i)=0.0d0 +c CC(2,1,i)=0.0d0 +c CC(1,2,i)=0.0d0 + Ctilde(1,1,i)=b(7) + Ctilde(1,2,i)=b(9) + Ctilde(2,1,i)=-b(9) + Ctilde(2,2,i)=b(7) +c Ctilde(1,1,i)=0.0d0 +c Ctilde(1,2,i)=0.0d0 +c Ctilde(2,1,i)=0.0d0 +c Ctilde(2,2,i)=0.0d0 + DD(1,1,i)= b(6) + DD(2,2,i)=-b(6) + DD(2,1,i)= b(8) + DD(1,2,i)= b(8) +c DD(1,1,i)=0.0d0 +c DD(2,2,i)=0.0d0 +c DD(2,1,i)=0.0d0 +c DD(1,2,i)=0.0d0 + Dtilde(1,1,i)=b(6) + Dtilde(1,2,i)=b(8) + Dtilde(2,1,i)=-b(8) + Dtilde(2,2,i)=b(6) +c Dtilde(1,1,i)=0.0d0 +c Dtilde(1,2,i)=0.0d0 +c Dtilde(2,1,i)=0.0d0 +c Dtilde(2,2,i)=0.0d0 + EE(1,1,i)= b(10)+b(11) + EE(2,2,i)=-b(10)+b(11) + EE(2,1,i)= b(12)-b(13) + EE(1,2,i)= b(12)+b(13) +c ee(1,1,i)=1.0d0 +c ee(2,2,i)=1.0d0 +c ee(2,1,i)=0.0d0 +c ee(1,2,i)=0.0d0 +c ee(2,1,i)=ee(1,2,i) + enddo + if (lprint) then + do i=1,nloctyp + write (iout,*) 'Type',i + write (iout,*) 'B1' + write(iout,*) B1(1,i),B1(2,i) + write (iout,*) 'B2' + write(iout,*) B2(1,i),B2(2,i) + write (iout,*) 'CC' + do j=1,2 + write (iout,'(2f10.5)') CC(j,1,i),CC(j,2,i) + enddo + write(iout,*) 'DD' + do j=1,2 + write (iout,'(2f10.5)') DD(j,1,i),DD(j,2,i) + enddo + write(iout,*) 'EE' + do j=1,2 + write (iout,'(2f10.5)') EE(j,1,i),EE(j,2,i) + enddo + enddo + endif +C +C Read electrostatic-interaction parameters +C + if (lprint) then + write (iout,*) + write (iout,'(/a)') 'Electrostatic interaction constants:' + write (iout,'(1x,a,1x,a,10x,a,11x,a,11x,a,11x,a)') + & 'IT','JT','APP','BPP','AEL6','AEL3' + endif + read (ielep,*,end=116,err=116) ((epp(i,j),j=1,2),i=1,2) + read (ielep,*,end=116,err=116) ((rpp(i,j),j=1,2),i=1,2) + read (ielep,*,end=116,err=116) ((elpp6(i,j),j=1,2),i=1,2) + read (ielep,*,end=116,err=116) ((elpp3(i,j),j=1,2),i=1,2) + close (ielep) + do i=1,2 + do j=1,2 + rri=rpp(i,j)**6 + app (i,j)=epp(i,j)*rri*rri + bpp (i,j)=-2.0D0*epp(i,j)*rri + ael6(i,j)=elpp6(i,j)*4.2D0**6 + ael3(i,j)=elpp3(i,j)*4.2D0**3 + if (lprint) write(iout,'(2i3,4(1pe15.4))')i,j,app(i,j),bpp(i,j), + & ael6(i,j),ael3(i,j) + enddo + enddo +C +C Read side-chain interaction parameters. +C + read (isidep,*,end=117,err=117) ipot,expon + if (ipot.lt.1 .or. ipot.gt.6) then + write (iout,'(2a)') 'Error while reading SC interaction', + & 'potential file - unknown potential type.' +#ifdef MPI + call MPI_Finalize(Ierror) +#endif + stop + endif + expon2=expon/2 + if(me.eq.king) + & write(iout,'(/3a,2i3)') 'Potential is ',potname(ipot), + & ', exponents are ',expon,2*expon + goto (10,20,30,30,40,50) ipot +C----------------------- LJ potential --------------------------------- + 10 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp) + if (lprint) then + write (iout,'(/a/)') 'Parameters of the LJ potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,a)') 'residue','sigma' + write (iout,'(a3,6x,f10.5)') (restyp(i),sigma0(i),i=1,ntyp) + endif + goto 60 +C----------------------- LJK potential -------------------------------- + 20 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp),(rr0(i),i=1,ntyp) + if (lprint) then + write (iout,'(/a/)') 'Parameters of the LJK potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,2a)') 'residue',' sigma ',' r0 ' + write (iout,'(a3,6x,2f10.5)') (restyp(i),sigma0(i),rr0(i), + & i=1,ntyp) + endif + goto 60 +C---------------------- GB or BP potential ----------------------------- + 30 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp),(sigii(i),i=1,ntyp),(chip(i),i=1,ntyp), + & (alp(i),i=1,ntyp) +C For the GB potential convert sigma'**2 into chi' + if (ipot.eq.4) then + do i=1,ntyp + chip(i)=(chip(i)-1.0D0)/(chip(i)+1.0D0) + enddo + endif + if (lprint) then + write (iout,'(/a/)') 'Parameters of the BP potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,4a)') 'residue',' sigma ','s||/s_|_^2', + & ' chip ',' alph ' + write (iout,'(a3,6x,4f10.5)') (restyp(i),sigma0(i),sigii(i), + & chip(i),alp(i),i=1,ntyp) + endif + goto 60 +C--------------------- GBV potential ----------------------------------- + 40 read (isidep,*,end=116,err=116)((eps(i,j),j=i,ntyp),i=1,ntyp), + & (sigma0(i),i=1,ntyp),(rr0(i),i=1,ntyp),(sigii(i),i=1,ntyp), + & (chip(i),i=1,ntyp),(alp(i),i=1,ntyp) + if (lprint) then + write (iout,'(/a/)') 'Parameters of the GBV potential:' + write (iout,'(a/)') 'The epsilon array:' + call printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,5a)') 'residue',' sigma ',' r0 ', + & 's||/s_|_^2',' chip ',' alph ' + write (iout,'(a3,6x,5f10.5)') (restyp(i),sigma0(i),rr0(i), + & sigii(i),chip(i),alp(i),i=1,ntyp) + endif + goto 60 + +C--------------------- Momo potential ----------------------------------- + + 50 continue + + read (isidep,*) (icharge(i),i=1,ntyp) +c write (2,*) "icharge",(icharge(i),i=1,ntyp) + do i=1,ntyp + do j=1,i +c! write (*,*) "Im in ", i, " ", j + read(isidep,*) + & eps(i,j),sigma(i,j),chi(i,j),chi(j,i),chipp(i,j),chipp(j,i), + & (alphasur(k,i,j),k=1,4),sigmap(i,j),sigmap(j,i), + & chis(i,j),chis(j,i), + & nstate(i,j),(wstate(k,i,j),k=1,4), + & ((dhead(l,k,i,j),k=1,2),l=1,2),dtail(i,j),dtail(j,i), + & epshead(i,j),sig0head(i,j), + & rborn(i,j),rborn(j,i),(wqdip(k,i,j),k=1,2),wquad(i,j), + & alphapol(i,j),alphapol(j,i), + & (alphiso(k,i,j),k=1,4),sigiso(i,j),sigiso(j,i),epsintab(i,j) + END DO + END DO + +c! write (*,*) "Parameters read in" + +c! THIS LOOP FILLS PARAMETERS FOR PAIRS OF AA's NOT EXPLICITLY +c! DEFINED IN SCPARM.MOMO. IT DOES SO BY TAKING THEM FROM SYMMETRIC +c! PAIR, FOR EG. IF ARG-HIS IS BLANK, IT WILL TRY TO TAKE PARAMETERS +c! FROM HIS-ARG. +c! +c! DISABLE IT AT >>YOUR OWN PERIL<< +c! + DO i = 1, ntyp + DO j = i+1, ntyp + eps(i,j) = eps(j,i) + sigma(i,j) = sigma(j,i) + nstate(i,j) = nstate(j,i) + + DO k = 1, 4 + alphasur(k,i,j) = alphasur(k,j,i) + wstate(k,i,j) = wstate(k,j,i) + alphiso(k,i,j) = alphiso(k,j,i) + END DO + + DO k = 1, 2 + DO l = 1, 2 + dhead(k,l,i,j) = dhead(k,l,j,i) + END DO + END DO + + epshead(i,j) = epshead(j,i) + sig0head(i,j) = sig0head(j,i) + + DO k = 1, 2 + wqdip(k,i,j) = wqdip(k,j,i) + END DO + + wquad(i,j) = wquad(j,i) + epsintab(i,j) = epsintab(j,i) + + END DO + END DO + +c! IF (1.eq.0) THEN +c! write (*,*) "" +c! write (*,*) "" +c! write (*,'(f17.15)') ((eps(i,j),j=i,ntyp), i=1, ntyp) +c! write (*,'(f17.15)') (sigma0(i),i=1,ntyp) +c! write (*,'(f17.15)') (sigii(i),i=1,ntyp) +c! write (*,'(f17.15)') (chip(i),i=1,ntyp) +c! write (*,'(f17.15)') (alp(i),i=1,ntyp) +c! write (*,*) "" +c! write (*,*) "" +c! END IF + +c! This is older parameter-filling loop +c! DO i = 1, ntyp +c! DO j = 1, ntyp +c +c IF ((sig0head(i,j).EQ.0.0d0).AND.(sig0head(j,i).NE.0.0d0)) THEN +c sig0head(i,j) = sig0head(j,i) +c ELSE IF ((sig0head(j,i).EQ.0.0d0).AND.(sig0head(i,j).NE.0.0d0)) +c & THEN +c sig0head(j,i) = sig0head(i,j) +c END IF +c +c IF ((epshead(i,j).EQ.0.0d0).AND.(epshead(j,i).NE.0.0d0)) THEN +c epshead(i,j) = epshead(j,i) +c ELSE IF ((epshead(j,i).EQ.0.0d0).AND.(epshead(i,j).NE.0.0d0)) +c & THEN +c epshead(j,i) = epshead(i,j) +c END IF +c +c IF ((wquad(i,j).EQ.0.0d0).AND.(wquad(j,i).NE.0.0d0)) THEN +c wquad(i,j) = wquad(j,i) +c ELSE IF ((wquad(j,i).EQ.0.0d0).AND.(wquad(i,j).NE.0.0d0)) +c & THEN +c wquad(j,i) = wquad(i,j) +c END IF +c +c IF ((sigiso(i,j).EQ.0.0d0).AND.sigiso(j,i).NE.0.0d0)) THEN +c sigiiso(i,j) = sigiso(j,i) +c ELSE IF ((epshead(j,i).EQ.0.0d0).AND.(epshead(i,j).NE.0.0d0)) +c & THEN +c sigiso(j,i) = sigiso(i,j) +c END IF +c! DO k = 1, 4 +c! IF ((wstate(k,i,j).EQ.0.0d0).AND. +c! & (wstate(k,j,i).NE.0.0d0)) THEN +c! wstate(k,i,j) = wstate(k,j,i) +c! ELSE IF ((wstate(k,j,i).EQ.0.0d0).AND. +c! & (wstate(k,i,j).NE.0.0d0)) THEN +c! wstate(k,j,i) = wstate(k,i,j) +c! END IF +c! END DO +c! END DO +c! END DO +c! THE LOOP MAKING MOMO_TABLES SYMMETRIC ENDS HERE + + if (.not.lprint) goto 70 + write (iout,'(a)') + & "Parameters of the new physics-based SC-SC interaction potential" + write (iout,'(/7a)') 'Residues',' epsGB',' rGB', + & ' chi1GB',' chi2GB',' chip1GB',' chip2GB' + do i=1,ntyp + do j=1,i + write (iout,'(2(a3,1x),1pe10.3,5(0pf10.3))') + & restyp(i),restyp(j),eps(i,j),sigma(i,j),chi(i,j),chi(j,i), + & chipp(i,j),chipp(j,i) + enddo + enddo + write (iout,'(/9a)') 'Residues',' alphasur1',' alphasur2', + & ' alphasur3',' alphasur4',' sigmap1',' sigmap2', + & ' chis1',' chis2' + do i=1,ntyp + do j=1,i + write (iout,'(2(a3,1x),8(0pf10.3))') + & restyp(i),restyp(j),(alphasur(k,i,j),k=1,4), + & sigmap(i,j),sigmap(j,i),chis(i,j),chis(j,i) + enddo + enddo + write (iout,'(/14a)') 'Residues',' nst ',' wst1', + & ' wst2',' wst3',' wst4',' dh11',' dh21', + & ' dh12',' dh22',' dt1',' dt2',' epsh1', + & ' sigh' + do i=1,ntyp + do j=1,i + write (iout,'(2(a3,1x),i3,4f8.3,6f7.2,f9.5,f7.2)') + & restyp(i),restyp(j),nstate(i,j),(wstate(k,i,j),k=1,4), + & ((dhead(l,k,i,j),l=1,2),k=1,2),dtail(i,j),dtail(j,i), + & epshead(i,j),sig0head(i,j) + enddo + enddo + write (iout,'(/12a)') 'Residues',' ch1',' ch2', + & ' rborn1',' rborn2',' wqdip1',' wqdip2', + & ' wquad' + do i=1,ntyp + do j=1,i + write (iout,'(2(a3,1x),2i4,5f10.3)') + & restyp(i),restyp(j),icharge(i),icharge(j), + & rborn(i,j),rborn(j,i),(wqdip(k,i,j),k=1,2),wquad(i,j) + enddo + enddo + write (iout,'(/12a)') 'Residues', + & ' alphpol1', + & ' alphpol2',' alphiso1',' alpiso2', + & ' alpiso3',' alpiso4',' sigiso1',' sigiso2', + & ' epsin' + do i=1,ntyp + do j=1,i + write (iout,'(2(a3,1x),11f10.3)') + & restyp(i),restyp(j),alphapol(i,j),alphapol(j,i), + & (alphiso(k,i,j),k=1,4),sigiso(i,j),sigiso(j,i),epsintab(i,j) + enddo + enddo + goto 70 + +C For the GB potential convert sigma'**2 into chi' + DO i=1,ntyp + chip(i)=(chip(i)-1.0D0)/(chip(i)+1.0D0) + END DO + IF (lprint) THEN + write (iout,'(/a/)') 'Parameters of the BP potential:' + write (iout,'(a/)') 'The epsilon array:' + CALL printmat(ntyp,ntyp,ntyp,iout,restyp,eps) + write (iout,'(/a)') 'One-body parameters:' + write (iout,'(a,4x,4a)') 'residue',' sigma ','s||/s_|_^2', + & ' chip ',' alph ' + write (iout,'(a3,6x,4f10.5)') (restyp(i),sigma0(i),sigii(i), + & chip(i),alp(i),i=1,ntyp) + END IF + GOTO 60 + 60 CONTINUE + close (isidep) +C----------------------------------------------------------------------- +C Calculate the "working" parameters of SC interactions. + do i=2,ntyp + do j=1,i-1 + eps(i,j)=eps(j,i) + do k=1,4 + alphasur(k,j,i)=alphasur(k,i,j) + alphiso(k,j,i)=alphiso(k,i,j) + wstate(k,j,i)=wstate(k,i,j) + enddo + do k=1,2 + wqdip(k,j,i)=wqdip(k,i,j) + enddo + do k=1,2 + do l=1,2 + dhead(l,k,j,i)=dhead(l,k,i,j) + enddo + enddo + enddo + enddo + IF (ipot.LT.6) THEN + do i=1,ntyp + do j=i,ntyp + sigma(i,j)=dsqrt(sigma0(i)**2+sigma0(j)**2) + sigma(j,i)=sigma(i,j) + rs0(i,j)=dwa16*sigma(i,j) + rs0(j,i)=rs0(i,j) + enddo + enddo + END IF + + 70 continue + + if (lprint) write (iout,'(/a/10x,7a/72(1h-))') + & 'Working parameters of the SC interactions:', + & ' a ',' b ',' augm ',' sigma ',' r0 ', + & ' chi1 ',' chi2 ' + do i=1,ntyp + do j=i,ntyp + epsij=eps(i,j) + IF (ipot.eq.1 .or. ipot.eq.3 .or. ipot.eq.4 .or. ipot.eq.6) + & THEN + rrij=sigma(i,j) + ELSE + rrij=rr0(i)+rr0(j) + END IF + r0(i,j)=rrij + r0(j,i)=rrij + rrij=rrij**expon + epsij=eps(i,j) + sigeps=dsign(1.0D0,epsij) + epsij=dabs(epsij) + aa(i,j)=epsij*rrij*rrij + bb(i,j)=-sigeps*epsij*rrij + aa(j,i)=aa(i,j) + bb(j,i)=bb(i,j) + IF ((ipot.GT.2).AND.(ipot.LT.6)) THEN + sigt1sq = sigma0(i)**2 + sigt2sq = sigma0(j)**2 + sigii1 = sigii(i) + sigii2 = sigii(j) + ratsig1 = sigt2sq/sigt1sq + ratsig2 = 1.0D0/ratsig1 + chi(i,j) = (sigii1-1.0D0) / (sigii1+ratsig1) + IF (j.gt.i) chi(j,i)=(sigii2-1.0D0)/(sigii2+ratsig2) + rsum_max=dsqrt(sigii1*sigt1sq+sigii2*sigt2sq) + ELSE + rsum_max=sigma(i,j) + END IF +c if (ipot.eq.1 .or. ipot.eq.3 .or. ipot.eq.4) then + sigmaii(i,j)=rsum_max + sigmaii(j,i)=rsum_max +c else +c sigmaii(i,j)=r0(i,j) +c sigmaii(j,i)=r0(i,j) +c endif +cd write (iout,*) i,j,r0(i,j),sigma(i,j),rsum_max + if ((ipot.eq.2 .or. ipot.eq.5) .and. r0(i,j).gt.rsum_max) then + r_augm=sigma(i,j)*(rrij-sigma(i,j))/rrij + augm(i,j)=epsij*r_augm**(2*expon) +c augm(i,j)=0.5D0**(2*expon)*aa(i,j) + augm(j,i)=augm(i,j) + else + augm(i,j)=0.0D0 + augm(j,i)=0.0D0 + endif + + if (lprint) then + if (ipot.lt.6) then + write (iout,'(2(a3,2x),3(1pe10.3),5(0pf8.3))') + & restyp(i),restyp(j),aa(i,j),bb(i,j),augm(i,j), + & sigma(i,j),r0(i,j),chi(i,j),chi(j,i) + else + write (iout,'(2(a3,2x),3(1pe10.3),5(0pf8.3),2i3,10f8.4, + & i3,40f10.4)') + & restyp(i),restyp(j),aa(i,j),bb(i,j),augm(i,j), + & sigma(i,j),r0(i,j),chi(i,j),chi(j,i), + & icharge(i),icharge(j),chipp(i,j),chipp(j,i), + & (alphasur(k,i,j),k=1,4),sigmap(i,j),sigmap(j,i), + & chis(i,j),chis(j,i), + & nstate(i,j),(wstate(k,i,j),k=1,4), + & ((dhead(l,k,i,j),l=1,2),k=1,2),dtail(i,j),dtail(j,i), + & epshead(i,j),sig0head(i,j), + & rborn(i,j),(wqdip(k,i,j),k=1,2),wquad(i,j), + & alphapol(i,j),alphapol(j,i), + & (alphiso(k,i,j),k=1,4),sigiso(i,j) + + endif + endif + enddo + enddo + + + +#ifdef OLDSCP +C +C Define the SC-p interaction constants (hard-coded; old style) +C + do i=1,20 +C "Soft" SC-p repulsion (causes helices to be too flat, but facilitates +C helix formation) +c aad(i,1)=0.3D0*4.0D0**12 +C Following line for constants currently implemented +C "Hard" SC-p repulsion (gives correct turn spacing in helices) + aad(i,1)=1.5D0*4.0D0**12 +c aad(i,1)=0.17D0*5.6D0**12 + aad(i,2)=aad(i,1) +C "Soft" SC-p repulsion + bad(i,1)=0.0D0 +C Following line for constants currently implemented +c aad(i,1)=0.3D0*4.0D0**6 +C "Hard" SC-p repulsion + bad(i,1)=3.0D0*4.0D0**6 +c bad(i,1)=-2.0D0*0.17D0*5.6D0**6 + bad(i,2)=bad(i,1) +c aad(i,1)=0.0D0 +c aad(i,2)=0.0D0 +c bad(i,1)=1228.8D0 +c bad(i,2)=1228.8D0 + enddo +#else +C +C 8/9/01 Read the SC-p interaction constants from file +C + do i=1,ntyp + read (iscpp,*,end=118,err=118) (eps_scp(i,j),rscp(i,j),j=1,2) + enddo + do i=1,ntyp + aad(i,1)=dabs(eps_scp(i,1))*rscp(i,1)**12 + aad(i,2)=dabs(eps_scp(i,2))*rscp(i,2)**12 + bad(i,1)=-2*eps_scp(i,1)*rscp(i,1)**6 + bad(i,2)=-2*eps_scp(i,2)*rscp(i,2)**6 + enddo + + if (lprint) then + write (iout,'(/a)') "Parameters of SC-p interactions:" + do i=1,20 + write (iout,'(4f8.3,4e12.4)') eps_scp(i,1),rscp(i,1), + & eps_scp(i,2),rscp(i,2),aad(i,1),bad(i,1),aad(i,2),bad(i,2) + enddo + endif +#endif +C +C Define the constants of the disulfide bridge +C + ebr=-5.50D0 +c +c Old arbitrary potential - commented out. +c +c dbr= 4.20D0 +c fbr= 3.30D0 +c +c Constants of the disulfide-bond potential determined based on the RHF/6-31G** +c energy surface of diethyl disulfide. +c A. Liwo and U. Kozlowska, 11/24/03 +c + D0CM = 3.78d0 + AKCM = 15.1d0 + AKTH = 11.0d0 + AKCT = 12.0d0 + V1SS =-1.08d0 + V2SS = 7.61d0 + V3SS = 13.7d0 +c akcm=0.0d0 +c akth=0.0d0 +c akct=0.0d0 +c v1ss=0.0d0 +c v2ss=0.0d0 +c v3ss=0.0d0 + +c! print *, " " +c! print *, "END OF PARMREAD" +c! print *, "eps = ", eps(9,9), "sigma = ", sigma(9,9) +c! print *, "chi1 = ", chi(9,9), "chi2 = ", chi(9,9) +c! print *, "chip1 = ", chipp(9,9), "chip2 = ", chipp(9,9) +c! print *, "sig1 = ", sigmap(9,9), "sig2 = ", sigmap(9,9) +c! print *, "chis1 = ", chis(9,9)," chis2 = ", chis(9,9) +c! print *, "END OF PARMREAD" +c! print *, " " + + + if(me.eq.king) then + write (iout,'(/a)') "Disulfide bridge parameters:" + write (iout,'(a,f10.2)') 'S-S bridge energy: ',ebr + write (iout,'(2(a,f10.2))') 'd0cm:',d0cm,' akcm:',akcm + write (iout,'(2(a,f10.2))') 'akth:',akth,' akct:',akct + write (iout,'(3(a,f10.2))') 'v1ss:',v1ss,' v2ss:',v2ss, + & ' v3ss:',v3ss + endif + return + 111 write (iout,*) "Error reading bending energy parameters." + goto 999 + 112 write (iout,*) "Error reading rotamer energy parameters." + goto 999 + 113 write (iout,*) "Error reading torsional energy parameters." + goto 999 + 114 write (iout,*) "Error reading double torsional energy parameters." + goto 999 + 115 write (iout,*) + & "Error reading cumulant (multibody energy) parameters." + goto 999 + 116 write (iout,*) "Error reading electrostatic energy parameters." + goto 999 + 117 write (iout,*) "Error reading side chain interaction parameters." + goto 999 + 118 write (iout,*) "Error reading SCp interaction parameters." + goto 999 + 119 write (iout,*) "Error reading SCCOR parameters" + 999 continue +#ifdef MPI + call MPI_Finalize(Ierror) +#endif + stop + return + end + + + subroutine getenv_loc(var, val) + character(*) var, val + +#ifdef WINIFL + character(2000) line + external ilen + + open (196,file='env',status='old',readonly,shared) + iread=0 +c write(*,*)'looking for ',var +10 read(196,*,err=11,end=11)line + iread=index(line,var) +c write(*,*)iread,' ',var,' ',line + if (iread.eq.0) go to 10 +c write(*,*)'---> ',line +11 continue + if(iread.eq.0) then +c write(*,*)'CHUJ' + val='' + else + iread=iread+ilen(var)+1 + read (line(iread:),*,err=12,end=12) val +c write(*,*)'OK: ',var,' = ',val + endif + close(196) + return +12 val='' + close(196) +#elif (defined CRAY) + integer lennam,lenval,ierror +c +c getenv using a POSIX call, useful on the T3D +c Sept 1996, comment out error check on advice of H. Pritchard +c + lennam = len(var) + if(lennam.le.0) stop '--error calling getenv--' + call pxfgetenv(var,lennam,val,lenval,ierror) +c-HP- if(ierror.ne.0) stop '--error returned by pxfgetenv--' +#else + call getenv(var,val) +#endif + + return + end diff --git a/source/unres/src_MD-NEWSC/pinorm.f b/source/unres/src_MD-NEWSC/pinorm.f new file mode 100644 index 0000000..91392bf --- /dev/null +++ b/source/unres/src_MD-NEWSC/pinorm.f @@ -0,0 +1,17 @@ + double precision function pinorm(x) + implicit real*8 (a-h,o-z) +c +c this function takes an angle (in radians) and puts it in the range of +c -pi to +pi. +c + integer n + include 'COMMON.GEO' + n = x / dwapi + pinorm = x - n * dwapi + if ( pinorm .gt. pi ) then + pinorm = pinorm - dwapi + else if ( pinorm .lt. - pi ) then + pinorm = pinorm + dwapi + end if + return + end diff --git a/source/unres/src_MD-NEWSC/printmat.f b/source/unres/src_MD-NEWSC/printmat.f new file mode 100644 index 0000000..be2b38f --- /dev/null +++ b/source/unres/src_MD-NEWSC/printmat.f @@ -0,0 +1,16 @@ + subroutine printmat(ldim,m,n,iout,key,a) + character*3 key(n) + double precision a(ldim,n) + do 1 i=1,n,8 + nlim=min0(i+7,n) + write (iout,1000) (key(k),k=i,nlim) + write (iout,1020) + 1000 format (/5x,8(6x,a3)) + 1020 format (/80(1h-)/) + do 2 j=1,n + write (iout,1010) key(j),(a(j,k),k=i,nlim) + 2 continue + 1 continue + 1010 format (a3,2x,8(f9.4)) + return + end diff --git a/source/unres/src_MD-NEWSC/prng.f b/source/unres/src_MD-NEWSC/prng.f new file mode 100644 index 0000000..73f6766 --- /dev/null +++ b/source/unres/src_MD-NEWSC/prng.f @@ -0,0 +1,525 @@ + real*8 function prng_next(me) + implicit none + integer me +c +c Calling sequence: +c = prng_next ( ) +c = vprng ( , , ) +c +c This code is based on a sequential algorithm provided by Mal Kalos. +c This version uses a single 64-bit word to store the initial seeds +c and additive constants. +c A 64-bit floating point number is returned. +c +c The array "iparam" is full-word aligned, being padded by zeros to +c let each generator be on a subpage boundary. +c That is, rows 1 and 2 in a given column of the array are for real, +c rows 3-16 are bogus. +c +c July 12, 1993: double the number of sequences. We should have been +c using two packets per seed, rather than four +c October 31, 1993: merge the two arrays of seeds and constants, +c and switch to 64-bit arithmetic. +c June 1994: port to RS6K. Internal state is kept as 2 64-bit integers +c The ishft function is defined only on 32-bit integers, so we will +c shift numbers by dividing by 2**11 and then adding on 2**53-1. +c +c November 1994: ishift now works on 64-bit numbers (though it gives a +c warning). Thus we go back to using it. John Zollweg also added the +c vprng() routine to return vectors of real*8 random numbers. +c + real*8 recip53 + parameter ( recip53 = 2.0D0**(-53) ) + integer*8 two + parameter ( two = 2**11) + integer*8 m,ishift +c parameter ( m = 34522712143931 ) ! 11**13 +c parameter ( ishift = 9007199254740991 ) ! 2**53-1 + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + integer*8 next + +crc g77 doesn't support integer*8 constants + m = dint(34522712143931.0d0) + ishift = dint(9007199254740991.0d0) + +c RS6K porting note: ishift now takes 64-bit integers , with a warning + if ( 0.le.me .and. me.le.nmax ) then + next = iparam(1,me)*m + iparam(2,me) + iparam(1,me) = next + prng_next = recip53 * ishft( next, -11 ) + else + prng_next=-1.0D0 + endif + + end +c +c vprng(me, rn, num) Get a vector of random numbers +c + subroutine vprng(me,rn,num) + real*8 recip53, rn(1) + parameter ( recip53 = 2.0D0**(-53) ) + integer*8 m,iparam +c parameter ( m = 34522712143931 ) ! 11**13 + integer nmax, num, me + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + integer*8 next + +crc g77 doesn't support integer*8 constants + m = dint(34522712143931.0d0) + + if ( 0.le.me .and. me.le.nmax ) then + do 1 i=1,num + next = iparam(1,me)*m + iparam(2,me) + iparam(1,me) = next + rn(i) = recip53 * ishft( next, -11 ) + 1 continue + else + rn(1)=-1.0D0 + endif + return + end + +c +c prng_chkpnt Get the current state of a generator +c +c Calling sequence: +c logical prng_chkpnt, status +c status = prng_chkpnt (me, iseed) where +c +c me is the particular generator whose state is being gotten +c seed is an 4-element integer array where the "l"-values will be saved +c + logical function prng_chkpnt (me, iseed) + implicit none + integer me + integer*8 iseed + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + if (me .lt. 0 .or. me .gt. nmax) then + prng_chkpnt=.false. + else + prng_chkpnt=.true. + iseed=iparam(1,me) + endif + end +c +c prng_restart Restart generator from a saved state +c +c Calling sequence: +c logical prng_restart, status +c status = prng_restart (me, iseed) where +c +c me is the particular generator being restarted +c iseed is a 8-byte integer containing the "l"-values +c + logical function prng_restart (me, iseed) + implicit none + integer me + integer*8 iseed + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + if (me .lt. 0 .or. me .gt. nmax) then + prng_restart=.false. + return + else + prng_restart=.true. + iparam(1,me)=iseed + endif + end + + block data prngblk + parameter(nmax=1021) + integer*8 iparam + common/ksrprng/iparam(2,0:nmax) + data (iparam(1,i),iparam(2,i),i= 0, 29) / + + 11848219, 11848219, 11848237, 11848237, 11848241, 11848241, + + 11848247, 11848247, 11848253, 11848253, 11848271, 11848271, + + 11848297, 11848297, 11848313, 11848313, 11848339, 11848339, + + 11848351, 11848351, 11848357, 11848357, 11848363, 11848363, + + 11848367, 11848367, 11848373, 11848373, 11848379, 11848379, + + 11848393, 11848393, 11848433, 11848433, 11848451, 11848451, + + 11848469, 11848469, 11848477, 11848477, 11848489, 11848489, + + 11848493, 11848493, 11848513, 11848513, 11848523, 11848523, + + 11848531, 11848531, 11848537, 11848537, 11848553, 11848553, + + 11848589, 11848589, 11848591, 11848591, 11848601, 11848601 / + data (iparam(1,i),iparam(2,i),i= 30, 59) / + + 11848619, 11848619, 11848637, 11848637, 11848663, 11848663, + + 11848673, 11848673, 11848679, 11848679, 11848691, 11848691, + + 11848699, 11848699, 11848709, 11848709, 11848717, 11848717, + + 11848721, 11848721, 11848729, 11848729, 11848741, 11848741, + + 11848751, 11848751, 11848757, 11848757, 11848787, 11848787, + + 11848801, 11848801, 11848829, 11848829, 11848853, 11848853, + + 11848861, 11848861, 11848867, 11848867, 11848873, 11848873, + + 11848891, 11848891, 11848909, 11848909, 11848919, 11848919, + + 11848931, 11848931, 11848937, 11848937, 11848961, 11848961, + + 11848981, 11848981, 11849021, 11849021, 11849039, 11849039 / + data (iparam(1,i),iparam(2,i),i= 60, 89) / + + 11849053, 11849053, 11849059, 11849059, 11849069, 11849069, + + 11849077, 11849077, 11849087, 11849087, 11849093, 11849093, + + 11849107, 11849107, 11849111, 11849111, 11849129, 11849129, + + 11849137, 11849137, 11849177, 11849177, 11849183, 11849183, + + 11849203, 11849203, 11849231, 11849231, 11849237, 11849237, + + 11849239, 11849239, 11849249, 11849249, 11849251, 11849251, + + 11849269, 11849269, 11849273, 11849273, 11849291, 11849291, + + 11849297, 11849297, 11849309, 11849309, 11849339, 11849339, + + 11849359, 11849359, 11849363, 11849363, 11849399, 11849399, + + 11849401, 11849401, 11849413, 11849413, 11849417, 11849417 / + data (iparam(1,i),iparam(2,i),i= 90, 119) / + + 11849437, 11849437, 11849443, 11849443, 11849473, 11849473, + + 11849491, 11849491, 11849503, 11849503, 11849507, 11849507, + + 11849557, 11849557, 11849567, 11849567, 11849569, 11849569, + + 11849573, 11849573, 11849587, 11849587, 11849599, 11849599, + + 11849633, 11849633, 11849641, 11849641, 11849653, 11849653, + + 11849659, 11849659, 11849671, 11849671, 11849683, 11849683, + + 11849689, 11849689, 11849693, 11849693, 11849699, 11849699, + + 11849701, 11849701, 11849707, 11849707, 11849713, 11849713, + + 11849723, 11849723, 11849741, 11849741, 11849743, 11849743, + + 11849759, 11849759, 11849767, 11849767, 11849771, 11849771 / + data (iparam(1,i),iparam(2,i),i= 120, 149) / + + 11849791, 11849791, 11849801, 11849801, 11849809, 11849809, + + 11849813, 11849813, 11849869, 11849869, 11849881, 11849881, + + 11849891, 11849891, 11849909, 11849909, 11849923, 11849923, + + 11849933, 11849933, 11849947, 11849947, 11849987, 11849987, + + 11850001, 11850001, 11850011, 11850011, 11850019, 11850019, + + 11850023, 11850023, 11850031, 11850031, 11850049, 11850049, + + 11850061, 11850061, 11850073, 11850073, 11850077, 11850077, + + 11850103, 11850103, 11850109, 11850109, 11850121, 11850121, + + 11850127, 11850127, 11850133, 11850133, 11850149, 11850149, + + 11850161, 11850161, 11850169, 11850169, 11850191, 11850191 / + data (iparam(1,i),iparam(2,i),i= 150, 179) / + + 11850233, 11850233, 11850247, 11850247, 11850259, 11850259, + + 11850269, 11850269, 11850283, 11850283, 11850301, 11850301, + + 11850341, 11850341, 11850347, 11850347, 11850367, 11850367, + + 11850373, 11850373, 11850379, 11850379, 11850389, 11850389, + + 11850407, 11850407, 11850427, 11850427, 11850437, 11850437, + + 11850469, 11850469, 11850481, 11850481, 11850511, 11850511, + + 11850529, 11850529, 11850541, 11850541, 11850557, 11850557, + + 11850607, 11850607, 11850611, 11850611, 11850667, 11850667, + + 11850677, 11850677, 11850679, 11850679, 11850701, 11850701, + + 11850731, 11850731, 11850739, 11850739, 11850749, 11850749 / + data (iparam(1,i),iparam(2,i),i= 180, 209) / + + 11850791, 11850791, 11850803, 11850803, 11850829, 11850829, + + 11850833, 11850833, 11850859, 11850859, 11850877, 11850877, + + 11850899, 11850899, 11850907, 11850907, 11850913, 11850913, + + 11850919, 11850919, 11850931, 11850931, 11850941, 11850941, + + 11850947, 11850947, 11850953, 11850953, 11850961, 11850961, + + 11850983, 11850983, 11850991, 11850991, 11850997, 11850997, + + 11851031, 11851031, 11851033, 11851033, 11851051, 11851051, + + 11851061, 11851061, 11851067, 11851067, 11851093, 11851093, + + 11851109, 11851109, 11851123, 11851123, 11851127, 11851127, + + 11851139, 11851139, 11851157, 11851157, 11851163, 11851163 / + data (iparam(1,i),iparam(2,i),i= 210, 239) / + + 11851181, 11851181, 11851201, 11851201, 11851219, 11851219, + + 11851291, 11851291, 11851303, 11851303, 11851309, 11851309, + + 11851313, 11851313, 11851319, 11851319, 11851349, 11851349, + + 11851351, 11851351, 11851361, 11851361, 11851373, 11851373, + + 11851403, 11851403, 11851409, 11851409, 11851423, 11851423, + + 11851447, 11851447, 11851451, 11851451, 11851481, 11851481, + + 11851493, 11851493, 11851519, 11851519, 11851523, 11851523, + + 11851529, 11851529, 11851547, 11851547, 11851549, 11851549, + + 11851559, 11851559, 11851577, 11851577, 11851589, 11851589, + + 11851591, 11851591, 11851597, 11851597, 11851603, 11851603 / + data (iparam(1,i),iparam(2,i),i= 240, 269) / + + 11851607, 11851607, 11851613, 11851613, 11851621, 11851621, + + 11851627, 11851627, 11851639, 11851639, 11851673, 11851673, + + 11851681, 11851681, 11851727, 11851727, 11851753, 11851753, + + 11851759, 11851759, 11851787, 11851787, 11851793, 11851793, + + 11851799, 11851799, 11851813, 11851813, 11851841, 11851841, + + 11851859, 11851859, 11851867, 11851867, 11851891, 11851891, + + 11851909, 11851909, 11851919, 11851919, 11851927, 11851927, + + 11851933, 11851933, 11851949, 11851949, 11851967, 11851967, + + 11851997, 11851997, 11852017, 11852017, 11852051, 11852051, + + 11852053, 11852053, 11852059, 11852059, 11852083, 11852083 / + data (iparam(1,i),iparam(2,i),i= 270, 299) / + + 11852089, 11852089, 11852129, 11852129, 11852147, 11852147, + + 11852149, 11852149, 11852161, 11852161, 11852171, 11852171, + + 11852177, 11852177, 11852209, 11852209, 11852221, 11852221, + + 11852237, 11852237, 11852251, 11852251, 11852263, 11852263, + + 11852273, 11852273, 11852279, 11852279, 11852287, 11852287, + + 11852293, 11852293, 11852297, 11852297, 11852303, 11852303, + + 11852311, 11852311, 11852327, 11852327, 11852339, 11852339, + + 11852341, 11852341, 11852359, 11852359, 11852369, 11852369, + + 11852437, 11852437, 11852453, 11852453, 11852459, 11852459, + + 11852473, 11852473, 11852513, 11852513, 11852531, 11852531 / + data (iparam(1,i),iparam(2,i),i= 300, 329) / + + 11852537, 11852537, 11852539, 11852539, 11852557, 11852557, + + 11852573, 11852573, 11852579, 11852579, 11852591, 11852591, + + 11852609, 11852609, 11852611, 11852611, 11852623, 11852623, + + 11852641, 11852641, 11852647, 11852647, 11852657, 11852657, + + 11852663, 11852663, 11852717, 11852717, 11852719, 11852719, + + 11852741, 11852741, 11852759, 11852759, 11852767, 11852767, + + 11852773, 11852773, 11852803, 11852803, 11852807, 11852807, + + 11852809, 11852809, 11852831, 11852831, 11852833, 11852833, + + 11852837, 11852837, 11852857, 11852857, 11852873, 11852873, + + 11852879, 11852879, 11852891, 11852891, 11852917, 11852917 / + data (iparam(1,i),iparam(2,i),i= 330, 359) / + + 11852921, 11852921, 11852957, 11852957, 11852959, 11852959, + + 11852969, 11852969, 11852983, 11852983, 11852989, 11852989, + + 11853001, 11853001, 11853013, 11853013, 11853019, 11853019, + + 11853031, 11853031, 11853089, 11853089, 11853133, 11853133, + + 11853157, 11853157, 11853161, 11853161, 11853181, 11853181, + + 11853203, 11853203, 11853217, 11853217, 11853221, 11853221, + + 11853227, 11853227, 11853241, 11853241, 11853307, 11853307, + + 11853319, 11853319, 11853323, 11853323, 11853329, 11853329, + + 11853367, 11853367, 11853383, 11853383, 11853419, 11853419, + + 11853421, 11853421, 11853427, 11853427, 11853449, 11853449 / + data (iparam(1,i),iparam(2,i),i= 360, 389) / + + 11853451, 11853451, 11853463, 11853463, 11853529, 11853529, + + 11853557, 11853557, 11853571, 11853571, 11853601, 11853601, + + 11853613, 11853613, 11853617, 11853617, 11853629, 11853629, + + 11853649, 11853649, 11853659, 11853659, 11853679, 11853679, + + 11853689, 11853689, 11853719, 11853719, 11853731, 11853731, + + 11853757, 11853757, 11853761, 11853761, 11853773, 11853773, + + 11853791, 11853791, 11853817, 11853817, 11853839, 11853839, + + 11853847, 11853847, 11853857, 11853857, 11853869, 11853869, + + 11853883, 11853883, 11853887, 11853887, 11853889, 11853889, + + 11853893, 11853893, 11853899, 11853899, 11853911, 11853911 / + data (iparam(1,i),iparam(2,i),i= 390, 419) / + + 11853931, 11853931, 11853943, 11853943, 11853979, 11853979, + + 11853991, 11853991, 11854001, 11854001, 11854009, 11854009, + + 11854019, 11854019, 11854057, 11854057, 11854061, 11854061, + + 11854147, 11854147, 11854159, 11854159, 11854163, 11854163, + + 11854169, 11854169, 11854211, 11854211, 11854247, 11854247, + + 11854261, 11854261, 11854267, 11854267, 11854279, 11854279, + + 11854303, 11854303, 11854327, 11854327, 11854331, 11854331, + + 11854333, 11854333, 11854363, 11854363, 11854379, 11854379, + + 11854399, 11854399, 11854411, 11854411, 11854429, 11854429, + + 11854433, 11854433, 11854439, 11854439, 11854441, 11854441 / + data (iparam(1,i),iparam(2,i),i= 420, 449) / + + 11854463, 11854463, 11854477, 11854477, 11854489, 11854489, + + 11854517, 11854517, 11854519, 11854519, 11854523, 11854523, + + 11854529, 11854529, 11854567, 11854567, 11854571, 11854571, + + 11854573, 11854573, 11854603, 11854603, 11854607, 11854607, + + 11854681, 11854681, 11854691, 11854691, 11854709, 11854709, + + 11854723, 11854723, 11854757, 11854757, 11854783, 11854783, + + 11854793, 11854793, 11854813, 11854813, 11854847, 11854847, + + 11854853, 11854853, 11854873, 11854873, 11854877, 11854877, + + 11854883, 11854883, 11854891, 11854891, 11854897, 11854897, + + 11854901, 11854901, 11854919, 11854919, 11854937, 11854937 / + data (iparam(1,i),iparam(2,i),i= 450, 479) / + + 11854961, 11854961, 11854963, 11854963, 11854979, 11854979, + + 11855003, 11855003, 11855017, 11855017, 11855023, 11855023, + + 11855029, 11855029, 11855033, 11855033, 11855111, 11855111, + + 11855141, 11855141, 11855147, 11855147, 11855149, 11855149, + + 11855159, 11855159, 11855177, 11855177, 11855203, 11855203, + + 11855213, 11855213, 11855219, 11855219, 11855231, 11855231, + + 11855267, 11855267, 11855269, 11855269, 11855303, 11855303, + + 11855309, 11855309, 11855321, 11855321, 11855329, 11855329, + + 11855339, 11855339, 11855351, 11855351, 11855353, 11855353, + + 11855357, 11855357, 11855359, 11855359, 11855381, 11855381 / + data (iparam(1,i),iparam(2,i),i= 480, 509) / + + 11855383, 11855383, 11855387, 11855387, 11855399, 11855399, + + 11855407, 11855407, 11855413, 11855413, 11855489, 11855489, + + 11855491, 11855491, 11855507, 11855507, 11855521, 11855521, + + 11855531, 11855531, 11855549, 11855549, 11855551, 11855551, + + 11855567, 11855567, 11855581, 11855581, 11855587, 11855587, + + 11855593, 11855593, 11855633, 11855633, 11855653, 11855653, + + 11855663, 11855663, 11855687, 11855687, 11855689, 11855689, + + 11855699, 11855699, 11855713, 11855713, 11855731, 11855731, + + 11855737, 11855737, 11855743, 11855743, 11855747, 11855747, + + 11855759, 11855759, 11855773, 11855773, 11855801, 11855801 / + data (iparam(1,i),iparam(2,i),i= 510, 539) / + + 11855807, 11855807, 11855813, 11855813, 11855827, 11855827, + + 11855839, 11855839, 11855869, 11855869, 11855881, 11855881, + + 11855903, 11855903, 11855911, 11855911, 11855933, 11855933, + + 11855959, 11855959, 11855989, 11855989, 11855993, 11855993, + + 11855999, 11855999, 11856001, 11856001, 11856023, 11856023, + + 11856049, 11856049, 11856071, 11856071, 11856101, 11856101, + + 11856107, 11856107, 11856113, 11856113, 11856139, 11856139, + + 11856151, 11856151, 11856161, 11856161, 11856179, 11856179, + + 11856193, 11856193, 11856199, 11856199, 11856223, 11856223, + + 11856239, 11856239, 11856263, 11856263, 11856269, 11856269 / + data (iparam(1,i),iparam(2,i),i= 540, 569) / + + 11856281, 11856281, 11856287, 11856287, 11856307, 11856307, + + 11856311, 11856311, 11856329, 11856329, 11856343, 11856343, + + 11856359, 11856359, 11856371, 11856371, 11856373, 11856373, + + 11856409, 11856409, 11856419, 11856419, 11856461, 11856461, + + 11856469, 11856469, 11856473, 11856473, 11856479, 11856479, + + 11856511, 11856511, 11856517, 11856517, 11856541, 11856541, + + 11856547, 11856547, 11856553, 11856553, 11856583, 11856583, + + 11856629, 11856629, 11856641, 11856641, 11856653, 11856653, + + 11856659, 11856659, 11856673, 11856673, 11856697, 11856697, + + 11856709, 11856709, 11856727, 11856727, 11856731, 11856731 / + data (iparam(1,i),iparam(2,i),i= 570, 599) / + + 11856763, 11856763, 11856809, 11856809, 11856811, 11856811, + + 11856821, 11856821, 11856841, 11856841, 11856857, 11856857, + + 11856877, 11856877, 11856883, 11856883, 11856899, 11856899, + + 11856919, 11856919, 11856947, 11856947, 11856953, 11856953, + + 11856979, 11856979, 11857003, 11857003, 11857033, 11857033, + + 11857037, 11857037, 11857039, 11857039, 11857049, 11857049, + + 11857061, 11857061, 11857067, 11857067, 11857073, 11857073, + + 11857081, 11857081, 11857091, 11857091, 11857093, 11857093, + + 11857099, 11857099, 11857123, 11857123, 11857127, 11857127, + + 11857147, 11857147, 11857151, 11857151, 11857193, 11857193 / + data (iparam(1,i),iparam(2,i),i= 600, 629) / + + 11857217, 11857217, 11857229, 11857229, 11857243, 11857243, + + 11857249, 11857249, 11857267, 11857267, 11857277, 11857277, + + 11857291, 11857291, 11857303, 11857303, 11857309, 11857309, + + 11857327, 11857327, 11857331, 11857331, 11857333, 11857333, + + 11857361, 11857361, 11857367, 11857367, 11857369, 11857369, + + 11857393, 11857393, 11857399, 11857399, 11857409, 11857409, + + 11857421, 11857421, 11857423, 11857423, 11857451, 11857451, + + 11857453, 11857453, 11857457, 11857457, 11857477, 11857477, + + 11857481, 11857481, 11857493, 11857493, 11857499, 11857499, + + 11857519, 11857519, 11857523, 11857523, 11857529, 11857529 / + data (iparam(1,i),iparam(2,i),i= 630, 659) / + + 11857543, 11857543, 11857561, 11857561, 11857589, 11857589, + + 11857591, 11857591, 11857613, 11857613, 11857621, 11857621, + + 11857661, 11857661, 11857667, 11857667, 11857693, 11857693, + + 11857697, 11857697, 11857709, 11857709, 11857711, 11857711, + + 11857751, 11857751, 11857753, 11857753, 11857759, 11857759, + + 11857763, 11857763, 11857777, 11857777, 11857787, 11857787, + + 11857793, 11857793, 11857801, 11857801, 11857817, 11857817, + + 11857819, 11857819, 11857831, 11857831, 11857837, 11857837, + + 11857873, 11857873, 11857877, 11857877, 11857883, 11857883, + + 11857889, 11857889, 11857907, 11857907, 11857913, 11857913 / + data (iparam(1,i),iparam(2,i),i= 660, 689) / + + 11857931, 11857931, 11857969, 11857969, 11857991, 11857991, + + 11857999, 11857999, 11858009, 11858009, 11858017, 11858017, + + 11858023, 11858023, 11858029, 11858029, 11858039, 11858039, + + 11858051, 11858051, 11858057, 11858057, 11858059, 11858059, + + 11858101, 11858101, 11858111, 11858111, 11858131, 11858131, + + 11858149, 11858149, 11858159, 11858159, 11858177, 11858177, + + 11858191, 11858191, 11858201, 11858201, 11858227, 11858227, + + 11858243, 11858243, 11858267, 11858267, 11858269, 11858269, + + 11858279, 11858279, 11858281, 11858281, 11858291, 11858291, + + 11858311, 11858311, 11858323, 11858323, 11858359, 11858359 / + data (iparam(1,i),iparam(2,i),i= 690, 719) / + + 11858377, 11858377, 11858381, 11858381, 11858387, 11858387, + + 11858423, 11858423, 11858443, 11858443, 11858447, 11858447, + + 11858479, 11858479, 11858533, 11858533, 11858543, 11858543, + + 11858551, 11858551, 11858557, 11858557, 11858569, 11858569, + + 11858573, 11858573, 11858579, 11858579, 11858597, 11858597, + + 11858599, 11858599, 11858629, 11858629, 11858657, 11858657, + + 11858659, 11858659, 11858683, 11858683, 11858701, 11858701, + + 11858719, 11858719, 11858723, 11858723, 11858729, 11858729, + + 11858747, 11858747, 11858779, 11858779, 11858783, 11858783, + + 11858801, 11858801, 11858807, 11858807, 11858813, 11858813 / + data (iparam(1,i),iparam(2,i),i= 720, 749) / + + 11858839, 11858839, 11858851, 11858851, 11858893, 11858893, + + 11858897, 11858897, 11858921, 11858921, 11858947, 11858947, + + 11858953, 11858953, 11858969, 11858969, 11858971, 11858971, + + 11858989, 11858989, 11859017, 11859017, 11859031, 11859031, + + 11859049, 11859049, 11859061, 11859061, 11859073, 11859073, + + 11859077, 11859077, 11859079, 11859079, 11859083, 11859083, + + 11859101, 11859101, 11859109, 11859109, 11859137, 11859137, + + 11859139, 11859139, 11859151, 11859151, 11859157, 11859157, + + 11859163, 11859163, 11859167, 11859167, 11859179, 11859179, + + 11859187, 11859187, 11859229, 11859229, 11859233, 11859233 / + data (iparam(1,i),iparam(2,i),i= 750, 779) / + + 11859241, 11859241, 11859247, 11859247, 11859269, 11859269, + + 11859293, 11859293, 11859307, 11859307, 11859311, 11859311, + + 11859349, 11859349, 11859359, 11859359, 11859371, 11859371, + + 11859377, 11859377, 11859383, 11859383, 11859427, 11859427, + + 11859433, 11859433, 11859451, 11859451, 11859457, 11859457, + + 11859461, 11859461, 11859473, 11859473, 11859481, 11859481, + + 11859487, 11859487, 11859493, 11859493, 11859503, 11859503, + + 11859509, 11859509, 11859539, 11859539, 11859541, 11859541, + + 11859563, 11859563, 11859569, 11859569, 11859571, 11859571, + + 11859583, 11859583, 11859599, 11859599, 11859611, 11859611 / + data (iparam(1,i),iparam(2,i),i= 780, 809) / + + 11859643, 11859643, 11859707, 11859707, 11859713, 11859713, + + 11859719, 11859719, 11859739, 11859739, 11859751, 11859751, + + 11859791, 11859791, 11859817, 11859817, 11859821, 11859821, + + 11859833, 11859833, 11859847, 11859847, 11859853, 11859853, + + 11859877, 11859877, 11859889, 11859889, 11859893, 11859893, + + 11859901, 11859901, 11859907, 11859907, 11859917, 11859917, + + 11859923, 11859923, 11859929, 11859929, 11859961, 11859961, + + 11859979, 11859979, 11859989, 11859989, 11859997, 11859997, + + 11860021, 11860021, 11860031, 11860031, 11860039, 11860039, + + 11860049, 11860049, 11860081, 11860081, 11860087, 11860087 / + data (iparam(1,i),iparam(2,i),i= 810, 839) / + + 11860097, 11860097, 11860103, 11860103, 11860109, 11860109, + + 11860117, 11860117, 11860133, 11860133, 11860151, 11860151, + + 11860171, 11860171, 11860207, 11860207, 11860223, 11860223, + + 11860231, 11860231, 11860243, 11860243, 11860267, 11860267, + + 11860301, 11860301, 11860307, 11860307, 11860327, 11860327, + + 11860379, 11860379, 11860397, 11860397, 11860411, 11860411, + + 11860469, 11860469, 11860477, 11860477, 11860483, 11860483, + + 11860487, 11860487, 11860489, 11860489, 11860493, 11860493, + + 11860517, 11860517, 11860547, 11860547, 11860567, 11860567, + + 11860573, 11860573, 11860613, 11860613, 11860619, 11860619 / + data (iparam(1,i),iparam(2,i),i= 840, 869) / + + 11860627, 11860627, 11860637, 11860637, 11860643, 11860643, + + 11860649, 11860649, 11860661, 11860661, 11860669, 11860669, + + 11860687, 11860687, 11860691, 11860691, 11860697, 11860697, + + 11860699, 11860699, 11860703, 11860703, 11860727, 11860727, + + 11860741, 11860741, 11860753, 11860753, 11860777, 11860777, + + 11860787, 11860787, 11860789, 11860789, 11860811, 11860811, + + 11860837, 11860837, 11860859, 11860859, 11860867, 11860867, + + 11860889, 11860889, 11860897, 11860897, 11860963, 11860963, + + 11860969, 11860969, 11860973, 11860973, 11860993, 11860993, + + 11861011, 11861011, 11861033, 11861033, 11861071, 11861071 / + data (iparam(1,i),iparam(2,i),i= 870, 899) / + + 11861081, 11861081, 11861089, 11861089, 11861093, 11861093, + + 11861099, 11861099, 11861107, 11861107, 11861131, 11861131, + + 11861141, 11861141, 11861159, 11861159, 11861167, 11861167, + + 11861191, 11861191, 11861197, 11861197, 11861207, 11861207, + + 11861219, 11861219, 11861221, 11861221, 11861231, 11861231, + + 11861237, 11861237, 11861273, 11861273, 11861293, 11861293, + + 11861299, 11861299, 11861303, 11861303, 11861327, 11861327, + + 11861351, 11861351, 11861357, 11861357, 11861363, 11861363, + + 11861371, 11861371, 11861401, 11861401, 11861407, 11861407, + + 11861411, 11861411, 11861413, 11861413, 11861429, 11861429 / + data (iparam(1,i),iparam(2,i),i= 900, 929) / + + 11861441, 11861441, 11861467, 11861467, 11861527, 11861527, + + 11861539, 11861539, 11861543, 11861543, 11861557, 11861557, + + 11861569, 11861569, 11861573, 11861573, 11861579, 11861579, + + 11861581, 11861581, 11861599, 11861599, 11861611, 11861611, + + 11861617, 11861617, 11861627, 11861627, 11861639, 11861639, + + 11861651, 11861651, 11861659, 11861659, 11861671, 11861671, + + 11861683, 11861683, 11861687, 11861687, 11861693, 11861693, + + 11861701, 11861701, 11861711, 11861711, 11861713, 11861713, + + 11861749, 11861749, 11861791, 11861791, 11861803, 11861803, + + 11861819, 11861819, 11861827, 11861827, 11861849, 11861849 / + data (iparam(1,i),iparam(2,i),i= 930, 959) / + + 11861873, 11861873, 11861879, 11861879, 11861887, 11861887, + + 11861911, 11861911, 11861917, 11861917, 11861921, 11861921, + + 11861923, 11861923, 11861953, 11861953, 11861959, 11861959, + + 11861987, 11861987, 11862007, 11862007, 11862013, 11862013, + + 11862029, 11862029, 11862031, 11862031, 11862049, 11862049, + + 11862077, 11862077, 11862083, 11862083, 11862157, 11862157, + + 11862167, 11862167, 11862199, 11862199, 11862203, 11862203, + + 11862217, 11862217, 11862223, 11862223, 11862229, 11862229, + + 11862233, 11862233, 11862239, 11862239, 11862241, 11862241, + + 11862259, 11862259, 11862269, 11862269, 11862271, 11862271 / + data (iparam(1,i),iparam(2,i),i= 960, 989) / + + 11862293, 11862293, 11862307, 11862307, 11862313, 11862313, + + 11862317, 11862317, 11862343, 11862343, 11862353, 11862353, + + 11862373, 11862373, 11862391, 11862391, 11862439, 11862439, + + 11862469, 11862469, 11862493, 11862493, 11862527, 11862527, + + 11862547, 11862547, 11862563, 11862563, 11862569, 11862569, + + 11862577, 11862577, 11862581, 11862581, 11862611, 11862611, + + 11862623, 11862623, 11862661, 11862661, 11862673, 11862673, + + 11862679, 11862679, 11862701, 11862701, 11862703, 11862703, + + 11862713, 11862713, 11862761, 11862761, 11862791, 11862791, + + 11862803, 11862803, 11862839, 11862839, 11862841, 11862841 / + data (iparam(1,i),iparam(2,i),i= 990,1019) / + + 11862857, 11862857, 11862869, 11862869, 11862881, 11862881, + + 11862911, 11862911, 11862919, 11862919, 11862959, 11862959, + + 11862979, 11862979, 11862989, 11862989, 11862997, 11862997, + + 11863021, 11863021, 11863031, 11863031, 11863037, 11863037, + + 11863039, 11863039, 11863057, 11863057, 11863067, 11863067, + + 11863073, 11863073, 11863099, 11863099, 11863109, 11863109, + + 11863121, 11863121, 11863123, 11863123, 11863133, 11863133, + + 11863151, 11863151, 11863153, 11863153, 11863171, 11863171, + + 11863183, 11863183, 11863207, 11863207, 11863213, 11863213, + + 11863237, 11863237, 11863249, 11863249, 11863253, 11863253 / + data (iparam(1,i),iparam(2,i),i=1020,1021) / + + 11863259, 11863259, 11863279, 11863279 / + end diff --git a/source/unres/src_MD-NEWSC/prng_32.F b/source/unres/src_MD-NEWSC/prng_32.F new file mode 100644 index 0000000..9448f31 --- /dev/null +++ b/source/unres/src_MD-NEWSC/prng_32.F @@ -0,0 +1,1077 @@ +#if defined(AIX) || defined(AMD64) + real*8 function prng_next(mel) + implicit none + integer me,mel +c +c Calling sequence: +c = prng_next ( ) +c = vprng ( , , ) +c +c This code is based on a sequential algorithm provided by Mal Kalos. +c This version uses a single 64-bit word to store the initial seeds +c and additive constants. +c A 64-bit floating point number is returned. +c +c The array "iparam" is full-word aligned, being padded by zeros to +c let each generator be on a subpage boundary. +c That is, rows 1 and 2 in a given column of the array are for real, +c rows 3-16 are bogus. +c +c July 12, 1993: double the number of sequences. We should have been +c using two packets per seed, rather than four +c October 31, 1993: merge the two arrays of seeds and constants, +c and switch to 64-bit arithmetic. +c June 1994: port to RS6K. Internal state is kept as 2 64-bit integers +c The ishft function is defined only on 32-bit integers, so we will +c shift numbers by dividing by 2**11 and then adding on 2**53-1. +c +c November 1994: ishift now works on 64-bit numbers (though it gives a +c warning). Thus we go back to using it. John Zollweg also added the +c vprng() routine to return vectors of real*8 random numbers. +c + real*8 recip53 + parameter ( recip53 = 2.0D0**(-53) ) + integer*8 two + parameter ( two = 2**11) + integer*8 m,ishift +c parameter ( m = 34522712143931 ) ! 11**13 +c parameter ( ishift = 9007199254740991 ) ! 2**53-1 + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + integer*8 next + +crc g77 doesn't support integer*8 constants + m = dint(34522712143931.0d0) + ishift = dint(9007199254740991.0d0) + if(mel.gt.nmax) then + me=mod(mel,nmax) + else + me=mel + endif +c RS6K porting note: ishift now takes 64-bit integers , with a warning + if ( 0.le.me .and. me.le.nmax ) then + next = iparam(1,me)*m + iparam(2,me) + iparam(1,me) = next + prng_next = recip53 * ishft( next, -11 ) + else + prng_next=-1.0D0 + endif + + end +c +c vprng(me, rn, num) Get a vector of random numbers +c + subroutine vprng(me,rn,num) + real*8 recip53, rn(1) + parameter ( recip53 = 2.0D0**(-53) ) + integer*8 m,iparam +c parameter ( m = 34522712143931 ) ! 11**13 + integer nmax, num, me + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + integer*8 next + +crc g77 doesn't support integer*8 constants + m = dint(34522712143931.0d0) + + if ( 0.le.me .and. me.le.nmax ) then + do 1 i=1,num + next = iparam(1,me)*m + iparam(2,me) + iparam(1,me) = next + rn(i) = recip53 * ishft( next, -11 ) + 1 continue + else + rn(1)=-1.0D0 + endif + return + end + +c +c prng_chkpnt Get the current state of a generator +c +c Calling sequence: +c logical prng_chkpnt, status +c status = prng_chkpnt (me, iseed) where +c +c me is the particular generator whose state is being gotten +c seed is an 4-element integer array where the "l"-values will be saved +c + logical function prng_chkpnt (me, iseed) + implicit none + integer me + integer*8 iseed + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + if (me .lt. 0 .or. me .gt. nmax) then + prng_chkpnt=.false. + else + prng_chkpnt=.true. + iseed=iparam(1,me) + endif + end +c +c prng_restart Restart generator from a saved state +c +c Calling sequence: +c logical prng_restart, status +c status = prng_restart (me, iseed) where +c +c me is the particular generator being restarted +c iseed is a 8-byte integer containing the "l"-values +c + logical function prng_restart (mel, iseed) + implicit none + integer me,mel + integer*8 iseed + + integer nmax + integer*8 iparam + parameter(nmax=1021) + common/ksrprng/iparam(2,0:nmax) + + if(mel.gt.nmax) then + me=mod(mel,nmax) + else + me=mel + endif + if (me .lt. 0 .or. me .gt. nmax) then + prng_restart=.false. + return + else + prng_restart=.true. + iparam(1,me)=iseed + endif + end + + block data prngblk + parameter(nmax=1021) + integer*8 iparam + common/ksrprng/iparam(2,0:nmax) + data (iparam(1,i),iparam(2,i),i= 0, 29) / + + 11848219, 11848219, 11848237, 11848237, 11848241, 11848241, + + 11848247, 11848247, 11848253, 11848253, 11848271, 11848271, + + 11848297, 11848297, 11848313, 11848313, 11848339, 11848339, + + 11848351, 11848351, 11848357, 11848357, 11848363, 11848363, + + 11848367, 11848367, 11848373, 11848373, 11848379, 11848379, + + 11848393, 11848393, 11848433, 11848433, 11848451, 11848451, + + 11848469, 11848469, 11848477, 11848477, 11848489, 11848489, + + 11848493, 11848493, 11848513, 11848513, 11848523, 11848523, + + 11848531, 11848531, 11848537, 11848537, 11848553, 11848553, + + 11848589, 11848589, 11848591, 11848591, 11848601, 11848601 / + data (iparam(1,i),iparam(2,i),i= 30, 59) / + + 11848619, 11848619, 11848637, 11848637, 11848663, 11848663, + + 11848673, 11848673, 11848679, 11848679, 11848691, 11848691, + + 11848699, 11848699, 11848709, 11848709, 11848717, 11848717, + + 11848721, 11848721, 11848729, 11848729, 11848741, 11848741, + + 11848751, 11848751, 11848757, 11848757, 11848787, 11848787, + + 11848801, 11848801, 11848829, 11848829, 11848853, 11848853, + + 11848861, 11848861, 11848867, 11848867, 11848873, 11848873, + + 11848891, 11848891, 11848909, 11848909, 11848919, 11848919, + + 11848931, 11848931, 11848937, 11848937, 11848961, 11848961, + + 11848981, 11848981, 11849021, 11849021, 11849039, 11849039 / + data (iparam(1,i),iparam(2,i),i= 60, 89) / + + 11849053, 11849053, 11849059, 11849059, 11849069, 11849069, + + 11849077, 11849077, 11849087, 11849087, 11849093, 11849093, + + 11849107, 11849107, 11849111, 11849111, 11849129, 11849129, + + 11849137, 11849137, 11849177, 11849177, 11849183, 11849183, + + 11849203, 11849203, 11849231, 11849231, 11849237, 11849237, + + 11849239, 11849239, 11849249, 11849249, 11849251, 11849251, + + 11849269, 11849269, 11849273, 11849273, 11849291, 11849291, + + 11849297, 11849297, 11849309, 11849309, 11849339, 11849339, + + 11849359, 11849359, 11849363, 11849363, 11849399, 11849399, + + 11849401, 11849401, 11849413, 11849413, 11849417, 11849417 / + data (iparam(1,i),iparam(2,i),i= 90, 119) / + + 11849437, 11849437, 11849443, 11849443, 11849473, 11849473, + + 11849491, 11849491, 11849503, 11849503, 11849507, 11849507, + + 11849557, 11849557, 11849567, 11849567, 11849569, 11849569, + + 11849573, 11849573, 11849587, 11849587, 11849599, 11849599, + + 11849633, 11849633, 11849641, 11849641, 11849653, 11849653, + + 11849659, 11849659, 11849671, 11849671, 11849683, 11849683, + + 11849689, 11849689, 11849693, 11849693, 11849699, 11849699, + + 11849701, 11849701, 11849707, 11849707, 11849713, 11849713, + + 11849723, 11849723, 11849741, 11849741, 11849743, 11849743, + + 11849759, 11849759, 11849767, 11849767, 11849771, 11849771 / + data (iparam(1,i),iparam(2,i),i= 120, 149) / + + 11849791, 11849791, 11849801, 11849801, 11849809, 11849809, + + 11849813, 11849813, 11849869, 11849869, 11849881, 11849881, + + 11849891, 11849891, 11849909, 11849909, 11849923, 11849923, + + 11849933, 11849933, 11849947, 11849947, 11849987, 11849987, + + 11850001, 11850001, 11850011, 11850011, 11850019, 11850019, + + 11850023, 11850023, 11850031, 11850031, 11850049, 11850049, + + 11850061, 11850061, 11850073, 11850073, 11850077, 11850077, + + 11850103, 11850103, 11850109, 11850109, 11850121, 11850121, + + 11850127, 11850127, 11850133, 11850133, 11850149, 11850149, + + 11850161, 11850161, 11850169, 11850169, 11850191, 11850191 / + data (iparam(1,i),iparam(2,i),i= 150, 179) / + + 11850233, 11850233, 11850247, 11850247, 11850259, 11850259, + + 11850269, 11850269, 11850283, 11850283, 11850301, 11850301, + + 11850341, 11850341, 11850347, 11850347, 11850367, 11850367, + + 11850373, 11850373, 11850379, 11850379, 11850389, 11850389, + + 11850407, 11850407, 11850427, 11850427, 11850437, 11850437, + + 11850469, 11850469, 11850481, 11850481, 11850511, 11850511, + + 11850529, 11850529, 11850541, 11850541, 11850557, 11850557, + + 11850607, 11850607, 11850611, 11850611, 11850667, 11850667, + + 11850677, 11850677, 11850679, 11850679, 11850701, 11850701, + + 11850731, 11850731, 11850739, 11850739, 11850749, 11850749 / + data (iparam(1,i),iparam(2,i),i= 180, 209) / + + 11850791, 11850791, 11850803, 11850803, 11850829, 11850829, + + 11850833, 11850833, 11850859, 11850859, 11850877, 11850877, + + 11850899, 11850899, 11850907, 11850907, 11850913, 11850913, + + 11850919, 11850919, 11850931, 11850931, 11850941, 11850941, + + 11850947, 11850947, 11850953, 11850953, 11850961, 11850961, + + 11850983, 11850983, 11850991, 11850991, 11850997, 11850997, + + 11851031, 11851031, 11851033, 11851033, 11851051, 11851051, + + 11851061, 11851061, 11851067, 11851067, 11851093, 11851093, + + 11851109, 11851109, 11851123, 11851123, 11851127, 11851127, + + 11851139, 11851139, 11851157, 11851157, 11851163, 11851163 / + data (iparam(1,i),iparam(2,i),i= 210, 239) / + + 11851181, 11851181, 11851201, 11851201, 11851219, 11851219, + + 11851291, 11851291, 11851303, 11851303, 11851309, 11851309, + + 11851313, 11851313, 11851319, 11851319, 11851349, 11851349, + + 11851351, 11851351, 11851361, 11851361, 11851373, 11851373, + + 11851403, 11851403, 11851409, 11851409, 11851423, 11851423, + + 11851447, 11851447, 11851451, 11851451, 11851481, 11851481, + + 11851493, 11851493, 11851519, 11851519, 11851523, 11851523, + + 11851529, 11851529, 11851547, 11851547, 11851549, 11851549, + + 11851559, 11851559, 11851577, 11851577, 11851589, 11851589, + + 11851591, 11851591, 11851597, 11851597, 11851603, 11851603 / + data (iparam(1,i),iparam(2,i),i= 240, 269) / + + 11851607, 11851607, 11851613, 11851613, 11851621, 11851621, + + 11851627, 11851627, 11851639, 11851639, 11851673, 11851673, + + 11851681, 11851681, 11851727, 11851727, 11851753, 11851753, + + 11851759, 11851759, 11851787, 11851787, 11851793, 11851793, + + 11851799, 11851799, 11851813, 11851813, 11851841, 11851841, + + 11851859, 11851859, 11851867, 11851867, 11851891, 11851891, + + 11851909, 11851909, 11851919, 11851919, 11851927, 11851927, + + 11851933, 11851933, 11851949, 11851949, 11851967, 11851967, + + 11851997, 11851997, 11852017, 11852017, 11852051, 11852051, + + 11852053, 11852053, 11852059, 11852059, 11852083, 11852083 / + data (iparam(1,i),iparam(2,i),i= 270, 299) / + + 11852089, 11852089, 11852129, 11852129, 11852147, 11852147, + + 11852149, 11852149, 11852161, 11852161, 11852171, 11852171, + + 11852177, 11852177, 11852209, 11852209, 11852221, 11852221, + + 11852237, 11852237, 11852251, 11852251, 11852263, 11852263, + + 11852273, 11852273, 11852279, 11852279, 11852287, 11852287, + + 11852293, 11852293, 11852297, 11852297, 11852303, 11852303, + + 11852311, 11852311, 11852327, 11852327, 11852339, 11852339, + + 11852341, 11852341, 11852359, 11852359, 11852369, 11852369, + + 11852437, 11852437, 11852453, 11852453, 11852459, 11852459, + + 11852473, 11852473, 11852513, 11852513, 11852531, 11852531 / + data (iparam(1,i),iparam(2,i),i= 300, 329) / + + 11852537, 11852537, 11852539, 11852539, 11852557, 11852557, + + 11852573, 11852573, 11852579, 11852579, 11852591, 11852591, + + 11852609, 11852609, 11852611, 11852611, 11852623, 11852623, + + 11852641, 11852641, 11852647, 11852647, 11852657, 11852657, + + 11852663, 11852663, 11852717, 11852717, 11852719, 11852719, + + 11852741, 11852741, 11852759, 11852759, 11852767, 11852767, + + 11852773, 11852773, 11852803, 11852803, 11852807, 11852807, + + 11852809, 11852809, 11852831, 11852831, 11852833, 11852833, + + 11852837, 11852837, 11852857, 11852857, 11852873, 11852873, + + 11852879, 11852879, 11852891, 11852891, 11852917, 11852917 / + data (iparam(1,i),iparam(2,i),i= 330, 359) / + + 11852921, 11852921, 11852957, 11852957, 11852959, 11852959, + + 11852969, 11852969, 11852983, 11852983, 11852989, 11852989, + + 11853001, 11853001, 11853013, 11853013, 11853019, 11853019, + + 11853031, 11853031, 11853089, 11853089, 11853133, 11853133, + + 11853157, 11853157, 11853161, 11853161, 11853181, 11853181, + + 11853203, 11853203, 11853217, 11853217, 11853221, 11853221, + + 11853227, 11853227, 11853241, 11853241, 11853307, 11853307, + + 11853319, 11853319, 11853323, 11853323, 11853329, 11853329, + + 11853367, 11853367, 11853383, 11853383, 11853419, 11853419, + + 11853421, 11853421, 11853427, 11853427, 11853449, 11853449 / + data (iparam(1,i),iparam(2,i),i= 360, 389) / + + 11853451, 11853451, 11853463, 11853463, 11853529, 11853529, + + 11853557, 11853557, 11853571, 11853571, 11853601, 11853601, + + 11853613, 11853613, 11853617, 11853617, 11853629, 11853629, + + 11853649, 11853649, 11853659, 11853659, 11853679, 11853679, + + 11853689, 11853689, 11853719, 11853719, 11853731, 11853731, + + 11853757, 11853757, 11853761, 11853761, 11853773, 11853773, + + 11853791, 11853791, 11853817, 11853817, 11853839, 11853839, + + 11853847, 11853847, 11853857, 11853857, 11853869, 11853869, + + 11853883, 11853883, 11853887, 11853887, 11853889, 11853889, + + 11853893, 11853893, 11853899, 11853899, 11853911, 11853911 / + data (iparam(1,i),iparam(2,i),i= 390, 419) / + + 11853931, 11853931, 11853943, 11853943, 11853979, 11853979, + + 11853991, 11853991, 11854001, 11854001, 11854009, 11854009, + + 11854019, 11854019, 11854057, 11854057, 11854061, 11854061, + + 11854147, 11854147, 11854159, 11854159, 11854163, 11854163, + + 11854169, 11854169, 11854211, 11854211, 11854247, 11854247, + + 11854261, 11854261, 11854267, 11854267, 11854279, 11854279, + + 11854303, 11854303, 11854327, 11854327, 11854331, 11854331, + + 11854333, 11854333, 11854363, 11854363, 11854379, 11854379, + + 11854399, 11854399, 11854411, 11854411, 11854429, 11854429, + + 11854433, 11854433, 11854439, 11854439, 11854441, 11854441 / + data (iparam(1,i),iparam(2,i),i= 420, 449) / + + 11854463, 11854463, 11854477, 11854477, 11854489, 11854489, + + 11854517, 11854517, 11854519, 11854519, 11854523, 11854523, + + 11854529, 11854529, 11854567, 11854567, 11854571, 11854571, + + 11854573, 11854573, 11854603, 11854603, 11854607, 11854607, + + 11854681, 11854681, 11854691, 11854691, 11854709, 11854709, + + 11854723, 11854723, 11854757, 11854757, 11854783, 11854783, + + 11854793, 11854793, 11854813, 11854813, 11854847, 11854847, + + 11854853, 11854853, 11854873, 11854873, 11854877, 11854877, + + 11854883, 11854883, 11854891, 11854891, 11854897, 11854897, + + 11854901, 11854901, 11854919, 11854919, 11854937, 11854937 / + data (iparam(1,i),iparam(2,i),i= 450, 479) / + + 11854961, 11854961, 11854963, 11854963, 11854979, 11854979, + + 11855003, 11855003, 11855017, 11855017, 11855023, 11855023, + + 11855029, 11855029, 11855033, 11855033, 11855111, 11855111, + + 11855141, 11855141, 11855147, 11855147, 11855149, 11855149, + + 11855159, 11855159, 11855177, 11855177, 11855203, 11855203, + + 11855213, 11855213, 11855219, 11855219, 11855231, 11855231, + + 11855267, 11855267, 11855269, 11855269, 11855303, 11855303, + + 11855309, 11855309, 11855321, 11855321, 11855329, 11855329, + + 11855339, 11855339, 11855351, 11855351, 11855353, 11855353, + + 11855357, 11855357, 11855359, 11855359, 11855381, 11855381 / + data (iparam(1,i),iparam(2,i),i= 480, 509) / + + 11855383, 11855383, 11855387, 11855387, 11855399, 11855399, + + 11855407, 11855407, 11855413, 11855413, 11855489, 11855489, + + 11855491, 11855491, 11855507, 11855507, 11855521, 11855521, + + 11855531, 11855531, 11855549, 11855549, 11855551, 11855551, + + 11855567, 11855567, 11855581, 11855581, 11855587, 11855587, + + 11855593, 11855593, 11855633, 11855633, 11855653, 11855653, + + 11855663, 11855663, 11855687, 11855687, 11855689, 11855689, + + 11855699, 11855699, 11855713, 11855713, 11855731, 11855731, + + 11855737, 11855737, 11855743, 11855743, 11855747, 11855747, + + 11855759, 11855759, 11855773, 11855773, 11855801, 11855801 / + data (iparam(1,i),iparam(2,i),i= 510, 539) / + + 11855807, 11855807, 11855813, 11855813, 11855827, 11855827, + + 11855839, 11855839, 11855869, 11855869, 11855881, 11855881, + + 11855903, 11855903, 11855911, 11855911, 11855933, 11855933, + + 11855959, 11855959, 11855989, 11855989, 11855993, 11855993, + + 11855999, 11855999, 11856001, 11856001, 11856023, 11856023, + + 11856049, 11856049, 11856071, 11856071, 11856101, 11856101, + + 11856107, 11856107, 11856113, 11856113, 11856139, 11856139, + + 11856151, 11856151, 11856161, 11856161, 11856179, 11856179, + + 11856193, 11856193, 11856199, 11856199, 11856223, 11856223, + + 11856239, 11856239, 11856263, 11856263, 11856269, 11856269 / + data (iparam(1,i),iparam(2,i),i= 540, 569) / + + 11856281, 11856281, 11856287, 11856287, 11856307, 11856307, + + 11856311, 11856311, 11856329, 11856329, 11856343, 11856343, + + 11856359, 11856359, 11856371, 11856371, 11856373, 11856373, + + 11856409, 11856409, 11856419, 11856419, 11856461, 11856461, + + 11856469, 11856469, 11856473, 11856473, 11856479, 11856479, + + 11856511, 11856511, 11856517, 11856517, 11856541, 11856541, + + 11856547, 11856547, 11856553, 11856553, 11856583, 11856583, + + 11856629, 11856629, 11856641, 11856641, 11856653, 11856653, + + 11856659, 11856659, 11856673, 11856673, 11856697, 11856697, + + 11856709, 11856709, 11856727, 11856727, 11856731, 11856731 / + data (iparam(1,i),iparam(2,i),i= 570, 599) / + + 11856763, 11856763, 11856809, 11856809, 11856811, 11856811, + + 11856821, 11856821, 11856841, 11856841, 11856857, 11856857, + + 11856877, 11856877, 11856883, 11856883, 11856899, 11856899, + + 11856919, 11856919, 11856947, 11856947, 11856953, 11856953, + + 11856979, 11856979, 11857003, 11857003, 11857033, 11857033, + + 11857037, 11857037, 11857039, 11857039, 11857049, 11857049, + + 11857061, 11857061, 11857067, 11857067, 11857073, 11857073, + + 11857081, 11857081, 11857091, 11857091, 11857093, 11857093, + + 11857099, 11857099, 11857123, 11857123, 11857127, 11857127, + + 11857147, 11857147, 11857151, 11857151, 11857193, 11857193 / + data (iparam(1,i),iparam(2,i),i= 600, 629) / + + 11857217, 11857217, 11857229, 11857229, 11857243, 11857243, + + 11857249, 11857249, 11857267, 11857267, 11857277, 11857277, + + 11857291, 11857291, 11857303, 11857303, 11857309, 11857309, + + 11857327, 11857327, 11857331, 11857331, 11857333, 11857333, + + 11857361, 11857361, 11857367, 11857367, 11857369, 11857369, + + 11857393, 11857393, 11857399, 11857399, 11857409, 11857409, + + 11857421, 11857421, 11857423, 11857423, 11857451, 11857451, + + 11857453, 11857453, 11857457, 11857457, 11857477, 11857477, + + 11857481, 11857481, 11857493, 11857493, 11857499, 11857499, + + 11857519, 11857519, 11857523, 11857523, 11857529, 11857529 / + data (iparam(1,i),iparam(2,i),i= 630, 659) / + + 11857543, 11857543, 11857561, 11857561, 11857589, 11857589, + + 11857591, 11857591, 11857613, 11857613, 11857621, 11857621, + + 11857661, 11857661, 11857667, 11857667, 11857693, 11857693, + + 11857697, 11857697, 11857709, 11857709, 11857711, 11857711, + + 11857751, 11857751, 11857753, 11857753, 11857759, 11857759, + + 11857763, 11857763, 11857777, 11857777, 11857787, 11857787, + + 11857793, 11857793, 11857801, 11857801, 11857817, 11857817, + + 11857819, 11857819, 11857831, 11857831, 11857837, 11857837, + + 11857873, 11857873, 11857877, 11857877, 11857883, 11857883, + + 11857889, 11857889, 11857907, 11857907, 11857913, 11857913 / + data (iparam(1,i),iparam(2,i),i= 660, 689) / + + 11857931, 11857931, 11857969, 11857969, 11857991, 11857991, + + 11857999, 11857999, 11858009, 11858009, 11858017, 11858017, + + 11858023, 11858023, 11858029, 11858029, 11858039, 11858039, + + 11858051, 11858051, 11858057, 11858057, 11858059, 11858059, + + 11858101, 11858101, 11858111, 11858111, 11858131, 11858131, + + 11858149, 11858149, 11858159, 11858159, 11858177, 11858177, + + 11858191, 11858191, 11858201, 11858201, 11858227, 11858227, + + 11858243, 11858243, 11858267, 11858267, 11858269, 11858269, + + 11858279, 11858279, 11858281, 11858281, 11858291, 11858291, + + 11858311, 11858311, 11858323, 11858323, 11858359, 11858359 / + data (iparam(1,i),iparam(2,i),i= 690, 719) / + + 11858377, 11858377, 11858381, 11858381, 11858387, 11858387, + + 11858423, 11858423, 11858443, 11858443, 11858447, 11858447, + + 11858479, 11858479, 11858533, 11858533, 11858543, 11858543, + + 11858551, 11858551, 11858557, 11858557, 11858569, 11858569, + + 11858573, 11858573, 11858579, 11858579, 11858597, 11858597, + + 11858599, 11858599, 11858629, 11858629, 11858657, 11858657, + + 11858659, 11858659, 11858683, 11858683, 11858701, 11858701, + + 11858719, 11858719, 11858723, 11858723, 11858729, 11858729, + + 11858747, 11858747, 11858779, 11858779, 11858783, 11858783, + + 11858801, 11858801, 11858807, 11858807, 11858813, 11858813 / + data (iparam(1,i),iparam(2,i),i= 720, 749) / + + 11858839, 11858839, 11858851, 11858851, 11858893, 11858893, + + 11858897, 11858897, 11858921, 11858921, 11858947, 11858947, + + 11858953, 11858953, 11858969, 11858969, 11858971, 11858971, + + 11858989, 11858989, 11859017, 11859017, 11859031, 11859031, + + 11859049, 11859049, 11859061, 11859061, 11859073, 11859073, + + 11859077, 11859077, 11859079, 11859079, 11859083, 11859083, + + 11859101, 11859101, 11859109, 11859109, 11859137, 11859137, + + 11859139, 11859139, 11859151, 11859151, 11859157, 11859157, + + 11859163, 11859163, 11859167, 11859167, 11859179, 11859179, + + 11859187, 11859187, 11859229, 11859229, 11859233, 11859233 / + data (iparam(1,i),iparam(2,i),i= 750, 779) / + + 11859241, 11859241, 11859247, 11859247, 11859269, 11859269, + + 11859293, 11859293, 11859307, 11859307, 11859311, 11859311, + + 11859349, 11859349, 11859359, 11859359, 11859371, 11859371, + + 11859377, 11859377, 11859383, 11859383, 11859427, 11859427, + + 11859433, 11859433, 11859451, 11859451, 11859457, 11859457, + + 11859461, 11859461, 11859473, 11859473, 11859481, 11859481, + + 11859487, 11859487, 11859493, 11859493, 11859503, 11859503, + + 11859509, 11859509, 11859539, 11859539, 11859541, 11859541, + + 11859563, 11859563, 11859569, 11859569, 11859571, 11859571, + + 11859583, 11859583, 11859599, 11859599, 11859611, 11859611 / + data (iparam(1,i),iparam(2,i),i= 780, 809) / + + 11859643, 11859643, 11859707, 11859707, 11859713, 11859713, + + 11859719, 11859719, 11859739, 11859739, 11859751, 11859751, + + 11859791, 11859791, 11859817, 11859817, 11859821, 11859821, + + 11859833, 11859833, 11859847, 11859847, 11859853, 11859853, + + 11859877, 11859877, 11859889, 11859889, 11859893, 11859893, + + 11859901, 11859901, 11859907, 11859907, 11859917, 11859917, + + 11859923, 11859923, 11859929, 11859929, 11859961, 11859961, + + 11859979, 11859979, 11859989, 11859989, 11859997, 11859997, + + 11860021, 11860021, 11860031, 11860031, 11860039, 11860039, + + 11860049, 11860049, 11860081, 11860081, 11860087, 11860087 / + data (iparam(1,i),iparam(2,i),i= 810, 839) / + + 11860097, 11860097, 11860103, 11860103, 11860109, 11860109, + + 11860117, 11860117, 11860133, 11860133, 11860151, 11860151, + + 11860171, 11860171, 11860207, 11860207, 11860223, 11860223, + + 11860231, 11860231, 11860243, 11860243, 11860267, 11860267, + + 11860301, 11860301, 11860307, 11860307, 11860327, 11860327, + + 11860379, 11860379, 11860397, 11860397, 11860411, 11860411, + + 11860469, 11860469, 11860477, 11860477, 11860483, 11860483, + + 11860487, 11860487, 11860489, 11860489, 11860493, 11860493, + + 11860517, 11860517, 11860547, 11860547, 11860567, 11860567, + + 11860573, 11860573, 11860613, 11860613, 11860619, 11860619 / + data (iparam(1,i),iparam(2,i),i= 840, 869) / + + 11860627, 11860627, 11860637, 11860637, 11860643, 11860643, + + 11860649, 11860649, 11860661, 11860661, 11860669, 11860669, + + 11860687, 11860687, 11860691, 11860691, 11860697, 11860697, + + 11860699, 11860699, 11860703, 11860703, 11860727, 11860727, + + 11860741, 11860741, 11860753, 11860753, 11860777, 11860777, + + 11860787, 11860787, 11860789, 11860789, 11860811, 11860811, + + 11860837, 11860837, 11860859, 11860859, 11860867, 11860867, + + 11860889, 11860889, 11860897, 11860897, 11860963, 11860963, + + 11860969, 11860969, 11860973, 11860973, 11860993, 11860993, + + 11861011, 11861011, 11861033, 11861033, 11861071, 11861071 / + data (iparam(1,i),iparam(2,i),i= 870, 899) / + + 11861081, 11861081, 11861089, 11861089, 11861093, 11861093, + + 11861099, 11861099, 11861107, 11861107, 11861131, 11861131, + + 11861141, 11861141, 11861159, 11861159, 11861167, 11861167, + + 11861191, 11861191, 11861197, 11861197, 11861207, 11861207, + + 11861219, 11861219, 11861221, 11861221, 11861231, 11861231, + + 11861237, 11861237, 11861273, 11861273, 11861293, 11861293, + + 11861299, 11861299, 11861303, 11861303, 11861327, 11861327, + + 11861351, 11861351, 11861357, 11861357, 11861363, 11861363, + + 11861371, 11861371, 11861401, 11861401, 11861407, 11861407, + + 11861411, 11861411, 11861413, 11861413, 11861429, 11861429 / + data (iparam(1,i),iparam(2,i),i= 900, 929) / + + 11861441, 11861441, 11861467, 11861467, 11861527, 11861527, + + 11861539, 11861539, 11861543, 11861543, 11861557, 11861557, + + 11861569, 11861569, 11861573, 11861573, 11861579, 11861579, + + 11861581, 11861581, 11861599, 11861599, 11861611, 11861611, + + 11861617, 11861617, 11861627, 11861627, 11861639, 11861639, + + 11861651, 11861651, 11861659, 11861659, 11861671, 11861671, + + 11861683, 11861683, 11861687, 11861687, 11861693, 11861693, + + 11861701, 11861701, 11861711, 11861711, 11861713, 11861713, + + 11861749, 11861749, 11861791, 11861791, 11861803, 11861803, + + 11861819, 11861819, 11861827, 11861827, 11861849, 11861849 / + data (iparam(1,i),iparam(2,i),i= 930, 959) / + + 11861873, 11861873, 11861879, 11861879, 11861887, 11861887, + + 11861911, 11861911, 11861917, 11861917, 11861921, 11861921, + + 11861923, 11861923, 11861953, 11861953, 11861959, 11861959, + + 11861987, 11861987, 11862007, 11862007, 11862013, 11862013, + + 11862029, 11862029, 11862031, 11862031, 11862049, 11862049, + + 11862077, 11862077, 11862083, 11862083, 11862157, 11862157, + + 11862167, 11862167, 11862199, 11862199, 11862203, 11862203, + + 11862217, 11862217, 11862223, 11862223, 11862229, 11862229, + + 11862233, 11862233, 11862239, 11862239, 11862241, 11862241, + + 11862259, 11862259, 11862269, 11862269, 11862271, 11862271 / + data (iparam(1,i),iparam(2,i),i= 960, 989) / + + 11862293, 11862293, 11862307, 11862307, 11862313, 11862313, + + 11862317, 11862317, 11862343, 11862343, 11862353, 11862353, + + 11862373, 11862373, 11862391, 11862391, 11862439, 11862439, + + 11862469, 11862469, 11862493, 11862493, 11862527, 11862527, + + 11862547, 11862547, 11862563, 11862563, 11862569, 11862569, + + 11862577, 11862577, 11862581, 11862581, 11862611, 11862611, + + 11862623, 11862623, 11862661, 11862661, 11862673, 11862673, + + 11862679, 11862679, 11862701, 11862701, 11862703, 11862703, + + 11862713, 11862713, 11862761, 11862761, 11862791, 11862791, + + 11862803, 11862803, 11862839, 11862839, 11862841, 11862841 / + data (iparam(1,i),iparam(2,i),i= 990,1019) / + + 11862857, 11862857, 11862869, 11862869, 11862881, 11862881, + + 11862911, 11862911, 11862919, 11862919, 11862959, 11862959, + + 11862979, 11862979, 11862989, 11862989, 11862997, 11862997, + + 11863021, 11863021, 11863031, 11863031, 11863037, 11863037, + + 11863039, 11863039, 11863057, 11863057, 11863067, 11863067, + + 11863073, 11863073, 11863099, 11863099, 11863109, 11863109, + + 11863121, 11863121, 11863123, 11863123, 11863133, 11863133, + + 11863151, 11863151, 11863153, 11863153, 11863171, 11863171, + + 11863183, 11863183, 11863207, 11863207, 11863213, 11863213, + + 11863237, 11863237, 11863249, 11863249, 11863253, 11863253 / + data (iparam(1,i),iparam(2,i),i=1020,1021) / + + 11863259, 11863259, 11863279, 11863279 / + end +#else + real function prng_next(me) +crc logical prng_restart, prng_chkpnt +c +c Calling sequence: +c = prng_next ( ) +c +c This code is based on a sequential algorithm provided by Mal Kalos. +c This version uses 4 16-bit packets, and uses a block data common +c area for the initial seeds and constants. A 64-bit floating point +c number is returned. +c +c The arrays "l" and "n" are full-word aligned, being padded by zeros +c That is, rows 1-4 in a given column are for real, rows 5-16 are bogus +c +c July 12, 1993: double the number of sequences. We should have been +c using two packets per seed, rather than four +c + real tpm12 + integer iseed(4) + parameter(tpm12 = 1.d0/65536.d0) + parameter(nmax=1021) +c external prngblk + common/ksrprng/l(16,0:nmax),n(16,0:nmax) +c*ksr*subpage /ksrprng/ + data m1,m2,m3,m4 / 0, 8037, 61950, 30779/ + if (me .lt. 0 .or. me .gt. nmax) then + prng_next=-1.0 + return + endif + l1=l(1,me) + l2=l(2,me) + l3=l(3,me) + l4=l(4,me) + i1=l1*m4+l2*m3+l3*m2+l4*m1 + n(1,me) + i2=l2*m4+l3*m3+l4*m2 + n(2,me) + i3=l3*m4+l4*m3 + n(3,me) + i4=l4*m4 + n(4,me) + l4=and(i4,65535) + i3=i3+ishft(i4,-16) + l3=and(i3,65535) + i2=i2+ishft(i3,-16) + l2=and(i2,65535) + l1=and(i1+ishft(i2,-16),65535) + prng_next=tpm12*(l1+tpm12*(l2+tpm12*(l3+tpm12*l4))) + l(1,me)=l1 + l(2,me)=l2 + l(3,me)=l3 + l(4,me)=l4 + return + end +c +c prng_chkpnt Get the current state of a generator +c +c Calling sequence: +c logical prng_chkpnt, status +c status = prng_chkpnt (me, iseed) where +c +c me is the particular generator whose state is being gotten +c seed is an 4-element integer array where the "l"-values will be saved +c +crc entry prng_chkpnt (me, iseed) + logical function prng_chkpnt (me, iseed) + integer iseed(4) + parameter(nmax=1021) + common/ksrprng/l(16,0:nmax),n(16,0:nmax) + if (me .lt. 0 .or. me .gt. nmax) then + prng_chkpnt=.false. + else + prng_chkpnt=.true. + iseed(1)=l(1,me) + iseed(2)=l(2,me) + iseed(3)=l(3,me) + iseed(4)=l(4,me) + endif + return + end +c +c prng_restart Restart generator from a saved state +c +c Calling sequence: +c logical prng_restart, status +c status = prng_restart (me, iseed) where +c +c me is the particular generator being restarted +c seed is an 4-element integer array containing the "l"-values +c +crc entry prng_restart (me, iseed) + logical function prng_restart (me, iseed) + integer iseed(4) + parameter(nmax=1021) + common/ksrprng/l(16,0:nmax),n(16,0:nmax) + if (me .lt. 0 .or. me .gt. nmax) then + prng_restart=.false. + return + else + prng_restart=.true. + l(1,me)=iseed(1) + l(2,me)=iseed(2) + l(3,me)=iseed(3) + l(4,me)=iseed(4) + endif + return + end + + block data prngblk +c +c Sequence of prime numbers represented as pairs of 16-bit integers +c modulo 2**16, obtained from Mal Kalos August 28, 1992. Only 98 +c continuation cards are allowed by ksr Fortran, so several DATA +c statements are used to initialize 1022 generators. +c +c @cornell university, 1992 +c + parameter(nmax=1021,nmax1=2*nmax+2) + common/ksrprng/l(16,0:nmax),n(16,0:nmax) +c*ksr*subpage /ksrprng/ + +c High order quads in arrays "l" and "n" are initialized to zero : rows 1-2 +c Rows 5-16 remain uninitialized. They are just pads, never used. + DATA ((l(i,j),i=1,2),j=0,nmax)/nmax1*0.0/ + DATA ((n(i,j),i=1,2),j=0,nmax)/nmax1*0.0/ + +c The rest of array "l" and "n" are initialized to a 20-bit seed + DATA ((l(i,j),i=3,4),j=0,489)/ + .180, 51739,180, 51757,180, 51761,180, 51767,180,51773, + .180, 51791,180, 51817,180, 51833,180, 51859,180, 51871, + .180, 51877,180, 51883,180, 51887,180, 51893,180, 51899, + .180, 51913,180, 51953,180, 51971,180, 51989,180, 51997, + .180, 52009,180, 52013,180, 52033,180, 52043,180, 52051, + .180, 52057,180, 52073,180, 52109,180, 52111,180, 52121, + .180, 52139,180, 52157,180, 52183,180, 52193,180, 52199, + .180, 52211,180, 52219,180, 52229,180, 52237,180, 52241, + .180, 52249,180, 52261,180, 52271,180, 52277,180, 52307, + .180, 52321,180, 52349,180, 52373,180, 52381,180, 52387, + .180, 52393,180, 52411,180, 52429,180, 52439,180, 52451, + .180, 52457,180, 52481,180, 52501,180, 52541,180, 52559, + .180, 52573,180, 52579,180, 52589,180, 52597,180, 52607, + .180, 52613,180, 52627,180, 52631,180, 52649,180, 52657, + .180, 52697,180, 52703,180, 52723,180, 52751,180, 52757, + .180, 52759,180, 52769,180, 52771,180, 52789,180, 52793, + .180, 52811,180, 52817,180, 52829,180, 52859,180, 52879, + .180, 52883,180, 52919,180, 52921,180, 52933,180, 52937, + .180, 52957,180, 52963,180, 52993,180, 53011,180, 53023, + .180, 53027,180, 53077,180, 53087,180, 53089,180, 53093, + .180, 53107,180, 53119,180, 53153,180, 53161,180, 53173, + .180, 53179,180, 53191,180, 53203,180, 53209,180, 53213, + .180, 53219,180, 53221,180, 53227,180, 53233,180, 53243, + .180, 53261,180, 53263,180, 53279,180, 53287,180, 53291, + .180, 53311,180, 53321,180, 53329,180, 53333,180, 53389, + .180, 53401,180, 53411,180, 53429,180, 53443,180, 53453, + .180, 53467,180, 53507,180, 53521,180, 53531,180, 53539, + .180, 53543,180, 53551,180, 53569,180, 53581,180, 53593, + .180, 53597,180, 53623,180, 53629,180, 53641,180, 53647, + .180, 53653,180, 53669,180, 53681,180, 53689,180, 53711, + .180, 53753,180, 53767,180, 53779,180, 53789,180, 53803, + .180, 53821,180, 53861,180, 53867,180, 53887,180, 53893, + .180, 53899,180, 53909,180, 53927,180, 53947,180, 53957, + .180, 53989,180, 54001,180, 54031,180, 54049,180, 54061, + .180, 54077,180, 54127,180, 54131,180, 54187,180, 54197, + .180, 54199,180, 54221,180, 54251,180, 54259,180, 54269, + .180, 54311,180, 54323,180, 54349,180, 54353,180, 54379, + .180, 54397,180, 54419,180, 54427,180, 54433,180, 54439, + .180, 54451,180, 54461,180, 54467,180, 54473,180, 54481, + .180, 54503,180, 54511,180, 54517,180, 54551,180, 54553, + .180, 54571,180, 54581,180, 54587,180, 54613,180, 54629, + .180, 54643,180, 54647,180, 54659,180, 54677,180, 54683, + .180, 54701,180, 54721,180, 54739,180, 54811,180, 54823, + .180, 54829,180, 54833,180, 54839,180, 54869,180, 54871, + .180, 54881,180, 54893,180, 54923,180, 54929,180, 54943, + .180, 54967,180, 54971,180, 55001,180, 55013,180, 55039, + .180, 55043,180, 55049,180, 55067,180, 55069,180, 55079, + .180, 55097,180, 55109,180, 55111,180, 55117,180, 55123, + .180, 55127,180, 55133,180, 55141,180, 55147,180, 55159, + .180, 55193,180, 55201,180, 55247,180, 55273,180, 55279, + .180, 55307,180, 55313,180, 55319,180, 55333,180, 55361, + .180, 55379,180, 55387,180, 55411,180, 55429,180, 55439, + .180, 55447,180, 55453,180, 55469,180, 55487,180, 55517, + .180, 55537,180, 55571,180, 55573,180, 55579,180, 55603, + .180, 55609,180, 55649,180, 55667,180, 55669,180, 55681, + .180, 55691,180, 55697,180, 55729,180, 55741,180, 55757, + .180, 55771,180, 55783,180, 55793,180, 55799,180, 55807, + .180, 55813,180, 55817,180, 55823,180, 55831,180, 55847, + .180, 55859,180, 55861,180, 55879,180, 55889,180, 55957, + .180, 55973,180, 55979,180, 55993,180, 56033,180, 56051, + .180, 56057,180, 56059,180, 56077,180, 56093,180, 56099, + .180, 56111,180, 56129,180, 56131,180, 56143,180, 56161, + .180, 56167,180, 56177,180, 56183,180, 56237,180, 56239, + .180, 56261,180, 56279,180, 56287,180, 56293,180, 56323, + .180, 56327,180, 56329,180, 56351,180, 56353,180, 56357, + .180, 56377,180, 56393,180, 56399,180, 56411,180, 56437, + .180, 56441,180, 56477,180, 56479,180, 56489,180, 56503, + .180, 56509,180, 56521,180, 56533,180, 56539,180, 56551, + .180, 56609,180, 56653,180, 56677,180, 56681,180, 56701, + .180, 56723,180, 56737,180, 56741,180, 56747,180, 56761, + .180, 56827,180, 56839,180, 56843,180, 56849,180, 56887, + .180, 56903,180, 56939,180, 56941,180, 56947,180, 56969, + .180, 56971,180, 56983,180, 57049,180, 57077,180, 57091, + .180, 57121,180, 57133,180, 57137,180, 57149,180, 57169, + .180, 57179,180, 57199,180, 57209,180, 57239,180, 57251, + .180, 57277,180, 57281,180, 57293,180, 57311,180, 57337, + .180, 57359,180, 57367,180, 57377,180, 57389,180, 57403, + .180, 57407,180, 57409,180, 57413,180, 57419,180, 57431, + .180, 57451,180, 57463,180, 57499,180, 57511,180, 57521, + .180, 57529,180, 57539,180, 57577,180, 57581,180, 57667, + .180, 57679,180, 57683,180, 57689,180, 57731,180, 57767, + .180, 57781,180, 57787,180, 57799,180, 57823,180, 57847, + .180, 57851,180, 57853,180, 57883,180, 57899,180, 57919, + .180, 57931,180, 57949,180, 57953,180, 57959,180, 57961, + .180, 57983,180, 57997,180, 58009,180, 58037,180, 58039, + .180, 58043,180, 58049,180, 58087,180, 58091,180, 58093, + .180, 58123,180, 58127,180, 58201,180, 58211,180, 58229, + .180, 58243,180, 58277,180, 58303,180, 58313,180, 58333, + .180, 58367,180, 58373,180, 58393,180, 58397,180, 58403, + .180, 58411,180, 58417,180, 58421,180, 58439,180, 58457, + .180, 58481,180, 58483,180, 58499,180, 58523,180, 58537, + .180, 58543,180, 58549,180, 58553,180, 58631,180, 58661, + .180, 58667,180, 58669,180, 58679,180, 58697,180, 58723, + .180, 58733,180, 58739,180, 58751,180, 58787,180, 58789, + .180, 58823,180, 58829,180, 58841,180, 58849,180, 58859, + .180, 58871,180, 58873,180, 58877,180, 58879,180, 58901, + .180, 58903,180, 58907,180, 58919,180, 58927,180, 58933, + .180, 59009,180, 59011,180, 59027,180, 59041,180, 59051/ + DATA ((l(i,j),i=3,4),j=490,979)/ + .180, 59069,180, 59071,180, 59087,180, 59101,180, 59107, + .180, 59113,180, 59153,180, 59173,180, 59183,180, 59207, + .180, 59209,180, 59219,180, 59233,180, 59251,180, 59257, + .180, 59263,180, 59267,180, 59279,180, 59293,180, 59321, + .180, 59327,180, 59333,180, 59347,180, 59359,180, 59389, + .180, 59401,180, 59423,180, 59431,180, 59453,180, 59479, + .180, 59509,180, 59513,180, 59519,180, 59521,180, 59543, + .180, 59569,180, 59591,180, 59621,180, 59627,180, 59633, + .180, 59659,180, 59671,180, 59681,180, 59699,180, 59713, + .180, 59719,180, 59743,180, 59759,180, 59783,180, 59789, + .180, 59801,180, 59807,180, 59827,180, 59831,180, 59849, + .180, 59863,180, 59879,180, 59891,180, 59893,180, 59929, + .180, 59939,180, 59981,180, 59989,180, 59993,180, 59999, + .180, 60031,180, 60037,180, 60061,180, 60067,180, 60073, + .180, 60103,180, 60149,180, 60161,180, 60173,180, 60179, + .180, 60193,180, 60217,180, 60229,180, 60247,180, 60251, + .180, 60283,180, 60329,180, 60331,180, 60341,180, 60361, + .180, 60377,180, 60397,180, 60403,180, 60419,180, 60439, + .180, 60467,180, 60473,180, 60499,180, 60523,180, 60553, + .180, 60557,180, 60559,180, 60569,180, 60581,180, 60587, + .180, 60593,180, 60601,180, 60611,180, 60613,180, 60619, + .180, 60643,180, 60647,180, 60667,180, 60671,180, 60713, + .180, 60737,180, 60749,180, 60763,180, 60769,180, 60787, + .180, 60797,180, 60811,180, 60823,180, 60829,180, 60847, + .180, 60851,180, 60853,180, 60881,180, 60887,180, 60889, + .180, 60913,180, 60919,180, 60929,180, 60941,180, 60943, + .180, 60971,180, 60973,180, 60977,180, 60997,180, 61001, + .180, 61013,180, 61019,180, 61039,180, 61043,180, 61049, + .180, 61063,180, 61081,180, 61109,180, 61111,180, 61133, + .180, 61141,180, 61181,180, 61187,180, 61213,180, 61217, + .180, 61229,180, 61231,180, 61271,180, 61273,180, 61279, + .180, 61283,180, 61297,180, 61307,180, 61313,180, 61321, + .180, 61337,180, 61339,180, 61351,180, 61357,180, 61393, + .180, 61397,180, 61403,180, 61409,180, 61427,180, 61433, + .180, 61451,180, 61489,180, 61511,180, 61519,180, 61529, + .180, 61537,180, 61543,180, 61549,180, 61559,180, 61571, + .180, 61577,180, 61579,180, 61621,180, 61631,180, 61651, + .180, 61669,180, 61679,180, 61697,180, 61711,180, 61721, + .180, 61747,180, 61763,180, 61787,180, 61789,180, 61799, + .180, 61801,180, 61811,180, 61831,180, 61843,180, 61879, + .180, 61897,180, 61901,180, 61907,180, 61943,180, 61963, + .180, 61967,180, 61999,180, 62053,180, 62063,180, 62071, + .180, 62077,180, 62089,180, 62093,180, 62099,180, 62117, + .180, 62119,180, 62149,180, 62177,180, 62179,180, 62203, + .180, 62221,180, 62239,180, 62243,180, 62249,180, 62267, + .180, 62299,180, 62303,180, 62321,180, 62327,180, 62333, + .180, 62359,180, 62371,180, 62413,180, 62417,180, 62441, + .180, 62467,180, 62473,180, 62489,180, 62491,180, 62509, + .180, 62537,180, 62551,180, 62569,180, 62581,180, 62593, + .180, 62597,180, 62599,180, 62603,180, 62621,180, 62629, + .180, 62657,180, 62659,180, 62671,180, 62677,180, 62683, + .180, 62687,180, 62699,180, 62707,180, 62749,180, 62753, + .180, 62761,180, 62767,180, 62789,180, 62813,180, 62827, + .180, 62831,180, 62869,180, 62879,180, 62891,180, 62897, + .180, 62903,180, 62947,180, 62953,180, 62971,180, 62977, + .180, 62981,180, 62993,180, 63001,180, 63007,180, 63013, + .180, 63023,180, 63029,180, 63059,180, 63061,180, 63083, + .180, 63089,180, 63091,180, 63103,180, 63119,180, 63131, + .180, 63163,180, 63227,180, 63233,180, 63239,180, 63259, + .180, 63271,180, 63311,180, 63337,180, 63341,180, 63353, + .180, 63367,180, 63373,180, 63397,180, 63409,180, 63413, + .180, 63421,180, 63427,180, 63437,180, 63443,180, 63449, + .180, 63481,180, 63499,180, 63509,180, 63517,180, 63541, + .180, 63551,180, 63559,180, 63569,180, 63601,180, 63607, + .180, 63617,180, 63623,180, 63629,180, 63637,180, 63653, + .180, 63671,180, 63691,180, 63727,180, 63743,180, 63751, + .180, 63763,180, 63787,180, 63821,180, 63827,180, 63847, + .180, 63899,180, 63917,180, 63931,180, 63989,180, 63997, + .180, 64003,180, 64007,180, 64009,180, 64013,180, 64037, + .180, 64067,180, 64087,180, 64093,180, 64133,180, 64139, + .180, 64147,180, 64157,180, 64163,180, 64169,180, 64181, + .180, 64189,180, 64207,180, 64211,180, 64217,180, 64219, + .180, 64223,180, 64247,180, 64261,180, 64273,180, 64297, + .180, 64307,180, 64309,180, 64331,180, 64357,180, 64379, + .180, 64387,180, 64409,180, 64417,180, 64483,180, 64489, + .180, 64493,180, 64513,180, 64531,180, 64553,180, 64591, + .180, 64601,180, 64609,180, 64613,180, 64619,180, 64627, + .180, 64651,180, 64661,180, 64679,180, 64687,180, 64711, + .180, 64717,180, 64727,180, 64739,180, 64741,180, 64751, + .180, 64757,180, 64793,180, 64813,180, 64819,180, 64823, + .180, 64847,180, 64871,180, 64877,180, 64883,180, 64891, + .180, 64921,180, 64927,180, 64931,180, 64933,180, 64949, + .180, 64961,180, 64987,180, 65047,180, 65059,180, 65063, + .180, 65077,180, 65089,180, 65093,180, 65099,180, 65101, + .180, 65119,180, 65131,180, 65137,180, 65147,180, 65159, + .180, 65171,180, 65179,180, 65191,180, 65203,180, 65207, + .180, 65213,180, 65221,180, 65231,180, 65233,180, 65269, + .180, 65311,180, 65323,180, 65339,180, 65347,180, 65369, + .180, 65393,180, 65399,180, 65407,180, 65431,180, 65437, + .180, 65441,180, 65443,180, 65473,180, 65479,180, 65507, + .180, 65527,180, 65533,181, 13,181, 15,181, 33, + .181, 61,181, 67,181, 141,181, 151,181, 183, + .181, 187,181, 201,181, 207,181, 213,181, 217, + .181, 223,181, 225,181, 243,181, 253,181, 255, + .181, 277,181, 291,181, 297,181, 301,181, 327, + .181, 337,181, 357,181, 375,181, 423,181, 453, + .181, 477,181, 511,181, 531,181, 547,181, 553, + .181, 561,181, 565,181, 595,181, 607,181, 645/ + DATA ((l(i,j),i=3,4),j=980,nmax)/ + .181, 657,181, 663,181, 685,181, 687,181, 697, + .181, 745,181, 775,181, 787,181, 823,181, 825, + .181, 841,181, 853,181, 865,181, 895,181, 903, + .181, 943,181, 963,181, 973,181, 981,181, 1005, + .181,1015,181,1021,181,1023,181,1041,181,1051, + .181, 1057,181, 1083,181, 1093,181, 1105,181, 1107, + .181, 1117,181, 1135,181, 1137,181, 1155,181, 1167, + .181, 1191,181, 1197,181, 1221,181, 1233,181, 1237, + .181, 1243,181, 1263/ + DATA ((n(i,j),i=3,4),j=0,489)/ + .180, 51739,180, 51757,180, 51761,180, 51767,180, 51773, + .180, 51791,180, 51817,180, 51833,180, 51859,180, 51871, + .180, 51877,180, 51883,180, 51887,180, 51893,180, 51899, + .180, 51913,180, 51953,180, 51971,180, 51989,180, 51997, + .180, 52009,180, 52013,180, 52033,180, 52043,180, 52051, + .180, 52057,180, 52073,180, 52109,180, 52111,180, 52121, + .180, 52139,180, 52157,180, 52183,180, 52193,180, 52199, + .180, 52211,180, 52219,180, 52229,180, 52237,180, 52241, + .180, 52249,180, 52261,180, 52271,180, 52277,180, 52307, + .180, 52321,180, 52349,180, 52373,180, 52381,180, 52387, + .180, 52393,180, 52411,180, 52429,180, 52439,180, 52451, + .180, 52457,180, 52481,180, 52501,180, 52541,180, 52559, + .180, 52573,180, 52579,180, 52589,180, 52597,180, 52607, + .180, 52613,180, 52627,180, 52631,180, 52649,180, 52657, + .180, 52697,180, 52703,180, 52723,180, 52751,180, 52757, + .180, 52759,180, 52769,180, 52771,180, 52789,180, 52793, + .180, 52811,180, 52817,180, 52829,180, 52859,180, 52879, + .180, 52883,180, 52919,180, 52921,180, 52933,180, 52937, + .180, 52957,180, 52963,180, 52993,180, 53011,180, 53023, + .180, 53027,180, 53077,180, 53087,180, 53089,180, 53093, + .180, 53107,180, 53119,180, 53153,180, 53161,180, 53173, + .180, 53179,180, 53191,180, 53203,180, 53209,180, 53213, + .180, 53219,180, 53221,180, 53227,180, 53233,180, 53243, + .180, 53261,180, 53263,180, 53279,180, 53287,180, 53291, + .180, 53311,180, 53321,180, 53329,180, 53333,180, 53389, + .180, 53401,180, 53411,180, 53429,180, 53443,180, 53453, + .180, 53467,180, 53507,180, 53521,180, 53531,180, 53539, + .180, 53543,180, 53551,180, 53569,180, 53581,180, 53593, + .180, 53597,180, 53623,180, 53629,180, 53641,180, 53647, + .180, 53653,180, 53669,180, 53681,180, 53689,180, 53711, + .180, 53753,180, 53767,180, 53779,180, 53789,180, 53803, + .180, 53821,180, 53861,180, 53867,180, 53887,180, 53893, + .180, 53899,180, 53909,180, 53927,180, 53947,180, 53957, + .180, 53989,180, 54001,180, 54031,180, 54049,180, 54061, + .180, 54077,180, 54127,180, 54131,180, 54187,180, 54197, + .180, 54199,180, 54221,180, 54251,180, 54259,180, 54269, + .180, 54311,180, 54323,180, 54349,180, 54353,180, 54379, + .180, 54397,180, 54419,180, 54427,180, 54433,180, 54439, + .180, 54451,180, 54461,180, 54467,180, 54473,180, 54481, + .180, 54503,180, 54511,180, 54517,180, 54551,180, 54553, + .180, 54571,180, 54581,180, 54587,180, 54613,180, 54629, + .180, 54643,180, 54647,180, 54659,180, 54677,180, 54683, + .180, 54701,180, 54721,180, 54739,180, 54811,180, 54823, + .180, 54829,180, 54833,180, 54839,180, 54869,180, 54871, + .180, 54881,180, 54893,180, 54923,180, 54929,180, 54943, + .180, 54967,180, 54971,180, 55001,180, 55013,180, 55039, + .180, 55043,180, 55049,180, 55067,180, 55069,180, 55079, + .180, 55097,180, 55109,180, 55111,180, 55117,180, 55123, + .180, 55127,180, 55133,180, 55141,180, 55147,180, 55159, + .180, 55193,180, 55201,180, 55247,180, 55273,180, 55279, + .180, 55307,180, 55313,180, 55319,180, 55333,180, 55361, + .180, 55379,180, 55387,180, 55411,180, 55429,180, 55439, + .180, 55447,180, 55453,180, 55469,180, 55487,180, 55517, + .180, 55537,180, 55571,180, 55573,180, 55579,180, 55603, + .180, 55609,180, 55649,180, 55667,180, 55669,180, 55681, + .180, 55691,180, 55697,180, 55729,180, 55741,180, 55757, + .180, 55771,180, 55783,180, 55793,180, 55799,180, 55807, + .180, 55813,180, 55817,180, 55823,180, 55831,180, 55847, + .180, 55859,180, 55861,180, 55879,180, 55889,180, 55957, + .180, 55973,180, 55979,180, 55993,180, 56033,180, 56051, + .180, 56057,180, 56059,180, 56077,180, 56093,180, 56099, + .180, 56111,180, 56129,180, 56131,180, 56143,180, 56161, + .180, 56167,180, 56177,180, 56183,180, 56237,180, 56239, + .180, 56261,180, 56279,180, 56287,180, 56293,180, 56323, + .180, 56327,180, 56329,180, 56351,180, 56353,180, 56357, + .180, 56377,180, 56393,180, 56399,180, 56411,180, 56437, + .180, 56441,180, 56477,180, 56479,180, 56489,180, 56503, + .180, 56509,180, 56521,180, 56533,180, 56539,180, 56551, + .180, 56609,180, 56653,180, 56677,180, 56681,180, 56701, + .180, 56723,180, 56737,180, 56741,180, 56747,180, 56761, + .180, 56827,180, 56839,180, 56843,180, 56849,180, 56887, + .180, 56903,180, 56939,180, 56941,180, 56947,180, 56969, + .180, 56971,180, 56983,180, 57049,180, 57077,180, 57091, + .180, 57121,180, 57133,180, 57137,180, 57149,180, 57169, + .180, 57179,180, 57199,180, 57209,180, 57239,180, 57251, + .180, 57277,180, 57281,180, 57293,180, 57311,180, 57337, + .180, 57359,180, 57367,180, 57377,180, 57389,180, 57403, + .180, 57407,180, 57409,180, 57413,180, 57419,180, 57431, + .180, 57451,180, 57463,180, 57499,180, 57511,180, 57521, + .180, 57529,180, 57539,180, 57577,180, 57581,180, 57667, + .180, 57679,180, 57683,180, 57689,180, 57731,180, 57767, + .180, 57781,180, 57787,180, 57799,180, 57823,180, 57847, + .180, 57851,180, 57853,180, 57883,180, 57899,180, 57919, + .180, 57931,180, 57949,180, 57953,180, 57959,180, 57961, + .180, 57983,180, 57997,180, 58009,180, 58037,180, 58039, + .180, 58043,180, 58049,180, 58087,180, 58091,180, 58093, + .180, 58123,180, 58127,180, 58201,180, 58211,180, 58229, + .180, 58243,180, 58277,180, 58303,180, 58313,180, 58333, + .180, 58367,180, 58373,180, 58393,180, 58397,180, 58403, + .180, 58411,180, 58417,180, 58421,180, 58439,180, 58457, + .180, 58481,180, 58483,180, 58499,180, 58523,180, 58537, + .180, 58543,180, 58549,180, 58553,180, 58631,180, 58661, + .180, 58667,180, 58669,180, 58679,180, 58697,180, 58723, + .180, 58733,180, 58739,180, 58751,180, 58787,180, 58789, + .180, 58823,180, 58829,180, 58841,180, 58849,180, 58859, + .180, 58871,180, 58873,180, 58877,180, 58879,180, 58901, + .180, 58903,180, 58907,180, 58919,180, 58927,180, 58933, + .180, 59009,180, 59011,180, 59027,180, 59041,180, 59051/ + DATA ((n(i,j),i=3,4),j=490,979)/ + .180, 59069,180, 59071,180, 59087,180, 59101,180, 59107, + .180, 59113,180, 59153,180, 59173,180, 59183,180, 59207, + .180, 59209,180, 59219,180, 59233,180, 59251,180, 59257, + .180, 59263,180, 59267,180, 59279,180, 59293,180, 59321, + .180, 59327,180, 59333,180, 59347,180, 59359,180, 59389, + .180, 59401,180, 59423,180, 59431,180, 59453,180, 59479, + .180, 59509,180, 59513,180, 59519,180, 59521,180, 59543, + .180, 59569,180, 59591,180, 59621,180, 59627,180, 59633, + .180, 59659,180, 59671,180, 59681,180, 59699,180, 59713, + .180, 59719,180, 59743,180, 59759,180, 59783,180, 59789, + .180, 59801,180, 59807,180, 59827,180, 59831,180, 59849, + .180, 59863,180, 59879,180, 59891,180, 59893,180, 59929, + .180, 59939,180, 59981,180, 59989,180, 59993,180, 59999, + .180, 60031,180, 60037,180, 60061,180, 60067,180, 60073, + .180, 60103,180, 60149,180, 60161,180, 60173,180, 60179, + .180, 60193,180, 60217,180, 60229,180, 60247,180, 60251, + .180, 60283,180, 60329,180, 60331,180, 60341,180, 60361, + .180, 60377,180, 60397,180, 60403,180, 60419,180, 60439, + .180, 60467,180, 60473,180, 60499,180, 60523,180, 60553, + .180, 60557,180, 60559,180, 60569,180, 60581,180, 60587, + .180, 60593,180, 60601,180, 60611,180, 60613,180, 60619, + .180, 60643,180, 60647,180, 60667,180, 60671,180, 60713, + .180, 60737,180, 60749,180, 60763,180, 60769,180, 60787, + .180, 60797,180, 60811,180, 60823,180, 60829,180, 60847, + .180, 60851,180, 60853,180, 60881,180, 60887,180, 60889, + .180, 60913,180, 60919,180, 60929,180, 60941,180, 60943, + .180, 60971,180, 60973,180, 60977,180, 60997,180, 61001, + .180, 61013,180, 61019,180, 61039,180, 61043,180, 61049, + .180, 61063,180, 61081,180, 61109,180, 61111,180, 61133, + .180, 61141,180, 61181,180, 61187,180, 61213,180, 61217, + .180, 61229,180, 61231,180, 61271,180, 61273,180, 61279, + .180, 61283,180, 61297,180, 61307,180, 61313,180, 61321, + .180, 61337,180, 61339,180, 61351,180, 61357,180, 61393, + .180, 61397,180, 61403,180, 61409,180, 61427,180, 61433, + .180, 61451,180, 61489,180, 61511,180, 61519,180, 61529, + .180, 61537,180, 61543,180, 61549,180, 61559,180, 61571, + .180, 61577,180, 61579,180, 61621,180, 61631,180, 61651, + .180, 61669,180, 61679,180, 61697,180, 61711,180, 61721, + .180, 61747,180, 61763,180, 61787,180, 61789,180, 61799, + .180, 61801,180, 61811,180, 61831,180, 61843,180, 61879, + .180, 61897,180, 61901,180, 61907,180, 61943,180, 61963, + .180, 61967,180, 61999,180, 62053,180, 62063,180, 62071, + .180, 62077,180, 62089,180, 62093,180, 62099,180, 62117, + .180, 62119,180, 62149,180, 62177,180, 62179,180, 62203, + .180, 62221,180, 62239,180, 62243,180, 62249,180, 62267, + .180, 62299,180, 62303,180, 62321,180, 62327,180, 62333, + .180, 62359,180, 62371,180, 62413,180, 62417,180, 62441, + .180, 62467,180, 62473,180, 62489,180, 62491,180, 62509, + .180, 62537,180, 62551,180, 62569,180, 62581,180, 62593, + .180, 62597,180, 62599,180, 62603,180, 62621,180, 62629, + .180, 62657,180, 62659,180, 62671,180, 62677,180, 62683, + .180, 62687,180, 62699,180, 62707,180, 62749,180, 62753, + .180, 62761,180, 62767,180, 62789,180, 62813,180, 62827, + .180, 62831,180, 62869,180, 62879,180, 62891,180, 62897, + .180, 62903,180, 62947,180, 62953,180, 62971,180, 62977, + .180, 62981,180, 62993,180, 63001,180, 63007,180, 63013, + .180, 63023,180, 63029,180, 63059,180, 63061,180, 63083, + .180, 63089,180, 63091,180, 63103,180, 63119,180, 63131, + .180, 63163,180, 63227,180, 63233,180, 63239,180, 63259, + .180, 63271,180, 63311,180, 63337,180, 63341,180, 63353, + .180, 63367,180, 63373,180, 63397,180, 63409,180, 63413, + .180, 63421,180, 63427,180, 63437,180, 63443,180, 63449, + .180, 63481,180, 63499,180, 63509,180, 63517,180, 63541, + .180, 63551,180, 63559,180, 63569,180, 63601,180, 63607, + .180, 63617,180, 63623,180, 63629,180, 63637,180, 63653, + .180, 63671,180, 63691,180, 63727,180, 63743,180, 63751, + .180, 63763,180, 63787,180, 63821,180, 63827,180, 63847, + .180, 63899,180, 63917,180, 63931,180, 63989,180, 63997, + .180, 64003,180, 64007,180, 64009,180, 64013,180, 64037, + .180, 64067,180, 64087,180, 64093,180, 64133,180, 64139, + .180, 64147,180, 64157,180, 64163,180, 64169,180, 64181, + .180, 64189,180, 64207,180, 64211,180, 64217,180, 64219, + .180, 64223,180, 64247,180, 64261,180, 64273,180, 64297, + .180, 64307,180, 64309,180, 64331,180, 64357,180, 64379, + .180, 64387,180, 64409,180, 64417,180, 64483,180, 64489, + .180, 64493,180, 64513,180, 64531,180, 64553,180, 64591, + .180, 64601,180, 64609,180, 64613,180, 64619,180, 64627, + .180, 64651,180, 64661,180, 64679,180, 64687,180, 64711, + .180, 64717,180, 64727,180, 64739,180, 64741,180, 64751, + .180, 64757,180, 64793,180, 64813,180, 64819,180, 64823, + .180, 64847,180, 64871,180, 64877,180, 64883,180, 64891, + .180, 64921,180, 64927,180, 64931,180, 64933,180, 64949, + .180, 64961,180, 64987,180, 65047,180, 65059,180, 65063, + .180, 65077,180, 65089,180, 65093,180, 65099,180, 65101, + .180, 65119,180, 65131,180, 65137,180, 65147,180, 65159, + .180, 65171,180, 65179,180, 65191,180, 65203,180, 65207, + .180, 65213,180, 65221,180, 65231,180, 65233,180, 65269, + .180, 65311,180, 65323,180, 65339,180, 65347,180, 65369, + .180, 65393,180, 65399,180, 65407,180, 65431,180, 65437, + .180, 65441,180, 65443,180, 65473,180, 65479,180, 65507, + .180, 65527,180, 65533,181, 13,181, 15,181, 33, + .181, 61,181, 67,181, 141,181, 151,181, 183, + .181, 187,181, 201,181, 207,181, 213,181, 217, + .181, 223,181, 225,181, 243,181, 253,181, 255, + .181, 277,181, 291,181, 297,181, 301,181, 327, + .181, 337,181, 357,181, 375,181, 423,181, 453, + .181, 477,181, 511,181, 531,181, 547,181, 553, + .181, 561,181, 565,181, 595,181, 607,181, 645/ + DATA ((n(i,j),i=3,4),j=980,nmax)/ + .181, 657,181, 663,181, 685,181, 687,181, 697, + .181, 745,181, 775,181, 787,181, 823,181, 825, + .181, 841,181, 853,181, 865,181, 895,181, 903, + .181, 943,181, 963,181, 973,181, 981,181, 1005, + .181, 1015,181, 1021,181, 1023,181, 1041,181, 1051, + .181, 1057,181, 1083,181, 1093,181, 1105,181, 1107, + .181, 1117,181, 1135,181, 1137,181, 1155,181, 1167, + .181, 1191,181, 1197,181, 1221,181, 1233,181, 1237, + .181, 1243,181, 1263/ + end +#endif diff --git a/source/unres/src_MD-NEWSC/proc_proc.c b/source/unres/src_MD-NEWSC/proc_proc.c new file mode 100644 index 0000000..d77c5a4 --- /dev/null +++ b/source/unres/src_MD-NEWSC/proc_proc.c @@ -0,0 +1,139 @@ +#include +#include + +#ifdef CRAY +void PROC_PROC(long int *f, int *i) +#else +#ifdef LINUX +#ifdef PGI +void proc_proc_(long int *f, int *i) +#else +void proc_proc__(long int *f, int *i) +#endif +#endif +#ifdef SGI +void proc_proc_(long int *f, int *i) +#endif +#if defined(WIN) && !defined(WINIFL) +void _stdcall PROC_PROC(long int *f, int *i) +#endif +#ifdef WINIFL +void proc_proc(long int *f, int *i) +#endif +#if defined(AIX) || defined(WINPGI) +void proc_proc(long int *f, int *i) +#endif +#endif + +{ +static long int NaNQ; +static long int NaNQm; + +if(*i==-1) + { + NaNQ=*f; + NaNQm=0xffffffff; + return; + } +*i=0; +if(*f==NaNQ) + *i=1; +if(*f==NaNQm) + *i=1; +} + +#ifdef CRAY +void PROC_CONV(char *buf, int *i, int n) +#endif +#ifdef LINUX +void proc_conv__(char *buf, int *i, int n) +#endif +#ifdef SGI +void proc_conv_(char *buf, int *i, int n) +#endif +#if defined(AIX) || defined(WINPGI) +void proc_conv(char *buf, int *i, int n) +#endif +#ifdef WIN +void _stdcall PROC_CONV(char *buf, int *i, int n) +#endif +{ +int j; + +sscanf(buf,"%d",&j); +*i=j; +return; +} + +#ifdef CRAY +void PROC_CONV_R(char *buf, int *i, int n) +#endif +#ifdef LINUX +void proc_conv_r__(char *buf, int *i, int n) +#endif +#ifdef SGI +void proc_conv_r_(char *buf, int *i, int n) +#endif +#if defined(AIX) || defined(WINPGI) +void proc_conv_r(char *buf, int *i, int n) +#endif +#ifdef WIN +void _stdcall PROC_CONV_R(char *buf, int *i, int n) +#endif + +{ + +/* sprintf(buf,"%d",*i); */ + +return; +} + + +#ifndef IMSL +#ifdef CRAY +void DSVRGP(int *n, double *tab1, double *tab2, int *itab) +#endif +#ifdef LINUX +void dsvrgp__(int *n, double *tab1, double *tab2, int *itab) +#endif +#ifdef SGI +void dsvrgp_(int *n, double *tab1, double *tab2, int *itab) +#endif +#if defined(AIX) || defined(WINPGI) +void dsvrgp(int *n, double *tab1, double *tab2, int *itab) +#endif +#ifdef WIN +void _stdcall DSVRGP(int *n, double *tab1, double *tab2, int *itab) +#endif +{ +double t; +int i,j,k; + +if(tab1 != tab2) + { + for(i=0; i<*n; i++) + tab2[i]=tab1[i]; + } +k=0; +while(k<*n-1) + { + j=k; + t=tab2[k]; + for(i=k+1; i<*n; i++) + if(t>tab2[i]) + { + j=i; + t=tab2[i]; + } + if(j!=k) + { + tab2[j]=tab2[k]; + tab2[k]=t; + i=itab[j]; + itab[j]=itab[k]; + itab[k]=i; + } + k++; + } +} +#endif diff --git a/source/unres/src_MD-NEWSC/q_measure.F b/source/unres/src_MD-NEWSC/q_measure.F new file mode 100644 index 0000000..417cf35 --- /dev/null +++ b/source/unres/src_MD-NEWSC/q_measure.F @@ -0,0 +1,487 @@ + double precision function qwolynes(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + integer i,j,jl,k,l,il,kl,nl,np,ip,kp,seg1,seg2,seg3,seg4, + & secseg + integer nsep /3/ + double precision dist,qm + double precision qq,qqij,qqijCM,dij,d0ij,dijCM,d0ijCM + logical lprn /.false./ + logical flag + double precision sigm,x + sigm(x)=0.25d0*x + qq = 0.0d0 + nl=0 + if(flag) then + do il=seg1+nsep,seg2 + do jl=seg1,il-nsep + nl=nl+1 + d0ij=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij=dist(il,jl) + qqij = dexp(-0.5d0*((dij-d0ij)/(sigm(d0ij)))**2) + if (itype(il).ne.10 .or. itype(jl).ne.10) then + nl=nl+1 + d0ijCM=dsqrt( + & (cref(1,jl+nres)-cref(1,il+nres))**2+ + & (cref(2,jl+nres)-cref(2,il+nres))**2+ + & (cref(3,jl+nres)-cref(3,il+nres))**2) + dijCM=dist(il+nres,jl+nres) + qqijCM = dexp(-0.5d0*((dijCM-d0ijCM)/(sigm(d0ijCM)))**2) + endif + qq = qq+qqij+qqijCM + enddo + enddo + qq = qq/nl + else + do il=seg1,seg2 + if((seg3-il).lt.3) then + secseg=il+3 + else + secseg=seg3 + endif + do jl=secseg,seg4 + nl=nl+1 + d0ij=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij=dist(il,jl) + qqij = dexp(-0.5d0*((dij-d0ij)/(sigm(d0ij)))**2) + if (itype(il).ne.10 .or. itype(jl).ne.10) then + nl=nl+1 + d0ijCM=dsqrt( + & (cref(1,jl+nres)-cref(1,il+nres))**2+ + & (cref(2,jl+nres)-cref(2,il+nres))**2+ + & (cref(3,jl+nres)-cref(3,il+nres))**2) + dijCM=dist(il+nres,jl+nres) + qqijCM = dexp(-0.5d0*((dijCM-d0ijCM)/(sigm(d0ijCM)))**2) + endif + qq = qq+qqij+qqijCM + enddo + enddo + qq = qq/nl + endif + qwolynes=1.0d0-qq + return + end +c------------------------------------------------------------------- + subroutine qwolynes_prim(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.MD' + integer i,j,jl,k,l,il,nl,seg1,seg2,seg3,seg4, + & secseg + integer nsep /3/ + double precision dist + double precision dij,d0ij,dijCM,d0ijCM + logical lprn /.false./ + logical flag + double precision sigm,x,sim,dd0,fac,ddqij + sigm(x)=0.25d0*x + + do i=0,nres + do j=1,3 + dqwol(j,i)=0.0d0 + dxqwol(j,i)=0.0d0 + enddo + enddo + nl=0 + if(flag) then + do il=seg1+nsep,seg2 + do jl=seg1,il-nsep + nl=nl+1 + d0ij=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij=dist(il,jl) + sim = 1.0d0/sigm(d0ij) + sim = sim*sim + dd0 = dij-d0ij + fac = dd0*sim/dij*dexp(-0.5d0*dd0*dd0*sim) + do k=1,3 + ddqij = (c(k,il)-c(k,jl))*fac + dqwol(k,il)=dqwol(k,il)+ddqij + dqwol(k,jl)=dqwol(k,jl)-ddqij + enddo + + if (itype(il).ne.10 .or. itype(jl).ne.10) then + nl=nl+1 + d0ijCM=dsqrt( + & (cref(1,jl+nres)-cref(1,il+nres))**2+ + & (cref(2,jl+nres)-cref(2,il+nres))**2+ + & (cref(3,jl+nres)-cref(3,il+nres))**2) + dijCM=dist(il+nres,jl+nres) + sim = 1.0d0/sigm(d0ijCM) + sim = sim*sim + dd0=dijCM-d0ijCM + fac=dd0*sim/dijCM*dexp(-0.5d0*dd0*dd0*sim) + do k=1,3 + ddqij = (c(k,il+nres)-c(k,jl+nres))*fac + dxqwol(k,il)=dxqwol(k,il)+ddqij + dxqwol(k,jl)=dxqwol(k,jl)-ddqij + enddo + endif + enddo + enddo + else + do il=seg1,seg2 + if((seg3-il).lt.3) then + secseg=il+3 + else + secseg=seg3 + endif + do jl=secseg,seg4 + nl=nl+1 + d0ij=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij=dist(il,jl) + sim = 1.0d0/sigm(d0ij) + sim = sim*sim + dd0 = dij-d0ij + fac = dd0*sim/dij*dexp(-0.5d0*dd0*dd0*sim) + do k=1,3 + ddqij = (c(k,il)-c(k,jl))*fac + dqwol(k,il)=dqwol(k,il)+ddqij + dqwol(k,jl)=dqwol(k,jl)-ddqij + enddo + if (itype(il).ne.10 .or. itype(jl).ne.10) then + nl=nl+1 + d0ijCM=dsqrt( + & (cref(1,jl+nres)-cref(1,il+nres))**2+ + & (cref(2,jl+nres)-cref(2,il+nres))**2+ + & (cref(3,jl+nres)-cref(3,il+nres))**2) + dijCM=dist(il+nres,jl+nres) + sim = 1.0d0/sigm(d0ijCM) + sim=sim*sim + dd0 = dijCM-d0ijCM + fac = dd0*sim/dijCM*dexp(-0.5d0*dd0*dd0*sim) + do k=1,3 + ddqij = (c(k,il+nres)-c(k,jl+nres))*fac + dxqwol(k,il)=dxqwol(k,il)+ddqij + dxqwol(k,jl)=dxqwol(k,jl)-ddqij + enddo + endif + enddo + enddo + endif + do i=0,nres + do j=1,3 + dqwol(j,i)=dqwol(j,i)/nl + dxqwol(j,i)=dxqwol(j,i)/nl + enddo + enddo + return + end +c------------------------------------------------------------------- + subroutine qwol_num(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + integer seg1,seg2,seg3,seg4 + logical flag + double precision qwolan(3,0:maxres),cdummy(3,0:maxres2), + & qwolxan(3,0:maxres),q1,q2 + double precision delta /1.0d-10/ + do i=0,nres + do j=1,3 + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + cdummy(j,i)=c(j,i) + c(j,i)=c(j,i)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolan(j,i)=(q2-q1)/delta + c(j,i)=cdummy(j,i) + enddo + enddo + do i=0,nres + do j=1,3 + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + cdummy(j,i+nres)=c(j,i+nres) + c(j,i+nres)=c(j,i+nres)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolxan(j,i)=(q2-q1)/delta + c(j,i+nres)=cdummy(j,i+nres) + enddo + enddo +c write(iout,*) "Numerical Q carteisan gradients backbone: " +c do i=0,nct +c write(iout,'(i5,3e15.5)') i, (qwolan(j,i),j=1,3) +c enddo +c write(iout,*) "Numerical Q carteisan gradients side-chain: " +c do i=0,nct +c write(iout,'(i5,3e15.5)') i, (qwolxan(j,i),j=1,3) +c enddo + return + end +c------------------------------------------------------------------------ + subroutine EconstrQ +c MD with umbrella_sampling using Wolyne's distance measure as a constraint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2,hm1,hm2,hmnum + double precision ucdelan,dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES), + & duconst(3,0:MAXRES),duxconst(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ + do i=0,nres + do j=1,3 + duconst(j,i)=0.0d0 + dudconst(j,i)=0.0d0 + duxconst(j,i)=0.0d0 + dudxconst(j,i)=0.0d0 + enddo + enddo + Uconst=0.0d0 + do i=1,nfrag + qfrag(i)=qwolynes(ifrag(1,i,iset),ifrag(2,i,iset),.true. + & ,idummy,idummy) + Uconst=Uconst+wfrag(i,iset)*harmonic(qfrag(i),qinfrag(i,iset)) +c Calculating the derivatives of Constraint energy with respect to Q + Ucdfrag=wfrag(i,iset)*harmonicprim(qfrag(i), + & qinfrag(i,iset)) +c hm1=harmonic(qfrag(i,iset),qinfrag(i,iset)) +c hm2=harmonic(qfrag(i,iset)+delta,qinfrag(i,iset)) +c hmnum=(hm2-hm1)/delta +c write(iout,*) "harmonicprim frag",harmonicprim(qfrag(i,iset), +c & qinfrag(i,iset)) +c write(iout,*) "harmonicnum frag", hmnum +c Calculating the derivatives of Q with respect to cartesian coordinates + call qwolynes_prim(ifrag(1,i,iset),ifrag(2,i,iset),.true. + & ,idummy,idummy) +c write(iout,*) "dqwol " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dqwol(j,ii),j=1,3) +c enddo +c write(iout,*) "dxqwol " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dxqwol(j,ii),j=1,3) +c enddo +c Calculating numerical gradients of dU/dQi and dQi/dxi +c call qwol_num(ifrag(1,i,iset),ifrag(2,i,iset),.true. +c & ,idummy,idummy) +c The gradients of Uconst in Cs + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdfrag*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdfrag*dxqwol(j,ii) + enddo + enddo + enddo + do i=1,npair + kstart=ifrag(1,ipair(1,i,iset),iset) + kend=ifrag(2,ipair(1,i,iset),iset) + lstart=ifrag(1,ipair(2,i,iset),iset) + lend=ifrag(2,ipair(2,i,iset),iset) + qpair(i)=qwolynes(kstart,kend,.false.,lstart,lend) + Uconst=Uconst+wpair(i,iset)*harmonic(qpair(i),qinpair(i,iset)) +c Calculating dU/dQ + Ucdpair=wpair(i,iset)*harmonicprim(qpair(i),qinpair(i,iset)) +c hm1=harmonic(qpair(i),qinpair(i,iset)) +c hm2=harmonic(qpair(i)+delta,qinpair(i,iset)) +c hmnum=(hm2-hm1)/delta +c write(iout,*) "harmonicprim pair ",harmonicprim(qpair(i), +c & qinpair(i,iset)) +c write(iout,*) "harmonicnum pair ", hmnum +c Calculating dQ/dXi + call qwolynes_prim(kstart,kend,.false. + & ,lstart,lend) +c write(iout,*) "dqwol " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dqwol(j,ii),j=1,3) +c enddo +c write(iout,*) "dxqwol " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dxqwol(j,ii),j=1,3) +c enddo +c Calculating numerical gradients +c call qwol_num(kstart,kend,.false. +c & ,lstart,lend) +c The gradients of Uconst in Cs + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdpair*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdpair*dxqwol(j,ii) + enddo + enddo + enddo +c write(iout,*) "Uconst inside subroutine ", Uconst +c Transforming the gradients from Cs to dCs for the backbone + do i=0,nres + do j=i+1,nres + do k=1,3 + dudconst(k,i)=dudconst(k,i)+duconst(k,j)+duxconst(k,j) + enddo + enddo + enddo +c Transforming the gradients from Cs to dCs for the side chains + do i=1,nres + do j=1,3 + dudxconst(j,i)=duxconst(j,i) + enddo + enddo +c write(iout,*) "dU/ddc backbone " +c do ii=0,nres +c write(iout,'(i5,3e15.5)') ii, (dudconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/ddX side chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(duxconst(j,ii),j=1,3) +c enddo +c Calculating numerical gradients of dUconst/ddc and dUconst/ddx +c call dEconstrQ_num + return + end +c----------------------------------------------------------------------- + subroutine dEconstrQ_num +c Calculating numerical dUconst/ddc and dUconst/ddx + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2 + double precision dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ +c For the backbone + do i=0,nres-1 + do j=1,3 + dUcartan(j,i)=0.0d0 + cdummy(j,i)=dc(j,i) + dc(j,i)=dc(j,i)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset),.true. + & ,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)*harmonic(qfrag(ii), + & qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)*harmonic(qpair(ii), + & qinpair(ii,iset)) + enddo + dc(j,i)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset),.true. + & ,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)*harmonic(qfrag(ii), + & qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)*harmonic(qpair(ii), + & qinpair(ii,iset)) + enddo + ducartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo +c Calculating numerical gradients for dU/ddx + do i=0,nres-1 + duxcartan(j,i)=0.0d0 + do j=1,3 + cdummy(j,i)=dc(j,i+nres) + dc(j,i+nres)=dc(j,i+nres)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset),.true. + & ,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)*harmonic(qfrag(ii), + & qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)*harmonic(qpair(ii), + & qinpair(ii,iset)) + enddo + dc(j,i+nres)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset), + & ifrag(2,ii,iset),.true.,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)*harmonic(qfrag(ii), + & qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)*harmonic(qpair(ii), + & qinpair(ii,iset)) + enddo + duxcartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo + write(iout,*) "Numerical dUconst/ddc backbone " + do ii=0,nres + write(iout,'(i5,3e15.5)') ii,(dUcartan(j,ii),j=1,3) + enddo +c write(iout,*) "Numerical dUconst/ddx side-chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dUxcartan(j,ii),j=1,3) +c enddo + return + end +c--------------------------------------------------------------------------- diff --git a/source/unres/src_MD-NEWSC/q_measure1.F b/source/unres/src_MD-NEWSC/q_measure1.F new file mode 100644 index 0000000..9c1546d --- /dev/null +++ b/source/unres/src_MD-NEWSC/q_measure1.F @@ -0,0 +1,470 @@ + double precision function qwolynes(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.MD' + integer i,j,jl,k,l,il,kl,nl,np,seg1,seg2,seg3,seg4,secseg + integer nsep /3/ + double precision dist,qm + double precision qq,qqij,qqijCM,dij,d0ij,dijCM,d0ijCM + logical lprn /.false./ + logical flag + qq = 0.0d0 + nl=0 + do i=0,nres + do j=1,3 + dqwol(j,i)=0.0d0 + dxqwol(j,i)=0.0d0 + enddo + enddo + if (lprn) then + write (iout,*) "seg1",seg1," seg2",seg2," seg3",seg3," seg4",seg4, + & " flag",flag + call flush(iout) + endif + if (flag) then + do il=seg1+nsep,seg2 + do jl=seg1,il-nsep + nl=nl+1 + if (itype(il).ne.10) then + ilnres=il+nres + else + ilnres=il + endif + if (itype(jl).ne.10) then + jlnres=jl+nres + else + jlnres=jl + endif + qqijCM = qcontrib(il,jl,ilnres,jlnres) + qq = qq+qqijCM + if (lprn) then + write (iout,*) "qqijCM",qqijCM + call flush(iout) + endif + enddo + enddo + if (lprn) then + write (iout,*) "nl",nl," qq",qq + call flush(iout) + endif + else + do il=seg1,seg2 + if((seg3-il).lt.3) then + secseg=il+3 + else + secseg=seg3 + endif + do jl=secseg,seg4 + nl=nl+1 + if (itype(il).ne.10) then + ilnres=il+nres + else + ilnres=il + endif + if (itype(jl).ne.10) then + jlnres=jl+nres + else + jlnres=jl + endif + qqijCM = qcontrib(il,jl,ilnres,jlnres) + qq = qq+qqijCM + if (lprn) then + write (iout,*) "qqijCM",qqijCM + call flush(iout) + endif + enddo + enddo + endif + qq = qq/nl + qwolynes=1.0d0-qq + do i=0,nres + do j=1,3 + dqwol(j,i)=dqwol(j,i)/nl + dxqwol(j,i)=dxqwol(j,i)/nl + enddo + enddo + return + end +c------------------------------------------------------------------- + subroutine qwol_num(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.MD' + integer seg1,seg2,seg3,seg4 + logical flag + double precision qwolan(3,0:maxres),cdummy(3,0:maxres2), + & qwolxan(3,0:maxres),q1,q2 + double precision delta /1.0d-7/ + write (iout,*) "seg1",seg1," seg2",seg2," seg3",seg3," seg4",seg4 + write(iout,*) "dQ/dc backbone " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (dqwol(j,i),j=1,3) + enddo + write(iout,*) "dQ/dX side chain " + do i=1,nres + write(iout,'(i5,3e15.5)') i,(dxqwol(j,i),j=1,3) + enddo + do i=1,nres + do j=1,3 + cdummy(j,i)=c(j,i) + c(j,i)=c(j,i)-delta + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + c(j,i)=cdummy(j,i)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolan(j,i)=0.5d0*(q2-q1)/delta + c(j,i)=cdummy(j,i) +c write (iout,*) "i",i," j",j," q1",q1," a2",q2 + enddo + enddo + do i=1,nres + do j=1,3 + cdummy(j,i+nres)=c(j,i+nres) + c(j,i+nres)=c(j,i+nres)-delta + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + c(j,i+nres)=cdummy(j,i+nres)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolxan(j,i)=0.5d0*(q2-q1)/delta + c(j,i+nres)=cdummy(j,i+nres) + enddo + enddo + write(iout,*) "Numerical Q cartesian gradients backbone: " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (qwolan(j,i),j=1,3) + enddo + write(iout,*) "Numerical Q cartesian gradients side-chain: " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (qwolxan(j,i),j=1,3) + enddo + return + end +c------------------------------------------------------------------------ + subroutine EconstrQ +c MD with umbrella_sampling using Wolyne's distance measure as a constraint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2,hm1,hm2,hmnum + double precision ucdelan,dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES), + & duconst(3,0:MAXRES),duxconst(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ + do i=0,nres + do j=1,3 + duconst(j,i)=0.0d0 + dudconst(j,i)=0.0d0 + duxconst(j,i)=0.0d0 + dudxconst(j,i)=0.0d0 + enddo + enddo + Uconst=0.0d0 + do i=1,nfrag + qfrag(i)=qwolynes(ifrag(1,i,iset),ifrag(2,i,iset),.true. + & ,idummy,idummy) + Uconst=Uconst+wfrag(i,iset)*harmonic(qfrag(i),qinfrag(i,iset)) +c Calculating the derivatives of Constraint energy with respect to Q + Ucdfrag=wfrag(i,iset)*harmonicprim(qfrag(i),qinfrag(i,iset)) +c Calculating the derivatives of Q with respect to cartesian coordinates + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdfrag*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdfrag*dxqwol(j,ii) + enddo + enddo +c write (iout,*) "Calling qwol_num" +c call qwol_num(ifrag(1,i),ifrag(2,i),.true.,idummy,idummy) + enddo + do i=1,npair + kstart=ifrag(1,ipair(1,i,iset),iset) + kend=ifrag(2,ipair(1,i,iset),iset) + lstart=ifrag(1,ipair(2,i,iset),iset) + lend=ifrag(2,ipair(2,i,iset),iset) + qpair(i)=qwolynes(kstart,kend,.false.,lstart,lend) + Uconst=Uconst+wpair(i,iset)*harmonic(qpair(i),qinpair(i,iset)) +c Calculating dU/dQ + Ucdpair=wpair(i,iset)*harmonicprim(qpair(i),qinpair(i,iset)) +c Calculating dQ/dXi + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdpair*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdpair*dxqwol(j,ii) + enddo + enddo + enddo +c write(iout,*) "Uconst inside subroutine ", Uconst +c Transforming the gradients from Cs to dCs for the backbone + do i=0,nres + do j=i+1,nres + do k=1,3 + dudconst(k,i)=dudconst(k,i)+duconst(k,j)+duxconst(k,j) + enddo + enddo + enddo +c Transforming the gradients from Cs to dCs for the side chains + do i=1,nres + do j=1,3 + dudxconst(j,i)=duxconst(j,i) + enddo + enddo +c write(iout,*) "dU/dc backbone " +c do ii=0,nres +c write(iout,'(i5,3e15.5)') ii, (duconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/dX side chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(duxconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/ddc backbone " +c do ii=0,nres +c write(iout,'(i5,3e15.5)') ii, (dudconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/ddX side chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dudxconst(j,ii),j=1,3) +c enddo +c Calculating numerical gradients of dUconst/ddc and dUconst/ddx +c call dEconstrQ_num + return + end +c----------------------------------------------------------------------- + subroutine dEconstrQ_num +c Calculating numerical dUconst/ddc and dUconst/ddx + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2 + double precision dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ +c For the backbone + do i=0,nres-1 + do j=1,3 + dUcartan(j,i)=0.0d0 + cdummy(j,i)=dc(j,i) + dc(j,i)=dc(j,i)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)*harmonic(qfrag(ii), + & qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + dc(j,i)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + ducartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo +c Calculating numerical gradients for dU/ddx + do i=0,nres-1 + do j=1,3 + duxcartan(j,i)=0.0d0 + enddo + do j=1,3 + cdummy(j,i)=dc(j,i+nres) + dc(j,i+nres)=dc(j,i+nres)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + dc(j,i+nres)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + duxcartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo + write(iout,*) "Numerical dUconst/ddc backbone " + do ii=0,nres + write(iout,'(i5,3e15.5)') ii,(dUcartan(j,ii),j=1,3) + enddo + write(iout,*) "Numerical dUconst/ddx side-chain " + do ii=1,nres + write(iout,'(i5,3e15.5)') ii,(dUxcartan(j,ii),j=1,3) + enddo + return + end +c--------------------------------------------------------------------------- + double precision function qcontrib(il,jl,il1,jl1) + implicit none + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.MD' + integer i,j,k,il,jl,il1,jl1,nd + double precision dist + external dist + double precision dij1,dij2,dij3,dij4,d0ij1,d0ij2,d0ij3,d0ij4,fac, + & fac1,ddave,ssij,ddqij + logical lprn /.false./ + d0ij1=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij1=dist(il,jl) + ddave=(dij1-d0ij1)**2 + nd=1 + if (jl1.ne.jl) then + d0ij2=dsqrt((cref(1,jl1)-cref(1,il))**2+ + & (cref(2,jl1)-cref(2,il))**2+ + & (cref(3,jl1)-cref(3,il))**2) + dij2=dist(il,jl1) + ddave=ddave+(dij2-d0ij2)**2 + nd=nd+1 + endif + if (il1.ne.il) then + d0ij3=dsqrt((cref(1,jl)-cref(1,il1))**2+ + & (cref(2,jl)-cref(2,il1))**2+ + & (cref(3,jl)-cref(3,il1))**2) + dij3=dist(il1,jl) + ddave=ddave+(dij3-d0ij3)**2 + nd=nd+1 + endif + if (il1.ne.il .and. jl1.ne.jl) then + d0ij4=dsqrt((cref(1,jl1)-cref(1,il1))**2+ + & (cref(2,jl1)-cref(2,il1))**2+ + & (cref(3,jl1)-cref(3,il1))**2) + dij4=dist(il1,jl1) + ddave=ddave+(dij4-d0ij4)**2 + nd=nd+1 + endif + ddave=ddave/nd + if (lprn) then + write (iout,*) "il",il," jl",jl, + & " itype",itype(il),itype(jl)," nd",nd + write (iout,*)"d0ij",d0ij1,d0ij2,d0ij3,d0ij4, + & " dij",dij1,dij2,dij3,dij4," ddave",ddave + call flush(iout) + endif +c ssij = (0.25d0*d0ij1)**2 + if (il.ne.il1 .and. jl.ne.jl1) then + ssij = 16.0d0/(d0ij1*d0ij4) + else + ssij = 16.0d0/(d0ij1*d0ij1) + endif + qcontrib = dexp(-0.5d0*ddave*ssij) +c Compute gradient + fac1 = qcontrib*ssij/nd + fac = fac1*(dij1-d0ij1)/dij1 + do k=1,3 + ddqij = (c(k,il)-c(k,jl))*fac + dqwol(k,il)=dqwol(k,il)+ddqij + dqwol(k,jl)=dqwol(k,jl)-ddqij + enddo + if (jl1.ne.jl) then + fac = fac1*(dij2-d0ij2)/dij2 + do k=1,3 + ddqij = (c(k,il)-c(k,jl1))*fac + dqwol(k,il)=dqwol(k,il)+ddqij + dxqwol(k,jl)=dxqwol(k,jl)-ddqij + enddo + endif + if (il1.ne.il) then + fac = fac1*(dij3-d0ij3)/dij3 + do k=1,3 + ddqij = (c(k,il1)-c(k,jl))*fac + dxqwol(k,il)=dxqwol(k,il)+ddqij + dqwol(k,jl)=dqwol(k,jl)-ddqij + enddo + endif + if (il1.ne.il .and. jl1.ne.jl) then + fac = fac1*(dij4-d0ij4)/dij4 + do k=1,3 + ddqij = (c(k,il1)-c(k,jl1))*fac + dxqwol(k,il)=dxqwol(k,il)+ddqij + dxqwol(k,jl)=dxqwol(k,jl)-ddqij + enddo + endif + return + end diff --git a/source/unres/src_MD-NEWSC/q_measure3.F b/source/unres/src_MD-NEWSC/q_measure3.F new file mode 100644 index 0000000..f0a030e --- /dev/null +++ b/source/unres/src_MD-NEWSC/q_measure3.F @@ -0,0 +1,529 @@ + double precision function qwolynes(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.MD' + integer i,j,jl,k,l,il,kl,nl,np,seg1,seg2,seg3,seg4,secseg + integer nsep /3/ + double precision dist,qm + double precision qq,qqij,qqijCM,dij,d0ij,dijCM,d0ijCM + logical lprn /.false./ + logical flag + qq = 0.0d0 + nl=0 + do i=0,nres + do j=1,3 + dqwol(j,i)=0.0d0 + dxqwol(j,i)=0.0d0 + enddo + enddo + if (lprn) then + write (iout,*) "seg1",seg1," seg2",seg2," seg3",seg3," seg4",seg4, + & " flag",flag + call flush(iout) + endif + if (flag) then + do il=seg1+nsep,seg2 + do jl=seg1,il-nsep + nl=nl+1 + if (itype(il).ne.10) then + ilnres=il+nres + else + ilnres=il + endif + if (itype(jl).ne.10) then + jlnres=jl+nres + else + jlnres=jl + endif + qqijCM = qcontrib(il,jl,ilnres,jlnres) + qq = qq+qqijCM + if (lprn) then + write (iout,*) "qqijCM",qqijCM + call flush(iout) + endif + enddo + enddo + if (lprn) then + write (iout,*) "nl",nl," qq",qq + call flush(iout) + endif + else + do il=seg1,seg2 + if((seg3-il).lt.3) then + secseg=il+3 + else + secseg=seg3 + endif + do jl=secseg,seg4 + nl=nl+1 + if (itype(il).ne.10) then + ilnres=il+nres + else + ilnres=il + endif + if (itype(jl).ne.10) then + jlnres=jl+nres + else + jlnres=jl + endif + qqijCM = qcontrib(il,jl,ilnres,jlnres) + qq = qq+qqijCM + if (lprn) then + write (iout,*) "qqijCM",qqijCM + call flush(iout) + endif + enddo + enddo + endif + qq = qq/nl + qwolynes=1.0d0-qq + do i=0,nres + do j=1,3 + dqwol(j,i)=dqwol(j,i)/nl + dxqwol(j,i)=dxqwol(j,i)/nl + enddo + enddo + return + end +c------------------------------------------------------------------- + subroutine qwol_num(seg1,seg2,flag,seg3,seg4) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.MD' + integer seg1,seg2,seg3,seg4 + logical flag + double precision qwolan(3,0:maxres),cdummy(3,0:maxres2), + & qwolxan(3,0:maxres),q1,q2 + double precision delta /1.0d-7/ + write (iout,*) "seg1",seg1," seg2",seg2," seg3",seg3," seg4",seg4 + write(iout,*) "dQ/dc backbone " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (dqwol(j,i),j=1,3) + enddo + write(iout,*) "dQ/dX side chain " + do i=1,nres + write(iout,'(i5,3e15.5)') i,(dxqwol(j,i),j=1,3) + enddo + do i=1,nres + do j=1,3 + cdummy(j,i)=c(j,i) + c(j,i)=c(j,i)-delta + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + c(j,i)=cdummy(j,i)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolan(j,i)=0.5d0*(q2-q1)/delta + c(j,i)=cdummy(j,i) +c write (iout,*) "i",i," j",j," q1",q1," a2",q2 + enddo + enddo + do i=1,nres + do j=1,3 + cdummy(j,i+nres)=c(j,i+nres) + c(j,i+nres)=c(j,i+nres)-delta + q1=qwolynes(seg1,seg2,flag,seg3,seg4) + c(j,i+nres)=cdummy(j,i+nres)+delta + q2=qwolynes(seg1,seg2,flag,seg3,seg4) + qwolxan(j,i)=0.5d0*(q2-q1)/delta + c(j,i+nres)=cdummy(j,i+nres) + enddo + enddo + write(iout,*) "Numerical Q cartesian gradients backbone: " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (qwolan(j,i),j=1,3) + enddo + write(iout,*) "Numerical Q cartesian gradients side-chain: " + do i=0,nres + write(iout,'(i5,3e15.5)') i, (qwolxan(j,i),j=1,3) + enddo + return + end +c------------------------------------------------------------------------ + subroutine EconstrQ +c MD with umbrella_sampling using Wolyne's distance measure as a constraint + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2,hm1,hm2,hmnum + double precision ucdelan,dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES), + & duconst(3,0:MAXRES),duxconst(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ + do i=0,nres + do j=1,3 + duconst(j,i)=0.0d0 + dudconst(j,i)=0.0d0 + duxconst(j,i)=0.0d0 + dudxconst(j,i)=0.0d0 + enddo + enddo + Uconst=0.0d0 + do i=1,nfrag + qfrag(i)=qwolynes(ifrag(1,i,iset),ifrag(2,i,iset),.true. + & ,idummy,idummy) + Uconst=Uconst+wfrag(i,iset)*harmonic(qfrag(i),qinfrag(i,iset)) +c Calculating the derivatives of Constraint energy with respect to Q + Ucdfrag=wfrag(i,iset)*harmonicprim(qfrag(i),qinfrag(i,iset)) +c Calculating the derivatives of Q with respect to cartesian coordinates + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdfrag*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdfrag*dxqwol(j,ii) + enddo + enddo +c write (iout,*) "Calling qwol_num" +c call qwol_num(ifrag(1,i,iset),ifrag(2,i,iset),.true.,idummy,idummy) + enddo +c stop + do i=1,npair + kstart=ifrag(1,ipair(1,i,iset),iset) + kend=ifrag(2,ipair(1,i,iset),iset) + lstart=ifrag(1,ipair(2,i,iset),iset) + lend=ifrag(2,ipair(2,i,iset),iset) + qpair(i)=qwolynes(kstart,kend,.false.,lstart,lend) + Uconst=Uconst+wpair(i,iset)*harmonic(qpair(i),qinpair(i,iset)) +c Calculating dU/dQ + Ucdpair=wpair(i,iset)*harmonicprim(qpair(i),qinpair(i,iset)) +c Calculating dQ/dXi + do ii=0,nres + do j=1,3 + duconst(j,ii)=dUconst(j,ii)+ucdpair*dqwol(j,ii) + dUxconst(j,ii)=dUxconst(j,ii)+ucdpair*dxqwol(j,ii) + enddo + enddo + enddo +c write(iout,*) "Uconst inside subroutine ", Uconst +c Transforming the gradients from Cs to dCs for the backbone + do i=0,nres + do j=i+1,nres + do k=1,3 + dudconst(k,i)=dudconst(k,i)+duconst(k,j)+duxconst(k,j) + enddo + enddo + enddo +c Transforming the gradients from Cs to dCs for the side chains + do i=1,nres + do j=1,3 + dudxconst(j,i)=duxconst(j,i) + enddo + enddo +c write(iout,*) "dU/dc backbone " +c do ii=0,nres +c write(iout,'(i5,3e15.5)') ii, (duconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/dX side chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(duxconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/ddc backbone " +c do ii=0,nres +c write(iout,'(i5,3e15.5)') ii, (dudconst(j,ii),j=1,3) +c enddo +c write(iout,*) "dU/ddX side chain " +c do ii=1,nres +c write(iout,'(i5,3e15.5)') ii,(dudxconst(j,ii),j=1,3) +c enddo +c Calculating numerical gradients of dUconst/ddc and dUconst/ddx +c call dEconstrQ_num + return + end +c----------------------------------------------------------------------- + subroutine dEconstrQ_num +c Calculating numerical dUconst/ddc and dUconst/ddx + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision uzap1,uzap2 + double precision dUcartan(3,0:MAXRES) + & ,dUxcartan(3,0:MAXRES),cdummy(3,0:MAXRES) + integer kstart,kend,lstart,lend,idummy + double precision delta /1.0d-7/ +c For the backbone + do i=0,nres-1 + do j=1,3 + dUcartan(j,i)=0.0d0 + cdummy(j,i)=dc(j,i) + dc(j,i)=dc(j,i)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + dc(j,i)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + ducartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo +c Calculating numerical gradients for dU/ddx + do i=0,nres-1 + do j=1,3 + duxcartan(j,i)=0.0d0 + enddo + do j=1,3 + cdummy(j,i)=dc(j,i+nres) + dc(j,i+nres)=dc(j,i+nres)+delta + call chainbuild_cart + uzap2=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap2=uzap2+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap2=uzap2+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + dc(j,i+nres)=cdummy(j,i) + call chainbuild_cart + uzap1=0.0d0 + do ii=1,nfrag + qfrag(ii)=qwolynes(ifrag(1,ii,iset),ifrag(2,ii,iset), + & .true.,idummy,idummy) + uzap1=uzap1+wfrag(ii,iset)* + & harmonic(qfrag(ii),qinfrag(ii,iset)) + enddo + do ii=1,npair + kstart=ifrag(1,ipair(1,ii,iset),iset) + kend=ifrag(2,ipair(1,ii,iset),iset) + lstart=ifrag(1,ipair(2,ii,iset),iset) + lend=ifrag(2,ipair(2,ii,iset),iset) + qpair(ii)=qwolynes(kstart,kend,.false.,lstart,lend) + uzap1=uzap1+wpair(ii,iset)* + & harmonic(qpair(ii),qinpair(ii,iset)) + enddo + duxcartan(j,i)=(uzap2-uzap1)/(delta) + enddo + enddo + write(iout,*) "Numerical dUconst/ddc backbone " + do ii=0,nres + write(iout,'(i5,3e15.5)') ii,(dUcartan(j,ii),j=1,3) + enddo + write(iout,*) "Numerical dUconst/ddx side-chain " + do ii=1,nres + write(iout,'(i5,3e15.5)') ii,(dUxcartan(j,ii),j=1,3) + enddo + return + end +c--------------------------------------------------------------------------- + double precision function qcontrib(il,jl,il1,jl1) + implicit none + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.LOCAL' + integer i,j,k,il,jl,il1,jl1,nd,itl,jtl + double precision dist + external dist + double precision dij,dij1,d0ij,d0ij1,om1,om2,om12,om10,om20,om120 + & ,fac,fac1,ddave,ssij,ddqij,d0ii1,d0jj1,rij,eom1,eom2,eom12 + double precision u(3),v(3),er(3),er0(3),dcosom1(3),dcosom2(3), + & aux1,aux2 + double precision scalar + external scalar + logical lprn /.false./ + if (lprn) write (iout,*) "il",il," jl",jl," il1",il1," jl1",jl1 + d0ij=dsqrt((cref(1,jl)-cref(1,il))**2+ + & (cref(2,jl)-cref(2,il))**2+ + & (cref(3,jl)-cref(3,il))**2) + dij=dist(il,jl) + dij1=dist(il1,jl1) + do i=1,3 + er(i)=(c(i,jl1)-c(i,il1))/dij1 + enddo + do i=1,3 + er0(i)=cref(i,jl1)-cref(i,il1) + enddo + d0ij1=dsqrt(scalar(er0,er0)) + do i=1,3 + er0(i)=er0(i)/d0ij1 + enddo + if (il.ne.il1 .or. jl.ne.jl1) then + ddave=0.5d0*((dij-d0ij)**2+(dij1-d0ij1)**2) + nd=2 + else + ddave=(dij-d0ij)**2 + nd=1 + endif + if (il.ne.il1) then + do i=1,3 + u(i)=cref(i,il1)-cref(i,il) + enddo + d0ii1=dsqrt(scalar(u,u)) + do i=1,3 + u(i)=u(i)/d0ii1 + enddo + if (lprn) then + write (iout,*) "u",(u(i),i=1,3) + write (iout,*) "er0",(er0(i),i=1,3) + om10=scalar(er0,u) + om1=scalar(er,dc_norm(1,il1)) + write (iout,*) "om10",om10," om1",om1 + endif + else + om1=0.0d0 + om10=0.0d0 + endif + if (jl.ne.jl1) then + do i=1,3 + v(i)=cref(i,jl1)-cref(i,jl) + enddo + d0jj1=dsqrt(scalar(v,v)) + do i=1,3 + v(i)=v(i)/d0jj1 + enddo + if (lprn) then + write (iout,*) "v",(v(i),i=1,3) + write (iout,*) "er0",(er0(i),i=1,3) + om20=scalar(er,v) + om2=scalar(er,dc_norm(1,jl1)) + write (iout,*) "om20",om20," om2",om2 + endif + else + om2=0.0d0 + om20=0.0d0 + endif + if (il.ne.il1 .and. jl.ne.jl1) then + om120=scalar(u,v) + om12=scalar(dc_norm(1,il1),dc_norm(1,jl1)) + else + om12=0.0d0 + om120=0.0d0 + endif + if (lprn) then + write (iout,*) "il",il," jl",jl,itype(il),itype(jl) + write (iout,*)"d0ij",d0ij," om10",om10," om20",om20, + & " om120",om120, + & " dij",dij," om1",om1," om2",om2," om12",om12 + call flush(iout) + endif + ssij = 16.0d0/(d0ij*d0ij) + qcontrib = dexp(-0.5d0*(ddave*ssij+((om1-om10)**2 + & +(om2-om20)**2+(om12-om120)**2))) + if (lprn) write (iout,*) "ssij",ssij," qcontrib",qcontrib +c qcontrib = dexp(-0.5d0*(ddave*ssij)+(om1-om10)**2+(om2-om20)**2) +c qcontrib = dexp(-0.5d0*(ddave*ssij)) +c Compute gradient - radial component + fac1 = qcontrib*ssij/nd + fac = fac1*(dij-d0ij)/dij + do k=1,3 + ddqij = (c(k,il)-c(k,jl))*fac + dqwol(k,il)=dqwol(k,il)+ddqij + dqwol(k,jl)=dqwol(k,jl)-ddqij + enddo + if (il1.ne.il .or. jl1.ne.jl) then + fac = fac1*(dij1-d0ij1)/dij1 + do k=1,3 + ddqij = (c(k,il1)-c(k,jl1))*fac + if (il1.ne.il) then + dxqwol(k,il)=dxqwol(k,il)+ddqij + else + dqwol(k,il)=dqwol(k,il)+ddqij + endif + if (jl1.ne.jl) then + dxqwol(k,jl)=dxqwol(k,jl)-ddqij + else + dqwol(k,jl)=dqwol(k,jl)-ddqij + endif + enddo + endif +c return +c Orientational contributions + rij=1.0d0/dij1 + eom1=qcontrib*(om1-om10) + eom2=qcontrib*(om2-om20) + eom12=qcontrib*(om12-om120) + do k=1,3 + dcosom1(k)=rij*(dc_norm(k,il1)-om1*er(k)) + dcosom2(k)=rij*(dc_norm(k,jl1)-om2*er(k)) + enddo + do k=1,3 + ddqij=eom1*dcosom1(k)+eom2*dcosom2(k) + aux1=(eom12*(dc_norm(k,jl1)-om12*dc_norm(k,il1)) + & +eom1*(er(k)-om1*dc_norm(k,il1)))*vbld_inv(il1) + aux2=(eom12*(dc_norm(k,il1)-om12*dc_norm(k,jl1)) + & +eom2*(er(k)-om2*dc_norm(k,jl1)))*vbld_inv(jl1) + dqwol(k,il)=dqwol(k,il)-ddqij-aux1 + dqwol(k,jl)=dqwol(k,jl)+ddqij-aux2 + dxqwol(k,il)=dxqwol(k,il)-ddqij+aux1 +c & +(eom12*(dc_norm(k,jl1)-om12*dc_norm(k,il1)) +c & +eom1*(er(k)-om1*dc_norm(k,il1)))*vbld_inv(il1) + dxqwol(k,jl)=dxqwol(k,jl)+ddqij+aux2 +c & +(eom12*(dc_norm(k,il1)-om12*dc_norm(k,jl1)) +c & +eom2*(er(k)-om2*dc_norm(k,jl1)))*vbld_inv(jl1) + enddo + return + end diff --git a/source/unres/src_MD-NEWSC/randgens.f b/source/unres/src_MD-NEWSC/randgens.f new file mode 100644 index 0000000..0daeb35 --- /dev/null +++ b/source/unres/src_MD-NEWSC/randgens.f @@ -0,0 +1,99 @@ +C $Date: 1994/10/04 16:19:52 $ +C $Revision: 2.1 $ +C +C +C See help for RANDOMV on the PSFSHARE disk to understand these +C subroutines. This is the VS Fortran version of this code. +C +C + SUBROUTINE VRND(VEC,N) + INTEGER A(250) + COMMON /VRANDD/ A, I, I147 + INTEGER LOOP,I,I147,VEC(N) + DO 23000 LOOP=1,N + I=I+1 + IF(.NOT.(I.GE.251))GOTO 23002 + I=1 +23002 CONTINUE + I147=I147+1 + IF(.NOT.(I147.GE.251))GOTO 23004 + I147=1 +23004 CONTINUE + A(I)=IEOR(A(I147),A(I)) + VEC(LOOP)=A(I) +23000 CONTINUE + RETURN + END +C +C + DOUBLE PRECISION FUNCTION RNDV(IDUM) + DOUBLE PRECISION RM1,RM2,R(99) + INTEGER IA1,IC1,M1, IA2,IC2,M2, IA3,IC3,M3, IDUM + SAVE + DATA IA1,IC1,M1/1279,351762,1664557/ + DATA IA2,IC2,M2/2011,221592,1048583/ + DATA IA3,IC3,M3/15551,6150,29101/ + IF(.NOT.(IDUM.LT.0))GOTO 23006 + IX1 = MOD(-IDUM,M1) + IX1 = MOD(IA1*IX1+IC1,M1) + IX2 = MOD(IX1,M2) + IX1 = MOD(IA1*IX1+IC1,M1) + IX3 = MOD(IX1,M3) + RM1 = 1./DBLE(M1) + RM2 = 1./DBLE(M2) + DO 23008 J = 1,99 + IX1 = MOD(IA1*IX1+IC1,M1) + IX2 = MOD(IA2*IX2+IC2,M2) + R(J) = (DBLE(IX1)+DBLE(IX2)*RM2)*RM1 +23008 CONTINUE +23006 CONTINUE + IX1 = MOD(IA1*IX1+IC1,M1) + IX2 = MOD(IA2*IX2+IC2,M2) + IX3 = MOD(IA3*IX3+IC3,M3) + J = 1+(99*IX3)/M3 + RNDV = R(J) + R(J) = (DBLE(IX1)+DBLE(IX2)*RM2)*RM1 + IDUM = IX1 + RETURN + END +C +C + SUBROUTINE VRNDST(SEED) + INTEGER A(250),LOOP,IDUM,SEED + DOUBLE PRECISION RNDV + COMMON /VRANDD/ A, I, I147 + I=0 + I147=103 + IDUM=SEED + DO 23010 LOOP=1,250 + A(LOOP)=INT(RNDV(IDUM)*2147483647) +23010 CONTINUE + RETURN + END +C +C + SUBROUTINE VRNDIN(IODEV) + INTEGER IODEV, A(250) + COMMON/VRANDD/ A, I, I147 + READ(IODEV) A, I, I147 + RETURN + END +C +C + SUBROUTINE VRNDOU(IODEV) +C This corresponds to VRNDOUT in the APFTN64 version + INTEGER IODEV, A(250) + COMMON/VRANDD/ A, I, I147 + WRITE(IODEV) A, I, I147 + RETURN + END + FUNCTION RNUNF(N) + INTEGER IRAN1(2000) + DATA FCTOR /2147483647.0D0/ +C We get only one random number, here! DR 9/1/92 + CALL VRND(IRAN1,1) + RNUNF= DBLE( IRAN1(1) ) / FCTOR +C****************************** +C write(6,*) 'rnunf in rnunf = ',rnunf + RETURN + END diff --git a/source/unres/src_MD-NEWSC/rattle.F b/source/unres/src_MD-NEWSC/rattle.F new file mode 100644 index 0000000..a2e5034 --- /dev/null +++ b/source/unres/src_MD-NEWSC/rattle.F @@ -0,0 +1,706 @@ + subroutine rattle1 +c RATTLE algorithm for velocity Verlet - step 1, UNRES +c AL 9/24/04 + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision gginv(maxres2,maxres2), + & gdc(3,MAXRES2,MAXRES2),dC_uncor(3,MAXRES2), + & Cmat(MAXRES2,MAXRES2),x(MAXRES2),xcorr(3,MAXRES2) + common /przechowalnia/ GGinv,gdc,Cmat,nbond + integer max_rattle /5/ + logical lprn /.false./, lprn1 /.false./,not_done + double precision tol_rattle /1.0d-5/ + if (lprn) write (iout,*) "RATTLE1" + nbond=nct-nnt + do i=nnt,nct + if (itype(i).ne.10) nbond=nbond+1 + enddo +c Make a folded form of the Ginv-matrix + ind=0 + ii=0 + do i=nnt,nct-1 + ii=ii+1 + do j=1,3 + ind=ind+1 + ind1=0 + jj=0 + do k=nnt,nct-1 + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1) + enddo + endif + enddo + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ii=ii+1 + do j=1,3 + ind=ind+1 + ind1=0 + jj=0 + do k=nnt,nct-1 + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1) + enddo + endif + enddo + enddo + endif + enddo + if (lprn1) then + write (iout,*) "Matrix GGinv" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv) + endif + not_done=.true. + iter=0 + do while (not_done) + iter=iter+1 + if (iter.gt.max_rattle) then + write (iout,*) "Error - too many iterations in RATTLE." + stop + endif +c Calculate the matrix C = GG**(-1) dC_old o dC + ind1=0 + do i=nnt,nct-1 + ind1=ind1+1 + do j=1,3 + dC_uncor(j,ind1)=dC(j,i) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind1=ind1+1 + do j=1,3 + dC_uncor(j,ind1)=dC(j,i+nres) + enddo + endif + enddo + do i=1,nbond + ind=0 + do k=nnt,nct-1 + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres) + enddo + endif + enddo + enddo +c Calculate deviations from standard virtual-bond lengths + ind=0 + do i=nnt,nct-1 + ind=ind+1 + x(ind)=vbld(i+1)**2-vbl**2 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i))**2 + endif + enddo + if (lprn) then + write (iout,*) "Coordinates and violations" + do i=1,nbond + write(iout,'(i5,3f10.5,5x,e15.5)') + & i,(dC_uncor(j,i),j=1,3),x(i) + enddo + write (iout,*) "Velocities and violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i+nres,ind,(d_t_new(j,i+nres),j=1,3), + & scalar(d_t_new(1,i+nres),dC_old(1,i+nres)) + endif + enddo +c write (iout,*) "gdc" +c do i=1,nbond +c write (iout,*) "i",i +c do j=1,nbond +c write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3) +c enddo +c enddo + endif + xmax=dabs(x(1)) + do i=2,nbond + if (dabs(x(i)).gt.xmax) then + xmax=dabs(x(i)) + endif + enddo + if (xmax.lt.tol_rattle) then + not_done=.false. + goto 100 + endif +c Calculate the matrix of the system of equations + do i=1,nbond + do j=1,nbond + Cmat(i,j)=0.0d0 + do k=1,3 + Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix Cmat" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat) + endif + call gauss(Cmat,X,MAXRES2,nbond,1,*10) +c Add constraint term to positions + ind=0 + do i=nnt,nct-1 + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + xx=0.5d0*xx + dC(j,i)=dC(j,i)-xx + d_t_new(j,i)=d_t_new(j,i)-xx/d_time + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + xx=0.5d0*xx + dC(j,i+nres)=dC(j,i+nres)-xx + d_t_new(j,i+nres)=d_t_new(j,i+nres)-xx/d_time + enddo + endif + enddo +c Rebuild the chain using the new coordinates + call chainbuild_cart + if (lprn) then + write (iout,*) "New coordinates, Lagrange multipliers,", + & " and differences between actual and standard bond lengths" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + xx=vbld(i+1)**2-vbl**2 + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i),j=1,3),x(ind),xx + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + xx=vbld(i+nres)**2-vbldsc0(1,itype(i))**2 + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i+nres),j=1,3),x(ind),xx + endif + enddo + write (iout,*) "Velocities and violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i+nres,ind,(d_t_new(j,i+nres),j=1,3), + & scalar(d_t_new(1,i+nres),dC_old(1,i+nres)) + endif + enddo + endif + enddo + 100 continue + return + 10 write (iout,*) "Error - singularity in solving the system", + & " of equations for Lagrange multipliers." + stop + end +c------------------------------------------------------------------------------ + subroutine rattle2 +c RATTLE algorithm for velocity Verlet - step 2, UNRES +c AL 9/24/04 + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision gginv(maxres2,maxres2), + & gdc(3,MAXRES2,MAXRES2),dC_uncor(3,MAXRES2), + & Cmat(MAXRES2,MAXRES2),x(MAXRES2) + common /przechowalnia/ GGinv,gdc,Cmat,nbond + integer max_rattle /5/ + logical lprn /.false./, lprn1 /.false./,not_done + double precision tol_rattle /1.0d-5/ + if (lprn) write (iout,*) "RATTLE2" + if (lprn) write (iout,*) "Velocity correction" +c Calculate the matrix G dC + do i=1,nbond + ind=0 + do k=nnt,nct-1 + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC(j,k) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC(j,k+nres) + enddo + endif + enddo + enddo +c if (lprn) then +c write (iout,*) "gdc" +c do i=1,nbond +c write (iout,*) "i",i +c do j=1,nbond +c write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3) +c enddo +c enddo +c endif +c Calculate the matrix of the system of equations + ind=0 + do i=nnt,nct-1 + ind=ind+1 + do j=1,nbond + Cmat(ind,j)=0.0d0 + do k=1,3 + Cmat(ind,j)=Cmat(ind,j)+dC(k,i)*gdc(k,ind,j) + enddo + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + do j=1,nbond + Cmat(ind,j)=0.0d0 + do k=1,3 + Cmat(ind,j)=Cmat(ind,j)+dC(k,i+nres)*gdc(k,ind,j) + enddo + enddo + endif + enddo +c Calculate the scalar product dC o d_t_new + ind=0 + do i=nnt,nct-1 + ind=ind+1 + x(ind)=scalar(d_t(1,i),dC(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + x(ind)=scalar(d_t(1,i+nres),dC(1,i+nres)) + endif + enddo + if (lprn) then + write (iout,*) "Velocities and violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i,ind,(d_t(j,i),j=1,3),x(ind) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind) + endif + enddo + endif + xmax=dabs(x(1)) + do i=2,nbond + if (dabs(x(i)).gt.xmax) then + xmax=dabs(x(i)) + endif + enddo + if (xmax.lt.tol_rattle) then + not_done=.false. + goto 100 + endif + if (lprn1) then + write (iout,*) "Matrix Cmat" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat) + endif + call gauss(Cmat,X,MAXRES2,nbond,1,*10) +c Add constraint term to velocities + ind=0 + do i=nnt,nct-1 + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + d_t(j,i)=d_t(j,i)-xx + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + d_t(j,i+nres)=d_t(j,i+nres)-xx + enddo + endif + enddo + if (lprn) then + write (iout,*) + & "New velocities, Lagrange multipliers violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + if (lprn) write (iout,'(2i5,3f10.5,5x,2e15.5)') + & i,ind,(d_t(j,i),j=1,3),x(ind),scalar(d_t(1,i),dC(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,2e15.5)') + & i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind), + & scalar(d_t(1,i+nres),dC(1,i+nres)) + endif + enddo + endif + 100 continue + return + 10 write (iout,*) "Error - singularity in solving the system", + & " of equations for Lagrange multipliers." + stop + end +c------------------------------------------------------------------------------ + subroutine rattle_brown +c RATTLE/LINCS algorithm for Brownian dynamics, UNRES +c AL 9/24/04 + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + include 'COMMON.TIME1' + double precision gginv(maxres2,maxres2), + & gdc(3,MAXRES2,MAXRES2),dC_uncor(3,MAXRES2), + & Cmat(MAXRES2,MAXRES2),x(MAXRES2) + common /przechowalnia/ GGinv,gdc,Cmat,nbond + integer max_rattle /5/ + logical lprn /.true./, lprn1 /.true./,not_done + double precision tol_rattle /1.0d-5/ + if (lprn) write (iout,*) "RATTLE_BROWN" + nbond=nct-nnt + do i=nnt,nct + if (itype(i).ne.10) nbond=nbond+1 + enddo +c Make a folded form of the Ginv-matrix + ind=0 + ii=0 + do i=nnt,nct-1 + ii=ii+1 + do j=1,3 + ind=ind+1 + ind1=0 + jj=0 + do k=nnt,nct-1 + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1) + enddo + endif + enddo + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ii=ii+1 + do j=1,3 + ind=ind+1 + ind1=0 + jj=0 + do k=nnt,nct-1 + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + jj=jj+1 + do l=1,3 + ind1=ind1+1 + if (j.eq.1 .and. l.eq.1)GGinv(ii,jj)=fricmat(ind,ind1) + enddo + endif + enddo + enddo + endif + enddo + if (lprn1) then + write (iout,*) "Matrix GGinv" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv) + endif + not_done=.true. + iter=0 + do while (not_done) + iter=iter+1 + if (iter.gt.max_rattle) then + write (iout,*) "Error - too many iterations in RATTLE." + stop + endif +c Calculate the matrix C = GG**(-1) dC_old o dC + ind1=0 + do i=nnt,nct-1 + ind1=ind1+1 + do j=1,3 + dC_uncor(j,ind1)=dC(j,i) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind1=ind1+1 + do j=1,3 + dC_uncor(j,ind1)=dC(j,i+nres) + enddo + endif + enddo + do i=1,nbond + ind=0 + do k=nnt,nct-1 + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k) + enddo + enddo + do k=nnt,nct + if (itype(k).ne.10) then + ind=ind+1 + do j=1,3 + gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres) + enddo + endif + enddo + enddo +c Calculate deviations from standard virtual-bond lengths + ind=0 + do i=nnt,nct-1 + ind=ind+1 + x(ind)=vbld(i+1)**2-vbl**2 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i))**2 + endif + enddo + if (lprn) then + write (iout,*) "Coordinates and violations" + do i=1,nbond + write(iout,'(i5,3f10.5,5x,e15.5)') + & i,(dC_uncor(j,i),j=1,3),x(i) + enddo + write (iout,*) "Velocities and violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i,ind,(d_t(j,i),j=1,3),scalar(d_t(1,i),dC_old(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i+nres,ind,(d_t(j,i+nres),j=1,3), + & scalar(d_t(1,i+nres),dC_old(1,i+nres)) + endif + enddo + write (iout,*) "gdc" + do i=1,nbond + write (iout,*) "i",i + do j=1,nbond + write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3) + enddo + enddo + endif + xmax=dabs(x(1)) + do i=2,nbond + if (dabs(x(i)).gt.xmax) then + xmax=dabs(x(i)) + endif + enddo + if (xmax.lt.tol_rattle) then + not_done=.false. + goto 100 + endif +c Calculate the matrix of the system of equations + do i=1,nbond + do j=1,nbond + Cmat(i,j)=0.0d0 + do k=1,3 + Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j) + enddo + enddo + enddo + if (lprn1) then + write (iout,*) "Matrix Cmat" + call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat) + endif + call gauss(Cmat,X,MAXRES2,nbond,1,*10) +c Add constraint term to positions + ind=0 + do i=nnt,nct-1 + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + xx=-0.5d0*xx + d_t(j,i)=d_t(j,i)+xx/d_time + dC(j,i)=dC(j,i)+xx + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + do j=1,3 + xx=0.0d0 + do ii=1,nbond + xx = xx+x(ii)*gdc(j,ind,ii) + enddo + xx=-0.5d0*xx + d_t(j,i+nres)=d_t(j,i+nres)+xx/d_time + dC(j,i+nres)=dC(j,i+nres)+xx + enddo + endif + enddo +c Rebuild the chain using the new coordinates + call chainbuild_cart + if (lprn) then + write (iout,*) "New coordinates, Lagrange multipliers,", + & " and differences between actual and standard bond lengths" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + xx=vbld(i+1)**2-vbl**2 + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i),j=1,3),x(ind),xx + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + xx=vbld(i+nres)**2-vbldsc0(1,itype(i))**2 + write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') + & i,(dC(j,i+nres),j=1,3),x(ind),xx + endif + enddo + write (iout,*) "Velocities and violations" + ind=0 + do i=nnt,nct-1 + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i)) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + ind=ind+1 + write (iout,'(2i5,3f10.5,5x,e15.5)') + & i+nres,ind,(d_t_new(j,i+nres),j=1,3), + & scalar(d_t_new(1,i+nres),dC_old(1,i+nres)) + endif + enddo + endif + enddo + 100 continue + return + 10 write (iout,*) "Error - singularity in solving the system", + & " of equations for Lagrange multipliers." + stop + end diff --git a/source/unres/src_MD-NEWSC/readpdb.F b/source/unres/src_MD-NEWSC/readpdb.F new file mode 100644 index 0000000..48e0abd --- /dev/null +++ b/source/unres/src_MD-NEWSC/readpdb.F @@ -0,0 +1,432 @@ + subroutine readpdb +C Read the PDB file and convert the peptide geometry into virtual-chain +C geometry. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.NAMES' + include 'COMMON.CONTROL' + include 'COMMON.DISTFIT' + include 'COMMON.SETUP' + character*3 seq,atom,res + character*80 card + dimension sccor(3,20) + double precision e1(3),e2(3),e3(3) + logical fail + integer rescode + ibeg=1 + lsecondary=.false. + nhfrag=0 + nbfrag=0 + do i=1,10000 + read (ipdbin,'(a80)',end=10) card + if (card(:5).eq.'HELIX') then + nhfrag=nhfrag+1 + lsecondary=.true. + read(card(22:25),*) hfrag(1,nhfrag) + read(card(34:37),*) hfrag(2,nhfrag) + endif + if (card(:5).eq.'SHEET') then + nbfrag=nbfrag+1 + lsecondary=.true. + read(card(24:26),*) bfrag(1,nbfrag) + read(card(35:37),*) bfrag(2,nbfrag) +crc---------------------------------------- +crc to be corrected !!! + bfrag(3,nbfrag)=bfrag(1,nbfrag) + bfrag(4,nbfrag)=bfrag(2,nbfrag) +crc---------------------------------------- + endif + if (card(:3).eq.'END' .or. card(:3).eq.'TER') goto 10 +C Fish out the ATOM cards. + if (index(card(1:4),'ATOM').gt.0) then + read (card(14:16),'(a3)') atom + if (atom.eq.'CA' .or. atom.eq.'CH3') then +C Calculate the CM of the preceding residue. + if (ibeg.eq.0) then + if (unres_pdb) then + do j=1,3 + dc(j,ires+nres)=sccor(j,iii) + enddo + else + call sccenter(ires,iii,sccor) + endif + endif +C Start new residue. + read (card(24:26),*) ires + read (card(18:20),'(a3)') res + if (ibeg.eq.1) then + ishift=ires-1 + if (res.ne.'GLY' .and. res.ne. 'ACE') then + ishift=ishift-1 + itype(1)=21 + endif + ibeg=0 + endif + ires=ires-ishift + if (res.eq.'ACE') then + ity=10 + else + itype(ires)=rescode(ires,res,0) + endif + read(card(31:54),'(3f8.3)') (c(j,ires),j=1,3) +c if(me.eq.king.or..not.out1file) +c & write (iout,'(2i3,2x,a,3f8.3)') +c & ires,itype(ires),res,(c(j,ires),j=1,3) + iii=1 + do j=1,3 + sccor(j,iii)=c(j,ires) + enddo + else if (atom.ne.'O '.and.atom(1:1).ne.'H' .and. + & atom.ne.'N ' .and. atom.ne.'C ') then + iii=iii+1 + read(card(31:54),'(3f8.3)') (sccor(j,iii),j=1,3) + endif + endif + enddo + 10 if(me.eq.king.or..not.out1file) + & write (iout,'(a,i5)') ' Nres: ',ires +C Calculate the CM of the last side chain. + if (unres_pdb) then + do j=1,3 + dc(j,ires+nres)=sccor(j,iii) + enddo + else + call sccenter(ires,iii,sccor) + endif + nres=ires + nsup=nres + nstart_sup=1 + if (itype(nres).ne.10) then + nres=nres+1 + itype(nres)=21 + if (unres_pdb) then +C 2/15/2013 by Adam: corrected insertion of the last dummy residue + call refsys(nres-3,nres-2,nres-1,e1,e2,e3,fail) + if (fail) then + e2(1)=0.0d0 + e2(2)=1.0d0 + e2(3)=0.0d0 + endif + do j=1,3 + c(j,nres)=c(j,nres-1)-3.8d0*e2(j) + enddo + else + do j=1,3 + dcj=c(j,nres-2)-c(j,nres-3) + c(j,nres)=c(j,nres-1)+dcj + c(j,2*nres)=c(j,nres) + enddo + endif + endif + do i=2,nres-1 + do j=1,3 + c(j,i+nres)=dc(j,i) + enddo + enddo + do j=1,3 + c(j,nres+1)=c(j,1) + c(j,2*nres)=c(j,nres) + enddo + if (itype(1).eq.21) then + nsup=nsup-1 + nstart_sup=2 + if (unres_pdb) then +C 2/15/2013 by Adam: corrected insertion of the first dummy residue + call refsys(2,3,4,e1,e2,e3,fail) + if (fail) then + e2(1)=0.0d0 + e2(2)=1.0d0 + e2(3)=0.0d0 + endif + do j=1,3 + c(j,1)=c(j,2)-3.8d0*e2(j) + enddo + else + do j=1,3 + dcj=c(j,4)-c(j,3) + c(j,1)=c(j,2)-dcj + c(j,nres+1)=c(j,1) + enddo + endif + endif +C Calculate internal coordinates. + if(me.eq.king.or..not.out1file)then + write (iout,'(a)') + & "Backbone and SC coordinates as read from the PDB" + do ires=1,nres + write (iout,'(2i3,2x,a,3f8.3,5x,3f8.3)') + & ires,itype(ires),restyp(itype(ires)),(c(j,ires),j=1,3), + & (c(j,nres+ires),j=1,3) + enddo + endif + call int_from_cart(.true.,.false.) + call sc_loc_geom(.false.) + do i=1,nres + thetaref(i)=theta(i) + phiref(i)=phi(i) + enddo + do i=1,nres-1 + do j=1,3 + dc(j,i)=c(j,i+1)-c(j,i) + dc_norm(j,i)=dc(j,i)*vbld_inv(i+1) + enddo + enddo + do i=2,nres-1 + do j=1,3 + dc(j,i+nres)=c(j,i+nres)-c(j,i) + dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres) + enddo +c write (iout,*) i,(dc(j,i+nres),j=1,3),(dc_norm(j,i+nres),j=1,3), +c & vbld_inv(i+nres) + enddo +c call chainbuild +C Copy the coordinates to reference coordinates + do i=1,2*nres + do j=1,3 + cref(j,i)=c(j,i) + enddo + enddo + + + do j=1,nbfrag + do i=1,4 + bfrag(i,j)=bfrag(i,j)-ishift + enddo + enddo + + do j=1,nhfrag + do i=1,2 + hfrag(i,j)=hfrag(i,j)-ishift + enddo + enddo + + return + end +c--------------------------------------------------------------------------- + subroutine int_from_cart(lside,lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.NAMES' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + character*3 seq,atom,res + character*80 card + dimension sccor(3,20) + integer rescode + logical lside,lprn + if(me.eq.king.or..not.out1file)then + if (lprn) then + write (iout,'(/a)') + & 'Internal coordinates calculated from crystal structure.' + if (lside) then + write (iout,'(8a)') ' Res ',' dvb',' Theta', + & ' Gamma',' Dsc_id',' Dsc',' Alpha', + & ' Beta ' + else + write (iout,'(4a)') ' Res ',' dvb',' Theta', + & ' Gamma' + endif + endif + endif + do i=1,nres-1 + iti=itype(i) + if (dist(i,i+1).lt.2.0D0 .or. dist(i,i+1).gt.5.0D0) then + write (iout,'(a,i4)') 'Bad Cartesians for residue',i +ctest stop + endif + vbld(i+1)=dist(i,i+1) + vbld_inv(i+1)=1.0d0/vbld(i+1) + if (i.gt.1) theta(i+1)=alpha(i-1,i,i+1) + if (i.gt.2) phi(i+1)=beta(i-2,i-1,i,i+1) + enddo +c if (unres_pdb) then +c if (itype(1).eq.21) then +c theta(3)=90.0d0*deg2rad +c phi(4)=180.0d0*deg2rad +c vbld(2)=3.8d0 +c vbld_inv(2)=1.0d0/vbld(2) +c endif +c if (itype(nres).eq.21) then +c theta(nres)=90.0d0*deg2rad +c phi(nres)=180.0d0*deg2rad +c vbld(nres)=3.8d0 +c vbld_inv(nres)=1.0d0/vbld(2) +c endif +c endif + if (lside) then + do i=2,nres-1 + do j=1,3 + c(j,maxres2)=0.5D0*(2*c(j,i)+(c(j,i-1)-c(j,i))*vbld_inv(i) + & +(c(j,i+1)-c(j,i))*vbld_inv(i+1)) + enddo + iti=itype(i) + di=dist(i,nres+i) +C 10/03/12 Adam: Correction for zero SC-SC bond length + if (itype(i).ne.10 .and. itype(i).ne.21. and. di.eq.0.0d0) + & di=dsc(itype(i)) + vbld(i+nres)=di + if (itype(i).ne.10) then + vbld_inv(i+nres)=1.0d0/di + else + vbld_inv(i+nres)=0.0d0 + endif + if (iti.ne.10) then + alph(i)=alpha(nres+i,i,maxres2) + omeg(i)=beta(nres+i,i,maxres2,i+1) + endif + if(me.eq.king.or..not.out1file)then + if (lprn) + & write (iout,'(a3,i4,7f10.3)') restyp(iti),i,vbld(i), + & rad2deg*theta(i),rad2deg*phi(i),dsc(iti),vbld(nres+i), + & rad2deg*alph(i),rad2deg*omeg(i) + endif + enddo + else if (lprn) then + do i=2,nres + iti=itype(i) + if(me.eq.king.or..not.out1file) + & write (iout,'(a3,i4,7f10.3)') restyp(iti),i,dist(i,i-1), + & rad2deg*theta(i),rad2deg*phi(i) + enddo + endif + return + end +c------------------------------------------------------------------------------- + subroutine sc_loc_geom(lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.LOCAL' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.NAMES' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + double precision x_prime(3),y_prime(3),z_prime(3) + logical lprn + do i=1,nres-1 + do j=1,3 + dc_norm(j,i)=vbld_inv(i+1)*(c(j,i+1)-c(j,i)) + enddo + enddo + do i=2,nres-1 + if (itype(i).ne.10) then + do j=1,3 + dc_norm(j,i+nres)=vbld_inv(i+nres)*(c(j,i+nres)-c(j,i)) + enddo + else + do j=1,3 + dc_norm(j,i+nres)=0.0d0 + enddo + endif + enddo + do i=2,nres-1 + costtab(i+1) =dcos(theta(i+1)) + sinttab(i+1) =dsqrt(1-costtab(i+1)*costtab(i+1)) + cost2tab(i+1)=dsqrt(0.5d0*(1.0d0+costtab(i+1))) + sint2tab(i+1)=dsqrt(0.5d0*(1.0d0-costtab(i+1))) + cosfac2=0.5d0/(1.0d0+costtab(i+1)) + cosfac=dsqrt(cosfac2) + sinfac2=0.5d0/(1.0d0-costtab(i+1)) + sinfac=dsqrt(sinfac2) + it=itype(i) + if (it.ne.10) then +c +C Compute the axes of tghe local cartesian coordinates system; store in +c x_prime, y_prime and z_prime +c + do j=1,3 + x_prime(j) = 0.00 + y_prime(j) = 0.00 + z_prime(j) = 0.00 + enddo + do j = 1,3 + x_prime(j) = (dc_norm(j,i) - dc_norm(j,i-1))*cosfac + y_prime(j) = (dc_norm(j,i) + dc_norm(j,i-1))*sinfac + enddo + call vecpr(x_prime,y_prime,z_prime) +c +C Transform the unit vector of the ith side-chain centroid, dC_norm(*,i), +C to local coordinate system. Store in xx, yy, zz. +c + xx=0.0d0 + yy=0.0d0 + zz=0.0d0 + do j = 1,3 + xx = xx + x_prime(j)*dc_norm(j,i+nres) + yy = yy + y_prime(j)*dc_norm(j,i+nres) + zz = zz + z_prime(j)*dc_norm(j,i+nres) + enddo + + xxref(i)=xx + yyref(i)=yy + zzref(i)=zz + else + xxref(i)=0.0d0 + yyref(i)=0.0d0 + zzref(i)=0.0d0 + endif + enddo + if (lprn) then + do i=2,nres + iti=itype(i) + if(me.eq.king.or..not.out1file) + & write (iout,'(a3,i4,3f10.5)') restyp(iti),i,xxref(i), + & yyref(i),zzref(i) + enddo + endif + return + end +c--------------------------------------------------------------------------- + subroutine sccenter(ires,nscat,sccor) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + dimension sccor(3,20) + do j=1,3 + sccmj=0.0D0 + do i=1,nscat + sccmj=sccmj+sccor(j,i) + enddo + dc(j,ires)=sccmj/nscat + enddo + return + end +c--------------------------------------------------------------------------- + subroutine bond_regular + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CALC' + include 'COMMON.INTERACT' + include 'COMMON.CHAIN' + do i=1,nres-1 + vbld(i+1)=vbl + vbld_inv(i+1)=1.0d0/vbld(i+1) + vbld(i+1+nres)=dsc(itype(i+1)) + vbld_inv(i+1+nres)=dsc_inv(itype(i+1)) +c print *,vbld(i+1),vbld(i+1+nres) + enddo + return + end diff --git a/source/unres/src_MD-NEWSC/readrtns.F b/source/unres/src_MD-NEWSC/readrtns.F new file mode 100644 index 0000000..b861fdb --- /dev/null +++ b/source/unres/src_MD-NEWSC/readrtns.F @@ -0,0 +1,2711 @@ + subroutine readrtns + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' + logical file_exist +C Read force-field parameters except weights + call parmread +C Read job setup parameters + call read_control +C Read control parameters for energy minimzation if required + if (minim) call read_minim +C Read MCM control parameters if required + if (modecalc.eq.3 .or. modecalc.eq.6) call mcmread +C Read MD control parameters if reqjuired + if (modecalc.eq.12) call read_MDpar +C Read MREMD control parameters if required + if (modecalc.eq.14) then + call read_MDpar + call read_REMDpar + endif +C Read MUCA control parameters if required + if (lmuca) call read_muca +C Read CSA control parameters if required (from fort.40 if exists +C otherwise from general input file) +csa if (modecalc.eq.8) then +csa inquire (file="fort.40",exist=file_exist) +csa if (.not.file_exist) call csaread +csa endif +cfmc if (modecalc.eq.10) call mcmfread +C Read molecule information, molecule geometry, energy-term weights, and +C restraints if requested + call molread +C Print restraint information +#ifdef MPI + if (.not. out1file .or. me.eq.king) then +#endif + if (nhpb.gt.nss) + &write (iout,'(a,i5,a)') "The following",nhpb-nss, + & " distance constraints have been imposed" + do i=nss+1,nhpb + write (iout,'(3i6,i2,3f10.5)') i-nss,ihpb(i),jhpb(i), + & ibecarb(i),dhpb(i),dhpb1(i),forcon(i) + enddo +#ifdef MPI + endif +#endif +c print *,"Processor",myrank," leaves READRTNS" + return + end +C------------------------------------------------------------------------------- + subroutine read_control +C +C Read contorl data +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MP + include 'mpif.h' + logical OKRandom, prng_restart + real*8 r1 +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.THREAD' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.MCM' + include 'COMMON.MAP' + include 'COMMON.HEADER' +csa include 'COMMON.CSA' + include 'COMMON.CHAIN' + include 'COMMON.MUCA' + include 'COMMON.MD' + include 'COMMON.FFIELD' + include 'COMMON.SETUP' + COMMON /MACHSW/ KDIAG,ICORFL,IXDR + character*8 diagmeth(0:3) /'Library','EVVRSP','Givens','Jacobi'/ + character*80 ucase + character*320 controlcard + + nglob_csa=0 + eglob_csa=1d99 + nmin_csa=0 + read (INP,'(a)') titel + call card_concat(controlcard) +c out1file=index(controlcard,'OUT1FILE').gt.0 .or. fg_rank.gt.0 +c print *,"Processor",me," fg_rank",fg_rank," out1file",out1file + call reada(controlcard,'SEED',seed,0.0D0) + call random_init(seed) +C Set up the time limit (caution! The time must be input in minutes!) + read_cart=index(controlcard,'READ_CART').gt.0 + call readi(controlcard,'CONSTR_DIST',constr_dist,0) + call reada(controlcard,'TIMLIM',timlim,960.0D0) ! default 16 hours + unres_pdb = index(controlcard,'UNRES_PDB') .gt. 0 + call reada(controlcard,'SAFETY',safety,30.0D0) ! default 30 minutes + call reada(controlcard,'RMSDBC',rmsdbc,3.0D0) + call reada(controlcard,'RMSDBC1',rmsdbc1,0.5D0) + call reada(controlcard,'RMSDBC1MAX',rmsdbc1max,1.5D0) + call reada(controlcard,'RMSDBCM',rmsdbcm,3.0D0) + call reada(controlcard,'DRMS',drms,0.1D0) + if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) then + write (iout,'(a,f10.1)')'RMSDBC = ',rmsdbc + write (iout,'(a,f10.1)')'RMSDBC1 = ',rmsdbc1 + write (iout,'(a,f10.1)')'RMSDBC1MAX = ',rmsdbc1max + write (iout,'(a,f10.1)')'DRMS = ',drms + write (iout,'(a,f10.1)')'RMSDBCM = ',rmsdbcm + write (iout,'(a,f10.1)') 'Time limit (min):',timlim + endif + call readi(controlcard,'NZ_START',nz_start,0) + call readi(controlcard,'NZ_END',nz_end,0) + call readi(controlcard,'IZ_SC',iz_sc,0) + timlim=60.0D0*timlim + safety = 60.0d0*safety + timem=timlim + modecalc=0 + call reada(controlcard,"T_BATH",t_bath,300.0d0) + minim=(index(controlcard,'MINIMIZE').gt.0) + dccart=(index(controlcard,'CART').gt.0) + overlapsc=(index(controlcard,'OVERLAP').gt.0) + overlapsc=.not.overlapsc + searchsc=(index(controlcard,'NOSEARCHSC').gt.0) + searchsc=.not.searchsc + sideadd=(index(controlcard,'SIDEADD').gt.0) + energy_dec=(index(controlcard,'ENERGY_DEC').gt.0) + outpdb=(index(controlcard,'PDBOUT').gt.0) + outmol2=(index(controlcard,'MOL2OUT').gt.0) + pdbref=(index(controlcard,'PDBREF').gt.0) + refstr=pdbref .or. (index(controlcard,'REFSTR').gt.0) + indpdb=index(controlcard,'PDBSTART') + extconf=(index(controlcard,'EXTCONF').gt.0) + call readi(controlcard,'IPRINT',iprint,0) + call readi(controlcard,'MAXGEN',maxgen,10000) + call readi(controlcard,'MAXOVERLAP',maxoverlap,1000) + call readi(controlcard,"KDIAG",kdiag,0) + call readi(controlcard,"RESCALE_MODE",rescale_mode,2) + if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) + & write (iout,*) "RESCALE_MODE",rescale_mode + split_ene=index(controlcard,'SPLIT_ENE').gt.0 + if (index(controlcard,'REGULAR').gt.0.0D0) then + call reada(controlcard,'WEIDIS',weidis,0.1D0) + modecalc=1 + refstr=.true. + endif + if (index(controlcard,'CHECKGRAD').gt.0) then + modecalc=5 + if (index(controlcard,'CART').gt.0) then + icheckgrad=1 + elseif (index(controlcard,'CARINT').gt.0) then + icheckgrad=2 + else + icheckgrad=3 + endif + elseif (index(controlcard,'THREAD').gt.0) then + modecalc=2 + call readi(controlcard,'THREAD',nthread,0) + if (nthread.gt.0) then + call reada(controlcard,'WEIDIS',weidis,0.1D0) + else + if (fg_rank.eq.0) + & write (iout,'(a)')'A number has to follow the THREAD keyword.' + stop 'Error termination in Read_Control.' + endif + else if (index(controlcard,'MCMA').gt.0) then + modecalc=3 + else if (index(controlcard,'MCEE').gt.0) then + modecalc=6 + else if (index(controlcard,'MULTCONF').gt.0) then + modecalc=4 + else if (index(controlcard,'MAP').gt.0) then + modecalc=7 + call readi(controlcard,'MAP',nmap,0) + else if (index(controlcard,'CSA').gt.0) then + write(*,*) "CSA not supported in this version" + stop +csa modecalc=8 +crc else if (index(controlcard,'ZSCORE').gt.0) then +crc +crc ZSCORE is rm from UNRES, modecalc=9 is available +crc +crc modecalc=9 +cfcm else if (index(controlcard,'MCMF').gt.0) then +cfmc modecalc=10 + else if (index(controlcard,'SOFTREG').gt.0) then + modecalc=11 + else if (index(controlcard,'CHECK_BOND').gt.0) then + modecalc=-1 + else if (index(controlcard,'TEST').gt.0) then + modecalc=-2 + else if (index(controlcard,'MD').gt.0) then + modecalc=12 + else if (index(controlcard,'RE ').gt.0) then + modecalc=14 + endif + + lmuca=index(controlcard,'MUCA').gt.0 + call readi(controlcard,'MUCADYN',mucadyn,0) + call readi(controlcard,'MUCASMOOTH',muca_smooth,0) + if (lmuca .and. (me.eq.king .or. .not.out1file )) + & then + write (iout,*) 'MUCADYN=',mucadyn + write (iout,*) 'MUCASMOOTH=',muca_smooth + endif + + iscode=index(controlcard,'ONE_LETTER') + indphi=index(controlcard,'PHI') + indback=index(controlcard,'BACK') + iranconf=index(controlcard,'RAND_CONF') + i2ndstr=index(controlcard,'USE_SEC_PRED') + gradout=index(controlcard,'GRADOUT').gt.0 + gnorm_check=index(controlcard,'GNORM_CHECK').gt.0 + + if(me.eq.king.or..not.out1file) + & write (iout,'(2a)') diagmeth(kdiag), + & ' routine used to diagonalize matrices.' + return + end +c-------------------------------------------------------------------------- + subroutine read_REMDpar +C +C Read REMD settings +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.REMD' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + character*80 ucase + character*320 controlcard + character*3200 controlcard1 + integer iremd_m_total + + if(me.eq.king.or..not.out1file) + & write (iout,*) "REMD setup" + + call card_concat(controlcard) + call readi(controlcard,"NREP",nrep,3) + call readi(controlcard,"NSTEX",nstex,1000) + call reada(controlcard,"RETMIN",retmin,10.0d0) + call reada(controlcard,"RETMAX",retmax,1000.0d0) + mremdsync=(index(controlcard,'SYNC').gt.0) + call readi(controlcard,"NSYN",i_sync_step,100) + restart1file=(index(controlcard,'REST1FILE').gt.0) + traj1file=(index(controlcard,'TRAJ1FILE').gt.0) + call readi(controlcard,"TRAJCACHE",max_cache_traj_use,1) + if(max_cache_traj_use.gt.max_cache_traj) + & max_cache_traj_use=max_cache_traj + if(me.eq.king.or..not.out1file) then +cd if (traj1file) then +crc caching is in testing - NTWX is not ignored +cd write (iout,*) "NTWX value is ignored" +cd write (iout,*) " trajectory is stored to one file by master" +cd write (iout,*) " before exchange at NSTEX intervals" +cd endif + write (iout,*) "NREP= ",nrep + write (iout,*) "NSTEX= ",nstex + write (iout,*) "SYNC= ",mremdsync + write (iout,*) "NSYN= ",i_sync_step + write (iout,*) "TRAJCACHE= ",max_cache_traj_use + endif + + t_exchange_only=(index(controlcard,'TONLY').gt.0) + call readi(controlcard,"HREMD",hremd,0) + if((me.eq.king.or..not.out1file).and.hremd.gt.0) then + write (iout,*) "Hamiltonian REMD with ",hremd," sets of weights" + endif + if(usampl.and.hremd.gt.0) then + write (iout,'(//a)') + & "========== ERROR: USAMPL and HREMD cannot be used together" +#ifdef MPI + call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) +#endif + stop + endif + + + remd_tlist=.false. + if (index(controlcard,'TLIST').gt.0) then + remd_tlist=.true. + call card_concat(controlcard1) + read(controlcard1,*) (remd_t(i),i=1,nrep) + if(me.eq.king.or..not.out1file) + & write (iout,*)'tlist',(remd_t(i),i=1,nrep) + endif + remd_mlist=.false. + if (index(controlcard,'MLIST').gt.0) then + remd_mlist=.true. + call card_concat(controlcard1) + read(controlcard1,*) (remd_m(i),i=1,nrep) + if(me.eq.king.or..not.out1file) then + write (iout,*)'mlist',(remd_m(i),i=1,nrep) + iremd_m_total=0 + do i=1,nrep + iremd_m_total=iremd_m_total+remd_m(i) + enddo + if(hremd.gt.1)then + write (iout,*) 'Total number of replicas ', + & iremd_m_total*hremd + else + write (iout,*) 'Total number of replicas ',iremd_m_total + endif + endif + endif + if(me.eq.king.or..not.out1file) + & write (iout,'(/30(1h=),a,29(1h=)/)') " End of REMD run setup " + return + end +c-------------------------------------------------------------------------- + subroutine read_MDpar +C +C Read MD settings +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.SPLITELE' + character*80 ucase + character*320 controlcard + + call card_concat(controlcard) + call readi(controlcard,"NSTEP",n_timestep,1000000) + call readi(controlcard,"NTWE",ntwe,100) + call readi(controlcard,"NTWX",ntwx,1000) + call reada(controlcard,"DT",d_time,1.0d-1) + call reada(controlcard,"DVMAX",dvmax,2.0d1) + call reada(controlcard,"DAMAX",damax,1.0d1) + call reada(controlcard,"EDRIFTMAX",edriftmax,1.0d+1) + call readi(controlcard,"LANG",lang,0) + RESPA = index(controlcard,"RESPA") .gt. 0 + call readi(controlcard,"NTIME_SPLIT",ntime_split,1) + ntime_split0=ntime_split + call readi(controlcard,"MAXTIME_SPLIT",maxtime_split,64) + ntime_split0=ntime_split + call reada(controlcard,"R_CUT",r_cut,2.0d0) + call reada(controlcard,"LAMBDA",rlamb,0.3d0) + rest = index(controlcard,"REST").gt.0 + tbf = index(controlcard,"TBF").gt.0 + call readi(controlcard,"HMC",hmc,0) + tnp = index(controlcard,"NOSEPOINCARE99").gt.0 + tnp1 = index(controlcard,"NOSEPOINCARE01").gt.0 + tnh = index(controlcard,"NOSEHOOVER96").gt.0 + if (RESPA.and.tnh)then + xiresp = index(controlcard,"XIRESP").gt.0 + endif + call reada(controlcard,"Q_NP",Q_np,0.1d0) + usampl = index(controlcard,"USAMPL").gt.0 + + mdpdb = index(controlcard,"MDPDB").gt.0 + call reada(controlcard,"T_BATH",t_bath,300.0d0) + call reada(controlcard,"TAU_BATH",tau_bath,1.0d-1) + call reada(controlcard,"EQ_TIME",eq_time,1.0d+4) + call readi(controlcard,"RESET_MOMENT",count_reset_moment,1000) + if (count_reset_moment.eq.0) count_reset_moment=1000000000 + call readi(controlcard,"RESET_VEL",count_reset_vel,1000) + reset_moment=lang.eq.0 .and. tbf .and. count_reset_moment.gt.0 + reset_vel=lang.eq.0 .and. tbf .and. count_reset_vel.gt.0 + if (count_reset_vel.eq.0) count_reset_vel=1000000000 + large = index(controlcard,"LARGE").gt.0 + print_compon = index(controlcard,"PRINT_COMPON").gt.0 + rattle = index(controlcard,"RATTLE").gt.0 +c if performing umbrella sampling, fragments constrained are read from the fragment file + nset=0 + if(usampl) then + call read_fragments + endif + + if(me.eq.king.or..not.out1file) then + write (iout,*) + write (iout,'(27(1h=),a26,27(1h=))') " Parameters of the MD run " + write (iout,*) + write (iout,'(a)') "The units are:" + write (iout,'(a)') "positions: angstrom, time: 48.9 fs" + write (iout,'(2a)') "velocity: angstrom/(48.9 fs),", + & " acceleration: angstrom/(48.9 fs)**2" + write (iout,'(a)') "energy: kcal/mol, temperature: K" + write (iout,*) + write (iout,'(a60,i10)') "Number of time steps:",n_timestep + write (iout,'(a60,f10.5,a)') + & "Initial time step of numerical integration:",d_time, + & " natural units" + write (iout,'(60x,f10.5,a)') d_time*48.9," fs" + if (RESPA) then + write (iout,'(2a,i4,a)') + & "A-MTS algorithm used; initial time step for fast-varying", + & " short-range forces split into",ntime_split," steps." + write (iout,'(a,f5.2,a,f5.2)') "Short-range force cutoff", + & r_cut," lambda",rlamb + endif + write (iout,'(2a,f10.5)') + & "Maximum acceleration threshold to reduce the time step", + & "/increase split number:",damax + write (iout,'(2a,f10.5)') + & "Maximum predicted energy drift to reduce the timestep", + & "/increase split number:",edriftmax + write (iout,'(a60,f10.5)') + & "Maximum velocity threshold to reduce velocities:",dvmax + write (iout,'(a60,i10)') "Frequency of property output:",ntwe + write (iout,'(a60,i10)') "Frequency of coordinate output:",ntwx + if (rattle) write (iout,'(a60)') + & "Rattle algorithm used to constrain the virtual bonds" + endif + reset_fricmat=1000 + if (lang.gt.0) then + call reada(controlcard,"ETAWAT",etawat,0.8904d0) + call reada(controlcard,"RWAT",rwat,1.4d0) + call reada(controlcard,"SCAL_FRIC",scal_fric,2.0d-2) + surfarea=index(controlcard,"SURFAREA").gt.0 + call readi(controlcard,"RESET_FRICMAT",reset_fricmat,1000) + if(me.eq.king.or..not.out1file)then + write (iout,'(/a,$)') "Langevin dynamics calculation" + if (lang.eq.1) then + write (iout,'(a/)') + & " with direct integration of Langevin equations" + else if (lang.eq.2) then + write (iout,'(a/)') " with TINKER stochasic MD integrator" + else if (lang.eq.3) then + write (iout,'(a/)') " with Ciccotti's stochasic MD integrator" + else if (lang.eq.4) then + write (iout,'(a/)') " in overdamped mode" + else + write (iout,'(//a,i5)') + & "=========== ERROR: Unknown Langevin dynamics mode:",lang + stop + endif + write (iout,'(a60,f10.5)') "Temperature:",t_bath + write (iout,'(a60,f10.5)') "Viscosity of the solvent:",etawat + write (iout,'(a60,f10.5)') "Radius of solvent molecule:",rwat + write (iout,'(a60,f10.5)') + & "Scaling factor of the friction forces:",scal_fric + if (surfarea) write (iout,'(2a,i10,a)') + & "Friction coefficients will be scaled by solvent-accessible", + & " surface area every",reset_fricmat," steps." + endif +c Calculate friction coefficients and bounds of stochastic forces + eta=6*pi*cPoise*etawat + if(me.eq.king.or..not.out1file) + & write(iout,'(a60,f10.5)')"Eta of the solvent in natural units:" + & ,eta + gamp=scal_fric*(pstok+rwat)*eta + stdfp=dsqrt(2*Rb*t_bath/d_time) + do i=1,ntyp + gamsc(i)=scal_fric*(restok(i)+rwat)*eta + stdfsc(i)=dsqrt(2*Rb*t_bath/d_time) + enddo + if(me.eq.king.or..not.out1file)then + write (iout,'(/2a/)') + & "Radii of site types and friction coefficients and std's of", + & " stochastic forces of fully exposed sites" + write (iout,'(a5,f5.2,2f10.5)')'p',pstok,gamp,stdfp*dsqrt(gamp) + do i=1,ntyp + write (iout,'(a5,f5.2,2f10.5)') restyp(i),restok(i), + & gamsc(i),stdfsc(i)*dsqrt(gamsc(i)) + enddo + endif + else if (tbf) then + if(me.eq.king.or..not.out1file)then + write (iout,'(a)') "Berendsen bath calculation" + write (iout,'(a60,f10.5)') "Temperature:",t_bath + write (iout,'(a60,f10.5)') "Coupling constant (tau):",tau_bath + if (reset_moment) + & write (iout,'(a,i10,a)') "Momenta will be reset at zero every", + & count_reset_moment," steps" + if (reset_vel) + & write (iout,'(a,i10,a)') + & "Velocities will be reset at random every",count_reset_vel, + & " steps" + endif + else if (tnp .or. tnp1 .or. tnh) then + if (tnp .or. tnp1) then + write (iout,'(a)') "Nose-Poincare bath calculation" + if (tnp) write (iout,'(a)') + & "J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird" + if (tnp1) write (iout,'(a)') "JPSJ 70 75 (2001) S. Nose" + else + write (iout,'(a)') "Nose-Hoover bath calculation" + write (iout,'(a)') "Mol.Phys. 87 1117 (1996) Martyna et al." + nresn=1 + nyosh=1 + nnos=1 + do i=1,nnos + qmass(i)=Q_np + xlogs(i)=1.0 + vlogs(i)=0.0 + enddo + do i=1,nyosh + WDTI(i) = 1.0*d_time/nresn + WDTI2(i)=WDTI(i)/2 + WDTI4(i)=WDTI(i)/4 + WDTI8(i)=WDTI(i)/8 + enddo + if (RESPA) then + if(xiresp) then + write (iout,'(a)') "NVT-XI-RESPA algorithm" + else + write (iout,'(a)') "NVT-XO-RESPA algorithm" + endif + do i=1,nyosh + WDTIi(i) = 1.0*d_time/nresn/ntime_split + WDTIi2(i)=WDTIi(i)/2 + WDTIi4(i)=WDTIi(i)/4 + WDTIi8(i)=WDTIi(i)/8 + enddo + endif + endif + + write (iout,'(a60,f10.5)') "Temperature:",t_bath + write (iout,'(a60,f10.5)') "Q =",Q_np + if (reset_moment) + & write (iout,'(a,i10,a)') "Momenta will be reset at zero every", + & count_reset_moment," steps" + if (reset_vel) + & write (iout,'(a,i10,a)') + & "Velocities will be reset at random every",count_reset_vel, + & " steps" + + else if (hmc.gt.0) then + write (iout,'(a)') "Hybrid Monte Carlo calculation" + write (iout,'(a60,f10.5)') "Temperature:",t_bath + write (iout,'(a60,i10)') + & "Number of MD steps between Metropolis tests:",hmc + + else + if(me.eq.king.or..not.out1file) + & write (iout,'(a31)') "Microcanonical mode calculation" + endif + if(me.eq.king.or..not.out1file)then + if (rest) write (iout,'(/a/)') "===== Calculation restarted ====" + if (usampl) then + write(iout,*) "MD running with constraints." + write(iout,*) "Equilibration time ", eq_time, " mtus." + write(iout,*) "Constraining ", nfrag," fragments." + write(iout,*) "Length of each fragment, weight and q0:" + do iset=1,nset + write (iout,*) "Set of restraints #",iset + do i=1,nfrag + write(iout,'(2i5,f8.1,f7.4)') ifrag(1,i,iset), + & ifrag(2,i,iset),wfrag(i,iset),qinfrag(i,iset) + enddo + write(iout,*) "constraints between ", npair, "fragments." + write(iout,*) "constraint pairs, weights and q0:" + do i=1,npair + write(iout,'(2i5,f8.1,f7.4)') ipair(1,i,iset), + & ipair(2,i,iset),wpair(i,iset),qinpair(i,iset) + enddo + write(iout,*) "angle constraints within ", nfrag_back, + & "backbone fragments." + write(iout,*) "fragment, weights:" + do i=1,nfrag_back + write(iout,'(2i5,3f8.1)') ifrag_back(1,i,iset), + & ifrag_back(2,i,iset),wfrag_back(1,i,iset), + & wfrag_back(2,i,iset),wfrag_back(3,i,iset) + enddo + enddo + iset=mod(kolor,nset)+1 + endif + endif + if(me.eq.king.or..not.out1file) + & write (iout,'(/30(1h=),a,29(1h=)/)') " End of MD run setup " + return + end +c------------------------------------------------------------------------------ + subroutine molread +C +C Read molecular data. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer error_msg +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.CONTACTS' + include 'COMMON.TORCNSTR' + include 'COMMON.TIME1' + include 'COMMON.BOUNDS' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + character*4 sequence(maxres) + integer rescode + double precision x(maxvar) + character*256 pdbfile + character*320 weightcard + character*80 weightcard_t,ucase + dimension itype_pdb(maxres) + common /pizda/ itype_pdb + logical seq_comp,fail + double precision energia(0:n_ene) + integer ilen + external ilen +C +C Body +C +C Read weights of the subsequent energy terms. + if(hremd.gt.0) then + + k=0 + do il=1,hremd + do i=1,nrep + do j=1,remd_m(i) + i2set(k)=il + k=k+1 + enddo + enddo + enddo + + if(me.eq.king.or..not.out1file) then + write (iout,*) 'Reading ',hremd,' sets of weights for HREMD' + write (iout,*) 'Current weights for processor ', + & me,' set ',i2set(me) + endif + + do i=1,hremd + call card_concat(weightcard) + call reada(weightcard,'WLONG',wlong,1.0D0) + call reada(weightcard,'WSC',wsc,wlong) + call reada(weightcard,'WSCP',wscp,wlong) + call reada(weightcard,'WELEC',welec,1.0D0) + call reada(weightcard,'WVDWPP',wvdwpp,welec) + call reada(weightcard,'WEL_LOC',wel_loc,1.0D0) + call reada(weightcard,'WCORR4',wcorr4,0.0D0) + call reada(weightcard,'WCORR5',wcorr5,0.0D0) + call reada(weightcard,'WCORR6',wcorr6,0.0D0) + call reada(weightcard,'WTURN3',wturn3,1.0D0) + call reada(weightcard,'WTURN4',wturn4,1.0D0) + call reada(weightcard,'WTURN6',wturn6,1.0D0) + call reada(weightcard,'WSCCOR',wsccor,1.0D0) + call reada(weightcard,'WSTRAIN',wstrain,1.0D0) + call reada(weightcard,'WBOND',wbond,1.0D0) + call reada(weightcard,'WTOR',wtor,1.0D0) + call reada(weightcard,'WTORD',wtor_d,1.0D0) + call reada(weightcard,'WANG',wang,1.0D0) + call reada(weightcard,'WSCLOC',wscloc,1.0D0) + call reada(weightcard,'SCAL14',scal14,0.4D0) + call reada(weightcard,'SCALSCP',scalscp,1.0d0) + call reada(weightcard,'CUTOFF',cutoff_corr,7.0d0) + call reada(weightcard,'DELT_CORR',delt_corr,0.5d0) + call reada(weightcard,'TEMP0',temp0,300.0d0) + if (index(weightcard,'SOFT').gt.0) ipot=6 +C 12/1/95 Added weight for the multi-body term WCORR + call reada(weightcard,'WCORRH',wcorr,1.0D0) + if (wcorr4.gt.0.0d0) wcorr=wcorr4 + + hweights(i,1)=wsc + hweights(i,2)=wscp + hweights(i,3)=welec + hweights(i,4)=wcorr + hweights(i,5)=wcorr5 + hweights(i,6)=wcorr6 + hweights(i,7)=wel_loc + hweights(i,8)=wturn3 + hweights(i,9)=wturn4 + hweights(i,10)=wturn6 + hweights(i,11)=wang + hweights(i,12)=wscloc + hweights(i,13)=wtor + hweights(i,14)=wtor_d + hweights(i,15)=wstrain + hweights(i,16)=wvdwpp + hweights(i,17)=wbond + hweights(i,18)=scal14 + hweights(i,21)=wsccor + + enddo + + do i=1,n_ene + weights(i)=hweights(i2set(me),i) + enddo + wsc =weights(1) + wscp =weights(2) + welec =weights(3) + wcorr =weights(4) + wcorr5 =weights(5) + wcorr6 =weights(6) + wel_loc=weights(7) + wturn3 =weights(8) + wturn4 =weights(9) + wturn6 =weights(10) + wang =weights(11) + wscloc =weights(12) + wtor =weights(13) + wtor_d =weights(14) + wstrain=weights(15) + wvdwpp =weights(16) + wbond =weights(17) + scal14 =weights(18) + wsccor =weights(21) + + + else + call card_concat(weightcard) + call reada(weightcard,'WLONG',wlong,1.0D0) + call reada(weightcard,'WSC',wsc,wlong) + call reada(weightcard,'WSCP',wscp,wlong) + call reada(weightcard,'WELEC',welec,1.0D0) + call reada(weightcard,'WVDWPP',wvdwpp,welec) + call reada(weightcard,'WEL_LOC',wel_loc,1.0D0) + call reada(weightcard,'WCORR4',wcorr4,0.0D0) + call reada(weightcard,'WCORR5',wcorr5,0.0D0) + call reada(weightcard,'WCORR6',wcorr6,0.0D0) + call reada(weightcard,'WTURN3',wturn3,1.0D0) + call reada(weightcard,'WTURN4',wturn4,1.0D0) + call reada(weightcard,'WTURN6',wturn6,1.0D0) + call reada(weightcard,'WSCCOR',wsccor,1.0D0) + call reada(weightcard,'WSTRAIN',wstrain,1.0D0) + call reada(weightcard,'WBOND',wbond,1.0D0) + call reada(weightcard,'WTOR',wtor,1.0D0) + call reada(weightcard,'WTORD',wtor_d,1.0D0) + call reada(weightcard,'WANG',wang,1.0D0) + call reada(weightcard,'WSCLOC',wscloc,1.0D0) + call reada(weightcard,'SCAL14',scal14,0.4D0) + call reada(weightcard,'SCALSCP',scalscp,1.0d0) + call reada(weightcard,'CUTOFF',cutoff_corr,7.0d0) + call reada(weightcard,'DELT_CORR',delt_corr,0.5d0) + call reada(weightcard,'TEMP0',temp0,300.0d0) + if (index(weightcard,'SOFT').gt.0) ipot=6 +C 12/1/95 Added weight for the multi-body term WCORR + call reada(weightcard,'WCORRH',wcorr,1.0D0) + if (wcorr4.gt.0.0d0) wcorr=wcorr4 + weights(1)=wsc + weights(2)=wscp + weights(3)=welec + weights(4)=wcorr + weights(5)=wcorr5 + weights(6)=wcorr6 + weights(7)=wel_loc + weights(8)=wturn3 + weights(9)=wturn4 + weights(10)=wturn6 + weights(11)=wang + weights(12)=wscloc + weights(13)=wtor + weights(14)=wtor_d + weights(15)=wstrain + weights(16)=wvdwpp + weights(17)=wbond + weights(18)=scal14 + weights(21)=wsccor + endif + + if(me.eq.king.or..not.out1file) + & write (iout,10) wsc,wscp,welec,wvdwpp,wbond,wang,wscloc,wtor, + & wtor_d,wstrain,wel_loc,wcorr,wcorr5,wcorr6,wsccor,wturn3, + & wturn4,wturn6 + 10 format (/'Energy-term weights (unscaled):'// + & 'WSCC= ',f10.6,' (SC-SC)'/ + & 'WSCP= ',f10.6,' (SC-p)'/ + & 'WELEC= ',f10.6,' (p-p electr)'/ + & 'WVDWPP= ',f10.6,' (p-p VDW)'/ + & 'WBOND= ',f10.6,' (stretching)'/ + & 'WANG= ',f10.6,' (bending)'/ + & 'WSCLOC= ',f10.6,' (SC local)'/ + & 'WTOR= ',f10.6,' (torsional)'/ + & 'WTORD= ',f10.6,' (double torsional)'/ + & 'WSTRAIN=',f10.6,' (SS bridges & dist. cnstr.)'/ + & 'WEL_LOC=',f10.6,' (multi-body 3-rd order)'/ + & 'WCORR4= ',f10.6,' (multi-body 4th order)'/ + & 'WCORR5= ',f10.6,' (multi-body 5th order)'/ + & 'WCORR6= ',f10.6,' (multi-body 6th order)'/ + & 'WSCCOR= ',f10.6,' (back-scloc correlation)'/ + & 'WTURN3= ',f10.6,' (turns, 3rd order)'/ + & 'WTURN4= ',f10.6,' (turns, 4th order)'/ + & 'WTURN6= ',f10.6,' (turns, 6th order)') + if(me.eq.king.or..not.out1file)then + if (wcorr4.gt.0.0d0) then + write (iout,'(/2a/)') 'Local-electrostatic type correlation ', + & 'between contact pairs of peptide groups' + write (iout,'(2(a,f5.3/))') + & 'Cutoff on 4-6th order correlation terms: ',cutoff_corr, + & 'Range of quenching the correlation terms:',2*delt_corr + else if (wcorr.gt.0.0d0) then + write (iout,'(/2a/)') 'Hydrogen-bonding correlation ', + & 'between contact pairs of peptide groups' + endif + write (iout,'(a,f8.3)') + & 'Scaling factor of 1,4 SC-p interactions:',scal14 + write (iout,'(a,f8.3)') + & 'General scaling factor of SC-p interactions:',scalscp + endif + r0_corr=cutoff_corr-delt_corr + do i=1,20 + aad(i,1)=scalscp*aad(i,1) + aad(i,2)=scalscp*aad(i,2) + bad(i,1)=scalscp*bad(i,1) + bad(i,2)=scalscp*bad(i,2) + enddo + call rescale_weights(t_bath) + if(me.eq.king.or..not.out1file) + & write (iout,22) wsc,wscp,welec,wvdwpp,wbond,wang,wscloc,wtor, + & wtor_d,wstrain,wel_loc,wcorr,wcorr5,wcorr6,wsccor,wturn3, + & wturn4,wturn6 + 22 format (/'Energy-term weights (scaled):'// + & 'WSCC= ',f10.6,' (SC-SC)'/ + & 'WSCP= ',f10.6,' (SC-p)'/ + & 'WELEC= ',f10.6,' (p-p electr)'/ + & 'WVDWPP= ',f10.6,' (p-p VDW)'/ + & 'WBOND= ',f10.6,' (stretching)'/ + & 'WANG= ',f10.6,' (bending)'/ + & 'WSCLOC= ',f10.6,' (SC local)'/ + & 'WTOR= ',f10.6,' (torsional)'/ + & 'WTORD= ',f10.6,' (double torsional)'/ + & 'WSTRAIN=',f10.6,' (SS bridges & dist. cnstr.)'/ + & 'WEL_LOC=',f10.6,' (multi-body 3-rd order)'/ + & 'WCORR4= ',f10.6,' (multi-body 4th order)'/ + & 'WCORR5= ',f10.6,' (multi-body 5th order)'/ + & 'WCORR6= ',f10.6,' (multi-body 6th order)'/ + & 'WSCCOR= ',f10.6,' (back-scloc correlatkion)'/ + & 'WTURN3= ',f10.6,' (turns, 3rd order)'/ + & 'WTURN4= ',f10.6,' (turns, 4th order)'/ + & 'WTURN6= ',f10.6,' (turns, 6th order)') + if(me.eq.king.or..not.out1file) + & write (iout,*) "Reference temperature for weights calculation:", + & temp0 + call reada(weightcard,"D0CM",d0cm,3.78d0) + call reada(weightcard,"AKCM",akcm,15.1d0) + call reada(weightcard,"AKTH",akth,11.0d0) + call reada(weightcard,"AKCT",akct,12.0d0) + call reada(weightcard,"V1SS",v1ss,-1.08d0) + call reada(weightcard,"V2SS",v2ss,7.61d0) + call reada(weightcard,"V3SS",v3ss,13.7d0) + call reada(weightcard,"EBR",ebr,-5.50D0) + dyn_ss=(index(weightcard,'DYN_SS').gt.0) + do i=1,maxres + dyn_ss_mask(i)=.false. + enddo + do i=1,maxres-1 + do j=i+1,maxres + dyn_ssbond_ij(i,j)=1.0d300 + enddo + enddo + call reada(weightcard,"HT",Ht,0.0D0) + if (dyn_ss) then + ss_depth=ebr/wsc-0.25*eps(1,1) + Ht=Ht/wsc-0.25*eps(1,1) + akcm=akcm*wstrain/wsc + akth=akth*wstrain/wsc + akct=akct*wstrain/wsc + v1ss=v1ss*wstrain/wsc + v2ss=v2ss*wstrain/wsc + v3ss=v3ss*wstrain/wsc + else + ss_depth=ebr/wstrain-0.25*eps(1,1)*wsc/wstrain + endif + + if(me.eq.king.or..not.out1file) then + write (iout,*) "Parameters of the SS-bond potential:" + write (iout,*) "D0CM",d0cm," AKCM",akcm," AKTH",akth, + & " AKCT",akct + write (iout,*) "V1SS",v1ss," V2SS",v2ss," V3SS",v3ss + write (iout,*) "EBR",ebr," SS_DEPTH",ss_depth + write (iout,*)" HT",Ht + print *,'indpdb=',indpdb,' pdbref=',pdbref + endif + if (indpdb.gt.0 .or. pdbref) then + read(inp,'(a)') pdbfile + if(me.eq.king.or..not.out1file) + & write (iout,'(2a)') 'PDB data will be read from file ', + & pdbfile(:ilen(pdbfile)) + open(ipdbin,file=pdbfile,status='old',err=33) + goto 34 + 33 write (iout,'(a)') 'Error opening PDB file.' + stop + 34 continue +c print *,'Begin reading pdb data' + call readpdb +c print *,'Finished reading pdb data' + if(me.eq.king.or..not.out1file) + & write (iout,'(a,i3,a,i3)')'nsup=',nsup, + & ' nstart_sup=',nstart_sup + do i=1,nres + itype_pdb(i)=itype(i) + enddo + close (ipdbin) + nnt=nstart_sup + nct=nstart_sup+nsup-1 + call contact(.false.,ncont_ref,icont_ref,co) + + if (sideadd) then +C Following 2 lines for diagnostics; comment out if not needed + write (iout,*) "Before sideadd" + call intout + if(me.eq.king.or..not.out1file) + & write(iout,*)'Adding sidechains' + maxsi=1000 + do i=2,nres-1 + iti=itype(i) + if (iti.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(iti,theta(i+1),alph(i),omeg(i),fail) + nsi=nsi+1 + enddo + if(fail) write(iout,*)'Adding sidechain failed for res ', + & i,' after ',nsi,' trials' + endif + enddo +C 10/03/12 Adam: Recalculate coordinates with new side chain positions + call chainbuild + endif +C Following 2 lines for diagnostics; comment out if not needed +c write (iout,*) "After sideadd" +c call intout + endif + if (indpdb.eq.0) then +C Read sequence if not taken from the pdb file. + read (inp,*) nres +c print *,'nres=',nres + if (iscode.gt.0) then + read (inp,'(80a1)') (sequence(i)(1:1),i=1,nres) + else + read (inp,'(20(1x,a3))') (sequence(i),i=1,nres) + endif +C Convert sequence to numeric code + do i=1,nres + itype(i)=rescode(i,sequence(i),iscode) + enddo +C Assign initial virtual bond lengths + do i=2,nres + vbld(i)=vbl + vbld_inv(i)=vblinv + enddo + do i=2,nres-1 + vbld(i+nres)=dsc(itype(i)) + vbld_inv(i+nres)=dsc_inv(itype(i)) +c write (iout,*) "i",i," itype",itype(i), +c & " dsc",dsc(itype(i))," vbld",vbld(i),vbld(i+nres) + enddo + endif +c print *,nres +c print '(20i4)',(itype(i),i=1,nres) + do i=1,nres +#ifdef PROCOR + if (itype(i).eq.21 .or. itype(i+1).eq.21) then +#else + if (itype(i).eq.21) then +#endif + itel(i)=0 +#ifdef PROCOR + else if (itype(i+1).ne.20) then +#else + else if (itype(i).ne.20) then +#endif + itel(i)=1 + else + itel(i)=2 + endif + enddo + if(me.eq.king.or..not.out1file)then + write (iout,*) "ITEL" + do i=1,nres-1 + write (iout,*) i,itype(i),itel(i) + enddo + print *,'Call Read_Bridge.' + endif + call read_bridge +C 8/13/98 Set limits to generating the dihedral angles + do i=1,nres + phibound(1,i)=-pi + phibound(2,i)=pi + enddo + read (inp,*) ndih_constr + if (ndih_constr.gt.0) then + read (inp,*) ftors + read (inp,*) (idih_constr(i),phi0(i),drange(i),i=1,ndih_constr) + if(me.eq.king.or..not.out1file)then + write (iout,*) + & 'There are',ndih_constr,' constraints on phi angles.' + do i=1,ndih_constr + write (iout,'(i5,2f8.3)') idih_constr(i),phi0(i),drange(i) + enddo + endif + do i=1,ndih_constr + phi0(i)=deg2rad*phi0(i) + drange(i)=deg2rad*drange(i) + enddo + if(me.eq.king.or..not.out1file) + & write (iout,*) 'FTORS',ftors + do i=1,ndih_constr + ii = idih_constr(i) + phibound(1,ii) = phi0(i)-drange(i) + phibound(2,ii) = phi0(i)+drange(i) + enddo + endif + nnt=1 +#ifdef MPI + if (me.eq.king) then +#endif + write (iout,'(a)') 'Boundaries in phi angle sampling:' + do i=1,nres + write (iout,'(a3,i5,2f10.1)') + & restyp(itype(i)),i,phibound(1,i)*rad2deg,phibound(2,i)*rad2deg + enddo +#ifdef MP + endif +#endif + nct=nres +cd print *,'NNT=',NNT,' NCT=',NCT + if (itype(1).eq.21) nnt=2 + if (itype(nres).eq.21) nct=nct-1 + if (pdbref) then + if(me.eq.king.or..not.out1file) + & write (iout,'(a,i3)') 'nsup=',nsup + nstart_seq=nnt + if (nsup.le.(nct-nnt+1)) then + do i=0,nct-nnt+1-nsup + if (seq_comp(itype(nnt+i),itype_pdb(nstart_sup),nsup)) then + nstart_seq=nnt+i + goto 111 + endif + enddo + write (iout,'(a)') + & 'Error - sequences to be superposed do not match.' + stop + else + do i=0,nsup-(nct-nnt+1) + if (seq_comp(itype(nnt),itype_pdb(nstart_sup+i),nct-nnt+1)) + & then + nstart_sup=nstart_sup+i + nsup=nct-nnt+1 + goto 111 + endif + enddo + write (iout,'(a)') + & 'Error - sequences to be superposed do not match.' + endif + 111 continue + if (nsup.eq.0) nsup=nct-nnt + if (nstart_sup.eq.0) nstart_sup=nnt + if (nstart_seq.eq.0) nstart_seq=nnt + if(me.eq.king.or..not.out1file) + & write (iout,*) 'nsup=',nsup,' nstart_sup=',nstart_sup, + & ' nstart_seq=',nstart_seq + endif +c--- Zscore rms ------- + if (nz_start.eq.0) nz_start=nnt + if (nz_end.eq.0 .and. nsup.gt.0) then + nz_end=nnt+nsup-1 + else if (nz_end.eq.0) then + nz_end=nct + endif + if(me.eq.king.or..not.out1file)then + write (iout,*) 'NZ_START=',nz_start,' NZ_END=',nz_end + write (iout,*) 'IZ_SC=',iz_sc + endif +c---------------------- + call init_int_table + if (refstr) then + if (.not.pdbref) then + call read_angles(inp,*38) + goto 39 + 38 write (iout,'(a)') 'Error reading reference structure.' +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,IERROR) + stop 'Error reading reference structure' +#endif + 39 call chainbuild + call setup_var +czscore call geom_to_var(nvar,coord_exp_zs(1,1)) + nstart_sup=nnt + nstart_seq=nnt + nsup=nct-nnt+1 + do i=1,2*nres + do j=1,3 + cref(j,i)=c(j,i) + enddo + enddo + call contact(.true.,ncont_ref,icont_ref,co) + endif + if(me.eq.king.or..not.out1file) + & write (iout,*) 'Contact order:',co + if (pdbref) then + if(me.eq.king.or..not.out1file) + & write (2,*) 'Shifting contacts:',nstart_seq,nstart_sup + do i=1,ncont_ref + do j=1,2 + icont_ref(j,i)=icont_ref(j,i)+nstart_seq-nstart_sup + enddo + if(me.eq.king.or..not.out1file) + & write (2,*) i,' ',restyp(itype(icont_ref(1,i))),' ', + & icont_ref(1,i),' ', + & restyp(itype(icont_ref(2,i))),' ',icont_ref(2,i) + enddo + endif + endif +c write (iout,*) "constr_dist",constr_dist,nstart_sup,nsup + if (constr_dist.gt.0) then + call read_dist_constr + endif + if (nhpb.gt.0) call hpb_partition +c write (iout,*) "After read_dist_constr nhpb",nhpb +c call flush(iout) + if (indpdb.eq.0 .and. modecalc.ne.2 .and. modecalc.ne.4 + & .and. modecalc.ne.8 .and. modecalc.ne.9 .and. + & modecalc.ne.10) then +C If input structure hasn't been supplied from the PDB file read or generate +C initial geometry. + if (iranconf.eq.0 .and. .not. extconf) then + if(me.eq.king.or..not.out1file .and.fg_rank.eq.0) + & write (iout,'(a)') 'Initial geometry will be read in.' + if (read_cart) then + read(inp,'(8f10.5)',end=36,err=36) + & ((c(l,k),l=1,3),k=1,nres), + & ((c(l,k+nres),l=1,3),k=nnt,nct) + call int_from_cart1(.false.) + do i=1,nres-1 + do j=1,3 + dc(j,i)=c(j,i+1)-c(j,i) + dc_norm(j,i)=dc_norm(j,i)*vbld_inv(i+1) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + dc(j,i+nres)=c(j,i+nres)-c(j,i) + dc_norm(j,i+nres)=dc_norm(j,i+nres)*vbld_inv(i+nres) + enddo + endif + enddo + return + else + call read_angles(inp,*36) + endif + goto 37 + 36 write (iout,'(a)') 'Error reading angle file.' +#ifdef MPI + call mpi_finalize( MPI_COMM_WORLD,IERR ) +#endif + stop 'Error reading angle file.' + 37 continue + else if (extconf) then + if(me.eq.king.or..not.out1file .and. fg_rank.eq.0) + & write (iout,'(a)') 'Extended chain initial geometry.' + do i=3,nres + theta(i)=90d0*deg2rad + enddo + do i=4,nres + phi(i)=180d0*deg2rad + enddo + do i=2,nres-1 + alph(i)=110d0*deg2rad + enddo + do i=2,nres-1 + omeg(i)=-120d0*deg2rad + enddo + else + if(me.eq.king.or..not.out1file) + & write (iout,'(a)') 'Random-generated initial geometry.' + + +#ifdef MPI + if (me.eq.king .or. fg_rank.eq.0 .and. ( + & modecalc.eq.12 .or. modecalc.eq.14) ) then +#endif + do itrial=1,100 + itmp=1 + call gen_rand_conf(itmp,*30) + goto 40 + 30 write (iout,*) 'Failed to generate random conformation', + & ', itrial=',itrial + write (*,*) 'Processor:',me, + & ' Failed to generate random conformation', + & ' itrial=',itrial + call intout + +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif + enddo + write (iout,'(a,i3,a)') 'Processor:',me, + & ' error in generating random conformation.' + write (*,'(a,i3,a)') 'Processor:',me, + & ' error in generating random conformation.' + call flush(iout) +#ifdef MPI + call MPI_Abort(mpi_comm_world,error_msg,ierrcode) + 40 continue + endif +#else + 40 continue +#endif + endif + elseif (modecalc.eq.4) then + read (inp,'(a)') intinname + open (intin,file=intinname,status='old',err=333) + if (me.eq.king .or. .not.out1file.and.fg_rank.eq.0) + & write (iout,'(a)') 'intinname',intinname + write (*,'(a)') 'Processor',myrank,' intinname',intinname + goto 334 + 333 write (iout,'(2a)') 'Error opening angle file ',intinname +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,IERR) +#endif + stop 'Error opening angle file.' + 334 continue + + endif +C Generate distance constraints, if the PDB structure is to be regularized. + if (nthread.gt.0) then + call read_threadbase + endif + call setup_var + if (me.eq.king .or. .not. out1file) + & call intout + if (ns.gt.0 .and. (me.eq.king .or. .not.out1file) ) then + write (iout,'(/a,i3,a)') + & 'The chain contains',ns,' disulfide-bridging cysteines.' + write (iout,'(20i4)') (iss(i),i=1,ns) + if (dyn_ss) then + write(iout,*)"Running with dynamic disulfide-bond formation" + else + write (iout,'(/a/)') 'Pre-formed links are:' + do i=1,nss + i1=ihpb(i)-nres + i2=jhpb(i)-nres + it1=itype(i1) + it2=itype(i2) + write (iout,'(2a,i3,3a,i3,a,3f10.3)') + & restyp(it1),'(',i1,') -- ',restyp(it2),'(',i2,')',dhpb(i), + & ebr,forcon(i) + enddo + write (iout,'(a)') + endif + endif + if (ns.gt.0.and.dyn_ss) then + do i=nss+1,nhpb + ihpb(i-nss)=ihpb(i) + jhpb(i-nss)=jhpb(i) + forcon(i-nss)=forcon(i) + dhpb(i-nss)=dhpb(i) + enddo + nhpb=nhpb-nss + nss=0 + call hpb_partition + do i=1,ns + dyn_ss_mask(iss(i))=.true. + enddo + endif + if (i2ndstr.gt.0) call secstrp2dihc +c call geom_to_var(nvar,x) +c call etotal(energia(0)) +c call enerprint(energia(0)) +c call briefout(0,etot) +c stop +cd write (iout,'(2(a,i3))') 'NNT',NNT,' NCT',NCT +cd write (iout,'(a)') 'Variable list:' +cd write (iout,'(i4,f10.5)') (i,rad2deg*x(i),i=1,nvar) +#ifdef MPI + if (me.eq.king .or. (fg_rank.eq.0 .and. .not.out1file)) + & write (iout,'(//80(1h*)/20x,a,i4,a/80(1h*)//)') + & 'Processor',myrank,': end reading molecular data.' +#endif + return + end +c-------------------------------------------------------------------------- + logical function seq_comp(itypea,itypeb,length) + implicit none + integer length,itypea(length),itypeb(length) + integer i + do i=1,length + if (itypea(i).ne.itypeb(i)) then + seq_comp=.false. + return + endif + enddo + seq_comp=.true. + return + end +c----------------------------------------------------------------------------- + subroutine read_bridge +C Read information about disulfide bridges. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' + include 'COMMON.SETUP' +C Read bridging residues. + read (inp,*) ns,(iss(i),i=1,ns) + print *,'ns=',ns + if(me.eq.king.or..not.out1file) + & write (iout,*) 'ns=',ns,' iss:',(iss(i),i=1,ns) +C Check whether the specified bridging residues are cystines. + do i=1,ns + if (itype(iss(i)).ne.1) then + if (me.eq.king.or..not.out1file) write (iout,'(2a,i3,a)') + & 'Do you REALLY think that the residue ', + & restyp(itype(iss(i))),i, + & ' can form a disulfide bridge?!!!' + write (*,'(2a,i3,a)') + & 'Do you REALLY think that the residue ', + & restyp(itype(iss(i))),i, + & ' can form a disulfide bridge?!!!' +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,ierror) + stop +#endif + endif + enddo +C Read preformed bridges. + if (ns.gt.0) then + read (inp,*) nss,(ihpb(i),jhpb(i),i=1,nss) + if(fg_rank.eq.0) + & write(iout,*)'nss=',nss,' ihpb,jhpb: ',(ihpb(i),jhpb(i),i=1,nss) + if (nss.gt.0) then + nhpb=nss +C Check if the residues involved in bridges are in the specified list of +C bridging residues. + do i=1,nss + do j=1,i-1 + if (ihpb(i).eq.ihpb(j).or.ihpb(i).eq.jhpb(j) + & .or.jhpb(i).eq.ihpb(j).or.jhpb(i).eq.jhpb(j)) then + write (iout,'(a,i3,a)') 'Disulfide pair',i, + & ' contains residues present in other pairs.' + write (*,'(a,i3,a)') 'Disulfide pair',i, + & ' contains residues present in other pairs.' +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,ierror) + stop +#endif + endif + enddo + do j=1,ns + if (ihpb(i).eq.iss(j)) goto 10 + enddo + write (iout,'(a,i3,a)') 'Pair',i,' contains unknown cystine.' + 10 continue + do j=1,ns + if (jhpb(i).eq.iss(j)) goto 20 + enddo + write (iout,'(a,i3,a)') 'Pair',i,' contains unknown cystine.' + 20 continue + dhpb(i)=dbr + forcon(i)=fbr + enddo + do i=1,nss + ihpb(i)=ihpb(i)+nres + jhpb(i)=jhpb(i)+nres + enddo + endif + endif + return + end +c---------------------------------------------------------------------------- + subroutine read_x(kanal,*) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' +c Read coordinates from input +c + read(kanal,'(8f10.5)',end=10,err=10) + & ((c(l,k),l=1,3),k=1,nres), + & ((c(l,k+nres),l=1,3),k=nnt,nct) + do j=1,3 + c(j,nres+1)=c(j,1) + c(j,2*nres)=c(j,nres) + enddo + call int_from_cart1(.false.) + do i=1,nres-1 + do j=1,3 + dc(j,i)=c(j,i+1)-c(j,i) + dc_norm(j,i)=dc(j,i)*vbld_inv(i+1) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + dc(j,i+nres)=c(j,i+nres)-c(j,i) + dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres) + enddo + endif + enddo + + return + 10 return1 + end +c---------------------------------------------------------------------------- + subroutine read_threadbase + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' +C Read pattern database for threading. + read (icbase,*) nseq + do i=1,nseq + read (icbase,'(i5,2x,a8,2i4)') nres_base(1,i),str_nam(i), + & nres_base(2,i),nres_base(3,i) + read (icbase,'(9f8.3)') ((cart_base(k,j,i),k=1,3),j=1, + & nres_base(1,i)) +c write (iout,'(i5,2x,a8,2i4)') nres_base(1,i),str_nam(i), +c & nres_base(2,i),nres_base(3,i) +c write (iout,'(9f8.3)') ((cart_base(k,j,i),k=1,3),j=1, +c & nres_base(1,i)) + enddo + close (icbase) + if (weidis.eq.0.0D0) weidis=0.1D0 + do i=nnt,nct + do j=i+2,nct + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=weidis + enddo + enddo + read (inp,*) nexcl,(iexam(1,i),iexam(2,i),i=1,nexcl) + write (iout,'(a,i5)') 'nexcl: ',nexcl + write (iout,'(2i5)') (iexam(1,i),iexam(2,i),i=1,nexcl) + return + end +c------------------------------------------------------------------------------ + subroutine setup_var + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' +C Set up variable list. + ntheta=nres-2 + nphi=nres-3 + nvar=ntheta+nphi + nside=0 + do i=2,nres-1 + if (itype(i).ne.10) then + nside=nside+1 + ialph(i,1)=nvar+nside + ialph(nside,2)=i + endif + enddo + if (indphi.gt.0) then + nvar=nphi + else if (indback.gt.0) then + nvar=nphi+ntheta + else + nvar=nvar+2*nside + endif +cd write (iout,'(3i4)') (i,ialph(i,1),ialph(i,2),i=2,nres-1) + return + end +c---------------------------------------------------------------------------- + subroutine gen_dist_constr +C Generate CA distance constraints. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' + dimension itype_pdb(maxres) + common /pizda/ itype_pdb + character*2 iden +cd print *,'gen_dist_constr: nnt=',nnt,' nct=',nct +cd write (2,*) 'gen_dist_constr: nnt=',nnt,' nct=',nct, +cd & ' nstart_sup',nstart_sup,' nstart_seq',nstart_seq, +cd & ' nsup',nsup + do i=nstart_sup,nstart_sup+nsup-1 +cd write (2,*) 'i',i,' seq ',restyp(itype(i+nstart_seq-nstart_sup)), +cd & ' seq_pdb', restyp(itype_pdb(i)) + do j=i+2,nstart_sup+nsup-1 + nhpb=nhpb+1 + ihpb(nhpb)=i+nstart_seq-nstart_sup + jhpb(nhpb)=j+nstart_seq-nstart_sup + forcon(nhpb)=weidis + dhpb(nhpb)=dist(i,j) + enddo + enddo +cd write (iout,'(a)') 'Distance constraints:' +cd do i=nss+1,nhpb +cd ii=ihpb(i) +cd jj=jhpb(i) +cd iden='CA' +cd if (ii.gt.nres) then +cd iden='SC' +cd ii=ii-nres +cd jj=jj-nres +cd endif +cd write (iout,'(a,1x,a,i4,3x,a,1x,a,i4,2f10.3)') +cd & restyp(itype(ii)),iden,ii,restyp(itype(jj)),iden,jj, +cd & dhpb(i),forcon(i) +cd enddo + return + end +c---------------------------------------------------------------------------- + subroutine map_read + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MAP' + include 'COMMON.IOUNITS' + character*3 angid(4) /'THE','PHI','ALP','OME'/ + character*80 mapcard,ucase + do imap=1,nmap + read (inp,'(a)') mapcard + mapcard=ucase(mapcard) + if (index(mapcard,'PHI').gt.0) then + kang(imap)=1 + else if (index(mapcard,'THE').gt.0) then + kang(imap)=2 + else if (index(mapcard,'ALP').gt.0) then + kang(imap)=3 + else if (index(mapcard,'OME').gt.0) then + kang(imap)=4 + else + write(iout,'(a)')'Error - illegal variable spec in MAP card.' + stop 'Error - illegal variable spec in MAP card.' + endif + call readi (mapcard,'RES1',res1(imap),0) + call readi (mapcard,'RES2',res2(imap),0) + if (res1(imap).eq.0) then + res1(imap)=res2(imap) + else if (res2(imap).eq.0) then + res2(imap)=res1(imap) + endif + if(res1(imap)*res2(imap).eq.0 .or. res1(imap).gt.res2(imap))then + write (iout,'(a)') + & 'Error - illegal definition of variable group in MAP.' + stop 'Error - illegal definition of variable group in MAP.' + endif + call reada(mapcard,'FROM',ang_from(imap),0.0D0) + call reada(mapcard,'TO',ang_to(imap),0.0D0) + call readi(mapcard,'NSTEP',nstep(imap),0) + if (ang_from(imap).eq.ang_to(imap) .or. nstep(imap).eq.0) then + write (iout,'(a)') + & 'Illegal boundary and/or step size specification in MAP.' + stop 'Illegal boundary and/or step size specification in MAP.' + endif + enddo ! imap + return + end +c---------------------------------------------------------------------------- +csa subroutine csaread +csa implicit real*8 (a-h,o-z) +csa include 'DIMENSIONS' +csa include 'COMMON.IOUNITS' +csa include 'COMMON.GEO' +csa include 'COMMON.CSA' +csa include 'COMMON.BANK' +csa include 'COMMON.CONTROL' +csa character*80 ucase +csa character*620 mcmcard +csa call card_concat(mcmcard) +csa +csa call readi(mcmcard,'NCONF',nconf,50) +csa call readi(mcmcard,'NADD',nadd,0) +csa call readi(mcmcard,'JSTART',jstart,1) +csa call readi(mcmcard,'JEND',jend,1) +csa call readi(mcmcard,'NSTMAX',nstmax,500000) +csa call readi(mcmcard,'N0',n0,1) +csa call readi(mcmcard,'N1',n1,6) +csa call readi(mcmcard,'N2',n2,4) +csa call readi(mcmcard,'N3',n3,0) +csa call readi(mcmcard,'N4',n4,0) +csa call readi(mcmcard,'N5',n5,0) +csa call readi(mcmcard,'N6',n6,10) +csa call readi(mcmcard,'N7',n7,0) +csa call readi(mcmcard,'N8',n8,0) +csa call readi(mcmcard,'N9',n9,0) +csa call readi(mcmcard,'N14',n14,0) +csa call readi(mcmcard,'N15',n15,0) +csa call readi(mcmcard,'N16',n16,0) +csa call readi(mcmcard,'N17',n17,0) +csa call readi(mcmcard,'N18',n18,0) +csa +csa vdisulf=(index(mcmcard,'DYNSS').gt.0) +csa +csa call readi(mcmcard,'NDIFF',ndiff,2) +csa call reada(mcmcard,'DIFFCUT',diffcut,0.0d0) +csa call readi(mcmcard,'IS1',is1,1) +csa call readi(mcmcard,'IS2',is2,8) +csa call readi(mcmcard,'NRAN0',nran0,4) +csa call readi(mcmcard,'NRAN1',nran1,2) +csa call readi(mcmcard,'IRR',irr,1) +csa call readi(mcmcard,'NSEED',nseed,20) +csa call readi(mcmcard,'NTOTAL',ntotal,10000) +csa call reada(mcmcard,'CUT1',cut1,2.0d0) +csa call reada(mcmcard,'CUT2',cut2,5.0d0) +csa call reada(mcmcard,'ESTOP',estop,-3000.0d0) +csa call readi(mcmcard,'ICMAX',icmax,3) +csa call readi(mcmcard,'IRESTART',irestart,0) +csac!bankt call readi(mcmcard,'NBANKTM',ntbankm,0) +csa ntbankm=0 +csac!bankt +csa call reada(mcmcard,'DELE',dele,20.0d0) +csa call reada(mcmcard,'DIFCUT',difcut,720.0d0) +csa call readi(mcmcard,'IREF',iref,0) +csa call reada(mcmcard,'RMSCUT',rmscut,4.0d0) +csa call reada(mcmcard,'PNCCUT',pnccut,0.5d0) +csa call readi(mcmcard,'NCONF_IN',nconf_in,0) +csa call reada(mcmcard,'RDIH_BIAS',rdih_bias,0.5d0) +csa write (iout,*) "NCONF_IN",nconf_in +csa return +csa end +c---------------------------------------------------------------------------- +cfmc subroutine mcmfread +cfmc implicit real*8 (a-h,o-z) +cfmc include 'DIMENSIONS' +cfmc include 'COMMON.MCMF' +cfmc include 'COMMON.IOUNITS' +cfmc include 'COMMON.GEO' +cfmc character*80 ucase +cfmc character*620 mcmcard +cfmc call card_concat(mcmcard) +cfmc +cfmc call readi(mcmcard,'MAXRANT',maxrant,1000) +cfmc write(iout,*)'MAXRANT=',maxrant +cfmc call readi(mcmcard,'MAXFAM',maxfam,maxfam_p) +cfmc write(iout,*)'MAXFAM=',maxfam +cfmc call readi(mcmcard,'NNET1',nnet1,5) +cfmc write(iout,*)'NNET1=',nnet1 +cfmc call readi(mcmcard,'NNET2',nnet2,4) +cfmc write(iout,*)'NNET2=',nnet2 +cfmc call readi(mcmcard,'NNET3',nnet3,4) +cfmc write(iout,*)'NNET3=',nnet3 +cfmc call readi(mcmcard,'ILASTT',ilastt,0) +cfmc write(iout,*)'ILASTT=',ilastt +cfmc call readi(mcmcard,'MAXSTR',maxstr,maxstr_mcmf) +cfmc write(iout,*)'MAXSTR=',maxstr +cfmc maxstr_f=maxstr/maxfam +cfmc write(iout,*)'MAXSTR_F=',maxstr_f +cfmc call readi(mcmcard,'NMCMF',nmcmf,10) +cfmc write(iout,*)'NMCMF=',nmcmf +cfmc call readi(mcmcard,'IFOCUS',ifocus,nmcmf) +cfmc write(iout,*)'IFOCUS=',ifocus +cfmc call readi(mcmcard,'NLOCMCMF',nlocmcmf,1000) +cfmc write(iout,*)'NLOCMCMF=',nlocmcmf +cfmc call readi(mcmcard,'INTPRT',intprt,1000) +cfmc write(iout,*)'INTPRT=',intprt +cfmc call readi(mcmcard,'IPRT',iprt,100) +cfmc write(iout,*)'IPRT=',iprt +cfmc call readi(mcmcard,'IMAXTR',imaxtr,100) +cfmc write(iout,*)'IMAXTR=',imaxtr +cfmc call readi(mcmcard,'MAXEVEN',maxeven,1000) +cfmc write(iout,*)'MAXEVEN=',maxeven +cfmc call readi(mcmcard,'MAXEVEN1',maxeven1,3) +cfmc write(iout,*)'MAXEVEN1=',maxeven1 +cfmc call readi(mcmcard,'INIMIN',inimin,200) +cfmc write(iout,*)'INIMIN=',inimin +cfmc call readi(mcmcard,'NSTEPMCMF',nstepmcmf,10) +cfmc write(iout,*)'NSTEPMCMF=',nstepmcmf +cfmc call readi(mcmcard,'NTHREAD',nthread,5) +cfmc write(iout,*)'NTHREAD=',nthread +cfmc call readi(mcmcard,'MAXSTEPMCMF',maxstepmcmf,2500) +cfmc write(iout,*)'MAXSTEPMCMF=',maxstepmcmf +cfmc call readi(mcmcard,'MAXPERT',maxpert,9) +cfmc write(iout,*)'MAXPERT=',maxpert +cfmc call readi(mcmcard,'IRMSD',irmsd,1) +cfmc write(iout,*)'IRMSD=',irmsd +cfmc call reada(mcmcard,'DENEMIN',denemin,0.01D0) +cfmc write(iout,*)'DENEMIN=',denemin +cfmc call reada(mcmcard,'RCUT1S',rcut1s,3.5D0) +cfmc write(iout,*)'RCUT1S=',rcut1s +cfmc call reada(mcmcard,'RCUT1E',rcut1e,2.0D0) +cfmc write(iout,*)'RCUT1E=',rcut1e +cfmc call reada(mcmcard,'RCUT2S',rcut2s,0.5D0) +cfmc write(iout,*)'RCUT2S=',rcut2s +cfmc call reada(mcmcard,'RCUT2E',rcut2e,0.1D0) +cfmc write(iout,*)'RCUT2E=',rcut2e +cfmc call reada(mcmcard,'DPERT1',d_pert1,180.0D0) +cfmc write(iout,*)'DPERT1=',d_pert1 +cfmc call reada(mcmcard,'DPERT1A',d_pert1a,180.0D0) +cfmc write(iout,*)'DPERT1A=',d_pert1a +cfmc call reada(mcmcard,'DPERT2',d_pert2,90.0D0) +cfmc write(iout,*)'DPERT2=',d_pert2 +cfmc call reada(mcmcard,'DPERT2A',d_pert2a,45.0D0) +cfmc write(iout,*)'DPERT2A=',d_pert2a +cfmc call reada(mcmcard,'DPERT2B',d_pert2b,90.0D0) +cfmc write(iout,*)'DPERT2B=',d_pert2b +cfmc call reada(mcmcard,'DPERT2C',d_pert2c,60.0D0) +cfmc write(iout,*)'DPERT2C=',d_pert2c +cfmc d_pert1=deg2rad*d_pert1 +cfmc d_pert1a=deg2rad*d_pert1a +cfmc d_pert2=deg2rad*d_pert2 +cfmc d_pert2a=deg2rad*d_pert2a +cfmc d_pert2b=deg2rad*d_pert2b +cfmc d_pert2c=deg2rad*d_pert2c +cfmc call reada(mcmcard,'KT_MCMF1',kt_mcmf1,1.0D0) +cfmc write(iout,*)'KT_MCMF1=',kt_mcmf1 +cfmc call reada(mcmcard,'KT_MCMF2',kt_mcmf2,1.0D0) +cfmc write(iout,*)'KT_MCMF2=',kt_mcmf2 +cfmc call reada(mcmcard,'DKT_MCMF1',dkt_mcmf1,10.0D0) +cfmc write(iout,*)'DKT_MCMF1=',dkt_mcmf1 +cfmc call reada(mcmcard,'DKT_MCMF2',dkt_mcmf2,1.0D0) +cfmc write(iout,*)'DKT_MCMF2=',dkt_mcmf2 +cfmc call reada(mcmcard,'RCUTINI',rcutini,3.5D0) +cfmc write(iout,*)'RCUTINI=',rcutini +cfmc call reada(mcmcard,'GRAT',grat,0.5D0) +cfmc write(iout,*)'GRAT=',grat +cfmc call reada(mcmcard,'BIAS_MCMF',bias_mcmf,0.0D0) +cfmc write(iout,*)'BIAS_MCMF=',bias_mcmf +cfmc +cfmc return +cfmc end +c---------------------------------------------------------------------------- + subroutine mcmread + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.IOUNITS' + character*80 ucase + character*320 mcmcard + call card_concat(mcmcard) + call readi(mcmcard,'MAXACC',maxacc,100) + call readi(mcmcard,'MAX_MCM_IT',max_mcm_it,10000) + call readi(mcmcard,'MAXTRIAL',maxtrial,100) + call readi(mcmcard,'MAXTRIAL_ITER',maxtrial_iter,1000) + call readi(mcmcard,'MAXREPM',maxrepm,200) + call reada(mcmcard,'RANFRACT',RanFract,0.5D0) + call reada(mcmcard,'POOL_FRACT',pool_fraction,0.01D0) + call reada(mcmcard,'OVERLAP',overlap_cut,1.0D3) + call reada(mcmcard,'E_UP',e_up,5.0D0) + call reada(mcmcard,'DELTE',delte,0.1D0) + call readi(mcmcard,'NSWEEP',nsweep,5) + call readi(mcmcard,'NSTEPH',nsteph,0) + call readi(mcmcard,'NSTEPC',nstepc,0) + call reada(mcmcard,'TMIN',tmin,298.0D0) + call reada(mcmcard,'TMAX',tmax,298.0D0) + call readi(mcmcard,'NWINDOW',nwindow,0) + call readi(mcmcard,'PRINT_MC',print_mc,0) + print_stat=(index(mcmcard,'NO_PRINT_STAT').le.0) + print_int=(index(mcmcard,'NO_PRINT_INT').le.0) + ent_read=(index(mcmcard,'ENT_READ').gt.0) + call readi(mcmcard,'SAVE_FREQ',save_frequency,1000) + call readi(mcmcard,'MESSAGE_FREQ',message_frequency,1000) + call readi(mcmcard,'POOL_READ_FREQ',pool_read_freq,5000) + call readi(mcmcard,'POOL_SAVE_FREQ',pool_save_freq,1000) + call readi(mcmcard,'PRINT_FREQ',print_freq,1000) + if (nwindow.gt.0) then + read (inp,*) (winstart(i),winend(i),i=1,nwindow) + do i=1,nwindow + winlen(i)=winend(i)-winstart(i)+1 + enddo + endif + if (tmax.lt.tmin) tmax=tmin + if (tmax.eq.tmin) then + nstepc=0 + nsteph=0 + endif + if (nstepc.gt.0 .and. nsteph.gt.0) then + tsteph=(tmax/tmin)**(1.0D0/(nsteph+0.0D0)) + tstepc=(tmax/tmin)**(1.0D0/(nstepc+0.0D0)) + endif +C Probabilities of different move types + sumpro_type(0)=0.0D0 + call reada(mcmcard,'MULTI_BOND',sumpro_type(1),1.0d0) + call reada(mcmcard,'ONE_ANGLE' ,sumpro_type(2),2.0d0) + sumpro_type(2)=sumpro_type(1)+sumpro_type(2) + call reada(mcmcard,'THETA' ,sumpro_type(3),0.0d0) + sumpro_type(3)=sumpro_type(2)+sumpro_type(3) + call reada(mcmcard,'SIDE_CHAIN',sumpro_type(4),0.5d0) + sumpro_type(4)=sumpro_type(3)+sumpro_type(4) + do i=1,MaxMoveType + print *,'i',i,' sumprotype',sumpro_type(i) + sumpro_type(i)=sumpro_type(i)/sumpro_type(MaxMoveType) + print *,'i',i,' sumprotype',sumpro_type(i) + enddo + return + end +c---------------------------------------------------------------------------- + subroutine read_minim + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MINIM' + include 'COMMON.IOUNITS' + character*80 ucase + character*320 minimcard + call card_concat(minimcard) + call readi(minimcard,'MAXMIN',maxmin,2000) + call readi(minimcard,'MAXFUN',maxfun,5000) + call readi(minimcard,'MINMIN',minmin,maxmin) + call readi(minimcard,'MINFUN',minfun,maxmin) + call reada(minimcard,'TOLF',tolf,1.0D-2) + call reada(minimcard,'RTOLF',rtolf,1.0D-4) + print_min_stat=min0(index(minimcard,'PRINT_MIN_STAT'),1) + print_min_res=min0(index(minimcard,'PRINT_MIN_RES'),1) + print_min_ini=min0(index(minimcard,'PRINT_MIN_INI'),1) + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Options in energy minimization:' + write (iout,'(4(a,i5),a,1pe14.5,a,1pe14.5)') + & 'MaxMin:',MaxMin,' MaxFun:',MaxFun, + & 'MinMin:',MinMin,' MinFun:',MinFun, + & ' TolF:',TolF,' RTolF:',RTolF + return + end +c---------------------------------------------------------------------------- + subroutine read_angles(kanal,*) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' +c Read angles from input +c + read (kanal,*,err=10,end=10) (theta(i),i=3,nres) + read (kanal,*,err=10,end=10) (phi(i),i=4,nres) + read (kanal,*,err=10,end=10) (alph(i),i=2,nres-1) + read (kanal,*,err=10,end=10) (omeg(i),i=2,nres-1) + + do i=1,nres +c 9/7/01 avoid 180 deg valence angle + if (theta(i).gt.179.99d0) theta(i)=179.99d0 +c + theta(i)=deg2rad*theta(i) + phi(i)=deg2rad*phi(i) + alph(i)=deg2rad*alph(i) + omeg(i)=deg2rad*omeg(i) + enddo + return + 10 return1 + end +c---------------------------------------------------------------------------- + subroutine reada(rekord,lancuch,wartosc,default) + implicit none + character*(*) rekord,lancuch + double precision wartosc,default + integer ilen,iread + external ilen + iread=index(rekord,lancuch) + if (iread.eq.0) then + wartosc=default + return + endif + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,err=10,end=10) wartosc + return + 10 wartosc=default + return + end +c---------------------------------------------------------------------------- + subroutine readi(rekord,lancuch,wartosc,default) + implicit none + character*(*) rekord,lancuch + integer wartosc,default + integer ilen,iread + external ilen + iread=index(rekord,lancuch) + if (iread.eq.0) then + wartosc=default + return + endif + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,err=10,end=10) wartosc + return + 10 wartosc=default + return + end +c---------------------------------------------------------------------------- + subroutine multreadi(rekord,lancuch,tablica,dim,default) + implicit none + integer dim,i + integer tablica(dim),default + character*(*) rekord,lancuch + character*80 aux + integer ilen,iread + external ilen + do i=1,dim + tablica(i)=default + enddo + iread=index(rekord,lancuch(:ilen(lancuch))//"=") + if (iread.eq.0) return + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim) + 10 return + end +c---------------------------------------------------------------------------- + subroutine multreada(rekord,lancuch,tablica,dim,default) + implicit none + integer dim,i + double precision tablica(dim),default + character*(*) rekord,lancuch + character*80 aux + integer ilen,iread + external ilen + do i=1,dim + tablica(i)=default + enddo + iread=index(rekord,lancuch(:ilen(lancuch))//"=") + if (iread.eq.0) return + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim) + 10 return + end +c---------------------------------------------------------------------------- + subroutine openunits + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + character*16 form,nodename + integer nodelen +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.MD' + include 'COMMON.CONTROL' + integer lenpre,lenpot,ilen,lentmp + external ilen + character*3 out1file_text,ucase + character*3 ll + external ucase +c print *,"Processor",myrank,"fg_rank",fg_rank," entered openunits" + call getenv_loc("PREFIX",prefix) + pref_orig = prefix + call getenv_loc("POT",pot) + call getenv_loc("DIRTMP",tmpdir) + call getenv_loc("CURDIR",curdir) + call getenv_loc("OUT1FILE",out1file_text) +c print *,"Processor",myrank,"fg_rank",fg_rank," did GETENV" + out1file_text=ucase(out1file_text) + if (out1file_text(1:1).eq."Y") then + out1file=.true. + else + out1file=fg_rank.gt.0 + endif + lenpre=ilen(prefix) + lenpot=ilen(pot) + lentmp=ilen(tmpdir) + if (lentmp.gt.0) then + write (*,'(80(1h!))') + write (*,'(a,19x,a,19x,a)') "!"," A T T E N T I O N ","!" + write (*,'(80(1h!))') + write (*,*)"All output files will be on node /tmp directory." +#ifdef MPI + call MPI_GET_PROCESSOR_NAME( nodename, nodelen, IERROR ) + if (me.eq.king) then + write (*,*) "The master node is ",nodename + else if (fg_rank.eq.0) then + write (*,*) "I am the CG slave node ",nodename + else + write (*,*) "I am the FG slave node ",nodename + endif +#endif + PREFIX = tmpdir(:lentmp)//'/'//prefix(:lenpre) + lenpre = lentmp+lenpre+1 + endif + entname=prefix(:lenpre)//'_'//pot(:lenpot)//'.entr' +C Get the names and open the input files +#if defined(WINIFL) || defined(WINPGI) + open(1,file=pref_orig(:ilen(pref_orig))// + & '.inp',status='old',readonly,shared) + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old',readonly,shared) + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old',readonly,shared) +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + open (ithep_pdb,file=thetname_pdb,status='old',readonly,shared) +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old',readonly,shared) +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old',readonly,shared) +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old',readonly,shared) + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old',readonly,shared) + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old',readonly,shared) + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old',readonly,shared) + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old', + & action='read') +c print *,"Processor",myrank," opened file 1" + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +c print *,"Processor",myrank," opened file 9" +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old',action='read') +c print *,"Processor",myrank," opened file IBOND" + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old',action='read') +c print *,"Processor",myrank," opened file ITHEP" +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + open (ithep_pdb,file=thetname_pdb,status='old',action='read') +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old',action='read') +c print *,"Processor",myrank," opened file IROTAM" +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old',action='read') +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old',action='read') +c print *,"Processor",myrank," opened file ITORP" + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old',action='read') +c print *,"Processor",myrank," opened file ITORDP" + call getenv_loc('SCCORPAR',sccorname) + open (isccor,file=sccorname,status='old',action='read') +c print *,"Processor",myrank," opened file ISCCOR" + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old',action='read') +c print *,"Processor",myrank," opened file IFOURIER" + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old',action='read') +c print *,"Processor",myrank," opened file IELEP" + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old',action='read') +c print *,"Processor",myrank," opened file ISIDEP" +c print *,"Processor",myrank," opened parameter files" +#elif (defined G77) + open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old') + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old') + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old') +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + open (ithep_pdb,file=thetname_pdb,status='old') +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old') +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old') +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old') + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old') + call getenv_loc('SCCORPAR',sccorname) + open (isccor,file=sccorname,status='old') + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old') + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old') + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old') +#else + open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old', + &action='read') + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old',action='read') + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old',action='read') +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + print *,"thetname_pdb ",thetname_pdb + open (ithep_pdb,file=thetname_pdb,status='old',action='read') + print *,ithep_pdb," opened" +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old',action='read') +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old',action='read') +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old',action='read') + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old',action='read') + call getenv_loc('SCCORPAR',sccorname) + open (isccor,file=sccorname,status='old',action='read') + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old',action='read') + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old',action='read') + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old',action='read') +#endif +#ifndef OLDSCP +C +C 8/9/01 In the newest version SCp interaction constants are read from a file +C Use -DOLDSCP to use hard-coded constants instead. +C + call getenv_loc('SCPPAR',scpname) +#if defined(WINIFL) || defined(WINPGI) + open (iscpp,file=scpname,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open (iscpp,file=scpname,status='old',action='read') +#elif (defined G77) + open (iscpp,file=scpname,status='old') +#else + open (iscpp,file=scpname,status='old',action='read') +#endif +#endif + call getenv_loc('PATTERN',patname) +#if defined(WINIFL) || defined(WINPGI) + open (icbase,file=patname,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open (icbase,file=patname,status='old',action='read') +#elif (defined G77) + open (icbase,file=patname,status='old') +#else + open (icbase,file=patname,status='old',action='read') +#endif +#ifdef MPI +C Open output file only for CG processes +c print *,"Processor",myrank," fg_rank",fg_rank + if (fg_rank.eq.0) then + + if (nodes.eq.1) then + npos=3 + else + npos = dlog10(dfloat(nodes-1))+1 + endif + if (npos.lt.3) npos=3 + write (liczba,'(i1)') npos + form = '(bz,i'//liczba(:ilen(liczba))//'.'//liczba(:ilen(liczba)) + & //')' + write (liczba,form) me + outname=prefix(:lenpre)//'.out_'//pot(:lenpot)// + & liczba(:ilen(liczba)) + intname=prefix(:lenpre)//'_'//pot(:lenpot)//liczba(:ilen(liczba)) + & //'.int' + pdbname=prefix(:lenpre)//'_'//pot(:lenpot)//liczba(:ilen(liczba)) + & //'.pdb' + mol2name=prefix(:lenpre)//'_'//pot(:lenpot)// + & liczba(:ilen(liczba))//'.mol2' + statname=prefix(:lenpre)//'_'//pot(:lenpot)// + & liczba(:ilen(liczba))//'.stat' + if (lentmp.gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'//pot(:lenpot) + & //liczba(:ilen(liczba))//'.stat') + rest2name=prefix(:ilen(prefix))//"_"//liczba(:ilen(liczba)) + & //'.rst' + if(usampl) then + qname=prefix(:lenpre)//'_'//pot(:lenpot)// + & liczba(:ilen(liczba))//'.const' + endif + + endif +#else + outname=prefix(:lenpre)//'.out_'//pot(:lenpot) + intname=prefix(:lenpre)//'_'//pot(:lenpot)//'.int' + pdbname=prefix(:lenpre)//'_'//pot(:lenpot)//'.pdb' + mol2name=prefix(:lenpre)//'_'//pot(:lenpot)//'.mol2' + statname=prefix(:lenpre)//'_'//pot(:lenpot)//'.stat' + if (lentmp.gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'//pot(:lenpot) + & //'.stat') + rest2name=prefix(:ilen(prefix))//'.rst' + if(usampl) then + qname=prefix(:lenpre)//'_'//pot(:lenpot)//'.const' + endif +#endif +#if defined(AIX) || defined(PGI) + if (me.eq.king .or. .not. out1file) + & open(iout,file=outname,status='unknown') +c#define DEBUG +#ifdef DEBUG + if (fg_rank.gt.0) then + write (liczba,'(i3.3)') myrank/nfgtasks + write (ll,'(bz,i3.3)') fg_rank + open(iout,file="debug"//liczba(:ilen(liczba))//"."//ll, + & status='unknown') + endif +#endif +c#undef DEBUG + if(me.eq.king) then + open(igeom,file=intname,status='unknown',position='append') + open(ipdb,file=pdbname,status='unknown') + open(imol2,file=mol2name,status='unknown') + open(istat,file=statname,status='unknown',position='append') + else +c1out open(iout,file=outname,status='unknown') + endif +#else + if (me.eq.king .or. .not.out1file) + & open(iout,file=outname,status='unknown') +c#define DEBUG +#ifdef DEBUG + if (fg_rank.gt.0) then + print "Processor",fg_rank," opening output file" + write (liczba,'(i3.3)') myrank/nfgtasks + write (ll,'(bz,i3.3)') fg_rank + open(iout,file="debug"//liczba(:ilen(liczba))//"."//ll, + & status='unknown') + endif +#endif +c#undef DEBUG + if(me.eq.king) then + open(igeom,file=intname,status='unknown',access='append') + open(ipdb,file=pdbname,status='unknown') + open(imol2,file=mol2name,status='unknown') + open(istat,file=statname,status='unknown',access='append') + else +c1out open(iout,file=outname,status='unknown') + endif +#endif +csa csa_rbank=prefix(:lenpre)//'.CSA.rbank' +csa csa_seed=prefix(:lenpre)//'.CSA.seed' +csa csa_history=prefix(:lenpre)//'.CSA.history' +csa csa_bank=prefix(:lenpre)//'.CSA.bank' +csa csa_bank1=prefix(:lenpre)//'.CSA.bank1' +csa csa_alpha=prefix(:lenpre)//'.CSA.alpha' +csa csa_alpha1=prefix(:lenpre)//'.CSA.alpha1' +csac!bankt csa_bankt=prefix(:lenpre)//'.CSA.bankt' +csa csa_int=prefix(:lenpre)//'.int' +csa csa_bank_reminimized=prefix(:lenpre)//'.CSA.bank_reminimized' +csa csa_native_int=prefix(:lenpre)//'.CSA.native.int' +csa csa_in=prefix(:lenpre)//'.CSA.in' +c print *,"Processor",myrank,"fg_rank",fg_rank," opened files" +C Write file names + if (me.eq.king)then + write (iout,'(80(1h-))') + write (iout,'(30x,a)') "FILE ASSIGNMENT" + write (iout,'(80(1h-))') + write (iout,*) "Input file : ", + & pref_orig(:ilen(pref_orig))//'.inp' + write (iout,*) "Output file : ", + & outname(:ilen(outname)) + write (iout,*) + write (iout,*) "Sidechain potential file : ", + & sidename(:ilen(sidename)) +#ifndef OLDSCP + write (iout,*) "SCp potential file : ", + & scpname(:ilen(scpname)) +#endif + write (iout,*) "Electrostatic potential file : ", + & elename(:ilen(elename)) + write (iout,*) "Cumulant coefficient file : ", + & fouriername(:ilen(fouriername)) + write (iout,*) "Torsional parameter file : ", + & torname(:ilen(torname)) + write (iout,*) "Double torsional parameter file : ", + & tordname(:ilen(tordname)) + write (iout,*) "SCCOR parameter file : ", + & sccorname(:ilen(sccorname)) + write (iout,*) "Bond & inertia constant file : ", + & bondname(:ilen(bondname)) + write (iout,*) "Bending parameter file : ", + & thetname(:ilen(thetname)) + write (iout,*) "Rotamer parameter file : ", + & rotname(:ilen(rotname)) + write (iout,*) "Threading database : ", + & patname(:ilen(patname)) + if (lentmp.ne.0) + &write (iout,*)" DIRTMP : ", + & tmpdir(:lentmp) + write (iout,'(80(1h-))') + endif + return + end +c---------------------------------------------------------------------------- + subroutine card_concat(card) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + character*(*) card + character*80 karta,ucase + external ilen + read (inp,'(a)') karta + karta=ucase(karta) + card=' ' + do while (karta(80:80).eq.'&') + card=card(:ilen(card)+1)//karta(:79) + read (inp,'(a)') karta + karta=ucase(karta) + enddo + card=card(:ilen(card)+1)//karta + return + end +c---------------------------------------------------------------------------------- + subroutine readrst + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.MD' + open(irest2,file=rest2name,status='unknown') + read(irest2,*) totT,EK,potE,totE,t_bath + do i=1,2*nres + read(irest2,'(3e15.5)') (d_t(j,i),j=1,3) + enddo + do i=1,2*nres + read(irest2,'(3e15.5)') (dc(j,i),j=1,3) + enddo + if(usampl) then + read (irest2,*) iset + endif + close(irest2) + return + end +c--------------------------------------------------------------------------------- + subroutine read_fragments + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.MD' + include 'COMMON.CONTROL' + read(inp,*) nset,nfrag,npair,nfrag_back + if(me.eq.king.or..not.out1file) + & write(iout,*) "nset",nset," nfrag",nfrag," npair",npair, + & " nfrag_back",nfrag_back + do iset=1,nset + read(inp,*) mset(iset) + do i=1,nfrag + read(inp,*) wfrag(i,iset),ifrag(1,i,iset),ifrag(2,i,iset), + & qinfrag(i,iset) + if(me.eq.king.or..not.out1file) + & write(iout,*) "R ",i,wfrag(i,iset),ifrag(1,i,iset), + & ifrag(2,i,iset), qinfrag(i,iset) + enddo + do i=1,npair + read(inp,*) wpair(i,iset),ipair(1,i,iset),ipair(2,i,iset), + & qinpair(i,iset) + if(me.eq.king.or..not.out1file) + & write(iout,*) "R ",i,wpair(i,iset),ipair(1,i,iset), + & ipair(2,i,iset), qinpair(i,iset) + enddo + do i=1,nfrag_back + read(inp,*) wfrag_back(1,i,iset),wfrag_back(2,i,iset), + & wfrag_back(3,i,iset), + & ifrag_back(1,i,iset),ifrag_back(2,i,iset) + if(me.eq.king.or..not.out1file) + & write(iout,*) "A",i,wfrag_back(1,i,iset),wfrag_back(2,i,iset), + & wfrag_back(3,i,iset),ifrag_back(1,i,iset),ifrag_back(2,i,iset) + enddo + enddo + return + end +c------------------------------------------------------------------------------- + subroutine read_dist_constr + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.SBRIDGE' + integer ifrag_(2,100),ipair_(2,100) + double precision wfrag_(100),wpair_(100) + character*500 controlcard +c write (iout,*) "Calling read_dist_constr" +c write (iout,*) "nres",nres," nstart_sup",nstart_sup," nsup",nsup +c call flush(iout) + call card_concat(controlcard) + call readi(controlcard,"NFRAG",nfrag_,0) + call readi(controlcard,"NPAIR",npair_,0) + call readi(controlcard,"NDIST",ndist_,0) + call reada(controlcard,'DIST_CUT',dist_cut,5.0d0) + call multreadi(controlcard,"IFRAG",ifrag_(1,1),2*nfrag_,0) + call multreadi(controlcard,"IPAIR",ipair_(1,1),2*npair_,0) + call multreada(controlcard,"WFRAG",wfrag_(1),nfrag_,0.0d0) + call multreada(controlcard,"WPAIR",wpair_(1),npair_,0.0d0) +c write (iout,*) "NFRAG",nfrag_," NPAIR",npair_," NDIST",ndist_ +c write (iout,*) "IFRAG" +c do i=1,nfrag_ +c write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i) +c enddo +c write (iout,*) "IPAIR" +c do i=1,npair_ +c write (iout,*) i,ipair_(1,i),ipair_(2,i),wpair_(i) +c enddo + if (.not.refstr .and. nfrag.gt.0) then + write (iout,*) + & "ERROR: no reference structure to compute distance restraints" + write (iout,*) + & "Restraints must be specified explicitly (NDIST=number)" + stop + endif + if (nfrag.lt.2 .and. npair.gt.0) then + write (iout,*) "ERROR: Less than 2 fragments specified", + & " but distance restraints between pairs requested" + stop + endif + call flush(iout) + do i=1,nfrag_ + if (ifrag_(1,i).lt.nstart_sup) ifrag_(1,i)=nstart_sup + if (ifrag_(2,i).gt.nstart_sup+nsup-1) + & ifrag_(2,i)=nstart_sup+nsup-1 +c write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i) + call flush(iout) + if (wfrag_(i).gt.0.0d0) then + do j=ifrag_(1,i),ifrag_(2,i)-1 + do k=j+1,ifrag_(2,i) +c write (iout,*) "j",j," k",k + ddjk=dist(j,k) + if (constr_dist.eq.1) then + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + dhpb(nhpb)=ddjk + forcon(nhpb)=wfrag_(i) + else if (constr_dist.eq.2) then + if (ddjk.le.dist_cut) then + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + dhpb(nhpb)=ddjk + forcon(nhpb)=wfrag_(i) + endif + else + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + dhpb(nhpb)=ddjk + forcon(nhpb)=wfrag_(i)*dexp(-0.5d0*(ddjk/dist_cut)**2) + endif +#ifdef MPI + if (.not.out1file .or. me.eq.king) + & write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#else + write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#endif + enddo + enddo + endif + enddo + do i=1,npair_ + if (wpair_(i).gt.0.0d0) then + ii = ipair_(1,i) + jj = ipair_(2,i) + if (ii.gt.jj) then + itemp=ii + ii=jj + jj=itemp + endif + do j=ifrag_(1,ii),ifrag_(2,ii) + do k=ifrag_(1,jj),ifrag_(2,jj) + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + forcon(nhpb)=wpair_(i) + dhpb(nhpb)=dist(j,k) +#ifdef MPI + if (.not.out1file .or. me.eq.king) + & write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#else + write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#endif + enddo + enddo + endif + enddo + do i=1,ndist_ + read (inp,*) ihpb(nhpb+1),jhpb(nhpb+1),dhpb(i),dhpb1(i), + & ibecarb(i),forcon(nhpb+1) + if (forcon(nhpb+1).gt.0.0d0) then + nhpb=nhpb+1 + if (ibecarb(i).gt.0) then + ihpb(i)=ihpb(i)+nres + jhpb(i)=jhpb(i)+nres + endif + if (dhpb(nhpb).eq.0.0d0) + & dhpb(nhpb)=dist(ihpb(nhpb),jhpb(nhpb)) + endif + enddo +#ifdef MPI + if (.not.out1file .or. me.eq.king) then +#endif + do i=1,nhpb + write (iout,'(a,3i5,2f8.2,i2,f10.1)') "+dist.constr ", + & i,ihpb(i),jhpb(i),dhpb(i),dhpb1(i),ibecarb(i),forcon(i) + enddo + call flush(iout) +#ifdef MPI + endif +#endif + return + end +c------------------------------------------------------------------------------- +#ifdef WINIFL + subroutine flush(iu) + return + end +#endif +#ifdef AIX + subroutine flush(iu) + call flush_(iu) + return + end +#endif +c------------------------------------------------------------------------------ + subroutine copy_to_tmp(source) + include "DIMENSIONS" + include "COMMON.IOUNITS" + character*(*) source + character* 256 tmpfile + integer ilen + external ilen + logical ex + tmpfile=curdir(:ilen(curdir))//"/"//source(:ilen(source)) + inquire(file=tmpfile,exist=ex) + if (ex) then + write (*,*) "Copying ",tmpfile(:ilen(tmpfile)), + & " to temporary directory..." + write (*,*) "/bin/cp "//tmpfile(:ilen(tmpfile))//" "//tmpdir + call system("/bin/cp "//tmpfile(:ilen(tmpfile))//" "//tmpdir) + endif + return + end +c------------------------------------------------------------------------------ + subroutine move_from_tmp(source) + include "DIMENSIONS" + include "COMMON.IOUNITS" + character*(*) source + integer ilen + external ilen + write (*,*) "Moving ",source(:ilen(source)), + & " from temporary directory to working directory" + write (*,*) "/bin/mv "//source(:ilen(source))//" "//curdir + call system("/bin/mv "//source(:ilen(source))//" "//curdir) + return + end +c------------------------------------------------------------------------------ + subroutine random_init(seed) +C +C Initialize random number generator +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef AMD64 + integer*8 iseedi8 +#endif +#ifdef MPI + include 'mpif.h' + logical OKRandom, prng_restart + real*8 r1 + integer iseed_array(4) +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.THREAD' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.MCM' + include 'COMMON.MAP' + include 'COMMON.HEADER' +csa include 'COMMON.CSA' + include 'COMMON.CHAIN' + include 'COMMON.MUCA' + include 'COMMON.MD' + include 'COMMON.FFIELD' + include 'COMMON.SETUP' + iseed=-dint(dabs(seed)) + if (iseed.eq.0) then + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Random seed undefined. The program will stop.' + write (*,'(/80(1h*)/20x,a/80(1h*))') + & 'Random seed undefined. The program will stop.' +#ifdef MPI + call mpi_finalize(mpi_comm_world,ierr) +#endif + stop 'Bad random seed.' + endif +#ifdef MPI + if (fg_rank.eq.0) then + seed=seed*(me+1)+1 +#ifdef AMD64 + iseedi8=dint(seed) + if(me.eq.king .or. .not. out1file) + & write (iout,*) 'MPI: node= ', me, ' iseed= ',iseedi8 + write (*,*) 'MPI: node= ', me, ' iseed= ',iseedi8 + OKRandom = prng_restart(me,iseedi8) +#else + do i=1,4 + tmp=65536.0d0**(4-i) + iseed_array(i) = dint(seed/tmp) + seed=seed-iseed_array(i)*tmp + enddo + if(me.eq.king .or. .not. out1file) + & write (iout,*) 'MPI: node= ', me, ' iseed(4)= ', + & (iseed_array(i),i=1,4) + write (*,*) 'MPI: node= ',me, ' iseed(4)= ', + & (iseed_array(i),i=1,4) + OKRandom = prng_restart(me,iseed_array) +#endif + if (OKRandom) then + r1=ran_number(0.0D0,1.0D0) + if(me.eq.king .or. .not. out1file) + & write (iout,*) 'ran_num',r1 + if (r1.lt.0.0d0) OKRandom=.false. + endif + if (.not.OKRandom) then + write (iout,*) 'PRNG IS NOT WORKING!!!' + print *,'PRNG IS NOT WORKING!!!' + if (me.eq.0) then + call flush(iout) + call mpi_abort(mpi_comm_world,error_msg,ierr) + stop + else + write (iout,*) 'too many processors for parallel prng' + write (*,*) 'too many processors for parallel prng' + call flush(iout) + stop + endif + endif + endif +#else + call vrndst(iseed) + write (iout,*) 'ran_num',ran_number(0.0d0,1.0d0) +#endif + return + end diff --git a/source/unres/src_MD-NEWSC/refsys.f b/source/unres/src_MD-NEWSC/refsys.f new file mode 100644 index 0000000..b57c201 --- /dev/null +++ b/source/unres/src_MD-NEWSC/refsys.f @@ -0,0 +1,60 @@ + subroutine refsys(i2,i3,i4,e1,e2,e3,fail) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +c this subroutine calculates unity vectors of a local reference system +c defined by atoms (i2), (i3), and (i4). the x axis is the axis from +c atom (i3) to atom (i2), and the xy plane is the plane defined by atoms +c (i2), (i3), and (i4). z axis is directed according to the sign of the +c vector product (i3)-(i2) and (i3)-(i4). sets fail to .true. if atoms +c (i2) and (i3) or (i3) and (i4) coincide or atoms (i2), (i3), and (i4) +c form a linear fragment. returns vectors e1, e2, and e3. + logical fail + double precision e1(3),e2(3),e3(3) + double precision u(3),z(3) + include 'COMMON.IOUNITS' + include "COMMON.CHAIN" + data coinc /1.0d-13/,align /1.0d-13/ + fail=.false. + s1=0.0d0 + s2=0.0d0 + do 1 i=1,3 + zi=c(i,i2)-c(i,i3) + ui=c(i,i4)-c(i,i3) + s1=s1+zi*zi + s2=s2+ui*ui + z(i)=zi + 1 u(i)=ui + s1=sqrt(s1) + s2=sqrt(s2) + if (s1.gt.coinc) goto 2 + write (iout,1000) i2,i3,i1 + fail=.true. + return + 2 if (s2.gt.coinc) goto 4 + write(iout,1000) i3,i4,i1 + fail=.true. + return + 4 s1=1.0/s1 + s2=1.0/s2 + v1=z(2)*u(3)-z(3)*u(2) + v2=z(3)*u(1)-z(1)*u(3) + v3=z(1)*u(2)-z(2)*u(1) + anorm=sqrt(v1*v1+v2*v2+v3*v3) + if (anorm.gt.align) goto 6 + write (iout,1010) i2,i3,i4,i1 + fail=.true. + return + 6 anorm=1.0/anorm + e3(1)=v1*anorm + e3(2)=v2*anorm + e3(3)=v3*anorm + e1(1)=z(1)*s1 + e1(2)=z(2)*s1 + e1(3)=z(3)*s1 + e2(1)=e1(3)*e3(2)-e1(2)*e3(3) + e2(2)=e1(1)*e3(3)-e1(3)*e3(1) + e2(3)=e1(2)*e3(1)-e1(1)*e3(2) + 1000 format (/1x,' * * * error - atoms',i4,' and',i4,' coincide.') + 1010 format (/1x,' * * * error - atoms',2(i4,2h, ),i4,' form a linear') + return + end diff --git a/source/unres/src_MD-NEWSC/regularize.F b/source/unres/src_MD-NEWSC/regularize.F new file mode 100644 index 0000000..c506b8a --- /dev/null +++ b/source/unres/src_MD-NEWSC/regularize.F @@ -0,0 +1,76 @@ + subroutine regularize(ncart,etot,rms,cref0,iretcode) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.HEADER' + include 'COMMON.IOUNITS' + include 'COMMON.MINIM' + double precision przes(3),obrot(3,3),fhpb0(maxdim),varia(maxvar) + double precision cref0(3,ncart) + double precision energia(0:n_ene) + logical non_conv + link_end0=link_end + do i=1,nhpb + fhpb0(i)=forcon(i) + enddo + maxit_reg=2 + print *,'Enter REGULARIZE: nnt=',nnt,' nct=',nct,' nsup=',nsup, + & ' nstart_seq=',nstart_seq,' nstart_sup',nstart_sup + write (iout,'(/a/)') 'Initial energies:' + call geom_to_var(nvar,varia) + call chainbuild + call etotal(energia(0)) + etot=energia(0) + call enerprint(energia(0)) + call fitsq(rms,c(1,nstart_seq),cref0(1,nstart_sup-1), + & nsup,przes,obrot,non_conv) + write (iout,'(a,f10.5)') + & 'Enter REGULARIZE: Initial RMS deviation:',dsqrt(dabs(rms)) + write (*,'(a,f10.5)') + & 'Enter REGULARIZE: Initial RMS deviation:',dsqrt(dabs(rms)) + maxit0=maxit + maxfun0=maxfun + rtolf0=rtolf + maxit=100 + maxfun=200 + rtolf=1.0D-2 + do it=1,maxit_reg + print *,'Regularization: pass:',it +C Minimize with distance constraints, gradually relieving the weight. + call minimize(etot,varia,iretcode,nfun) + print *,'Etot=',Etot + if (iretcode.eq.11) return + call fitsq(rms,c(1,nstart_seq),cref0(1,nstart_sup-1), + & nsup,przes,obrot,non_conv) + rms=dsqrt(rms) + write (iout,'(a,i2,a,f10.5,a,1pe14.5,a,i3/)') + & 'Finish pass',it,', RMS deviation:',rms,', energy',etot, + & ' SUMSL convergence',iretcode + do i=nss+1,nhpb + forcon(i)=0.1D0*forcon(i) + enddo + enddo +C Turn off the distance constraints and re-minimize energy. + print *,'Final minimization ... ' + maxit=maxit0 + maxfun=maxfun0 + rtolf=rtolf0 + link_end=min0(link_end,nss) + call minimize(etot,varia,iretcode,nfun) + print *,'Etot=',Etot + call fitsq(rms,c(1,nstart_seq),cref0(1,nstart_sup-1),nsup, + & przes,obrot,non_conv) + rms=dsqrt(rms) + write (iout,'(a,f10.5,a,1pe14.5,a,i3/)') + & 'Final RMS deviation:',rms,' energy',etot,' SUMSL convergence', + & iretcode + link_end=link_end0 + do i=nss+1,nhpb + forcon(i)=fhpb0(i) + enddo + call var_to_geom(nvar,varia) + call chainbuild + return + end diff --git a/source/unres/src_MD-NEWSC/rescode.f b/source/unres/src_MD-NEWSC/rescode.f new file mode 100644 index 0000000..2973ef9 --- /dev/null +++ b/source/unres/src_MD-NEWSC/rescode.f @@ -0,0 +1,32 @@ + integer function rescode(iseq,nam,itype) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + character*3 nam,ucase + + if (itype.eq.0) then + + do i=1,ntyp1 + if (ucase(nam).eq.restyp(i)) then + rescode=i + return + endif + enddo + + else + + do i=1,ntyp1 + if (nam(1:1).eq.onelet(i)) then + rescode=i + return + endif + enddo + + endif + + write (iout,10) iseq,nam + stop + 10 format ('**** Error - residue',i4,' has an unresolved name ',a3) + end + diff --git a/source/unres/src_MD-NEWSC/rmdd.f b/source/unres/src_MD-NEWSC/rmdd.f new file mode 100644 index 0000000..799ab47 --- /dev/null +++ b/source/unres/src_MD-NEWSC/rmdd.f @@ -0,0 +1,159 @@ +c algorithm 611, collected algorithms from acm. +c algorithm appeared in acm-trans. math. software, vol.9, no. 4, +c dec., 1983, p. 503-524. + integer function imdcon(k) +c + integer k +c +c *** return integer machine-dependent constants *** +c +c *** k = 1 means return standard output unit number. *** +c *** k = 2 means return alternate output unit number. *** +c *** k = 3 means return input unit number. *** +c (note -- k = 2, 3 are used only by test programs.) +c +c +++ port version follows... +c external i1mach +c integer i1mach +c integer mdperm(3) +c data mdperm(1)/2/, mdperm(2)/4/, mdperm(3)/1/ +c imdcon = i1mach(mdperm(k)) +c +++ end of port version +++ +c +c +++ non-port version follows... + integer mdcon(3) + data mdcon(1)/6/, mdcon(2)/8/, mdcon(3)/5/ + imdcon = mdcon(k) +c +++ end of non-port version +++ +c + 999 return +c *** last card of imdcon follows *** + end + double precision function rmdcon(k) +c +c *** return machine dependent constants used by nl2sol *** +c +c +++ comments below contain data statements for various machines. +++ +c +++ to convert to another machine, place a c in column 1 of the +++ +c +++ data statement line(s) that correspond to the current machine +++ +c +++ and remove the c from column 1 of the data statement line(s) +++ +c +++ that correspond to the new machine. +++ +c + integer k +c +c *** the constant returned depends on k... +c +c *** k = 1... smallest pos. eta such that -eta exists. +c *** k = 2... square root of eta. +c *** k = 3... unit roundoff = smallest pos. no. machep such +c *** that 1 + machep .gt. 1 .and. 1 - machep .lt. 1. +c *** k = 4... square root of machep. +c *** k = 5... square root of big (see k = 6). +c *** k = 6... largest machine no. big such that -big exists. +c + double precision big, eta, machep + integer bigi(4), etai(4), machei(4) +c/+ + double precision dsqrt +c/ + equivalence (big,bigi(1)), (eta,etai(1)), (machep,machei(1)) +c +c +++ ibm 360, ibm 370, or xerox +++ +c +c data big/z7fffffffffffffff/, eta/z0010000000000000/, +c 1 machep/z3410000000000000/ +c +c +++ data general +++ +c +c data big/0.7237005577d+76/, eta/0.5397605347d-78/, +c 1 machep/2.22044605d-16/ +c +c +++ dec 11 +++ +c +c data big/1.7d+38/, eta/2.938735878d-39/, machep/2.775557562d-17/ +c +c +++ hp3000 +++ +c +c data big/1.157920892d+77/, eta/8.636168556d-78/, +c 1 machep/5.551115124d-17/ +c +c +++ honeywell +++ +c +c data big/1.69d+38/, eta/5.9d-39/, machep/2.1680435d-19/ +c +c +++ dec10 +++ +c +c data big/"377777100000000000000000/, +c 1 eta/"002400400000000000000000/, +c 2 machep/"104400000000000000000000/ +c +c +++ burroughs +++ +c +c data big/o0777777777777777,o7777777777777777/, +c 1 eta/o1771000000000000,o7770000000000000/, +c 2 machep/o1451000000000000,o0000000000000000/ +c +c +++ control data +++ +c +c data big/37767777777777777777b,37167777777777777777b/, +c 1 eta/00014000000000000000b,00000000000000000000b/, +c 2 machep/15614000000000000000b,15010000000000000000b/ +c +c +++ prime +++ +c +c data big/1.0d+9786/, eta/1.0d-9860/, machep/1.4210855d-14/ +c +c +++ univac +++ +c +c data big/8.988d+307/, eta/1.2d-308/, machep/1.734723476d-18/ +c +c +++ vax +++ +c + data big/1.7d+38/, eta/2.939d-39/, machep/1.3877788d-17/ +c +c +++ cray 1 +++ +c +c data bigi(1)/577767777777777777777b/, +c 1 bigi(2)/000007777777777777776b/, +c 2 etai(1)/200004000000000000000b/, +c 3 etai(2)/000000000000000000000b/, +c 4 machei(1)/377224000000000000000b/, +c 5 machei(2)/000000000000000000000b/ +c +c +++ port library -- requires more than just a data statement... +++ +c +c external d1mach +c double precision d1mach, zero +c data big/0.d+0/, eta/0.d+0/, machep/0.d+0/, zero/0.d+0/ +c if (big .gt. zero) go to 1 +c big = d1mach(2) +c eta = d1mach(1) +c machep = d1mach(4) +c1 continue +c +c +++ end of port +++ +c +c------------------------------- body -------------------------------- +c + go to (10, 20, 30, 40, 50, 60), k +c + 10 rmdcon = eta + go to 999 +c + 20 rmdcon = dsqrt(256.d+0*eta)/16.d+0 + go to 999 +c + 30 rmdcon = machep + go to 999 +c + 40 rmdcon = dsqrt(machep) + go to 999 +c + 50 rmdcon = dsqrt(big/256.d+0)*16.d+0 + go to 999 +c + 60 rmdcon = big +c + 999 return +c *** last card of rmdcon follows *** + end diff --git a/source/unres/src_MD-NEWSC/rmsd.F b/source/unres/src_MD-NEWSC/rmsd.F new file mode 100644 index 0000000..52e7b37 --- /dev/null +++ b/source/unres/src_MD-NEWSC/rmsd.F @@ -0,0 +1,140 @@ + subroutine rms_nac_nnc(rms,frac,frac_nn,co,lprn) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.CONTACTS' + include 'COMMON.IOUNITS' + double precision przes(3),obr(3,3) + logical non_conv,lprn +c call fitsq(rms,c(1,nstart_seq),cref(1,nstart_sup),nsup,przes, +c & obr,non_conv) +c rms=dsqrt(rms) + call rmsd(rms) + call contact(.false.,ncont,icont,co) + frac=contact_fract(ncont,ncont_ref,icont,icont_ref) + frac_nn=contact_fract_nn(ncont,ncont_ref,icont,icont_ref) + if (lprn) write (iout,'(a,f8.3/a,f8.3/a,f8.3/a,f8.3)') + & 'RMS deviation from the reference structure:',rms, + & ' % of native contacts:',frac*100, + & ' % of nonnative contacts:',frac_nn*100, + & ' contact order:',co + + return + end +c--------------------------------------------------------------------------- + subroutine rmsd(drms) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.INTERACT' + logical non_conv + double precision przes(3),obrot(3,3) + double precision ccopy(3,maxres2+2),crefcopy(3,maxres2+2) + + iatom=0 +c print *,"nz_start",nz_start," nz_end",nz_end + do i=nz_start,nz_end + iatom=iatom+1 + iti=itype(i) + do k=1,3 + ccopy(k,iatom)=c(k,i+nstart_seq-nstart_sup) + crefcopy(k,iatom)=cref(k,i) + enddo + if (iz_sc.eq.1.and.iti.ne.10) then + iatom=iatom+1 + do k=1,3 + ccopy(k,iatom)=c(k,nres+i+nstart_seq-nstart_sup) + crefcopy(k,iatom)=cref(k,nres+i) + enddo + endif + enddo + +c ----- diagnostics +c write (iout,*) 'Ccopy and CREFcopy' +c print '(i5,3f10.5,5x,3f10.5)',(k,(ccopy(j,k),j=1,3), +c & (crefcopy(j,k),j=1,3),k=1,iatom) +c write (iout,'(i5,3f10.5,5x,3f10.5)') (k,(ccopy(j,k),j=1,3), +c & (crefcopy(j,k),j=1,3),k=1,iatom) +c ----- end diagnostics + + call fitsq(roznica,ccopy(1,1),crefcopy(1,1),iatom, + & przes,obrot,non_conv) + if (non_conv) then + print *,'Problems in FITSQ!!! rmsd' + write (iout,*) 'Problems in FITSQ!!! rmsd' + print *,'Ccopy and CREFcopy' + write (iout,*) 'Ccopy and CREFcopy' + print '(i5,3f10.5,5x,3f10.5)',(k,(ccopy(j,k),j=1,3), + & (crefcopy(j,k),j=1,3),k=1,iatom) + write (iout,'(i5,3f10.5,5x,3f10.5)') (k,(ccopy(j,k),j=1,3), + & (crefcopy(j,k),j=1,3),k=1,iatom) +#ifdef MPI +c call mpi_abort(mpi_comm_world,ierror,ierrcode) + roznica=100.0 +#else + stop +#endif + endif + drms=dsqrt(dabs(roznica)) +c ---- diagnostics +c write (iout,*) "rms",drms +c ---- end diagnostics + return + end + +c-------------------------------------------- + subroutine rmsd_csa(drms) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.INTERACT' + logical non_conv + double precision przes(3),obrot(3,3) + double precision ccopy(3,maxres2+2),crefcopy(3,maxres2+2) + + iatom=0 + do i=nz_start,nz_end + iatom=iatom+1 + iti=itype(i) + do k=1,3 + ccopy(k,iatom)=c(k,i) + crefcopy(k,iatom)=crefjlee(k,i) + enddo + if (iz_sc.eq.1.and.iti.ne.10) then + iatom=iatom+1 + do k=1,3 + ccopy(k,iatom)=c(k,nres+i) + crefcopy(k,iatom)=crefjlee(k,nres+i) + enddo + endif + enddo + + call fitsq(roznica,ccopy(1,1),crefcopy(1,1),iatom, + & przes,obrot,non_conv) + if (non_conv) then + print *,'Problems in FITSQ!!! rmsd_csa' + write (iout,*) 'Problems in FITSQ!!! rmsd_csa' + print *,'Ccopy and CREFcopy' + write (iout,*) 'Ccopy and CREFcopy' + print '(i5,3f10.5,5x,3f10.5)',(k,(ccopy(j,k),j=1,3), + & (crefcopy(j,k),j=1,3),k=1,iatom) + write (iout,'(i5,3f10.5,5x,3f10.5)') (k,(ccopy(j,k),j=1,3), + & (crefcopy(j,k),j=1,3),k=1,iatom) +#ifdef MPI + call mpi_abort(mpi_comm_world,ierror,ierrcode) +#else + stop +#endif + endif + drms=dsqrt(dabs(roznica)) + return + end + diff --git a/source/unres/src_MD-NEWSC/sc_move.F b/source/unres/src_MD-NEWSC/sc_move.F new file mode 100644 index 0000000..b6837fd --- /dev/null +++ b/source/unres/src_MD-NEWSC/sc_move.F @@ -0,0 +1,823 @@ + subroutine sc_move(n_start,n_end,n_maxtry,e_drop, + + n_fun,etot) +c Perform a quick search over side-chain arrangments (over +c residues n_start to n_end) for a given (frozen) CA trace +c Only side-chains are minimized (at most n_maxtry times each), +c not CA positions +c Stops if energy drops by e_drop, otherwise tries all residues +c in the given range +c If there is an energy drop, full minimization may be useful +c n_start, n_end CAN be modified by this routine, but only if +c out of bounds (n_start <= 1, n_end >= nres, n_start < n_end) +c NOTE: this move should never increase the energy +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.HEADER' + include 'COMMON.IOUNITS' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + +c External functions + integer iran_num + external iran_num + +c Input arguments + integer n_start,n_end,n_maxtry + double precision e_drop + +c Output arguments + integer n_fun + double precision etot + +c Local variables + double precision energy(0:n_ene) + double precision cur_alph(2:nres-1),cur_omeg(2:nres-1) + double precision orig_e,cur_e + integer n,n_steps,n_first,n_cur,n_tot,i + double precision orig_w(n_ene) + double precision wtime + + +c Set non side-chain weights to zero (minimization is faster) +c NOTE: e(2) does not actually depend on the side-chain, only CA + orig_w(2)=wscp + orig_w(3)=welec + orig_w(4)=wcorr + orig_w(5)=wcorr5 + orig_w(6)=wcorr6 + orig_w(7)=wel_loc + orig_w(8)=wturn3 + orig_w(9)=wturn4 + orig_w(10)=wturn6 + orig_w(11)=wang + orig_w(13)=wtor + orig_w(14)=wtor_d + orig_w(15)=wvdwpp + + wscp=0.D0 + welec=0.D0 + wcorr=0.D0 + wcorr5=0.D0 + wcorr6=0.D0 + wel_loc=0.D0 + wturn3=0.D0 + wturn4=0.D0 + wturn6=0.D0 + wang=0.D0 + wtor=0.D0 + wtor_d=0.D0 + wvdwpp=0.D0 + +c Make sure n_start, n_end are within proper range + if (n_start.lt.2) n_start=2 + if (n_end.gt.nres-1) n_end=nres-1 +crc if (n_start.lt.n_end) then + if (n_start.gt.n_end) then + n_start=2 + n_end=nres-1 + endif + +c Save the initial values of energy and coordinates +cd call chainbuild +cd call etotal(energy) +cd write (iout,*) 'start sc ene',energy(0) +cd call enerprint(energy(0)) +crc etot=energy(0) + n_fun=0 +crc orig_e=etot +crc cur_e=orig_e +crc do i=2,nres-1 +crc cur_alph(i)=alph(i) +crc cur_omeg(i)=omeg(i) +crc enddo + +ct wtime=MPI_WTIME() +c Try (one by one) all specified residues, starting from a +c random position in sequence +c Stop early if the energy has decreased by at least e_drop + n_tot=n_end-n_start+1 + n_first=iran_num(0,n_tot-1) + n_steps=0 + n=0 +crc do while (n.lt.n_tot .and. orig_e-etot.lt.e_drop) + do while (n.lt.n_tot) + n_cur=n_start+mod(n_first+n,n_tot) + call single_sc_move(n_cur,n_maxtry,e_drop, + + n_steps,n_fun,etot) +c If a lower energy was found, update the current structure... +crc if (etot.lt.cur_e) then +crc cur_e=etot +crc do i=2,nres-1 +crc cur_alph(i)=alph(i) +crc cur_omeg(i)=omeg(i) +crc enddo +crc else +c ...else revert to the previous one +crc etot=cur_e +crc do i=2,nres-1 +crc alph(i)=cur_alph(i) +crc omeg(i)=cur_omeg(i) +crc enddo +crc endif + n=n+1 +cd +cd call chainbuild +cd call etotal(energy) +cd print *,'running',n,energy(0) + enddo + +cd call chainbuild +cd call etotal(energy) +cd write (iout,*) 'end sc ene',energy(0) + +c Put the original weights back to calculate the full energy + wscp=orig_w(2) + welec=orig_w(3) + wcorr=orig_w(4) + wcorr5=orig_w(5) + wcorr6=orig_w(6) + wel_loc=orig_w(7) + wturn3=orig_w(8) + wturn4=orig_w(9) + wturn6=orig_w(10) + wang=orig_w(11) + wtor=orig_w(13) + wtor_d=orig_w(14) + wvdwpp=orig_w(15) + +crc n_fun=n_fun+1 +ct write (iout,*) 'sc_local time= ',MPI_WTIME()-wtime + return + end + +c------------------------------------------------------------- + + subroutine single_sc_move(res_pick,n_maxtry,e_drop, + + n_steps,n_fun,e_sc) +c Perturb one side-chain (res_pick) and minimize the +c neighbouring region, keeping all CA's and non-neighbouring +c side-chains fixed +c Try until e_drop energy improvement is achieved, or n_maxtry +c attempts have been made +c At the start, e_sc should contain the side-chain-only energy(0) +c nsteps and nfun for this move are ADDED to n_steps and n_fun +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.CHAIN' + include 'COMMON.MINIM' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + +c External functions + double precision dist + external dist + +c Input arguments + integer res_pick,n_maxtry + double precision e_drop + +c Input/Output arguments + integer n_steps,n_fun + double precision e_sc + +c Local variables + logical fail + integer i,j + integer nres_moved + integer iretcode,loc_nfun,orig_maxfun,n_try + double precision sc_dist,sc_dist_cutoff + double precision energy(0:n_ene),orig_e,cur_e + double precision evdw,escloc + double precision cur_alph(2:nres-1),cur_omeg(2:nres-1) + double precision var(maxvar) + + double precision orig_theta(1:nres),orig_phi(1:nres), + + orig_alph(1:nres),orig_omeg(1:nres) + + +c Define what is meant by "neighbouring side-chain" + sc_dist_cutoff=5.0D0 + +c Don't do glycine or ends + i=itype(res_pick) + if (i.eq.10 .or. i.eq.21) return + +c Freeze everything (later will relax only selected side-chains) + mask_r=.true. + do i=1,nres + mask_phi(i)=0 + mask_theta(i)=0 + mask_side(i)=0 + enddo + +c Find the neighbours of the side-chain to move +c and save initial variables +crc orig_e=e_sc +crc cur_e=orig_e + nres_moved=0 + do i=2,nres-1 +c Don't do glycine (itype(j)==10) + if (itype(i).ne.10) then + sc_dist=dist(nres+i,nres+res_pick) + else + sc_dist=sc_dist_cutoff + endif + if (sc_dist.lt.sc_dist_cutoff) then + nres_moved=nres_moved+1 + mask_side(i)=1 + cur_alph(i)=alph(i) + cur_omeg(i)=omeg(i) + endif + enddo + + call chainbuild + call egb1(evdw) + call esc(escloc) + e_sc=wsc*evdw+wscloc*escloc +cd call etotal(energy) +cd print *,'new ',(energy(k),k=0,n_ene) + orig_e=e_sc + cur_e=orig_e + + n_try=0 + do while (n_try.lt.n_maxtry .and. orig_e-cur_e.lt.e_drop) +c Move the selected residue (don't worry if it fails) + call gen_side(itype(res_pick),theta(res_pick+1), + + alph(res_pick),omeg(res_pick),fail) + +c Minimize the side-chains starting from the new arrangement + call geom_to_var(nvar,var) + orig_maxfun=maxfun + maxfun=7 + +crc do i=1,nres +crc orig_theta(i)=theta(i) +crc orig_phi(i)=phi(i) +crc orig_alph(i)=alph(i) +crc orig_omeg(i)=omeg(i) +crc enddo + + call minimize_sc1(e_sc,var,iretcode,loc_nfun) + +cv write(*,'(2i3,2f12.5,2i3)') +cv & res_pick,nres_moved,orig_e,e_sc-cur_e, +cv & iretcode,loc_nfun + +c$$$ if (iretcode.eq.8) then +c$$$ write(iout,*)'Coordinates just after code 8' +c$$$ call chainbuild +c$$$ call all_varout +c$$$ call flush(iout) +c$$$ do i=1,nres +c$$$ theta(i)=orig_theta(i) +c$$$ phi(i)=orig_phi(i) +c$$$ alph(i)=orig_alph(i) +c$$$ omeg(i)=orig_omeg(i) +c$$$ enddo +c$$$ write(iout,*)'Coordinates just before code 8' +c$$$ call chainbuild +c$$$ call all_varout +c$$$ call flush(iout) +c$$$ endif + + n_fun=n_fun+loc_nfun + maxfun=orig_maxfun + call var_to_geom(nvar,var) + +c If a lower energy was found, update the current structure... + if (e_sc.lt.cur_e) then +cv call chainbuild +cv call etotal(energy) +cd call egb1(evdw) +cd call esc(escloc) +cd e_sc1=wsc*evdw+wscloc*escloc +cd print *,' new',e_sc1,energy(0) +cv print *,'new ',energy(0) +cd call enerprint(energy(0)) + cur_e=e_sc + do i=2,nres-1 + if (mask_side(i).eq.1) then + cur_alph(i)=alph(i) + cur_omeg(i)=omeg(i) + endif + enddo + else +c ...else revert to the previous one + e_sc=cur_e + do i=2,nres-1 + if (mask_side(i).eq.1) then + alph(i)=cur_alph(i) + omeg(i)=cur_omeg(i) + endif + enddo + endif + n_try=n_try+1 + + enddo + n_steps=n_steps+n_try + +c Reset the minimization mask_r to false + mask_r=.false. + + return + end + +c------------------------------------------------------------- + + subroutine sc_minimize(etot,iretcode,nfun) +c Minimizes side-chains only, leaving backbone frozen +crc implicit none + +c Includes + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + +c Output arguments + double precision etot + integer iretcode,nfun + +c Local variables + integer i + double precision orig_w(n_ene),energy(0:n_ene) + double precision var(maxvar) + + +c Set non side-chain weights to zero (minimization is faster) +c NOTE: e(2) does not actually depend on the side-chain, only CA + orig_w(2)=wscp + orig_w(3)=welec + orig_w(4)=wcorr + orig_w(5)=wcorr5 + orig_w(6)=wcorr6 + orig_w(7)=wel_loc + orig_w(8)=wturn3 + orig_w(9)=wturn4 + orig_w(10)=wturn6 + orig_w(11)=wang + orig_w(13)=wtor + orig_w(14)=wtor_d + + wscp=0.D0 + welec=0.D0 + wcorr=0.D0 + wcorr5=0.D0 + wcorr6=0.D0 + wel_loc=0.D0 + wturn3=0.D0 + wturn4=0.D0 + wturn6=0.D0 + wang=0.D0 + wtor=0.D0 + wtor_d=0.D0 + +c Prepare to freeze backbone + do i=1,nres + mask_phi(i)=0 + mask_theta(i)=0 + mask_side(i)=1 + enddo + +c Minimize the side-chains + mask_r=.true. + call geom_to_var(nvar,var) + call minimize(etot,var,iretcode,nfun) + call var_to_geom(nvar,var) + mask_r=.false. + +c Put the original weights back and calculate the full energy + wscp=orig_w(2) + welec=orig_w(3) + wcorr=orig_w(4) + wcorr5=orig_w(5) + wcorr6=orig_w(6) + wel_loc=orig_w(7) + wturn3=orig_w(8) + wturn4=orig_w(9) + wturn6=orig_w(10) + wang=orig_w(11) + wtor=orig_w(13) + wtor_d=orig_w(14) + + call chainbuild + call etotal(energy) + etot=energy(0) + + return + end + +c------------------------------------------------------------- + subroutine minimize_sc1(etot,x,iretcode,nfun) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.MINIM' + common /srutu/ icall + dimension iv(liv) + double precision minval,x(maxvar),d(maxvar),v(1:lv),xx(maxvar) + double precision energia(0:n_ene) + external func,gradient,fdum + external func_restr1,grad_restr1 + logical not_done,change,reduce + common /przechowalnia/ v + + call deflt(2,iv,liv,lv,v) +* 12 means fresh start, dont call deflt + iv(1)=12 +* max num of fun calls + if (maxfun.eq.0) maxfun=500 + iv(17)=maxfun +* max num of iterations + if (maxmin.eq.0) maxmin=1000 + iv(18)=maxmin +* controls output + iv(19)=2 +* selects output unit +c iv(21)=iout + iv(21)=0 +* 1 means to print out result + iv(22)=0 +* 1 means to print out summary stats + iv(23)=0 +* 1 means to print initial x and d + iv(24)=0 +* min val for v(radfac) default is 0.1 + v(24)=0.1D0 +* max val for v(radfac) default is 4.0 + v(25)=2.0D0 +c v(25)=4.0D0 +* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +* the sumsl default is 0.1 + v(26)=0.1D0 +* false conv if (act fnctn decrease) .lt. v(34) +* the sumsl default is 100*machep + v(34)=v(34)/100.0D0 +* absolute convergence + if (tolf.eq.0.0D0) tolf=1.0D-4 + v(31)=tolf +* relative convergence + if (rtolf.eq.0.0D0) rtolf=1.0D-4 + v(32)=rtolf +* controls initial step size + v(35)=1.0D-1 +* large vals of d correspond to small components of step + do i=1,nphi + d(i)=1.0D-1 + enddo + do i=nphi+1,nvar + d(i)=1.0D-1 + enddo + IF (mask_r) THEN + call x2xx(x,xx,nvar_restr) + call sumsl(nvar_restr,d,xx,func_restr1,grad_restr1, + & iv,liv,lv,v,idum,rdum,fdum) + call xx2x(x,xx) + ELSE + call sumsl(nvar,d,x,func,gradient,iv,liv,lv,v,idum,rdum,fdum) + ENDIF + etot=v(10) + iretcode=iv(1) + nfun=iv(6) + + return + end +************************************************************************ + subroutine func_restr1(n,x,nf,f,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.DERIV' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.FFIELD' + include 'COMMON.INTERACT' + include 'COMMON.TIME1' + common /chuju/ jjj + double precision energia(0:n_ene),evdw,escloc + integer jjj + double precision ufparm,e1,e2 + external ufparm + integer uiparm(1) + real*8 urparm(1) + dimension x(maxvar) + nfl=nf + icg=mod(nf,2)+1 + +#ifdef OSF +c Intercept NaNs in the coordinates, before calling etotal + x_sum=0.D0 + do i=1,n + x_sum=x_sum+x(i) + enddo + FOUND_NAN=.false. + if (x_sum.ne.x_sum) then + write(iout,*)" *** func_restr1 : Found NaN in coordinates" + f=1.0D+73 + FOUND_NAN=.true. + return + endif +#endif + + call var_to_geom_restr(n,x) + call zerograd + call chainbuild +cd write (iout,*) 'ETOTAL called from FUNC' + call egb1(evdw) + call esc(escloc) + f=wsc*evdw+wscloc*escloc +cd call etotal(energia(0)) +cd f=wsc*energia(1)+wscloc*energia(12) +cd print *,f,evdw,escloc,energia(0) +C +C Sum up the components of the Cartesian gradient. +C + do i=1,nct + do j=1,3 + gradx(j,i,icg)=wsc*gvdwx(j,i) + enddo + enddo + + return + end +c------------------------------------------------------- + subroutine grad_restr1(n,x,nf,g,uiparm,urparm,ufparm) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.FFIELD' + include 'COMMON.IOUNITS' + external ufparm + integer uiparm(1) + double precision urparm(1) + dimension x(maxvar),g(maxvar) + + icg=mod(nf,2)+1 + if (nf-nfl+1) 20,30,40 + 20 call func_restr1(n,x,nf,f,uiparm,urparm,ufparm) +c write (iout,*) 'grad 20' + if (nf.eq.0) return + goto 40 + 30 call var_to_geom_restr(n,x) + call chainbuild +C +C Evaluate the derivatives of virtual bond lengths and SC vectors in variables. +C + 40 call cartder +C +C Convert the Cartesian gradient into internal-coordinate gradient. +C + + ig=0 + ind=nres-2 + do i=2,nres-2 + IF (mask_phi(i+2).eq.1) THEN + gphii=0.0D0 + do j=i+1,nres-1 + ind=ind+1 + do k=1,3 + gphii=gphii+dcdv(k+3,ind)*gradc(k,j,icg) + gphii=gphii+dxdv(k+3,ind)*gradx(k,j,icg) + enddo + enddo + ig=ig+1 + g(ig)=gphii + ELSE + ind=ind+nres-1-i + ENDIF + enddo + + + ind=0 + do i=1,nres-2 + IF (mask_theta(i+2).eq.1) THEN + ig=ig+1 + gthetai=0.0D0 + do j=i+1,nres-1 + ind=ind+1 + do k=1,3 + gthetai=gthetai+dcdv(k,ind)*gradc(k,j,icg) + gthetai=gthetai+dxdv(k,ind)*gradx(k,j,icg) + enddo + enddo + g(ig)=gthetai + ELSE + ind=ind+nres-1-i + ENDIF + enddo + + do i=2,nres-1 + if (itype(i).ne.10) then + IF (mask_side(i).eq.1) THEN + ig=ig+1 + galphai=0.0D0 + do k=1,3 + galphai=galphai+dxds(k,i)*gradx(k,i,icg) + enddo + g(ig)=galphai + ENDIF + endif + enddo + + + do i=2,nres-1 + if (itype(i).ne.10) then + IF (mask_side(i).eq.1) THEN + ig=ig+1 + gomegai=0.0D0 + do k=1,3 + gomegai=gomegai+dxds(k+3,i)*gradx(k,i,icg) + enddo + g(ig)=gomegai + ENDIF + endif + enddo + +C +C Add the components corresponding to local energy terms. +C + + ig=0 + igall=0 + do i=4,nres + igall=igall+1 + if (mask_phi(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + enddo + + do i=3,nres + igall=igall+1 + if (mask_theta(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + enddo + + do ij=1,2 + do i=2,nres-1 + if (itype(i).ne.10) then + igall=igall+1 + if (mask_side(i).eq.1) then + ig=ig+1 + g(ig)=g(ig)+gloc(igall,icg) + endif + endif + enddo + enddo + +cd do i=1,ig +cd write (iout,'(a2,i5,a3,f25.8)') 'i=',i,' g=',g(i) +cd enddo + return + end +C----------------------------------------------------------------------------- + subroutine egb1(evdw) +C +C This subroutine calculates the interaction energy of nonbonded side chains +C assuming the Gay-Berne potential of interaction. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.LOCAL' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.NAMES' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' + include 'COMMON.CONTROL' + logical lprn + evdw=0.0D0 +c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon + evdw=0.0D0 + lprn=.false. +c if (icall.eq.0) lprn=.true. + ind=0 + do i=iatsc_s,iatsc_e + + + itypi=itype(i) + itypi1=itype(i+1) + xi=c(1,nres+i) + yi=c(2,nres+i) + zi=c(3,nres+i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) + dsci_inv=dsc_inv(itypi) +C +C Calculate SC interaction energy. +C + do iint=1,nint_gr(i) + do j=istart(i,iint),iend(i,iint) + IF (mask_side(j).eq.1.or.mask_side(i).eq.1) THEN + ind=ind+1 + itypj=itype(j) + dscj_inv=dsc_inv(itypj) + sig0ij=sigma(itypi,itypj) + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) +C For diagnostics only!!! +c chi1=0.0D0 +c chi2=0.0D0 +c chi12=0.0D0 +c chip1=0.0D0 +c chip2=0.0D0 +c chip12=0.0D0 +c alf1=0.0D0 +c alf2=0.0D0 +c alf12=0.0D0 + xj=c(1,nres+j)-xi + yj=c(2,nres+j)-yi + zj=c(3,nres+j)-zi + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) +C Calculate angle-dependent terms of energy and contributions to their +C derivatives. + call sc_angular + sigsq=1.0D0/sigsq + sig=sig0ij*dsqrt(sigsq) + rij_shift=1.0D0/rij-sig+sig0ij +C I hate to put IF's in the loops, but here don't have another choice!!!! + if (rij_shift.le.0.0D0) then + evdw=1.0D20 +cd write (iout,'(2(a3,i3,2x),17(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & rij_shift,1.0D0/rij,sig,sig0ij,sigsq,1-dsqrt(sigsq) + return + endif + sigder=-sig*sigsq +c--------------------------------------------------------------- + rij_shift=1.0D0/rij_shift + fac=rij_shift**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + evdwij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=evdwij*eps3rt + eps3der=evdwij*eps2rt + evdwij=evdwij*eps2rt*eps3rt + evdw=evdw+evdwij + if (lprn) then + sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +cd write (iout,'(2(a3,i3,2x),17(0pf7.3))') +cd & restyp(itypi),i,restyp(itypj),j, +cd & epsi,sigm,chi1,chi2,chip1,chip2, +cd & eps1,eps2rt**2,eps3rt**2,sig,sig0ij, +cd & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, +cd & evdwij + endif + + if (energy_dec) write (iout,'(a6,2i5,0pf7.3)') + & 'evdw',i,j,evdwij + +C Calculate gradient components. + e1=e1*eps1*eps2rt**2*eps3rt**2 + fac=-expon*(e1+evdwij)*rij_shift + sigder=fac*sigder + fac=rij*fac +C Calculate the radial part of the gradient + gg(1)=xj*fac + gg(2)=yj*fac + gg(3)=zj*fac +C Calculate angular part of the gradient. + call sc_grad + ENDIF + enddo ! j + enddo ! iint + enddo ! i + end +C----------------------------------------------------------------------------- diff --git a/source/unres/src_MD-NEWSC/sizes.i b/source/unres/src_MD-NEWSC/sizes.i new file mode 100644 index 0000000..45c44ff --- /dev/null +++ b/source/unres/src_MD-NEWSC/sizes.i @@ -0,0 +1,83 @@ +c +c +c ################################################### +c ## COPYRIGHT (C) 1992 by Jay William Ponder ## +c ## All Rights Reserved ## +c ################################################### +c +c ############################################################# +c ## ## +c ## sizes.i -- parameter values to set array dimensions ## +c ## ## +c ############################################################# +c +c +c "sizes.i" sets values for critical array dimensions used +c throughout the software; these parameters will fix the size +c of the largest systems that can be handled; values too large +c for the computer's memory and/or swap space to accomodate +c will result in poor performance or outright failure +c +c parameter: maximum allowed number of: +c +c maxatm atoms in the molecular system +c maxval atoms directly bonded to an atom +c maxgrp user-defined groups of atoms +c maxtyp force field atom type definitions +c maxclass force field atom class definitions +c maxkey lines in the keyword file +c maxrot bonds for torsional rotation +c maxvar optimization variables (vector storage) +c maxopt optimization variables (matrix storage) +c maxhess off-diagonal Hessian elements +c maxlight sites for method of lights neighbors +c maxvib vibrational frequencies +c maxgeo distance geometry points +c maxcell unit cells in replicated crystal +c maxring 3-, 4-, or 5-membered rings +c maxfix geometric restraints +c maxbio biopolymer atom definitions +c maxres residues in the macromolecule +c maxamino amino acid residue types +c maxnuc nucleic acid residue types +c maxbnd covalent bonds in molecular system +c maxang bond angles in molecular system +c maxtors torsional angles in molecular system +c maxpi atoms in conjugated pisystem +c maxpib covalent bonds involving pisystem +c maxpit torsional angles involving pisystem +c +c + integer maxatm,maxval,maxgrp + integer maxtyp,maxclass,maxkey + integer maxrot,maxopt + integer maxhess,maxlight,maxvib + integer maxgeo,maxcell,maxring + integer maxfix,maxbio + integer maxamino,maxnuc,maxbnd + integer maxang,maxtors,maxpi + integer maxpib,maxpit + parameter (maxatm=maxres2) + parameter (maxval=8) + parameter (maxgrp=1000) + parameter (maxtyp=3000) + parameter (maxclass=500) + parameter (maxkey=10000) + parameter (maxrot=1000) + parameter (maxopt=1000) + parameter (maxhess=1000000) + parameter (maxlight=8*maxatm) + parameter (maxvib=1000) + parameter (maxgeo=1000) + parameter (maxcell=10000) + parameter (maxring=10000) + parameter (maxfix=10000) + parameter (maxbio=10000) + parameter (maxamino=31) + parameter (maxnuc=12) + parameter (maxbnd=2*maxatm) + parameter (maxang=3*maxatm) + parameter (maxtors=4*maxatm) + parameter (maxpi=100) + parameter (maxpib=2*maxpi) + parameter (maxpit=4*maxpi) diff --git a/source/unres/src_MD-NEWSC/sort.f b/source/unres/src_MD-NEWSC/sort.f new file mode 100644 index 0000000..46b43d9 --- /dev/null +++ b/source/unres/src_MD-NEWSC/sort.f @@ -0,0 +1,589 @@ +c +c +c ################################################### +c ## COPYRIGHT (C) 1990 by Jay William Ponder ## +c ## All Rights Reserved ## +c ################################################### +c +c ######################################################### +c ## ## +c ## subroutine sort -- heapsort of an integer array ## +c ## ## +c ######################################################### +c +c +c "sort" takes an input list of integers and sorts it +c into ascending order using the Heapsort algorithm +c +c + subroutine sort (n,list) + implicit none + integer i,j,k,n + integer index,lists + integer list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end +c +c +c ############################################################## +c ## ## +c ## subroutine sort2 -- heapsort of real array with keys ## +c ## ## +c ############################################################## +c +c +c "sort2" takes an input list of reals and sorts it +c into ascending order using the Heapsort algorithm; +c it also returns a key into the original ordering +c +c + subroutine sort2 (n,list,key) + implicit none + integer i,j,k,n + integer index,keys + integer key(*) + real*8 lists + real*8 list(*) +c +c +c initialize index into the original ordering +c + do i = 1, n + key(i) = i + end do +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + keys = key(k) + else + lists = list(index) + keys = key(index) + list(index) = list(1) + key(index) = key(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + key(1) = keys + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + key(i) = key(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + key(i) = keys + end do + return + end +c +c +c ################################################################# +c ## ## +c ## subroutine sort3 -- heapsort of integer array with keys ## +c ## ## +c ################################################################# +c +c +c "sort3" takes an input list of integers and sorts it +c into ascending order using the Heapsort algorithm; +c it also returns a key into the original ordering +c +c + subroutine sort3 (n,list,key) + implicit none + integer i,j,k,n + integer index + integer lists + integer keys + integer list(*) + integer key(*) +c +c +c initialize index into the original ordering +c + do i = 1, n + key(i) = i + end do +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + keys = key(k) + else + lists = list(index) + keys = key(index) + list(index) = list(1) + key(index) = key(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + key(1) = keys + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + key(i) = key(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + key(i) = keys + end do + return + end +c +c +c ################################################################# +c ## ## +c ## subroutine sort4 -- heapsort of integer absolute values ## +c ## ## +c ################################################################# +c +c +c "sort4" takes an input list of integers and sorts it into +c ascending absolute value using the Heapsort algorithm +c +c + subroutine sort4 (n,list) + implicit none + integer i,j,k,n + integer index + integer lists + integer list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (abs(list(j)) .lt. abs(list(j+1))) j = j + 1 + end if + if (abs(lists) .lt. abs(list(j))) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end +c +c +c ################################################################ +c ## ## +c ## subroutine sort5 -- heapsort of integer array modulo m ## +c ## ## +c ################################################################ +c +c +c "sort5" takes an input list of integers and sorts it +c into ascending order based on each value modulo "m" +c +c + subroutine sort5 (n,list,m) + implicit none + integer i,j,k,m,n + integer index,smod + integer jmod,j1mod + integer lists + integer list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + jmod = mod(list(j),m) + j1mod = mod(list(j+1),m) + if (jmod .lt. j1mod) then + j = j + 1 + else if (jmod.eq.j1mod .and. list(j).lt.list(j+1)) then + j = j + 1 + end if + end if + smod = mod(lists,m) + jmod = mod(list(j),m) + if (smod .lt. jmod) then + list(i) = list(j) + i = j + j = j + j + else if (smod.eq.jmod .and. lists.lt.list(j)) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end +c +c +c ############################################################# +c ## ## +c ## subroutine sort6 -- heapsort of a text string array ## +c ## ## +c ############################################################# +c +c +c "sort6" takes an input list of character strings and sorts +c it into alphabetical order using the Heapsort algorithm +c +c + subroutine sort6 (n,list) + implicit none + integer i,j,k,n + integer index + character*256 lists + character*(*) list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end +c +c +c ################################################################ +c ## ## +c ## subroutine sort7 -- heapsort of text strings with keys ## +c ## ## +c ################################################################ +c +c +c "sort7" takes an input list of character strings and sorts it +c into alphabetical order using the Heapsort algorithm; it also +c returns a key into the original ordering +c +c + subroutine sort7 (n,list,key) + implicit none + integer i,j,k,n + integer index + integer keys + integer key(*) + character*256 lists + character*(*) list(*) +c +c +c initialize index into the original ordering +c + do i = 1, n + key(i) = i + end do +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + keys = key(k) + else + lists = list(index) + keys = key(index) + list(index) = list(1) + key(index) = key(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists + key(1) = keys + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + key(i) = key(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + key(i) = keys + end do + return + end +c +c +c ######################################################### +c ## ## +c ## subroutine sort8 -- heapsort to unique integers ## +c ## ## +c ######################################################### +c +c +c "sort8" takes an input list of integers and sorts it into +c ascending order using the Heapsort algorithm, duplicate +c values are removed from the final sorted list +c +c + subroutine sort8 (n,list) + implicit none + integer i,j,k,n + integer index + integer lists + integer list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists +c +c remove duplicate values from final list +c + j = 1 + do i = 2, n + if (list(i-1) .ne. list(i)) then + j = j + 1 + list(j) = list(i) + end if + end do + if (j .lt. n) n = j + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end +c +c +c ############################################################# +c ## ## +c ## subroutine sort9 -- heapsort to unique text strings ## +c ## ## +c ############################################################# +c +c +c "sort9" takes an input list of character strings and sorts +c it into alphabetical order using the Heapsort algorithm, +c duplicate values are removed from the final sorted list +c +c + subroutine sort9 (n,list) + implicit none + integer i,j,k,n + integer index + character*256 lists + character*(*) list(*) +c +c +c perform the heapsort of the input list +c + k = n/2 + 1 + index = n + dowhile (n .gt. 1) + if (k .gt. 1) then + k = k - 1 + lists = list(k) + else + lists = list(index) + list(index) = list(1) + index = index - 1 + if (index .le. 1) then + list(1) = lists +c +c remove duplicate values from final list +c + j = 1 + do i = 2, n + if (list(i-1) .ne. list(i)) then + j = j + 1 + list(j) = list(i) + end if + end do + if (j .lt. n) n = j + return + end if + end if + i = k + j = k + k + dowhile (j .le. index) + if (j .lt. index) then + if (list(j) .lt. list(j+1)) j = j + 1 + end if + if (lists .lt. list(j)) then + list(i) = list(j) + i = j + j = j + j + else + j = index + 1 + end if + end do + list(i) = lists + end do + return + end diff --git a/source/unres/src_MD-NEWSC/ssMD.F b/source/unres/src_MD-NEWSC/ssMD.F new file mode 100644 index 0000000..eab3c70 --- /dev/null +++ b/source/unres/src_MD-NEWSC/ssMD.F @@ -0,0 +1,1951 @@ +c---------------------------------------------------------------------------- + subroutine check_energies +c implicit none + +c Includes + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.SBRIDGE' + include 'COMMON.LOCAL' + include 'COMMON.GEO' + +c External functions + double precision ran_number + external ran_number + +c Local variables + integer i,j,k,l,lmax,p,pmax + double precision rmin,rmax + double precision eij + + double precision d + double precision wi,rij,tj,pj + + +c return + + i=5 + j=14 + + d=dsc(1) + rmin=2.0D0 + rmax=12.0D0 + + lmax=10000 + pmax=1 + + do k=1,3 + c(k,i)=0.0D0 + c(k,j)=0.0D0 + c(k,nres+i)=0.0D0 + c(k,nres+j)=0.0D0 + enddo + + do l=1,lmax + +ct wi=ran_number(0.0D0,pi) +c wi=ran_number(0.0D0,pi/6.0D0) +c wi=0.0D0 +ct tj=ran_number(0.0D0,pi) +ct pj=ran_number(0.0D0,pi) +c pj=ran_number(0.0D0,pi/6.0D0) +c pj=0.0D0 + + do p=1,pmax +ct rij=ran_number(rmin,rmax) + + c(1,j)=d*sin(pj)*cos(tj) + c(2,j)=d*sin(pj)*sin(tj) + c(3,j)=d*cos(pj) + + c(3,nres+i)=-rij + + c(1,i)=d*sin(wi) + c(3,i)=-rij-d*cos(wi) + + do k=1,3 + dc(k,nres+i)=c(k,nres+i)-c(k,i) + dc_norm(k,nres+i)=dc(k,nres+i)/d + dc(k,nres+j)=c(k,nres+j)-c(k,j) + dc_norm(k,nres+j)=dc(k,nres+j)/d + enddo + + call dyn_ssbond_ene(i,j,eij) + enddo + enddo + + call exit(1) + + return + end + +C----------------------------------------------------------------------------- + + subroutine dyn_ssbond_ene(resi,resj,eij) +c implicit none + +c Includes + include 'DIMENSIONS' + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.CALC' +#ifndef CLUST +#ifndef WHAM + include 'COMMON.MD' +#endif +#endif + +c External functions + double precision h_base + external h_base + +c Input arguments + integer resi,resj + +c Output arguments + double precision eij + +c Local variables + logical havebond +c integer itypi,itypj,k,l + double precision rrij,ssd,deltat1,deltat2,deltat12,cosphi + double precision sig0ij,ljd,sig,fac,e1,e2 + double precision dcosom1(3),dcosom2(3),ed + double precision pom1,pom2 + double precision ljA,ljB,ljXs + double precision d_ljB(1:3) + double precision ssA,ssB,ssC,ssXs + double precision ssxm,ljxm,ssm,ljm + double precision d_ssxm(1:3),d_ljxm(1:3),d_ssm(1:3),d_ljm(1:3) + double precision f1,f2,h1,h2,hd1,hd2 + double precision omega,delta_inv,deltasq_inv,fac1,fac2 +c-------FIRST METHOD + double precision xm,d_xm(1:3) +c-------END FIRST METHOD +c-------SECOND METHOD +c$$$ double precision ss,d_ss(0:3),ljf,d_ljf(0:3) +c-------END SECOND METHOD + +c-------TESTING CODE + logical checkstop,transgrad + common /sschecks/ checkstop,transgrad + + integer icheck,nicheck,jcheck,njcheck + double precision echeck(-1:1),deps,ssx0,ljx0 +c-------END TESTING CODE + + + i=resi + j=resj + + itypi=itype(i) + dxi=dc_norm(1,nres+i) + dyi=dc_norm(2,nres+i) + dzi=dc_norm(3,nres+i) + dsci_inv=vbld_inv(i+nres) + + itypj=itype(j) + xj=c(1,nres+j)-c(1,nres+i) + yj=c(2,nres+j)-c(2,nres+i) + zj=c(3,nres+j)-c(3,nres+i) + dxj=dc_norm(1,nres+j) + dyj=dc_norm(2,nres+j) + dzj=dc_norm(3,nres+j) + dscj_inv=vbld_inv(j+nres) + + chi1=chi(itypi,itypj) + chi2=chi(itypj,itypi) + chi12=chi1*chi2 + chip1=chip(itypi) + chip2=chip(itypj) + chip12=chip1*chip2 + alf1=alp(itypi) + alf2=alp(itypj) + alf12=0.5D0*(alf1+alf2) + + rrij=1.0D0/(xj*xj+yj*yj+zj*zj) + rij=dsqrt(rrij) ! sc_angular needs rij to really be the inverse +c The following are set in sc_angular +c erij(1)=xj*rij +c erij(2)=yj*rij +c erij(3)=zj*rij +c om1=dxi*erij(1)+dyi*erij(2)+dzi*erij(3) +c om2=dxj*erij(1)+dyj*erij(2)+dzj*erij(3) +c om12=dxi*dxj+dyi*dyj+dzi*dzj + call sc_angular + rij=1.0D0/rij ! Reset this so it makes sense + + sig0ij=sigma(itypi,itypj) + sig=sig0ij*dsqrt(1.0D0/sigsq) + + ljXs=sig-sig0ij + ljA=eps1*eps2rt**2*eps3rt**2 + ljB=ljA*bb(itypi,itypj) + ljA=ljA*aa(itypi,itypj) + ljxm=ljXs+(-2.0D0*aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) + + ssXs=d0cm + deltat1=1.0d0-om1 + deltat2=1.0d0+om2 + deltat12=om2-om1+2.0d0 + cosphi=om12-om1*om2 + ssA=akcm + ssB=akct*deltat12 + ssC=ss_depth + & +akth*(deltat1*deltat1+deltat2*deltat2) + & +v1ss*cosphi+v2ss*cosphi*cosphi+v3ss*cosphi*cosphi*cosphi + ssxm=ssXs-0.5D0*ssB/ssA + +c-------TESTING CODE +c$$$c Some extra output +c$$$ ssm=ssC-0.25D0*ssB*ssB/ssA +c$$$ ljm=-0.25D0*ljB*bb(itypi,itypj)/aa(itypi,itypj) +c$$$ ssx0=ssB*ssB-4.0d0*ssA*ssC +c$$$ if (ssx0.gt.0.0d0) then +c$$$ ssx0=ssXs+0.5d0*(-ssB+sqrt(ssx0))/ssA +c$$$ else +c$$$ ssx0=ssxm +c$$$ endif +c$$$ ljx0=ljXs+(-aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +c$$$ write(iout,'(a,4f8.2,2f15.2,3f6.2)')"SSENERGIES ", +c$$$ & ssxm,ljxm,ssx0,ljx0,ssm,ljm,om1,om2,om12 +c$$$ return +c-------END TESTING CODE + +c-------TESTING CODE +c Stop and plot energy and derivative as a function of distance + if (checkstop) then + ssm=ssC-0.25D0*ssB*ssB/ssA + ljm=-0.25D0*ljB*bb(itypi,itypj)/aa(itypi,itypj) + if (ssm.lt.ljm .and. + & dabs(rij-0.5d0*(ssxm+ljxm)).lt.0.35d0*(ljxm-ssxm)) then + nicheck=1000 + njcheck=1 + deps=0.5d-7 + else + checkstop=.false. + endif + endif + if (.not.checkstop) then + nicheck=0 + njcheck=-1 + endif + + do icheck=0,nicheck + do jcheck=-1,njcheck + if (checkstop) rij=(ssxm-1.0d0)+ + & ((ljxm-ssxm+2.0d0)*icheck)/nicheck+jcheck*deps +c-------END TESTING CODE + + if (rij.gt.ljxm) then + havebond=.false. + ljd=rij-ljXs + fac=(1.0D0/ljd)**expon + e1=fac*fac*aa(itypi,itypj) + e2=fac*bb(itypi,itypj) + eij=eps1*eps2rt*eps3rt*(e1+e2) + eps2der=eij*eps3rt + eps3der=eij*eps2rt + eij=eij*eps2rt*eps3rt + + sigder=-sig/sigsq + e1=e1*eps1*eps2rt**2*eps3rt**2 + ed=-expon*(e1+eij)/ljd + sigder=ed*sigder + eom1=eps2der*eps2rt_om1-2.0D0*alf1*eps3der+sigder*sigsq_om1 + eom2=eps2der*eps2rt_om2+2.0D0*alf2*eps3der+sigder*sigsq_om2 + eom12=eij*eps1_om12+eps2der*eps2rt_om12 + & -2.0D0*alf12*eps3der+sigder*sigsq_om12 + else if (rij.lt.ssxm) then + havebond=.true. + ssd=rij-ssXs + eij=ssA*ssd*ssd+ssB*ssd+ssC + + ed=2*akcm*ssd+akct*deltat12 + pom1=akct*ssd + pom2=v1ss+2*v2ss*cosphi+3*v3ss*cosphi*cosphi + eom1=-2*akth*deltat1-pom1-om2*pom2 + eom2= 2*akth*deltat2+pom1-om1*pom2 + eom12=pom2 + else + omega=v1ss+2.0d0*v2ss*cosphi+3.0d0*v3ss*cosphi*cosphi + + d_ssxm(1)=0.5D0*akct/ssA + d_ssxm(2)=-d_ssxm(1) + d_ssxm(3)=0.0D0 + + d_ljxm(1)=sig0ij/sqrt(sigsq**3) + d_ljxm(2)=d_ljxm(1)*sigsq_om2 + d_ljxm(3)=d_ljxm(1)*sigsq_om12 + d_ljxm(1)=d_ljxm(1)*sigsq_om1 + +c-------FIRST METHOD, DISCONTINUOUS SECOND DERIVATIVE + xm=0.5d0*(ssxm+ljxm) + do k=1,3 + d_xm(k)=0.5d0*(d_ssxm(k)+d_ljxm(k)) + enddo + if (rij.lt.xm) then + havebond=.true. + ssm=ssC-0.25D0*ssB*ssB/ssA + d_ssm(1)=0.5D0*akct*ssB/ssA + d_ssm(2)=2.0D0*akth*deltat2-om1*omega-d_ssm(1) + d_ssm(1)=-2.0D0*akth*deltat1-om2*omega+d_ssm(1) + d_ssm(3)=omega + f1=(rij-xm)/(ssxm-xm) + f2=(rij-ssxm)/(xm-ssxm) + h1=h_base(f1,hd1) + h2=h_base(f2,hd2) + eij=ssm*h1+Ht*h2 + delta_inv=1.0d0/(xm-ssxm) + deltasq_inv=delta_inv*delta_inv + fac=ssm*hd1-Ht*hd2 + fac1=deltasq_inv*fac*(xm-rij) + fac2=deltasq_inv*fac*(rij-ssxm) + ed=delta_inv*(Ht*hd2-ssm*hd1) + eom1=fac1*d_ssxm(1)+fac2*d_xm(1)+h1*d_ssm(1) + eom2=fac1*d_ssxm(2)+fac2*d_xm(2)+h1*d_ssm(2) + eom12=fac1*d_ssxm(3)+fac2*d_xm(3)+h1*d_ssm(3) + else + havebond=.false. + ljm=-0.25D0*ljB*bb(itypi,itypj)/aa(itypi,itypj) + d_ljm(1)=-0.5D0*bb(itypi,itypj)/aa(itypi,itypj)*ljB + d_ljm(2)=d_ljm(1)*(0.5D0*eps2rt_om2/eps2rt+alf2/eps3rt) + d_ljm(3)=d_ljm(1)*(0.5D0*eps1_om12+0.5D0*eps2rt_om12/eps2rt- + + alf12/eps3rt) + d_ljm(1)=d_ljm(1)*(0.5D0*eps2rt_om1/eps2rt-alf1/eps3rt) + f1=(rij-ljxm)/(xm-ljxm) + f2=(rij-xm)/(ljxm-xm) + h1=h_base(f1,hd1) + h2=h_base(f2,hd2) + eij=Ht*h1+ljm*h2 + delta_inv=1.0d0/(ljxm-xm) + deltasq_inv=delta_inv*delta_inv + fac=Ht*hd1-ljm*hd2 + fac1=deltasq_inv*fac*(ljxm-rij) + fac2=deltasq_inv*fac*(rij-xm) + ed=delta_inv*(ljm*hd2-Ht*hd1) + eom1=fac1*d_xm(1)+fac2*d_ljxm(1)+h2*d_ljm(1) + eom2=fac1*d_xm(2)+fac2*d_ljxm(2)+h2*d_ljm(2) + eom12=fac1*d_xm(3)+fac2*d_ljxm(3)+h2*d_ljm(3) + endif +c-------END FIRST METHOD, DISCONTINUOUS SECOND DERIVATIVE + +c-------SECOND METHOD, CONTINUOUS SECOND DERIVATIVE +c$$$ ssd=rij-ssXs +c$$$ ljd=rij-ljXs +c$$$ fac1=rij-ljxm +c$$$ fac2=rij-ssxm +c$$$ +c$$$ d_ljB(1)=ljB*(eps2rt_om1/eps2rt-2.0d0*alf1/eps3rt) +c$$$ d_ljB(2)=ljB*(eps2rt_om2/eps2rt+2.0d0*alf2/eps3rt) +c$$$ d_ljB(3)=ljB*(eps1_om12+eps2rt_om12/eps2rt-2.0d0*alf12/eps3rt) +c$$$ +c$$$ ssm=ssC-0.25D0*ssB*ssB/ssA +c$$$ d_ssm(1)=0.5D0*akct*ssB/ssA +c$$$ d_ssm(2)=2.0D0*akth*deltat2-om1*omega-d_ssm(1) +c$$$ d_ssm(1)=-2.0D0*akth*deltat1-om2*omega+d_ssm(1) +c$$$ d_ssm(3)=omega +c$$$ +c$$$ ljm=-0.25D0*bb(itypi,itypj)/aa(itypi,itypj) +c$$$ do k=1,3 +c$$$ d_ljm(k)=ljm*d_ljB(k) +c$$$ enddo +c$$$ ljm=ljm*ljB +c$$$ +c$$$ ss=ssA*ssd*ssd+ssB*ssd+ssC +c$$$ d_ss(0)=2.0d0*ssA*ssd+ssB +c$$$ d_ss(2)=akct*ssd +c$$$ d_ss(1)=-d_ss(2)-2.0d0*akth*deltat1-om2*omega +c$$$ d_ss(2)=d_ss(2)+2.0d0*akth*deltat2-om1*omega +c$$$ d_ss(3)=omega +c$$$ +c$$$ ljf=bb(itypi,itypj)/aa(itypi,itypj) +c$$$ ljf=9.0d0*ljf*(-0.5d0*ljf)**(1.0d0/3.0d0) +c$$$ d_ljf(0)=ljf*2.0d0*ljB*fac1 +c$$$ do k=1,3 +c$$$ d_ljf(k)=d_ljm(k)+ljf*(d_ljB(k)*fac1*fac1- +c$$$ & 2.0d0*ljB*fac1*d_ljxm(k)) +c$$$ enddo +c$$$ ljf=ljm+ljf*ljB*fac1*fac1 +c$$$ +c$$$ f1=(rij-ljxm)/(ssxm-ljxm) +c$$$ f2=(rij-ssxm)/(ljxm-ssxm) +c$$$ h1=h_base(f1,hd1) +c$$$ h2=h_base(f2,hd2) +c$$$ eij=ss*h1+ljf*h2 +c$$$ delta_inv=1.0d0/(ljxm-ssxm) +c$$$ deltasq_inv=delta_inv*delta_inv +c$$$ fac=ljf*hd2-ss*hd1 +c$$$ ed=d_ss(0)*h1+d_ljf(0)*h2+delta_inv*fac +c$$$ eom1=d_ss(1)*h1+d_ljf(1)*h2+deltasq_inv*fac* +c$$$ & (fac1*d_ssxm(1)-fac2*(d_ljxm(1))) +c$$$ eom2=d_ss(2)*h1+d_ljf(2)*h2+deltasq_inv*fac* +c$$$ & (fac1*d_ssxm(2)-fac2*(d_ljxm(2))) +c$$$ eom12=d_ss(3)*h1+d_ljf(3)*h2+deltasq_inv*fac* +c$$$ & (fac1*d_ssxm(3)-fac2*(d_ljxm(3))) +c$$$ +c$$$ havebond=.false. +c$$$ if (ed.gt.0.0d0) havebond=.true. +c-------END SECOND METHOD, CONTINUOUS SECOND DERIVATIVE + + endif + + if (havebond) then +#ifndef CLUST +#ifndef WHAM +c if (dyn_ssbond_ij(i,j).eq.1.0d300) then +c write(iout,'(a15,f12.2,f8.1,2i5)') +c & "SSBOND_E_FORM",totT,t_bath,i,j +c endif +#endif +#endif + dyn_ssbond_ij(i,j)=eij + else if (.not.havebond .and. dyn_ssbond_ij(i,j).lt.1.0d300) then + dyn_ssbond_ij(i,j)=1.0d300 +#ifndef CLUST +#ifndef WHAM +c write(iout,'(a15,f12.2,f8.1,2i5)') +c & "SSBOND_E_BREAK",totT,t_bath,i,j +#endif +#endif + endif + +c-------TESTING CODE + if (checkstop) then + if (jcheck.eq.0) write(iout,'(a,3f15.8,$)') + & "CHECKSTOP",rij,eij,ed + echeck(jcheck)=eij + endif + enddo + if (checkstop) then + write(iout,'(f15.8)')(echeck(1)-echeck(-1))*0.5d0/deps + endif + enddo + if (checkstop) then + transgrad=.true. + checkstop=.false. + endif +c-------END TESTING CODE + + do k=1,3 + dcosom1(k)=(dc_norm(k,nres+i)-om1*erij(k))/rij + dcosom2(k)=(dc_norm(k,nres+j)-om2*erij(k))/rij + enddo + do k=1,3 + gg(k)=ed*erij(k)+eom1*dcosom1(k)+eom2*dcosom2(k) + enddo + do k=1,3 + gvdwx(k,i)=gvdwx(k,i)-gg(k) + & +(eom12*(dc_norm(k,nres+j)-om12*dc_norm(k,nres+i)) + & +eom1*(erij(k)-om1*dc_norm(k,nres+i)))*dsci_inv + gvdwx(k,j)=gvdwx(k,j)+gg(k) + & +(eom12*(dc_norm(k,nres+i)-om12*dc_norm(k,nres+j)) + & +eom2*(erij(k)-om2*dc_norm(k,nres+j)))*dscj_inv + enddo +cgrad do k=i,j-1 +cgrad do l=1,3 +cgrad gvdwc(l,k)=gvdwc(l,k)+gg(l) +cgrad enddo +cgrad enddo + + do l=1,3 + gvdwc(l,i)=gvdwc(l,i)-gg(l) + gvdwc(l,j)=gvdwc(l,j)+gg(l) + enddo + + return + end + +C----------------------------------------------------------------------------- + + double precision function h_base(x,deriv) +c A smooth function going 0->1 in range [0,1] +c It should NOT be called outside range [0,1], it will not work there. + implicit none + +c Input arguments + double precision x + +c Output arguments + double precision deriv + +c Local variables + double precision xsq + + +c Two parabolas put together. First derivative zero at extrema +c$$$ if (x.lt.0.5D0) then +c$$$ h_base=2.0D0*x*x +c$$$ deriv=4.0D0*x +c$$$ else +c$$$ deriv=1.0D0-x +c$$$ h_base=1.0D0-2.0D0*deriv*deriv +c$$$ deriv=4.0D0*deriv +c$$$ endif + +c Third degree polynomial. First derivative zero at extrema + h_base=x*x*(3.0d0-2.0d0*x) + deriv=6.0d0*x*(1.0d0-x) + +c Fifth degree polynomial. First and second derivatives zero at extrema +c$$$ xsq=x*x +c$$$ h_base=x*xsq*(6.0d0*xsq-15.0d0*x+10.0d0) +c$$$ deriv=x-1.0d0 +c$$$ deriv=deriv*deriv +c$$$ deriv=30.0d0*xsq*deriv + + return + end + +c---------------------------------------------------------------------------- + + subroutine dyn_set_nss +c Adjust nss and other relevant variables based on dyn_ssbond_ij +c implicit none + +c Includes + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.SBRIDGE' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.SETUP' +#ifndef CLUST +#ifndef WHAM + include 'COMMON.MD' +#endif +#endif + +c Local variables + double precision emin + integer i,j,imin + integer diff,allflag(maxdim),allnss, + & allihpb(maxdim),alljhpb(maxdim), + & newnss,newihpb(maxdim),newjhpb(maxdim) + logical found + integer i_newnss(max_fg_procs),displ(max_fg_procs) + integer g_newihpb(maxdim),g_newjhpb(maxdim),g_newnss + + allnss=0 + do i=1,nres-1 + do j=i+1,nres + if (dyn_ssbond_ij(i,j).lt.1.0d300) then + allnss=allnss+1 + allflag(allnss)=0 + allihpb(allnss)=i + alljhpb(allnss)=j + endif + enddo + enddo + +cmc write(iout,*)"ALLNSS ",allnss,(allihpb(i),alljhpb(i),i=1,allnss) + + 1 emin=1.0d300 + do i=1,allnss + if (allflag(i).eq.0 .and. + & dyn_ssbond_ij(allihpb(i),alljhpb(i)).lt.emin) then + emin=dyn_ssbond_ij(allihpb(i),alljhpb(i)) + imin=i + endif + enddo + if (emin.lt.1.0d300) then + allflag(imin)=1 + do i=1,allnss + if (allflag(i).eq.0 .and. + & (allihpb(i).eq.allihpb(imin) .or. + & alljhpb(i).eq.allihpb(imin) .or. + & allihpb(i).eq.alljhpb(imin) .or. + & alljhpb(i).eq.alljhpb(imin))) then + allflag(i)=-1 + endif + enddo + goto 1 + endif + +cmc write(iout,*)"ALLNSS ",allnss,(allihpb(i),alljhpb(i),i=1,allnss) + + newnss=0 + do i=1,allnss + if (allflag(i).eq.1) then + newnss=newnss+1 + newihpb(newnss)=allihpb(i) + newjhpb(newnss)=alljhpb(i) + endif + enddo + +#ifdef MPI + if (nfgtasks.gt.1)then + + call MPI_Reduce(newnss,g_newnss,1, + & MPI_INTEGER,MPI_SUM,king,FG_COMM,IERR) + call MPI_Gather(newnss,1,MPI_INTEGER, + & i_newnss,1,MPI_INTEGER,king,FG_COMM,IERR) + displ(0)=0 + do i=1,nfgtasks-1,1 + displ(i)=i_newnss(i-1)+displ(i-1) + enddo + call MPI_Gatherv(newihpb,newnss,MPI_INTEGER, + & g_newihpb,i_newnss,displ,MPI_INTEGER, + & king,FG_COMM,IERR) + call MPI_Gatherv(newjhpb,newnss,MPI_INTEGER, + & g_newjhpb,i_newnss,displ,MPI_INTEGER, + & king,FG_COMM,IERR) + if(fg_rank.eq.0) then +c print *,'g_newnss',g_newnss +c print *,'g_newihpb',(g_newihpb(i),i=1,g_newnss) +c print *,'g_newjhpb',(g_newjhpb(i),i=1,g_newnss) + newnss=g_newnss + do i=1,newnss + newihpb(i)=g_newihpb(i) + newjhpb(i)=g_newjhpb(i) + enddo + endif + endif +#endif + + diff=newnss-nss + +cmc write(iout,*)"NEWNSS ",newnss,(newihpb(i),newjhpb(i),i=1,newnss) + + do i=1,nss + found=.false. + do j=1,newnss + if (idssb(i).eq.newihpb(j) .and. + & jdssb(i).eq.newjhpb(j)) found=.true. + enddo +#ifndef CLUST +#ifndef WHAM + if (.not.found.and.fg_rank.eq.0) + & write(iout,'(a15,f12.2,f8.1,2i5)') + & "SSBOND_BREAK",totT,t_bath,idssb(i),jdssb(i) +#endif +#endif + enddo + + do i=1,newnss + found=.false. + do j=1,nss + if (newihpb(i).eq.idssb(j) .and. + & newjhpb(i).eq.jdssb(j)) found=.true. + enddo +#ifndef CLUST +#ifndef WHAM + if (.not.found.and.fg_rank.eq.0) + & write(iout,'(a15,f12.2,f8.1,2i5)') + & "SSBOND_FORM",totT,t_bath,newihpb(i),newjhpb(i) +#endif +#endif + enddo + + nss=newnss + do i=1,nss + idssb(i)=newihpb(i) + jdssb(i)=newjhpb(i) + enddo + + return + end + +c---------------------------------------------------------------------------- + +#ifdef WHAM + subroutine read_ssHist + implicit none + +c Includes + include 'DIMENSIONS' + include "DIMENSIONS.FREE" + include 'COMMON.FREE' + +c Local variables + integer i,j + character*80 controlcard + + do i=1,dyn_nssHist + call card_concat(controlcard,.true.) + read(controlcard,*) + & dyn_ssHist(i,0),(dyn_ssHist(i,j),j=1,2*dyn_ssHist(i,0)) + enddo + + return + end +#endif + +c---------------------------------------------------------------------------- + + +C----------------------------------------------------------------------------- +C----------------------------------------------------------------------------- +C----------------------------------------------------------------------------- +C----------------------------------------------------------------------------- +C----------------------------------------------------------------------------- +C----------------------------------------------------------------------------- +C----------------------------------------------------------------------------- + +c$$$c----------------------------------------------------------------------------- +c$$$ +c$$$ subroutine ss_relax(i_in,j_in) +c$$$ implicit none +c$$$ +c$$$c Includes +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.CHAIN' +c$$$ include 'COMMON.IOUNITS' +c$$$ include 'COMMON.INTERACT' +c$$$ +c$$$c Input arguments +c$$$ integer i_in,j_in +c$$$ +c$$$c Local variables +c$$$ integer i,iretcode,nfun_sc +c$$$ logical scfail +c$$$ double precision var(maxvar),e_sc,etot +c$$$ +c$$$ +c$$$ mask_r=.true. +c$$$ do i=nnt,nct +c$$$ mask_side(i)=0 +c$$$ enddo +c$$$ mask_side(i_in)=1 +c$$$ mask_side(j_in)=1 +c$$$ +c$$$c Minimize the two selected side-chains +c$$$ call overlap_sc(scfail) ! Better not fail! +c$$$ call minimize_sc(e_sc,var,iretcode,nfun_sc) +c$$$ +c$$$ mask_r=.false. +c$$$ +c$$$ return +c$$$ end +c$$$ +c$$$c------------------------------------------------------------- +c$$$ +c$$$ subroutine minimize_sc(etot_sc,iretcode,nfun) +c$$$c Minimize side-chains only, starting from geom but without modifying +c$$$c bond lengths. +c$$$c If mask_r is already set, only the selected side-chains are minimized, +c$$$c otherwise all side-chains are minimized keeping the backbone frozen. +c$$$ implicit none +c$$$ +c$$$c Includes +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.IOUNITS' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.CHAIN' +c$$$ include 'COMMON.GEO' +c$$$ include 'COMMON.MINIM' +c$$$ integer icall +c$$$ common /srutu/ icall +c$$$ +c$$$c Output arguments +c$$$ double precision etot_sc +c$$$ integer iretcode,nfun +c$$$ +c$$$c External functions/subroutines +c$$$ external func_sc,grad_sc,fdum +c$$$ +c$$$c Local variables +c$$$ integer liv,lv +c$$$ parameter (liv=60,lv=(77+maxvar*(maxvar+17)/2)) +c$$$ integer iv(liv) +c$$$ double precision rdum(1) +c$$$ double precision d(maxvar),v(1:lv),x(maxvar),xx(maxvar) +c$$$ integer idum(1) +c$$$ integer i,nvar_restr +c$$$ +c$$$ +c$$$cmc start_minim=.true. +c$$$ call deflt(2,iv,liv,lv,v) +c$$$* 12 means fresh start, dont call deflt +c$$$ iv(1)=12 +c$$$* max num of fun calls +c$$$ if (maxfun.eq.0) maxfun=500 +c$$$ iv(17)=maxfun +c$$$* max num of iterations +c$$$ if (maxmin.eq.0) maxmin=1000 +c$$$ iv(18)=maxmin +c$$$* controls output +c$$$ iv(19)=1 +c$$$* selects output unit +c$$$ iv(21)=0 +c$$$c iv(21)=iout ! DEBUG +c$$$c iv(21)=8 ! DEBUG +c$$$* 1 means to print out result +c$$$ iv(22)=0 +c$$$c iv(22)=1 ! DEBUG +c$$$* 1 means to print out summary stats +c$$$ iv(23)=0 +c$$$c iv(23)=1 ! DEBUG +c$$$* 1 means to print initial x and d +c$$$ iv(24)=0 +c$$$c iv(24)=1 ! DEBUG +c$$$* min val for v(radfac) default is 0.1 +c$$$ v(24)=0.1D0 +c$$$* max val for v(radfac) default is 4.0 +c$$$ v(25)=2.0D0 +c$$$c v(25)=4.0D0 +c$$$* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +c$$$* the sumsl default is 0.1 +c$$$ v(26)=0.1D0 +c$$$* false conv if (act fnctn decrease) .lt. v(34) +c$$$* the sumsl default is 100*machep +c$$$ v(34)=v(34)/100.0D0 +c$$$* absolute convergence +c$$$ if (tolf.eq.0.0D0) tolf=1.0D-4 +c$$$ v(31)=tolf +c$$$* relative convergence +c$$$ if (rtolf.eq.0.0D0) rtolf=1.0D-1 +c$$$ v(32)=rtolf +c$$$* controls initial step size +c$$$ v(35)=1.0D-1 +c$$$* large vals of d correspond to small components of step +c$$$ do i=1,nphi +c$$$ d(i)=1.0D-1 +c$$$ enddo +c$$$ do i=nphi+1,nvar +c$$$ d(i)=1.0D-1 +c$$$ enddo +c$$$ +c$$$ call geom_to_var(nvar,x) +c$$$ IF (mask_r) THEN +c$$$ do i=1,nres ! Just in case... +c$$$ mask_phi(i)=0 +c$$$ mask_theta(i)=0 +c$$$ enddo +c$$$ call x2xx(x,xx,nvar_restr) +c$$$ call sumsl(nvar_restr,d,xx,func_sc,grad_sc, +c$$$ & iv,liv,lv,v,idum,rdum,fdum) +c$$$ call xx2x(x,xx) +c$$$ ELSE +c$$$c When minimizing ALL side-chains, etotal_sc is a little +c$$$c faster if we don't set mask_r +c$$$ do i=1,nres +c$$$ mask_phi(i)=0 +c$$$ mask_theta(i)=0 +c$$$ mask_side(i)=1 +c$$$ enddo +c$$$ call x2xx(x,xx,nvar_restr) +c$$$ call sumsl(nvar_restr,d,xx,func_sc,grad_sc, +c$$$ & iv,liv,lv,v,idum,rdum,fdum) +c$$$ call xx2x(x,xx) +c$$$ ENDIF +c$$$ call var_to_geom(nvar,x) +c$$$ call chainbuild_sc +c$$$ etot_sc=v(10) +c$$$ iretcode=iv(1) +c$$$ nfun=iv(6) +c$$$ return +c$$$ end +c$$$ +c$$$C-------------------------------------------------------------------------- +c$$$ +c$$$ subroutine chainbuild_sc +c$$$ implicit none +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.INTERACT' +c$$$ +c$$$c Local variables +c$$$ integer i +c$$$ +c$$$ +c$$$ do i=nnt,nct +c$$$ if (.not.mask_r .or. mask_side(i).eq.1) then +c$$$ call locate_side_chain(i) +c$$$ endif +c$$$ enddo +c$$$ +c$$$ return +c$$$ end +c$$$ +c$$$C-------------------------------------------------------------------------- +c$$$ +c$$$ subroutine func_sc(n,x,nf,f,uiparm,urparm,ufparm) +c$$$ implicit none +c$$$ +c$$$c Includes +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.DERIV' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.MINIM' +c$$$ include 'COMMON.IOUNITS' +c$$$ +c$$$c Input arguments +c$$$ integer n +c$$$ double precision x(maxvar) +c$$$ double precision ufparm +c$$$ external ufparm +c$$$ +c$$$c Input/Output arguments +c$$$ integer nf +c$$$ integer uiparm(1) +c$$$ double precision urparm(1) +c$$$ +c$$$c Output arguments +c$$$ double precision f +c$$$ +c$$$c Local variables +c$$$ double precision energia(0:n_ene) +c$$$#ifdef OSF +c$$$c Variables used to intercept NaNs +c$$$ double precision x_sum +c$$$ integer i_NAN +c$$$#endif +c$$$ +c$$$ +c$$$ nfl=nf +c$$$ icg=mod(nf,2)+1 +c$$$ +c$$$#ifdef OSF +c$$$c Intercept NaNs in the coordinates, before calling etotal_sc +c$$$ x_sum=0.D0 +c$$$ do i_NAN=1,n +c$$$ x_sum=x_sum+x(i_NAN) +c$$$ enddo +c$$$c Calculate the energy only if the coordinates are ok +c$$$ if ((.not.(x_sum.lt.0.D0)) .and. (.not.(x_sum.ge.0.D0))) then +c$$$ write(iout,*)" *** func_restr_sc : Found NaN in coordinates" +c$$$ f=1.0D+77 +c$$$ nf=0 +c$$$ else +c$$$#endif +c$$$ +c$$$ call var_to_geom_restr(n,x) +c$$$ call zerograd +c$$$ call chainbuild_sc +c$$$ call etotal_sc(energia(0)) +c$$$ f=energia(0) +c$$$ if (energia(1).eq.1.0D20 .or. energia(0).eq.1.0D99) nf=0 +c$$$ +c$$$#ifdef OSF +c$$$ endif +c$$$#endif +c$$$ +c$$$ return +c$$$ end +c$$$ +c$$$c------------------------------------------------------- +c$$$ +c$$$ subroutine grad_sc(n,x,nf,g,uiparm,urparm,ufparm) +c$$$ implicit none +c$$$ +c$$$c Includes +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.CHAIN' +c$$$ include 'COMMON.DERIV' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.INTERACT' +c$$$ include 'COMMON.MINIM' +c$$$ +c$$$c Input arguments +c$$$ integer n +c$$$ double precision x(maxvar) +c$$$ double precision ufparm +c$$$ external ufparm +c$$$ +c$$$c Input/Output arguments +c$$$ integer nf +c$$$ integer uiparm(1) +c$$$ double precision urparm(1) +c$$$ +c$$$c Output arguments +c$$$ double precision g(maxvar) +c$$$ +c$$$c Local variables +c$$$ double precision f,gphii,gthetai,galphai,gomegai +c$$$ integer ig,ind,i,j,k,igall,ij +c$$$ +c$$$ +c$$$ icg=mod(nf,2)+1 +c$$$ if (nf-nfl+1) 20,30,40 +c$$$ 20 call func_sc(n,x,nf,f,uiparm,urparm,ufparm) +c$$$c write (iout,*) 'grad 20' +c$$$ if (nf.eq.0) return +c$$$ goto 40 +c$$$ 30 call var_to_geom_restr(n,x) +c$$$ call chainbuild_sc +c$$$C +c$$$C Evaluate the derivatives of virtual bond lengths and SC vectors in variables. +c$$$C +c$$$ 40 call cartder +c$$$C +c$$$C Convert the Cartesian gradient into internal-coordinate gradient. +c$$$C +c$$$ +c$$$ ig=0 +c$$$ ind=nres-2 +c$$$ do i=2,nres-2 +c$$$ IF (mask_phi(i+2).eq.1) THEN +c$$$ gphii=0.0D0 +c$$$ do j=i+1,nres-1 +c$$$ ind=ind+1 +c$$$ do k=1,3 +c$$$ gphii=gphii+dcdv(k+3,ind)*gradc(k,j,icg) +c$$$ gphii=gphii+dxdv(k+3,ind)*gradx(k,j,icg) +c$$$ enddo +c$$$ enddo +c$$$ ig=ig+1 +c$$$ g(ig)=gphii +c$$$ ELSE +c$$$ ind=ind+nres-1-i +c$$$ ENDIF +c$$$ enddo +c$$$ +c$$$ +c$$$ ind=0 +c$$$ do i=1,nres-2 +c$$$ IF (mask_theta(i+2).eq.1) THEN +c$$$ ig=ig+1 +c$$$ gthetai=0.0D0 +c$$$ do j=i+1,nres-1 +c$$$ ind=ind+1 +c$$$ do k=1,3 +c$$$ gthetai=gthetai+dcdv(k,ind)*gradc(k,j,icg) +c$$$ gthetai=gthetai+dxdv(k,ind)*gradx(k,j,icg) +c$$$ enddo +c$$$ enddo +c$$$ g(ig)=gthetai +c$$$ ELSE +c$$$ ind=ind+nres-1-i +c$$$ ENDIF +c$$$ enddo +c$$$ +c$$$ do i=2,nres-1 +c$$$ if (itype(i).ne.10) then +c$$$ IF (mask_side(i).eq.1) THEN +c$$$ ig=ig+1 +c$$$ galphai=0.0D0 +c$$$ do k=1,3 +c$$$ galphai=galphai+dxds(k,i)*gradx(k,i,icg) +c$$$ enddo +c$$$ g(ig)=galphai +c$$$ ENDIF +c$$$ endif +c$$$ enddo +c$$$ +c$$$ +c$$$ do i=2,nres-1 +c$$$ if (itype(i).ne.10) then +c$$$ IF (mask_side(i).eq.1) THEN +c$$$ ig=ig+1 +c$$$ gomegai=0.0D0 +c$$$ do k=1,3 +c$$$ gomegai=gomegai+dxds(k+3,i)*gradx(k,i,icg) +c$$$ enddo +c$$$ g(ig)=gomegai +c$$$ ENDIF +c$$$ endif +c$$$ enddo +c$$$ +c$$$C +c$$$C Add the components corresponding to local energy terms. +c$$$C +c$$$ +c$$$ ig=0 +c$$$ igall=0 +c$$$ do i=4,nres +c$$$ igall=igall+1 +c$$$ if (mask_phi(i).eq.1) then +c$$$ ig=ig+1 +c$$$ g(ig)=g(ig)+gloc(igall,icg) +c$$$ endif +c$$$ enddo +c$$$ +c$$$ do i=3,nres +c$$$ igall=igall+1 +c$$$ if (mask_theta(i).eq.1) then +c$$$ ig=ig+1 +c$$$ g(ig)=g(ig)+gloc(igall,icg) +c$$$ endif +c$$$ enddo +c$$$ +c$$$ do ij=1,2 +c$$$ do i=2,nres-1 +c$$$ if (itype(i).ne.10) then +c$$$ igall=igall+1 +c$$$ if (mask_side(i).eq.1) then +c$$$ ig=ig+1 +c$$$ g(ig)=g(ig)+gloc(igall,icg) +c$$$ endif +c$$$ endif +c$$$ enddo +c$$$ enddo +c$$$ +c$$$cd do i=1,ig +c$$$cd write (iout,'(a2,i5,a3,f25.8)') 'i=',i,' g=',g(i) +c$$$cd enddo +c$$$ +c$$$ return +c$$$ end +c$$$ +c$$$C----------------------------------------------------------------------------- +c$$$ +c$$$ subroutine etotal_sc(energy_sc) +c$$$ implicit none +c$$$ +c$$$c Includes +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.INTERACT' +c$$$ include 'COMMON.DERIV' +c$$$ include 'COMMON.FFIELD' +c$$$ +c$$$c Output arguments +c$$$ double precision energy_sc(0:n_ene) +c$$$ +c$$$c Local variables +c$$$ double precision evdw,escloc +c$$$ integer i,j +c$$$ +c$$$ +c$$$ do i=1,n_ene +c$$$ energy_sc(i)=0.0D0 +c$$$ enddo +c$$$ +c$$$ if (mask_r) then +c$$$ call egb_sc(evdw) +c$$$ call esc_sc(escloc) +c$$$ else +c$$$ call egb(evdw) +c$$$ call esc(escloc) +c$$$ endif +c$$$ +c$$$ if (evdw.eq.1.0D20) then +c$$$ energy_sc(0)=evdw +c$$$ else +c$$$ energy_sc(0)=wsc*evdw+wscloc*escloc +c$$$ endif +c$$$ energy_sc(1)=evdw +c$$$ energy_sc(12)=escloc +c$$$ +c$$$C +c$$$C Sum up the components of the Cartesian gradient. +c$$$C +c$$$ do i=1,nct +c$$$ do j=1,3 +c$$$ gradx(j,i,icg)=wsc*gvdwx(j,i) +c$$$ enddo +c$$$ enddo +c$$$ +c$$$ return +c$$$ end +c$$$ +c$$$C----------------------------------------------------------------------------- +c$$$ +c$$$ subroutine egb_sc(evdw) +c$$$C +c$$$C This subroutine calculates the interaction energy of nonbonded side chains +c$$$C assuming the Gay-Berne potential of interaction. +c$$$C +c$$$ implicit real*8 (a-h,o-z) +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.GEO' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.LOCAL' +c$$$ include 'COMMON.CHAIN' +c$$$ include 'COMMON.DERIV' +c$$$ include 'COMMON.NAMES' +c$$$ include 'COMMON.INTERACT' +c$$$ include 'COMMON.IOUNITS' +c$$$ include 'COMMON.CALC' +c$$$ include 'COMMON.CONTROL' +c$$$ logical lprn +c$$$ evdw=0.0D0 +c$$$ energy_dec=.false. +c$$$c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon +c$$$ evdw=0.0D0 +c$$$ lprn=.false. +c$$$c if (icall.eq.0) lprn=.false. +c$$$ ind=0 +c$$$ do i=iatsc_s,iatsc_e +c$$$ itypi=itype(i) +c$$$ itypi1=itype(i+1) +c$$$ xi=c(1,nres+i) +c$$$ yi=c(2,nres+i) +c$$$ zi=c(3,nres+i) +c$$$ dxi=dc_norm(1,nres+i) +c$$$ dyi=dc_norm(2,nres+i) +c$$$ dzi=dc_norm(3,nres+i) +c$$$c dsci_inv=dsc_inv(itypi) +c$$$ dsci_inv=vbld_inv(i+nres) +c$$$c write (iout,*) "i",i,dsc_inv(itypi),dsci_inv,1.0d0/vbld(i+nres) +c$$$c write (iout,*) "dcnori",dxi*dxi+dyi*dyi+dzi*dzi +c$$$C +c$$$C Calculate SC interaction energy. +c$$$C +c$$$ do iint=1,nint_gr(i) +c$$$ do j=istart(i,iint),iend(i,iint) +c$$$ IF (mask_side(j).eq.1.or.mask_side(i).eq.1) THEN +c$$$ ind=ind+1 +c$$$ itypj=itype(j) +c$$$c dscj_inv=dsc_inv(itypj) +c$$$ dscj_inv=vbld_inv(j+nres) +c$$$c write (iout,*) "j",j,dsc_inv(itypj),dscj_inv, +c$$$c & 1.0d0/vbld(j+nres) +c$$$c write (iout,*) "i",i," j", j," itype",itype(i),itype(j) +c$$$ sig0ij=sigma(itypi,itypj) +c$$$ chi1=chi(itypi,itypj) +c$$$ chi2=chi(itypj,itypi) +c$$$ chi12=chi1*chi2 +c$$$ chip1=chip(itypi) +c$$$ chip2=chip(itypj) +c$$$ chip12=chip1*chip2 +c$$$ alf1=alp(itypi) +c$$$ alf2=alp(itypj) +c$$$ alf12=0.5D0*(alf1+alf2) +c$$$C For diagnostics only!!! +c$$$c chi1=0.0D0 +c$$$c chi2=0.0D0 +c$$$c chi12=0.0D0 +c$$$c chip1=0.0D0 +c$$$c chip2=0.0D0 +c$$$c chip12=0.0D0 +c$$$c alf1=0.0D0 +c$$$c alf2=0.0D0 +c$$$c alf12=0.0D0 +c$$$ xj=c(1,nres+j)-xi +c$$$ yj=c(2,nres+j)-yi +c$$$ zj=c(3,nres+j)-zi +c$$$ dxj=dc_norm(1,nres+j) +c$$$ dyj=dc_norm(2,nres+j) +c$$$ dzj=dc_norm(3,nres+j) +c$$$c write (iout,*) "dcnorj",dxi*dxi+dyi*dyi+dzi*dzi +c$$$c write (iout,*) "j",j," dc_norm", +c$$$c & dc_norm(1,nres+j),dc_norm(2,nres+j),dc_norm(3,nres+j) +c$$$ rrij=1.0D0/(xj*xj+yj*yj+zj*zj) +c$$$ rij=dsqrt(rrij) +c$$$C Calculate angle-dependent terms of energy and contributions to their +c$$$C derivatives. +c$$$ call sc_angular +c$$$ sigsq=1.0D0/sigsq +c$$$ sig=sig0ij*dsqrt(sigsq) +c$$$ rij_shift=1.0D0/rij-sig+sig0ij +c$$$c for diagnostics; uncomment +c$$$c rij_shift=1.2*sig0ij +c$$$C I hate to put IF's in the loops, but here don't have another choice!!!! +c$$$ if (rij_shift.le.0.0D0) then +c$$$ evdw=1.0D20 +c$$$cd write (iout,'(2(a3,i3,2x),17(0pf7.3))') +c$$$cd & restyp(itypi),i,restyp(itypj),j, +c$$$cd & rij_shift,1.0D0/rij,sig,sig0ij,sigsq,1-dsqrt(sigsq) +c$$$ return +c$$$ endif +c$$$ sigder=-sig*sigsq +c$$$c--------------------------------------------------------------- +c$$$ rij_shift=1.0D0/rij_shift +c$$$ fac=rij_shift**expon +c$$$ e1=fac*fac*aa(itypi,itypj) +c$$$ e2=fac*bb(itypi,itypj) +c$$$ evdwij=eps1*eps2rt*eps3rt*(e1+e2) +c$$$ eps2der=evdwij*eps3rt +c$$$ eps3der=evdwij*eps2rt +c$$$c write (iout,*) "sigsq",sigsq," sig",sig," eps2rt",eps2rt, +c$$$c & " eps3rt",eps3rt," eps1",eps1," e1",e1," e2",e2 +c$$$ evdwij=evdwij*eps2rt*eps3rt +c$$$ evdw=evdw+evdwij +c$$$ if (lprn) then +c$$$ sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +c$$$ epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +c$$$ write (iout,'(2(a3,i3,2x),17(0pf7.3))') +c$$$ & restyp(itypi),i,restyp(itypj),j, +c$$$ & epsi,sigm,chi1,chi2,chip1,chip2, +c$$$ & eps1,eps2rt**2,eps3rt**2,sig,sig0ij, +c$$$ & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, +c$$$ & evdwij +c$$$ endif +c$$$ +c$$$ if (energy_dec) write (iout,'(a6,2i,0pf7.3)') +c$$$ & 'evdw',i,j,evdwij +c$$$ +c$$$C Calculate gradient components. +c$$$ e1=e1*eps1*eps2rt**2*eps3rt**2 +c$$$ fac=-expon*(e1+evdwij)*rij_shift +c$$$ sigder=fac*sigder +c$$$ fac=rij*fac +c$$$c fac=0.0d0 +c$$$C Calculate the radial part of the gradient +c$$$ gg(1)=xj*fac +c$$$ gg(2)=yj*fac +c$$$ gg(3)=zj*fac +c$$$C Calculate angular part of the gradient. +c$$$ call sc_grad +c$$$ ENDIF +c$$$ enddo ! j +c$$$ enddo ! iint +c$$$ enddo ! i +c$$$ energy_dec=.false. +c$$$ return +c$$$ end +c$$$ +c$$$c----------------------------------------------------------------------------- +c$$$ +c$$$ subroutine esc_sc(escloc) +c$$$C Calculate the local energy of a side chain and its derivatives in the +c$$$C corresponding virtual-bond valence angles THETA and the spherical angles +c$$$C ALPHA and OMEGA. +c$$$ implicit real*8 (a-h,o-z) +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.GEO' +c$$$ include 'COMMON.LOCAL' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.INTERACT' +c$$$ include 'COMMON.DERIV' +c$$$ include 'COMMON.CHAIN' +c$$$ include 'COMMON.IOUNITS' +c$$$ include 'COMMON.NAMES' +c$$$ include 'COMMON.FFIELD' +c$$$ include 'COMMON.CONTROL' +c$$$ double precision x(3),dersc(3),xemp(3),dersc0(3),dersc1(3), +c$$$ & ddersc0(3),ddummy(3),xtemp(3),temp(3) +c$$$ common /sccalc/ time11,time12,time112,theti,it,nlobit +c$$$ delta=0.02d0*pi +c$$$ escloc=0.0D0 +c$$$c write (iout,'(a)') 'ESC' +c$$$ do i=loc_start,loc_end +c$$$ IF (mask_side(i).eq.1) THEN +c$$$ it=itype(i) +c$$$ if (it.eq.10) goto 1 +c$$$ nlobit=nlob(it) +c$$$c print *,'i=',i,' it=',it,' nlobit=',nlobit +c$$$c write (iout,*) 'i=',i,' ssa=',ssa,' ssad=',ssad +c$$$ theti=theta(i+1)-pipol +c$$$ x(1)=dtan(theti) +c$$$ x(2)=alph(i) +c$$$ x(3)=omeg(i) +c$$$ +c$$$ if (x(2).gt.pi-delta) then +c$$$ xtemp(1)=x(1) +c$$$ xtemp(2)=pi-delta +c$$$ xtemp(3)=x(3) +c$$$ call enesc(xtemp,escloci0,dersc0,ddersc0,.true.) +c$$$ xtemp(2)=pi +c$$$ call enesc(xtemp,escloci1,dersc1,ddummy,.false.) +c$$$ call spline1(x(2),pi-delta,delta,escloci0,escloci1,dersc0(2), +c$$$ & escloci,dersc(2)) +c$$$ call spline2(x(2),pi-delta,delta,dersc0(1),dersc1(1), +c$$$ & ddersc0(1),dersc(1)) +c$$$ call spline2(x(2),pi-delta,delta,dersc0(3),dersc1(3), +c$$$ & ddersc0(3),dersc(3)) +c$$$ xtemp(2)=pi-delta +c$$$ call enesc_bound(xtemp,esclocbi0,dersc0,dersc12,.true.) +c$$$ xtemp(2)=pi +c$$$ call enesc_bound(xtemp,esclocbi1,dersc1,chuju,.false.) +c$$$ call spline1(x(2),pi-delta,delta,esclocbi0,esclocbi1, +c$$$ & dersc0(2),esclocbi,dersc02) +c$$$ call spline2(x(2),pi-delta,delta,dersc0(1),dersc1(1), +c$$$ & dersc12,dersc01) +c$$$ call splinthet(x(2),0.5d0*delta,ss,ssd) +c$$$ dersc0(1)=dersc01 +c$$$ dersc0(2)=dersc02 +c$$$ dersc0(3)=0.0d0 +c$$$ do k=1,3 +c$$$ dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k) +c$$$ enddo +c$$$ dersc(2)=dersc(2)+ssd*(escloci-esclocbi) +c$$$c write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci, +c$$$c & esclocbi,ss,ssd +c$$$ escloci=ss*escloci+(1.0d0-ss)*esclocbi +c$$$c escloci=esclocbi +c$$$c write (iout,*) escloci +c$$$ else if (x(2).lt.delta) then +c$$$ xtemp(1)=x(1) +c$$$ xtemp(2)=delta +c$$$ xtemp(3)=x(3) +c$$$ call enesc(xtemp,escloci0,dersc0,ddersc0,.true.) +c$$$ xtemp(2)=0.0d0 +c$$$ call enesc(xtemp,escloci1,dersc1,ddummy,.false.) +c$$$ call spline1(x(2),delta,-delta,escloci0,escloci1,dersc0(2), +c$$$ & escloci,dersc(2)) +c$$$ call spline2(x(2),delta,-delta,dersc0(1),dersc1(1), +c$$$ & ddersc0(1),dersc(1)) +c$$$ call spline2(x(2),delta,-delta,dersc0(3),dersc1(3), +c$$$ & ddersc0(3),dersc(3)) +c$$$ xtemp(2)=delta +c$$$ call enesc_bound(xtemp,esclocbi0,dersc0,dersc12,.true.) +c$$$ xtemp(2)=0.0d0 +c$$$ call enesc_bound(xtemp,esclocbi1,dersc1,chuju,.false.) +c$$$ call spline1(x(2),delta,-delta,esclocbi0,esclocbi1, +c$$$ & dersc0(2),esclocbi,dersc02) +c$$$ call spline2(x(2),delta,-delta,dersc0(1),dersc1(1), +c$$$ & dersc12,dersc01) +c$$$ dersc0(1)=dersc01 +c$$$ dersc0(2)=dersc02 +c$$$ dersc0(3)=0.0d0 +c$$$ call splinthet(x(2),0.5d0*delta,ss,ssd) +c$$$ do k=1,3 +c$$$ dersc(k)=ss*dersc(k)+(1.0d0-ss)*dersc0(k) +c$$$ enddo +c$$$ dersc(2)=dersc(2)+ssd*(escloci-esclocbi) +c$$$c write (iout,*) 'i=',i,x(2)*rad2deg,escloci0,escloci, +c$$$c & esclocbi,ss,ssd +c$$$ escloci=ss*escloci+(1.0d0-ss)*esclocbi +c$$$c write (iout,*) escloci +c$$$ else +c$$$ call enesc(x,escloci,dersc,ddummy,.false.) +c$$$ endif +c$$$ +c$$$ escloc=escloc+escloci +c$$$ if (energy_dec) write (iout,'(a6,i,0pf7.3)') +c$$$ & 'escloc',i,escloci +c$$$c write (iout,*) 'i=',i,' escloci=',escloci,' dersc=',dersc +c$$$ +c$$$ gloc(nphi+i-1,icg)=gloc(nphi+i-1,icg)+ +c$$$ & wscloc*dersc(1) +c$$$ gloc(ialph(i,1),icg)=wscloc*dersc(2) +c$$$ gloc(ialph(i,1)+nside,icg)=wscloc*dersc(3) +c$$$ 1 continue +c$$$ ENDIF +c$$$ enddo +c$$$ return +c$$$ end +c$$$ +c$$$C----------------------------------------------------------------------------- +c$$$ +c$$$ subroutine egb_ij(i_sc,j_sc,evdw) +c$$$C +c$$$C This subroutine calculates the interaction energy of nonbonded side chains +c$$$C assuming the Gay-Berne potential of interaction. +c$$$C +c$$$ implicit real*8 (a-h,o-z) +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.GEO' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.LOCAL' +c$$$ include 'COMMON.CHAIN' +c$$$ include 'COMMON.DERIV' +c$$$ include 'COMMON.NAMES' +c$$$ include 'COMMON.INTERACT' +c$$$ include 'COMMON.IOUNITS' +c$$$ include 'COMMON.CALC' +c$$$ include 'COMMON.CONTROL' +c$$$ logical lprn +c$$$ evdw=0.0D0 +c$$$ energy_dec=.false. +c$$$c print *,'Entering EGB nnt=',nnt,' nct=',nct,' expon=',expon +c$$$ evdw=0.0D0 +c$$$ lprn=.false. +c$$$ ind=0 +c$$$c$$$ do i=iatsc_s,iatsc_e +c$$$ i=i_sc +c$$$ itypi=itype(i) +c$$$ itypi1=itype(i+1) +c$$$ xi=c(1,nres+i) +c$$$ yi=c(2,nres+i) +c$$$ zi=c(3,nres+i) +c$$$ dxi=dc_norm(1,nres+i) +c$$$ dyi=dc_norm(2,nres+i) +c$$$ dzi=dc_norm(3,nres+i) +c$$$c dsci_inv=dsc_inv(itypi) +c$$$ dsci_inv=vbld_inv(i+nres) +c$$$c write (iout,*) "i",i,dsc_inv(itypi),dsci_inv,1.0d0/vbld(i+nres) +c$$$c write (iout,*) "dcnori",dxi*dxi+dyi*dyi+dzi*dzi +c$$$C +c$$$C Calculate SC interaction energy. +c$$$C +c$$$c$$$ do iint=1,nint_gr(i) +c$$$c$$$ do j=istart(i,iint),iend(i,iint) +c$$$ j=j_sc +c$$$ ind=ind+1 +c$$$ itypj=itype(j) +c$$$c dscj_inv=dsc_inv(itypj) +c$$$ dscj_inv=vbld_inv(j+nres) +c$$$c write (iout,*) "j",j,dsc_inv(itypj),dscj_inv, +c$$$c & 1.0d0/vbld(j+nres) +c$$$c write (iout,*) "i",i," j", j," itype",itype(i),itype(j) +c$$$ sig0ij=sigma(itypi,itypj) +c$$$ chi1=chi(itypi,itypj) +c$$$ chi2=chi(itypj,itypi) +c$$$ chi12=chi1*chi2 +c$$$ chip1=chip(itypi) +c$$$ chip2=chip(itypj) +c$$$ chip12=chip1*chip2 +c$$$ alf1=alp(itypi) +c$$$ alf2=alp(itypj) +c$$$ alf12=0.5D0*(alf1+alf2) +c$$$C For diagnostics only!!! +c$$$c chi1=0.0D0 +c$$$c chi2=0.0D0 +c$$$c chi12=0.0D0 +c$$$c chip1=0.0D0 +c$$$c chip2=0.0D0 +c$$$c chip12=0.0D0 +c$$$c alf1=0.0D0 +c$$$c alf2=0.0D0 +c$$$c alf12=0.0D0 +c$$$ xj=c(1,nres+j)-xi +c$$$ yj=c(2,nres+j)-yi +c$$$ zj=c(3,nres+j)-zi +c$$$ dxj=dc_norm(1,nres+j) +c$$$ dyj=dc_norm(2,nres+j) +c$$$ dzj=dc_norm(3,nres+j) +c$$$c write (iout,*) "dcnorj",dxi*dxi+dyi*dyi+dzi*dzi +c$$$c write (iout,*) "j",j," dc_norm", +c$$$c & dc_norm(1,nres+j),dc_norm(2,nres+j),dc_norm(3,nres+j) +c$$$ rrij=1.0D0/(xj*xj+yj*yj+zj*zj) +c$$$ rij=dsqrt(rrij) +c$$$C Calculate angle-dependent terms of energy and contributions to their +c$$$C derivatives. +c$$$ call sc_angular +c$$$ sigsq=1.0D0/sigsq +c$$$ sig=sig0ij*dsqrt(sigsq) +c$$$ rij_shift=1.0D0/rij-sig+sig0ij +c$$$c for diagnostics; uncomment +c$$$c rij_shift=1.2*sig0ij +c$$$C I hate to put IF's in the loops, but here don't have another choice!!!! +c$$$ if (rij_shift.le.0.0D0) then +c$$$ evdw=1.0D20 +c$$$cd write (iout,'(2(a3,i3,2x),17(0pf7.3))') +c$$$cd & restyp(itypi),i,restyp(itypj),j, +c$$$cd & rij_shift,1.0D0/rij,sig,sig0ij,sigsq,1-dsqrt(sigsq) +c$$$ return +c$$$ endif +c$$$ sigder=-sig*sigsq +c$$$c--------------------------------------------------------------- +c$$$ rij_shift=1.0D0/rij_shift +c$$$ fac=rij_shift**expon +c$$$ e1=fac*fac*aa(itypi,itypj) +c$$$ e2=fac*bb(itypi,itypj) +c$$$ evdwij=eps1*eps2rt*eps3rt*(e1+e2) +c$$$ eps2der=evdwij*eps3rt +c$$$ eps3der=evdwij*eps2rt +c$$$c write (iout,*) "sigsq",sigsq," sig",sig," eps2rt",eps2rt, +c$$$c & " eps3rt",eps3rt," eps1",eps1," e1",e1," e2",e2 +c$$$ evdwij=evdwij*eps2rt*eps3rt +c$$$ evdw=evdw+evdwij +c$$$ if (lprn) then +c$$$ sigm=dabs(aa(itypi,itypj)/bb(itypi,itypj))**(1.0D0/6.0D0) +c$$$ epsi=bb(itypi,itypj)**2/aa(itypi,itypj) +c$$$ write (iout,'(2(a3,i3,2x),17(0pf7.3))') +c$$$ & restyp(itypi),i,restyp(itypj),j, +c$$$ & epsi,sigm,chi1,chi2,chip1,chip2, +c$$$ & eps1,eps2rt**2,eps3rt**2,sig,sig0ij, +c$$$ & om1,om2,om12,1.0D0/rij,1.0D0/rij_shift, +c$$$ & evdwij +c$$$ endif +c$$$ +c$$$ if (energy_dec) write (iout,'(a6,2i,0pf7.3)') +c$$$ & 'evdw',i,j,evdwij +c$$$ +c$$$C Calculate gradient components. +c$$$ e1=e1*eps1*eps2rt**2*eps3rt**2 +c$$$ fac=-expon*(e1+evdwij)*rij_shift +c$$$ sigder=fac*sigder +c$$$ fac=rij*fac +c$$$c fac=0.0d0 +c$$$C Calculate the radial part of the gradient +c$$$ gg(1)=xj*fac +c$$$ gg(2)=yj*fac +c$$$ gg(3)=zj*fac +c$$$C Calculate angular part of the gradient. +c$$$ call sc_grad +c$$$c$$$ enddo ! j +c$$$c$$$ enddo ! iint +c$$$c$$$ enddo ! i +c$$$ energy_dec=.false. +c$$$ return +c$$$ end +c$$$ +c$$$C----------------------------------------------------------------------------- +c$$$ +c$$$ subroutine perturb_side_chain(i,angle) +c$$$ implicit none +c$$$ +c$$$c Includes +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.CHAIN' +c$$$ include 'COMMON.GEO' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.LOCAL' +c$$$ include 'COMMON.IOUNITS' +c$$$ +c$$$c External functions +c$$$ external ran_number +c$$$ double precision ran_number +c$$$ +c$$$c Input arguments +c$$$ integer i +c$$$ double precision angle ! In degrees +c$$$ +c$$$c Local variables +c$$$ integer i_sc +c$$$ double precision rad_ang,rand_v(3),length,cost,sint +c$$$ +c$$$ +c$$$ i_sc=i+nres +c$$$ rad_ang=angle*deg2rad +c$$$ +c$$$ length=0.0 +c$$$ do while (length.lt.0.01) +c$$$ rand_v(1)=ran_number(0.01D0,1.0D0) +c$$$ rand_v(2)=ran_number(0.01D0,1.0D0) +c$$$ rand_v(3)=ran_number(0.01D0,1.0D0) +c$$$ length=rand_v(1)*rand_v(1)+rand_v(2)*rand_v(2)+ +c$$$ + rand_v(3)*rand_v(3) +c$$$ length=sqrt(length) +c$$$ rand_v(1)=rand_v(1)/length +c$$$ rand_v(2)=rand_v(2)/length +c$$$ rand_v(3)=rand_v(3)/length +c$$$ cost=rand_v(1)*dc_norm(1,i_sc)+rand_v(2)*dc_norm(2,i_sc)+ +c$$$ + rand_v(3)*dc_norm(3,i_sc) +c$$$ length=1.0D0-cost*cost +c$$$ if (length.lt.0.0D0) length=0.0D0 +c$$$ length=sqrt(length) +c$$$ rand_v(1)=rand_v(1)-cost*dc_norm(1,i_sc) +c$$$ rand_v(2)=rand_v(2)-cost*dc_norm(2,i_sc) +c$$$ rand_v(3)=rand_v(3)-cost*dc_norm(3,i_sc) +c$$$ enddo +c$$$ rand_v(1)=rand_v(1)/length +c$$$ rand_v(2)=rand_v(2)/length +c$$$ rand_v(3)=rand_v(3)/length +c$$$ +c$$$ cost=dcos(rad_ang) +c$$$ sint=dsin(rad_ang) +c$$$ dc(1,i_sc)=vbld(i_sc)*(dc_norm(1,i_sc)*cost+rand_v(1)*sint) +c$$$ dc(2,i_sc)=vbld(i_sc)*(dc_norm(2,i_sc)*cost+rand_v(2)*sint) +c$$$ dc(3,i_sc)=vbld(i_sc)*(dc_norm(3,i_sc)*cost+rand_v(3)*sint) +c$$$ dc_norm(1,i_sc)=dc(1,i_sc)*vbld_inv(i_sc) +c$$$ dc_norm(2,i_sc)=dc(2,i_sc)*vbld_inv(i_sc) +c$$$ dc_norm(3,i_sc)=dc(3,i_sc)*vbld_inv(i_sc) +c$$$ c(1,i_sc)=c(1,i)+dc(1,i_sc) +c$$$ c(2,i_sc)=c(2,i)+dc(2,i_sc) +c$$$ c(3,i_sc)=c(3,i)+dc(3,i_sc) +c$$$ +c$$$ call chainbuild_cart +c$$$ +c$$$ return +c$$$ end +c$$$ +c$$$c---------------------------------------------------------------------------- +c$$$ +c$$$ subroutine ss_relax3(i_in,j_in) +c$$$ implicit none +c$$$ +c$$$c Includes +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.CHAIN' +c$$$ include 'COMMON.IOUNITS' +c$$$ include 'COMMON.INTERACT' +c$$$ +c$$$c External functions +c$$$ external ran_number +c$$$ double precision ran_number +c$$$ +c$$$c Input arguments +c$$$ integer i_in,j_in +c$$$ +c$$$c Local variables +c$$$ double precision energy_sc(0:n_ene),etot +c$$$ double precision org_dc(3),org_dc_norm(3),org_c(3) +c$$$ double precision ang_pert,rand_fact,exp_fact,beta +c$$$ integer n,i_pert,i +c$$$ logical notdone +c$$$ +c$$$ +c$$$ beta=1.0D0 +c$$$ +c$$$ mask_r=.true. +c$$$ do i=nnt,nct +c$$$ mask_side(i)=0 +c$$$ enddo +c$$$ mask_side(i_in)=1 +c$$$ mask_side(j_in)=1 +c$$$ +c$$$ call etotal_sc(energy_sc) +c$$$ etot=energy_sc(0) +c$$$c write(iout,'(a,3d15.5)')" SS_MC_START ",energy_sc(0), +c$$$c + energy_sc(1),energy_sc(12) +c$$$ +c$$$ notdone=.true. +c$$$ n=0 +c$$$ do while (notdone) +c$$$ if (mod(n,2).eq.0) then +c$$$ i_pert=i_in +c$$$ else +c$$$ i_pert=j_in +c$$$ endif +c$$$ n=n+1 +c$$$ +c$$$ do i=1,3 +c$$$ org_dc(i)=dc(i,i_pert+nres) +c$$$ org_dc_norm(i)=dc_norm(i,i_pert+nres) +c$$$ org_c(i)=c(i,i_pert+nres) +c$$$ enddo +c$$$ ang_pert=ran_number(0.0D0,3.0D0) +c$$$ call perturb_side_chain(i_pert,ang_pert) +c$$$ call etotal_sc(energy_sc) +c$$$ exp_fact=exp(beta*(etot-energy_sc(0))) +c$$$ rand_fact=ran_number(0.0D0,1.0D0) +c$$$ if (rand_fact.lt.exp_fact) then +c$$$c write(iout,'(a,3d15.5)')" SS_MC_ACCEPT ",energy_sc(0), +c$$$c + energy_sc(1),energy_sc(12) +c$$$ etot=energy_sc(0) +c$$$ else +c$$$c write(iout,'(a,3d15.5)')" SS_MC_REJECT ",energy_sc(0), +c$$$c + energy_sc(1),energy_sc(12) +c$$$ do i=1,3 +c$$$ dc(i,i_pert+nres)=org_dc(i) +c$$$ dc_norm(i,i_pert+nres)=org_dc_norm(i) +c$$$ c(i,i_pert+nres)=org_c(i) +c$$$ enddo +c$$$ endif +c$$$ +c$$$ if (n.eq.10000.or.etot.lt.30.0D0) notdone=.false. +c$$$ enddo +c$$$ +c$$$ mask_r=.false. +c$$$ +c$$$ return +c$$$ end +c$$$ +c$$$c---------------------------------------------------------------------------- +c$$$ +c$$$ subroutine ss_relax2(etot,iretcode,nfun,i_in,j_in) +c$$$ implicit none +c$$$ include 'DIMENSIONS' +c$$$ integer liv,lv +c$$$ parameter (liv=60,lv=(77+maxres6*(maxres6+17)/2)) +c$$$********************************************************************* +c$$$* OPTIMIZE sets up SUMSL or DFP and provides a simple interface for * +c$$$* the calling subprogram. * +c$$$* when d(i)=1.0, then v(35) is the length of the initial step, * +c$$$* calculated in the usual pythagorean way. * +c$$$* absolute convergence occurs when the function is within v(31) of * +c$$$* zero. unless you know the minimum value in advance, abs convg * +c$$$* is probably not useful. * +c$$$* relative convergence is when the model predicts that the function * +c$$$* will decrease by less than v(32)*abs(fun). * +c$$$********************************************************************* +c$$$ include 'COMMON.IOUNITS' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.GEO' +c$$$ include 'COMMON.MINIM' +c$$$ include 'COMMON.CHAIN' +c$$$ +c$$$ double precision orig_ss_dc,orig_ss_var,orig_ss_dist +c$$$ common /orig_ss/ orig_ss_dc(3,0:maxres2),orig_ss_var(maxvar), +c$$$ + orig_ss_dist(maxres2,maxres2) +c$$$ +c$$$ double precision etot +c$$$ integer iretcode,nfun,i_in,j_in +c$$$ +c$$$ external dist +c$$$ double precision dist +c$$$ external ss_func,fdum +c$$$ double precision ss_func,fdum +c$$$ +c$$$ integer iv(liv),uiparm(2) +c$$$ double precision v(lv),x(maxres6),d(maxres6),rdum +c$$$ integer i,j,k +c$$$ +c$$$ +c$$$ call deflt(2,iv,liv,lv,v) +c$$$* 12 means fresh start, dont call deflt +c$$$ iv(1)=12 +c$$$* max num of fun calls +c$$$ if (maxfun.eq.0) maxfun=500 +c$$$ iv(17)=maxfun +c$$$* max num of iterations +c$$$ if (maxmin.eq.0) maxmin=1000 +c$$$ iv(18)=maxmin +c$$$* controls output +c$$$ iv(19)=2 +c$$$* selects output unit +c$$$c iv(21)=iout +c$$$ iv(21)=0 +c$$$* 1 means to print out result +c$$$ iv(22)=0 +c$$$* 1 means to print out summary stats +c$$$ iv(23)=0 +c$$$* 1 means to print initial x and d +c$$$ iv(24)=0 +c$$$* min val for v(radfac) default is 0.1 +c$$$ v(24)=0.1D0 +c$$$* max val for v(radfac) default is 4.0 +c$$$ v(25)=2.0D0 +c$$$c v(25)=4.0D0 +c$$$* check false conv if (act fnctn decrease) .lt. v(26)*(exp decrease) +c$$$* the sumsl default is 0.1 +c$$$ v(26)=0.1D0 +c$$$* false conv if (act fnctn decrease) .lt. v(34) +c$$$* the sumsl default is 100*machep +c$$$ v(34)=v(34)/100.0D0 +c$$$* absolute convergence +c$$$ if (tolf.eq.0.0D0) tolf=1.0D-4 +c$$$ v(31)=tolf +c$$$ v(31)=1.0D-1 +c$$$* relative convergence +c$$$ if (rtolf.eq.0.0D0) rtolf=1.0D-4 +c$$$ v(32)=rtolf +c$$$ v(32)=1.0D-1 +c$$$* controls initial step size +c$$$ v(35)=1.0D-1 +c$$$* large vals of d correspond to small components of step +c$$$ do i=1,6*nres +c$$$ d(i)=1.0D0 +c$$$ enddo +c$$$ +c$$$ do i=0,2*nres +c$$$ do j=1,3 +c$$$ orig_ss_dc(j,i)=dc(j,i) +c$$$ enddo +c$$$ enddo +c$$$ call geom_to_var(nvar,orig_ss_var) +c$$$ +c$$$ do i=1,nres +c$$$ do j=i,nres +c$$$ orig_ss_dist(j,i)=dist(j,i) +c$$$ orig_ss_dist(j+nres,i)=dist(j+nres,i) +c$$$ orig_ss_dist(j,i+nres)=dist(j,i+nres) +c$$$ orig_ss_dist(j+nres,i+nres)=dist(j+nres,i+nres) +c$$$ enddo +c$$$ enddo +c$$$ +c$$$ k=0 +c$$$ do i=1,nres-1 +c$$$ do j=1,3 +c$$$ k=k+1 +c$$$ x(k)=dc(j,i) +c$$$ enddo +c$$$ enddo +c$$$ do i=2,nres-1 +c$$$ if (ialph(i,1).gt.0) then +c$$$ do j=1,3 +c$$$ k=k+1 +c$$$ x(k)=dc(j,i+nres) +c$$$ enddo +c$$$ endif +c$$$ enddo +c$$$ +c$$$ uiparm(1)=i_in +c$$$ uiparm(2)=j_in +c$$$ call smsno(k,d,x,ss_func,iv,liv,lv,v,uiparm,rdum,fdum) +c$$$ etot=v(10) +c$$$ iretcode=iv(1) +c$$$ nfun=iv(6)+iv(30) +c$$$ +c$$$ k=0 +c$$$ do i=1,nres-1 +c$$$ do j=1,3 +c$$$ k=k+1 +c$$$ dc(j,i)=x(k) +c$$$ enddo +c$$$ enddo +c$$$ do i=2,nres-1 +c$$$ if (ialph(i,1).gt.0) then +c$$$ do j=1,3 +c$$$ k=k+1 +c$$$ dc(j,i+nres)=x(k) +c$$$ enddo +c$$$ endif +c$$$ enddo +c$$$ call chainbuild_cart +c$$$ +c$$$ return +c$$$ end +c$$$ +c$$$C----------------------------------------------------------------------------- +c$$$ +c$$$ subroutine ss_func(n,x,nf,f,uiparm,urparm,ufparm) +c$$$ implicit none +c$$$ include 'DIMENSIONS' +c$$$ include 'COMMON.DERIV' +c$$$ include 'COMMON.IOUNITS' +c$$$ include 'COMMON.VAR' +c$$$ include 'COMMON.CHAIN' +c$$$ include 'COMMON.INTERACT' +c$$$ include 'COMMON.SBRIDGE' +c$$$ +c$$$ double precision orig_ss_dc,orig_ss_var,orig_ss_dist +c$$$ common /orig_ss/ orig_ss_dc(3,0:maxres2),orig_ss_var(maxvar), +c$$$ + orig_ss_dist(maxres2,maxres2) +c$$$ +c$$$ integer n +c$$$ double precision x(maxres6) +c$$$ integer nf +c$$$ double precision f +c$$$ integer uiparm(2) +c$$$ real*8 urparm(1) +c$$$ external ufparm +c$$$ double precision ufparm +c$$$ +c$$$ external dist +c$$$ double precision dist +c$$$ +c$$$ integer i,j,k,ss_i,ss_j +c$$$ double precision tempf,var(maxvar) +c$$$ +c$$$ +c$$$ ss_i=uiparm(1) +c$$$ ss_j=uiparm(2) +c$$$ f=0.0D0 +c$$$ +c$$$ k=0 +c$$$ do i=1,nres-1 +c$$$ do j=1,3 +c$$$ k=k+1 +c$$$ dc(j,i)=x(k) +c$$$ enddo +c$$$ enddo +c$$$ do i=2,nres-1 +c$$$ if (ialph(i,1).gt.0) then +c$$$ do j=1,3 +c$$$ k=k+1 +c$$$ dc(j,i+nres)=x(k) +c$$$ enddo +c$$$ endif +c$$$ enddo +c$$$ call chainbuild_cart +c$$$ +c$$$ call geom_to_var(nvar,var) +c$$$ +c$$$c Constraints on all angles +c$$$ do i=1,nvar +c$$$ tempf=var(i)-orig_ss_var(i) +c$$$ f=f+tempf*tempf +c$$$ enddo +c$$$ +c$$$c Constraints on all distances +c$$$ do i=1,nres-1 +c$$$ if (i.gt.1) then +c$$$ tempf=dist(i+nres,i)-orig_ss_dist(i+nres,i) +c$$$ f=f+tempf*tempf +c$$$ endif +c$$$ do j=i+1,nres +c$$$ tempf=dist(j,i)-orig_ss_dist(j,i) +c$$$ if (tempf.lt.0.0D0 .or. j.eq.i+1) f=f+tempf*tempf +c$$$ tempf=dist(j+nres,i)-orig_ss_dist(j+nres,i) +c$$$ if (tempf.lt.0.0D0) f=f+tempf*tempf +c$$$ tempf=dist(j,i+nres)-orig_ss_dist(j,i+nres) +c$$$ if (tempf.lt.0.0D0) f=f+tempf*tempf +c$$$ tempf=dist(j+nres,i+nres)-orig_ss_dist(j+nres,i+nres) +c$$$ if (tempf.lt.0.0D0) f=f+tempf*tempf +c$$$ enddo +c$$$ enddo +c$$$ +c$$$c Constraints for the relevant CYS-CYS +c$$$ tempf=dist(nres+ss_i,nres+ss_j)-8.0D0 +c$$$ f=f+tempf*tempf +c$$$CCCCCCCCCCCCCCCCC ADD SOME ANGULAR STUFF +c$$$ +c$$$c$$$ if (nf.ne.nfl) then +c$$$c$$$ write(iout,'(a,i10,2d15.5)')"IN DIST_FUNC (NF,F,DIST)",nf, +c$$$c$$$ + f,dist(5+nres,14+nres) +c$$$c$$$ endif +c$$$ +c$$$ nfl=nf +c$$$ +c$$$ return +c$$$ end +c$$$ +c$$$C----------------------------------------------------------------------------- diff --git a/source/unres/src_MD-NEWSC/stochfric.F b/source/unres/src_MD-NEWSC/stochfric.F new file mode 100644 index 0000000..74eda61 --- /dev/null +++ b/source/unres/src_MD-NEWSC/stochfric.F @@ -0,0 +1,626 @@ + subroutine friction_force + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.IOUNITS' + double precision gamvec(MAXRES6) + common /syfek/ gamvec + double precision vv(3),vvtot(3,maxres),v_work(MAXRES6), + & ginvfric(maxres2,maxres2) + common /przechowalnia/ ginvfric + + logical lprn /.false./, checkmode /.false./ + + do i=0,MAXRES2 + do j=1,3 + friction(j,i)=0.0d0 + enddo + enddo + + do j=1,3 + d_t_work(j)=d_t(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + d_t_work(ind+j)=d_t(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + d_t_work(ind+j)=d_t(j,i+nres) + enddo + ind=ind+3 + endif + enddo + + call fricmat_mult(d_t_work,fric_work) + + if (.not.checkmode) return + + if (lprn) then + write (iout,*) "d_t_work and fric_work" + do i=1,3*dimen + write (iout,'(i3,2e15.5)') i,d_t_work(i),fric_work(i) + enddo + endif + do j=1,3 + friction(j,0)=fric_work(j) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + friction(j,i)=fric_work(ind+j) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + friction(j,i+nres)=fric_work(ind+j) + enddo + ind=ind+3 + endif + enddo + if (lprn) then + write(iout,*) "Friction backbone" + do i=0,nct-1 + write(iout,'(i5,3e15.5,5x,3e15.5)') + & i,(friction(j,i),j=1,3),(d_t(j,i),j=1,3) + enddo + write(iout,*) "Friction side chain" + do i=nnt,nct + write(iout,'(i5,3e15.5,5x,3e15.5)') + & i,(friction(j,i+nres),j=1,3),(d_t(j,i+nres),j=1,3) + enddo + endif + if (lprn) then + do j=1,3 + vv(j)=d_t(j,0) + enddo + do i=nnt,nct + do j=1,3 + vvtot(j,i)=vv(j)+0.5d0*d_t(j,i) + vvtot(j,i+nres)=vv(j)+d_t(j,i+nres) + vv(j)=vv(j)+d_t(j,i) + enddo + enddo + write (iout,*) "vvtot backbone and sidechain" + do i=nnt,nct + write (iout,'(i5,3e15.5,5x,3e15.5)') i,(vvtot(j,i),j=1,3), + & (vvtot(j,i+nres),j=1,3) + enddo + ind=0 + do i=nnt,nct-1 + do j=1,3 + v_work(ind+j)=vvtot(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + do j=1,3 + v_work(ind+j)=vvtot(j,i+nres) + enddo + ind=ind+3 + enddo + write (iout,*) "v_work gamvec and site-based friction forces" + do i=1,dimen1 + write (iout,'(i5,3e15.5)') i,v_work(i),gamvec(i), + & gamvec(i)*v_work(i) + enddo +c do i=1,dimen +c fric_work1(i)=0.0d0 +c do j=1,dimen1 +c fric_work1(i)=fric_work1(i)-A(j,i)*gamvec(j)*v_work(j) +c enddo +c enddo +c write (iout,*) "fric_work and fric_work1" +c do i=1,dimen +c write (iout,'(i5,2e15.5)') i,fric_work(i),fric_work1(i) +c enddo + do i=1,dimen + do j=1,dimen + ginvfric(i,j)=0.0d0 + do k=1,dimen + ginvfric(i,j)=ginvfric(i,j)+ginv(i,k)*fricmat(k,j) + enddo + enddo + enddo + write (iout,*) "ginvfric" + do i=1,dimen + write (iout,'(i5,100f8.3)') i,(ginvfric(i,j),j=1,dimen) + enddo + write (iout,*) "symmetry check" + do i=1,dimen + do j=1,i-1 + write (iout,*) i,j,ginvfric(i,j)-ginvfric(j,i) + enddo + enddo + endif + return + end +c----------------------------------------------------- + subroutine stochastic_force(stochforcvec) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.TIME1' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.IOUNITS' + + double precision x,sig,lowb,highb, + & ff(3),force(3,0:MAXRES2),zeta2,lowb2, + & highb2,sig2,forcvec(MAXRES6),stochforcvec(MAXRES6) + logical lprn /.false./ + do i=0,MAXRES2 + do j=1,3 + stochforc(j,i)=0.0d0 + enddo + enddo + x=0.0d0 + +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +c Compute the stochastic forces acting on bodies. Store in force. + do i=nnt,nct-1 + sig=stdforcp(i) + lowb=-5*sig + highb=5*sig + do j=1,3 + force(j,i)=anorm_distr(x,sig,lowb,highb) + enddo + enddo + do i=nnt,nct + sig2=stdforcsc(i) + lowb2=-5*sig2 + highb2=5*sig2 + do j=1,3 + force(j,i+nres)=anorm_distr(x,sig2,lowb2,highb2) + enddo + enddo +#ifdef MPI + time_fsample=time_fsample+MPI_Wtime()-time00 +#else + time_fsample=time_fsample+tcpu()-time00 +#endif +c Compute the stochastic forces acting on virtual-bond vectors. + do j=1,3 + ff(j)=0.0d0 + enddo + do i=nct-1,nnt,-1 + do j=1,3 + stochforc(j,i)=ff(j)+0.5d0*force(j,i) + enddo + do j=1,3 + ff(j)=ff(j)+force(j,i) + enddo + if (itype(i+1).ne.21) then + do j=1,3 + stochforc(j,i)=stochforc(j,i)+force(j,i+nres+1) + ff(j)=ff(j)+force(j,i+nres+1) + enddo + endif + enddo + do j=1,3 + stochforc(j,0)=ff(j)+force(j,nnt+nres) + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + stochforc(j,i+nres)=force(j,i+nres) + enddo + endif + enddo + + do j=1,3 + stochforcvec(j)=stochforc(j,0) + enddo + ind=3 + do i=nnt,nct-1 + do j=1,3 + stochforcvec(ind+j)=stochforc(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + stochforcvec(ind+j)=stochforc(j,i+nres) + enddo + ind=ind+3 + endif + enddo + if (lprn) then + write (iout,*) "stochforcvec" + do i=1,3*dimen + write(iout,'(i5,e15.5)') i,stochforcvec(i) + enddo + write(iout,*) "Stochastic forces backbone" + do i=0,nct-1 + write(iout,'(i5,3e15.5)') i,(stochforc(j,i),j=1,3) + enddo + write(iout,*) "Stochastic forces side chain" + do i=nnt,nct + write(iout,'(i5,3e15.5)') + & i,(stochforc(j,i+nres),j=1,3) + enddo + endif + + if (lprn) then + + ind=0 + do i=nnt,nct-1 + write (iout,*) i,ind + do j=1,3 + forcvec(ind+j)=force(j,i) + enddo + ind=ind+3 + enddo + do i=nnt,nct + write (iout,*) i,ind + do j=1,3 + forcvec(j+ind)=force(j,i+nres) + enddo + ind=ind+3 + enddo + + write (iout,*) "forcvec" + ind=0 + do i=nnt,nct-1 + do j=1,3 + write (iout,'(2i3,2f10.5)') i,j,force(j,i), + & forcvec(ind+j) + enddo + ind=ind+3 + enddo + do i=nnt,nct + do j=1,3 + write (iout,'(2i3,2f10.5)') i,j,force(j,i+nres), + & forcvec(ind+j) + enddo + ind=ind+3 + enddo + + endif + + return + end +c------------------------------------------------------------------ + subroutine setup_fricmat + implicit real*8 (a-h,o-z) +#ifdef MPI + include 'mpif.h' +#endif + include 'DIMENSIONS' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.MD' + include 'COMMON.SETUP' + include 'COMMON.TIME1' +c integer licznik /0/ +c save licznik +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.IOUNITS' + integer IERROR + integer i,j,ind,ind1,m + logical lprn /.false./ + double precision dtdi,gamvec(MAXRES2), + & ginvfric(maxres2,maxres2),Ghalf(mmaxres2),fcopy(maxres2,maxres2) + common /syfek/ gamvec + double precision work(8*maxres2) + integer iwork(maxres2) + common /przechowalnia/ ginvfric,Ghalf,fcopy +#ifdef MPI + if (fg_rank.ne.king) goto 10 +#endif +c Zeroing out fricmat + do i=1,dimen + do j=1,dimen + fricmat(i,j)=0.0d0 + enddo + enddo +c Load the friction coefficients corresponding to peptide groups + ind1=0 + do i=nnt,nct-1 + ind1=ind1+1 + gamvec(ind1)=gamp + enddo +c Load the friction coefficients corresponding to side chains + m=nct-nnt + ind=0 + do i=nnt,nct + ind=ind+1 + ii = ind+m + iti=itype(i) + gamvec(ii)=gamsc(iti) + enddo + if (surfarea) call sdarea(gamvec) +c if (lprn) then +c write (iout,*) "Matrix A and vector gamma" +c do i=1,dimen1 +c write (iout,'(i2,$)') i +c do j=1,dimen +c write (iout,'(f4.1,$)') A(i,j) +c enddo +c write (iout,'(f8.3)') gamvec(i) +c enddo +c endif + if (lprn) then + write (iout,*) "Vector gamvec" + do i=1,dimen1 + write (iout,'(i5,f10.5)') i, gamvec(i) + enddo + endif + +c The friction matrix + do k=1,dimen + do i=1,dimen + dtdi=0.0d0 + do j=1,dimen1 + dtdi=dtdi+A(j,k)*A(j,i)*gamvec(j) + enddo + fricmat(k,i)=dtdi + enddo + enddo + + if (lprn) then + write (iout,'(//a)') "Matrix fricmat" + call matout2(dimen,dimen,maxres2,maxres2,fricmat) + endif + if (lang.eq.2 .or. lang.eq.3) then +c Mass-scale the friction matrix if non-direct integration will be performed + do i=1,dimen + do j=1,dimen + Ginvfric(i,j)=0.0d0 + do k=1,dimen + do l=1,dimen + Ginvfric(i,j)=Ginvfric(i,j)+ + & Gsqrm(i,k)*Gsqrm(l,j)*fricmat(k,l) + enddo + enddo + enddo + enddo +c Diagonalize the friction matrix + ind=0 + do i=1,dimen + do j=1,i + ind=ind+1 + Ghalf(ind)=Ginvfric(i,j) + enddo + enddo + call gldiag(maxres2,dimen,dimen,Ghalf,work,fricgam,fricvec, + & ierr,iwork) + if (lprn) then + write (iout,'(//2a)') "Eigenvectors and eigenvalues of the", + & " mass-scaled friction matrix" + call eigout(dimen,dimen,maxres2,maxres2,fricvec,fricgam) + endif +c Precompute matrices for tinker stochastic integrator +#ifndef LANG0 + do i=1,dimen + do j=1,dimen + mt1(i,j)=0.0d0 + mt2(i,j)=0.0d0 + do k=1,dimen + mt1(i,j)=mt1(i,j)+fricvec(k,i)*gsqrm(k,j) + mt2(i,j)=mt2(i,j)+fricvec(k,i)*gsqrp(k,j) + enddo + mt3(j,i)=mt1(i,j) + enddo + enddo +#endif + else if (lang.eq.4) then +c Diagonalize the friction matrix + ind=0 + do i=1,dimen + do j=1,i + ind=ind+1 + Ghalf(ind)=fricmat(i,j) + enddo + enddo + call gldiag(maxres2,dimen,dimen,Ghalf,work,fricgam,fricvec, + & ierr,iwork) + if (lprn) then + write (iout,'(//2a)') "Eigenvectors and eigenvalues of the", + & " friction matrix" + call eigout(dimen,dimen,maxres2,maxres2,fricvec,fricgam) + endif +c Determine the number of zero eigenvalues of the friction matrix + nzero=max0(dimen-dimen1,0) +c do while (fricgam(nzero+1).le.1.0d-5 .and. nzero.lt.dimen) +c nzero=nzero+1 +c enddo + write (iout,*) "Number of zero eigenvalues:",nzero + do i=1,dimen + do j=1,dimen + fricmat(i,j)=0.0d0 + do k=nzero+1,dimen + fricmat(i,j)=fricmat(i,j) + & +fricvec(i,k)*fricvec(j,k)/fricgam(k) + enddo + enddo + enddo + if (lprn) then + write (iout,'(//a)') "Generalized inverse of fricmat" + call matout(dimen,dimen,maxres6,maxres6,fricmat) + endif + endif +#ifdef MPI + 10 continue + if (nfgtasks.gt.1) then + if (fg_rank.eq.0) then +c The matching BROADCAST for fg processors is called in ERGASTULUM +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif + call MPI_Bcast(10,1,MPI_INTEGER,king,FG_COMM,IERROR) +#ifdef MPI + time_Bcast=time_Bcast+MPI_Wtime()-time00 +#else + time_Bcast=time_Bcast+tcpu()-time00 +#endif +c print *,"Processor",myrank, +c & " BROADCAST iorder in SETUP_FRICMAT" + endif +c licznik=licznik+1 +c write (iout,*) "setup_fricmat licznik",licznik +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif +c Scatter the friction matrix + call MPI_Scatterv(fricmat(1,1),nginv_counts(0), + & nginv_start(0),MPI_DOUBLE_PRECISION,fcopy(1,1), + & myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR) +#ifdef TIMING +#ifdef MPI + time_scatter=time_scatter+MPI_Wtime()-time00 + time_scatter_fmat=time_scatter_fmat+MPI_Wtime()-time00 +#else + time_scatter=time_scatter+tcpu()-time00 + time_scatter_fmat=time_scatter_fmat+tcpu()-time00 +#endif +#endif + do i=1,dimen + do j=1,2*my_ng_count + fricmat(j,i)=fcopy(i,j) + enddo + enddo +c write (iout,*) "My chunk of fricmat" +c call MATOUT2(my_ng_count,dimen,maxres2,maxres2,fcopy) + endif +#endif + return + end +c------------------------------------------------------------------------------- + subroutine sdarea(gamvec) +c +c Scale the friction coefficients according to solvent accessible surface areas +c Code adapted from TINKER +c AL 9/3/04 +c + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CONTROL' + include 'COMMON.VAR' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.CHAIN' + include 'COMMON.DERIV' + include 'COMMON.GEO' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.NAMES' + double precision radius(maxres2),gamvec(maxres2) + parameter (twosix=1.122462048309372981d0) + logical lprn /.false./ +c +c determine new friction coefficients every few SD steps +c +c set the atomic radii to estimates of sigma values +c +c print *,"Entered sdarea" + probe = 0.0d0 + + do i=1,2*nres + radius(i)=0.0d0 + enddo +c Load peptide group radii + do i=nnt,nct-1 + radius(i)=pstok + enddo +c Load side chain radii + do i=nnt,nct + iti=itype(i) + radius(i+nres)=restok(iti) + enddo +c do i=1,2*nres +c write (iout,*) "i",i," radius",radius(i) +c enddo + do i = 1, 2*nres + radius(i) = radius(i) / twosix + if (radius(i) .ne. 0.0d0) radius(i) = radius(i) + probe + end do +c +c scale atomic friction coefficients by accessible area +c + if (lprn) write (iout,*) + & "Original gammas, surface areas, scaling factors, new gammas, ", + & "std's of stochastic forces" + ind=0 + do i=nnt,nct-1 + if (radius(i).gt.0.0d0) then + call surfatom (i,area,radius) + ratio = dmax1(area/(4.0d0*pi*radius(i)**2),1.0d-1) + if (lprn) write (iout,'(i5,3f10.5,$)') + & i,gamvec(ind+1),area,ratio + do j=1,3 + ind=ind+1 + gamvec(ind) = ratio * gamvec(ind) + enddo + stdforcp(i)=stdfp*dsqrt(gamvec(ind)) + if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcp(i) + endif + enddo + do i=nnt,nct + if (radius(i+nres).gt.0.0d0) then + call surfatom (i+nres,area,radius) + ratio = dmax1(area/(4.0d0*pi*radius(i+nres)**2),1.0d-1) + if (lprn) write (iout,'(i5,3f10.5,$)') + & i,gamvec(ind+1),area,ratio + do j=1,3 + ind=ind+1 + gamvec(ind) = ratio * gamvec(ind) + enddo + stdforcsc(i)=stdfsc(itype(i))*dsqrt(gamvec(ind)) + if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcsc(i) + endif + enddo + + return + end diff --git a/source/unres/src_MD-NEWSC/sumsld.f b/source/unres/src_MD-NEWSC/sumsld.f new file mode 100644 index 0000000..1ce7b78 --- /dev/null +++ b/source/unres/src_MD-NEWSC/sumsld.f @@ -0,0 +1,1446 @@ + subroutine sumsl(n, d, x, calcf, calcg, iv, liv, lv, v, + 1 uiparm, urparm, ufparm) +c +c *** minimize general unconstrained objective function using *** +c *** analytic gradient and hessian approx. from secant update *** +c + integer n, liv, lv + integer iv(liv), uiparm(1) + double precision d(n), x(n), v(lv), urparm(1) +c dimension v(71 + n*(n+15)/2), uiparm(*), urparm(*) + external calcf, calcg, ufparm +c +c *** purpose *** +c +c this routine interacts with subroutine sumit in an attempt +c to find an n-vector x* that minimizes the (unconstrained) +c objective function computed by calcf. (often the x* found is +c a local minimizer rather than a global one.) +c +c-------------------------- parameter usage -------------------------- +c +c n........ (input) the number of variables on which f depends, i.e., +c the number of components in x. +c d........ (input/output) a scale vector such that d(i)*x(i), +c i = 1,2,...,n, are all in comparable units. +c d can strongly affect the behavior of sumsl. +c finding the best choice of d is generally a trial- +c and-error process. choosing d so that d(i)*x(i) +c has about the same value for all i often works well. +c the defaults provided by subroutine deflt (see i +c below) require the caller to supply d. +c x........ (input/output) before (initially) calling sumsl, the call- +c er should set x to an initial guess at x*. when +c sumsl returns, x contains the best point so far +c found, i.e., the one that gives the least value so +c far seen for f(x). +c calcf.... (input) a subroutine that, given x, computes f(x). calcf +c must be declared external in the calling program. +c it is invoked by +c call calcf(n, x, nf, f, uiparm, urparm, ufparm) +c when calcf is called, nf is the invocation +c count for calcf. nf is included for possible use +c with calcg. if x is out of bounds (e.g., if it +c would cause overflow in computing f(x)), then calcf +c should set nf to 0. this will cause a shorter step +c to be attempted. (if x is in bounds, then calcf +c should not change nf.) the other parameters are as +c described above and below. calcf should not change +c n, p, or x. +c calcg.... (input) a subroutine that, given x, computes g(x), the gra- +c dient of f at x. calcg must be declared external in +c the calling program. it is invoked by +c call calcg(n, x, nf, g, uiparm, urparm, ufaprm) +c when calcg is called, nf is the invocation +c count for calcf at the time f(x) was evaluated. the +c x passed to calcg is usually the one passed to calcf +c on either its most recent invocation or the one +c prior to it. if calcf saves intermediate results +c for use by calcg, then it is possible to tell from +c nf whether they are valid for the current x (or +c which copy is valid if two copies are kept). if g +c cannot be computed at x, then calcg should set nf to +c 0. in this case, sumsl will return with iv(1) = 65. +c (if g can be computed at x, then calcg should not +c changed nf.) the other parameters to calcg are as +c described above and below. calcg should not change +c n or x. +c iv....... (input/output) an integer value array of length liv (see +c below) that helps control the sumsl algorithm and +c that is used to store various intermediate quanti- +c ties. of particular interest are the initialization/ +c return code iv(1) and the entries in iv that control +c printing and limit the number of iterations and func- +c tion evaluations. see the section on iv input +c values below. +c liv...... (input) length of iv array. must be at least 60. if li +c is too small, then sumsl returns with iv(1) = 15. +c when sumsl returns, the smallest allowed value of +c liv is stored in iv(lastiv) -- see the section on +c iv output values below. (this is intended for use +c with extensions of sumsl that handle constraints.) +c lv....... (input) length of v array. must be at least 71+n*(n+15)/2. +c (at least 77+n*(n+17)/2 for smsno, at least +c 78+n*(n+12) for humsl). if lv is too small, then +c sumsl returns with iv(1) = 16. when sumsl returns, +c the smallest allowed value of lv is stored in +c iv(lastv) -- see the section on iv output values +c below. +c v........ (input/output) a floating-point value array of length l +c (see below) that helps control the sumsl algorithm +c and that is used to store various intermediate +c quantities. of particular interest are the entries +c in v that limit the length of the first step +c attempted (lmax0) and specify convergence tolerances +c (afctol, lmaxs, rfctol, sctol, xctol, xftol). +c uiparm... (input) user integer parameter array passed without change +c to calcf and calcg. +c urparm... (input) user floating-point parameter array passed without +c change to calcf and calcg. +c ufparm... (input) user external subroutine or function passed without +c change to calcf and calcg. +c +c *** iv input values (from subroutine deflt) *** +c +c iv(1)... on input, iv(1) should have a value between 0 and 14...... +c 0 and 12 mean this is a fresh start. 0 means that +c deflt(2, iv, liv, lv, v) +c is to be called to provide all default values to iv and +c v. 12 (the value that deflt assigns to iv(1)) means the +c caller has already called deflt and has possibly changed +c some iv and/or v entries to non-default values. +c 13 means deflt has been called and that sumsl (and +c sumit) should only do their storage allocation. that is, +c they should set the output components of iv that tell +c where various subarrays arrays of v begin, such as iv(g) +c (and, for humsl and humit only, iv(dtol)), and return. +c 14 means that a storage has been allocated (by a call +c with iv(1) = 13) and that the algorithm should be +c started. when called with iv(1) = 13, sumsl returns +c iv(1) = 14 unless liv or lv is too small (or n is not +c positive). default = 12. +c iv(inith).... iv(25) tells whether the hessian approximation h should +c be initialized. 1 (the default) means sumit should +c initialize h to the diagonal matrix whose i-th diagonal +c element is d(i)**2. 0 means the caller has supplied a +c cholesky factor l of the initial hessian approximation +c h = l*(l**t) in v, starting at v(iv(lmat)) = v(iv(42)) +c (and stored compactly by rows). note that iv(lmat) may +c be initialized by calling sumsl with iv(1) = 13 (see +c the iv(1) discussion above). default = 1. +c iv(mxfcal)... iv(17) gives the maximum number of function evaluations +c (calls on calcf) allowed. if this number does not suf- +c fice, then sumsl returns with iv(1) = 9. default = 200. +c iv(mxiter)... iv(18) gives the maximum number of iterations allowed. +c it also indirectly limits the number of gradient evalua- +c tions (calls on calcg) to iv(mxiter) + 1. if iv(mxiter) +c iterations do not suffice, then sumsl returns with +c iv(1) = 10. default = 150. +c iv(outlev)... iv(19) controls the number and length of iteration sum- +c mary lines printed (by itsum). iv(outlev) = 0 means do +c not print any summary lines. otherwise, print a summary +c line after each abs(iv(outlev)) iterations. if iv(outlev) +c is positive, then summary lines of length 78 (plus carri- +c age control) are printed, including the following... the +c iteration and function evaluation counts, f = the current +c function value, relative difference in function values +c achieved by the latest step (i.e., reldf = (f0-v(f))/f01, +c where f01 is the maximum of abs(v(f)) and abs(v(f0)) and +c v(f0) is the function value from the previous itera- +c tion), the relative function reduction predicted for the +c step just taken (i.e., preldf = v(preduc) / f01, where +c v(preduc) is described below), the scaled relative change +c in x (see v(reldx) below), the step parameter for the +c step just taken (stppar = 0 means a full newton step, +c between 0 and 1 means a relaxed newton step, between 1 +c and 2 means a double dogleg step, greater than 2 means +c a scaled down cauchy step -- see subroutine dbldog), the +c 2-norm of the scale vector d times the step just taken +c (see v(dstnrm) below), and npreldf, i.e., +c v(nreduc)/f01, where v(nreduc) is described below -- if +c npreldf is positive, then it is the relative function +c reduction predicted for a newton step (one with +c stppar = 0). if npreldf is negative, then it is the +c negative of the relative function reduction predicted +c for a step computed with step bound v(lmaxs) for use in +c testing for singular convergence. +c if iv(outlev) is negative, then lines of length 50 +c are printed, including only the first 6 items listed +c above (through reldx). +c default = 1. +c iv(parprt)... iv(20) = 1 means print any nondefault v values on a +c fresh start or any changed v values on a restart. +c iv(parprt) = 0 means skip this printing. default = 1. +c iv(prunit)... iv(21) is the output unit number on which all printing +c is done. iv(prunit) = 0 means suppress all printing. +c default = standard output unit (unit 6 on most systems). +c iv(solprt)... iv(22) = 1 means print out the value of x returned (as +c well as the gradient and the scale vector d). +c iv(solprt) = 0 means skip this printing. default = 1. +c iv(statpr)... iv(23) = 1 means print summary statistics upon return- +c ing. these consist of the function value, the scaled +c relative change in x caused by the most recent step (see +c v(reldx) below), the number of function and gradient +c evaluations (calls on calcf and calcg), and the relative +c function reductions predicted for the last step taken and +c for a newton step (or perhaps a step bounded by v(lmaxs) +c -- see the descriptions of preldf and npreldf under +c iv(outlev) above). +c iv(statpr) = 0 means skip this printing. +c iv(statpr) = -1 means skip this printing as well as that +c of the one-line termination reason message. default = 1. +c iv(x0prt).... iv(24) = 1 means print the initial x and scale vector d +c (on a fresh start only). iv(x0prt) = 0 means skip this +c printing. default = 1. +c +c *** (selected) iv output values *** +c +c iv(1)........ on output, iv(1) is a return code.... +c 3 = x-convergence. the scaled relative difference (see +c v(reldx)) between the current parameter vector x and +c a locally optimal parameter vector is very likely at +c most v(xctol). +c 4 = relative function convergence. the relative differ- +c ence between the current function value and its lo- +c cally optimal value is very likely at most v(rfctol). +c 5 = both x- and relative function convergence (i.e., the +c conditions for iv(1) = 3 and iv(1) = 4 both hold). +c 6 = absolute function convergence. the current function +c value is at most v(afctol) in absolute value. +c 7 = singular convergence. the hessian near the current +c iterate appears to be singular or nearly so, and a +c step of length at most v(lmaxs) is unlikely to yield +c a relative function decrease of more than v(sctol). +c 8 = false convergence. the iterates appear to be converg- +c ing to a noncritical point. this may mean that the +c convergence tolerances (v(afctol), v(rfctol), +c v(xctol)) are too small for the accuracy to which +c the function and gradient are being computed, that +c there is an error in computing the gradient, or that +c the function or gradient is discontinuous near x. +c 9 = function evaluation limit reached without other con- +c vergence (see iv(mxfcal)). +c 10 = iteration limit reached without other convergence +c (see iv(mxiter)). +c 11 = stopx returned .true. (external interrupt). see the +c usage notes below. +c 14 = storage has been allocated (after a call with +c iv(1) = 13). +c 17 = restart attempted with n changed. +c 18 = d has a negative component and iv(dtype) .le. 0. +c 19...43 = v(iv(1)) is out of range. +c 63 = f(x) cannot be computed at the initial x. +c 64 = bad parameters passed to assess (which should not +c occur). +c 65 = the gradient could not be computed at x (see calcg +c above). +c 67 = bad first parameter to deflt. +c 80 = iv(1) was out of range. +c 81 = n is not positive. +c iv(g)........ iv(28) is the starting subscript in v of the current +c gradient vector (the one corresponding to x). +c iv(lastiv)... iv(44) is the least acceptable value of liv. (it is +c only set if liv is at least 44.) +c iv(lastv).... iv(45) is the least acceptable value of lv. (it is +c only set if liv is large enough, at least iv(lastiv).) +c iv(nfcall)... iv(6) is the number of calls so far made on calcf (i.e., +c function evaluations). +c iv(ngcall)... iv(30) is the number of gradient evaluations (calls on +c calcg). +c iv(niter).... iv(31) is the number of iterations performed. +c +c *** (selected) v input values (from subroutine deflt) *** +c +c v(bias)..... v(43) is the bias parameter used in subroutine dbldog -- +c see that subroutine for details. default = 0.8. +c v(afctol)... v(31) is the absolute function convergence tolerance. +c if sumsl finds a point where the function value is less +c than v(afctol) in absolute value, and if sumsl does not +c return with iv(1) = 3, 4, or 5, then it returns with +c iv(1) = 6. this test can be turned off by setting +c v(afctol) to zero. default = max(10**-20, machep**2), +c where machep is the unit roundoff. +c v(dinit).... v(38), if nonnegative, is the value to which the scale +c vector d is initialized. default = -1. +c v(lmax0).... v(35) gives the maximum 2-norm allowed for d times the +c very first step that sumsl attempts. this parameter can +c markedly affect the performance of sumsl. +c v(lmaxs).... v(36) is used in testing for singular convergence -- if +c the function reduction predicted for a step of length +c bounded by v(lmaxs) is at most v(sctol) * abs(f0), where +c f0 is the function value at the start of the current +c iteration, and if sumsl does not return with iv(1) = 3, +c 4, 5, or 6, then it returns with iv(1) = 7. default = 1. +c v(rfctol)... v(32) is the relative function convergence tolerance. +c if the current model predicts a maximum possible function +c reduction (see v(nreduc)) of at most v(rfctol)*abs(f0) +c at the start of the current iteration, where f0 is the +c then current function value, and if the last step attempt- +c ed achieved no more than twice the predicted function +c decrease, then sumsl returns with iv(1) = 4 (or 5). +c default = max(10**-10, machep**(2/3)), where machep is +c the unit roundoff. +c v(sctol).... v(37) is the singular convergence tolerance -- see the +c description of v(lmaxs) above. +c v(tuner1)... v(26) helps decide when to check for false convergence. +c this is done if the actual function decrease from the +c current step is no more than v(tuner1) times its predict- +c ed value. default = 0.1. +c v(xctol).... v(33) is the x-convergence tolerance. if a newton step +c (see v(nreduc)) is tried that has v(reldx) .le. v(xctol) +c and if this step yields at most twice the predicted func- +c tion decrease, then sumsl returns with iv(1) = 3 (or 5). +c (see the description of v(reldx) below.) +c default = machep**0.5, where machep is the unit roundoff. +c v(xftol).... v(34) is the false convergence tolerance. if a step is +c tried that gives no more than v(tuner1) times the predict- +c ed function decrease and that has v(reldx) .le. v(xftol), +c and if sumsl does not return with iv(1) = 3, 4, 5, 6, or +c 7, then it returns with iv(1) = 8. (see the description +c of v(reldx) below.) default = 100*machep, where +c machep is the unit roundoff. +c v(*)........ deflt supplies to v a number of tuning constants, with +c which it should ordinarily be unnecessary to tinker. see +c section 17 of version 2.2 of the nl2sol usage summary +c (i.e., the appendix to ref. 1) for details on v(i), +c i = decfac, incfac, phmnfc, phmxfc, rdfcmn, rdfcmx, +c tuner2, tuner3, tuner4, tuner5. +c +c *** (selected) v output values *** +c +c v(dgnorm)... v(1) is the 2-norm of (diag(d)**-1)*g, where g is the +c most recently computed gradient. +c v(dstnrm)... v(2) is the 2-norm of diag(d)*step, where step is the +c current step. +c v(f)........ v(10) is the current function value. +c v(f0)....... v(13) is the function value at the start of the current +c iteration. +c v(nreduc)... v(6), if positive, is the maximum function reduction +c possible according to the current model, i.e., the func- +c tion reduction predicted for a newton step (i.e., +c step = -h**-1 * g, where g is the current gradient and +c h is the current hessian approximation). +c if v(nreduc) is negative, then it is the negative of +c the function reduction predicted for a step computed with +c a step bound of v(lmaxs) for use in testing for singular +c convergence. +c v(preduc)... v(7) is the function reduction predicted (by the current +c quadratic model) for the current step. this (divided by +c v(f0)) is used in testing for relative function +c convergence. +c v(reldx).... v(17) is the scaled relative change in x caused by the +c current step, computed as +c max(abs(d(i)*(x(i)-x0(i)), 1 .le. i .le. p) / +c max(d(i)*(abs(x(i))+abs(x0(i))), 1 .le. i .le. p), +c where x = x0 + step. +c +c------------------------------- notes ------------------------------- +c +c *** algorithm notes *** +c +c this routine uses a hessian approximation computed from the +c bfgs update (see ref 3). only a cholesky factor of the hessian +c approximation is stored, and this is updated using ideas from +c ref. 4. steps are computed by the double dogleg scheme described +c in ref. 2. the steps are assessed as in ref. 1. +c +c *** usage notes *** +c +c after a return with iv(1) .le. 11, it is possible to restart, +c i.e., to change some of the iv and v input values described above +c and continue the algorithm from the point where it was interrupt- +c ed. iv(1) should not be changed, nor should any entries of i +c and v other than the input values (those supplied by deflt). +c those who do not wish to write a calcg which computes the +c gradient analytically should call smsno rather than sumsl. +c smsno uses finite differences to compute an approximate gradient. +c those who would prefer to provide f and g (the function and +c gradient) by reverse communication rather than by writing subrou- +c tines calcf and calcg may call on sumit directly. see the com- +c ments at the beginning of sumit. +c those who use sumsl interactively may wish to supply their +c own stopx function, which should return .true. if the break key +c has been pressed since stopx was last invoked. this makes it +c possible to externally interrupt sumsl (which will return with +c iv(1) = 11 if stopx returns .true.). +c storage for g is allocated at the end of v. thus the caller +c may make v longer than specified above and may allow calcg to use +c elements of g beyond the first n as scratch storage. +c +c *** portability notes *** +c +c the sumsl distribution tape contains both single- and double- +c precision versions of the sumsl source code, so it should be un- +c necessary to change precisions. +c only the functions imdcon and rmdcon contain machine-dependent +c constants. to change from one machine to another, it should +c suffice to change the (few) relevant lines in these functions. +c intrinsic functions are explicitly declared. on certain com- +c puters (e.g. univac), it may be necessary to comment out these +c declarations. so that this may be done automatically by a simple +c program, such declarations are preceded by a comment having c/+ +c in columns 1-3 and blanks in columns 4-72 and are followed by +c a comment having c/ in columns 1 and 2 and blanks in columns 3-72. +c the sumsl source code is expressed in 1966 ansi standard +c fortran. it may be converted to fortran 77 by commenting out all +c lines that fall between a line having c/6 in columns 1-3 and a +c line having c/7 in columns 1-3 and by removing (i.e., replacing +c by a blank) the c in column 1 of the lines that follow the c/7 +c line and precede a line having c/ in columns 1-2 and blanks in +c columns 3-72. these changes convert some data statements into +c parameter statements, convert some variables from real to +c character*4, and make the data statements that initialize these +c variables use character strings delimited by primes instead +c of hollerith constants. (such variables and data statements +c appear only in modules itsum and parck. parameter statements +c appear nearly everywhere.) these changes also add save state- +c ments for variables given machine-dependent constants by rmdcon. +c +c *** references *** +c +c 1. dennis, j.e., gay, d.m., and welsch, r.e. (1981), algorithm 573 -- +c an adaptive nonlinear least-squares algorithm, acm trans. +c math. software 7, pp. 369-383. +c +c 2. dennis, j.e., and mei, h.h.w. (1979), two new unconstrained opti- +c mization algorithms which use function and gradient +c values, j. optim. theory applic. 28, pp. 453-482. +c +c 3. dennis, j.e., and more, j.j. (1977), quasi-newton methods, motiva- +c tion and theory, siam rev. 19, pp. 46-89. +c +c 4. goldfarb, d. (1976), factorized variable metric methods for uncon- +c strained optimization, math. comput. 30, pp. 796-811. +c +c *** general *** +c +c coded by david m. gay (winter 1980). revised summer 1982. +c this subroutine was written in connection with research +c supported in part by the national science foundation under +c grants mcs-7600324, dcr75-10143, 76-14311dss, mcs76-11989, +c and mcs-7906671. +c. +c +c---------------------------- declarations --------------------------- +c + external deflt, sumit +c +c deflt... supplies default iv and v input components. +c sumit... reverse-communication routine that carries out sumsl algo- +c rithm. +c + integer g1, iv1, nf + double precision f +c +c *** subscripts for iv *** +c + integer nextv, nfcall, nfgcal, g, toobig, vneed +c +c/6 +c data nextv/47/, nfcall/6/, nfgcal/7/, g/28/, toobig/2/, vneed/4/ +c/7 + parameter (nextv=47, nfcall=6, nfgcal=7, g=28, toobig=2, vneed=4) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + iv1 = iv(1) + if (iv1 .eq. 12 .or. iv1 .eq. 13) iv(vneed) = iv(vneed) + n + if (iv1 .eq. 14) go to 10 + if (iv1 .gt. 2 .and. iv1 .lt. 12) go to 10 + g1 = 1 + if (iv1 .eq. 12) iv(1) = 13 + go to 20 +c + 10 g1 = iv(g) +c + 20 call sumit(d, f, v(g1), iv, liv, lv, n, v, x) + if (iv(1) - 2) 30, 40, 50 +c + 30 nf = iv(nfcall) + call calcf(n, x, nf, f, uiparm, urparm, ufparm) + if (nf .le. 0) iv(toobig) = 1 + go to 20 +c + 40 call calcg(n, x, iv(nfgcal), v(g1), uiparm, urparm, ufparm) + go to 20 +c + 50 if (iv(1) .ne. 14) go to 999 +c +c *** storage allocation +c + iv(g) = iv(nextv) + iv(nextv) = iv(g) + n + if (iv1 .ne. 13) go to 10 +c + 999 return +c *** last card of sumsl follows *** + end + subroutine sumit(d, fx, g, iv, liv, lv, n, v, x) +c +c *** carry out sumsl (unconstrained minimization) iterations, using +c *** double-dogleg/bfgs steps. +c +c *** parameter declarations *** +c + integer liv, lv, n + integer iv(liv) + double precision d(n), fx, g(n), v(lv), x(n) +c +c-------------------------- parameter usage -------------------------- +c +c d.... scale vector. +c fx... function value. +c g.... gradient vector. +c iv... integer value array. +c liv.. length of iv (at least 60). +c lv... length of v (at least 71 + n*(n+13)/2). +c n.... number of variables (components in x and g). +c v.... floating-point value array. +c x.... vector of parameters to be optimized. +c +c *** discussion *** +c +c parameters iv, n, v, and x are the same as the corresponding +c ones to sumsl (which see), except that v can be shorter (since +c the part of v that sumsl uses for storing g is not needed). +c moreover, compared with sumsl, iv(1) may have the two additional +c output values 1 and 2, which are explained below, as is the use +c of iv(toobig) and iv(nfgcal). the value iv(g), which is an +c output value from sumsl (and smsno), is not referenced by +c sumit or the subroutines it calls. +c fx and g need not have been initialized when sumit is called +c with iv(1) = 12, 13, or 14. +c +c iv(1) = 1 means the caller should set fx to f(x), the function value +c at x, and call sumit again, having changed none of the +c other parameters. an exception occurs if f(x) cannot be +c (e.g. if overflow would occur), which may happen because +c of an oversized step. in this case the caller should set +c iv(toobig) = iv(2) to 1, which will cause sumit to ig- +c nore fx and try a smaller step. the parameter nf that +c sumsl passes to calcf (for possible use by calcg) is a +c copy of iv(nfcall) = iv(6). +c iv(1) = 2 means the caller should set g to g(x), the gradient vector +c of f at x, and call sumit again, having changed none of +c the other parameters except possibly the scale vector d +c when iv(dtype) = 0. the parameter nf that sumsl passes +c to calcg is iv(nfgcal) = iv(7). if g(x) cannot be +c evaluated, then the caller may set iv(nfgcal) to 0, in +c which case sumit will return with iv(1) = 65. +c. +c *** general *** +c +c coded by david m. gay (december 1979). revised sept. 1982. +c this subroutine was written in connection with research supported +c in part by the national science foundation under grants +c mcs-7600324 and mcs-7906671. +c +c (see sumsl for references.) +c +c+++++++++++++++++++++++++++ declarations ++++++++++++++++++++++++++++ +c +c *** local variables *** +c + integer dg1, dummy, g01, i, k, l, lstgst, nwtst1, step1, + 1 temp1, w, x01, z + double precision t +c +c *** constants *** +c + double precision half, negone, one, onep2, zero +c +c *** no intrinsic functions *** +c +c *** external functions and subroutines *** +c + external assst, dbdog, deflt, dotprd, itsum, litvmu, livmul, + 1 ltvmul, lupdat, lvmul, parck, reldst, stopx, vaxpy, + 2 vcopy, vscopy, vvmulp, v2norm, wzbfgs + logical stopx + double precision dotprd, reldst, v2norm +c +c assst.... assesses candidate step. +c dbdog.... computes double-dogleg (candidate) step. +c deflt.... supplies default iv and v input components. +c dotprd... returns inner product of two vectors. +c itsum.... prints iteration summary and info on initial and final x. +c litvmu... multiplies inverse transpose of lower triangle times vector. +c livmul... multiplies inverse of lower triangle times vector. +c ltvmul... multiplies transpose of lower triangle times vector. +c lupdt.... updates cholesky factor of hessian approximation. +c lvmul.... multiplies lower triangle times vector. +c parck.... checks validity of input iv and v values. +c reldst... computes v(reldx) = relative step size. +c stopx.... returns .true. if the break key has been pressed. +c vaxpy.... computes scalar times one vector plus another. +c vcopy.... copies one vector to another. +c vscopy... sets all elements of a vector to a scalar. +c vvmulp... multiplies vector by vector raised to power (componentwise). +c v2norm... returns the 2-norm of a vector. +c wzbfgs... computes w and z for lupdat corresponding to bfgs update. +c +c *** subscripts for iv and v *** +c + integer afctol + integer cnvcod, dg, dgnorm, dinit, dstnrm, dst0, f, f0, fdif, + 1 gthg, gtstep, g0, incfac, inith, irc, kagqt, lmat, lmax0, + 2 lmaxs, mode, model, mxfcal, mxiter, nextv, nfcall, nfgcal, + 3 ngcall, niter, nreduc, nwtstp, preduc, radfac, radinc, + 4 radius, rad0, reldx, restor, step, stglim, stlstg, toobig, + 5 tuner4, tuner5, vneed, xirc, x0 +c +c *** iv subscript values *** +c +c/6 +c data cnvcod/55/, dg/37/, g0/48/, inith/25/, irc/29/, kagqt/33/, +c 1 mode/35/, model/5/, mxfcal/17/, mxiter/18/, nfcall/6/, +c 2 nfgcal/7/, ngcall/30/, niter/31/, nwtstp/34/, radinc/8/, +c 3 restor/9/, step/40/, stglim/11/, stlstg/41/, toobig/2/, +c 4 vneed/4/, xirc/13/, x0/43/ +c/7 + parameter (cnvcod=55, dg=37, g0=48, inith=25, irc=29, kagqt=33, + 1 mode=35, model=5, mxfcal=17, mxiter=18, nfcall=6, + 2 nfgcal=7, ngcall=30, niter=31, nwtstp=34, radinc=8, + 3 restor=9, step=40, stglim=11, stlstg=41, toobig=2, + 4 vneed=4, xirc=13, x0=43) +c/ +c +c *** v subscript values *** +c +c/6 +c data afctol/31/ +c data dgnorm/1/, dinit/38/, dstnrm/2/, dst0/3/, f/10/, f0/13/, +c 1 fdif/11/, gthg/44/, gtstep/4/, incfac/23/, lmat/42/, +c 2 lmax0/35/, lmaxs/36/, nextv/47/, nreduc/6/, preduc/7/, +c 3 radfac/16/, radius/8/, rad0/9/, reldx/17/, tuner4/29/, +c 4 tuner5/30/ +c/7 + parameter (afctol=31) + parameter (dgnorm=1, dinit=38, dstnrm=2, dst0=3, f=10, f0=13, + 1 fdif=11, gthg=44, gtstep=4, incfac=23, lmat=42, + 2 lmax0=35, lmaxs=36, nextv=47, nreduc=6, preduc=7, + 3 radfac=16, radius=8, rad0=9, reldx=17, tuner4=29, + 4 tuner5=30) +c/ +c +c/6 +c data half/0.5d+0/, negone/-1.d+0/, one/1.d+0/, onep2/1.2d+0/, +c 1 zero/0.d+0/ +c/7 + parameter (half=0.5d+0, negone=-1.d+0, one=1.d+0, onep2=1.2d+0, + 1 zero=0.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c +C Following SAVE statement inserted. + save l + i = iv(1) + if (i .eq. 1) go to 50 + if (i .eq. 2) go to 60 +c +c *** check validity of iv and v input values *** +c + if (iv(1) .eq. 0) call deflt(2, iv, liv, lv, v) + if (iv(1) .eq. 12 .or. iv(1) .eq. 13) + 1 iv(vneed) = iv(vneed) + n*(n+13)/2 + call parck(2, d, iv, liv, lv, n, v) + i = iv(1) - 2 + if (i .gt. 12) go to 999 + go to (180, 180, 180, 180, 180, 180, 120, 90, 120, 10, 10, 20), i +c +c *** storage allocation *** +c +10 l = iv(lmat) + iv(x0) = l + n*(n+1)/2 + iv(step) = iv(x0) + n + iv(stlstg) = iv(step) + n + iv(g0) = iv(stlstg) + n + iv(nwtstp) = iv(g0) + n + iv(dg) = iv(nwtstp) + n + iv(nextv) = iv(dg) + n + if (iv(1) .ne. 13) go to 20 + iv(1) = 14 + go to 999 +c +c *** initialization *** +c + 20 iv(niter) = 0 + iv(nfcall) = 1 + iv(ngcall) = 1 + iv(nfgcal) = 1 + iv(mode) = -1 + iv(model) = 1 + iv(stglim) = 1 + iv(toobig) = 0 + iv(cnvcod) = 0 + iv(radinc) = 0 + v(rad0) = zero + if (v(dinit) .ge. zero) call vscopy(n, d, v(dinit)) + if (iv(inith) .ne. 1) go to 40 +c +c *** set the initial hessian approximation to diag(d)**-2 *** +c + l = iv(lmat) + call vscopy(n*(n+1)/2, v(l), zero) + k = l - 1 + do 30 i = 1, n + k = k + i + t = d(i) + if (t .le. zero) t = one + v(k) = t + 30 continue +c +c *** compute initial function value *** +c + 40 iv(1) = 1 + go to 999 +c + 50 v(f) = fx + if (iv(mode) .ge. 0) go to 180 + iv(1) = 2 + if (iv(toobig) .eq. 0) go to 999 + iv(1) = 63 + go to 300 +c +c *** make sure gradient could be computed *** +c + 60 if (iv(nfgcal) .ne. 0) go to 70 + iv(1) = 65 + go to 300 +c + 70 dg1 = iv(dg) + call vvmulp(n, v(dg1), g, d, -1) + v(dgnorm) = v2norm(n, v(dg1)) +c +c *** test norm of gradient *** +c + if (v(dgnorm) .gt. v(afctol)) go to 75 + iv(irc) = 10 + iv(cnvcod) = iv(irc) - 4 +c + 75 if (iv(cnvcod) .ne. 0) go to 290 + if (iv(mode) .eq. 0) go to 250 +c +c *** allow first step to have scaled 2-norm at most v(lmax0) *** +c + v(radius) = v(lmax0) +c + iv(mode) = 0 +c +c +c----------------------------- main loop ----------------------------- +c +c +c *** print iteration summary, check iteration limit *** +c + 80 call itsum(d, g, iv, liv, lv, n, v, x) + 90 k = iv(niter) + if (k .lt. iv(mxiter)) go to 100 + iv(1) = 10 + go to 300 +c +c *** update radius *** +c + 100 iv(niter) = k + 1 + if(k.gt.0)v(radius) = v(radfac) * v(dstnrm) +c +c *** initialize for start of next iteration *** +c + g01 = iv(g0) + x01 = iv(x0) + v(f0) = v(f) + iv(irc) = 4 + iv(kagqt) = -1 +c +c *** copy x to x0, g to g0 *** +c + call vcopy(n, v(x01), x) + call vcopy(n, v(g01), g) +c +c *** check stopx and function evaluation limit *** +c +C AL 4/30/95 + dummy=iv(nfcall) + 110 if (.not. stopx(dummy)) go to 130 + iv(1) = 11 + go to 140 +c +c *** come here when restarting after func. eval. limit or stopx. +c + 120 if (v(f) .ge. v(f0)) go to 130 + v(radfac) = one + k = iv(niter) + go to 100 +c + 130 if (iv(nfcall) .lt. iv(mxfcal)) go to 150 + iv(1) = 9 + 140 if (v(f) .ge. v(f0)) go to 300 +c +c *** in case of stopx or function evaluation limit with +c *** improved v(f), evaluate the gradient at x. +c + iv(cnvcod) = iv(1) + go to 240 +c +c. . . . . . . . . . . . . compute candidate step . . . . . . . . . . +c + 150 step1 = iv(step) + dg1 = iv(dg) + nwtst1 = iv(nwtstp) + if (iv(kagqt) .ge. 0) go to 160 + l = iv(lmat) + call livmul(n, v(nwtst1), v(l), g) + v(nreduc) = half * dotprd(n, v(nwtst1), v(nwtst1)) + call litvmu(n, v(nwtst1), v(l), v(nwtst1)) + call vvmulp(n, v(step1), v(nwtst1), d, 1) + v(dst0) = v2norm(n, v(step1)) + call vvmulp(n, v(dg1), v(dg1), d, -1) + call ltvmul(n, v(step1), v(l), v(dg1)) + v(gthg) = v2norm(n, v(step1)) + iv(kagqt) = 0 + 160 call dbdog(v(dg1), lv, n, v(nwtst1), v(step1), v) + if (iv(irc) .eq. 6) go to 180 +c +c *** check whether evaluating f(x0 + step) looks worthwhile *** +c + if (v(dstnrm) .le. zero) go to 180 + if (iv(irc) .ne. 5) go to 170 + if (v(radfac) .le. one) go to 170 + if (v(preduc) .le. onep2 * v(fdif)) go to 180 +c +c *** compute f(x0 + step) *** +c + 170 x01 = iv(x0) + step1 = iv(step) + call vaxpy(n, x, one, v(step1), v(x01)) + iv(nfcall) = iv(nfcall) + 1 + iv(1) = 1 + iv(toobig) = 0 + go to 999 +c +c. . . . . . . . . . . . . assess candidate step . . . . . . . . . . . +c + 180 x01 = iv(x0) + v(reldx) = reldst(n, d, x, v(x01)) + call assst(iv, liv, lv, v) + step1 = iv(step) + lstgst = iv(stlstg) + if (iv(restor) .eq. 1) call vcopy(n, x, v(x01)) + if (iv(restor) .eq. 2) call vcopy(n, v(lstgst), v(step1)) + if (iv(restor) .ne. 3) go to 190 + call vcopy(n, v(step1), v(lstgst)) + call vaxpy(n, x, one, v(step1), v(x01)) + v(reldx) = reldst(n, d, x, v(x01)) +c + 190 k = iv(irc) + go to (200,230,230,230,200,210,220,220,220,220,220,220,280,250), k +c +c *** recompute step with changed radius *** +c + 200 v(radius) = v(radfac) * v(dstnrm) + go to 110 +c +c *** compute step of length v(lmaxs) for singular convergence test. +c + 210 v(radius) = v(lmaxs) + go to 150 +c +c *** convergence or false convergence *** +c + 220 iv(cnvcod) = k - 4 + if (v(f) .ge. v(f0)) go to 290 + if (iv(xirc) .eq. 14) go to 290 + iv(xirc) = 14 +c +c. . . . . . . . . . . . process acceptable step . . . . . . . . . . . +c + 230 if (iv(irc) .ne. 3) go to 240 + step1 = iv(step) + temp1 = iv(stlstg) +c +c *** set temp1 = hessian * step for use in gradient tests *** +c + l = iv(lmat) + call ltvmul(n, v(temp1), v(l), v(step1)) + call lvmul(n, v(temp1), v(l), v(temp1)) +c +c *** compute gradient *** +c + 240 iv(ngcall) = iv(ngcall) + 1 + iv(1) = 2 + go to 999 +c +c *** initializations -- g0 = g - g0, etc. *** +c + 250 g01 = iv(g0) + call vaxpy(n, v(g01), negone, v(g01), g) + step1 = iv(step) + temp1 = iv(stlstg) + if (iv(irc) .ne. 3) go to 270 +c +c *** set v(radfac) by gradient tests *** +c +c *** set temp1 = diag(d)**-1 * (hessian*step + (g(x0)-g(x))) *** +c + call vaxpy(n, v(temp1), negone, v(g01), v(temp1)) + call vvmulp(n, v(temp1), v(temp1), d, -1) +c +c *** do gradient tests *** +c + if (v2norm(n, v(temp1)) .le. v(dgnorm) * v(tuner4)) + 1 go to 260 + if (dotprd(n, g, v(step1)) + 1 .ge. v(gtstep) * v(tuner5)) go to 270 + 260 v(radfac) = v(incfac) +c +c *** update h, loop *** +c + 270 w = iv(nwtstp) + z = iv(x0) + l = iv(lmat) + call wzbfgs(v(l), n, v(step1), v(w), v(g01), v(z)) +c +c ** use the n-vectors starting at v(step1) and v(g01) for scratch.. + call lupdat(v(temp1), v(step1), v(l), v(g01), v(l), n, v(w), v(z)) + iv(1) = 2 + go to 80 +c +c. . . . . . . . . . . . . . misc. details . . . . . . . . . . . . . . +c +c *** bad parameters to assess *** +c + 280 iv(1) = 64 + go to 300 +c +c *** print summary of final iteration and other requested items *** +c + 290 iv(1) = iv(cnvcod) + iv(cnvcod) = 0 + 300 call itsum(d, g, iv, liv, lv, n, v, x) +c + 999 return +c +c *** last line of sumit follows *** + end + subroutine dbdog(dig, lv, n, nwtstp, step, v) +c +c *** compute double dogleg step *** +c +c *** parameter declarations *** +c + integer lv, n + double precision dig(n), nwtstp(n), step(n), v(lv) +c +c *** purpose *** +c +c this subroutine computes a candidate step (for use in an uncon- +c strained minimization code) by the double dogleg algorithm of +c dennis and mei (ref. 1), which is a variation on powell*s dogleg +c scheme (ref. 2, p. 95). +c +c-------------------------- parameter usage -------------------------- +c +c dig (input) diag(d)**-2 * g -- see algorithm notes. +c g (input) the current gradient vector. +c lv (input) length of v. +c n (input) number of components in dig, g, nwtstp, and step. +c nwtstp (input) negative newton step -- see algorithm notes. +c step (output) the computed step. +c v (i/o) values array, the following components of which are +c used here... +c v(bias) (input) bias for relaxed newton step, which is v(bias) of +c the way from the full newton to the fully relaxed newton +c step. recommended value = 0.8 . +c v(dgnorm) (input) 2-norm of diag(d)**-1 * g -- see algorithm notes. +c v(dstnrm) (output) 2-norm of diag(d) * step, which is v(radius) +c unless v(stppar) = 0 -- see algorithm notes. +c v(dst0) (input) 2-norm of diag(d) * nwtstp -- see algorithm notes. +c v(grdfac) (output) the coefficient of dig in the step returned -- +c step(i) = v(grdfac)*dig(i) + v(nwtfac)*nwtstp(i). +c v(gthg) (input) square-root of (dig**t) * (hessian) * dig -- see +c algorithm notes. +c v(gtstep) (output) inner product between g and step. +c v(nreduc) (output) function reduction predicted for the full newton +c step. +c v(nwtfac) (output) the coefficient of nwtstp in the step returned -- +c see v(grdfac) above. +c v(preduc) (output) function reduction predicted for the step returned. +c v(radius) (input) the trust region radius. d times the step returned +c has 2-norm v(radius) unless v(stppar) = 0. +c v(stppar) (output) code telling how step was computed... 0 means a +c full newton step. between 0 and 1 means v(stppar) of the +c way from the newton to the relaxed newton step. between +c 1 and 2 means a true double dogleg step, v(stppar) - 1 of +c the way from the relaxed newton to the cauchy step. +c greater than 2 means 1 / (v(stppar) - 1) times the cauchy +c step. +c +c------------------------------- notes ------------------------------- +c +c *** algorithm notes *** +c +c let g and h be the current gradient and hessian approxima- +c tion respectively and let d be the current scale vector. this +c routine assumes dig = diag(d)**-2 * g and nwtstp = h**-1 * g. +c the step computed is the same one would get by replacing g and h +c by diag(d)**-1 * g and diag(d)**-1 * h * diag(d)**-1, +c computing step, and translating step back to the original +c variables, i.e., premultiplying it by diag(d)**-1. +c +c *** references *** +c +c 1. dennis, j.e., and mei, h.h.w. (1979), two new unconstrained opti- +c mization algorithms which use function and gradient +c values, j. optim. theory applic. 28, pp. 453-482. +c 2. powell, m.j.d. (1970), a hybrid method for non-linear equations, +c in numerical methods for non-linear equations, edited by +c p. rabinowitz, gordon and breach, london. +c +c *** general *** +c +c coded by david m. gay. +c this subroutine was written in connection with research supported +c by the national science foundation under grants mcs-7600324 and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** functions and subroutines called *** +c + external dotprd, v2norm + double precision dotprd, v2norm +c +c dotprd... returns inner product of two vectors. +c v2norm... returns 2-norm of a vector. +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c-------------------------- local variables -------------------------- +c + integer i + double precision cfact, cnorm, ctrnwt, ghinvg, femnsq, gnorm, + 1 nwtnrm, relax, rlambd, t, t1, t2 + double precision half, one, two, zero +c +c *** v subscripts *** +c + integer bias, dgnorm, dstnrm, dst0, grdfac, gthg, gtstep, + 1 nreduc, nwtfac, preduc, radius, stppar +c +c *** data initializations *** +c +c/6 +c data half/0.5d+0/, one/1.d+0/, two/2.d+0/, zero/0.d+0/ +c/7 + parameter (half=0.5d+0, one=1.d+0, two=2.d+0, zero=0.d+0) +c/ +c +c/6 +c data bias/43/, dgnorm/1/, dstnrm/2/, dst0/3/, grdfac/45/, +c 1 gthg/44/, gtstep/4/, nreduc/6/, nwtfac/46/, preduc/7/, +c 2 radius/8/, stppar/5/ +c/7 + parameter (bias=43, dgnorm=1, dstnrm=2, dst0=3, grdfac=45, + 1 gthg=44, gtstep=4, nreduc=6, nwtfac=46, preduc=7, + 2 radius=8, stppar=5) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + nwtnrm = v(dst0) + rlambd = one + if (nwtnrm .gt. zero) rlambd = v(radius) / nwtnrm + gnorm = v(dgnorm) + ghinvg = two * v(nreduc) + v(grdfac) = zero + v(nwtfac) = zero + if (rlambd .lt. one) go to 30 +c +c *** the newton step is inside the trust region *** +c + v(stppar) = zero + v(dstnrm) = nwtnrm + v(gtstep) = -ghinvg + v(preduc) = v(nreduc) + v(nwtfac) = -one + do 20 i = 1, n + 20 step(i) = -nwtstp(i) + go to 999 +c + 30 v(dstnrm) = v(radius) + cfact = (gnorm / v(gthg))**2 +c *** cauchy step = -cfact * g. + cnorm = gnorm * cfact + relax = one - v(bias) * (one - gnorm*cnorm/ghinvg) + if (rlambd .lt. relax) go to 50 +c +c *** step is between relaxed newton and full newton steps *** +c + v(stppar) = one - (rlambd - relax) / (one - relax) + t = -rlambd + v(gtstep) = t * ghinvg + v(preduc) = rlambd * (one - half*rlambd) * ghinvg + v(nwtfac) = t + do 40 i = 1, n + 40 step(i) = t * nwtstp(i) + go to 999 +c + 50 if (cnorm .lt. v(radius)) go to 70 +c +c *** the cauchy step lies outside the trust region -- +c *** step = scaled cauchy step *** +c + t = -v(radius) / gnorm + v(grdfac) = t + v(stppar) = one + cnorm / v(radius) + v(gtstep) = -v(radius) * gnorm + v(preduc) = v(radius)*(gnorm - half*v(radius)*(v(gthg)/gnorm)**2) + do 60 i = 1, n + 60 step(i) = t * dig(i) + go to 999 +c +c *** compute dogleg step between cauchy and relaxed newton *** +c *** femur = relaxed newton step minus cauchy step *** +c + 70 ctrnwt = cfact * relax * ghinvg / gnorm +c *** ctrnwt = inner prod. of cauchy and relaxed newton steps, +c *** scaled by gnorm**-1. + t1 = ctrnwt - gnorm*cfact**2 +c *** t1 = inner prod. of femur and cauchy step, scaled by +c *** gnorm**-1. + t2 = v(radius)*(v(radius)/gnorm) - gnorm*cfact**2 + t = relax * nwtnrm + femnsq = (t/gnorm)*t - ctrnwt - t1 +c *** femnsq = square of 2-norm of femur, scaled by gnorm**-1. + t = t2 / (t1 + dsqrt(t1**2 + femnsq*t2)) +c *** dogleg step = cauchy step + t * femur. + t1 = (t - one) * cfact + v(grdfac) = t1 + t2 = -t * relax + v(nwtfac) = t2 + v(stppar) = two - t + v(gtstep) = t1*gnorm**2 + t2*ghinvg + v(preduc) = -t1*gnorm * ((t2 + one)*gnorm) + 1 - t2 * (one + half*t2)*ghinvg + 2 - half * (v(gthg)*t1)**2 + do 80 i = 1, n + 80 step(i) = t1*dig(i) + t2*nwtstp(i) +c + 999 return +c *** last line of dbdog follows *** + end + subroutine ltvmul(n, x, l, y) +c +c *** compute x = (l**t)*y, where l is an n x n lower +c *** triangular matrix stored compactly by rows. x and y may +c *** occupy the same storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) +c dimension l(n*(n+1)/2) + integer i, ij, i0, j + double precision yi, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + i0 = 0 + do 20 i = 1, n + yi = y(i) + x(i) = zero + do 10 j = 1, i + ij = i0 + j + x(j) = x(j) + yi*l(ij) + 10 continue + i0 = i0 + i + 20 continue + 999 return +c *** last card of ltvmul follows *** + end + subroutine lupdat(beta, gamma, l, lambda, lplus, n, w, z) +c +c *** compute lplus = secant update of l *** +c +c *** parameter declarations *** +c + integer n +cal double precision beta(n), gamma(n), l(1), lambda(n), lplus(1), + double precision beta(n), gamma(n), l(n*(n+1)/2), lambda(n), + 1 lplus(n*(n+1)/2),w(n), z(n) +c dimension l(n*(n+1)/2), lplus(n*(n+1)/2) +c +c-------------------------- parameter usage -------------------------- +c +c beta = scratch vector. +c gamma = scratch vector. +c l (input) lower triangular matrix, stored rowwise. +c lambda = scratch vector. +c lplus (output) lower triangular matrix, stored rowwise, which may +c occupy the same storage as l. +c n (input) length of vector parameters and order of matrices. +c w (input, destroyed on output) right singular vector of rank 1 +c correction to l. +c z (input, destroyed on output) left singular vector of rank 1 +c correction to l. +c +c------------------------------- notes ------------------------------- +c +c *** application and usage restrictions *** +c +c this routine updates the cholesky factor l of a symmetric +c positive definite matrix to which a secant update is being +c applied -- it computes a cholesky factor lplus of +c l * (i + z*w**t) * (i + w*z**t) * l**t. it is assumed that w +c and z have been chosen so that the updated matrix is strictly +c positive definite. +c +c *** algorithm notes *** +c +c this code uses recurrence 3 of ref. 1 (with d(j) = 1 for all j) +c to compute lplus of the form l * (i + z*w**t) * q, where q +c is an orthogonal matrix that makes the result lower triangular. +c lplus may have some negative diagonal elements. +c +c *** references *** +c +c 1. goldfarb, d. (1976), factorized variable metric methods for uncon- +c strained optimization, math. comput. 30, pp. 796-811. +c +c *** general *** +c +c coded by david m. gay (fall 1979). +c this subroutine was written in connection with research supported +c by the national science foundation under grants mcs-7600324 and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c-------------------------- local variables -------------------------- +c + integer i, ij, j, jj, jp1, k, nm1, np1 + double precision a, b, bj, eta, gj, lj, lij, ljj, nu, s, theta, + 1 wj, zj + double precision one, zero +c +c *** data initializations *** +c +c/6 +c data one/1.d+0/, zero/0.d+0/ +c/7 + parameter (one=1.d+0, zero=0.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + nu = one + eta = zero + if (n .le. 1) go to 30 + nm1 = n - 1 +c +c *** temporarily store s(j) = sum over k = j+1 to n of w(k)**2 in +c *** lambda(j). +c + s = zero + do 10 i = 1, nm1 + j = n - i + s = s + w(j+1)**2 + lambda(j) = s + 10 continue +c +c *** compute lambda, gamma, and beta by goldfarb*s recurrence 3. +c + do 20 j = 1, nm1 + wj = w(j) + a = nu*z(j) - eta*wj + theta = one + a*wj + s = a*lambda(j) + lj = dsqrt(theta**2 + a*s) + if (theta .gt. zero) lj = -lj + lambda(j) = lj + b = theta*wj + s + gamma(j) = b * nu / lj + beta(j) = (a - b*eta) / lj + nu = -nu / lj + eta = -(eta + (a**2)/(theta - lj)) / lj + 20 continue + 30 lambda(n) = one + (nu*z(n) - eta*w(n))*w(n) +c +c *** update l, gradually overwriting w and z with l*w and l*z. +c + np1 = n + 1 + jj = n * (n + 1) / 2 + do 60 k = 1, n + j = np1 - k + lj = lambda(j) + ljj = l(jj) + lplus(jj) = lj * ljj + wj = w(j) + w(j) = ljj * wj + zj = z(j) + z(j) = ljj * zj + if (k .eq. 1) go to 50 + bj = beta(j) + gj = gamma(j) + ij = jj + j + jp1 = j + 1 + do 40 i = jp1, n + lij = l(ij) + lplus(ij) = lj*lij + bj*w(i) + gj*z(i) + w(i) = w(i) + lij*wj + z(i) = z(i) + lij*zj + ij = ij + i + 40 continue + 50 jj = jj - j + 60 continue +c + 999 return +c *** last card of lupdat follows *** + end + subroutine lvmul(n, x, l, y) +c +c *** compute x = l*y, where l is an n x n lower triangular +c *** matrix stored compactly by rows. x and y may occupy the same +c *** storage. *** +c + integer n +cal double precision x(n), l(1), y(n) + double precision x(n), l(n*(n+1)/2), y(n) +c dimension l(n*(n+1)/2) + integer i, ii, ij, i0, j, np1 + double precision t, zero +c/6 +c data zero/0.d+0/ +c/7 + parameter (zero=0.d+0) +c/ +c + np1 = n + 1 + i0 = n*(n+1)/2 + do 20 ii = 1, n + i = np1 - ii + i0 = i0 - i + t = zero + do 10 j = 1, i + ij = i0 + j + t = t + l(ij)*y(j) + 10 continue + x(i) = t + 20 continue + 999 return +c *** last card of lvmul follows *** + end + subroutine vvmulp(n, x, y, z, k) +c +c *** set x(i) = y(i) * z(i)**k, 1 .le. i .le. n (for k = 1 or -1) *** +c + integer n, k + double precision x(n), y(n), z(n) + integer i +c + if (k .ge. 0) go to 20 + do 10 i = 1, n + 10 x(i) = y(i) / z(i) + go to 999 +c + 20 do 30 i = 1, n + 30 x(i) = y(i) * z(i) + 999 return +c *** last card of vvmulp follows *** + end + subroutine wzbfgs (l, n, s, w, y, z) +c +c *** compute y and z for lupdat corresponding to bfgs update. +c + integer n +cal double precision l(1), s(n), w(n), y(n), z(n) + double precision l(n*(n+1)/2), s(n), w(n), y(n), z(n) +c dimension l(n*(n+1)/2) +c +c-------------------------- parameter usage -------------------------- +c +c l (i/o) cholesky factor of hessian, a lower triang. matrix stored +c compactly by rows. +c n (input) order of l and length of s, w, y, z. +c s (input) the step just taken. +c w (output) right singular vector of rank 1 correction to l. +c y (input) change in gradients corresponding to s. +c z (output) left singular vector of rank 1 correction to l. +c +c------------------------------- notes ------------------------------- +c +c *** algorithm notes *** +c +c when s is computed in certain ways, e.g. by gqtstp or +c dbldog, it is possible to save n**2/2 operations since (l**t)*s +c or l*(l**t)*s is then known. +c if the bfgs update to l*(l**t) would reduce its determinant to +c less than eps times its old value, then this routine in effect +c replaces y by theta*y + (1 - theta)*l*(l**t)*s, where theta +c (between 0 and 1) is chosen to make the reduction factor = eps. +c +c *** general *** +c +c coded by david m. gay (fall 1979). +c this subroutine was written in connection with research supported +c by the national science foundation under grants mcs-7600324 and +c mcs-7906671. +c +c------------------------ external quantities ------------------------ +c +c *** functions and subroutines called *** +c + external dotprd, livmul, ltvmul + double precision dotprd +c dotprd returns inner product of two vectors. +c livmul multiplies l**-1 times a vector. +c ltvmul multiplies l**t times a vector. +c +c *** intrinsic functions *** +c/+ + double precision dsqrt +c/ +c-------------------------- local variables -------------------------- +c + integer i + double precision cs, cy, eps, epsrt, one, shs, ys, theta +c +c *** data initializations *** +c +c/6 +c data eps/0.1d+0/, one/1.d+0/ +c/7 + parameter (eps=0.1d+0, one=1.d+0) +c/ +c +c+++++++++++++++++++++++++++++++ body ++++++++++++++++++++++++++++++++ +c + call ltvmul(n, w, l, s) + shs = dotprd(n, w, w) + ys = dotprd(n, y, s) + if (ys .ge. eps*shs) go to 10 + theta = (one - eps) * shs / (shs - ys) + epsrt = dsqrt(eps) + cy = theta / (shs * epsrt) + cs = (one + (theta-one)/epsrt) / shs + go to 20 + 10 cy = one / (dsqrt(ys) * dsqrt(shs)) + cs = one / shs + 20 call livmul(n, z, l, y) + do 30 i = 1, n + 30 z(i) = cy * z(i) - cs * w(i) +c + 999 return +c *** last card of wzbfgs follows *** + end diff --git a/source/unres/src_MD-NEWSC/surfatom.f b/source/unres/src_MD-NEWSC/surfatom.f new file mode 100644 index 0000000..9974842 --- /dev/null +++ b/source/unres/src_MD-NEWSC/surfatom.f @@ -0,0 +1,494 @@ +c +c +c ################################################### +c ## COPYRIGHT (C) 1996 by Jay William Ponder ## +c ## All Rights Reserved ## +c ################################################### +c +c ################################################################ +c ## ## +c ## subroutine surfatom -- exposed surface area of an atom ## +c ## ## +c ################################################################ +c +c +c "surfatom" performs an analytical computation of the surface +c area of a specified atom; a simplified version of "surface" +c +c literature references: +c +c T. J. Richmond, "Solvent Accessible Surface Area and +c Excluded Volume in Proteins", Journal of Molecular Biology, +c 178, 63-89 (1984) +c +c L. Wesson and D. Eisenberg, "Atomic Solvation Parameters +c Applied to Molecular Dynamics of Proteins in Solution", +c Protein Science, 1, 227-235 (1992) +c +c variables and parameters: +c +c ir number of atom for which area is desired +c area accessible surface area of the atom +c radius radii of each of the individual atoms +c +c + subroutine surfatom (ir,area,radius) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'sizes.i' + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + integer nres,nsup,nstart_sup + double precision c,dc,dc_old,d_c_work,xloc,xrot,dc_norm + common /chain/ c(3,maxres2+2),dc(3,0:maxres2),dc_old(3,0:maxres2), + & xloc(3,maxres),xrot(3,maxres),dc_norm(3,0:maxres2), + & dc_work(MAXRES6),nres,nres0 + integer maxarc + parameter (maxarc=300) + integer i,j,k,m + integer ii,ib,jb + integer io,ir + integer mi,ni,narc + integer key(maxarc) + integer intag(maxarc) + integer intag1(maxarc) + real*8 area,arcsum + real*8 arclen,exang + real*8 delta,delta2 + real*8 eps,rmove + real*8 xr,yr,zr + real*8 rr,rrsq + real*8 rplus,rminus + real*8 axx,axy,axz + real*8 ayx,ayy + real*8 azx,azy,azz + real*8 uxj,uyj,uzj + real*8 tx,ty,tz + real*8 txb,tyb,td + real*8 tr2,tr,txr,tyr + real*8 tk1,tk2 + real*8 thec,the,t,tb + real*8 txk,tyk,tzk + real*8 t1,ti,tf,tt + real*8 txj,tyj,tzj + real*8 ccsq,cc,xysq + real*8 bsqk,bk,cosine + real*8 dsqj,gi,pix2 + real*8 therk,dk,gk + real*8 risqk,rik + real*8 radius(maxatm) + real*8 ri(maxarc),risq(maxarc) + real*8 ux(maxarc),uy(maxarc),uz(maxarc) + real*8 xc(maxarc),yc(maxarc),zc(maxarc) + real*8 xc1(maxarc),yc1(maxarc),zc1(maxarc) + real*8 dsq(maxarc),bsq(maxarc) + real*8 dsq1(maxarc),bsq1(maxarc) + real*8 arci(maxarc),arcf(maxarc) + real*8 ex(maxarc),lt(maxarc),gr(maxarc) + real*8 b(maxarc),b1(maxarc),bg(maxarc) + real*8 kent(maxarc),kout(maxarc) + real*8 ther(maxarc) + logical moved,top + logical omit(maxarc) +c +c +c zero out the surface area for the sphere of interest +c + area = 0.0d0 +c write (2,*) "ir",ir," radius",radius(ir) + if (radius(ir) .eq. 0.0d0) return +c +c set the overlap significance and connectivity shift +c + pix2 = 2.0d0 * pi + delta = 1.0d-8 + delta2 = delta * delta + eps = 1.0d-8 + moved = .false. + rmove = 1.0d-8 +c +c store coordinates and radius of the sphere of interest +c + xr = c(1,ir) + yr = c(2,ir) + zr = c(3,ir) + rr = radius(ir) + rrsq = rr * rr +c +c initialize values of some counters and summations +c + 10 continue + io = 0 + jb = 0 + ib = 0 + arclen = 0.0d0 + exang = 0.0d0 +c +c test each sphere to see if it overlaps the sphere of interest +c + do i = 1, 2*nres + if (i.eq.ir .or. radius(i).eq.0.0d0) goto 30 + rplus = rr + radius(i) + tx = c(1,i) - xr + if (abs(tx) .ge. rplus) goto 30 + ty = c(2,i) - yr + if (abs(ty) .ge. rplus) goto 30 + tz = c(3,i) - zr + if (abs(tz) .ge. rplus) goto 30 +c +c check for sphere overlap by testing distance against radii +c + xysq = tx*tx + ty*ty + if (xysq .lt. delta2) then + tx = delta + ty = 0.0d0 + xysq = delta2 + end if + ccsq = xysq + tz*tz + cc = sqrt(ccsq) + if (rplus-cc .le. delta) goto 30 + rminus = rr - radius(i) +c +c check to see if sphere of interest is completely buried +c + if (cc-abs(rminus) .le. delta) then + if (rminus .le. 0.0d0) goto 170 + goto 30 + end if +c +c check for too many overlaps with sphere of interest +c + if (io .ge. maxarc) then + write (iout,20) + 20 format (/,' SURFATOM -- Increase the Value of MAXARC') + stop + end if +c +c get overlap between current sphere and sphere of interest +c + io = io + 1 + xc1(io) = tx + yc1(io) = ty + zc1(io) = tz + dsq1(io) = xysq + bsq1(io) = ccsq + b1(io) = cc + gr(io) = (ccsq+rplus*rminus) / (2.0d0*rr*b1(io)) + intag1(io) = i + omit(io) = .false. + 30 continue + end do +c +c case where no other spheres overlap the sphere of interest +c + if (io .eq. 0) then + area = 4.0d0 * pi * rrsq + return + end if +c +c case where only one sphere overlaps the sphere of interest +c + if (io .eq. 1) then + area = pix2 * (1.0d0 + gr(1)) + area = mod(area,4.0d0*pi) * rrsq + return + end if +c +c case where many spheres intersect the sphere of interest; +c sort the intersecting spheres by their degree of overlap +c + call sort2 (io,gr,key) + do i = 1, io + k = key(i) + intag(i) = intag1(k) + xc(i) = xc1(k) + yc(i) = yc1(k) + zc(i) = zc1(k) + dsq(i) = dsq1(k) + b(i) = b1(k) + bsq(i) = bsq1(k) + end do +c +c get radius of each overlap circle on surface of the sphere +c + do i = 1, io + gi = gr(i) * rr + bg(i) = b(i) * gi + risq(i) = rrsq - gi*gi + ri(i) = sqrt(risq(i)) + ther(i) = 0.5d0*pi - asin(min(1.0d0,max(-1.0d0,gr(i)))) + end do +c +c find boundary of inaccessible area on sphere of interest +c + do k = 1, io-1 + if (.not. omit(k)) then + txk = xc(k) + tyk = yc(k) + tzk = zc(k) + bk = b(k) + therk = ther(k) +c +c check to see if J circle is intersecting K circle; +c get distance between circle centers and sum of radii +c + do j = k+1, io + if (omit(j)) goto 60 + cc = (txk*xc(j)+tyk*yc(j)+tzk*zc(j))/(bk*b(j)) + cc = acos(min(1.0d0,max(-1.0d0,cc))) + td = therk + ther(j) +c +c check to see if circles enclose separate regions +c + if (cc .ge. td) goto 60 +c +c check for circle J completely inside circle K +c + if (cc+ther(j) .lt. therk) goto 40 +c +c check for circles that are essentially parallel +c + if (cc .gt. delta) goto 50 + 40 continue + omit(j) = .true. + goto 60 +c +c check to see if sphere of interest is completely buried +c + 50 continue + if (pix2-cc .le. td) goto 170 + 60 continue + end do + end if + end do +c +c find T value of circle intersections +c + do k = 1, io + if (omit(k)) goto 110 + omit(k) = .true. + narc = 0 + top = .false. + txk = xc(k) + tyk = yc(k) + tzk = zc(k) + dk = sqrt(dsq(k)) + bsqk = bsq(k) + bk = b(k) + gk = gr(k) * rr + risqk = risq(k) + rik = ri(k) + therk = ther(k) +c +c rotation matrix elements +c + t1 = tzk / (bk*dk) + axx = txk * t1 + axy = tyk * t1 + axz = dk / bk + ayx = tyk / dk + ayy = txk / dk + azx = txk / bk + azy = tyk / bk + azz = tzk / bk + do j = 1, io + if (.not. omit(j)) then + txj = xc(j) + tyj = yc(j) + tzj = zc(j) +c +c rotate spheres so K vector colinear with z-axis +c + uxj = txj*axx + tyj*axy - tzj*axz + uyj = tyj*ayy - txj*ayx + uzj = txj*azx + tyj*azy + tzj*azz + cosine = min(1.0d0,max(-1.0d0,uzj/b(j))) + if (acos(cosine) .lt. therk+ther(j)) then + dsqj = uxj*uxj + uyj*uyj + tb = uzj*gk - bg(j) + txb = uxj * tb + tyb = uyj * tb + td = rik * dsqj + tr2 = risqk*dsqj - tb*tb + tr2 = max(eps,tr2) + tr = sqrt(tr2) + txr = uxj * tr + tyr = uyj * tr +c +c get T values of intersection for K circle +c + tb = (txb+tyr) / td + tb = min(1.0d0,max(-1.0d0,tb)) + tk1 = acos(tb) + if (tyb-txr .lt. 0.0d0) tk1 = pix2 - tk1 + tb = (txb-tyr) / td + tb = min(1.0d0,max(-1.0d0,tb)) + tk2 = acos(tb) + if (tyb+txr .lt. 0.0d0) tk2 = pix2 - tk2 + thec = (rrsq*uzj-gk*bg(j)) / (rik*ri(j)*b(j)) + if (abs(thec) .lt. 1.0d0) then + the = -acos(thec) + else if (thec .ge. 1.0d0) then + the = 0.0d0 + else if (thec .le. -1.0d0) then + the = -pi + end if +c +c see if "tk1" is entry or exit point; check t=0 point; +c "ti" is exit point, "tf" is entry point +c + cosine = min(1.0d0,max(-1.0d0, + & (uzj*gk-uxj*rik)/(b(j)*rr))) + if ((acos(cosine)-ther(j))*(tk2-tk1) .le. 0.0d0) then + ti = tk2 + tf = tk1 + else + ti = tk2 + tf = tk1 + end if + narc = narc + 1 + if (narc .ge. maxarc) then + write (iout,70) + 70 format (/,' SURFATOM -- Increase the Value', + & ' of MAXARC') + stop + end if + if (tf .le. ti) then + arcf(narc) = tf + arci(narc) = 0.0d0 + tf = pix2 + lt(narc) = j + ex(narc) = the + top = .true. + narc = narc + 1 + end if + arcf(narc) = tf + arci(narc) = ti + lt(narc) = j + ex(narc) = the + ux(j) = uxj + uy(j) = uyj + uz(j) = uzj + end if + end if + end do + omit(k) = .false. +c +c special case; K circle without intersections +c + if (narc .le. 0) goto 90 +c +c general case; sum up arclength and set connectivity code +c + call sort2 (narc,arci,key) + arcsum = arci(1) + mi = key(1) + t = arcf(mi) + ni = mi + if (narc .gt. 1) then + do j = 2, narc + m = key(j) + if (t .lt. arci(j)) then + arcsum = arcsum + arci(j) - t + exang = exang + ex(ni) + jb = jb + 1 + if (jb .ge. maxarc) then + write (iout,80) + 80 format (/,' SURFATOM -- Increase the Value', + & ' of MAXARC') + stop + end if + i = lt(ni) + kent(jb) = maxarc*i + k + i = lt(m) + kout(jb) = maxarc*k + i + end if + tt = arcf(m) + if (tt .ge. t) then + t = tt + ni = m + end if + end do + end if + arcsum = arcsum + pix2 - t + if (.not. top) then + exang = exang + ex(ni) + jb = jb + 1 + i = lt(ni) + kent(jb) = maxarc*i + k + i = lt(mi) + kout(jb) = maxarc*k + i + end if + goto 100 + 90 continue + arcsum = pix2 + ib = ib + 1 + 100 continue + arclen = arclen + gr(k)*arcsum + 110 continue + end do + if (arclen .eq. 0.0d0) goto 170 + if (jb .eq. 0) goto 150 +c +c find number of independent boundaries and check connectivity +c + j = 0 + do k = 1, jb + if (kout(k) .ne. 0) then + i = k + 120 continue + m = kout(i) + kout(i) = 0 + j = j + 1 + do ii = 1, jb + if (m .eq. kent(ii)) then + if (ii .eq. k) then + ib = ib + 1 + if (j .eq. jb) goto 150 + goto 130 + end if + i = ii + goto 120 + end if + end do + 130 continue + end if + end do + ib = ib + 1 +c +c attempt to fix connectivity error by moving atom slightly +c + if (moved) then + write (iout,140) ir + 140 format (/,' SURFATOM -- Connectivity Error at Atom',i6) + else + moved = .true. + xr = xr + rmove + yr = yr + rmove + zr = zr + rmove + goto 10 + end if +c +c compute the exposed surface area for the sphere of interest +c + 150 continue + area = ib*pix2 + exang + arclen + area = mod(area,4.0d0*pi) * rrsq +c +c attempt to fix negative area by moving atom slightly +c + if (area .lt. 0.0d0) then + if (moved) then + write (iout,160) ir + 160 format (/,' SURFATOM -- Negative Area at Atom',i6) + else + moved = .true. + xr = xr + rmove + yr = yr + rmove + zr = zr + rmove + goto 10 + end if + end if + 170 continue + return + end diff --git a/source/unres/src_MD-NEWSC/test.F b/source/unres/src_MD-NEWSC/test.F new file mode 100644 index 0000000..0140ee5 --- /dev/null +++ b/source/unres/src_MD-NEWSC/test.F @@ -0,0 +1,863 @@ + subroutine test + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + include 'COMMON.DISTFIT' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.FFIELD' + include 'COMMON.MINIM' + include 'COMMON.CHAIN' + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision var(maxvar),var1(maxvar) + integer j1,j2 + logical debug,accepted + debug=.true. + + + call geom_to_var(nvar,var1) + call chainbuild + call etotal(energy(0)) + etot=energy(0) + call rmsd(rms) + write(iout,*) 'etot=',0,etot,rms + call secondary2(.false.) + + call write_pdb(0,'first structure',etot) + + j1=13 + j2=21 + da=180.0*deg2rad + + + + temp=3000.0d0 + betbol=1.0D0/(1.9858D-3*temp) + jr=iran_num(j1,j2) + d=ran_number(-pi,pi) +c phi(jr)=pinorm(phi(jr)+d) + call chainbuild + call etotal(energy(0)) + etot0=energy(0) + call rmsd(rms) + write(iout,*) 'etot=',1,etot0,rms + call write_pdb(1,'perturb structure',etot0) + + do i=2,500,2 + jr=iran_num(j1,j2) + d=ran_number(-da,da) + phiold=phi(jr) + phi(jr)=pinorm(phi(jr)+d) + call chainbuild + call etotal(energy(0)) + etot=energy(0) + + if (etot.lt.etot0) then + accepted=.true. + else + accepted=.false. + xxr=ran_number(0.0D0,1.0D0) + xxh=betbol*(etot-etot0) + if (xxh.lt.50.0D0) then + xxh=dexp(-xxh) + if (xxh.gt.xxr) accepted=.true. + endif + endif + accepted=.true. +c print *,etot0,etot,accepted + if (accepted) then + etot0=etot + call rmsd(rms) + write(iout,*) 'etot=',i,etot,rms + call write_pdb(i,'MC structure',etot) +c minimize +c call geom_to_var(nvar,var1) + call sc_move(2,nres-1,1,10d0,nft_sc,etot) + call geom_to_var(nvar,var) + call minimize(etot,var,iretcode,nfun) + write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun + call var_to_geom(nvar,var) + call chainbuild + call rmsd(rms) + write(iout,*) 'etot mcm=',i,etot,rms + call write_pdb(i+1,'MCM structure',etot) + call var_to_geom(nvar,var1) +c -------- + else + phi(jr)=phiold + endif + enddo + +c minimize +c call sc_move(2,nres-1,1,10d0,nft_sc,etot) +c call geom_to_var(nvar,var) +c +c call chainbuild +c call write_pdb(998 ,'sc min',etot) +c +c call minimize(etot,var,iretcode,nfun) +c write(iout,*)'------------------------------------------------' +c write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun +c +c call var_to_geom(nvar,var) +c call chainbuild +c call write_pdb(999,'full min',etot) + + + return + end + + + + + subroutine test_local + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision varia(maxvar) +c + call chainbuild +c call geom_to_var(nvar,varia) + call write_pdb(1,'first structure',0d0) + + call etotal(energy(0)) + etot=energy(0) + write(iout,*) nnt,nct,etot + + write(iout,*) 'calling sc_move' + call sc_move(nnt,nct,5,10d0,nft_sc,etot) + write(iout,*) nft_sc,etot + call write_pdb(2,'second structure',etot) + + write(iout,*) 'calling local_move' + call local_move_init(.false.) + call local_move(24,29,20d0,50d0) + call chainbuild + call write_pdb(3,'third structure',etot) + + write(iout,*) 'calling sc_move' + call sc_move(24,29,5,10d0,nft_sc,etot) + write(iout,*) nft_sc,etot + call write_pdb(2,'last structure',etot) + + + return + end + + subroutine test_sc + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.IOUNITS' + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision varia(maxvar) +c + call chainbuild +c call geom_to_var(nvar,varia) + call write_pdb(1,'first structure',0d0) + + call etotal(energy(0)) + etot=energy(0) + write(iout,*) nnt,nct,etot + + write(iout,*) 'calling sc_move' + + call sc_move(nnt,nct,5,10d0,nft_sc,etot) + write(iout,*) nft_sc,etot + call write_pdb(2,'second structure',etot) + + write(iout,*) 'calling sc_move 2nd time' + + call sc_move(nnt,nct,5,1d0,nft_sc,etot) + write(iout,*) nft_sc,etot + call write_pdb(3,'last structure',etot) + return + end +c-------------------------------------------------------- + subroutine bgrow(bstrand,nbstrand,in,ind,new) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + integer bstrand(maxres/3,6) + + ishift=iabs(bstrand(in,ind+4)-new) + + print *,'bgrow',bstrand(in,ind+4),new,ishift + + bstrand(in,ind)=new + + if(ind.eq.1)then + bstrand(nbstrand,5)=bstrand(nbstrand,1) + do i=1,nbstrand-1 + IF (bstrand(nbstrand,3).eq.bstrand(i,3)) THEN + if (bstrand(i,5).lt.bstrand(i,6)) then + bstrand(i,5)=bstrand(i,5)-ishift + else + bstrand(i,5)=bstrand(i,5)+ishift + endif + ENDIF + enddo + else + bstrand(nbstrand,6)=bstrand(nbstrand,2) + do i=1,nbstrand-1 + IF (bstrand(nbstrand,3).eq.bstrand(i,3)) THEN + if (bstrand(i,6).lt.bstrand(i,5)) then + bstrand(i,6)=bstrand(i,6)-ishift + else + bstrand(i,6)=bstrand(i,6)+ishift + endif + ENDIF + enddo + endif + + + return + end + + +c------------------------------------------------- + + subroutine secondary(lprint) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.DISTFIT' + + integer ncont,icont(2,maxres*maxres/2),isec(maxres,3) + logical lprint,not_done + real dcont(maxres*maxres/2),d + real rcomp /7.0/ + real rbeta /5.2/ + real ralfa /5.2/ + real r310 /6.6/ + double precision xpi(3),xpj(3) + + + + call chainbuild +cd call write_pdb(99,'sec structure',0d0) + ncont=0 + nbfrag=0 + nhfrag=0 + do i=1,nres + isec(i,1)=0 + isec(i,2)=0 + isec(i,3)=0 + enddo + + do i=2,nres-3 + do k=1,3 + xpi(k)=0.5d0*(c(k,i-1)+c(k,i)) + enddo + do j=i+2,nres + do k=1,3 + xpj(k)=0.5d0*(c(k,j-1)+c(k,j)) + enddo +cd d = (c(1,i)-c(1,j))*(c(1,i)-c(1,j)) + +cd & (c(2,i)-c(2,j))*(c(2,i)-c(2,j)) + +cd & (c(3,i)-c(3,j))*(c(3,i)-c(3,j)) +cd print *,'CA',i,j,d + d = (xpi(1)-xpj(1))*(xpi(1)-xpj(1)) + + & (xpi(2)-xpj(2))*(xpi(2)-xpj(2)) + + & (xpi(3)-xpj(3))*(xpi(3)-xpj(3)) + if ( d.lt.rcomp*rcomp) then + ncont=ncont+1 + icont(1,ncont)=i + icont(2,ncont)=j + dcont(ncont)=sqrt(d) + endif + enddo + enddo + if (lprint) then + write (iout,*) + write (iout,'(a)') '#PP contact map distances:' + do i=1,ncont + write (iout,'(3i4,f10.5)') + & i,icont(1,i),icont(2,i),dcont(i) + enddo + endif + +c finding parallel beta +cd write (iout,*) '------- looking for parallel beta -----------' + nbeta=0 + nstrand=0 + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if(dcont(i).le.rbeta .and. j1-i1.gt.4 .and. + & isec(i1,1).le.1.and.isec(j1,1).le.1.and. + & (isec(i1,2).ne.isec(j1,2).or.isec(i1,2)*isec(j1,2).eq.0).and. + & (isec(i1,3).ne.isec(j1,3).or.isec(i1,3)*isec(j1,3).eq.0).and. + & (isec(i1,2).ne.isec(j1,3).or.isec(i1,2)*isec(j1,3).eq.0).and. + & (isec(i1,3).ne.isec(j1,2).or.isec(i1,3)*isec(j1,2).eq.0) + & ) then + ii1=i1 + jj1=j1 +cd write (iout,*) i1,j1,dcont(i) + not_done=.true. + do while (not_done) + i1=i1+1 + j1=j1+1 + do j=1,ncont + if (i1.eq.icont(1,j) .and. j1.eq.icont(2,j) + & .and. dcont(j).le.rbeta .and. + & isec(i1,1).le.1.and.isec(j1,1).le.1.and. + & (isec(i1,2).ne.isec(j1,2).or.isec(i1,2)*isec(j1,2).eq.0).and. + & (isec(i1,3).ne.isec(j1,3).or.isec(i1,3)*isec(j1,3).eq.0).and. + & (isec(i1,2).ne.isec(j1,3).or.isec(i1,2)*isec(j1,3).eq.0).and. + & (isec(i1,3).ne.isec(j1,2).or.isec(i1,3)*isec(j1,2).eq.0) + & ) goto 5 + enddo + not_done=.false. + 5 continue +cd write (iout,*) i1,j1,dcont(j),not_done + enddo + j1=j1-1 + i1=i1-1 + if (i1-ii1.gt.1) then + ii1=max0(ii1-1,1) + jj1=max0(jj1-1,1) + nbeta=nbeta+1 + if(lprint)write(iout,*)'parallel beta',nbeta,ii1,i1,jj1,j1 + + nbfrag=nbfrag+1 + bfrag(1,nbfrag)=ii1 + bfrag(2,nbfrag)=i1 + bfrag(3,nbfrag)=jj1 + bfrag(4,nbfrag)=j1 + + do ij=ii1,i1 + isec(ij,1)=isec(ij,1)+1 + isec(ij,1+isec(ij,1))=nbeta + enddo + do ij=jj1,j1 + isec(ij,1)=isec(ij,1)+1 + isec(ij,1+isec(ij,1))=nbeta + enddo + + if(lprint) then + nstrand=nstrand+1 + if (nbeta.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-1,"..",i1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-1,"..",i1-1,"'" + endif + nstrand=nstrand+1 + if (nbeta.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",jj1-1,"..",j1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",jj1-1,"..",j1-1,"'" + endif + write(12,'(a8,4i4)') + & "SetNeigh",ii1-1,i1-1,jj1-1,j1-1 + endif + endif + endif + enddo + +c finding antiparallel beta +cd write (iout,*) '--------- looking for antiparallel beta ---------' + + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if (dcont(i).le.rbeta.and. + & isec(i1,1).le.1.and.isec(j1,1).le.1.and. + & (isec(i1,2).ne.isec(j1,2).or.isec(i1,2)*isec(j1,2).eq.0).and. + & (isec(i1,3).ne.isec(j1,3).or.isec(i1,3)*isec(j1,3).eq.0).and. + & (isec(i1,2).ne.isec(j1,3).or.isec(i1,2)*isec(j1,3).eq.0).and. + & (isec(i1,3).ne.isec(j1,2).or.isec(i1,3)*isec(j1,2).eq.0) + & ) then + ii1=i1 + jj1=j1 +cd write (iout,*) i1,j1,dcont(i) + + not_done=.true. + do while (not_done) + i1=i1+1 + j1=j1-1 + do j=1,ncont + if (i1.eq.icont(1,j).and.j1.eq.icont(2,j) .and. + & isec(i1,1).le.1.and.isec(j1,1).le.1.and. + & (isec(i1,2).ne.isec(j1,2).or.isec(i1,2)*isec(j1,2).eq.0).and. + & (isec(i1,3).ne.isec(j1,3).or.isec(i1,3)*isec(j1,3).eq.0).and. + & (isec(i1,2).ne.isec(j1,3).or.isec(i1,2)*isec(j1,3).eq.0).and. + & (isec(i1,3).ne.isec(j1,2).or.isec(i1,3)*isec(j1,2).eq.0) + & .and. dcont(j).le.rbeta ) goto 6 + enddo + not_done=.false. + 6 continue +cd write (iout,*) i1,j1,dcont(j),not_done + enddo + i1=i1-1 + j1=j1+1 + if (i1-ii1.gt.1) then + if(lprint)write (iout,*)'antiparallel beta', + & nbeta,ii1-1,i1,jj1,j1-1 + + nbfrag=nbfrag+1 + bfrag(1,nbfrag)=max0(ii1-1,1) + bfrag(2,nbfrag)=i1 + bfrag(3,nbfrag)=jj1 + bfrag(4,nbfrag)=max0(j1-1,1) + + nbeta=nbeta+1 + iii1=max0(ii1-1,1) + do ij=iii1,i1 + isec(ij,1)=isec(ij,1)+1 + isec(ij,1+isec(ij,1))=nbeta + enddo + jjj1=max0(j1-1,1) + do ij=jjj1,jj1 + isec(ij,1)=isec(ij,1)+1 + isec(ij,1+isec(ij,1))=nbeta + enddo + + + if (lprint) then + nstrand=nstrand+1 + if (nstrand.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-2,"..",i1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",ii1-2,"..",i1-1,"'" + endif + nstrand=nstrand+1 + if (nstrand.le.9) then + write(12,'(a18,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",j1-2,"..",jj1-1,"'" + else + write(12,'(a18,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'strand",nstrand, + & "' 'num = ",j1-2,"..",jj1-1,"'" + endif + write(12,'(a8,4i4)') + & "SetNeigh",ii1-2,i1-1,jj1-1,j1-2 + endif + endif + endif + enddo + + if (nstrand.gt.0.and.lprint) then + write(12,'(a27,$)') "DefPropRes 'sheet' 'strand1" + do i=2,nstrand + if (i.le.9) then + write(12,'(a9,i1,$)') " | strand",i + else + write(12,'(a9,i2,$)') " | strand",i + endif + enddo + write(12,'(a1)') "'" + endif + + +c finding alpha or 310 helix + + nhelix=0 + do i=1,ncont + i1=icont(1,i) + j1=icont(2,i) + if (j1.eq.i1+3.and.dcont(i).le.r310 + & .or.j1.eq.i1+4.and.dcont(i).le.ralfa ) then +cd if (j1.eq.i1+3) write (iout,*) "found 1-4 ",i1,j1,dcont(i) +cd if (j1.eq.i1+4) write (iout,*) "found 1-5 ",i1,j1,dcont(i) + ii1=i1 + jj1=j1 + if (isec(ii1,1).eq.0) then + not_done=.true. + else + not_done=.false. + endif + do while (not_done) + i1=i1+1 + j1=j1+1 + do j=1,ncont + if (i1.eq.icont(1,j) .and. j1.eq.icont(2,j)) goto 10 + enddo + not_done=.false. + 10 continue +cd write (iout,*) i1,j1,not_done + enddo + j1=j1-1 + if (j1-ii1.gt.4) then + nhelix=nhelix+1 +cd write (iout,*)'helix',nhelix,ii1,j1 + + nhfrag=nhfrag+1 + hfrag(1,nhfrag)=ii1 + hfrag(2,nhfrag)=max0(j1-1,1) + + do ij=ii1,j1 + isec(ij,1)=-1 + enddo + if (lprint) then + write (iout,'(a6,i3,2i4)') "Helix",nhelix,ii1-1,j1-2 + if (nhelix.le.9) then + write(12,'(a17,i1,a9,i3,a2,i3,a1)') + & "DefPropRes 'helix",nhelix, + & "' 'num = ",ii1-1,"..",j1-2,"'" + else + write(12,'(a17,i2,a9,i3,a2,i3,a1)') + & "DefPropRes 'helix",nhelix, + & "' 'num = ",ii1-1,"..",j1-2,"'" + endif + endif + endif + endif + enddo + + if (nhelix.gt.0.and.lprint) then + write(12,'(a26,$)') "DefPropRes 'helix' 'helix1" + do i=2,nhelix + if (nhelix.le.9) then + write(12,'(a8,i1,$)') " | helix",i + else + write(12,'(a8,i2,$)') " | helix",i + endif + enddo + write(12,'(a1)') "'" + endif + + if (lprint) then + write(12,'(a37)') "DefPropRes 'coil' '! (helix | sheet)'" + write(12,'(a20)') "XMacStand ribbon.mac" + endif + + + return + end +c---------------------------------------------------------------------------- + + subroutine write_pdb(npdb,titelloc,ee) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + character*50 titelloc1 + character*(*) titelloc + character*3 zahl + character*5 liczba5 + double precision ee + integer npdb,ilen + external ilen + + titelloc1=titelloc + lenpre=ilen(prefix) + if (npdb.lt.1000) then + call numstr(npdb,zahl) + open(ipdb,file=prefix(:lenpre)//'@@'//zahl//'.pdb') + else + if (npdb.lt.10000) then + write(liczba5,'(i1,i4)') 0,npdb + else + write(liczba5,'(i5)') npdb + endif + open(ipdb,file=prefix(:lenpre)//'@@'//liczba5//'.pdb') + endif + call pdbout(ee,titelloc1,ipdb) + close(ipdb) + return + end + +c-------------------------------------------------------- + subroutine softreg + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.GEO' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.VAR' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + include 'COMMON.FFIELD' + include 'COMMON.MINIM' + include 'COMMON.INTERACT' +c + include 'COMMON.DISTFIT' + integer iff(maxres) + double precision time0,time1 + double precision energy(0:n_ene),ee + double precision var(maxvar) + integer ieval +c + logical debug,ltest,fail + character*50 linia +c + linia='test' + debug=.true. + in_pdb=0 + + + +c------------------------ +c +c freeze sec.elements +c + do i=1,nres + mask_phi(i)=1 + mask_theta(i)=1 + mask_side(i)=1 + iff(i)=0 + enddo + + do j=1,nbfrag + do i=bfrag(1,j),bfrag(2,j) + mask_phi(i)=0 + mask_theta(i)=0 + iff(i)=1 + enddo + if (bfrag(3,j).le.bfrag(4,j)) then + do i=bfrag(3,j),bfrag(4,j) + mask_phi(i)=0 + mask_theta(i)=0 + iff(i)=1 + enddo + else + do i=bfrag(4,j),bfrag(3,j) + mask_phi(i)=0 + mask_theta(i)=0 + iff(i)=1 + enddo + endif + enddo + do j=1,nhfrag + do i=hfrag(1,j),hfrag(2,j) + mask_phi(i)=0 + mask_theta(i)=0 + iff(i)=1 + enddo + enddo + mask_r=.true. + + + + nhpb0=nhpb +c +c store dist. constrains +c + do i=1,nres-3 + do j=i+3,nres + if ( iff(i).eq.1.and.iff(j).eq.1 ) then + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=0.1 + dhpb(nhpb)=DIST(i,j) + endif + enddo + enddo + call hpb_partition + + if (debug) then + call chainbuild + call write_pdb(100+in_pdb,'input reg. structure',0d0) + endif + + + ipot0=ipot + maxmin0=maxmin + maxfun0=maxfun + wstrain0=wstrain + wang0=wang +c +c run soft pot. optimization +c + ipot=6 + wang=3.0 + maxmin=2000 + maxfun=4000 + call geom_to_var(nvar,var) +#ifdef MPI + time0=MPI_WTIME() +#else + time0=tcpu() +#endif + call minimize(etot,var,iretcode,nfun) + + write(iout,*)'SUMSL return code is',iretcode,' eval SOFT',nfun +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + write (iout,'(a,f6.2,f8.2,a)')' Time for soft min.',time1-time0, + & nfun/(time1-time0),' SOFT eval/s' + if (debug) then + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(300+in_pdb,'soft structure',etot) + endif +c +c run full UNRES optimization with constrains and frozen 2D +c the same variables as soft pot. optimizatio +c + ipot=ipot0 + wang=wang0 + maxmin=maxmin0 + maxfun=maxfun0 +#ifdef MPI + time0=MPI_WTIME() +#else + time0=tcpu() +#endif + call minimize(etot,var,iretcode,nfun) + write(iout,*)'SUMSL MASK DIST return code is',iretcode, + & ' eval ',nfun + ieval=nfun +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + write (iout,'(a,f6.2,f8.2,a)') + & ' Time for mask dist min.',time1-time0, + & nfun/(time1-time0),' eval/s' + if (debug) then + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(400+in_pdb,'mask & dist',etot) + endif +c +c switch off constrains and +c run full UNRES optimization with frozen 2D +c + +c +c reset constrains +c + nhpb_c=nhpb + nhpb=nhpb0 + link_start=1 + link_end=nhpb + wstrain=wstrain0 + +#ifdef MPI + time0=MPI_WTIME() +#else + time0=tcpu() +#endif + call minimize(etot,var,iretcode,nfun) + write(iout,*)'SUMSL MASK return code is',iretcode,' eval ',nfun + ieval=ieval+nfun +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + write (iout,'(a,f6.2,f8.2,a)')' Time for mask min.',time1-time0, + & nfun/(time1-time0),' eval/s' + + + if (debug) then + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(500+in_pdb,'mask 2d frozen',etot) + endif + + mask_r=.false. + + +c +c run full UNRES optimization with constrains and NO frozen 2D +c + + nhpb=nhpb_c + link_start=1 + link_end=nhpb + maxfun=maxfun0/5 + + do ico=1,5 + + wstrain=wstrain0/ico +#ifdef MPI + time0=MPI_WTIME() +#else + time0=tcpu() +#endif + call minimize(etot,var,iretcode,nfun) + write(iout,'(a10,f6.3,a14,i3,a6,i5)') + & ' SUMSL DIST',wstrain,' return code is',iretcode, + & ' eval ',nfun + ieval=nfun +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + write (iout,'(a,f6.2,f8.2,a)') + & ' Time for dist min.',time1-time0, + & nfun/(time1-time0),' eval/s' + if (debug) then + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(600+in_pdb+ico,'dist cons',etot) + endif + + enddo +c + nhpb=nhpb0 + link_start=1 + link_end=nhpb + wstrain=wstrain0 + maxfun=maxfun0 + + +c + if (minim) then +#ifdef MPI + time0=MPI_WTIME() +#else + time0=tcpu() +#endif + call minimize(etot,var,iretcode,nfun) + write(iout,*)'------------------------------------------------' + write(iout,*)'SUMSL return code is',iretcode,' eval ',nfun, + & '+ DIST eval',ieval +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + write (iout,'(a,f6.2,f8.2,a)')' Time for full min.',time1-time0, + & nfun/(time1-time0),' eval/s' + + + call var_to_geom(nvar,var) + call chainbuild + call write_pdb(999,'full min',etot) + endif + + return + end + + diff --git a/source/unres/src_MD-NEWSC/thread.F b/source/unres/src_MD-NEWSC/thread.F new file mode 100644 index 0000000..9f169a0 --- /dev/null +++ b/source/unres/src_MD-NEWSC/thread.F @@ -0,0 +1,549 @@ + subroutine thread_seq +C Thread the sequence through a database of known structures + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.DBASE' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.THREAD' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.CONTACTS' + include 'COMMON.MCM' + include 'COMMON.NAMES' +#ifdef MPI + include 'COMMON.INFO' + integer ThreadId,ThreadType,Kwita +#endif + double precision varia(maxvar) + double precision przes(3),obr(3,3) + double precision time_for_thread + logical found_pattern,non_conv + character*32 head_pdb + double precision energia(0:n_ene) + n_ene_comp=nprint_ene +C +C Body +C +#ifdef MPI + if (me.eq.king) then + do i=1,nctasks + nsave_part(i)=0 + enddo + endif + nacc_tot=0 +#endif + Kwita=0 + close(igeom) + close(ipdb) + close(istat) + do i=1,maxthread + do j=1,14 + ener0(j,i)=0.0D0 + ener(j,i)=0.0D0 + enddo + enddo + nres0=nct-nnt+1 + ave_time_for_thread=0.0D0 + max_time_for_thread=0.0D0 +cd print *,'nthread=',nthread,' nseq=',nseq,' nres0=',nres0 + nthread=nexcl+nthread + do ithread=1,nthread + found_pattern=.false. + itrial=0 + do while (.not.found_pattern) + itrial=itrial+1 + if (itrial.gt.1000) then + write (iout,'(/a/)') 'Too many attempts to find pattern.' + nthread=ithread-1 +#ifdef MPI + call recv_stop_sig(Kwita) + call send_stop_sig(-3) +#endif + goto 777 + endif +C Find long enough chain in the database + ii=iran_num(1,nseq) + nres_t=nres_base(1,ii) +C Select the starting position to thread. + print *,'nseq',nseq,' ii=',ii,' nres_t=', + & nres_t,' nres0=',nres0 + if (nres_t.ge.nres0) then + ist=iran_num(0,nres_t-nres0) +#ifdef MPI + if (Kwita.eq.0) call recv_stop_sig(Kwita) + if (Kwita.lt.0) then + write (iout,*) 'Stop signal received. Terminating.' + write (*,*) 'Stop signal received. Terminating.' + nthread=ithread-1 + write (*,*) 'ithread=',ithread,' nthread=',nthread + goto 777 + endif + call pattern_receive +#endif + do i=1,nexcl + if (iexam(1,i).eq.ii .and. iexam(2,i).eq.ist) goto 10 + enddo + found_pattern=.true. + endif +C If this point is reached, the pattern has not yet been examined. + 10 continue +c print *,'found_pattern:',found_pattern + enddo + nexcl=nexcl+1 + iexam(1,nexcl)=ii + iexam(2,nexcl)=ist +#ifdef MPI + if (Kwita.eq.0) call recv_stop_sig(Kwita) + if (Kwita.lt.0) then + write (iout,*) 'Stop signal received. Terminating.' + nthread=ithread-1 + write (*,*) 'ithread=',ithread,' nthread=',nthread + goto 777 + endif + call pattern_send +#endif + ipatt(1,ithread)=ii + ipatt(2,ithread)=ist +#ifdef MPI + write (iout,'(/80(1h*)/a,i4,a,i5,2a,i3,a,i3,a,i3/)') + & 'Processor:',me,' Attempt:',ithread, + & ' pattern: ',str_nam(ii),nres_base(2,ii),':',nres_base(3,ii), + & ' start at res.',ist+1 + write (*,'(a,i4,a,i5,2a,i3,a,i3,a,i3)') 'Processor:',me, + & ' Attempt:',ithread, + & ' pattern: ',str_nam(ii),nres_base(2,ii),':',nres_base(3,ii), + & ' start at res.',ist+1 +#else + write (iout,'(/80(1h*)/a,i5,2a,i3,a,i3,a,i3/)') + & 'Attempt:',ithread, + & ' pattern: ',str_nam(ii),nres_base(2,ii),':',nres_base(3,ii), + & ' start at res.',ist+1 + write (*,'(a,i5,2a,i3,a,i3,a,i3)') + & 'Attempt:',ithread, + & ' pattern: ',str_nam(ii),nres_base(2,ii),':',nres_base(3,ii), + & ' start at res.',ist+1 +#endif + ipattern=ii +C Copy coordinates from the database. + ist=ist-(nnt-1) + do i=nnt,nct + do j=1,3 + c(j,i)=cart_base(j,i+ist,ii) +c cref(j,i)=c(j,i) + enddo +cd write (iout,'(a,i4,3f10.5)') restyp(itype(i)),i,(c(j,i),j=1,3) + enddo +cd call fitsq(rms,c(1,nnt),cref(1,nnt),nct-nnt+1,przes,obr, +cd non_conv) +cd write (iout,'(a,f10.5)') +cd & 'Initial RMS deviation from reference structure:',rms + if (itype(nres).eq.21) then + do j=1,3 + dcj=c(j,nres-2)-c(j,nres-3) + c(j,nres)=c(j,nres-1)+dcj + c(j,2*nres)=c(j,nres) + enddo + endif + if (itype(1).eq.21) then + do j=1,3 + dcj=c(j,4)-c(j,3) + c(j,1)=c(j,2)-dcj + c(j,nres+1)=c(j,1) + enddo + endif + call int_from_cart(.false.,.false.) +cd print *,'Exit INT_FROM_CART.' +cd print *,'nhpb=',nhpb + do i=nss+1,nhpb + ii=ihpb(i) + jj=jhpb(i) + dhpb(i)=dist(ii,jj) +c write (iout,'(2i5,2f10.5)') ihpb(i),jhpb(i),dhpb(i),forcon(i) + enddo +c stop 'End generate' +C Generate SC conformations. + call sc_conf +c call intout +#ifdef MPI +cd print *,'Processor:',me,': exit GEN_SIDE.' +#else +cd print *,'Exit GEN_SIDE.' +#endif +C Calculate initial energy. + call chainbuild + call etotal(energia(0)) + etot=energia(0) + do i=1,n_ene_comp + ener0(i,ithread)=energia(i) + enddo + ener0(n_ene_comp+1,ithread)=energia(0) + if (refstr) then + call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + ener0(n_ene_comp+3,ithread)=contact_fract(ncont,ncont_ref, + & icont,icont_ref) + ener0(n_ene_comp+2,ithread)=rms + ener0(n_ene_comp+4,ithread)=frac + ener0(n_ene_comp+5,ithread)=frac_nn + endif + ener0(n_ene_comp+3,ithread)=0.0d0 +C Minimize energy. +#ifdef MPI + print*,'Processor:',me,' ithread=',ithread,' Start REGULARIZE.' +#else + print*,'ithread=',ithread,' Start REGULARIZE.' +#endif + curr_tim=tcpu() + call regularize(nct-nnt+1,etot,rms, + & cart_base(1,ist+nnt,ipattern),iretcode) + curr_tim1=tcpu() + time_for_thread=curr_tim1-curr_tim + ave_time_for_thread= + & ((ithread-1)*ave_time_for_thread+time_for_thread)/ithread + if (time_for_thread.gt.max_time_for_thread) + & max_time_for_thread=time_for_thread +#ifdef MPI + print *,'Processor',me,': Exit REGULARIZE.' + if (WhatsUp.eq.2) then + write (iout,*) + & 'Sufficient number of confs. collected. Terminating.' + nthread=ithread-1 + goto 777 + else if (WhatsUp.eq.-1) then + nthread=ithread-1 + write (iout,*) 'Time up in REGULARIZE. Call SEND_STOP_SIG.' + if (Kwita.eq.0) call recv_stop_sig(Kwita) + call send_stop_sig(-2) + goto 777 + else if (WhatsUp.eq.-2) then + nthread=ithread-1 + write (iout,*) 'Timeup signal received. Terminating.' + goto 777 + else if (WhatsUp.eq.-3) then + nthread=ithread-1 + write (iout,*) 'Error stop signal received. Terminating.' + goto 777 + endif +#else + print *,'Exit REGULARIZE.' + if (iretcode.eq.11) then + write (iout,'(/a/)') + &'******* Allocated time exceeded in SUMSL. The program will stop.' + nthread=ithread-1 + goto 777 + endif +#endif + head_pdb=titel(:24)//':'//str_nam(ipattern) + if (outpdb) call pdbout(etot,head_pdb,ipdb) + if (outmol2) call mol2out(etot,head_pdb) +c call intout + call briefout(ithread,etot) + link_end0=link_end + link_end=min0(link_end,nss) + write (iout,*) 'link_end=',link_end,' link_end0=',link_end0, + & ' nss=',nss + call etotal(energia(0)) +c call enerprint(energia(0)) + link_end=link_end0 +cd call chainbuild +cd call fitsq(rms,c(1,nnt),cref(1,nnt),nct-nnt+1,przes,obr,non_conv) +cd write (iout,'(a,f10.5)') +cd & 'RMS deviation from reference structure:',dsqrt(rms) + do i=1,n_ene_comp + ener(i,ithread)=energia(i) + enddo + ener(n_ene_comp+1,ithread)=energia(0) + ener(n_ene_comp+3,ithread)=rms + if (refstr) then + call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + ener(n_ene_comp+2,ithread)=rms + ener(n_ene_comp+4,ithread)=frac + ener(n_ene_comp+5,ithread)=frac_nn + endif + call write_stat_thread(ithread,ipattern,ist) +c write (istat,'(i4,2x,a8,i4,11(1pe14.5),2(0pf8.3),f8.5)') +c & ithread,str_nam(ipattern),ist+1,(ener(k,ithread),k=1,11), +c & (ener(k,ithread),k=12,14) +#ifdef MPI + if (me.eq.king) then + nacc_tot=nacc_tot+1 + call pattern_receive + call receive_MCM_info + if (nacc_tot.ge.nthread) then + write (iout,*) + & 'Sufficient number of conformations collected nacc_tot=', + & nacc_tot,'. Stopping other processors and terminating.' + write (*,*) + & 'Sufficient number of conformations collected nacc_tot=', + & nacc_tot,'. Stopping other processors and terminating.' + call recv_stop_sig(Kwita) + if (Kwita.eq.0) call send_stop_sig(-1) + nthread=ithread + goto 777 + endif + else + call send_MCM_info(2) + endif +#endif + if (timlim-curr_tim1-safety .lt. max_time_for_thread) then + write (iout,'(/2a)') + & '********** There would be not enough time for another thread. ', + & 'The program will stop.' + write (*,'(/2a)') + & '********** There would be not enough time for another thread. ', + & 'The program will stop.' + write (iout,'(a,1pe14.4/)') + & 'Elapsed time for last threading step: ',time_for_thread + nthread=ithread +#ifdef MPI + call recv_stop_sig(Kwita) + call send_stop_sig(-2) +#endif + goto 777 + else + curr_tim=curr_tim1 + write (iout,'(a,1pe14.4)') + & 'Elapsed time for this threading step: ',time_for_thread + endif +#ifdef MPI + if (Kwita.eq.0) call recv_stop_sig(Kwita) + if (Kwita.lt.0) then + write (iout,*) 'Stop signal received. Terminating.' + write (*,*) 'Stop signal received. Terminating.' + nthread=ithread + write (*,*) 'nthread=',nthread,' ithread=',ithread + goto 777 + endif +#endif + enddo +#ifdef MPI + call send_stop_sig(-1) +#endif + 777 continue +#ifdef MPI +C Any messages left for me? + call pattern_receive + if (Kwita.eq.0) call recv_stop_sig(Kwita) +#endif + call write_thread_summary +#ifdef MPI + if (king.eq.king) then + Kwita=1 + do while (Kwita.ne.0 .or. nacc_tot.ne.0) + Kwita=0 + nacc_tot=0 + call recv_stop_sig(Kwita) + call receive_MCM_info + enddo + do iproc=1,nprocs-1 + call receive_thread_results(iproc) + enddo + call write_thread_summary + else + call send_thread_results + endif +#endif + return + end +c-------------------------------------------------------------------------- + subroutine write_thread_summary +C Thread the sequence through a database of known structures + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.DBASE' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.THREAD' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' +#ifdef MPI + include 'COMMON.INFO' +#endif + dimension ip(maxthread) + double precision energia(0:n_ene) + write (iout,'(30x,a/)') + & ' *********** Summary threading statistics ************' + write (iout,'(a)') 'Initial energies:' + write (iout,'(a4,2x,a12,14a14,3a8)') + & 'No','seq',(ename(print_order(i)),i=1,nprint_ene),'ETOT', + & 'RMSnat','NatCONT','NNCONT','RMS' +C Energy sort patterns + do i=1,nthread + ip(i)=i + enddo + do i=1,nthread-1 + enet=ener(n_ene-1,ip(i)) + jj=i + do j=i+1,nthread + if (ener(n_ene-1,ip(j)).lt.enet) then + jj=j + enet=ener(n_ene-1,ip(j)) + endif + enddo + if (jj.ne.i) then + ipj=ip(jj) + ip(jj)=ip(i) + ip(i)=ipj + endif + enddo + do ik=1,nthread + i=ip(ik) + ii=ipatt(1,i) + ist=nres_base(2,ii)+ipatt(2,i) + do kk=1,n_ene_comp + energia(i)=ener0(kk,i) + enddo + etot=ener0(n_ene_comp+1,i) + rmsnat=ener0(n_ene_comp+2,i) + rms=ener0(n_ene_comp+3,i) + frac=ener0(n_ene_comp+4,i) + frac_nn=ener0(n_ene_comp+5,i) + + if (refstr) then + write (iout,'(i4,2x,a8,i4,14(1pe14.5),0pf8.3,f8.5,f8.5,f8.3)') + & i,str_nam(ii),ist+1, + & (energia(print_order(kk)),kk=1,nprint_ene), + & etot,rmsnat,frac,frac_nn,rms + else + write (iout,'(i4,2x,a8,i4,14(1pe14.5),0pf8.3)') + & i,str_nam(ii),ist+1, + & (energia(print_order(kk)),kk=1,nprint_ene),etot + endif + enddo + write (iout,'(//a)') 'Final energies:' + write (iout,'(a4,2x,a12,17a14,3a8)') + & 'No','seq',(ename(print_order(kk)),kk=1,nprint_ene),'ETOT', + & 'RMSnat','NatCONT','NNCONT','RMS' + do ik=1,nthread + i=ip(ik) + ii=ipatt(1,i) + ist=nres_base(2,ii)+ipatt(2,i) + do kk=1,n_ene_comp + energia(kk)=ener(kk,ik) + enddo + etot=ener(n_ene_comp+1,i) + rmsnat=ener(n_ene_comp+2,i) + rms=ener(n_ene_comp+3,i) + frac=ener(n_ene_comp+4,i) + frac_nn=ener(n_ene_comp+5,i) + write (iout,'(i4,2x,a8,i4,14(1pe14.5),0pf8.3,f8.5,f8.5,f8.3)') + & i,str_nam(ii),ist+1, + & (energia(print_order(kk)),kk=1,nprint_ene), + & etot,rmsnat,frac,frac_nn,rms + enddo + write (iout,'(/a/)') 'IEXAM array:' + write (iout,'(i5)') nexcl + do i=1,nexcl + write (iout,'(2i5)') iexam(1,i),iexam(2,i) + enddo + write (iout,'(/a,1pe14.4/a,1pe14.4/)') + & 'Max. time for threading step ',max_time_for_thread, + & 'Average time for threading step: ',ave_time_for_thread + return + end +c---------------------------------------------------------------------------- + subroutine sc_conf +C Sample (hopefully) optimal SC orientations given backcone conformation. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.DBASE' + include 'COMMON.INTERACT' + include 'COMMON.VAR' + include 'COMMON.THREAD' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.GEO' + include 'COMMON.IOUNITS' + double precision varia(maxvar) + common /srutu/ icall + double precision energia(0:n_ene) + logical glycine,fail + maxsample=10 + link_end0=link_end + link_end=min0(link_end,nss) + do i=nnt,nct + if (itype(i).ne.10) then +cd print *,'i=',i,' itype=',itype(i),' theta=',theta(i+1) + call gen_side(itype(i),theta(i+1),alph(i),omeg(i),fail) + endif + enddo + call chainbuild + call etotal(energia(0)) + do isample=1,maxsample +C Choose a non-glycine side chain. + glycine=.true. + do while(glycine) + ind_sc=iran_num(nnt,nct) + glycine=(itype(ind_sc).eq.10) + enddo + alph0=alph(ind_sc) + omeg0=omeg(ind_sc) + call gen_side(itype(ind_sc),theta(ind_sc+1),alph(ind_sc), + & omeg(ind_sc),fail) + call chainbuild + call etotal(energia(0)) +cd write (iout,'(a,i5,a,i4,2(a,f8.3),2(a,1pe14.5))') +cd & 'Step:',isample,' SC',ind_sc,' alpha',alph(ind_sc)*rad2deg, +cd & ' omega',omeg(ind_sc)*rad2deg,' old energy',e0,' new energy',e1 + e1=0.0d0 + if (e0.le.e1) then + alph(ind_sc)=alph0 + omeg(ind_sc)=omeg0 + else + e0=e1 + endif + enddo + link_end=link_end0 + return + end +c--------------------------------------------------------------------------- + subroutine write_stat_thread(ithread,ipattern,ist) + implicit real*8 (a-h,o-z) + include "DIMENSIONS" + include "COMMON.CONTROL" + include "COMMON.IOUNITS" + include "COMMON.THREAD" + include "COMMON.FFIELD" + include "COMMON.DBASE" + include "COMMON.NAMES" + double precision energia(0:n_ene) + +#if defined(AIX) || defined(PGI) + open(istat,file=statname,position='append') +#else + open(istat,file=statname,access='append') +#endif + do i=1,n_ene_comp + energia(i)=ener(i,ithread) + enddo + etot=ener(n_ene_comp+1,ithread) + rmsnat=ener(n_ene_comp+2,ithread) + rms=ener(n_ene_comp+3,ithread) + frac=ener(n_ene_comp+4,ithread) + frac_nn=ener(n_ene_comp+5,ithread) + write (istat,'(i4,2x,a8,i4,14(1pe14.5),0pf8.3,f8.5,f8.5,f8.3)') + & ithread,str_nam(ipattern),ist+1, + & (energia(print_order(i)),i=1,nprint_ene), + & etot,rmsnat,frac,frac_nn,rms + close (istat) + return + end diff --git a/source/unres/src_MD-NEWSC/timing.F b/source/unres/src_MD-NEWSC/timing.F new file mode 100644 index 0000000..fb65430 --- /dev/null +++ b/source/unres/src_MD-NEWSC/timing.F @@ -0,0 +1,344 @@ +C $Date: 1994/10/05 16:41:52 $ +C $Revision: 2.2 $ +C +C +C + subroutine set_timers +c + implicit none + double precision tcpu + include 'COMMON.TIME1' +#ifdef MP + include 'mpif.h' +#endif +C Diminish the assigned time limit a little so that there is some time to +C end a batch job +c timlim=batime-150.0 +C Calculate the initial time, if it is not zero (e.g. for the SUN). + stime=tcpu() +#ifdef MPI + walltime=MPI_WTIME() + time_reduce=0.0d0 + time_allreduce=0.0d0 + time_bcast=0.0d0 + time_gather=0.0d0 + time_sendrecv=0.0d0 + time_scatter=0.0d0 + time_scatter_fmat=0.0d0 + time_scatter_ginv=0.0d0 + time_scatter_fmatmult=0.0d0 + time_scatter_ginvmult=0.0d0 + time_barrier_e=0.0d0 + time_barrier_g=0.0d0 + time_enecalc=0.0d0 + time_sumene=0.0d0 + time_lagrangian=0.0d0 + time_sumgradient=0.0d0 + time_intcartderiv=0.0d0 + time_inttocart=0.0d0 + time_ginvmult=0.0d0 + time_fricmatmult=0.0d0 + time_cartgrad=0.0d0 + time_bcastc=0.0d0 + time_bcast7=0.0d0 + time_bcastw=0.0d0 + time_intfcart=0.0d0 + time_vec=0.0d0 + time_mat=0.0d0 + time_fric=0.0d0 + time_stoch=0.0d0 + time_fricmatmult=0.0d0 + time_fsample=0.0d0 +#endif +cd print *,' in SET_TIMERS stime=',stime + return + end +C------------------------------------------------------------------------------ + logical function stopx(nf) +C This function returns .true. if one of the following reasons to exit SUMSL +C occurs. The "reason" code is stored in WHATSUP passed thru a COMMON block: +C +C... WHATSUP = 0 - go on, no reason to stop. Stopx will return .false. +C... 1 - Time up in current node; +C... 2 - STOP signal was received from another node because the +C... node's task was accomplished (parallel only); +C... -1 - STOP signal was received from another node because of error; +C... -2 - STOP signal was received from another node, because +C... the node's time was up. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + integer nf + logical ovrtim +#ifdef MP + include 'mpif.h' + include 'COMMON.INFO' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + integer Kwita + +cd print *,'Processor',MyID,' NF=',nf +#ifndef MPI + if (ovrtim()) then +C Finish if time is up. + stopx = .true. + WhatsUp=1 +#ifdef MPL + else if (mod(nf,100).eq.0) then +C Other processors might have finished. Check this every 100th function +C evaluation. +C Master checks if any other processor has sent accepted conformation(s) to it. + if (MyID.ne.MasterID) call receive_mcm_info + if (MyID.eq.MasterID) call receive_conf +cd print *,'Processor ',MyID,' is checking STOP: nf=',nf + call recv_stop_sig(Kwita) + if (Kwita.eq.-1) then + write (iout,'(a,i4,a,i5)') 'Processor', + & MyID,' has received STOP signal in STOPX; NF=',nf + write (*,'(a,i4,a,i5)') 'Processor', + & MyID,' has received STOP signal in STOPX; NF=',nf + stopx=.true. + WhatsUp=2 + elseif (Kwita.eq.-2) then + write (iout,*) + & 'Processor',MyID,' received TIMEUP-STOP signal in SUMSL.' + write (*,*) + & 'Processor',MyID,' received TIMEUP-STOP signal in SUMSL.' + WhatsUp=-2 + stopx=.true. + else if (Kwita.eq.-3) then + write (iout,*) + & 'Processor',MyID,' received ERROR-STOP signal in SUMSL.' + write (*,*) + & 'Processor',MyID,' received ERROR-STOP signal in SUMSL.' + WhatsUp=-1 + stopx=.true. + else + stopx=.false. + WhatsUp=0 + endif +#endif + else + stopx = .false. + WhatsUp=0 + endif +#else + stopx=.false. +#endif + +#ifdef OSF +c Check for FOUND_NAN flag + if (FOUND_NAN) then + write(iout,*)" *** stopx : Found a NaN" + stopx=.true. + endif +#endif + + return + end +C-------------------------------------------------------------------------- + logical function ovrtim() + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + real*8 tcpu +#ifdef MPI + include "mpif.h" + curtim = MPI_Wtime()-walltime +#else + curtim= tcpu() +#endif +C curtim is the current time in seconds. +c write (iout,*) "curtim",curtim," timlim",timlim," safety",safety + if (curtim .ge. timlim - safety) then + if (me.eq.king .or. .not. out1file) + & write (iout,'(a,f10.2,a,f10.2,a,f10.2,a)') + & "***************** Elapsed time (",curtim, + & " s) is within the safety limit (",safety, + & " s) of the allocated time (",timlim," s). Terminating." + ovrtim=.true. + else + ovrtim=.false. + endif + return + end +************************************************************************** + double precision function tcpu() + include 'COMMON.TIME1' +#ifdef ES9000 +**************************** +C Next definition for EAGLE (ibm-es9000) + real*8 micseconds + integer rcode + tcpu=cputime(micseconds,rcode) + tcpu=(micseconds/1.0E6) - stime +**************************** +#endif +#ifdef SUN +**************************** +C Next definitions for sun + REAL*8 ECPU,ETIME,ETCPU + dimension tarray(2) + tcpu=etime(tarray) + tcpu=tarray(1) +**************************** +#endif +#ifdef KSR +**************************** +C Next definitions for ksr +C this function uses the ksr timer ALL_SECONDS from the PMON library to +C return the elapsed time in seconds + tcpu= all_seconds() - stime +**************************** +#endif +#ifdef SGI +**************************** +C Next definitions for sgi + real timar(2), etime + seconds = etime(timar) +Cd print *,'seconds=',seconds,' stime=',stime +C usrsec = timar(1) +C syssec = timar(2) + tcpu=seconds - stime +**************************** +#endif + +#ifdef LINUX +**************************** +C Next definitions for sgi + real timar(2), etime + seconds = etime(timar) +Cd print *,'seconds=',seconds,' stime=',stime +C usrsec = timar(1) +C syssec = timar(2) + tcpu=seconds - stime +**************************** +#endif + + +#ifdef CRAY +**************************** +C Next definitions for Cray +C call date(curdat) +C curdat=curdat(1:9) +C call clock(curtim) +C curtim=curtim(1:8) + cpusec = second() + tcpu=cpusec - stime +**************************** +#endif +#ifdef AIX +**************************** +C Next definitions for RS6000 + integer*4 i1,mclock + i1 = mclock() + tcpu = (i1+0.0D0)/100.0D0 +#endif +#ifdef WINPGI +**************************** +c next definitions for windows NT Digital fortran + real time_real + call cpu_time(time_real) + tcpu = time_real +#endif +#ifdef WINIFL +**************************** +c next definitions for windows NT Digital fortran + real time_real + call cpu_time(time_real) + tcpu = time_real +#endif + + return + end +C--------------------------------------------------------------------------- + subroutine dajczas(rntime,hrtime,mintime,sectime) + include 'COMMON.IOUNITS' + real*8 rntime,hrtime,mintime,sectime + hrtime=rntime/3600.0D0 + hrtime=aint(hrtime) + mintime=aint((rntime-3600.0D0*hrtime)/60.0D0) + sectime=aint((rntime-3600.0D0*hrtime-60.0D0*mintime)+0.5D0) + if (sectime.eq.60.0D0) then + sectime=0.0D0 + mintime=mintime+1.0D0 + endif + ihr=hrtime + imn=mintime + isc=sectime + write (iout,328) ihr,imn,isc + 328 FORMAT(//'***** Computation time: ',I4 ,' hours ',I2 , + 1 ' minutes ', I2 ,' seconds *****') + return + end +C--------------------------------------------------------------------------- + subroutine print_detailed_timing + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.SETUP' +#ifdef MPI + time1=MPI_WTIME() + write (iout,'(80(1h=)/a/(80(1h=)))') + & "Details of FG communication time" + write (*,'(7(a40,1pe15.5/),40(1h-)/a40,1pe15.5/80(1h=))') + & "BROADCAST:",time_bcast,"REDUCE:",time_reduce, + & "GATHER:",time_gather, + & "SCATTER:",time_scatter,"SENDRECV:",time_sendrecv, + & "BARRIER ene",time_barrier_e, + & "BARRIER grad",time_barrier_g, + & "TOTAL:", + & time_bcast+time_reduce+time_gather+time_scatter+time_sendrecv + write (*,*) fg_rank,myrank, + & ': Total wall clock time',time1-walltime,' sec' + write (*,*) "Processor",fg_rank,myrank, + & ": BROADCAST time",time_bcast," REDUCE time", + & time_reduce," GATHER time",time_gather," SCATTER time", + & time_scatter, + & " SCATTER fmatmult",time_scatter_fmatmult, + & " SCATTER ginvmult",time_scatter_ginvmult, + & " SCATTER fmat",time_scatter_fmat, + & " SCATTER ginv",time_scatter_ginv, + & " SENDRECV",time_sendrecv, + & " BARRIER ene",time_barrier_e, + & " BARRIER GRAD",time_barrier_g, + & " BCAST7",time_bcast7," BCASTC",time_bcastc, + & " BCASTW",time_bcastw," ALLREDUCE",time_allreduce, + & " TOTAL", + & time_bcast+time_reduce+time_gather+time_scatter+ + & time_sendrecv+time_barrier+time_bcastc +#else + time1=tcpu() +#endif + write (*,*) "Processor",fg_rank,myrank," enecalc",time_enecalc + write (*,*) "Processor",fg_rank,myrank," sumene",time_sumene + write (*,*) "Processor",fg_rank,myrank," intfromcart", + & time_intfcart + write (*,*) "Processor",fg_rank,myrank," vecandderiv", + & time_vec + write (*,*) "Processor",fg_rank,myrank," setmatrices", + & time_mat + write (*,*) "Processor",fg_rank,myrank," ginvmult", + & time_ginvmult + write (*,*) "Processor",fg_rank,myrank," fricmatmult", + & time_fricmatmult + write (*,*) "Processor",fg_rank,myrank," inttocart", + & time_inttocart + write (*,*) "Processor",fg_rank,myrank," sumgradient", + & time_sumgradient + write (*,*) "Processor",fg_rank,myrank," intcartderiv", + & time_intcartderiv + if (fg_rank.eq.0) then + write (*,*) "Processor",fg_rank,myrank," lagrangian", + & time_lagrangian + write (*,*) "Processor",fg_rank,myrank," cartgrad", + & time_cartgrad + endif + return + end diff --git a/source/unres/src_MD-NEWSC/unres.F b/source/unres/src_MD-NEWSC/unres.F new file mode 100644 index 0000000..e4f54cb --- /dev/null +++ b/source/unres/src_MD-NEWSC/unres.F @@ -0,0 +1,799 @@ +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C C +C U N R E S C +C C +C Program to carry out conformational search of proteins in an united-residue C +C approximation. C +C C +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + + +#ifdef MPI + include 'mpif.h' + include 'COMMON.SETUP' +#endif + include 'COMMON.TIME1' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.REMD' + include 'COMMON.MD' + include 'COMMON.SBRIDGE' + double precision hrtime,mintime,sectime + character*64 text_mode_calc(-2:14) /'test', + & 'SC rotamer distribution', + & 'Energy evaluation or minimization', + & 'Regularization of PDB structure', + & 'Threading of a sequence on PDB structures', + & 'Monte Carlo (with minimization) ', + & 'Energy minimization of multiple conformations', + & 'Checking energy gradient', + & 'Entropic sampling Monte Carlo (with minimization)', + & 'Energy map', + & 'CSA calculations', + & 'Not used 9', + & 'Not used 10', + & 'Soft regularization of PDB structure', + & 'Mesoscopic molecular dynamics (MD) ', + & 'Not used 13', + & 'Replica exchange molecular dynamics (REMD)'/ + external ilen + +c call memmon_print_usage() + + call init_task + if (me.eq.king) + & write(iout,*)'### LAST MODIFIED 03/28/12 23:29 by czarek' + if (me.eq.king) call cinfo +C Read force field parameters and job setup data + call readrtns + call flush(iout) +C + if (me.eq.king .or. .not. out1file) then + write (iout,'(2a/)') + & text_mode_calc(modecalc)(:ilen(text_mode_calc(modecalc))), + & ' calculation.' + if (minim) write (iout,'(a)') + & 'Conformations will be energy-minimized.' + write (iout,'(80(1h*)/)') + endif + call flush(iout) +C + if (modecalc.eq.-2) then + call test + stop + else if (modecalc.eq.-1) then + write(iout,*) "call check_sc_map next" + call check_bond + stop + endif +#ifdef MPI + if (fg_rank.gt.0) then +C Fine-grain slaves just do energy and gradient components. + call ergastulum ! slave workhouse in Latin + else +#endif + if (modecalc.eq.0) then + call exec_eeval_or_minim + else if (modecalc.eq.1) then + call exec_regularize + else if (modecalc.eq.2) then + call exec_thread + else if (modecalc.eq.3 .or. modecalc .eq.6) then + call exec_MC + else if (modecalc.eq.4) then + call exec_mult_eeval_or_minim + else if (modecalc.eq.5) then + call exec_checkgrad + else if (ModeCalc.eq.7) then + call exec_map + else if (ModeCalc.eq.8) then + call exec_CSA + else if (modecalc.eq.11) then + call exec_softreg + else if (modecalc.eq.12) then + call exec_MD + else if (modecalc.eq.14) then + call exec_MREMD + else + write (iout,'(a)') 'This calculation type is not supported', + & ModeCalc + endif +#ifdef MPI + endif +C Finish task. + if (fg_rank.eq.0) call finish_task +c call memmon_print_usage() +#ifdef TIMING + call print_detailed_timing +#endif + call MPI_Finalize(ierr) + stop 'Bye Bye...' +#else + call dajczas(tcpu(),hrtime,mintime,sectime) + stop '********** Program terminated normally.' +#endif + end +c-------------------------------------------------------------------------- + subroutine exec_MD + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + if (me.eq.king .or. .not. out1file) + & write (iout,*) "Calling chainbuild" + call chainbuild + call MD + return + end +c--------------------------------------------------------------------------- + subroutine exec_MREMD + include 'DIMENSIONS' +#ifdef MPI + include "mpif.h" + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.IOUNITS' + include 'COMMON.REMD' + if (me.eq.king .or. .not. out1file) + & write (iout,*) "Calling chainbuild" + call chainbuild + if (me.eq.king .or. .not. out1file) + & write (iout,*) "Calling REMD" + if (remd_mlist) then + call MREMD + else + do i=1,nrep + remd_m(i)=1 + enddo + call MREMD + endif +#else + write (iout,*) "MREMD works on parallel machines only" +#endif + return + end +c--------------------------------------------------------------------------- + subroutine exec_eeval_or_minim + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.TIME1' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.REMD' + include 'COMMON.MD' + include 'COMMON.SBRIDGE' + common /srutu/ icall + double precision energy(0:n_ene) + double precision energy_long(0:n_ene),energy_short(0:n_ene) + double precision varia(maxvar) + if (indpdb.eq.0) call chainbuild +#ifdef MPI + time00=MPI_Wtime() +#else + time00=tcpu() +#endif + call chainbuild_cart + if (split_ene) then + print *,"Processor",myrank," after chainbuild" + icall=1 + call etotal_long(energy_long(0)) + write (iout,*) "Printing long range energy" + call enerprint(energy_long(0)) + call etotal_short(energy_short(0)) + write (iout,*) "Printing short range energy" + call enerprint(energy_short(0)) + do i=0,n_ene + energy(i)=energy_long(i)+energy_short(i) + write (iout,*) i,energy_long(i),energy_short(i),energy(i) + enddo + write (iout,*) "Printing long+short range energy" + call enerprint(energy(0)) + endif + call etotal(energy(0)) +#ifdef MPI + time_ene=MPI_Wtime()-time00 +#else + time_ene=tcpu()-time00 +#endif + write (iout,*) "Time for energy evaluation",time_ene + print *,"after etotal" + etota = energy(0) + etot =etota + call enerprint(energy(0)) + call hairpin(.true.,nharp,iharp) + call secondary2(.true.) + if (minim) then +crc overlap test + if (overlapsc) then + print *, 'Calling OVERLAP_SC' + call overlap_sc(fail) + endif + + if (searchsc) then + call sc_move(2,nres-1,10,1d10,nft_sc,etot) + print *,'SC_move',nft_sc,etot + write(iout,*) 'SC_move',nft_sc,etot + endif + + if (dccart) then + print *, 'Calling MINIM_DC' +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + call minim_dc(etot,iretcode,nfun) + else + if (indpdb.ne.0) then + call bond_regular + call chainbuild + endif + call geom_to_var(nvar,varia) + print *,'Calling MINIMIZE.' +#ifdef MPI + time1=MPI_WTIME() +#else + time1=tcpu() +#endif + call minimize(etot,varia,iretcode,nfun) + endif + print *,'SUMSL return code is',iretcode,' eval ',nfun +#ifdef MPI + evals=nfun/(MPI_WTIME()-time1) +#else + evals=nfun/(tcpu()-time1) +#endif + print *,'# eval/s',evals + print *,'refstr=',refstr + call hairpin(.true.,nharp,iharp) + call secondary2(.true.) + call etotal(energy(0)) + etot = energy(0) + call enerprint(energy(0)) + + call intout + call briefout(0,etot) + if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + write (iout,'(a,i3)') 'SUMSL return code:',iretcode + write (iout,'(a,i20)') '# of energy evaluations:',nfun+1 + write (iout,'(a,f16.3)')'# of energy evaluations/sec:',evals + else + print *,'refstr=',refstr + if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + call briefout(0,etot) + endif + if (outpdb) call pdbout(etot,titel(:32),ipdb) + if (outmol2) call mol2out(etot,titel(:32)) + return + end +c--------------------------------------------------------------------------- + subroutine exec_regularize + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.TIME1' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.REMD' + include 'COMMON.MD' + include 'COMMON.SBRIDGE' + double precision energy(0:n_ene) + + call gen_dist_constr + call sc_conf + call intout + call regularize(nct-nnt+1,etot,rms,cref(1,nnt),iretcode) + call etotal(energy(0)) + energy(0)=energy(0)-energy(14) + etot=energy(0) + call enerprint(energy(0)) + call intout + call briefout(0,etot) + if (outpdb) call pdbout(etot,titel(:32),ipdb) + if (outmol2) call mol2out(etot,titel(:32)) + if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + write (iout,'(a,i3)') 'SUMSL return code:',iretcode + return + end +c--------------------------------------------------------------------------- + subroutine exec_thread + include 'DIMENSIONS' +#ifdef MP + include "mpif.h" +#endif + include "COMMON.SETUP" + call thread_seq + return + end +c--------------------------------------------------------------------------- + subroutine exec_MC + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + character*10 nodeinfo + double precision varia(maxvar) +#ifdef MPI + include "mpif.h" +#endif + include "COMMON.SETUP" + include 'COMMON.CONTROL' + call mcm_setup + if (minim) then +#ifdef MPI + if (modecalc.eq.3) then + call do_mcm(ipar) + else + call entmcm + endif +#else + if (modecalc.eq.3) then + call do_mcm(ipar) + else + call entmcm + endif +#endif + else + call monte_carlo + endif + return + end +c--------------------------------------------------------------------------- + subroutine exec_mult_eeval_or_minim + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + dimension muster(mpi_status_size) +#endif + include 'COMMON.SETUP' + include 'COMMON.TIME1' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.REMD' + include 'COMMON.MD' + include 'COMMON.SBRIDGE' + double precision varia(maxvar) + dimension ind(6) + double precision energy(0:n_ene) + logical eof + eof=.false. +#ifdef MPI + if(me.ne.king) then + call minim_mcmf + return + endif + + close (intin) + open(intin,file=intinname,status='old') + write (istat,'(a5,30a12)')"# ", + & (wname(print_order(i)),i=1,nprint_ene) + if (refstr) then + write (istat,'(a5,30a12)')"# ", + & (ename(print_order(i)),i=1,nprint_ene), + & "ETOT total","RMSD","nat.contact","nnt.contact","cont.order" + else + write (istat,'(a5,30a12)')"# ", + & (ename(print_order(i)),i=1,nprint_ene),"ETOT total" + endif + + if (.not.minim) then + do while (.not. eof) + if (read_cart) then + read (intin,'(e15.10,e15.5)',end=1100,err=1100) time,ene + call read_x(intin,*11) +#ifdef MPI +c Broadcast the order to compute internal coordinates to the slaves. + if (nfgtasks.gt.1) + & call MPI_Bcast(6,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif + call int_from_cart1(.false.) + else + read (intin,'(i5)',end=1100,err=1100) iconf + call read_angles(intin,*11) + call geom_to_var(nvar,varia) + call chainbuild + endif + write (iout,'(a,i7)') 'Conformation #',iconf + call etotal(energy(0)) + call briefout(iconf,energy(0)) + call enerprint(energy(0)) + etot=energy(0) + if (refstr) then + call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + write (istat,'(i5,30(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene),etot, + & rms,frac,frac_nn,co +cjlee end + else + write (istat,'(i5,30(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene),etot + endif + enddo +1100 continue + goto 1101 + endif + + mm=0 + imm=0 + nft=0 + ene0=0.0d0 + n=0 + iconf=0 +c do n=1,nzsc + do while (.not. eof) + mm=mm+1 + if (mm.lt.nodes) then + if (read_cart) then + read (intin,'(e15.10,e15.5)',end=11,err=11) time,ene + call read_x(intin,*11) +#ifdef MPI +c Broadcast the order to compute internal coordinates to the slaves. + if (nfgtasks.gt.1) + & call MPI_Bcast(6,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif + call int_from_cart1(.false.) + else + read (intin,'(i5)',end=11,err=11) iconf + call read_angles(intin,*11) + call geom_to_var(nvar,varia) + call chainbuild + endif + + n=n+1 + write (iout,*) 'Conformation #',iconf,' read' + imm=imm+1 + ind(1)=1 + ind(2)=n + ind(3)=0 + ind(4)=0 + ind(5)=0 + ind(6)=0 + ene0=0.0d0 + call mpi_send(ind,6,mpi_integer,mm,idint,CG_COMM, + * ierr) + call mpi_send(varia,nvar,mpi_double_precision,mm, + * idreal,CG_COMM,ierr) + call mpi_send(ene0,1,mpi_double_precision,mm, + * idreal,CG_COMM,ierr) +c print *,'task ',n,' sent to worker ',mm,nvar + else + call mpi_recv(ind,6,mpi_integer,mpi_any_source,idint, + * CG_COMM,muster,ierr) + man=muster(mpi_source) +c print *,'receiving result from worker ',man,' (',iii1,iii,')' + call mpi_recv(varia,nvar,mpi_double_precision, + * man,idreal,CG_COMM,muster,ierr) + call mpi_recv(ene,1, + * mpi_double_precision,man,idreal, + * CG_COMM,muster,ierr) + call mpi_recv(ene0,1, + * mpi_double_precision,man,idreal, + * CG_COMM,muster,ierr) +c print *,'result received from worker ',man,' sending now' + + call var_to_geom(nvar,varia) + call chainbuild + call etotal(energy(0)) + iconf=ind(2) + write (iout,*) + write (iout,*) + write (iout,*) 'Conformation #',iconf," sumsl return code ", + & ind(5) + + etot=energy(0) + call enerprint(energy(0)) + call briefout(it,etot) +c if (minim) call briefout(it,etot) + if (refstr) then + call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + write (istat,'(i5,30(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene),etot, + & rms,frac,frac_nn,co + else + write (istat,'(i5,30(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene),etot + endif + + imm=imm-1 + if (read_cart) then + read (intin,'(e15.10,e15.5)',end=11,err=11) time,ene + call read_x(intin,*11) +#ifdef MPI +c Broadcast the order to compute internal coordinates to the slaves. + if (nfgtasks.gt.1) + & call MPI_Bcast(6,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif + call int_from_cart1(.false.) + else + read (intin,'(i5)',end=11,err=11) iconf + call read_angles(intin,*11) + call geom_to_var(nvar,varia) + call chainbuild + endif + n=n+1 + write (iout,*) 'Conformation #',iconf,' read' + imm=imm+1 + ind(1)=1 + ind(2)=n + ind(3)=0 + ind(4)=0 + ind(5)=0 + ind(6)=0 + call mpi_send(ind,6,mpi_integer,man,idint,CG_COMM, + * ierr) + call mpi_send(varia,nvar,mpi_double_precision,man, + * idreal,CG_COMM,ierr) + call mpi_send(ene0,1,mpi_double_precision,man, + * idreal,CG_COMM,ierr) + nf_mcmf=nf_mcmf+ind(4) + nmin=nmin+1 + endif + enddo +11 continue + do j=1,imm + call mpi_recv(ind,6,mpi_integer,mpi_any_source,idint, + * CG_COMM,muster,ierr) + man=muster(mpi_source) + call mpi_recv(varia,nvar,mpi_double_precision, + * man,idreal,CG_COMM,muster,ierr) + call mpi_recv(ene,1, + * mpi_double_precision,man,idreal, + * CG_COMM,muster,ierr) + call mpi_recv(ene0,1, + * mpi_double_precision,man,idreal, + * CG_COMM,muster,ierr) + + call var_to_geom(nvar,varia) + call chainbuild + call etotal(energy(0)) + iconf=ind(2) + write (iout,*) + write (iout,*) + write (iout,*) 'Conformation #',iconf," sumsl return code ", + & ind(5) + + etot=energy(0) + call enerprint(energy(0)) + call briefout(it,etot) + if (refstr) then + call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + write (istat,'(i5,30(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene),etot, + & rms,frac,frac_nn,co + else + write (istat,'(i5,30(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene),etot + endif + nmin=nmin+1 + enddo +1101 continue + do i=1, nodes-1 + ind(1)=0 + ind(2)=0 + ind(3)=0 + ind(4)=0 + ind(5)=0 + ind(6)=0 + call mpi_send(ind,6,mpi_integer,i,idint,CG_COMM, + * ierr) + enddo +#else + close (intin) + open(intin,file=intinname,status='old') + write (istat,'(a5,20a12)')"# ", + & (wname(print_order(i)),i=1,nprint_ene) + write (istat,'("# ",20(1pe12.4))') + & (weights(print_order(i)),i=1,nprint_ene) + if (refstr) then + write (istat,'(a5,20a12)')"# ", + & (ename(print_order(i)),i=1,nprint_ene), + & "ETOT total","RMSD","nat.contact","nnt.contact" + else + write (istat,'(a5,14a12)')"# ", + & (ename(print_order(i)),i=1,nprint_ene),"ETOT total" + endif + do while (.not. eof) + if (read_cart) then + read (intin,'(e15.10,e15.5)',end=1100,err=1100) time,ene + call read_x(intin,*11) +#ifdef MPI +c Broadcast the order to compute internal coordinates to the slaves. + if (nfgtasks.gt.1) + & call MPI_Bcast(6,1,MPI_INTEGER,king,FG_COMM,IERROR) +#endif + call int_from_cart1(.false.) + else + read (intin,'(i5)',end=1100,err=1100) iconf + call read_angles(intin,*11) + call geom_to_var(nvar,varia) + call chainbuild + endif + write (iout,'(a,i7)') 'Conformation #',iconf + if (minim) call minimize(etot,varia,iretcode,nfun) + call etotal(energy(0)) + + etot=energy(0) + call enerprint(energy(0)) + if (minim) call briefout(it,etot) + if (refstr) then + call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + write (istat,'(i5,18(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene), + & etot,rms,frac,frac_nn,co +cjlee end + else + write (istat,'(i5,14(f12.3))') iconf, + & (energy(print_order(i)),i=1,nprint_ene),etot + endif + enddo + 11 continue + 1100 continue +#endif + return + end +c--------------------------------------------------------------------------- + subroutine exec_checkgrad + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.TIME1' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.CONTACTS' + include 'COMMON.CHAIN' + include 'COMMON.VAR' + include 'COMMON.IOUNITS' + include 'COMMON.FFIELD' + include 'COMMON.REMD' + include 'COMMON.MD' + include 'COMMON.SBRIDGE' + common /srutu/ icall + double precision energy(0:max_ene) +c do i=2,nres +c vbld(i)=vbld(i)+ran_number(-0.1d0,0.1d0) +c if (itype(i).ne.10) +c & vbld(i+nres)=vbld(i+nres)+ran_number(-0.001d0,0.001d0) +c enddo + if (indpdb.eq.0) call chainbuild +c do i=0,nres +c do j=1,3 +c dc(j,i)=dc(j,i)+ran_number(-0.2d0,0.2d0) +c enddo +c enddo +c do i=1,nres-1 +c if (itype(i).ne.10) then +c do j=1,3 +c dc(j,i+nres)=dc(j,i+nres)+ran_number(-0.2d0,0.2d0) +c enddo +c endif +c enddo +c do j=1,3 +c dc(j,0)=ran_number(-0.2d0,0.2d0) +c enddo + usampl=.true. + totT=1.d0 + eq_time=0.0d0 + call read_fragments + read(inp,*) t_bath +c! t_bath = 300 + call rescale_weights(t_bath) + call chainbuild_cart + call cartprint + call intout + icall=1 + call etotal(energy(0)) + etot = energy(0) + call enerprint(energy(0)) + write (iout,*) "Uconst",Uconst," Uconst_back",uconst_back + print *,'icheckgrad=',icheckgrad + goto (10,20,30) icheckgrad + 10 call check_ecartint + return + 20 call check_cartgrad + return + 30 call check_eint + return + end +c--------------------------------------------------------------------------- + subroutine exec_map +C Energy maps + call map_read + call map + return + end +c--------------------------------------------------------------------------- + subroutine exec_CSA +#ifdef MPI + include "mpif.h" +#endif + include 'DIMENSIONS' + include 'COMMON.IOUNITS' +C Conformational Space Annealling programmed by Jooyoung Lee. +C This method works only with parallel machines! +#ifdef MPI +csa call together + write (iout,*) "CSA is not supported in this version" +#else +csa write (iout,*) "CSA works on parallel machines only" + write (iout,*) "CSA is not supported in this version" +#endif + return + end +c--------------------------------------------------------------------------- + subroutine exec_softreg + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + double precision energy(0:max_ene) + logical debug /.false./ + call chainbuild + call etotal(energy(0)) + call enerprint(energy(0)) + if (.not.lsecondary) then + write(iout,*) 'Calling secondary structure recognition' + call secondary2(debug) + else + write(iout,*) 'Using secondary structure supplied in pdb' + endif + + call softreg + + call etotal(energy(0)) + etot=energy(0) + call enerprint(energy(0)) + call intout + call briefout(0,etot) + call secondary2(.true.) + if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.) + return + end diff --git a/source/unres/src_MD-NEWSC/xdrf/CMakeLists.txt b/source/unres/src_MD-NEWSC/xdrf/CMakeLists.txt new file mode 100644 index 0000000..26baa36 --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/CMakeLists.txt @@ -0,0 +1,19 @@ +# +# CMake project file for UNRESPACK +# + +# m4 macro processor +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/libxdrf.c + COMMAND m4 + ARGS ${CMAKE_CURRENT_SOURCE_DIR}/underscore.m4 ${CMAKE_CURRENT_SOURCE_DIR}/libxdrf.m4 > ${CMAKE_CURRENT_BINARY_DIR}/libxdrf.c + VERBATIM +) + +# add headers from current dir +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +# compile the libxdrf library +add_library(xdrf STATIC ${CMAKE_CURRENT_BINARY_DIR}/libxdrf.c ftocstr.c) +set(UNRES_XDRFLIB ${CMAKE_CURRENT_BINARY_DIR}/libxdrf.a PARENT_SCOPE) + +#add_dependencies( ${UNRES_BIN} xdrf ) diff --git a/source/unres/src_MD-NEWSC/xdrf/Makefile b/source/unres/src_MD-NEWSC/xdrf/Makefile new file mode 100644 index 0000000..02c29f6 --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/Makefile @@ -0,0 +1,27 @@ +# This make file is part of the xdrf package. +# +# (C) 1995 Frans van Hoesel, hoesel@chem.rug.nl +# +# 2006 modified by Cezary Czaplewski + +# Set C compiler and flags for ARCH +CC = gcc +CFLAGS = -O + +M4 = m4 +M4FILE = underscore.m4 + +libxdrf.a: libxdrf.o ftocstr.o + ar cr libxdrf.a $? + +clean: + rm -f libxdrf.o ftocstr.o libxdrf.a + +ftocstr.o: ftocstr.c + $(CC) $(CFLAGS) -c ftocstr.c + +libxdrf.o: libxdrf.m4 $(M4FILE) + $(M4) $(M4FILE) libxdrf.m4 > libxdrf.c + $(CC) $(CFLAGS) -c libxdrf.c + rm -f libxdrf.c + diff --git a/source/unres/src_MD-NEWSC/xdrf/Makefile_jubl b/source/unres/src_MD-NEWSC/xdrf/Makefile_jubl new file mode 100644 index 0000000..8dc35cf --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/Makefile_jubl @@ -0,0 +1,31 @@ +# This make file is part of the xdrf package. +# +# (C) 1995 Frans van Hoesel, hoesel@chem.rug.nl +# +# 2006 modified by Cezary Czaplewski + +# Set C compiler and flags for ARCH +BGLSYS = /bgl/BlueLight/ppcfloor/bglsys + +CC = /usr/bin/blrts_xlc +CPPC = /usr/bin/blrts_xlc + +CFLAGS= -O2 -I$(BGLSYS)/include -L$(BGLSYS)/lib -qarch=440d -qtune=440 + +M4 = m4 +M4FILE = RS6K.m4 + +libxdrf.a: libxdrf.o ftocstr.o xdr_array.o xdr.o xdr_float.o xdr_stdio.o + ar cr libxdrf.a $? + +clean: + rm -f *.o libxdrf.a + +ftocstr.o: ftocstr.c + $(CC) $(CFLAGS) -c ftocstr.c + +libxdrf.o: libxdrf.m4 $(M4FILE) + $(M4) $(M4FILE) libxdrf.m4 > libxdrf.c + $(CC) $(CFLAGS) -c libxdrf.c +# rm -f libxdrf.c + diff --git a/source/unres/src_MD-NEWSC/xdrf/Makefile_linux b/source/unres/src_MD-NEWSC/xdrf/Makefile_linux new file mode 100644 index 0000000..f03276e --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/Makefile_linux @@ -0,0 +1,27 @@ +# This make file is part of the xdrf package. +# +# (C) 1995 Frans van Hoesel, hoesel@chem.rug.nl +# +# 2006 modified by Cezary Czaplewski + +# Set C compiler and flags for ARCH +CC = cc +CFLAGS = -O + +M4 = m4 +M4FILE = underscore.m4 + +libxdrf.a: libxdrf.o ftocstr.o + ar cr libxdrf.a $? + +clean: + rm -f libxdrf.o ftocstr.o libxdrf.a + +ftocstr.o: ftocstr.c + $(CC) $(CFLAGS) -c ftocstr.c + +libxdrf.o: libxdrf.m4 $(M4FILE) + $(M4) $(M4FILE) libxdrf.m4 > libxdrf.c + $(CC) $(CFLAGS) -c libxdrf.c + rm -f libxdrf.c + diff --git a/source/unres/src_MD-NEWSC/xdrf/RS6K.m4 b/source/unres/src_MD-NEWSC/xdrf/RS6K.m4 new file mode 100644 index 0000000..0331d97 --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/RS6K.m4 @@ -0,0 +1,20 @@ +divert(-1) +undefine(`len') +# +# do nothing special to FORTRAN function names +# +define(`FUNCTION',`$1') +# +# FORTRAN character strings are passed as follows: +# a pointer to the base of the string is passed in the normal +# argument list, and the length is passed by value as an extra +# argument, after all of the other arguments. +# +define(`ARGS',`($1`'undivert(1))') +define(`SAVE',`divert(1)$1`'divert(0)') +define(`STRING_ARG',`$1_ptr`'SAVE(`, $1_len')') +define(`STRING_ARG_DECL',`char * $1_ptr; int $1_len') +define(`STRING_LEN',`$1_len') +define(`STRING_PTR',`$1_ptr') +divert(0) + diff --git a/source/unres/src_MD-NEWSC/xdrf/ftocstr.c b/source/unres/src_MD-NEWSC/xdrf/ftocstr.c new file mode 100644 index 0000000..ed2113f --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/ftocstr.c @@ -0,0 +1,35 @@ + + +int ftocstr(ds, dl, ss, sl) + char *ds, *ss; /* dst, src ptrs */ + int dl; /* dst max len */ + int sl; /* src len */ +{ + char *p; + + for (p = ss + sl; --p >= ss && *p == ' '; ) ; + sl = p - ss + 1; + dl--; + ds[0] = 0; + if (sl > dl) + return 1; + while (sl--) + (*ds++ = *ss++); + *ds = '\0'; + return 0; +} + + +int ctofstr(ds, dl, ss) + char *ds; /* dest space */ + int dl; /* max dest length */ + char *ss; /* src string (0-term) */ +{ + while (dl && *ss) { + *ds++ = *ss++; + dl--; + } + while (dl--) + *ds++ = ' '; + return 0; +} diff --git a/source/unres/src_MD-NEWSC/xdrf/libxdrf.m4 b/source/unres/src_MD-NEWSC/xdrf/libxdrf.m4 new file mode 100644 index 0000000..a6da458 --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/libxdrf.m4 @@ -0,0 +1,1238 @@ +/*____________________________________________________________________________ + | + | libxdrf - portable fortran interface to xdr. some xdr routines + | are C routines for compressed coordinates + | + | version 1.1 + | + | This collection of routines is intended to write and read + | data in a portable way to a file, so data written on one type + | of machine can be read back on a different type. + | + | all fortran routines use an integer 'xdrid', which is an id to the + | current xdr file, and is set by xdrfopen. + | most routines have in integer 'ret' which is the return value. + | The value of 'ret' is zero on failure, and most of the time one + | on succes. + | + | There are three routines useful for C users: + | xdropen(), xdrclose(), xdr3dfcoord(). + | The first two replace xdrstdio_create and xdr_destroy, and *must* be + | used when you plan to use xdr3dfcoord(). (they are also a bit + | easier to interface). For writing data other than compressed coordinates + | you should use the standard C xdr routines (see xdr man page) + | + | xdrfopen(xdrid, filename, mode, ret) + | character *(*) filename + | character *(*) mode + | + | this will open the file with the given filename (string) + | and the given mode, it returns an id in xdrid, which is + | to be used in all other calls to xdrf routines. + | mode is 'w' to create, or update an file, for all other + | values of mode the file is opened for reading + | + | you need to call xdrfclose to flush the output and close + | the file. + | Note that you should not use xdrstdio_create, which comes with the + | standard xdr library + | + | xdrfclose(xdrid, ret) + | flush the data to the file, and closes the file; + | You should not use xdr_destroy (which comes standard with + | the xdr libraries. + | + | xdrfbool(xdrid, bp, ret) + | integer pb + | + | This filter produces values of either 1 or 0 + | + | xdrfchar(xdrid, cp, ret) + | character cp + | + | filter that translate between characters and their xdr representation + | Note that the characters in not compressed and occupies 4 bytes. + | + | xdrfdouble(xdrid, dp, ret) + | double dp + | + | read/write a double. + | + | xdrffloat(xdrid, fp, ret) + | float fp + | + | read/write a float. + | + | xdrfint(xdrid, ip, ret) + | integer ip + | + | read/write integer. + | + | xdrflong(xdrid, lp, ret) + | integer lp + | + | this routine has a possible portablility problem due to 64 bits longs. + | + | xdrfshort(xdrid, sp, ret) + | integer *2 sp + | + | xdrfstring(xdrid, sp, maxsize, ret) + | character *(*) + | integer maxsize + | + | read/write a string, with maximum length given by maxsize + | + | xdrfwrapstring(xdris, sp, ret) + | character *(*) + | + | read/write a string (it is the same as xdrfstring accept that it finds + | the stringlength itself. + | + | xdrfvector(xdrid, cp, size, xdrfproc, ret) + | character *(*) + | integer size + | external xdrfproc + | + | read/write an array pointed to by cp, with number of elements + | defined by 'size'. the routine 'xdrfproc' is the name + | of one of the above routines to read/write data (like xdrfdouble) + | In contrast with the c-version you don't need to specify the + | byte size of an element. + | xdrfstring is not allowed here (it is in the c version) + | + | xdrf3dfcoord(xdrid, fp, size, precision, ret) + | real (*) fp + | real precision + | integer size + | + | this is *NOT* a standard xdr routine. I named it this way, because + | it invites people to use the other xdr routines. + | It is introduced to store specifically 3d coordinates of molecules + | (as found in molecular dynamics) and it writes it in a compressed way. + | It starts by multiplying all numbers by precision and + | rounding the result to integer. effectively converting + | all floating point numbers to fixed point. + | it uses an algorithm for compression that is optimized for + | molecular data, but could be used for other 3d coordinates + | as well. There is subtantial overhead involved, so call this + | routine only if you have a large number of coordinates to read/write + | + | ________________________________________________________________________ + | + | Below are the routines to be used by C programmers. Use the 'normal' + | xdr routines to write integers, floats, etc (see man xdr) + | + | int xdropen(XDR *xdrs, const char *filename, const char *type) + | This will open the file with the given filename and the + | given mode. You should pass it an allocated XDR struct + | in xdrs, to be used in all other calls to xdr routines. + | Mode is 'w' to create, or update an file, and for all + | other values of mode the file is opened for reading. + | You need to call xdrclose to flush the output and close + | the file. + | + | Note that you should not use xdrstdio_create, which + | comes with the standard xdr library. + | + | int xdrclose(XDR *xdrs) + | Flush the data to the file, and close the file; + | You should not use xdr_destroy (which comes standard + | with the xdr libraries). + | + | int xdr3dfcoord(XDR *xdrs, float *fp, int *size, float *precision) + | This is \fInot\fR a standard xdr routine. I named it this + | way, because it invites people to use the other xdr + | routines. + | + | (c) 1995 Frans van Hoesel, hoesel@chem.rug.nl +*/ + + +#include +#include +#include +/* #include +#include */ +#include "xdr.h" +#include +#include +#include "xdrf.h" + +int ftocstr(char *, int, char *, int); +int ctofstr(char *, int, char *); + +#define MAXID 20 +static FILE *xdrfiles[MAXID]; +static XDR *xdridptr[MAXID]; +static char xdrmodes[MAXID]; +static unsigned int cnt; + +typedef void (* FUNCTION(xdrfproc)) (int *, void *, int *); + +void +FUNCTION(xdrfbool) ARGS(`xdrid, pb, ret') +int *xdrid, *ret; +int *pb; +{ + *ret = xdr_bool(xdridptr[*xdrid], (bool_t *) pb); + cnt += sizeof(int); +} + +void +FUNCTION(xdrfchar) ARGS(`xdrid, cp, ret') +int *xdrid, *ret; +char *cp; +{ + *ret = xdr_char(xdridptr[*xdrid], cp); + cnt += sizeof(char); +} + +void +FUNCTION(xdrfdouble) ARGS(`xdrid, dp, ret') +int *xdrid, *ret; +double *dp; +{ + *ret = xdr_double(xdridptr[*xdrid], dp); + cnt += sizeof(double); +} + +void +FUNCTION(xdrffloat) ARGS(`xdrid, fp, ret') +int *xdrid, *ret; +float *fp; +{ + *ret = xdr_float(xdridptr[*xdrid], fp); + cnt += sizeof(float); +} + +void +FUNCTION(xdrfint) ARGS(`xdrid, ip, ret') +int *xdrid, *ret; +int *ip; +{ + *ret = xdr_int(xdridptr[*xdrid], ip); + cnt += sizeof(int); +} + +void +FUNCTION(xdrflong) ARGS(`xdrid, lp, ret') +int *xdrid, *ret; +long *lp; +{ + *ret = xdr_long(xdridptr[*xdrid], lp); + cnt += sizeof(long); +} + +void +FUNCTION(xdrfshort) ARGS(`xdrid, sp, ret') +int *xdrid, *ret; +short *sp; +{ + *ret = xdr_short(xdridptr[*xdrid], sp); + cnt += sizeof(sp); +} + +void +FUNCTION(xdrfuchar) ARGS(`xdrid, ucp, ret') +int *xdrid, *ret; +char *ucp; +{ + *ret = xdr_u_char(xdridptr[*xdrid], ucp); + cnt += sizeof(char); +} + +void +FUNCTION(xdrfulong) ARGS(`xdrid, ulp, ret') +int *xdrid, *ret; +unsigned long *ulp; +{ + *ret = xdr_u_long(xdridptr[*xdrid], ulp); + cnt += sizeof(unsigned long); +} + +void +FUNCTION(xdrfushort) ARGS(`xdrid, usp, ret') +int *xdrid, *ret; +unsigned short *usp; +{ + *ret = xdr_u_short(xdridptr[*xdrid], usp); + cnt += sizeof(unsigned short); +} + +void +FUNCTION(xdrf3dfcoord) ARGS(`xdrid, fp, size, precision, ret') +int *xdrid, *ret; +float *fp; +int *size; +float *precision; +{ + *ret = xdr3dfcoord(xdridptr[*xdrid], fp, size, precision); +} + +void +FUNCTION(xdrfstring) ARGS(`xdrid, STRING_ARG(sp), maxsize, ret') +int *xdrid, *ret; +STRING_ARG_DECL(sp); +int *maxsize; +{ + char *tsp; + + tsp = (char*) malloc(((STRING_LEN(sp)) + 1) * sizeof(char)); + if (tsp == NULL) { + *ret = -1; + return; + } + if (ftocstr(tsp, *maxsize+1, STRING_PTR(sp), STRING_LEN(sp))) { + *ret = -1; + free(tsp); + return; + } + *ret = xdr_string(xdridptr[*xdrid], (char **) &tsp, (u_int) *maxsize); + ctofstr( STRING_PTR(sp), STRING_LEN(sp), tsp); + cnt += *maxsize; + free(tsp); +} + +void +FUNCTION(xdrfwrapstring) ARGS(`xdrid, STRING_ARG(sp), ret') +int *xdrid, *ret; +STRING_ARG_DECL(sp); +{ + char *tsp; + int maxsize; + maxsize = (STRING_LEN(sp)) + 1; + tsp = (char*) malloc(maxsize * sizeof(char)); + if (tsp == NULL) { + *ret = -1; + return; + } + if (ftocstr(tsp, maxsize, STRING_PTR(sp), STRING_LEN(sp))) { + *ret = -1; + free(tsp); + return; + } + *ret = xdr_string(xdridptr[*xdrid], (char **) &tsp, (u_int)maxsize); + ctofstr( STRING_PTR(sp), STRING_LEN(sp), tsp); + cnt += maxsize; + free(tsp); +} + +void +FUNCTION(xdrfopaque) ARGS(`xdrid, cp, ccnt, ret') +int *xdrid, *ret; +caddr_t *cp; +int *ccnt; +{ + *ret = xdr_opaque(xdridptr[*xdrid], (caddr_t)*cp, (u_int)*ccnt); + cnt += *ccnt; +} + +void +FUNCTION(xdrfsetpos) ARGS(`xdrid, pos, ret') +int *xdrid, *ret; +int *pos; +{ + *ret = xdr_setpos(xdridptr[*xdrid], (u_int) *pos); +} + +void +FUNCTION(xdrf) ARGS(`xdrid, pos') +int *xdrid, *pos; +{ + *pos = xdr_getpos(xdridptr[*xdrid]); +} + +void +FUNCTION(xdrfvector) ARGS(`xdrid, cp, size, elproc, ret') +int *xdrid, *ret; +char *cp; +int *size; +FUNCTION(xdrfproc) elproc; +{ + int lcnt; + cnt = 0; + for (lcnt = 0; lcnt < *size; lcnt++) { + elproc(xdrid, (cp+cnt) , ret); + } +} + + +void +FUNCTION(xdrfclose) ARGS(`xdrid, ret') +int *xdrid; +int *ret; +{ + *ret = xdrclose(xdridptr[*xdrid]); + cnt = 0; +} + +void +FUNCTION(xdrfopen) ARGS(`xdrid, STRING_ARG(fp), STRING_ARG(mode), ret') +int *xdrid; +STRING_ARG_DECL(fp); +STRING_ARG_DECL(mode); +int *ret; +{ + char fname[512]; + char fmode[3]; + + if (ftocstr(fname, sizeof(fname), STRING_PTR(fp), STRING_LEN(fp))) { + *ret = 0; + } + if (ftocstr(fmode, sizeof(fmode), STRING_PTR(mode), + STRING_LEN(mode))) { + *ret = 0; + } + + *xdrid = xdropen(NULL, fname, fmode); + if (*xdrid == 0) + *ret = 0; + else + *ret = 1; +} + +/*___________________________________________________________________________ + | + | what follows are the C routines for opening, closing xdr streams + | and the routine to read/write compressed coordinates together + | with some routines to assist in this task (those are marked + | static and cannot be called from user programs) +*/ +#define MAXABS INT_MAX-2 + +#ifndef MIN +#define MIN(x,y) ((x) < (y) ? (x):(y)) +#endif +#ifndef MAX +#define MAX(x,y) ((x) > (y) ? (x):(y)) +#endif +#ifndef SQR +#define SQR(x) ((x)*(x)) +#endif +static int magicints[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 10, 12, 16, 20, 25, 32, 40, 50, 64, + 80, 101, 128, 161, 203, 256, 322, 406, 512, 645, + 812, 1024, 1290, 1625, 2048, 2580, 3250, 4096, 5060, 6501, + 8192, 10321, 13003, 16384, 20642, 26007, 32768, 41285, 52015, 65536, + 82570, 104031, 131072, 165140, 208063, 262144, 330280, 416127, 524287, 660561, + 832255, 1048576, 1321122, 1664510, 2097152, 2642245, 3329021, 4194304, 5284491, 6658042, + 8388607, 10568983, 13316085, 16777216 }; + +#define FIRSTIDX 9 +/* note that magicints[FIRSTIDX-1] == 0 */ +#define LASTIDX (sizeof(magicints) / sizeof(*magicints)) + + +/*__________________________________________________________________________ + | + | xdropen - open xdr file + | + | This versions differs from xdrstdio_create, because I need to know + | the state of the file (read or write) so I can use xdr3dfcoord + | in eigther read or write mode, and the file descriptor + | so I can close the file (something xdr_destroy doesn't do). + | +*/ + +int xdropen(XDR *xdrs, const char *filename, const char *type) { + static int init_done = 0; + enum xdr_op lmode; + const char *type1; + int xdrid; + + if (init_done == 0) { + for (xdrid = 1; xdrid < MAXID; xdrid++) { + xdridptr[xdrid] = NULL; + } + init_done = 1; + } + xdrid = 1; + while (xdrid < MAXID && xdridptr[xdrid] != NULL) { + xdrid++; + } + if (xdrid == MAXID) { + return 0; + } + if (*type == 'w' || *type == 'W') { + type = "w+"; + type1 = "w+"; + lmode = XDR_ENCODE; + } else if (*type == 'a' || *type == 'A') { + type = "w+"; + type1 = "a+"; + lmode = XDR_ENCODE; + } else { + type = "r"; + type1 = "r"; + lmode = XDR_DECODE; + } + xdrfiles[xdrid] = fopen(filename, type1); + if (xdrfiles[xdrid] == NULL) { + xdrs = NULL; + return 0; + } + xdrmodes[xdrid] = *type; + /* next test isn't usefull in the case of C language + * but is used for the Fortran interface + * (C users are expected to pass the address of an already allocated + * XDR staructure) + */ + if (xdrs == NULL) { + xdridptr[xdrid] = (XDR *) malloc(sizeof(XDR)); + xdrstdio_create(xdridptr[xdrid], xdrfiles[xdrid], lmode); + } else { + xdridptr[xdrid] = xdrs; + xdrstdio_create(xdrs, xdrfiles[xdrid], lmode); + } + return xdrid; +} + +/*_________________________________________________________________________ + | + | xdrclose - close a xdr file + | + | This will flush the xdr buffers, and destroy the xdr stream. + | It also closes the associated file descriptor (this is *not* + | done by xdr_destroy). + | +*/ + +int xdrclose(XDR *xdrs) { + int xdrid; + + if (xdrs == NULL) { + fprintf(stderr, "xdrclose: passed a NULL pointer\n"); + exit(1); + } + for (xdrid = 1; xdrid < MAXID; xdrid++) { + if (xdridptr[xdrid] == xdrs) { + + xdr_destroy(xdrs); + fclose(xdrfiles[xdrid]); + xdridptr[xdrid] = NULL; + return 1; + } + } + fprintf(stderr, "xdrclose: no such open xdr file\n"); + exit(1); + +} + +/*____________________________________________________________________________ + | + | sendbits - encode num into buf using the specified number of bits + | + | This routines appends the value of num to the bits already present in + | the array buf. You need to give it the number of bits to use and you + | better make sure that this number of bits is enough to hold the value + | Also num must be positive. + | +*/ + +static void sendbits(int buf[], int num_of_bits, int num) { + + unsigned int cnt, lastbyte; + int lastbits; + unsigned char * cbuf; + + cbuf = ((unsigned char *)buf) + 3 * sizeof(*buf); + cnt = (unsigned int) buf[0]; + lastbits = buf[1]; + lastbyte =(unsigned int) buf[2]; + while (num_of_bits >= 8) { + lastbyte = (lastbyte << 8) | ((num >> (num_of_bits -8)) /* & 0xff*/); + cbuf[cnt++] = lastbyte >> lastbits; + num_of_bits -= 8; + } + if (num_of_bits > 0) { + lastbyte = (lastbyte << num_of_bits) | num; + lastbits += num_of_bits; + if (lastbits >= 8) { + lastbits -= 8; + cbuf[cnt++] = lastbyte >> lastbits; + } + } + buf[0] = cnt; + buf[1] = lastbits; + buf[2] = lastbyte; + if (lastbits>0) { + cbuf[cnt] = lastbyte << (8 - lastbits); + } +} + +/*_________________________________________________________________________ + | + | sizeofint - calculate bitsize of an integer + | + | return the number of bits needed to store an integer with given max size + | +*/ + +static int sizeofint(const int size) { + unsigned int num = 1; + int num_of_bits = 0; + + while (size >= num && num_of_bits < 32) { + num_of_bits++; + num <<= 1; + } + return num_of_bits; +} + +/*___________________________________________________________________________ + | + | sizeofints - calculate 'bitsize' of compressed ints + | + | given the number of small unsigned integers and the maximum value + | return the number of bits needed to read or write them with the + | routines receiveints and sendints. You need this parameter when + | calling these routines. Note that for many calls I can use + | the variable 'smallidx' which is exactly the number of bits, and + | So I don't need to call 'sizeofints for those calls. +*/ + +static int sizeofints( const int num_of_ints, unsigned int sizes[]) { + int i, num; + unsigned int num_of_bytes, num_of_bits, bytes[32], bytecnt, tmp; + num_of_bytes = 1; + bytes[0] = 1; + num_of_bits = 0; + for (i=0; i < num_of_ints; i++) { + tmp = 0; + for (bytecnt = 0; bytecnt < num_of_bytes; bytecnt++) { + tmp = bytes[bytecnt] * sizes[i] + tmp; + bytes[bytecnt] = tmp & 0xff; + tmp >>= 8; + } + while (tmp != 0) { + bytes[bytecnt++] = tmp & 0xff; + tmp >>= 8; + } + num_of_bytes = bytecnt; + } + num = 1; + num_of_bytes--; + while (bytes[num_of_bytes] >= num) { + num_of_bits++; + num *= 2; + } + return num_of_bits + num_of_bytes * 8; + +} + +/*____________________________________________________________________________ + | + | sendints - send a small set of small integers in compressed format + | + | this routine is used internally by xdr3dfcoord, to send a set of + | small integers to the buffer. + | Multiplication with fixed (specified maximum ) sizes is used to get + | to one big, multibyte integer. Allthough the routine could be + | modified to handle sizes bigger than 16777216, or more than just + | a few integers, this is not done, because the gain in compression + | isn't worth the effort. Note that overflowing the multiplication + | or the byte buffer (32 bytes) is unchecked and causes bad results. + | + */ + +static void sendints(int buf[], const int num_of_ints, const int num_of_bits, + unsigned int sizes[], unsigned int nums[]) { + + int i; + unsigned int bytes[32], num_of_bytes, bytecnt, tmp; + + tmp = nums[0]; + num_of_bytes = 0; + do { + bytes[num_of_bytes++] = tmp & 0xff; + tmp >>= 8; + } while (tmp != 0); + + for (i = 1; i < num_of_ints; i++) { + if (nums[i] >= sizes[i]) { + fprintf(stderr,"major breakdown in sendints num %d doesn't " + "match size %d\n", nums[i], sizes[i]); + exit(1); + } + /* use one step multiply */ + tmp = nums[i]; + for (bytecnt = 0; bytecnt < num_of_bytes; bytecnt++) { + tmp = bytes[bytecnt] * sizes[i] + tmp; + bytes[bytecnt] = tmp & 0xff; + tmp >>= 8; + } + while (tmp != 0) { + bytes[bytecnt++] = tmp & 0xff; + tmp >>= 8; + } + num_of_bytes = bytecnt; + } + if (num_of_bits >= num_of_bytes * 8) { + for (i = 0; i < num_of_bytes; i++) { + sendbits(buf, 8, bytes[i]); + } + sendbits(buf, num_of_bits - num_of_bytes * 8, 0); + } else { + for (i = 0; i < num_of_bytes-1; i++) { + sendbits(buf, 8, bytes[i]); + } + sendbits(buf, num_of_bits- (num_of_bytes -1) * 8, bytes[i]); + } +} + + +/*___________________________________________________________________________ + | + | receivebits - decode number from buf using specified number of bits + | + | extract the number of bits from the array buf and construct an integer + | from it. Return that value. + | +*/ + +static int receivebits(int buf[], int num_of_bits) { + + int cnt, num; + unsigned int lastbits, lastbyte; + unsigned char * cbuf; + int mask = (1 << num_of_bits) -1; + + cbuf = ((unsigned char *)buf) + 3 * sizeof(*buf); + cnt = buf[0]; + lastbits = (unsigned int) buf[1]; + lastbyte = (unsigned int) buf[2]; + + num = 0; + while (num_of_bits >= 8) { + lastbyte = ( lastbyte << 8 ) | cbuf[cnt++]; + num |= (lastbyte >> lastbits) << (num_of_bits - 8); + num_of_bits -=8; + } + if (num_of_bits > 0) { + if (lastbits < num_of_bits) { + lastbits += 8; + lastbyte = (lastbyte << 8) | cbuf[cnt++]; + } + lastbits -= num_of_bits; + num |= (lastbyte >> lastbits) & ((1 << num_of_bits) -1); + } + num &= mask; + buf[0] = cnt; + buf[1] = lastbits; + buf[2] = lastbyte; + return num; +} + +/*____________________________________________________________________________ + | + | receiveints - decode 'small' integers from the buf array + | + | this routine is the inverse from sendints() and decodes the small integers + | written to buf by calculating the remainder and doing divisions with + | the given sizes[]. You need to specify the total number of bits to be + | used from buf in num_of_bits. + | +*/ + +static void receiveints(int buf[], const int num_of_ints, int num_of_bits, + unsigned int sizes[], int nums[]) { + int bytes[32]; + int i, j, num_of_bytes, p, num; + + bytes[1] = bytes[2] = bytes[3] = 0; + num_of_bytes = 0; + while (num_of_bits > 8) { + bytes[num_of_bytes++] = receivebits(buf, 8); + num_of_bits -= 8; + } + if (num_of_bits > 0) { + bytes[num_of_bytes++] = receivebits(buf, num_of_bits); + } + for (i = num_of_ints-1; i > 0; i--) { + num = 0; + for (j = num_of_bytes-1; j >=0; j--) { + num = (num << 8) | bytes[j]; + p = num / sizes[i]; + bytes[j] = p; + num = num - p * sizes[i]; + } + nums[i] = num; + } + nums[0] = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24); +} + +/*____________________________________________________________________________ + | + | xdr3dfcoord - read or write compressed 3d coordinates to xdr file. + | + | this routine reads or writes (depending on how you opened the file with + | xdropen() ) a large number of 3d coordinates (stored in *fp). + | The number of coordinates triplets to write is given by *size. On + | read this number may be zero, in which case it reads as many as were written + | or it may specify the number if triplets to read (which should match the + | number written). + | Compression is achieved by first converting all floating numbers to integer + | using multiplication by *precision and rounding to the nearest integer. + | Then the minimum and maximum value are calculated to determine the range. + | The limited range of integers so found, is used to compress the coordinates. + | In addition the differences between succesive coordinates is calculated. + | If the difference happens to be 'small' then only the difference is saved, + | compressing the data even more. The notion of 'small' is changed dynamically + | and is enlarged or reduced whenever needed or possible. + | Extra compression is achieved in the case of GROMOS and coordinates of + | water molecules. GROMOS first writes out the Oxygen position, followed by + | the two hydrogens. In order to make the differences smaller (and thereby + | compression the data better) the order is changed into first one hydrogen + | then the oxygen, followed by the other hydrogen. This is rather special, but + | it shouldn't harm in the general case. + | + */ + +int xdr3dfcoord(XDR *xdrs, float *fp, int *size, float *precision) { + + + static int *ip = NULL; + static int oldsize; + static int *buf; + + int minint[3], maxint[3], mindiff, *lip, diff; + int lint1, lint2, lint3, oldlint1, oldlint2, oldlint3, smallidx; + int minidx, maxidx; + unsigned sizeint[3], sizesmall[3], bitsizeint[3], size3, *luip; + int flag, k; + int small, smaller, larger, i, is_small, is_smaller, run, prevrun; + float *lfp, lf; + int tmp, *thiscoord, prevcoord[3]; + unsigned int tmpcoord[30]; + + int bufsize, xdrid, lsize; + unsigned int bitsize; + float inv_precision; + int errval = 1; + + /* find out if xdrs is opened for reading or for writing */ + xdrid = 0; + while (xdridptr[xdrid] != xdrs) { + xdrid++; + if (xdrid >= MAXID) { + fprintf(stderr, "xdr error. no open xdr stream\n"); + exit (1); + } + } + if (xdrmodes[xdrid] == 'w') { + + /* xdrs is open for writing */ + + if (xdr_int(xdrs, size) == 0) + return 0; + size3 = *size * 3; + /* when the number of coordinates is small, don't try to compress; just + * write them as floats using xdr_vector + */ + if (*size <= 9 ) { + return (xdr_vector(xdrs, (char *) fp, size3, sizeof(*fp), + (xdrproc_t)xdr_float)); + } + + xdr_float(xdrs, precision); + if (ip == NULL) { + ip = (int *)malloc(size3 * sizeof(*ip)); + if (ip == NULL) { + fprintf(stderr,"malloc failed\n"); + exit(1); + } + bufsize = size3 * 1.2; + buf = (int *)malloc(bufsize * sizeof(*buf)); + if (buf == NULL) { + fprintf(stderr,"malloc failed\n"); + exit(1); + } + oldsize = *size; + } else if (*size > oldsize) { + ip = (int *)realloc(ip, size3 * sizeof(*ip)); + if (ip == NULL) { + fprintf(stderr,"malloc failed\n"); + exit(1); + } + bufsize = size3 * 1.2; + buf = (int *)realloc(buf, bufsize * sizeof(*buf)); + if (buf == NULL) { + fprintf(stderr,"malloc failed\n"); + exit(1); + } + oldsize = *size; + } + /* buf[0-2] are special and do not contain actual data */ + buf[0] = buf[1] = buf[2] = 0; + minint[0] = minint[1] = minint[2] = INT_MAX; + maxint[0] = maxint[1] = maxint[2] = INT_MIN; + prevrun = -1; + lfp = fp; + lip = ip; + mindiff = INT_MAX; + oldlint1 = oldlint2 = oldlint3 = 0; + while(lfp < fp + size3 ) { + /* find nearest integer */ + if (*lfp >= 0.0) + lf = *lfp * *precision + 0.5; + else + lf = *lfp * *precision - 0.5; + if (fabs(lf) > MAXABS) { + /* scaling would cause overflow */ + errval = 0; + } + lint1 = lf; + if (lint1 < minint[0]) minint[0] = lint1; + if (lint1 > maxint[0]) maxint[0] = lint1; + *lip++ = lint1; + lfp++; + if (*lfp >= 0.0) + lf = *lfp * *precision + 0.5; + else + lf = *lfp * *precision - 0.5; + if (fabs(lf) > MAXABS) { + /* scaling would cause overflow */ + errval = 0; + } + lint2 = lf; + if (lint2 < minint[1]) minint[1] = lint2; + if (lint2 > maxint[1]) maxint[1] = lint2; + *lip++ = lint2; + lfp++; + if (*lfp >= 0.0) + lf = *lfp * *precision + 0.5; + else + lf = *lfp * *precision - 0.5; + if (fabs(lf) > MAXABS) { + /* scaling would cause overflow */ + errval = 0; + } + lint3 = lf; + if (lint3 < minint[2]) minint[2] = lint3; + if (lint3 > maxint[2]) maxint[2] = lint3; + *lip++ = lint3; + lfp++; + diff = abs(oldlint1-lint1)+abs(oldlint2-lint2)+abs(oldlint3-lint3); + if (diff < mindiff && lfp > fp + 3) + mindiff = diff; + oldlint1 = lint1; + oldlint2 = lint2; + oldlint3 = lint3; + } + xdr_int(xdrs, &(minint[0])); + xdr_int(xdrs, &(minint[1])); + xdr_int(xdrs, &(minint[2])); + + xdr_int(xdrs, &(maxint[0])); + xdr_int(xdrs, &(maxint[1])); + xdr_int(xdrs, &(maxint[2])); + + if ((float)maxint[0] - (float)minint[0] >= MAXABS || + (float)maxint[1] - (float)minint[1] >= MAXABS || + (float)maxint[2] - (float)minint[2] >= MAXABS) { + /* turning value in unsigned by subtracting minint + * would cause overflow + */ + errval = 0; + } + sizeint[0] = maxint[0] - minint[0]+1; + sizeint[1] = maxint[1] - minint[1]+1; + sizeint[2] = maxint[2] - minint[2]+1; + + /* check if one of the sizes is to big to be multiplied */ + if ((sizeint[0] | sizeint[1] | sizeint[2] ) > 0xffffff) { + bitsizeint[0] = sizeofint(sizeint[0]); + bitsizeint[1] = sizeofint(sizeint[1]); + bitsizeint[2] = sizeofint(sizeint[2]); + bitsize = 0; /* flag the use of large sizes */ + } else { + bitsize = sizeofints(3, sizeint); + } + lip = ip; + luip = (unsigned int *) ip; + smallidx = FIRSTIDX; + while (smallidx < LASTIDX && magicints[smallidx] < mindiff) { + smallidx++; + } + xdr_int(xdrs, &smallidx); + maxidx = MIN(LASTIDX, smallidx + 8) ; + minidx = maxidx - 8; /* often this equal smallidx */ + smaller = magicints[MAX(FIRSTIDX, smallidx-1)] / 2; + small = magicints[smallidx] / 2; + sizesmall[0] = sizesmall[1] = sizesmall[2] = magicints[smallidx]; + larger = magicints[maxidx] / 2; + i = 0; + while (i < *size) { + is_small = 0; + thiscoord = (int *)(luip) + i * 3; + if (smallidx < maxidx && i >= 1 && + abs(thiscoord[0] - prevcoord[0]) < larger && + abs(thiscoord[1] - prevcoord[1]) < larger && + abs(thiscoord[2] - prevcoord[2]) < larger) { + is_smaller = 1; + } else if (smallidx > minidx) { + is_smaller = -1; + } else { + is_smaller = 0; + } + if (i + 1 < *size) { + if (abs(thiscoord[0] - thiscoord[3]) < small && + abs(thiscoord[1] - thiscoord[4]) < small && + abs(thiscoord[2] - thiscoord[5]) < small) { + /* interchange first with second atom for better + * compression of water molecules + */ + tmp = thiscoord[0]; thiscoord[0] = thiscoord[3]; + thiscoord[3] = tmp; + tmp = thiscoord[1]; thiscoord[1] = thiscoord[4]; + thiscoord[4] = tmp; + tmp = thiscoord[2]; thiscoord[2] = thiscoord[5]; + thiscoord[5] = tmp; + is_small = 1; + } + + } + tmpcoord[0] = thiscoord[0] - minint[0]; + tmpcoord[1] = thiscoord[1] - minint[1]; + tmpcoord[2] = thiscoord[2] - minint[2]; + if (bitsize == 0) { + sendbits(buf, bitsizeint[0], tmpcoord[0]); + sendbits(buf, bitsizeint[1], tmpcoord[1]); + sendbits(buf, bitsizeint[2], tmpcoord[2]); + } else { + sendints(buf, 3, bitsize, sizeint, tmpcoord); + } + prevcoord[0] = thiscoord[0]; + prevcoord[1] = thiscoord[1]; + prevcoord[2] = thiscoord[2]; + thiscoord = thiscoord + 3; + i++; + + run = 0; + if (is_small == 0 && is_smaller == -1) + is_smaller = 0; + while (is_small && run < 8*3) { + if (is_smaller == -1 && ( + SQR(thiscoord[0] - prevcoord[0]) + + SQR(thiscoord[1] - prevcoord[1]) + + SQR(thiscoord[2] - prevcoord[2]) >= smaller * smaller)) { + is_smaller = 0; + } + + tmpcoord[run++] = thiscoord[0] - prevcoord[0] + small; + tmpcoord[run++] = thiscoord[1] - prevcoord[1] + small; + tmpcoord[run++] = thiscoord[2] - prevcoord[2] + small; + + prevcoord[0] = thiscoord[0]; + prevcoord[1] = thiscoord[1]; + prevcoord[2] = thiscoord[2]; + + i++; + thiscoord = thiscoord + 3; + is_small = 0; + if (i < *size && + abs(thiscoord[0] - prevcoord[0]) < small && + abs(thiscoord[1] - prevcoord[1]) < small && + abs(thiscoord[2] - prevcoord[2]) < small) { + is_small = 1; + } + } + if (run != prevrun || is_smaller != 0) { + prevrun = run; + sendbits(buf, 1, 1); /* flag the change in run-length */ + sendbits(buf, 5, run+is_smaller+1); + } else { + sendbits(buf, 1, 0); /* flag the fact that runlength did not change */ + } + for (k=0; k < run; k+=3) { + sendints(buf, 3, smallidx, sizesmall, &tmpcoord[k]); + } + if (is_smaller != 0) { + smallidx += is_smaller; + if (is_smaller < 0) { + small = smaller; + smaller = magicints[smallidx-1] / 2; + } else { + smaller = small; + small = magicints[smallidx] / 2; + } + sizesmall[0] = sizesmall[1] = sizesmall[2] = magicints[smallidx]; + } + } + if (buf[1] != 0) buf[0]++;; + xdr_int(xdrs, &(buf[0])); /* buf[0] holds the length in bytes */ + return errval * (xdr_opaque(xdrs, (caddr_t)&(buf[3]), (u_int)buf[0])); + } else { + + /* xdrs is open for reading */ + + if (xdr_int(xdrs, &lsize) == 0) + return 0; + if (*size != 0 && lsize != *size) { + fprintf(stderr, "wrong number of coordinates in xdr3dfcoor; " + "%d arg vs %d in file", *size, lsize); + } + *size = lsize; + size3 = *size * 3; + if (*size <= 9) { + return (xdr_vector(xdrs, (char *) fp, size3, sizeof(*fp), + (xdrproc_t)xdr_float)); + } + xdr_float(xdrs, precision); + if (ip == NULL) { + ip = (int *)malloc(size3 * sizeof(*ip)); + if (ip == NULL) { + fprintf(stderr,"malloc failed\n"); + exit(1); + } + bufsize = size3 * 1.2; + buf = (int *)malloc(bufsize * sizeof(*buf)); + if (buf == NULL) { + fprintf(stderr,"malloc failed\n"); + exit(1); + } + oldsize = *size; + } else if (*size > oldsize) { + ip = (int *)realloc(ip, size3 * sizeof(*ip)); + if (ip == NULL) { + fprintf(stderr,"malloc failed\n"); + exit(1); + } + bufsize = size3 * 1.2; + buf = (int *)realloc(buf, bufsize * sizeof(*buf)); + if (buf == NULL) { + fprintf(stderr,"malloc failed\n"); + exit(1); + } + oldsize = *size; + } + buf[0] = buf[1] = buf[2] = 0; + + xdr_int(xdrs, &(minint[0])); + xdr_int(xdrs, &(minint[1])); + xdr_int(xdrs, &(minint[2])); + + xdr_int(xdrs, &(maxint[0])); + xdr_int(xdrs, &(maxint[1])); + xdr_int(xdrs, &(maxint[2])); + + sizeint[0] = maxint[0] - minint[0]+1; + sizeint[1] = maxint[1] - minint[1]+1; + sizeint[2] = maxint[2] - minint[2]+1; + + /* check if one of the sizes is to big to be multiplied */ + if ((sizeint[0] | sizeint[1] | sizeint[2] ) > 0xffffff) { + bitsizeint[0] = sizeofint(sizeint[0]); + bitsizeint[1] = sizeofint(sizeint[1]); + bitsizeint[2] = sizeofint(sizeint[2]); + bitsize = 0; /* flag the use of large sizes */ + } else { + bitsize = sizeofints(3, sizeint); + } + + xdr_int(xdrs, &smallidx); + maxidx = MIN(LASTIDX, smallidx + 8) ; + minidx = maxidx - 8; /* often this equal smallidx */ + smaller = magicints[MAX(FIRSTIDX, smallidx-1)] / 2; + small = magicints[smallidx] / 2; + sizesmall[0] = sizesmall[1] = sizesmall[2] = magicints[smallidx] ; + larger = magicints[maxidx]; + + /* buf[0] holds the length in bytes */ + + if (xdr_int(xdrs, &(buf[0])) == 0) + return 0; + if (xdr_opaque(xdrs, (caddr_t)&(buf[3]), (u_int)buf[0]) == 0) + return 0; + buf[0] = buf[1] = buf[2] = 0; + + lfp = fp; + inv_precision = 1.0 / * precision; + run = 0; + i = 0; + lip = ip; + while ( i < lsize ) { + thiscoord = (int *)(lip) + i * 3; + + if (bitsize == 0) { + thiscoord[0] = receivebits(buf, bitsizeint[0]); + thiscoord[1] = receivebits(buf, bitsizeint[1]); + thiscoord[2] = receivebits(buf, bitsizeint[2]); + } else { + receiveints(buf, 3, bitsize, sizeint, thiscoord); + } + + i++; + thiscoord[0] += minint[0]; + thiscoord[1] += minint[1]; + thiscoord[2] += minint[2]; + + prevcoord[0] = thiscoord[0]; + prevcoord[1] = thiscoord[1]; + prevcoord[2] = thiscoord[2]; + + + flag = receivebits(buf, 1); + is_smaller = 0; + if (flag == 1) { + run = receivebits(buf, 5); + is_smaller = run % 3; + run -= is_smaller; + is_smaller--; + } + if (run > 0) { + thiscoord += 3; + for (k = 0; k < run; k+=3) { + receiveints(buf, 3, smallidx, sizesmall, thiscoord); + i++; + thiscoord[0] += prevcoord[0] - small; + thiscoord[1] += prevcoord[1] - small; + thiscoord[2] += prevcoord[2] - small; + if (k == 0) { + /* interchange first with second atom for better + * compression of water molecules + */ + tmp = thiscoord[0]; thiscoord[0] = prevcoord[0]; + prevcoord[0] = tmp; + tmp = thiscoord[1]; thiscoord[1] = prevcoord[1]; + prevcoord[1] = tmp; + tmp = thiscoord[2]; thiscoord[2] = prevcoord[2]; + prevcoord[2] = tmp; + *lfp++ = prevcoord[0] * inv_precision; + *lfp++ = prevcoord[1] * inv_precision; + *lfp++ = prevcoord[2] * inv_precision; + } else { + prevcoord[0] = thiscoord[0]; + prevcoord[1] = thiscoord[1]; + prevcoord[2] = thiscoord[2]; + } + *lfp++ = thiscoord[0] * inv_precision; + *lfp++ = thiscoord[1] * inv_precision; + *lfp++ = thiscoord[2] * inv_precision; + } + } else { + *lfp++ = thiscoord[0] * inv_precision; + *lfp++ = thiscoord[1] * inv_precision; + *lfp++ = thiscoord[2] * inv_precision; + } + smallidx += is_smaller; + if (is_smaller < 0) { + small = smaller; + if (smallidx > FIRSTIDX) { + smaller = magicints[smallidx - 1] /2; + } else { + smaller = 0; + } + } else if (is_smaller > 0) { + smaller = small; + small = magicints[smallidx] / 2; + } + sizesmall[0] = sizesmall[1] = sizesmall[2] = magicints[smallidx] ; + } + } + return 1; +} + + + diff --git a/source/unres/src_MD-NEWSC/xdrf/types.h b/source/unres/src_MD-NEWSC/xdrf/types.h new file mode 100644 index 0000000..871f3fd --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/types.h @@ -0,0 +1,99 @@ +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part. Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ +/* fixincludes should not add extern "C" to this file */ +/* + * Rpc additions to + */ +#ifndef _RPC_TYPES_H +#define _RPC_TYPES_H 1 + +typedef int bool_t; +typedef int enum_t; +/* This needs to be changed to uint32_t in the future */ +typedef unsigned long rpcprog_t; +typedef unsigned long rpcvers_t; +typedef unsigned long rpcproc_t; +typedef unsigned long rpcprot_t; +typedef unsigned long rpcport_t; + +#define __dontcare__ -1 + +#ifndef FALSE +# define FALSE (0) +#endif + +#ifndef TRUE +# define TRUE (1) +#endif + +#ifndef NULL +# define NULL 0 +#endif + +#include /* For malloc decl. */ +#define mem_alloc(bsize) malloc(bsize) +/* + * XXX: This must not use the second argument, or code in xdr_array.c needs + * to be modified. + */ +#define mem_free(ptr, bsize) free(ptr) + +#ifndef makedev /* ie, we haven't already included it */ +#include +#endif + +#ifndef __u_char_defined +typedef __u_char u_char; +typedef __u_short u_short; +typedef __u_int u_int; +typedef __u_long u_long; +typedef __quad_t quad_t; +typedef __u_quad_t u_quad_t; +typedef __fsid_t fsid_t; +# define __u_char_defined +#endif +#ifndef __daddr_t_defined +typedef __daddr_t daddr_t; +typedef __caddr_t caddr_t; +# define __daddr_t_defined +#endif + +#include +#include + +#include + +#ifndef INADDR_LOOPBACK +#define INADDR_LOOPBACK (u_long)0x7F000001 +#endif +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN 64 +#endif + +#endif /* rpc/types.h */ diff --git a/source/unres/src_MD-NEWSC/xdrf/underscore.m4 b/source/unres/src_MD-NEWSC/xdrf/underscore.m4 new file mode 100644 index 0000000..4d620a0 --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/underscore.m4 @@ -0,0 +1,19 @@ +divert(-1) +undefine(`len') +# +# append an underscore to FORTRAN function names +# +define(`FUNCTION',`$1_') +# +# FORTRAN character strings are passed as follows: +# a pointer to the base of the string is passed in the normal +# argument list, and the length is passed by value as an extra +# argument, after all of the other arguments. +# +define(`ARGS',`($1`'undivert(1))') +define(`SAVE',`divert(1)$1`'divert(0)') +define(`STRING_ARG',`$1_ptr`'SAVE(`, $1_len')') +define(`STRING_ARG_DECL',`char * $1_ptr; int $1_len') +define(`STRING_LEN',`$1_len') +define(`STRING_PTR',`$1_ptr') +divert(0) diff --git a/source/unres/src_MD-NEWSC/xdrf/xdr.c b/source/unres/src_MD-NEWSC/xdrf/xdr.c new file mode 100644 index 0000000..33b8544 --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/xdr.c @@ -0,0 +1,752 @@ +# define INTUSE(name) name +# define INTDEF(name) +/* @(#)xdr.c 2.1 88/07/29 4.0 RPCSRC */ +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part. Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ +#if !defined(lint) && defined(SCCSIDS) +static char sccsid[] = "@(#)xdr.c 1.35 87/08/12"; +#endif + +/* + * xdr.c, Generic XDR routines implementation. + * + * Copyright (C) 1986, Sun Microsystems, Inc. + * + * These are the "generic" xdr routines used to serialize and de-serialize + * most common data items. See xdr.h for more info on the interface to + * xdr. + */ + +#include +#include +#include +#include + +#include "types.h" +#include "xdr.h" + +#ifdef USE_IN_LIBIO +# include +#endif + +/* + * constants specific to the xdr "protocol" + */ +#define XDR_FALSE ((long) 0) +#define XDR_TRUE ((long) 1) +#define LASTUNSIGNED ((u_int) 0-1) + +/* + * for unit alignment + */ +static const char xdr_zero[BYTES_PER_XDR_UNIT] = {0, 0, 0, 0}; + +/* + * Free a data structure using XDR + * Not a filter, but a convenient utility nonetheless + */ +void +xdr_free (xdrproc_t proc, char *objp) +{ + XDR x; + + x.x_op = XDR_FREE; + (*proc) (&x, objp); +} + +/* + * XDR nothing + */ +bool_t +xdr_void (void) +{ + return TRUE; +} +INTDEF(xdr_void) + +/* + * XDR integers + */ +bool_t +xdr_int (XDR *xdrs, int *ip) +{ + +#if INT_MAX < LONG_MAX + long l; + + switch (xdrs->x_op) + { + case XDR_ENCODE: + l = (long) *ip; + return XDR_PUTLONG (xdrs, &l); + + case XDR_DECODE: + if (!XDR_GETLONG (xdrs, &l)) + { + return FALSE; + } + *ip = (int) l; + case XDR_FREE: + return TRUE; + } + return FALSE; +#elif INT_MAX == LONG_MAX + return INTUSE(xdr_long) (xdrs, (long *) ip); +#elif INT_MAX == SHRT_MAX + return INTUSE(xdr_short) (xdrs, (short *) ip); +#else +#error unexpected integer sizes in_xdr_int() +#endif +} +INTDEF(xdr_int) + +/* + * XDR unsigned integers + */ +bool_t +xdr_u_int (XDR *xdrs, u_int *up) +{ +#if UINT_MAX < ULONG_MAX + long l; + + switch (xdrs->x_op) + { + case XDR_ENCODE: + l = (u_long) * up; + return XDR_PUTLONG (xdrs, &l); + + case XDR_DECODE: + if (!XDR_GETLONG (xdrs, &l)) + { + return FALSE; + } + *up = (u_int) (u_long) l; + case XDR_FREE: + return TRUE; + } + return FALSE; +#elif UINT_MAX == ULONG_MAX + return INTUSE(xdr_u_long) (xdrs, (u_long *) up); +#elif UINT_MAX == USHRT_MAX + return INTUSE(xdr_short) (xdrs, (short *) up); +#else +#error unexpected integer sizes in_xdr_u_int() +#endif +} +INTDEF(xdr_u_int) + +/* + * XDR long integers + * The definition of xdr_long() is kept for backward + * compatibility. Instead xdr_int() should be used. + */ +bool_t +xdr_long (XDR *xdrs, long *lp) +{ + + if (xdrs->x_op == XDR_ENCODE + && (sizeof (int32_t) == sizeof (long) + || (int32_t) *lp == *lp)) + return XDR_PUTLONG (xdrs, lp); + + if (xdrs->x_op == XDR_DECODE) + return XDR_GETLONG (xdrs, lp); + + if (xdrs->x_op == XDR_FREE) + return TRUE; + + return FALSE; +} +INTDEF(xdr_long) + +/* + * XDR unsigned long integers + * The definition of xdr_u_long() is kept for backward + * compatibility. Instead xdr_u_int() should be used. + */ +bool_t +xdr_u_long (XDR *xdrs, u_long *ulp) +{ + switch (xdrs->x_op) + { + case XDR_DECODE: + { + long int tmp; + + if (XDR_GETLONG (xdrs, &tmp) == FALSE) + return FALSE; + + *ulp = (uint32_t) tmp; + return TRUE; + } + + case XDR_ENCODE: + if (sizeof (uint32_t) != sizeof (u_long) + && (uint32_t) *ulp != *ulp) + return FALSE; + + return XDR_PUTLONG (xdrs, (long *) ulp); + + case XDR_FREE: + return TRUE; + } + return FALSE; +} +INTDEF(xdr_u_long) + +/* + * XDR hyper integers + * same as xdr_u_hyper - open coded to save a proc call! + */ +bool_t +xdr_hyper (XDR *xdrs, quad_t *llp) +{ + long int t1, t2; + + if (xdrs->x_op == XDR_ENCODE) + { + t1 = (long) ((*llp) >> 32); + t2 = (long) (*llp); + return (XDR_PUTLONG(xdrs, &t1) && XDR_PUTLONG(xdrs, &t2)); + } + + if (xdrs->x_op == XDR_DECODE) + { + if (!XDR_GETLONG(xdrs, &t1) || !XDR_GETLONG(xdrs, &t2)) + return FALSE; + *llp = ((quad_t) t1) << 32; + *llp |= (uint32_t) t2; + return TRUE; + } + + if (xdrs->x_op == XDR_FREE) + return TRUE; + + return FALSE; +} +INTDEF(xdr_hyper) + + +/* + * XDR hyper integers + * same as xdr_hyper - open coded to save a proc call! + */ +bool_t +xdr_u_hyper (XDR *xdrs, u_quad_t *ullp) +{ + long int t1, t2; + + if (xdrs->x_op == XDR_ENCODE) + { + t1 = (unsigned long) ((*ullp) >> 32); + t2 = (unsigned long) (*ullp); + return (XDR_PUTLONG(xdrs, &t1) && XDR_PUTLONG(xdrs, &t2)); + } + + if (xdrs->x_op == XDR_DECODE) + { + if (!XDR_GETLONG(xdrs, &t1) || !XDR_GETLONG(xdrs, &t2)) + return FALSE; + *ullp = ((u_quad_t) t1) << 32; + *ullp |= (uint32_t) t2; + return TRUE; + } + + if (xdrs->x_op == XDR_FREE) + return TRUE; + + return FALSE; +} +INTDEF(xdr_u_hyper) + +bool_t +xdr_longlong_t (XDR *xdrs, quad_t *llp) +{ + return INTUSE(xdr_hyper) (xdrs, llp); +} + +bool_t +xdr_u_longlong_t (XDR *xdrs, u_quad_t *ullp) +{ + return INTUSE(xdr_u_hyper) (xdrs, ullp); +} + +/* + * XDR short integers + */ +bool_t +xdr_short (XDR *xdrs, short *sp) +{ + long l; + + switch (xdrs->x_op) + { + case XDR_ENCODE: + l = (long) *sp; + return XDR_PUTLONG (xdrs, &l); + + case XDR_DECODE: + if (!XDR_GETLONG (xdrs, &l)) + { + return FALSE; + } + *sp = (short) l; + return TRUE; + + case XDR_FREE: + return TRUE; + } + return FALSE; +} +INTDEF(xdr_short) + +/* + * XDR unsigned short integers + */ +bool_t +xdr_u_short (XDR *xdrs, u_short *usp) +{ + long l; + + switch (xdrs->x_op) + { + case XDR_ENCODE: + l = (u_long) * usp; + return XDR_PUTLONG (xdrs, &l); + + case XDR_DECODE: + if (!XDR_GETLONG (xdrs, &l)) + { + return FALSE; + } + *usp = (u_short) (u_long) l; + return TRUE; + + case XDR_FREE: + return TRUE; + } + return FALSE; +} +INTDEF(xdr_u_short) + + +/* + * XDR a char + */ +bool_t +xdr_char (XDR *xdrs, char *cp) +{ + int i; + + i = (*cp); + if (!INTUSE(xdr_int) (xdrs, &i)) + { + return FALSE; + } + *cp = i; + return TRUE; +} + +/* + * XDR an unsigned char + */ +bool_t +xdr_u_char (XDR *xdrs, u_char *cp) +{ + u_int u; + + u = (*cp); + if (!INTUSE(xdr_u_int) (xdrs, &u)) + { + return FALSE; + } + *cp = u; + return TRUE; +} + +/* + * XDR booleans + */ +bool_t +xdr_bool (XDR *xdrs, bool_t *bp) +{ + long lb; + + switch (xdrs->x_op) + { + case XDR_ENCODE: + lb = *bp ? XDR_TRUE : XDR_FALSE; + return XDR_PUTLONG (xdrs, &lb); + + case XDR_DECODE: + if (!XDR_GETLONG (xdrs, &lb)) + { + return FALSE; + } + *bp = (lb == XDR_FALSE) ? FALSE : TRUE; + return TRUE; + + case XDR_FREE: + return TRUE; + } + return FALSE; +} +INTDEF(xdr_bool) + +/* + * XDR enumerations + */ +bool_t +xdr_enum (XDR *xdrs, enum_t *ep) +{ + enum sizecheck + { + SIZEVAL + }; /* used to find the size of an enum */ + + /* + * enums are treated as ints + */ + if (sizeof (enum sizecheck) == 4) + { +#if INT_MAX < LONG_MAX + long l; + + switch (xdrs->x_op) + { + case XDR_ENCODE: + l = *ep; + return XDR_PUTLONG (xdrs, &l); + + case XDR_DECODE: + if (!XDR_GETLONG (xdrs, &l)) + { + return FALSE; + } + *ep = l; + case XDR_FREE: + return TRUE; + + } + return FALSE; +#else + return INTUSE(xdr_long) (xdrs, (long *) ep); +#endif + } + else if (sizeof (enum sizecheck) == sizeof (short)) + { + return INTUSE(xdr_short) (xdrs, (short *) ep); + } + else + { + return FALSE; + } +} +INTDEF(xdr_enum) + +/* + * XDR opaque data + * Allows the specification of a fixed size sequence of opaque bytes. + * cp points to the opaque object and cnt gives the byte length. + */ +bool_t +xdr_opaque (XDR *xdrs, caddr_t cp, u_int cnt) +{ + u_int rndup; + static char crud[BYTES_PER_XDR_UNIT]; + + /* + * if no data we are done + */ + if (cnt == 0) + return TRUE; + + /* + * round byte count to full xdr units + */ + rndup = cnt % BYTES_PER_XDR_UNIT; + if (rndup > 0) + rndup = BYTES_PER_XDR_UNIT - rndup; + + switch (xdrs->x_op) + { + case XDR_DECODE: + if (!XDR_GETBYTES (xdrs, cp, cnt)) + { + return FALSE; + } + if (rndup == 0) + return TRUE; + return XDR_GETBYTES (xdrs, (caddr_t)crud, rndup); + + case XDR_ENCODE: + if (!XDR_PUTBYTES (xdrs, cp, cnt)) + { + return FALSE; + } + if (rndup == 0) + return TRUE; + return XDR_PUTBYTES (xdrs, xdr_zero, rndup); + + case XDR_FREE: + return TRUE; + } + return FALSE; +} +INTDEF(xdr_opaque) + +/* + * XDR counted bytes + * *cpp is a pointer to the bytes, *sizep is the count. + * If *cpp is NULL maxsize bytes are allocated + */ +bool_t +xdr_bytes (xdrs, cpp, sizep, maxsize) + XDR *xdrs; + char **cpp; + u_int *sizep; + u_int maxsize; +{ + char *sp = *cpp; /* sp is the actual string pointer */ + u_int nodesize; + + /* + * first deal with the length since xdr bytes are counted + */ + if (!INTUSE(xdr_u_int) (xdrs, sizep)) + { + return FALSE; + } + nodesize = *sizep; + if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) + { + return FALSE; + } + + /* + * now deal with the actual bytes + */ + switch (xdrs->x_op) + { + case XDR_DECODE: + if (nodesize == 0) + { + return TRUE; + } + if (sp == NULL) + { + *cpp = sp = (char *) mem_alloc (nodesize); + } + if (sp == NULL) + { + fprintf (NULL, "%s", "xdr_bytes: out of memory\n"); + return FALSE; + } + /* fall into ... */ + + case XDR_ENCODE: + return INTUSE(xdr_opaque) (xdrs, sp, nodesize); + + case XDR_FREE: + if (sp != NULL) + { + mem_free (sp, nodesize); + *cpp = NULL; + } + return TRUE; + } + return FALSE; +} +INTDEF(xdr_bytes) + +/* + * Implemented here due to commonality of the object. + */ +bool_t +xdr_netobj (xdrs, np) + XDR *xdrs; + struct netobj *np; +{ + + return INTUSE(xdr_bytes) (xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ); +} +INTDEF(xdr_netobj) + +/* + * XDR a discriminated union + * Support routine for discriminated unions. + * You create an array of xdrdiscrim structures, terminated with + * an entry with a null procedure pointer. The routine gets + * the discriminant value and then searches the array of xdrdiscrims + * looking for that value. It calls the procedure given in the xdrdiscrim + * to handle the discriminant. If there is no specific routine a default + * routine may be called. + * If there is no specific or default routine an error is returned. + */ +bool_t +xdr_union (xdrs, dscmp, unp, choices, dfault) + XDR *xdrs; + enum_t *dscmp; /* enum to decide which arm to work on */ + char *unp; /* the union itself */ + const struct xdr_discrim *choices; /* [value, xdr proc] for each arm */ + xdrproc_t dfault; /* default xdr routine */ +{ + enum_t dscm; + + /* + * we deal with the discriminator; it's an enum + */ + if (!INTUSE(xdr_enum) (xdrs, dscmp)) + { + return FALSE; + } + dscm = *dscmp; + + /* + * search choices for a value that matches the discriminator. + * if we find one, execute the xdr routine for that value. + */ + for (; choices->proc != NULL_xdrproc_t; choices++) + { + if (choices->value == dscm) + return (*(choices->proc)) (xdrs, unp, LASTUNSIGNED); + } + + /* + * no match - execute the default xdr routine if there is one + */ + return ((dfault == NULL_xdrproc_t) ? FALSE : + (*dfault) (xdrs, unp, LASTUNSIGNED)); +} +INTDEF(xdr_union) + + +/* + * Non-portable xdr primitives. + * Care should be taken when moving these routines to new architectures. + */ + + +/* + * XDR null terminated ASCII strings + * xdr_string deals with "C strings" - arrays of bytes that are + * terminated by a NULL character. The parameter cpp references a + * pointer to storage; If the pointer is null, then the necessary + * storage is allocated. The last parameter is the max allowed length + * of the string as specified by a protocol. + */ +bool_t +xdr_string (xdrs, cpp, maxsize) + XDR *xdrs; + char **cpp; + u_int maxsize; +{ + char *sp = *cpp; /* sp is the actual string pointer */ + u_int size; + u_int nodesize; + + /* + * first deal with the length since xdr strings are counted-strings + */ + switch (xdrs->x_op) + { + case XDR_FREE: + if (sp == NULL) + { + return TRUE; /* already free */ + } + /* fall through... */ + case XDR_ENCODE: + if (sp == NULL) + return FALSE; + size = strlen (sp); + break; + case XDR_DECODE: + break; + } + if (!INTUSE(xdr_u_int) (xdrs, &size)) + { + return FALSE; + } + if (size > maxsize) + { + return FALSE; + } + nodesize = size + 1; + if (nodesize == 0) + { + /* This means an overflow. It a bug in the caller which + provided a too large maxsize but nevertheless catch it + here. */ + return FALSE; + } + + /* + * now deal with the actual bytes + */ + switch (xdrs->x_op) + { + case XDR_DECODE: + if (sp == NULL) + *cpp = sp = (char *) mem_alloc (nodesize); + if (sp == NULL) + { + fprintf (NULL, "%s", "xdr_string: out of memory\n"); + return FALSE; + } + sp[size] = 0; + /* fall into ... */ + + case XDR_ENCODE: + return INTUSE(xdr_opaque) (xdrs, sp, size); + + case XDR_FREE: + mem_free (sp, nodesize); + *cpp = NULL; + return TRUE; + } + return FALSE; +} +INTDEF(xdr_string) + +/* + * Wrapper for xdr_string that can be called directly from + * routines like clnt_call + */ +bool_t +xdr_wrapstring (xdrs, cpp) + XDR *xdrs; + char **cpp; +{ + if (INTUSE(xdr_string) (xdrs, cpp, LASTUNSIGNED)) + { + return TRUE; + } + return FALSE; +} diff --git a/source/unres/src_MD-NEWSC/xdrf/xdr.h b/source/unres/src_MD-NEWSC/xdrf/xdr.h new file mode 100644 index 0000000..2602ad9 --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/xdr.h @@ -0,0 +1,379 @@ +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part. Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +/* + * xdr.h, External Data Representation Serialization Routines. + * + * Copyright (C) 1984, Sun Microsystems, Inc. + */ + +#ifndef _RPC_XDR_H +#define _RPC_XDR_H 1 + +#include +#include +#include "types.h" + +/* We need FILE. */ +#include + +__BEGIN_DECLS + +/* + * XDR provides a conventional way for converting between C data + * types and an external bit-string representation. Library supplied + * routines provide for the conversion on built-in C data types. These + * routines and utility routines defined here are used to help implement + * a type encode/decode routine for each user-defined type. + * + * Each data type provides a single procedure which takes two arguments: + * + * bool_t + * xdrproc(xdrs, argresp) + * XDR *xdrs; + * *argresp; + * + * xdrs is an instance of a XDR handle, to which or from which the data + * type is to be converted. argresp is a pointer to the structure to be + * converted. The XDR handle contains an operation field which indicates + * which of the operations (ENCODE, DECODE * or FREE) is to be performed. + * + * XDR_DECODE may allocate space if the pointer argresp is null. This + * data can be freed with the XDR_FREE operation. + * + * We write only one procedure per data type to make it easy + * to keep the encode and decode procedures for a data type consistent. + * In many cases the same code performs all operations on a user defined type, + * because all the hard work is done in the component type routines. + * decode as a series of calls on the nested data types. + */ + +/* + * Xdr operations. XDR_ENCODE causes the type to be encoded into the + * stream. XDR_DECODE causes the type to be extracted from the stream. + * XDR_FREE can be used to release the space allocated by an XDR_DECODE + * request. + */ +enum xdr_op { + XDR_ENCODE = 0, + XDR_DECODE = 1, + XDR_FREE = 2 +}; + +/* + * This is the number of bytes per unit of external data. + */ +#define BYTES_PER_XDR_UNIT (4) +/* + * This only works if the above is a power of 2. But it's defined to be + * 4 by the appropriate RFCs. So it will work. And it's normally quicker + * than the old routine. + */ +#if 1 +#define RNDUP(x) (((x) + BYTES_PER_XDR_UNIT - 1) & ~(BYTES_PER_XDR_UNIT - 1)) +#else /* this is the old routine */ +#define RNDUP(x) ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \ + * BYTES_PER_XDR_UNIT) +#endif + +/* + * The XDR handle. + * Contains operation which is being applied to the stream, + * an operations vector for the particular implementation (e.g. see xdr_mem.c), + * and two private fields for the use of the particular implementation. + */ +typedef struct XDR XDR; +struct XDR + { + enum xdr_op x_op; /* operation; fast additional param */ + struct xdr_ops + { + bool_t (*x_getlong) (XDR *__xdrs, long *__lp); + /* get a long from underlying stream */ + bool_t (*x_putlong) (XDR *__xdrs, __const long *__lp); + /* put a long to " */ + bool_t (*x_getbytes) (XDR *__xdrs, caddr_t __addr, u_int __len); + /* get some bytes from " */ + bool_t (*x_putbytes) (XDR *__xdrs, __const char *__addr, u_int __len); + /* put some bytes to " */ + u_int (*x_getpostn) (__const XDR *__xdrs); + /* returns bytes off from beginning */ + bool_t (*x_setpostn) (XDR *__xdrs, u_int __pos); + /* lets you reposition the stream */ + int32_t *(*x_inline) (XDR *__xdrs, u_int __len); + /* buf quick ptr to buffered data */ + void (*x_destroy) (XDR *__xdrs); + /* free privates of this xdr_stream */ + bool_t (*x_getint32) (XDR *__xdrs, int32_t *__ip); + /* get a int from underlying stream */ + bool_t (*x_putint32) (XDR *__xdrs, __const int32_t *__ip); + /* put a int to " */ + } + *x_ops; + caddr_t x_public; /* users' data */ + caddr_t x_private; /* pointer to private data */ + caddr_t x_base; /* private used for position info */ + u_int x_handy; /* extra private word */ + }; + +/* + * A xdrproc_t exists for each data type which is to be encoded or decoded. + * + * The second argument to the xdrproc_t is a pointer to an opaque pointer. + * The opaque pointer generally points to a structure of the data type + * to be decoded. If this pointer is 0, then the type routines should + * allocate dynamic storage of the appropriate size and return it. + * bool_t (*xdrproc_t)(XDR *, caddr_t *); + */ +typedef bool_t (*xdrproc_t) (XDR *, void *,...); + + +/* + * Operations defined on a XDR handle + * + * XDR *xdrs; + * int32_t *int32p; + * long *longp; + * caddr_t addr; + * u_int len; + * u_int pos; + */ +#define XDR_GETINT32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) +#define xdr_getint32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_getint32)(xdrs, int32p) + +#define XDR_PUTINT32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_putint32)(xdrs, int32p) +#define xdr_putint32(xdrs, int32p) \ + (*(xdrs)->x_ops->x_putint32)(xdrs, int32p) + +#define XDR_GETLONG(xdrs, longp) \ + (*(xdrs)->x_ops->x_getlong)(xdrs, longp) +#define xdr_getlong(xdrs, longp) \ + (*(xdrs)->x_ops->x_getlong)(xdrs, longp) + +#define XDR_PUTLONG(xdrs, longp) \ + (*(xdrs)->x_ops->x_putlong)(xdrs, longp) +#define xdr_putlong(xdrs, longp) \ + (*(xdrs)->x_ops->x_putlong)(xdrs, longp) + +#define XDR_GETBYTES(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len) +#define xdr_getbytes(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len) + +#define XDR_PUTBYTES(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len) +#define xdr_putbytes(xdrs, addr, len) \ + (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len) + +#define XDR_GETPOS(xdrs) \ + (*(xdrs)->x_ops->x_getpostn)(xdrs) +#define xdr_getpos(xdrs) \ + (*(xdrs)->x_ops->x_getpostn)(xdrs) + +#define XDR_SETPOS(xdrs, pos) \ + (*(xdrs)->x_ops->x_setpostn)(xdrs, pos) +#define xdr_setpos(xdrs, pos) \ + (*(xdrs)->x_ops->x_setpostn)(xdrs, pos) + +#define XDR_INLINE(xdrs, len) \ + (*(xdrs)->x_ops->x_inline)(xdrs, len) +#define xdr_inline(xdrs, len) \ + (*(xdrs)->x_ops->x_inline)(xdrs, len) + +#define XDR_DESTROY(xdrs) \ + do { \ + if ((xdrs)->x_ops->x_destroy) \ + (*(xdrs)->x_ops->x_destroy)(xdrs); \ + } while (0) +#define xdr_destroy(xdrs) \ + do { \ + if ((xdrs)->x_ops->x_destroy) \ + (*(xdrs)->x_ops->x_destroy)(xdrs); \ + } while (0) + +/* + * Support struct for discriminated unions. + * You create an array of xdrdiscrim structures, terminated with + * a entry with a null procedure pointer. The xdr_union routine gets + * the discriminant value and then searches the array of structures + * for a matching value. If a match is found the associated xdr routine + * is called to handle that part of the union. If there is + * no match, then a default routine may be called. + * If there is no match and no default routine it is an error. + */ +#define NULL_xdrproc_t ((xdrproc_t)0) +struct xdr_discrim +{ + int value; + xdrproc_t proc; +}; + +/* + * Inline routines for fast encode/decode of primitive data types. + * Caveat emptor: these use single memory cycles to get the + * data from the underlying buffer, and will fail to operate + * properly if the data is not aligned. The standard way to use these + * is to say: + * if ((buf = XDR_INLINE(xdrs, count)) == NULL) + * return (FALSE); + * <<< macro calls >>> + * where ``count'' is the number of bytes of data occupied + * by the primitive data types. + * + * N.B. and frozen for all time: each data type here uses 4 bytes + * of external representation. + */ + +#define IXDR_GET_INT32(buf) ((int32_t)ntohl((uint32_t)*(buf)++)) +#define IXDR_PUT_INT32(buf, v) (*(buf)++ = (int32_t)htonl((uint32_t)(v))) +#define IXDR_GET_U_INT32(buf) ((uint32_t)IXDR_GET_INT32(buf)) +#define IXDR_PUT_U_INT32(buf, v) IXDR_PUT_INT32(buf, (int32_t)(v)) + +/* WARNING: The IXDR_*_LONG defines are removed by Sun for new platforms + * and shouldn't be used any longer. Code which use this defines or longs + * in the RPC code will not work on 64bit Solaris platforms ! + */ +#define IXDR_GET_LONG(buf) ((long)IXDR_GET_U_INT32(buf)) +#define IXDR_PUT_LONG(buf, v) ((long)IXDR_PUT_INT32(buf, (long)(v))) +#define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf)) +#define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG(buf, (long)(v)) + + +#define IXDR_GET_BOOL(buf) ((bool_t)IXDR_GET_LONG(buf)) +#define IXDR_GET_ENUM(buf, t) ((t)IXDR_GET_LONG(buf)) +#define IXDR_GET_SHORT(buf) ((short)IXDR_GET_LONG(buf)) +#define IXDR_GET_U_SHORT(buf) ((u_short)IXDR_GET_LONG(buf)) + +#define IXDR_PUT_BOOL(buf, v) IXDR_PUT_LONG(buf, (long)(v)) +#define IXDR_PUT_ENUM(buf, v) IXDR_PUT_LONG(buf, (long)(v)) +#define IXDR_PUT_SHORT(buf, v) IXDR_PUT_LONG(buf, (long)(v)) +#define IXDR_PUT_U_SHORT(buf, v) IXDR_PUT_LONG(buf, (long)(v)) + +/* + * These are the "generic" xdr routines. + * None of these can have const applied because it's not possible to + * know whether the call is a read or a write to the passed parameter + * also, the XDR structure is always updated by some of these calls. + */ +extern bool_t xdr_void (void) __THROW; +extern bool_t xdr_short (XDR *__xdrs, short *__sp) __THROW; +extern bool_t xdr_u_short (XDR *__xdrs, u_short *__usp) __THROW; +extern bool_t xdr_int (XDR *__xdrs, int *__ip) __THROW; +extern bool_t xdr_u_int (XDR *__xdrs, u_int *__up) __THROW; +extern bool_t xdr_long (XDR *__xdrs, long *__lp) __THROW; +extern bool_t xdr_u_long (XDR *__xdrs, u_long *__ulp) __THROW; +extern bool_t xdr_hyper (XDR *__xdrs, quad_t *__llp) __THROW; +extern bool_t xdr_u_hyper (XDR *__xdrs, u_quad_t *__ullp) __THROW; +extern bool_t xdr_longlong_t (XDR *__xdrs, quad_t *__llp) __THROW; +extern bool_t xdr_u_longlong_t (XDR *__xdrs, u_quad_t *__ullp) __THROW; +extern bool_t xdr_int8_t (XDR *__xdrs, int8_t *__ip) __THROW; +extern bool_t xdr_uint8_t (XDR *__xdrs, uint8_t *__up) __THROW; +extern bool_t xdr_int16_t (XDR *__xdrs, int16_t *__ip) __THROW; +extern bool_t xdr_uint16_t (XDR *__xdrs, uint16_t *__up) __THROW; +extern bool_t xdr_int32_t (XDR *__xdrs, int32_t *__ip) __THROW; +extern bool_t xdr_uint32_t (XDR *__xdrs, uint32_t *__up) __THROW; +extern bool_t xdr_int64_t (XDR *__xdrs, int64_t *__ip) __THROW; +extern bool_t xdr_uint64_t (XDR *__xdrs, uint64_t *__up) __THROW; +extern bool_t xdr_quad_t (XDR *__xdrs, quad_t *__ip) __THROW; +extern bool_t xdr_u_quad_t (XDR *__xdrs, u_quad_t *__up) __THROW; +extern bool_t xdr_bool (XDR *__xdrs, bool_t *__bp) __THROW; +extern bool_t xdr_enum (XDR *__xdrs, enum_t *__ep) __THROW; +extern bool_t xdr_array (XDR * _xdrs, caddr_t *__addrp, u_int *__sizep, + u_int __maxsize, u_int __elsize, xdrproc_t __elproc) + __THROW; +extern bool_t xdr_bytes (XDR *__xdrs, char **__cpp, u_int *__sizep, + u_int __maxsize) __THROW; +extern bool_t xdr_opaque (XDR *__xdrs, caddr_t __cp, u_int __cnt) __THROW; +extern bool_t xdr_string (XDR *__xdrs, char **__cpp, u_int __maxsize) __THROW; +extern bool_t xdr_union (XDR *__xdrs, enum_t *__dscmp, char *__unp, + __const struct xdr_discrim *__choices, + xdrproc_t dfault) __THROW; +extern bool_t xdr_char (XDR *__xdrs, char *__cp) __THROW; +extern bool_t xdr_u_char (XDR *__xdrs, u_char *__cp) __THROW; +extern bool_t xdr_vector (XDR *__xdrs, char *__basep, u_int __nelem, + u_int __elemsize, xdrproc_t __xdr_elem) __THROW; +extern bool_t xdr_float (XDR *__xdrs, float *__fp) __THROW; +extern bool_t xdr_double (XDR *__xdrs, double *__dp) __THROW; +extern bool_t xdr_reference (XDR *__xdrs, caddr_t *__xpp, u_int __size, + xdrproc_t __proc) __THROW; +extern bool_t xdr_pointer (XDR *__xdrs, char **__objpp, + u_int __obj_size, xdrproc_t __xdr_obj) __THROW; +extern bool_t xdr_wrapstring (XDR *__xdrs, char **__cpp) __THROW; +extern u_long xdr_sizeof (xdrproc_t, void *) __THROW; + +/* + * Common opaque bytes objects used by many rpc protocols; + * declared here due to commonality. + */ +#define MAX_NETOBJ_SZ 1024 +struct netobj +{ + u_int n_len; + char *n_bytes; +}; +typedef struct netobj netobj; +extern bool_t xdr_netobj (XDR *__xdrs, struct netobj *__np) __THROW; + +/* + * These are the public routines for the various implementations of + * xdr streams. + */ + +/* XDR using memory buffers */ +extern void xdrmem_create (XDR *__xdrs, __const caddr_t __addr, + u_int __size, enum xdr_op __xop) __THROW; + +/* XDR using stdio library */ +extern void xdrstdio_create (XDR *__xdrs, FILE *__file, enum xdr_op __xop) + __THROW; + +/* XDR pseudo records for tcp */ +extern void xdrrec_create (XDR *__xdrs, u_int __sendsize, + u_int __recvsize, caddr_t __tcp_handle, + int (*__readit) (char *, char *, int), + int (*__writeit) (char *, char *, int)) __THROW; + +/* make end of xdr record */ +extern bool_t xdrrec_endofrecord (XDR *__xdrs, bool_t __sendnow) __THROW; + +/* move to beginning of next record */ +extern bool_t xdrrec_skiprecord (XDR *__xdrs) __THROW; + +/* true if no more input */ +extern bool_t xdrrec_eof (XDR *__xdrs) __THROW; + +/* free memory buffers for xdr */ +extern void xdr_free (xdrproc_t __proc, char *__objp) __THROW; + +__END_DECLS + +#endif /* rpc/xdr.h */ diff --git a/source/unres/src_MD-NEWSC/xdrf/xdr_array.c b/source/unres/src_MD-NEWSC/xdrf/xdr_array.c new file mode 100644 index 0000000..836405c --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/xdr_array.c @@ -0,0 +1,174 @@ +# define INTUSE(name) name +# define INTDEF(name) +/* @(#)xdr_array.c 2.1 88/07/29 4.0 RPCSRC */ +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part. Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ +#if !defined(lint) && defined(SCCSIDS) +static char sccsid[] = "@(#)xdr_array.c 1.10 87/08/11 Copyr 1984 Sun Micro"; +#endif + +/* + * xdr_array.c, Generic XDR routines implementation. + * + * Copyright (C) 1984, Sun Microsystems, Inc. + * + * These are the "non-trivial" xdr primitives used to serialize and de-serialize + * arrays. See xdr.h for more info on the interface to xdr. + */ + +#include +#include +#include "types.h" +#include "xdr.h" +#include +#include + +#ifdef USE_IN_LIBIO +# include +#endif + +#define LASTUNSIGNED ((u_int)0-1) + + +/* + * XDR an array of arbitrary elements + * *addrp is a pointer to the array, *sizep is the number of elements. + * If addrp is NULL (*sizep * elsize) bytes are allocated. + * elsize is the size (in bytes) of each element, and elproc is the + * xdr procedure to call to handle each element of the array. + */ +bool_t +xdr_array (xdrs, addrp, sizep, maxsize, elsize, elproc) + XDR *xdrs; + caddr_t *addrp; /* array pointer */ + u_int *sizep; /* number of elements */ + u_int maxsize; /* max numberof elements */ + u_int elsize; /* size in bytes of each element */ + xdrproc_t elproc; /* xdr routine to handle each element */ +{ + u_int i; + caddr_t target = *addrp; + u_int c; /* the actual element count */ + bool_t stat = TRUE; + u_int nodesize; + + /* like strings, arrays are really counted arrays */ + if (!INTUSE(xdr_u_int) (xdrs, sizep)) + { + return FALSE; + } + c = *sizep; + /* + * XXX: Let the overflow possibly happen with XDR_FREE because mem_free() + * doesn't actually use its second argument anyway. + */ + if ((c > maxsize || c > UINT_MAX / elsize) && (xdrs->x_op != XDR_FREE)) + { + return FALSE; + } + nodesize = c * elsize; + + /* + * if we are deserializing, we may need to allocate an array. + * We also save time by checking for a null array if we are freeing. + */ + if (target == NULL) + switch (xdrs->x_op) + { + case XDR_DECODE: + if (c == 0) + return TRUE; + *addrp = target = mem_alloc (nodesize); + if (target == NULL) + { + fprintf (stderr, "%s", "xdr_array: out of memory\n"); + return FALSE; + } + __bzero (target, nodesize); + break; + + case XDR_FREE: + return TRUE; + default: + break; + } + + /* + * now we xdr each element of array + */ + for (i = 0; (i < c) && stat; i++) + { + stat = (*elproc) (xdrs, target, LASTUNSIGNED); + target += elsize; + } + + /* + * the array may need freeing + */ + if (xdrs->x_op == XDR_FREE) + { + mem_free (*addrp, nodesize); + *addrp = NULL; + } + return stat; +} +INTDEF(xdr_array) + +/* + * xdr_vector(): + * + * XDR a fixed length array. Unlike variable-length arrays, + * the storage of fixed length arrays is static and unfreeable. + * > basep: base of the array + * > size: size of the array + * > elemsize: size of each element + * > xdr_elem: routine to XDR each element + */ +bool_t +xdr_vector (xdrs, basep, nelem, elemsize, xdr_elem) + XDR *xdrs; + char *basep; + u_int nelem; + u_int elemsize; + xdrproc_t xdr_elem; +{ + u_int i; + char *elptr; + + elptr = basep; + for (i = 0; i < nelem; i++) + { + if (!(*xdr_elem) (xdrs, elptr, LASTUNSIGNED)) + { + return FALSE; + } + elptr += elemsize; + } + return TRUE; +} diff --git a/source/unres/src_MD-NEWSC/xdrf/xdr_float.c b/source/unres/src_MD-NEWSC/xdrf/xdr_float.c new file mode 100644 index 0000000..15d3c88 --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/xdr_float.c @@ -0,0 +1,307 @@ +/* @(#)xdr_float.c 2.1 88/07/29 4.0 RPCSRC */ +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part. Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ +#if !defined(lint) && defined(SCCSIDS) +static char sccsid[] = "@(#)xdr_float.c 1.12 87/08/11 Copyr 1984 Sun Micro"; +#endif + +/* + * xdr_float.c, Generic XDR routines implementation. + * + * Copyright (C) 1984, Sun Microsystems, Inc. + * + * These are the "floating point" xdr routines used to (de)serialize + * most common data items. See xdr.h for more info on the interface to + * xdr. + */ + +#include +#include + +#include "types.h" +#include "xdr.h" + +/* + * NB: Not portable. + * This routine works on Suns (Sky / 68000's) and Vaxen. + */ + +#define LSW (__FLOAT_WORD_ORDER == __BIG_ENDIAN) + +#ifdef vax + +/* What IEEE single precision floating point looks like on a Vax */ +struct ieee_single { + unsigned int mantissa: 23; + unsigned int exp : 8; + unsigned int sign : 1; +}; + +/* Vax single precision floating point */ +struct vax_single { + unsigned int mantissa1 : 7; + unsigned int exp : 8; + unsigned int sign : 1; + unsigned int mantissa2 : 16; +}; + +#define VAX_SNG_BIAS 0x81 +#define IEEE_SNG_BIAS 0x7f + +static struct sgl_limits { + struct vax_single s; + struct ieee_single ieee; +} sgl_limits[2] = { + {{ 0x7f, 0xff, 0x0, 0xffff }, /* Max Vax */ + { 0x0, 0xff, 0x0 }}, /* Max IEEE */ + {{ 0x0, 0x0, 0x0, 0x0 }, /* Min Vax */ + { 0x0, 0x0, 0x0 }} /* Min IEEE */ +}; +#endif /* vax */ + +bool_t +xdr_float(xdrs, fp) + XDR *xdrs; + float *fp; +{ +#ifdef vax + struct ieee_single is; + struct vax_single vs, *vsp; + struct sgl_limits *lim; + int i; +#endif + switch (xdrs->x_op) { + + case XDR_ENCODE: +#ifdef vax + vs = *((struct vax_single *)fp); + for (i = 0, lim = sgl_limits; + i < sizeof(sgl_limits)/sizeof(struct sgl_limits); + i++, lim++) { + if ((vs.mantissa2 == lim->s.mantissa2) && + (vs.exp == lim->s.exp) && + (vs.mantissa1 == lim->s.mantissa1)) { + is = lim->ieee; + goto shipit; + } + } + is.exp = vs.exp - VAX_SNG_BIAS + IEEE_SNG_BIAS; + is.mantissa = (vs.mantissa1 << 16) | vs.mantissa2; + shipit: + is.sign = vs.sign; + return (XDR_PUTLONG(xdrs, (long *)&is)); +#else + if (sizeof(float) == sizeof(long)) + return (XDR_PUTLONG(xdrs, (long *)fp)); + else if (sizeof(float) == sizeof(int)) { + long tmp = *(int *)fp; + return (XDR_PUTLONG(xdrs, &tmp)); + } + break; +#endif + + case XDR_DECODE: +#ifdef vax + vsp = (struct vax_single *)fp; + if (!XDR_GETLONG(xdrs, (long *)&is)) + return (FALSE); + for (i = 0, lim = sgl_limits; + i < sizeof(sgl_limits)/sizeof(struct sgl_limits); + i++, lim++) { + if ((is.exp == lim->ieee.exp) && + (is.mantissa == lim->ieee.mantissa)) { + *vsp = lim->s; + goto doneit; + } + } + vsp->exp = is.exp - IEEE_SNG_BIAS + VAX_SNG_BIAS; + vsp->mantissa2 = is.mantissa; + vsp->mantissa1 = (is.mantissa >> 16); + doneit: + vsp->sign = is.sign; + return (TRUE); +#else + if (sizeof(float) == sizeof(long)) + return (XDR_GETLONG(xdrs, (long *)fp)); + else if (sizeof(float) == sizeof(int)) { + long tmp; + if (XDR_GETLONG(xdrs, &tmp)) { + *(int *)fp = tmp; + return (TRUE); + } + } + break; +#endif + + case XDR_FREE: + return (TRUE); + } + return (FALSE); +} + +/* + * This routine works on Suns (Sky / 68000's) and Vaxen. + */ + +#ifdef vax +/* What IEEE double precision floating point looks like on a Vax */ +struct ieee_double { + unsigned int mantissa1 : 20; + unsigned int exp : 11; + unsigned int sign : 1; + unsigned int mantissa2 : 32; +}; + +/* Vax double precision floating point */ +struct vax_double { + unsigned int mantissa1 : 7; + unsigned int exp : 8; + unsigned int sign : 1; + unsigned int mantissa2 : 16; + unsigned int mantissa3 : 16; + unsigned int mantissa4 : 16; +}; + +#define VAX_DBL_BIAS 0x81 +#define IEEE_DBL_BIAS 0x3ff +#define MASK(nbits) ((1 << nbits) - 1) + +static struct dbl_limits { + struct vax_double d; + struct ieee_double ieee; +} dbl_limits[2] = { + {{ 0x7f, 0xff, 0x0, 0xffff, 0xffff, 0xffff }, /* Max Vax */ + { 0x0, 0x7ff, 0x0, 0x0 }}, /* Max IEEE */ + {{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, /* Min Vax */ + { 0x0, 0x0, 0x0, 0x0 }} /* Min IEEE */ +}; + +#endif /* vax */ + + +bool_t +xdr_double(xdrs, dp) + XDR *xdrs; + double *dp; +{ +#ifdef vax + struct ieee_double id; + struct vax_double vd; + register struct dbl_limits *lim; + int i; +#endif + + switch (xdrs->x_op) { + + case XDR_ENCODE: +#ifdef vax + vd = *((struct vax_double *)dp); + for (i = 0, lim = dbl_limits; + i < sizeof(dbl_limits)/sizeof(struct dbl_limits); + i++, lim++) { + if ((vd.mantissa4 == lim->d.mantissa4) && + (vd.mantissa3 == lim->d.mantissa3) && + (vd.mantissa2 == lim->d.mantissa2) && + (vd.mantissa1 == lim->d.mantissa1) && + (vd.exp == lim->d.exp)) { + id = lim->ieee; + goto shipit; + } + } + id.exp = vd.exp - VAX_DBL_BIAS + IEEE_DBL_BIAS; + id.mantissa1 = (vd.mantissa1 << 13) | (vd.mantissa2 >> 3); + id.mantissa2 = ((vd.mantissa2 & MASK(3)) << 29) | + (vd.mantissa3 << 13) | + ((vd.mantissa4 >> 3) & MASK(13)); + shipit: + id.sign = vd.sign; + dp = (double *)&id; +#endif + if (2*sizeof(long) == sizeof(double)) { + long *lp = (long *)dp; + return (XDR_PUTLONG(xdrs, lp+!LSW) && + XDR_PUTLONG(xdrs, lp+LSW)); + } else if (2*sizeof(int) == sizeof(double)) { + int *ip = (int *)dp; + long tmp[2]; + tmp[0] = ip[!LSW]; + tmp[1] = ip[LSW]; + return (XDR_PUTLONG(xdrs, tmp) && + XDR_PUTLONG(xdrs, tmp+1)); + } + break; + + case XDR_DECODE: +#ifdef vax + lp = (long *)&id; + if (!XDR_GETLONG(xdrs, lp++) || !XDR_GETLONG(xdrs, lp)) + return (FALSE); + for (i = 0, lim = dbl_limits; + i < sizeof(dbl_limits)/sizeof(struct dbl_limits); + i++, lim++) { + if ((id.mantissa2 == lim->ieee.mantissa2) && + (id.mantissa1 == lim->ieee.mantissa1) && + (id.exp == lim->ieee.exp)) { + vd = lim->d; + goto doneit; + } + } + vd.exp = id.exp - IEEE_DBL_BIAS + VAX_DBL_BIAS; + vd.mantissa1 = (id.mantissa1 >> 13); + vd.mantissa2 = ((id.mantissa1 & MASK(13)) << 3) | + (id.mantissa2 >> 29); + vd.mantissa3 = (id.mantissa2 >> 13); + vd.mantissa4 = (id.mantissa2 << 3); + doneit: + vd.sign = id.sign; + *dp = *((double *)&vd); + return (TRUE); +#else + if (2*sizeof(long) == sizeof(double)) { + long *lp = (long *)dp; + return (XDR_GETLONG(xdrs, lp+!LSW) && + XDR_GETLONG(xdrs, lp+LSW)); + } else if (2*sizeof(int) == sizeof(double)) { + int *ip = (int *)dp; + long tmp[2]; + if (XDR_GETLONG(xdrs, tmp+!LSW) && + XDR_GETLONG(xdrs, tmp+LSW)) { + ip[0] = tmp[0]; + ip[1] = tmp[1]; + return (TRUE); + } + } + break; +#endif + + case XDR_FREE: + return (TRUE); + } + return (FALSE); +} diff --git a/source/unres/src_MD-NEWSC/xdrf/xdr_stdio.c b/source/unres/src_MD-NEWSC/xdrf/xdr_stdio.c new file mode 100644 index 0000000..12b1709 --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/xdr_stdio.c @@ -0,0 +1,196 @@ +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part. Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California 94043 + */ + +/* + * xdr_stdio.c, XDR implementation on standard i/o file. + * + * Copyright (C) 1984, Sun Microsystems, Inc. + * + * This set of routines implements a XDR on a stdio stream. + * XDR_ENCODE serializes onto the stream, XDR_DECODE de-serializes + * from the stream. + */ + +#include "types.h" +#include +#include "xdr.h" + +#ifdef USE_IN_LIBIO +# include +# define fflush(s) INTUSE(_IO_fflush) (s) +# define fread(p, m, n, s) INTUSE(_IO_fread) (p, m, n, s) +# define ftell(s) INTUSE(_IO_ftell) (s) +# define fwrite(p, m, n, s) INTUSE(_IO_fwrite) (p, m, n, s) +#endif + +static bool_t xdrstdio_getlong (XDR *, long *); +static bool_t xdrstdio_putlong (XDR *, const long *); +static bool_t xdrstdio_getbytes (XDR *, caddr_t, u_int); +static bool_t xdrstdio_putbytes (XDR *, const char *, u_int); +static u_int xdrstdio_getpos (const XDR *); +static bool_t xdrstdio_setpos (XDR *, u_int); +static int32_t *xdrstdio_inline (XDR *, u_int); +static void xdrstdio_destroy (XDR *); +static bool_t xdrstdio_getint32 (XDR *, int32_t *); +static bool_t xdrstdio_putint32 (XDR *, const int32_t *); + +/* + * Ops vector for stdio type XDR + */ +static const struct xdr_ops xdrstdio_ops = +{ + xdrstdio_getlong, /* deserialize a long int */ + xdrstdio_putlong, /* serialize a long int */ + xdrstdio_getbytes, /* deserialize counted bytes */ + xdrstdio_putbytes, /* serialize counted bytes */ + xdrstdio_getpos, /* get offset in the stream */ + xdrstdio_setpos, /* set offset in the stream */ + xdrstdio_inline, /* prime stream for inline macros */ + xdrstdio_destroy, /* destroy stream */ + xdrstdio_getint32, /* deserialize a int */ + xdrstdio_putint32 /* serialize a int */ +}; + +/* + * Initialize a stdio xdr stream. + * Sets the xdr stream handle xdrs for use on the stream file. + * Operation flag is set to op. + */ +void +xdrstdio_create (XDR *xdrs, FILE *file, enum xdr_op op) +{ + xdrs->x_op = op; + /* We have to add the const since the `struct xdr_ops' in `struct XDR' + is not `const'. */ + xdrs->x_ops = (struct xdr_ops *) &xdrstdio_ops; + xdrs->x_private = (caddr_t) file; + xdrs->x_handy = 0; + xdrs->x_base = 0; +} + +/* + * Destroy a stdio xdr stream. + * Cleans up the xdr stream handle xdrs previously set up by xdrstdio_create. + */ +static void +xdrstdio_destroy (XDR *xdrs) +{ + (void) fflush ((FILE *) xdrs->x_private); + /* xx should we close the file ?? */ +}; + +static bool_t +xdrstdio_getlong (XDR *xdrs, long *lp) +{ + u_int32_t mycopy; + + if (fread ((caddr_t) &mycopy, 4, 1, (FILE *) xdrs->x_private) != 1) + return FALSE; + *lp = (long) ntohl (mycopy); + return TRUE; +} + +static bool_t +xdrstdio_putlong (XDR *xdrs, const long *lp) +{ + int32_t mycopy = htonl ((u_int32_t) *lp); + + if (fwrite ((caddr_t) &mycopy, 4, 1, (FILE *) xdrs->x_private) != 1) + return FALSE; + return TRUE; +} + +static bool_t +xdrstdio_getbytes (XDR *xdrs, const caddr_t addr, u_int len) +{ + if ((len != 0) && (fread (addr, (int) len, 1, + (FILE *) xdrs->x_private) != 1)) + return FALSE; + return TRUE; +} + +static bool_t +xdrstdio_putbytes (XDR *xdrs, const char *addr, u_int len) +{ + if ((len != 0) && (fwrite (addr, (int) len, 1, + (FILE *) xdrs->x_private) != 1)) + return FALSE; + return TRUE; +} + +static u_int +xdrstdio_getpos (const XDR *xdrs) +{ + return (u_int) ftell ((FILE *) xdrs->x_private); +} + +static bool_t +xdrstdio_setpos (XDR *xdrs, u_int pos) +{ + return fseek ((FILE *) xdrs->x_private, (long) pos, 0) < 0 ? FALSE : TRUE; +} + +static int32_t * +xdrstdio_inline (XDR *xdrs, u_int len) +{ + /* + * Must do some work to implement this: must insure + * enough data in the underlying stdio buffer, + * that the buffer is aligned so that we can indirect through a + * long *, and stuff this pointer in xdrs->x_buf. Doing + * a fread or fwrite to a scratch buffer would defeat + * most of the gains to be had here and require storage + * management on this buffer, so we don't do this. + */ + return NULL; +} + +static bool_t +xdrstdio_getint32 (XDR *xdrs, int32_t *ip) +{ + int32_t mycopy; + + if (fread ((caddr_t) &mycopy, 4, 1, (FILE *) xdrs->x_private) != 1) + return FALSE; + *ip = ntohl (mycopy); + return TRUE; +} + +static bool_t +xdrstdio_putint32 (XDR *xdrs, const int32_t *ip) +{ + int32_t mycopy = htonl (*ip); + + ip = &mycopy; + if (fwrite ((caddr_t) ip, 4, 1, (FILE *) xdrs->x_private) != 1) + return FALSE; + return TRUE; +} + +/* libc_hidden_def (xdrstdio_create) */ diff --git a/source/unres/src_MD-NEWSC/xdrf/xdrf.h b/source/unres/src_MD-NEWSC/xdrf/xdrf.h new file mode 100644 index 0000000..dedf5a2 --- /dev/null +++ b/source/unres/src_MD-NEWSC/xdrf/xdrf.h @@ -0,0 +1,10 @@ +/*_________________________________________________________________ + | + | xdrf.h - include file for C routines that want to use the + | functions below. +*/ + +int xdropen(XDR *xdrs, const char *filename, const char *type); +int xdrclose(XDR *xdrs) ; +int xdr3dfcoord(XDR *xdrs, float *fp, int *size, float *precision) ; + diff --git a/source/unres/src_MD/Makefile~HEAD b/source/unres/src_MD/Makefile~HEAD new file mode 120000 index 0000000..8453cdd --- /dev/null +++ b/source/unres/src_MD/Makefile~HEAD @@ -0,0 +1 @@ +Makefile_MPICH_ifort \ No newline at end of file diff --git a/source/unres/src_MD/readrtns.F.orig b/source/unres/src_MD/readrtns.F.orig new file mode 100644 index 0000000..f3ccdd9 --- /dev/null +++ b/source/unres/src_MD/readrtns.F.orig @@ -0,0 +1,2668 @@ + subroutine readrtns + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.SBRIDGE' + include 'COMMON.IOUNITS' + logical file_exist +C Read force-field parameters except weights + call parmread +C Read job setup parameters + call read_control +C Read control parameters for energy minimzation if required + if (minim) call read_minim +C Read MCM control parameters if required + if (modecalc.eq.3 .or. modecalc.eq.6) call mcmread +C Read MD control parameters if reqjuired + if (modecalc.eq.12) call read_MDpar +C Read MREMD control parameters if required + if (modecalc.eq.14) then + call read_MDpar + call read_REMDpar + endif +C Read MUCA control parameters if required + if (lmuca) call read_muca +C Read CSA control parameters if required (from fort.40 if exists +C otherwise from general input file) +csa if (modecalc.eq.8) then +csa inquire (file="fort.40",exist=file_exist) +csa if (.not.file_exist) call csaread +csa endif +cfmc if (modecalc.eq.10) call mcmfread +C Read molecule information, molecule geometry, energy-term weights, and +C restraints if requested + call molread +C Print restraint information +#ifdef MPI + if (.not. out1file .or. me.eq.king) then +#endif + if (nhpb.gt.nss) + &write (iout,'(a,i5,a)') "The following",nhpb-nss, + & " distance constraints have been imposed" + do i=nss+1,nhpb + write (iout,'(3i6,i2,3f10.5)') i-nss,ihpb(i),jhpb(i), + & ibecarb(i),dhpb(i),dhpb1(i),forcon(i) + enddo +#ifdef MPI + endif +#endif +c print *,"Processor",myrank," leaves READRTNS" + return + end +C------------------------------------------------------------------------------- + subroutine read_control +C +C Read contorl data +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MP + include 'mpif.h' + logical OKRandom, prng_restart + real*8 r1 +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.THREAD' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.MCM' + include 'COMMON.MAP' + include 'COMMON.HEADER' +csa include 'COMMON.CSA' + include 'COMMON.CHAIN' + include 'COMMON.MUCA' + include 'COMMON.MD' + include 'COMMON.FFIELD' + include 'COMMON.SETUP' + COMMON /MACHSW/ KDIAG,ICORFL,IXDR + character*8 diagmeth(0:3) /'Library','EVVRSP','Givens','Jacobi'/ + character*80 ucase + character*320 controlcard + + nglob_csa=0 + eglob_csa=1d99 + nmin_csa=0 + read (INP,'(a)') titel + call card_concat(controlcard) +c out1file=index(controlcard,'OUT1FILE').gt.0 .or. fg_rank.gt.0 +c print *,"Processor",me," fg_rank",fg_rank," out1file",out1file + call reada(controlcard,'SEED',seed,0.0D0) + call random_init(seed) +C Set up the time limit (caution! The time must be input in minutes!) + read_cart=index(controlcard,'READ_CART').gt.0 + call readi(controlcard,'CONSTR_DIST',constr_dist,0) + call reada(controlcard,'TIMLIM',timlim,960.0D0) ! default 16 hours + unres_pdb = index(controlcard,'UNRES_PDB') .gt. 0 + call reada(controlcard,'SAFETY',safety,30.0D0) ! default 30 minutes + call reada(controlcard,'RMSDBC',rmsdbc,3.0D0) + call reada(controlcard,'RMSDBC1',rmsdbc1,0.5D0) + call reada(controlcard,'RMSDBC1MAX',rmsdbc1max,1.5D0) + call reada(controlcard,'RMSDBCM',rmsdbcm,3.0D0) + call reada(controlcard,'DRMS',drms,0.1D0) + if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) then + write (iout,'(a,f10.1)')'RMSDBC = ',rmsdbc + write (iout,'(a,f10.1)')'RMSDBC1 = ',rmsdbc1 + write (iout,'(a,f10.1)')'RMSDBC1MAX = ',rmsdbc1max + write (iout,'(a,f10.1)')'DRMS = ',drms + write (iout,'(a,f10.1)')'RMSDBCM = ',rmsdbcm + write (iout,'(a,f10.1)') 'Time limit (min):',timlim + endif + call readi(controlcard,'NZ_START',nz_start,0) + call readi(controlcard,'NZ_END',nz_end,0) + call readi(controlcard,'IZ_SC',iz_sc,0) + timlim=60.0D0*timlim + safety = 60.0d0*safety + timem=timlim + modecalc=0 + call reada(controlcard,"T_BATH",t_bath,300.0d0) + minim=(index(controlcard,'MINIMIZE').gt.0) + dccart=(index(controlcard,'CART').gt.0) + overlapsc=(index(controlcard,'OVERLAP').gt.0) + overlapsc=.not.overlapsc + searchsc=(index(controlcard,'NOSEARCHSC').gt.0) + searchsc=.not.searchsc + sideadd=(index(controlcard,'SIDEADD').gt.0) + energy_dec=(index(controlcard,'ENERGY_DEC').gt.0) + outpdb=(index(controlcard,'PDBOUT').gt.0) + outmol2=(index(controlcard,'MOL2OUT').gt.0) + pdbref=(index(controlcard,'PDBREF').gt.0) + refstr=pdbref .or. (index(controlcard,'REFSTR').gt.0) + indpdb=index(controlcard,'PDBSTART') + extconf=(index(controlcard,'EXTCONF').gt.0) + call readi(controlcard,'IPRINT',iprint,0) + call readi(controlcard,'MAXGEN',maxgen,10000) + call readi(controlcard,'MAXOVERLAP',maxoverlap,1000) + call readi(controlcard,"KDIAG",kdiag,0) + call readi(controlcard,"RESCALE_MODE",rescale_mode,2) + if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) + & write (iout,*) "RESCALE_MODE",rescale_mode + split_ene=index(controlcard,'SPLIT_ENE').gt.0 + if (index(controlcard,'REGULAR').gt.0.0D0) then + call reada(controlcard,'WEIDIS',weidis,0.1D0) + modecalc=1 + refstr=.true. + endif + if (index(controlcard,'CHECKGRAD').gt.0) then + modecalc=5 + if (index(controlcard,'CART').gt.0) then + icheckgrad=1 + elseif (index(controlcard,'CARINT').gt.0) then + icheckgrad=2 + else + icheckgrad=3 + endif + elseif (index(controlcard,'THREAD').gt.0) then + modecalc=2 + call readi(controlcard,'THREAD',nthread,0) + if (nthread.gt.0) then + call reada(controlcard,'WEIDIS',weidis,0.1D0) + else + if (fg_rank.eq.0) + & write (iout,'(a)')'A number has to follow the THREAD keyword.' + stop 'Error termination in Read_Control.' + endif + else if (index(controlcard,'MCMA').gt.0) then + modecalc=3 + else if (index(controlcard,'MCEE').gt.0) then + modecalc=6 + else if (index(controlcard,'MULTCONF').gt.0) then + modecalc=4 + else if (index(controlcard,'MAP').gt.0) then + modecalc=7 + call readi(controlcard,'MAP',nmap,0) + else if (index(controlcard,'CSA').gt.0) then + write(*,*) "CSA not supported in this version" + stop +csa modecalc=8 +crc else if (index(controlcard,'ZSCORE').gt.0) then +crc +crc ZSCORE is rm from UNRES, modecalc=9 is available +crc +crc modecalc=9 +cfcm else if (index(controlcard,'MCMF').gt.0) then +cfmc modecalc=10 + else if (index(controlcard,'SOFTREG').gt.0) then + modecalc=11 + else if (index(controlcard,'CHECK_BOND').gt.0) then + modecalc=-1 + else if (index(controlcard,'TEST').gt.0) then + modecalc=-2 + else if (index(controlcard,'MD').gt.0) then + modecalc=12 + else if (index(controlcard,'RE ').gt.0) then + modecalc=14 + endif + + lmuca=index(controlcard,'MUCA').gt.0 + call readi(controlcard,'MUCADYN',mucadyn,0) + call readi(controlcard,'MUCASMOOTH',muca_smooth,0) + if (lmuca .and. (me.eq.king .or. .not.out1file )) + & then + write (iout,*) 'MUCADYN=',mucadyn + write (iout,*) 'MUCASMOOTH=',muca_smooth + endif + + iscode=index(controlcard,'ONE_LETTER') + indphi=index(controlcard,'PHI') + indback=index(controlcard,'BACK') + iranconf=index(controlcard,'RAND_CONF') + i2ndstr=index(controlcard,'USE_SEC_PRED') + gradout=index(controlcard,'GRADOUT').gt.0 + gnorm_check=index(controlcard,'GNORM_CHECK').gt.0 + + if(me.eq.king.or..not.out1file) + & write (iout,'(2a)') diagmeth(kdiag), + & ' routine used to diagonalize matrices.' + return + end +c-------------------------------------------------------------------------- + subroutine read_REMDpar +C +C Read REMD settings +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.REMD' + include 'COMMON.CONTROL' + include 'COMMON.SETUP' + character*80 ucase + character*320 controlcard + character*3200 controlcard1 + integer iremd_m_total + + if(me.eq.king.or..not.out1file) + & write (iout,*) "REMD setup" + + call card_concat(controlcard) + call readi(controlcard,"NREP",nrep,3) + call readi(controlcard,"NSTEX",nstex,1000) + call reada(controlcard,"RETMIN",retmin,10.0d0) + call reada(controlcard,"RETMAX",retmax,1000.0d0) + mremdsync=(index(controlcard,'SYNC').gt.0) + call readi(controlcard,"NSYN",i_sync_step,100) + restart1file=(index(controlcard,'REST1FILE').gt.0) + traj1file=(index(controlcard,'TRAJ1FILE').gt.0) + call readi(controlcard,"TRAJCACHE",max_cache_traj_use,1) + if(max_cache_traj_use.gt.max_cache_traj) + & max_cache_traj_use=max_cache_traj + if(me.eq.king.or..not.out1file) then +cd if (traj1file) then +crc caching is in testing - NTWX is not ignored +cd write (iout,*) "NTWX value is ignored" +cd write (iout,*) " trajectory is stored to one file by master" +cd write (iout,*) " before exchange at NSTEX intervals" +cd endif + write (iout,*) "NREP= ",nrep + write (iout,*) "NSTEX= ",nstex + write (iout,*) "SYNC= ",mremdsync + write (iout,*) "NSYN= ",i_sync_step + write (iout,*) "TRAJCACHE= ",max_cache_traj_use + endif + + t_exchange_only=(index(controlcard,'TONLY').gt.0) + call readi(controlcard,"HREMD",hremd,0) + if((me.eq.king.or..not.out1file).and.hremd.gt.0) then + write (iout,*) "Hamiltonian REMD with ",hremd," sets of weights" + endif + if(usampl.and.hremd.gt.0) then + write (iout,'(//a)') + & "========== ERROR: USAMPL and HREMD cannot be used together" +#ifdef MPI + call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) +#endif + stop + endif + + + remd_tlist=.false. + if (index(controlcard,'TLIST').gt.0) then + remd_tlist=.true. + call card_concat(controlcard1) + read(controlcard1,*) (remd_t(i),i=1,nrep) + if(me.eq.king.or..not.out1file) + & write (iout,*)'tlist',(remd_t(i),i=1,nrep) + endif + remd_mlist=.false. + if (index(controlcard,'MLIST').gt.0) then + remd_mlist=.true. + call card_concat(controlcard1) + read(controlcard1,*) (remd_m(i),i=1,nrep) + if(me.eq.king.or..not.out1file) then + write (iout,*)'mlist',(remd_m(i),i=1,nrep) + iremd_m_total=0 + do i=1,nrep + iremd_m_total=iremd_m_total+remd_m(i) + enddo + if(hremd.gt.1)then + write (iout,*) 'Total number of replicas ', + & iremd_m_total*hremd + else + write (iout,*) 'Total number of replicas ',iremd_m_total + endif + endif + endif + if(me.eq.king.or..not.out1file) + & write (iout,'(/30(1h=),a,29(1h=)/)') " End of REMD run setup " + return + end +c-------------------------------------------------------------------------- + subroutine read_MDpar +C +C Read MD settings +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.MD' +#ifndef LANG0 + include 'COMMON.LANGEVIN' +#else + include 'COMMON.LANGEVIN.lang0' +#endif + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.GEO' + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.SPLITELE' + character*80 ucase + character*320 controlcard + + call card_concat(controlcard) + call readi(controlcard,"NSTEP",n_timestep,1000000) + call readi(controlcard,"NTWE",ntwe,100) + call readi(controlcard,"NTWX",ntwx,1000) + call reada(controlcard,"DT",d_time,1.0d-1) + call reada(controlcard,"DVMAX",dvmax,2.0d1) + call reada(controlcard,"DAMAX",damax,1.0d1) + call reada(controlcard,"EDRIFTMAX",edriftmax,1.0d+1) + call readi(controlcard,"LANG",lang,0) + RESPA = index(controlcard,"RESPA") .gt. 0 + call readi(controlcard,"NTIME_SPLIT",ntime_split,1) + ntime_split0=ntime_split + call readi(controlcard,"MAXTIME_SPLIT",maxtime_split,64) + ntime_split0=ntime_split + call reada(controlcard,"R_CUT",r_cut,2.0d0) + call reada(controlcard,"LAMBDA",rlamb,0.3d0) + rest = index(controlcard,"REST").gt.0 + tbf = index(controlcard,"TBF").gt.0 + call readi(controlcard,"HMC",hmc,0) + tnp = index(controlcard,"NOSEPOINCARE99").gt.0 + tnp1 = index(controlcard,"NOSEPOINCARE01").gt.0 + tnh = index(controlcard,"NOSEHOOVER96").gt.0 + if (RESPA.and.tnh)then + xiresp = index(controlcard,"XIRESP").gt.0 + endif + call reada(controlcard,"Q_NP",Q_np,0.1d0) + usampl = index(controlcard,"USAMPL").gt.0 + + mdpdb = index(controlcard,"MDPDB").gt.0 + call reada(controlcard,"T_BATH",t_bath,300.0d0) + call reada(controlcard,"TAU_BATH",tau_bath,1.0d-1) + call reada(controlcard,"EQ_TIME",eq_time,1.0d+4) + call readi(controlcard,"RESET_MOMENT",count_reset_moment,1000) + if (count_reset_moment.eq.0) count_reset_moment=1000000000 + call readi(controlcard,"RESET_VEL",count_reset_vel,1000) + reset_moment=lang.eq.0 .and. tbf .and. count_reset_moment.gt.0 + reset_vel=lang.eq.0 .and. tbf .and. count_reset_vel.gt.0 + if (count_reset_vel.eq.0) count_reset_vel=1000000000 + large = index(controlcard,"LARGE").gt.0 + print_compon = index(controlcard,"PRINT_COMPON").gt.0 + rattle = index(controlcard,"RATTLE").gt.0 +c if performing umbrella sampling, fragments constrained are read from the fragment file + nset=0 + if(usampl) then + call read_fragments + endif + + if(me.eq.king.or..not.out1file) then + write (iout,*) + write (iout,'(27(1h=),a26,27(1h=))') " Parameters of the MD run " + write (iout,*) + write (iout,'(a)') "The units are:" + write (iout,'(a)') "positions: angstrom, time: 48.9 fs" + write (iout,'(2a)') "velocity: angstrom/(48.9 fs),", + & " acceleration: angstrom/(48.9 fs)**2" + write (iout,'(a)') "energy: kcal/mol, temperature: K" + write (iout,*) + write (iout,'(a60,i10)') "Number of time steps:",n_timestep + write (iout,'(a60,f10.5,a)') + & "Initial time step of numerical integration:",d_time, + & " natural units" + write (iout,'(60x,f10.5,a)') d_time*48.9," fs" + if (RESPA) then + write (iout,'(2a,i4,a)') + & "A-MTS algorithm used; initial time step for fast-varying", + & " short-range forces split into",ntime_split," steps." + write (iout,'(a,f5.2,a,f5.2)') "Short-range force cutoff", + & r_cut," lambda",rlamb + endif + write (iout,'(2a,f10.5)') + & "Maximum acceleration threshold to reduce the time step", + & "/increase split number:",damax + write (iout,'(2a,f10.5)') + & "Maximum predicted energy drift to reduce the timestep", + & "/increase split number:",edriftmax + write (iout,'(a60,f10.5)') + & "Maximum velocity threshold to reduce velocities:",dvmax + write (iout,'(a60,i10)') "Frequency of property output:",ntwe + write (iout,'(a60,i10)') "Frequency of coordinate output:",ntwx + if (rattle) write (iout,'(a60)') + & "Rattle algorithm used to constrain the virtual bonds" + endif + reset_fricmat=1000 + if (lang.gt.0) then + call reada(controlcard,"ETAWAT",etawat,0.8904d0) + call reada(controlcard,"RWAT",rwat,1.4d0) + call reada(controlcard,"SCAL_FRIC",scal_fric,2.0d-2) + surfarea=index(controlcard,"SURFAREA").gt.0 + call readi(controlcard,"RESET_FRICMAT",reset_fricmat,1000) + if(me.eq.king.or..not.out1file)then + write (iout,'(/a,$)') "Langevin dynamics calculation" + if (lang.eq.1) then + write (iout,'(a/)') + & " with direct integration of Langevin equations" + else if (lang.eq.2) then + write (iout,'(a/)') " with TINKER stochasic MD integrator" + else if (lang.eq.3) then + write (iout,'(a/)') " with Ciccotti's stochasic MD integrator" + else if (lang.eq.4) then + write (iout,'(a/)') " in overdamped mode" + else + write (iout,'(//a,i5)') + & "=========== ERROR: Unknown Langevin dynamics mode:",lang + stop + endif + write (iout,'(a60,f10.5)') "Temperature:",t_bath + write (iout,'(a60,f10.5)') "Viscosity of the solvent:",etawat + write (iout,'(a60,f10.5)') "Radius of solvent molecule:",rwat + write (iout,'(a60,f10.5)') + & "Scaling factor of the friction forces:",scal_fric + if (surfarea) write (iout,'(2a,i10,a)') + & "Friction coefficients will be scaled by solvent-accessible", + & " surface area every",reset_fricmat," steps." + endif +c Calculate friction coefficients and bounds of stochastic forces + eta=6*pi*cPoise*etawat + if(me.eq.king.or..not.out1file) + & write(iout,'(a60,f10.5)')"Eta of the solvent in natural units:" + & ,eta + gamp=scal_fric*(pstok+rwat)*eta + stdfp=dsqrt(2*Rb*t_bath/d_time) + do i=1,ntyp + gamsc(i)=scal_fric*(restok(i)+rwat)*eta + stdfsc(i)=dsqrt(2*Rb*t_bath/d_time) + enddo + if(me.eq.king.or..not.out1file)then + write (iout,'(/2a/)') + & "Radii of site types and friction coefficients and std's of", + & " stochastic forces of fully exposed sites" + write (iout,'(a5,f5.2,2f10.5)')'p',pstok,gamp,stdfp*dsqrt(gamp) + do i=1,ntyp + write (iout,'(a5,f5.2,2f10.5)') restyp(i),restok(i), + & gamsc(i),stdfsc(i)*dsqrt(gamsc(i)) + enddo + endif + else if (tbf) then + if(me.eq.king.or..not.out1file)then + write (iout,'(a)') "Berendsen bath calculation" + write (iout,'(a60,f10.5)') "Temperature:",t_bath + write (iout,'(a60,f10.5)') "Coupling constant (tau):",tau_bath + if (reset_moment) + & write (iout,'(a,i10,a)') "Momenta will be reset at zero every", + & count_reset_moment," steps" + if (reset_vel) + & write (iout,'(a,i10,a)') + & "Velocities will be reset at random every",count_reset_vel, + & " steps" + endif + else if (tnp .or. tnp1 .or. tnh) then + if (tnp .or. tnp1) then + write (iout,'(a)') "Nose-Poincare bath calculation" + if (tnp) write (iout,'(a)') + & "J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird" + if (tnp1) write (iout,'(a)') "JPSJ 70 75 (2001) S. Nose" + else + write (iout,'(a)') "Nose-Hoover bath calculation" + write (iout,'(a)') "Mol.Phys. 87 1117 (1996) Martyna et al." + nresn=1 + nyosh=1 + nnos=1 + do i=1,nnos + qmass(i)=Q_np + xlogs(i)=1.0 + vlogs(i)=0.0 + enddo + do i=1,nyosh + WDTI(i) = 1.0*d_time/nresn + WDTI2(i)=WDTI(i)/2 + WDTI4(i)=WDTI(i)/4 + WDTI8(i)=WDTI(i)/8 + enddo + if (RESPA) then + if(xiresp) then + write (iout,'(a)') "NVT-XI-RESPA algorithm" + else + write (iout,'(a)') "NVT-XO-RESPA algorithm" + endif + do i=1,nyosh + WDTIi(i) = 1.0*d_time/nresn/ntime_split + WDTIi2(i)=WDTIi(i)/2 + WDTIi4(i)=WDTIi(i)/4 + WDTIi8(i)=WDTIi(i)/8 + enddo + endif + endif + + write (iout,'(a60,f10.5)') "Temperature:",t_bath + write (iout,'(a60,f10.5)') "Q =",Q_np + if (reset_moment) + & write (iout,'(a,i10,a)') "Momenta will be reset at zero every", + & count_reset_moment," steps" + if (reset_vel) + & write (iout,'(a,i10,a)') + & "Velocities will be reset at random every",count_reset_vel, + & " steps" + + else if (hmc.gt.0) then + write (iout,'(a)') "Hybrid Monte Carlo calculation" + write (iout,'(a60,f10.5)') "Temperature:",t_bath + write (iout,'(a60,i10)') + & "Number of MD steps between Metropolis tests:",hmc + + else + if(me.eq.king.or..not.out1file) + & write (iout,'(a31)') "Microcanonical mode calculation" + endif + if(me.eq.king.or..not.out1file)then + if (rest) write (iout,'(/a/)') "===== Calculation restarted ====" + if (usampl) then + write(iout,*) "MD running with constraints." + write(iout,*) "Equilibration time ", eq_time, " mtus." + write(iout,*) "Constraining ", nfrag," fragments." + write(iout,*) "Length of each fragment, weight and q0:" + do iset=1,nset + write (iout,*) "Set of restraints #",iset + do i=1,nfrag + write(iout,'(2i5,f8.1,f7.4)') ifrag(1,i,iset), + & ifrag(2,i,iset),wfrag(i,iset),qinfrag(i,iset) + enddo + write(iout,*) "constraints between ", npair, "fragments." + write(iout,*) "constraint pairs, weights and q0:" + do i=1,npair + write(iout,'(2i5,f8.1,f7.4)') ipair(1,i,iset), + & ipair(2,i,iset),wpair(i,iset),qinpair(i,iset) + enddo + write(iout,*) "angle constraints within ", nfrag_back, + & "backbone fragments." + write(iout,*) "fragment, weights:" + do i=1,nfrag_back + write(iout,'(2i5,3f8.1)') ifrag_back(1,i,iset), + & ifrag_back(2,i,iset),wfrag_back(1,i,iset), + & wfrag_back(2,i,iset),wfrag_back(3,i,iset) + enddo + enddo + iset=mod(kolor,nset)+1 + endif + endif + if(me.eq.king.or..not.out1file) + & write (iout,'(/30(1h=),a,29(1h=)/)') " End of MD run setup " + return + end +c------------------------------------------------------------------------------ + subroutine molread +C +C Read molecular data. +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + integer error_msg +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.CONTACTS' + include 'COMMON.TORCNSTR' + include 'COMMON.TIME1' + include 'COMMON.BOUNDS' + include 'COMMON.MD' + include 'COMMON.REMD' + include 'COMMON.SETUP' + character*4 sequence(maxres) + integer rescode + double precision x(maxvar) + character*256 pdbfile + character*320 weightcard + character*80 weightcard_t,ucase + dimension itype_pdb(maxres) + common /pizda/ itype_pdb + logical seq_comp,fail + double precision energia(0:n_ene) + integer ilen + external ilen +C +C Body +C +C Read weights of the subsequent energy terms. + if(hremd.gt.0) then + + k=0 + do il=1,hremd + do i=1,nrep + do j=1,remd_m(i) + i2set(k)=il + k=k+1 + enddo + enddo + enddo + + if(me.eq.king.or..not.out1file) then + write (iout,*) 'Reading ',hremd,' sets of weights for HREMD' + write (iout,*) 'Current weights for processor ', + & me,' set ',i2set(me) + endif + + do i=1,hremd + call card_concat(weightcard) + call reada(weightcard,'WLONG',wlong,1.0D0) + call reada(weightcard,'WSC',wsc,wlong) + call reada(weightcard,'WSCP',wscp,wlong) + call reada(weightcard,'WELEC',welec,1.0D0) + call reada(weightcard,'WVDWPP',wvdwpp,welec) + call reada(weightcard,'WEL_LOC',wel_loc,1.0D0) + call reada(weightcard,'WCORR4',wcorr4,0.0D0) + call reada(weightcard,'WCORR5',wcorr5,0.0D0) + call reada(weightcard,'WCORR6',wcorr6,0.0D0) + call reada(weightcard,'WTURN3',wturn3,1.0D0) + call reada(weightcard,'WTURN4',wturn4,1.0D0) + call reada(weightcard,'WTURN6',wturn6,1.0D0) + call reada(weightcard,'WSCCOR',wsccor,1.0D0) + call reada(weightcard,'WSTRAIN',wstrain,1.0D0) + call reada(weightcard,'WBOND',wbond,1.0D0) + call reada(weightcard,'WTOR',wtor,1.0D0) + call reada(weightcard,'WTORD',wtor_d,1.0D0) + call reada(weightcard,'WANG',wang,1.0D0) + call reada(weightcard,'WSCLOC',wscloc,1.0D0) + call reada(weightcard,'SCAL14',scal14,0.4D0) + call reada(weightcard,'SCALSCP',scalscp,1.0d0) + call reada(weightcard,'CUTOFF',cutoff_corr,7.0d0) + call reada(weightcard,'DELT_CORR',delt_corr,0.5d0) + call reada(weightcard,'TEMP0',temp0,300.0d0) + if (index(weightcard,'SOFT').gt.0) ipot=6 +C 12/1/95 Added weight for the multi-body term WCORR + call reada(weightcard,'WCORRH',wcorr,1.0D0) + if (wcorr4.gt.0.0d0) wcorr=wcorr4 + + hweights(i,1)=wsc + hweights(i,2)=wscp + hweights(i,3)=welec + hweights(i,4)=wcorr + hweights(i,5)=wcorr5 + hweights(i,6)=wcorr6 + hweights(i,7)=wel_loc + hweights(i,8)=wturn3 + hweights(i,9)=wturn4 + hweights(i,10)=wturn6 + hweights(i,11)=wang + hweights(i,12)=wscloc + hweights(i,13)=wtor + hweights(i,14)=wtor_d + hweights(i,15)=wstrain + hweights(i,16)=wvdwpp + hweights(i,17)=wbond + hweights(i,18)=scal14 + hweights(i,21)=wsccor + + enddo + + do i=1,n_ene + weights(i)=hweights(i2set(me),i) + enddo + wsc =weights(1) + wscp =weights(2) + welec =weights(3) + wcorr =weights(4) + wcorr5 =weights(5) + wcorr6 =weights(6) + wel_loc=weights(7) + wturn3 =weights(8) + wturn4 =weights(9) + wturn6 =weights(10) + wang =weights(11) + wscloc =weights(12) + wtor =weights(13) + wtor_d =weights(14) + wstrain=weights(15) + wvdwpp =weights(16) + wbond =weights(17) + scal14 =weights(18) + wsccor =weights(21) + + + else + call card_concat(weightcard) + call reada(weightcard,'WLONG',wlong,1.0D0) + call reada(weightcard,'WSC',wsc,wlong) + call reada(weightcard,'WSCP',wscp,wlong) + call reada(weightcard,'WELEC',welec,1.0D0) + call reada(weightcard,'WVDWPP',wvdwpp,welec) + call reada(weightcard,'WEL_LOC',wel_loc,1.0D0) + call reada(weightcard,'WCORR4',wcorr4,0.0D0) + call reada(weightcard,'WCORR5',wcorr5,0.0D0) + call reada(weightcard,'WCORR6',wcorr6,0.0D0) + call reada(weightcard,'WTURN3',wturn3,1.0D0) + call reada(weightcard,'WTURN4',wturn4,1.0D0) + call reada(weightcard,'WTURN6',wturn6,1.0D0) + call reada(weightcard,'WSCCOR',wsccor,1.0D0) + call reada(weightcard,'WSTRAIN',wstrain,1.0D0) + call reada(weightcard,'WBOND',wbond,1.0D0) + call reada(weightcard,'WTOR',wtor,1.0D0) + call reada(weightcard,'WTORD',wtor_d,1.0D0) + call reada(weightcard,'WANG',wang,1.0D0) + call reada(weightcard,'WSCLOC',wscloc,1.0D0) + call reada(weightcard,'SCAL14',scal14,0.4D0) + call reada(weightcard,'SCALSCP',scalscp,1.0d0) + call reada(weightcard,'CUTOFF',cutoff_corr,7.0d0) + call reada(weightcard,'DELT_CORR',delt_corr,0.5d0) + call reada(weightcard,'TEMP0',temp0,300.0d0) + if (index(weightcard,'SOFT').gt.0) ipot=6 +C 12/1/95 Added weight for the multi-body term WCORR + call reada(weightcard,'WCORRH',wcorr,1.0D0) + if (wcorr4.gt.0.0d0) wcorr=wcorr4 + weights(1)=wsc + weights(2)=wscp + weights(3)=welec + weights(4)=wcorr + weights(5)=wcorr5 + weights(6)=wcorr6 + weights(7)=wel_loc + weights(8)=wturn3 + weights(9)=wturn4 + weights(10)=wturn6 + weights(11)=wang + weights(12)=wscloc + weights(13)=wtor + weights(14)=wtor_d + weights(15)=wstrain + weights(16)=wvdwpp + weights(17)=wbond + weights(18)=scal14 + weights(21)=wsccor + endif + + if(me.eq.king.or..not.out1file) + & write (iout,10) wsc,wscp,welec,wvdwpp,wbond,wang,wscloc,wtor, + & wtor_d,wstrain,wel_loc,wcorr,wcorr5,wcorr6,wsccor,wturn3, + & wturn4,wturn6 + 10 format (/'Energy-term weights (unscaled):'// + & 'WSCC= ',f10.6,' (SC-SC)'/ + & 'WSCP= ',f10.6,' (SC-p)'/ + & 'WELEC= ',f10.6,' (p-p electr)'/ + & 'WVDWPP= ',f10.6,' (p-p VDW)'/ + & 'WBOND= ',f10.6,' (stretching)'/ + & 'WANG= ',f10.6,' (bending)'/ + & 'WSCLOC= ',f10.6,' (SC local)'/ + & 'WTOR= ',f10.6,' (torsional)'/ + & 'WTORD= ',f10.6,' (double torsional)'/ + & 'WSTRAIN=',f10.6,' (SS bridges & dist. cnstr.)'/ + & 'WEL_LOC=',f10.6,' (multi-body 3-rd order)'/ + & 'WCORR4= ',f10.6,' (multi-body 4th order)'/ + & 'WCORR5= ',f10.6,' (multi-body 5th order)'/ + & 'WCORR6= ',f10.6,' (multi-body 6th order)'/ + & 'WSCCOR= ',f10.6,' (back-scloc correlation)'/ + & 'WTURN3= ',f10.6,' (turns, 3rd order)'/ + & 'WTURN4= ',f10.6,' (turns, 4th order)'/ + & 'WTURN6= ',f10.6,' (turns, 6th order)') + if(me.eq.king.or..not.out1file)then + if (wcorr4.gt.0.0d0) then + write (iout,'(/2a/)') 'Local-electrostatic type correlation ', + & 'between contact pairs of peptide groups' + write (iout,'(2(a,f5.3/))') + & 'Cutoff on 4-6th order correlation terms: ',cutoff_corr, + & 'Range of quenching the correlation terms:',2*delt_corr + else if (wcorr.gt.0.0d0) then + write (iout,'(/2a/)') 'Hydrogen-bonding correlation ', + & 'between contact pairs of peptide groups' + endif + write (iout,'(a,f8.3)') + & 'Scaling factor of 1,4 SC-p interactions:',scal14 + write (iout,'(a,f8.3)') + & 'General scaling factor of SC-p interactions:',scalscp + endif + r0_corr=cutoff_corr-delt_corr + do i=1,20 + aad(i,1)=scalscp*aad(i,1) + aad(i,2)=scalscp*aad(i,2) + bad(i,1)=scalscp*bad(i,1) + bad(i,2)=scalscp*bad(i,2) + enddo + call rescale_weights(t_bath) + if(me.eq.king.or..not.out1file) + & write (iout,22) wsc,wscp,welec,wvdwpp,wbond,wang,wscloc,wtor, + & wtor_d,wstrain,wel_loc,wcorr,wcorr5,wcorr6,wsccor,wturn3, + & wturn4,wturn6 + 22 format (/'Energy-term weights (scaled):'// + & 'WSCC= ',f10.6,' (SC-SC)'/ + & 'WSCP= ',f10.6,' (SC-p)'/ + & 'WELEC= ',f10.6,' (p-p electr)'/ + & 'WVDWPP= ',f10.6,' (p-p VDW)'/ + & 'WBOND= ',f10.6,' (stretching)'/ + & 'WANG= ',f10.6,' (bending)'/ + & 'WSCLOC= ',f10.6,' (SC local)'/ + & 'WTOR= ',f10.6,' (torsional)'/ + & 'WTORD= ',f10.6,' (double torsional)'/ + & 'WSTRAIN=',f10.6,' (SS bridges & dist. cnstr.)'/ + & 'WEL_LOC=',f10.6,' (multi-body 3-rd order)'/ + & 'WCORR4= ',f10.6,' (multi-body 4th order)'/ + & 'WCORR5= ',f10.6,' (multi-body 5th order)'/ + & 'WCORR6= ',f10.6,' (multi-body 6th order)'/ + & 'WSCCOR= ',f10.6,' (back-scloc correlatkion)'/ + & 'WTURN3= ',f10.6,' (turns, 3rd order)'/ + & 'WTURN4= ',f10.6,' (turns, 4th order)'/ + & 'WTURN6= ',f10.6,' (turns, 6th order)') + if(me.eq.king.or..not.out1file) + & write (iout,*) "Reference temperature for weights calculation:", + & temp0 + call reada(weightcard,"D0CM",d0cm,3.78d0) + call reada(weightcard,"AKCM",akcm,15.1d0) + call reada(weightcard,"AKTH",akth,11.0d0) + call reada(weightcard,"AKCT",akct,12.0d0) + call reada(weightcard,"V1SS",v1ss,-1.08d0) + call reada(weightcard,"V2SS",v2ss,7.61d0) + call reada(weightcard,"V3SS",v3ss,13.7d0) + call reada(weightcard,"EBR",ebr,-5.50D0) + if(me.eq.king.or..not.out1file) then + write (iout,*) "Parameters of the SS-bond potential:" + write (iout,*) "D0CM",d0cm," AKCM",akcm," AKTH",akth, + & " AKCT",akct + write (iout,*) "V1SS",v1ss," V2SS",v2ss," V3SS",v3ss + write (iout,*) "EBR",ebr + print *,'indpdb=',indpdb,' pdbref=',pdbref + endif + if (indpdb.gt.0 .or. pdbref) then + read(inp,'(a)') pdbfile + if(me.eq.king.or..not.out1file) + & write (iout,'(2a)') 'PDB data will be read from file ', + & pdbfile(:ilen(pdbfile)) + open(ipdbin,file=pdbfile,status='old',err=33) + goto 34 + 33 write (iout,'(a)') 'Error opening PDB file.' + stop + 34 continue +c print *,'Begin reading pdb data' + call readpdb +c print *,'Finished reading pdb data' + if(me.eq.king.or..not.out1file) + & write (iout,'(a,i3,a,i3)')'nsup=',nsup, + & ' nstart_sup=',nstart_sup + do i=1,nres + itype_pdb(i)=itype(i) + enddo + close (ipdbin) + nnt=nstart_sup + nct=nstart_sup+nsup-1 + call contact(.false.,ncont_ref,icont_ref,co) + + if (sideadd) then +C Following 2 lines for diagnostics; comment out if not needed + write (iout,*) "Before sideadd" + call intout + if(me.eq.king.or..not.out1file) + & write(iout,*)'Adding sidechains' + maxsi=1000 + do i=2,nres-1 + iti=itype(i) + if (iti.ne.10) then + nsi=0 + fail=.true. + do while (fail.and.nsi.le.maxsi) + call gen_side(iti,theta(i+1),alph(i),omeg(i),fail) + nsi=nsi+1 + enddo + if(fail) write(iout,*)'Adding sidechain failed for res ', + & i,' after ',nsi,' trials' + endif + enddo +C 10/03/12 Adam: Recalculate coordinates with new side chain positions + call chainbuild + endif +C Following 2 lines for diagnostics; comment out if not needed + write (iout,*) "After sideadd" + call intout + endif + if (indpdb.eq.0) then +C Read sequence if not taken from the pdb file. + read (inp,*) nres +c print *,'nres=',nres + if (iscode.gt.0) then + read (inp,'(80a1)') (sequence(i)(1:1),i=1,nres) + else + read (inp,'(20(1x,a3))') (sequence(i),i=1,nres) + endif +C Convert sequence to numeric code + do i=1,nres + itype(i)=rescode(i,sequence(i),iscode) + enddo +C Assign initial virtual bond lengths + do i=2,nres + vbld(i)=vbl + vbld_inv(i)=vblinv + enddo + do i=2,nres-1 + vbld(i+nres)=dsc(itype(i)) + vbld_inv(i+nres)=dsc_inv(itype(i)) +c write (iout,*) "i",i," itype",itype(i), +c & " dsc",dsc(itype(i))," vbld",vbld(i),vbld(i+nres) + enddo + endif +c print *,nres +c print '(20i4)',(itype(i),i=1,nres) + do i=1,nres +#ifdef PROCOR + if (itype(i).eq.21 .or. itype(i+1).eq.21) then +#else + if (itype(i).eq.21) then +#endif + itel(i)=0 +#ifdef PROCOR + else if (itype(i+1).ne.20) then +#else + else if (itype(i).ne.20) then +#endif + itel(i)=1 + else + itel(i)=2 + endif + enddo + if(me.eq.king.or..not.out1file)then + write (iout,*) "ITEL" + do i=1,nres-1 + write (iout,*) i,itype(i),itel(i) + enddo + print *,'Call Read_Bridge.' + endif + call read_bridge +C 8/13/98 Set limits to generating the dihedral angles + do i=1,nres + phibound(1,i)=-pi + phibound(2,i)=pi + enddo + read (inp,*) ndih_constr + if (ndih_constr.gt.0) then + read (inp,*) ftors + read (inp,*) (idih_constr(i),phi0(i),drange(i),i=1,ndih_constr) + if(me.eq.king.or..not.out1file)then + write (iout,*) + & 'There are',ndih_constr,' constraints on phi angles.' + do i=1,ndih_constr + write (iout,'(i5,2f8.3)') idih_constr(i),phi0(i),drange(i) + enddo + endif + do i=1,ndih_constr + phi0(i)=deg2rad*phi0(i) + drange(i)=deg2rad*drange(i) + enddo + if(me.eq.king.or..not.out1file) + & write (iout,*) 'FTORS',ftors + do i=1,ndih_constr + ii = idih_constr(i) + phibound(1,ii) = phi0(i)-drange(i) + phibound(2,ii) = phi0(i)+drange(i) + enddo + endif + nnt=1 +#ifdef MPI + if (me.eq.king) then +#endif + write (iout,'(a)') 'Boundaries in phi angle sampling:' + do i=1,nres + write (iout,'(a3,i5,2f10.1)') + & restyp(itype(i)),i,phibound(1,i)*rad2deg,phibound(2,i)*rad2deg + enddo +#ifdef MP + endif +#endif + nct=nres +cd print *,'NNT=',NNT,' NCT=',NCT + if (itype(1).eq.21) nnt=2 + if (itype(nres).eq.21) nct=nct-1 + if (pdbref) then + if(me.eq.king.or..not.out1file) + & write (iout,'(a,i3)') 'nsup=',nsup + nstart_seq=nnt + if (nsup.le.(nct-nnt+1)) then + do i=0,nct-nnt+1-nsup + if (seq_comp(itype(nnt+i),itype_pdb(nstart_sup),nsup)) then + nstart_seq=nnt+i + goto 111 + endif + enddo + write (iout,'(a)') + & 'Error - sequences to be superposed do not match.' + stop + else + do i=0,nsup-(nct-nnt+1) + if (seq_comp(itype(nnt),itype_pdb(nstart_sup+i),nct-nnt+1)) + & then + nstart_sup=nstart_sup+i + nsup=nct-nnt+1 + goto 111 + endif + enddo + write (iout,'(a)') + & 'Error - sequences to be superposed do not match.' + endif + 111 continue + if (nsup.eq.0) nsup=nct-nnt + if (nstart_sup.eq.0) nstart_sup=nnt + if (nstart_seq.eq.0) nstart_seq=nnt + if(me.eq.king.or..not.out1file) + & write (iout,*) 'nsup=',nsup,' nstart_sup=',nstart_sup, + & ' nstart_seq=',nstart_seq + endif +c--- Zscore rms ------- + if (nz_start.eq.0) nz_start=nnt + if (nz_end.eq.0 .and. nsup.gt.0) then + nz_end=nnt+nsup-1 + else if (nz_end.eq.0) then + nz_end=nct + endif + if(me.eq.king.or..not.out1file)then + write (iout,*) 'NZ_START=',nz_start,' NZ_END=',nz_end + write (iout,*) 'IZ_SC=',iz_sc + endif +c---------------------- + call init_int_table + if (refstr) then + if (.not.pdbref) then + call read_angles(inp,*38) + goto 39 + 38 write (iout,'(a)') 'Error reading reference structure.' +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,IERROR) + stop 'Error reading reference structure' +#endif + 39 call chainbuild + call setup_var +czscore call geom_to_var(nvar,coord_exp_zs(1,1)) + nstart_sup=nnt + nstart_seq=nnt + nsup=nct-nnt+1 + do i=1,2*nres + do j=1,3 + cref(j,i)=c(j,i) + enddo + enddo + call contact(.true.,ncont_ref,icont_ref,co) + endif + if(me.eq.king.or..not.out1file) + & write (iout,*) 'Contact order:',co + if (pdbref) then + if(me.eq.king.or..not.out1file) + & write (2,*) 'Shifting contacts:',nstart_seq,nstart_sup + do i=1,ncont_ref + do j=1,2 + icont_ref(j,i)=icont_ref(j,i)+nstart_seq-nstart_sup + enddo + if(me.eq.king.or..not.out1file) + & write (2,*) i,' ',restyp(itype(icont_ref(1,i))),' ', + & icont_ref(1,i),' ', + & restyp(itype(icont_ref(2,i))),' ',icont_ref(2,i) + enddo + endif + endif +c write (iout,*) "constr_dist",constr_dist,nstart_sup,nsup + if (constr_dist.gt.0) then + call read_dist_constr + endif + if (nhpb.gt.0) call hpb_partition +c write (iout,*) "After read_dist_constr nhpb",nhpb +c call flush(iout) + if (indpdb.eq.0 .and. modecalc.ne.2 .and. modecalc.ne.4 + & .and. modecalc.ne.8 .and. modecalc.ne.9 .and. + & modecalc.ne.10) then +C If input structure hasn't been supplied from the PDB file read or generate +C initial geometry. + if (iranconf.eq.0 .and. .not. extconf) then + if(me.eq.king.or..not.out1file .and.fg_rank.eq.0) + & write (iout,'(a)') 'Initial geometry will be read in.' + if (read_cart) then + read(inp,'(8f10.5)',end=36,err=36) + & ((c(l,k),l=1,3),k=1,nres), + & ((c(l,k+nres),l=1,3),k=nnt,nct) + call int_from_cart1(.false.) + do i=1,nres-1 + do j=1,3 + dc(j,i)=c(j,i+1)-c(j,i) + dc_norm(j,i)=dc_norm(j,i)*vbld_inv(i+1) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + dc(j,i+nres)=c(j,i+nres)-c(j,i) + dc_norm(j,i+nres)=dc_norm(j,i+nres)*vbld_inv(i+nres) + enddo + endif + enddo + return + else + call read_angles(inp,*36) + endif + goto 37 + 36 write (iout,'(a)') 'Error reading angle file.' +#ifdef MPI + call mpi_finalize( MPI_COMM_WORLD,IERR ) +#endif + stop 'Error reading angle file.' + 37 continue + else if (extconf) then + if(me.eq.king.or..not.out1file .and. fg_rank.eq.0) + & write (iout,'(a)') 'Extended chain initial geometry.' + do i=3,nres + theta(i)=90d0*deg2rad + enddo + do i=4,nres + phi(i)=180d0*deg2rad + enddo + do i=2,nres-1 + alph(i)=110d0*deg2rad + enddo + do i=2,nres-1 + omeg(i)=-120d0*deg2rad + enddo + else + if(me.eq.king.or..not.out1file) + & write (iout,'(a)') 'Random-generated initial geometry.' + + +#ifdef MPI + if (me.eq.king .or. fg_rank.eq.0 .and. ( + & modecalc.eq.12 .or. modecalc.eq.14) ) then +#endif + do itrial=1,100 + itmp=1 + call gen_rand_conf(itmp,*30) + goto 40 + 30 write (iout,*) 'Failed to generate random conformation', + & ', itrial=',itrial + write (*,*) 'Processor:',me, + & ' Failed to generate random conformation', + & ' itrial=',itrial + call intout + +#ifdef AIX + call flush_(iout) +#else + call flush(iout) +#endif + enddo + write (iout,'(a,i3,a)') 'Processor:',me, + & ' error in generating random conformation.' + write (*,'(a,i3,a)') 'Processor:',me, + & ' error in generating random conformation.' + call flush(iout) +#ifdef MPI + call MPI_Abort(mpi_comm_world,error_msg,ierrcode) + 40 continue + endif +#else + 40 continue +#endif + endif + elseif (modecalc.eq.4) then + read (inp,'(a)') intinname + open (intin,file=intinname,status='old',err=333) + if (me.eq.king .or. .not.out1file.and.fg_rank.eq.0) + & write (iout,'(a)') 'intinname',intinname + write (*,'(a)') 'Processor',myrank,' intinname',intinname + goto 334 + 333 write (iout,'(2a)') 'Error opening angle file ',intinname +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,IERR) +#endif + stop 'Error opening angle file.' + 334 continue + + endif +C Generate distance constraints, if the PDB structure is to be regularized. + if (nthread.gt.0) then + call read_threadbase + endif + call setup_var + if (me.eq.king .or. .not. out1file) + & call intout + if (ns.gt.0 .and. (me.eq.king .or. .not.out1file) ) then + write (iout,'(/a,i3,a)') + & 'The chain contains',ns,' disulfide-bridging cysteines.' + write (iout,'(20i4)') (iss(i),i=1,ns) + write (iout,'(/a/)') 'Pre-formed links are:' + do i=1,nss + i1=ihpb(i)-nres + i2=jhpb(i)-nres + it1=itype(i1) + it2=itype(i2) + if (me.eq.king.or..not.out1file) + & write (iout,'(2a,i3,3a,i3,a,3f10.3)') + & restyp(it1),'(',i1,') -- ',restyp(it2),'(',i2,')',dhpb(i), + & ebr,forcon(i) + enddo + write (iout,'(a)') + endif + if (i2ndstr.gt.0) call secstrp2dihc +c call geom_to_var(nvar,x) +c call etotal(energia(0)) +c call enerprint(energia(0)) +c call briefout(0,etot) +c stop +cd write (iout,'(2(a,i3))') 'NNT',NNT,' NCT',NCT +cd write (iout,'(a)') 'Variable list:' +cd write (iout,'(i4,f10.5)') (i,rad2deg*x(i),i=1,nvar) +#ifdef MPI + if (me.eq.king .or. (fg_rank.eq.0 .and. .not.out1file)) + & write (iout,'(//80(1h*)/20x,a,i4,a/80(1h*)//)') + & 'Processor',myrank,': end reading molecular data.' +#endif + return + end +c-------------------------------------------------------------------------- + logical function seq_comp(itypea,itypeb,length) + implicit none + integer length,itypea(length),itypeb(length) + integer i + do i=1,length + if (itypea(i).ne.itypeb(i)) then + seq_comp=.false. + return + endif + enddo + seq_comp=.true. + return + end +c----------------------------------------------------------------------------- + subroutine read_bridge +C Read information about disulfide bridges. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' + include 'COMMON.SETUP' +C Read bridging residues. + read (inp,*) ns,(iss(i),i=1,ns) + print *,'ns=',ns + if(me.eq.king.or..not.out1file) + & write (iout,*) 'ns=',ns,' iss:',(iss(i),i=1,ns) +C Check whether the specified bridging residues are cystines. + do i=1,ns + if (itype(iss(i)).ne.1) then + if (me.eq.king.or..not.out1file) write (iout,'(2a,i3,a)') + & 'Do you REALLY think that the residue ',restyp(iss(i)),i, + & ' can form a disulfide bridge?!!!' + write (*,'(2a,i3,a)') + & 'Do you REALLY think that the residue ',restyp(iss(i)),i, + & ' can form a disulfide bridge?!!!' +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,ierror) + stop +#endif + endif + enddo +C Read preformed bridges. + if (ns.gt.0) then + read (inp,*) nss,(ihpb(i),jhpb(i),i=1,nss) + write (iout,*) 'nss=',nss,' ihpb,jhpb: ',(ihpb(i),jhpb(i),i=1,nss) + if (nss.gt.0) then + nhpb=nss +C Check if the residues involved in bridges are in the specified list of +C bridging residues. + do i=1,nss + do j=1,i-1 + if (ihpb(i).eq.ihpb(j).or.ihpb(i).eq.jhpb(j) + & .or.jhpb(i).eq.ihpb(j).or.jhpb(i).eq.jhpb(j)) then + write (iout,'(a,i3,a)') 'Disulfide pair',i, + & ' contains residues present in other pairs.' + write (*,'(a,i3,a)') 'Disulfide pair',i, + & ' contains residues present in other pairs.' +#ifdef MPI + call MPI_Finalize(MPI_COMM_WORLD,ierror) + stop +#endif + endif + enddo + do j=1,ns + if (ihpb(i).eq.iss(j)) goto 10 + enddo + write (iout,'(a,i3,a)') 'Pair',i,' contains unknown cystine.' + 10 continue + do j=1,ns + if (jhpb(i).eq.iss(j)) goto 20 + enddo + write (iout,'(a,i3,a)') 'Pair',i,' contains unknown cystine.' + 20 continue + dhpb(i)=dbr + forcon(i)=fbr + enddo + do i=1,nss + ihpb(i)=ihpb(i)+nres + jhpb(i)=jhpb(i)+nres + enddo + endif + endif + return + end +c---------------------------------------------------------------------------- + subroutine read_x(kanal,*) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' + include 'COMMON.LOCAL' + include 'COMMON.INTERACT' +c Read coordinates from input +c + read(kanal,'(8f10.5)',end=10,err=10) + & ((c(l,k),l=1,3),k=1,nres), + & ((c(l,k+nres),l=1,3),k=nnt,nct) + do j=1,3 + c(j,nres+1)=c(j,1) + c(j,2*nres)=c(j,nres) + enddo + call int_from_cart1(.false.) + do i=1,nres-1 + do j=1,3 + dc(j,i)=c(j,i+1)-c(j,i) + dc_norm(j,i)=dc(j,i)*vbld_inv(i+1) + enddo + enddo + do i=nnt,nct + if (itype(i).ne.10) then + do j=1,3 + dc(j,i+nres)=c(j,i+nres)-c(j,i) + dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres) + enddo + endif + enddo + + return + 10 return1 + end +c---------------------------------------------------------------------------- + subroutine read_threadbase + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' +C Read pattern database for threading. + read (icbase,*) nseq + do i=1,nseq + read (icbase,'(i5,2x,a8,2i4)') nres_base(1,i),str_nam(i), + & nres_base(2,i),nres_base(3,i) + read (icbase,'(9f8.3)') ((cart_base(k,j,i),k=1,3),j=1, + & nres_base(1,i)) +c write (iout,'(i5,2x,a8,2i4)') nres_base(1,i),str_nam(i), +c & nres_base(2,i),nres_base(3,i) +c write (iout,'(9f8.3)') ((cart_base(k,j,i),k=1,3),j=1, +c & nres_base(1,i)) + enddo + close (icbase) + if (weidis.eq.0.0D0) weidis=0.1D0 + do i=nnt,nct + do j=i+2,nct + nhpb=nhpb+1 + ihpb(nhpb)=i + jhpb(nhpb)=j + forcon(nhpb)=weidis + enddo + enddo + read (inp,*) nexcl,(iexam(1,i),iexam(2,i),i=1,nexcl) + write (iout,'(a,i5)') 'nexcl: ',nexcl + write (iout,'(2i5)') (iexam(1,i),iexam(2,i),i=1,nexcl) + return + end +c------------------------------------------------------------------------------ + subroutine setup_var + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' +C Set up variable list. + ntheta=nres-2 + nphi=nres-3 + nvar=ntheta+nphi + nside=0 + do i=2,nres-1 + if (itype(i).ne.10) then + nside=nside+1 + ialph(i,1)=nvar+nside + ialph(nside,2)=i + endif + enddo + if (indphi.gt.0) then + nvar=nphi + else if (indback.gt.0) then + nvar=nphi+ntheta + else + nvar=nvar+2*nside + endif +cd write (iout,'(3i4)') (i,ialph(i,1),ialph(i,2),i=2,nres-1) + return + end +c---------------------------------------------------------------------------- + subroutine gen_dist_constr +C Generate CA distance constraints. + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.INTERACT' + include 'COMMON.LOCAL' + include 'COMMON.NAMES' + include 'COMMON.CHAIN' + include 'COMMON.FFIELD' + include 'COMMON.SBRIDGE' + include 'COMMON.HEADER' + include 'COMMON.CONTROL' + include 'COMMON.DBASE' + include 'COMMON.THREAD' + include 'COMMON.TIME1' + dimension itype_pdb(maxres) + common /pizda/ itype_pdb + character*2 iden +cd print *,'gen_dist_constr: nnt=',nnt,' nct=',nct +cd write (2,*) 'gen_dist_constr: nnt=',nnt,' nct=',nct, +cd & ' nstart_sup',nstart_sup,' nstart_seq',nstart_seq, +cd & ' nsup',nsup + do i=nstart_sup,nstart_sup+nsup-1 +cd write (2,*) 'i',i,' seq ',restyp(itype(i+nstart_seq-nstart_sup)), +cd & ' seq_pdb', restyp(itype_pdb(i)) + do j=i+2,nstart_sup+nsup-1 + nhpb=nhpb+1 + ihpb(nhpb)=i+nstart_seq-nstart_sup + jhpb(nhpb)=j+nstart_seq-nstart_sup + forcon(nhpb)=weidis + dhpb(nhpb)=dist(i,j) + enddo + enddo +cd write (iout,'(a)') 'Distance constraints:' +cd do i=nss+1,nhpb +cd ii=ihpb(i) +cd jj=jhpb(i) +cd iden='CA' +cd if (ii.gt.nres) then +cd iden='SC' +cd ii=ii-nres +cd jj=jj-nres +cd endif +cd write (iout,'(a,1x,a,i4,3x,a,1x,a,i4,2f10.3)') +cd & restyp(itype(ii)),iden,ii,restyp(itype(jj)),iden,jj, +cd & dhpb(i),forcon(i) +cd enddo + return + end +c---------------------------------------------------------------------------- + subroutine map_read + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MAP' + include 'COMMON.IOUNITS' + character*3 angid(4) /'THE','PHI','ALP','OME'/ + character*80 mapcard,ucase + do imap=1,nmap + read (inp,'(a)') mapcard + mapcard=ucase(mapcard) + if (index(mapcard,'PHI').gt.0) then + kang(imap)=1 + else if (index(mapcard,'THE').gt.0) then + kang(imap)=2 + else if (index(mapcard,'ALP').gt.0) then + kang(imap)=3 + else if (index(mapcard,'OME').gt.0) then + kang(imap)=4 + else + write(iout,'(a)')'Error - illegal variable spec in MAP card.' + stop 'Error - illegal variable spec in MAP card.' + endif + call readi (mapcard,'RES1',res1(imap),0) + call readi (mapcard,'RES2',res2(imap),0) + if (res1(imap).eq.0) then + res1(imap)=res2(imap) + else if (res2(imap).eq.0) then + res2(imap)=res1(imap) + endif + if(res1(imap)*res2(imap).eq.0 .or. res1(imap).gt.res2(imap))then + write (iout,'(a)') + & 'Error - illegal definition of variable group in MAP.' + stop 'Error - illegal definition of variable group in MAP.' + endif + call reada(mapcard,'FROM',ang_from(imap),0.0D0) + call reada(mapcard,'TO',ang_to(imap),0.0D0) + call readi(mapcard,'NSTEP',nstep(imap),0) + if (ang_from(imap).eq.ang_to(imap) .or. nstep(imap).eq.0) then + write (iout,'(a)') + & 'Illegal boundary and/or step size specification in MAP.' + stop 'Illegal boundary and/or step size specification in MAP.' + endif + enddo ! imap + return + end +c---------------------------------------------------------------------------- +csa subroutine csaread +csa implicit real*8 (a-h,o-z) +csa include 'DIMENSIONS' +csa include 'COMMON.IOUNITS' +csa include 'COMMON.GEO' +csa include 'COMMON.CSA' +csa include 'COMMON.BANK' +csa include 'COMMON.CONTROL' +csa character*80 ucase +csa character*620 mcmcard +csa call card_concat(mcmcard) +csa +csa call readi(mcmcard,'NCONF',nconf,50) +csa call readi(mcmcard,'NADD',nadd,0) +csa call readi(mcmcard,'JSTART',jstart,1) +csa call readi(mcmcard,'JEND',jend,1) +csa call readi(mcmcard,'NSTMAX',nstmax,500000) +csa call readi(mcmcard,'N0',n0,1) +csa call readi(mcmcard,'N1',n1,6) +csa call readi(mcmcard,'N2',n2,4) +csa call readi(mcmcard,'N3',n3,0) +csa call readi(mcmcard,'N4',n4,0) +csa call readi(mcmcard,'N5',n5,0) +csa call readi(mcmcard,'N6',n6,10) +csa call readi(mcmcard,'N7',n7,0) +csa call readi(mcmcard,'N8',n8,0) +csa call readi(mcmcard,'N9',n9,0) +csa call readi(mcmcard,'N14',n14,0) +csa call readi(mcmcard,'N15',n15,0) +csa call readi(mcmcard,'N16',n16,0) +csa call readi(mcmcard,'N17',n17,0) +csa call readi(mcmcard,'N18',n18,0) +csa +csa vdisulf=(index(mcmcard,'DYNSS').gt.0) +csa +csa call readi(mcmcard,'NDIFF',ndiff,2) +csa call reada(mcmcard,'DIFFCUT',diffcut,0.0d0) +csa call readi(mcmcard,'IS1',is1,1) +csa call readi(mcmcard,'IS2',is2,8) +csa call readi(mcmcard,'NRAN0',nran0,4) +csa call readi(mcmcard,'NRAN1',nran1,2) +csa call readi(mcmcard,'IRR',irr,1) +csa call readi(mcmcard,'NSEED',nseed,20) +csa call readi(mcmcard,'NTOTAL',ntotal,10000) +csa call reada(mcmcard,'CUT1',cut1,2.0d0) +csa call reada(mcmcard,'CUT2',cut2,5.0d0) +csa call reada(mcmcard,'ESTOP',estop,-3000.0d0) +csa call readi(mcmcard,'ICMAX',icmax,3) +csa call readi(mcmcard,'IRESTART',irestart,0) +csac!bankt call readi(mcmcard,'NBANKTM',ntbankm,0) +csa ntbankm=0 +csac!bankt +csa call reada(mcmcard,'DELE',dele,20.0d0) +csa call reada(mcmcard,'DIFCUT',difcut,720.0d0) +csa call readi(mcmcard,'IREF',iref,0) +csa call reada(mcmcard,'RMSCUT',rmscut,4.0d0) +csa call reada(mcmcard,'PNCCUT',pnccut,0.5d0) +csa call readi(mcmcard,'NCONF_IN',nconf_in,0) +csa call reada(mcmcard,'RDIH_BIAS',rdih_bias,0.5d0) +csa write (iout,*) "NCONF_IN",nconf_in +csa return +csa end +c---------------------------------------------------------------------------- +cfmc subroutine mcmfread +cfmc implicit real*8 (a-h,o-z) +cfmc include 'DIMENSIONS' +cfmc include 'COMMON.MCMF' +cfmc include 'COMMON.IOUNITS' +cfmc include 'COMMON.GEO' +cfmc character*80 ucase +cfmc character*620 mcmcard +cfmc call card_concat(mcmcard) +cfmc +cfmc call readi(mcmcard,'MAXRANT',maxrant,1000) +cfmc write(iout,*)'MAXRANT=',maxrant +cfmc call readi(mcmcard,'MAXFAM',maxfam,maxfam_p) +cfmc write(iout,*)'MAXFAM=',maxfam +cfmc call readi(mcmcard,'NNET1',nnet1,5) +cfmc write(iout,*)'NNET1=',nnet1 +cfmc call readi(mcmcard,'NNET2',nnet2,4) +cfmc write(iout,*)'NNET2=',nnet2 +cfmc call readi(mcmcard,'NNET3',nnet3,4) +cfmc write(iout,*)'NNET3=',nnet3 +cfmc call readi(mcmcard,'ILASTT',ilastt,0) +cfmc write(iout,*)'ILASTT=',ilastt +cfmc call readi(mcmcard,'MAXSTR',maxstr,maxstr_mcmf) +cfmc write(iout,*)'MAXSTR=',maxstr +cfmc maxstr_f=maxstr/maxfam +cfmc write(iout,*)'MAXSTR_F=',maxstr_f +cfmc call readi(mcmcard,'NMCMF',nmcmf,10) +cfmc write(iout,*)'NMCMF=',nmcmf +cfmc call readi(mcmcard,'IFOCUS',ifocus,nmcmf) +cfmc write(iout,*)'IFOCUS=',ifocus +cfmc call readi(mcmcard,'NLOCMCMF',nlocmcmf,1000) +cfmc write(iout,*)'NLOCMCMF=',nlocmcmf +cfmc call readi(mcmcard,'INTPRT',intprt,1000) +cfmc write(iout,*)'INTPRT=',intprt +cfmc call readi(mcmcard,'IPRT',iprt,100) +cfmc write(iout,*)'IPRT=',iprt +cfmc call readi(mcmcard,'IMAXTR',imaxtr,100) +cfmc write(iout,*)'IMAXTR=',imaxtr +cfmc call readi(mcmcard,'MAXEVEN',maxeven,1000) +cfmc write(iout,*)'MAXEVEN=',maxeven +cfmc call readi(mcmcard,'MAXEVEN1',maxeven1,3) +cfmc write(iout,*)'MAXEVEN1=',maxeven1 +cfmc call readi(mcmcard,'INIMIN',inimin,200) +cfmc write(iout,*)'INIMIN=',inimin +cfmc call readi(mcmcard,'NSTEPMCMF',nstepmcmf,10) +cfmc write(iout,*)'NSTEPMCMF=',nstepmcmf +cfmc call readi(mcmcard,'NTHREAD',nthread,5) +cfmc write(iout,*)'NTHREAD=',nthread +cfmc call readi(mcmcard,'MAXSTEPMCMF',maxstepmcmf,2500) +cfmc write(iout,*)'MAXSTEPMCMF=',maxstepmcmf +cfmc call readi(mcmcard,'MAXPERT',maxpert,9) +cfmc write(iout,*)'MAXPERT=',maxpert +cfmc call readi(mcmcard,'IRMSD',irmsd,1) +cfmc write(iout,*)'IRMSD=',irmsd +cfmc call reada(mcmcard,'DENEMIN',denemin,0.01D0) +cfmc write(iout,*)'DENEMIN=',denemin +cfmc call reada(mcmcard,'RCUT1S',rcut1s,3.5D0) +cfmc write(iout,*)'RCUT1S=',rcut1s +cfmc call reada(mcmcard,'RCUT1E',rcut1e,2.0D0) +cfmc write(iout,*)'RCUT1E=',rcut1e +cfmc call reada(mcmcard,'RCUT2S',rcut2s,0.5D0) +cfmc write(iout,*)'RCUT2S=',rcut2s +cfmc call reada(mcmcard,'RCUT2E',rcut2e,0.1D0) +cfmc write(iout,*)'RCUT2E=',rcut2e +cfmc call reada(mcmcard,'DPERT1',d_pert1,180.0D0) +cfmc write(iout,*)'DPERT1=',d_pert1 +cfmc call reada(mcmcard,'DPERT1A',d_pert1a,180.0D0) +cfmc write(iout,*)'DPERT1A=',d_pert1a +cfmc call reada(mcmcard,'DPERT2',d_pert2,90.0D0) +cfmc write(iout,*)'DPERT2=',d_pert2 +cfmc call reada(mcmcard,'DPERT2A',d_pert2a,45.0D0) +cfmc write(iout,*)'DPERT2A=',d_pert2a +cfmc call reada(mcmcard,'DPERT2B',d_pert2b,90.0D0) +cfmc write(iout,*)'DPERT2B=',d_pert2b +cfmc call reada(mcmcard,'DPERT2C',d_pert2c,60.0D0) +cfmc write(iout,*)'DPERT2C=',d_pert2c +cfmc d_pert1=deg2rad*d_pert1 +cfmc d_pert1a=deg2rad*d_pert1a +cfmc d_pert2=deg2rad*d_pert2 +cfmc d_pert2a=deg2rad*d_pert2a +cfmc d_pert2b=deg2rad*d_pert2b +cfmc d_pert2c=deg2rad*d_pert2c +cfmc call reada(mcmcard,'KT_MCMF1',kt_mcmf1,1.0D0) +cfmc write(iout,*)'KT_MCMF1=',kt_mcmf1 +cfmc call reada(mcmcard,'KT_MCMF2',kt_mcmf2,1.0D0) +cfmc write(iout,*)'KT_MCMF2=',kt_mcmf2 +cfmc call reada(mcmcard,'DKT_MCMF1',dkt_mcmf1,10.0D0) +cfmc write(iout,*)'DKT_MCMF1=',dkt_mcmf1 +cfmc call reada(mcmcard,'DKT_MCMF2',dkt_mcmf2,1.0D0) +cfmc write(iout,*)'DKT_MCMF2=',dkt_mcmf2 +cfmc call reada(mcmcard,'RCUTINI',rcutini,3.5D0) +cfmc write(iout,*)'RCUTINI=',rcutini +cfmc call reada(mcmcard,'GRAT',grat,0.5D0) +cfmc write(iout,*)'GRAT=',grat +cfmc call reada(mcmcard,'BIAS_MCMF',bias_mcmf,0.0D0) +cfmc write(iout,*)'BIAS_MCMF=',bias_mcmf +cfmc +cfmc return +cfmc end +c---------------------------------------------------------------------------- + subroutine mcmread + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MCM' + include 'COMMON.MCE' + include 'COMMON.IOUNITS' + character*80 ucase + character*320 mcmcard + call card_concat(mcmcard) + call readi(mcmcard,'MAXACC',maxacc,100) + call readi(mcmcard,'MAX_MCM_IT',max_mcm_it,10000) + call readi(mcmcard,'MAXTRIAL',maxtrial,100) + call readi(mcmcard,'MAXTRIAL_ITER',maxtrial_iter,1000) + call readi(mcmcard,'MAXREPM',maxrepm,200) + call reada(mcmcard,'RANFRACT',RanFract,0.5D0) + call reada(mcmcard,'POOL_FRACT',pool_fraction,0.01D0) + call reada(mcmcard,'OVERLAP',overlap_cut,1.0D3) + call reada(mcmcard,'E_UP',e_up,5.0D0) + call reada(mcmcard,'DELTE',delte,0.1D0) + call readi(mcmcard,'NSWEEP',nsweep,5) + call readi(mcmcard,'NSTEPH',nsteph,0) + call readi(mcmcard,'NSTEPC',nstepc,0) + call reada(mcmcard,'TMIN',tmin,298.0D0) + call reada(mcmcard,'TMAX',tmax,298.0D0) + call readi(mcmcard,'NWINDOW',nwindow,0) + call readi(mcmcard,'PRINT_MC',print_mc,0) + print_stat=(index(mcmcard,'NO_PRINT_STAT').le.0) + print_int=(index(mcmcard,'NO_PRINT_INT').le.0) + ent_read=(index(mcmcard,'ENT_READ').gt.0) + call readi(mcmcard,'SAVE_FREQ',save_frequency,1000) + call readi(mcmcard,'MESSAGE_FREQ',message_frequency,1000) + call readi(mcmcard,'POOL_READ_FREQ',pool_read_freq,5000) + call readi(mcmcard,'POOL_SAVE_FREQ',pool_save_freq,1000) + call readi(mcmcard,'PRINT_FREQ',print_freq,1000) + if (nwindow.gt.0) then + read (inp,*) (winstart(i),winend(i),i=1,nwindow) + do i=1,nwindow + winlen(i)=winend(i)-winstart(i)+1 + enddo + endif + if (tmax.lt.tmin) tmax=tmin + if (tmax.eq.tmin) then + nstepc=0 + nsteph=0 + endif + if (nstepc.gt.0 .and. nsteph.gt.0) then + tsteph=(tmax/tmin)**(1.0D0/(nsteph+0.0D0)) + tstepc=(tmax/tmin)**(1.0D0/(nstepc+0.0D0)) + endif +C Probabilities of different move types + sumpro_type(0)=0.0D0 + call reada(mcmcard,'MULTI_BOND',sumpro_type(1),1.0d0) + call reada(mcmcard,'ONE_ANGLE' ,sumpro_type(2),2.0d0) + sumpro_type(2)=sumpro_type(1)+sumpro_type(2) + call reada(mcmcard,'THETA' ,sumpro_type(3),0.0d0) + sumpro_type(3)=sumpro_type(2)+sumpro_type(3) + call reada(mcmcard,'SIDE_CHAIN',sumpro_type(4),0.5d0) + sumpro_type(4)=sumpro_type(3)+sumpro_type(4) + do i=1,MaxMoveType + print *,'i',i,' sumprotype',sumpro_type(i) + sumpro_type(i)=sumpro_type(i)/sumpro_type(MaxMoveType) + print *,'i',i,' sumprotype',sumpro_type(i) + enddo + return + end +c---------------------------------------------------------------------------- + subroutine read_minim + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.MINIM' + include 'COMMON.IOUNITS' + character*80 ucase + character*320 minimcard + call card_concat(minimcard) + call readi(minimcard,'MAXMIN',maxmin,2000) + call readi(minimcard,'MAXFUN',maxfun,5000) + call readi(minimcard,'MINMIN',minmin,maxmin) + call readi(minimcard,'MINFUN',minfun,maxmin) + call reada(minimcard,'TOLF',tolf,1.0D-2) + call reada(minimcard,'RTOLF',rtolf,1.0D-4) + print_min_stat=min0(index(minimcard,'PRINT_MIN_STAT'),1) + print_min_res=min0(index(minimcard,'PRINT_MIN_RES'),1) + print_min_ini=min0(index(minimcard,'PRINT_MIN_INI'),1) + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Options in energy minimization:' + write (iout,'(4(a,i5),a,1pe14.5,a,1pe14.5)') + & 'MaxMin:',MaxMin,' MaxFun:',MaxFun, + & 'MinMin:',MinMin,' MinFun:',MinFun, + & ' TolF:',TolF,' RTolF:',RTolF + return + end +c---------------------------------------------------------------------------- + subroutine read_angles(kanal,*) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.GEO' + include 'COMMON.VAR' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.CONTROL' +c Read angles from input +c + read (kanal,*,err=10,end=10) (theta(i),i=3,nres) + read (kanal,*,err=10,end=10) (phi(i),i=4,nres) + read (kanal,*,err=10,end=10) (alph(i),i=2,nres-1) + read (kanal,*,err=10,end=10) (omeg(i),i=2,nres-1) + + do i=1,nres +c 9/7/01 avoid 180 deg valence angle + if (theta(i).gt.179.99d0) theta(i)=179.99d0 +c + theta(i)=deg2rad*theta(i) + phi(i)=deg2rad*phi(i) + alph(i)=deg2rad*alph(i) + omeg(i)=deg2rad*omeg(i) + enddo + return + 10 return1 + end +c---------------------------------------------------------------------------- + subroutine reada(rekord,lancuch,wartosc,default) + implicit none + character*(*) rekord,lancuch + double precision wartosc,default + integer ilen,iread + external ilen + iread=index(rekord,lancuch) + if (iread.eq.0) then + wartosc=default + return + endif + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,err=10,end=10) wartosc + return + 10 wartosc=default + return + end +c---------------------------------------------------------------------------- + subroutine readi(rekord,lancuch,wartosc,default) + implicit none + character*(*) rekord,lancuch + integer wartosc,default + integer ilen,iread + external ilen + iread=index(rekord,lancuch) + if (iread.eq.0) then + wartosc=default + return + endif + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,err=10,end=10) wartosc + return + 10 wartosc=default + return + end +c---------------------------------------------------------------------------- + subroutine multreadi(rekord,lancuch,tablica,dim,default) + implicit none + integer dim,i + integer tablica(dim),default + character*(*) rekord,lancuch + character*80 aux + integer ilen,iread + external ilen + do i=1,dim + tablica(i)=default + enddo + iread=index(rekord,lancuch(:ilen(lancuch))//"=") + if (iread.eq.0) return + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim) + 10 return + end +c---------------------------------------------------------------------------- + subroutine multreada(rekord,lancuch,tablica,dim,default) + implicit none + integer dim,i + double precision tablica(dim),default + character*(*) rekord,lancuch + character*80 aux + integer ilen,iread + external ilen + do i=1,dim + tablica(i)=default + enddo + iread=index(rekord,lancuch(:ilen(lancuch))//"=") + if (iread.eq.0) return + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim) + 10 return + end +c---------------------------------------------------------------------------- + subroutine openunits + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' + character*16 form,nodename + integer nodelen +#endif + include 'COMMON.SETUP' + include 'COMMON.IOUNITS' + include 'COMMON.MD' + include 'COMMON.CONTROL' + integer lenpre,lenpot,ilen,lentmp + external ilen + character*3 out1file_text,ucase + character*3 ll + external ucase +c print *,"Processor",myrank,"fg_rank",fg_rank," entered openunits" + call getenv_loc("PREFIX",prefix) + pref_orig = prefix + call getenv_loc("POT",pot) + call getenv_loc("DIRTMP",tmpdir) + call getenv_loc("CURDIR",curdir) + call getenv_loc("OUT1FILE",out1file_text) +c print *,"Processor",myrank,"fg_rank",fg_rank," did GETENV" + out1file_text=ucase(out1file_text) + if (out1file_text(1:1).eq."Y") then + out1file=.true. + else + out1file=fg_rank.gt.0 + endif + lenpre=ilen(prefix) + lenpot=ilen(pot) + lentmp=ilen(tmpdir) + if (lentmp.gt.0) then + write (*,'(80(1h!))') + write (*,'(a,19x,a,19x,a)') "!"," A T T E N T I O N ","!" + write (*,'(80(1h!))') + write (*,*)"All output files will be on node /tmp directory." +#ifdef MPI + call MPI_GET_PROCESSOR_NAME( nodename, nodelen, IERROR ) + if (me.eq.king) then + write (*,*) "The master node is ",nodename + else if (fg_rank.eq.0) then + write (*,*) "I am the CG slave node ",nodename + else + write (*,*) "I am the FG slave node ",nodename + endif +#endif + PREFIX = tmpdir(:lentmp)//'/'//prefix(:lenpre) + lenpre = lentmp+lenpre+1 + endif + entname=prefix(:lenpre)//'_'//pot(:lenpot)//'.entr' +C Get the names and open the input files +#if defined(WINIFL) || defined(WINPGI) + open(1,file=pref_orig(:ilen(pref_orig))// + & '.inp',status='old',readonly,shared) + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old',readonly,shared) + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old',readonly,shared) +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + open (ithep_pdb,file=thetname_pdb,status='old',readonly,shared) +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old',readonly,shared) +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old',readonly,shared) +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old',readonly,shared) + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old',readonly,shared) + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old',readonly,shared) + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old',readonly,shared) + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old', + & action='read') +c print *,"Processor",myrank," opened file 1" + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +c print *,"Processor",myrank," opened file 9" +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old',action='read') +c print *,"Processor",myrank," opened file IBOND" + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old',action='read') +c print *,"Processor",myrank," opened file ITHEP" +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + open (ithep_pdb,file=thetname_pdb,status='old',action='read') +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old',action='read') +c print *,"Processor",myrank," opened file IROTAM" +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old',action='read') +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old',action='read') +c print *,"Processor",myrank," opened file ITORP" + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old',action='read') +c print *,"Processor",myrank," opened file ITORDP" + call getenv_loc('SCCORPAR',sccorname) + open (isccor,file=sccorname,status='old',action='read') +c print *,"Processor",myrank," opened file ISCCOR" + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old',action='read') +c print *,"Processor",myrank," opened file IFOURIER" + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old',action='read') +c print *,"Processor",myrank," opened file IELEP" + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old',action='read') +c print *,"Processor",myrank," opened file ISIDEP" +c print *,"Processor",myrank," opened parameter files" +#elif (defined G77) + open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old') + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old') + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old') +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + open (ithep_pdb,file=thetname_pdb,status='old') +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old') +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old') +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old') + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old') + call getenv_loc('SCCORPAR',sccorname) + open (isccor,file=sccorname,status='old') + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old') + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old') + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old') +#else + open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old', + &action='read') + open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown') +C open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown') +C Get parameter filenames and open the parameter files. + call getenv_loc('BONDPAR',bondname) + open (ibond,file=bondname,status='old',action='read') + call getenv_loc('THETPAR',thetname) + open (ithep,file=thetname,status='old',action='read') +#ifndef CRYST_THETA + call getenv_loc('THETPARPDB',thetname_pdb) + print *,"thetname_pdb ",thetname_pdb + open (ithep_pdb,file=thetname_pdb,status='old',action='read') + print *,ithep_pdb," opened" +#endif + call getenv_loc('ROTPAR',rotname) + open (irotam,file=rotname,status='old',action='read') +#ifndef CRYST_SC + call getenv_loc('ROTPARPDB',rotname_pdb) + open (irotam_pdb,file=rotname_pdb,status='old',action='read') +#endif + call getenv_loc('TORPAR',torname) + open (itorp,file=torname,status='old',action='read') + call getenv_loc('TORDPAR',tordname) + open (itordp,file=tordname,status='old',action='read') + call getenv_loc('SCCORPAR',sccorname) + open (isccor,file=sccorname,status='old',action='read') + call getenv_loc('FOURIER',fouriername) + open (ifourier,file=fouriername,status='old',action='read') + call getenv_loc('ELEPAR',elename) + open (ielep,file=elename,status='old',action='read') + call getenv_loc('SIDEPAR',sidename) + open (isidep,file=sidename,status='old',action='read') +#endif +#ifndef OLDSCP +C +C 8/9/01 In the newest version SCp interaction constants are read from a file +C Use -DOLDSCP to use hard-coded constants instead. +C + call getenv_loc('SCPPAR',scpname) +#if defined(WINIFL) || defined(WINPGI) + open (iscpp,file=scpname,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open (iscpp,file=scpname,status='old',action='read') +#elif (defined G77) + open (iscpp,file=scpname,status='old') +#else + open (iscpp,file=scpname,status='old',action='read') +#endif +#endif + call getenv_loc('PATTERN',patname) +#if defined(WINIFL) || defined(WINPGI) + open (icbase,file=patname,status='old',readonly,shared) +#elif (defined CRAY) || (defined AIX) + open (icbase,file=patname,status='old',action='read') +#elif (defined G77) + open (icbase,file=patname,status='old') +#else + open (icbase,file=patname,status='old',action='read') +#endif +#ifdef MPI +C Open output file only for CG processes +c print *,"Processor",myrank," fg_rank",fg_rank + if (fg_rank.eq.0) then + + if (nodes.eq.1) then + npos=3 + else + npos = dlog10(dfloat(nodes-1))+1 + endif + if (npos.lt.3) npos=3 + write (liczba,'(i1)') npos + form = '(bz,i'//liczba(:ilen(liczba))//'.'//liczba(:ilen(liczba)) + & //')' + write (liczba,form) me + outname=prefix(:lenpre)//'.out_'//pot(:lenpot)// + & liczba(:ilen(liczba)) + intname=prefix(:lenpre)//'_'//pot(:lenpot)//liczba(:ilen(liczba)) + & //'.int' + pdbname=prefix(:lenpre)//'_'//pot(:lenpot)//liczba(:ilen(liczba)) + & //'.pdb' + mol2name=prefix(:lenpre)//'_'//pot(:lenpot)// + & liczba(:ilen(liczba))//'.mol2' + statname=prefix(:lenpre)//'_'//pot(:lenpot)// + & liczba(:ilen(liczba))//'.stat' + if (lentmp.gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'//pot(:lenpot) + & //liczba(:ilen(liczba))//'.stat') + rest2name=prefix(:ilen(prefix))//"_"//liczba(:ilen(liczba)) + & //'.rst' + if(usampl) then + qname=prefix(:lenpre)//'_'//pot(:lenpot)// + & liczba(:ilen(liczba))//'.const' + endif + + endif +#else + outname=prefix(:lenpre)//'.out_'//pot(:lenpot) + intname=prefix(:lenpre)//'_'//pot(:lenpot)//'.int' + pdbname=prefix(:lenpre)//'_'//pot(:lenpot)//'.pdb' + mol2name=prefix(:lenpre)//'_'//pot(:lenpot)//'.mol2' + statname=prefix(:lenpre)//'_'//pot(:lenpot)//'.stat' + if (lentmp.gt.0) + & call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'//pot(:lenpot) + & //'.stat') + rest2name=prefix(:ilen(prefix))//'.rst' + if(usampl) then + qname=prefix(:lenpre)//'_'//pot(:lenpot)//'.const' + endif +#endif +#if defined(AIX) || defined(PGI) + if (me.eq.king .or. .not. out1file) + & open(iout,file=outname,status='unknown') +c#define DEBUG +#ifdef DEBUG + if (fg_rank.gt.0) then + write (liczba,'(i3.3)') myrank/nfgtasks + write (ll,'(bz,i3.3)') fg_rank + open(iout,file="debug"//liczba(:ilen(liczba))//"."//ll, + & status='unknown') + endif +#endif +c#undef DEBUG + if(me.eq.king) then + open(igeom,file=intname,status='unknown',position='append') + open(ipdb,file=pdbname,status='unknown') + open(imol2,file=mol2name,status='unknown') + open(istat,file=statname,status='unknown',position='append') + else +c1out open(iout,file=outname,status='unknown') + endif +#else + if (me.eq.king .or. .not.out1file) + & open(iout,file=outname,status='unknown') +c#define DEBUG +#ifdef DEBUG + if (fg_rank.gt.0) then + print "Processor",fg_rank," opening output file" + write (liczba,'(i3.3)') myrank/nfgtasks + write (ll,'(bz,i3.3)') fg_rank + open(iout,file="debug"//liczba(:ilen(liczba))//"."//ll, + & status='unknown') + endif +#endif +c#undef DEBUG + if(me.eq.king) then + open(igeom,file=intname,status='unknown',access='append') + open(ipdb,file=pdbname,status='unknown') + open(imol2,file=mol2name,status='unknown') + open(istat,file=statname,status='unknown',access='append') + else +c1out open(iout,file=outname,status='unknown') + endif +#endif +csa csa_rbank=prefix(:lenpre)//'.CSA.rbank' +csa csa_seed=prefix(:lenpre)//'.CSA.seed' +csa csa_history=prefix(:lenpre)//'.CSA.history' +csa csa_bank=prefix(:lenpre)//'.CSA.bank' +csa csa_bank1=prefix(:lenpre)//'.CSA.bank1' +csa csa_alpha=prefix(:lenpre)//'.CSA.alpha' +csa csa_alpha1=prefix(:lenpre)//'.CSA.alpha1' +csac!bankt csa_bankt=prefix(:lenpre)//'.CSA.bankt' +csa csa_int=prefix(:lenpre)//'.int' +csa csa_bank_reminimized=prefix(:lenpre)//'.CSA.bank_reminimized' +csa csa_native_int=prefix(:lenpre)//'.CSA.native.int' +csa csa_in=prefix(:lenpre)//'.CSA.in' +c print *,"Processor",myrank,"fg_rank",fg_rank," opened files" +C Write file names + if (me.eq.king)then + write (iout,'(80(1h-))') + write (iout,'(30x,a)') "FILE ASSIGNMENT" + write (iout,'(80(1h-))') + write (iout,*) "Input file : ", + & pref_orig(:ilen(pref_orig))//'.inp' + write (iout,*) "Output file : ", + & outname(:ilen(outname)) + write (iout,*) + write (iout,*) "Sidechain potential file : ", + & sidename(:ilen(sidename)) +#ifndef OLDSCP + write (iout,*) "SCp potential file : ", + & scpname(:ilen(scpname)) +#endif + write (iout,*) "Electrostatic potential file : ", + & elename(:ilen(elename)) + write (iout,*) "Cumulant coefficient file : ", + & fouriername(:ilen(fouriername)) + write (iout,*) "Torsional parameter file : ", + & torname(:ilen(torname)) + write (iout,*) "Double torsional parameter file : ", + & tordname(:ilen(tordname)) + write (iout,*) "SCCOR parameter file : ", + & sccorname(:ilen(sccorname)) + write (iout,*) "Bond & inertia constant file : ", + & bondname(:ilen(bondname)) + write (iout,*) "Bending parameter file : ", + & thetname(:ilen(thetname)) + write (iout,*) "Rotamer parameter file : ", + & rotname(:ilen(rotname)) + write (iout,*) "Threading database : ", + & patname(:ilen(patname)) + if (lentmp.ne.0) + &write (iout,*)" DIRTMP : ", + & tmpdir(:lentmp) + write (iout,'(80(1h-))') + endif + return + end +c---------------------------------------------------------------------------- + subroutine card_concat(card) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.IOUNITS' + character*(*) card + character*80 karta,ucase + external ilen + read (inp,'(a)') karta + karta=ucase(karta) + card=' ' + do while (karta(80:80).eq.'&') + card=card(:ilen(card)+1)//karta(:79) + read (inp,'(a)') karta + karta=ucase(karta) + enddo + card=card(:ilen(card)+1)//karta + return + end +c---------------------------------------------------------------------------------- + subroutine readrst + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.MD' + open(irest2,file=rest2name,status='unknown') + read(irest2,*) totT,EK,potE,totE,t_bath + do i=1,2*nres + read(irest2,'(3e15.5)') (d_t(j,i),j=1,3) + enddo + do i=1,2*nres + read(irest2,'(3e15.5)') (dc(j,i),j=1,3) + enddo + if(usampl) then + read (irest2,*) iset + endif + close(irest2) + return + end +c--------------------------------------------------------------------------------- + subroutine read_fragments + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.MD' + include 'COMMON.CONTROL' + read(inp,*) nset,nfrag,npair,nfrag_back + if(me.eq.king.or..not.out1file) + & write(iout,*) "nset",nset," nfrag",nfrag," npair",npair, + & " nfrag_back",nfrag_back + do iset=1,nset + read(inp,*) mset(iset) + do i=1,nfrag + read(inp,*) wfrag(i,iset),ifrag(1,i,iset),ifrag(2,i,iset), + & qinfrag(i,iset) + if(me.eq.king.or..not.out1file) + & write(iout,*) "R ",i,wfrag(i,iset),ifrag(1,i,iset), + & ifrag(2,i,iset), qinfrag(i,iset) + enddo + do i=1,npair + read(inp,*) wpair(i,iset),ipair(1,i,iset),ipair(2,i,iset), + & qinpair(i,iset) + if(me.eq.king.or..not.out1file) + & write(iout,*) "R ",i,wpair(i,iset),ipair(1,i,iset), + & ipair(2,i,iset), qinpair(i,iset) + enddo + do i=1,nfrag_back + read(inp,*) wfrag_back(1,i,iset),wfrag_back(2,i,iset), + & wfrag_back(3,i,iset), + & ifrag_back(1,i,iset),ifrag_back(2,i,iset) + if(me.eq.king.or..not.out1file) + & write(iout,*) "A",i,wfrag_back(1,i,iset),wfrag_back(2,i,iset), + & wfrag_back(3,i,iset),ifrag_back(1,i,iset),ifrag_back(2,i,iset) + enddo + enddo + return + end +c------------------------------------------------------------------------------- + subroutine read_dist_constr + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef MPI + include 'mpif.h' +#endif + include 'COMMON.SETUP' + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.IOUNITS' + include 'COMMON.SBRIDGE' + integer ifrag_(2,100),ipair_(2,100) + double precision wfrag_(100),wpair_(100) + character*500 controlcard +c write (iout,*) "Calling read_dist_constr" +c write (iout,*) "nres",nres," nstart_sup",nstart_sup," nsup",nsup +c call flush(iout) + call card_concat(controlcard) + call readi(controlcard,"NFRAG",nfrag_,0) + call readi(controlcard,"NPAIR",npair_,0) + call readi(controlcard,"NDIST",ndist_,0) + call reada(controlcard,'DIST_CUT',dist_cut,5.0d0) + call multreadi(controlcard,"IFRAG",ifrag_(1,1),2*nfrag_,0) + call multreadi(controlcard,"IPAIR",ipair_(1,1),2*npair_,0) + call multreada(controlcard,"WFRAG",wfrag_(1),nfrag_,0.0d0) + call multreada(controlcard,"WPAIR",wpair_(1),npair_,0.0d0) +c write (iout,*) "NFRAG",nfrag_," NPAIR",npair_," NDIST",ndist_ +c write (iout,*) "IFRAG" +c do i=1,nfrag_ +c write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i) +c enddo +c write (iout,*) "IPAIR" +c do i=1,npair_ +c write (iout,*) i,ipair_(1,i),ipair_(2,i),wpair_(i) +c enddo + if (.not.refstr .and. nfrag.gt.0) then + write (iout,*) + & "ERROR: no reference structure to compute distance restraints" + write (iout,*) + & "Restraints must be specified explicitly (NDIST=number)" + stop + endif + if (nfrag.lt.2 .and. npair.gt.0) then + write (iout,*) "ERROR: Less than 2 fragments specified", + & " but distance restraints between pairs requested" + stop + endif + call flush(iout) + do i=1,nfrag_ + if (ifrag_(1,i).lt.nstart_sup) ifrag_(1,i)=nstart_sup + if (ifrag_(2,i).gt.nstart_sup+nsup-1) + & ifrag_(2,i)=nstart_sup+nsup-1 +c write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i) + call flush(iout) + if (wfrag_(i).gt.0.0d0) then + do j=ifrag_(1,i),ifrag_(2,i)-1 + do k=j+1,ifrag_(2,i) + write (iout,*) "j",j," k",k + ddjk=dist(j,k) + if (constr_dist.eq.1) then + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + dhpb(nhpb)=ddjk + forcon(nhpb)=wfrag_(i) + else if (constr_dist.eq.2) then + if (ddjk.le.dist_cut) then + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + dhpb(nhpb)=ddjk + forcon(nhpb)=wfrag_(i) + endif + else + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + dhpb(nhpb)=ddjk + forcon(nhpb)=wfrag_(i)*dexp(-0.5d0*(ddjk/dist_cut)**2) + endif +#ifdef MPI + if (.not.out1file .or. me.eq.king) + & write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#else + write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#endif + enddo + enddo + endif + enddo + do i=1,npair_ + if (wpair_(i).gt.0.0d0) then + ii = ipair_(1,i) + jj = ipair_(2,i) + if (ii.gt.jj) then + itemp=ii + ii=jj + jj=itemp + endif + do j=ifrag_(1,ii),ifrag_(2,ii) + do k=ifrag_(1,jj),ifrag_(2,jj) + nhpb=nhpb+1 + ihpb(nhpb)=j + jhpb(nhpb)=k + forcon(nhpb)=wpair_(i) + dhpb(nhpb)=dist(j,k) +#ifdef MPI + if (.not.out1file .or. me.eq.king) + & write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#else + write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ", + & nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb) +#endif + enddo + enddo + endif + enddo + do i=1,ndist_ + read (inp,*) ihpb(nhpb+1),jhpb(nhpb+1),dhpb(i),dhpb1(i), + & ibecarb(i),forcon(nhpb+1) + if (forcon(nhpb+1).gt.0.0d0) then + nhpb=nhpb+1 + if (ibecarb(i).gt.0) then + ihpb(i)=ihpb(i)+nres + jhpb(i)=jhpb(i)+nres + endif + if (dhpb(nhpb).eq.0.0d0) + & dhpb(nhpb)=dist(ihpb(nhpb),jhpb(nhpb)) + endif + enddo +#ifdef MPI + if (.not.out1file .or. me.eq.king) then +#endif + do i=1,nhpb + write (iout,'(a,3i5,2f8.2,i2,f10.1)') "+dist.constr ", + & i,ihpb(i),jhpb(i),dhpb(i),dhpb1(i),ibecarb(i),forcon(i) + enddo + call flush(iout) +#ifdef MPI + endif +#endif + return + end +c------------------------------------------------------------------------------- +#ifdef WINIFL + subroutine flush(iu) + return + end +#endif +#ifdef AIX + subroutine flush(iu) + call flush_(iu) + return + end +#endif +c------------------------------------------------------------------------------ + subroutine copy_to_tmp(source) + include "DIMENSIONS" + include "COMMON.IOUNITS" + character*(*) source + character* 256 tmpfile + integer ilen + external ilen + logical ex + tmpfile=curdir(:ilen(curdir))//"/"//source(:ilen(source)) + inquire(file=tmpfile,exist=ex) + if (ex) then + write (*,*) "Copying ",tmpfile(:ilen(tmpfile)), + & " to temporary directory..." + write (*,*) "/bin/cp "//tmpfile(:ilen(tmpfile))//" "//tmpdir + call system("/bin/cp "//tmpfile(:ilen(tmpfile))//" "//tmpdir) + endif + return + end +c------------------------------------------------------------------------------ + subroutine move_from_tmp(source) + include "DIMENSIONS" + include "COMMON.IOUNITS" + character*(*) source + integer ilen + external ilen + write (*,*) "Moving ",source(:ilen(source)), + & " from temporary directory to working directory" + write (*,*) "/bin/mv "//source(:ilen(source))//" "//curdir + call system("/bin/mv "//source(:ilen(source))//" "//curdir) + return + end +c------------------------------------------------------------------------------ + subroutine random_init(seed) +C +C Initialize random number generator +C + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' +#ifdef AMD64 + integer*8 iseedi8 +#endif +#ifdef MPI + include 'mpif.h' + logical OKRandom, prng_restart + real*8 r1 + integer iseed_array(4) +#endif + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.THREAD' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.MCM' + include 'COMMON.MAP' + include 'COMMON.HEADER' +csa include 'COMMON.CSA' + include 'COMMON.CHAIN' + include 'COMMON.MUCA' + include 'COMMON.MD' + include 'COMMON.FFIELD' + include 'COMMON.SETUP' +c iseed=-dint(dabs(seed)) + iseed=dint(dabs(seed)) + if (iseed.eq.0) then + write (iout,'(/80(1h*)/20x,a/80(1h*))') + & 'Random seed undefined. The program will stop.' + write (*,'(/80(1h*)/20x,a/80(1h*))') + & 'Random seed undefined. The program will stop.' +#ifdef MPI + call mpi_finalize(mpi_comm_world,ierr) +#endif + stop 'Bad random seed.' + endif +#ifdef MPI + if (fg_rank.eq.0) then + seed=seed*(me+1)+1 +#ifdef AMD64 + iseedi8=dint(seed) + if(me.eq.king .or. .not. out1file) + & write (iout,*) 'MPI: node= ', me, ' iseed= ',iseedi8 + write (*,*) 'MPI: node= ', me, ' iseed= ',iseedi8 + OKRandom = prng_restart(me,iseedi8) +#else + do i=1,4 + tmp=65536.0d0**(4-i) + iseed_array(i) = dint(seed/tmp) + seed=seed-iseed_array(i)*tmp + enddo + if(me.eq.king .or. .not. out1file) + & write (iout,*) 'MPI: node= ', me, ' iseed(4)= ', + & (iseed_array(i),i=1,4) + write (*,*) 'MPI: node= ',me, ' iseed(4)= ', + & (iseed_array(i),i=1,4) + OKRandom = prng_restart(me,iseed_array) +#endif + if (OKRandom) then + r1=ran_number(0.0D0,1.0D0) + if(me.eq.king .or. .not. out1file) + & write (iout,*) 'ran_num',r1 + if (r1.lt.0.0d0) OKRandom=.false. + endif + if (.not.OKRandom) then + write (iout,*) 'PRNG IS NOT WORKING!!!' + print *,'PRNG IS NOT WORKING!!!' + if (me.eq.0) then + call flush(iout) + call mpi_abort(mpi_comm_world,error_msg,ierr) + stop + else + write (iout,*) 'too many processors for parallel prng' + write (*,*) 'too many processors for parallel prng' + call flush(iout) + stop + endif + endif + endif +#else + call vrndst(iseed) + write (iout,*) 'ran_num',ran_number(0.0d0,1.0d0) +#endif + return + end diff --git a/source/wham/src/DIMENSIONS.FREE.orig b/source/wham/src/DIMENSIONS.FREE.orig new file mode 100644 index 0000000..21d967d --- /dev/null +++ b/source/wham/src/DIMENSIONS.FREE.orig @@ -0,0 +1,14 @@ + integer Max_Parm + integer MaxQ,MaxQ1 + integer MaxR,MaxT_h + integer MaxSlice + parameter (Max_Parm=8) + parameter (MaxQ=4,MaxQ1=MaxQ+2) + parameter(MaxR=1,MaxT_h=32) + parameter(MaxSlice=40) + integer MaxN + parameter (MaxN=100) + integer MaxPrintConf + parameter (MaxPrintConf=1000) + integer Max_GridT + parameter (Max_GridT=400) diff --git a/source/wham/src/DIMENSIONS.orig b/source/wham/src/DIMENSIONS.orig new file mode 100644 index 0000000..04c57a5 --- /dev/null +++ b/source/wham/src/DIMENSIONS.orig @@ -0,0 +1,142 @@ +******************************************************************************** +* Settings for the program of united-residue peptide simulation in real space * +* * +* ------- As of 6/23/01 ----------- * +* * +******************************************************************************** +c implicit real*8 (a-h,o-z) +C Max. number of processors. +c parameter (maxprocs=128) +C Max. number of fine-grain processors +c parameter (max_fg_procs=maxprocs) +C Max. number of coarse-grain processors +c parameter (max_cg_procs=maxprocs) +C Max. number of AA residues + integer maxres + parameter (maxres=250) +c parameter (maxres=400) +C Appr. max. number of interaction sites + integer maxres2 + parameter (maxres2=2*maxres) +C Max. number of variables + integer maxvar + parameter (maxvar=4*maxres) +C Max. number of groups of interactions that a given SC is involved in + integer maxint_gr + parameter (maxint_gr=2) +C Max. number of derivatives of virtual-bond and side-chain vectors in theta +C or phi. + integer maxdim + parameter (maxdim=(maxres-1)*(maxres-2)/2) +C Max. number of SC contacts + integer maxcont + parameter (maxcont=12*maxres) +C Max. number of contacts per residue + integer maxconts + parameter (maxconts=maxres) +C Number of AA types (at present only natural AA's will be handled + integer ntyp,ntyp1 + parameter (ntyp=20,ntyp1=ntyp+1) + integer nntyp + parameter (nntyp=ntyp*(ntyp+1)/2) +C Max. number of types of dihedral angles & multiplicity of torsional barriers +C and the number of terms in double torsionals + integer maxtor,maxterm,maxlor,maxtermd_1,maxtermd_2 + parameter (maxtor=4,maxterm=10,maxlor=3,maxtermd_1=8,maxtermd_2=8) +c Max number of torsional terms in SCCOR + integer maxterm_sccor + parameter (maxterm_sccor=6) +C Max. number of residue types and parameters in expressions for +C virtual-bond angle bending potentials + integer maxthetyp,maxthetyp1,maxtheterm,maxtheterm2,maxtheterm3, + & maxsingle,maxdouble,mmaxtheterm + parameter (maxthetyp=3,maxthetyp1=maxthetyp+1,maxtheterm=20, + & maxtheterm2=6,maxtheterm3=4,maxsingle=6,maxdouble=4, + & mmaxtheterm=maxtheterm) +C Max. number of lobes in SC distribution + integer maxlob + parameter (maxlob=4) +C Max. number of S-S bridges + integer maxss + parameter (maxss=20) +C Max. number of dihedral angle constraints + integer maxdih_constr + parameter (maxdih_constr=maxres) +C Max. number of patterns in the pattern database + integer maxseq + parameter (maxseq=1000) +C Max. number of residues in a peptide in the database + integer maxres_base + parameter (maxres_base=1000) +C Max. number of threading attempts + integer maxthread + parameter (maxthread=2000) +C Max. number of move types in MCM + integer maxmovetype + parameter (maxmovetype=4) +C Max. number of stored confs. in MC/MCM simulation + integer maxsave + parameter (maxsave=2000) +C Max. number of conformations in Master's cache array + integer max_cache + parameter (max_cache=1000) +C Max. number of conformations in the pool + integer max_pool + parameter (max_pool=1000) +C Number of threads in deformation + integer max_thread,max_thread2 + parameter (max_thread=40,max_thread2=2*max_thread) +C Number of steps in DSM + integer max_step + parameter (max_step=1) +C Number of structures to compare at t=0 + integer max_threadss,max_threadss2 + parameter (max_threadss=80,max_threadss2=2*max_threadss) +C Maxmimum number of angles per residue + integer mxang + parameter (mxang=4) +C Maximum number of groups of angles + integer mxgr + parameter (mxgr=2*maxres) +C Maximum number of chains + integer mxch + parameter (mxch=1) +C Maximum number of generated conformations + integer mxio + parameter (mxio=1000) +C Maximum number of seed + integer max_seed + parameter (max_seed=100) +C Maximum number of structures for ZSCORE for each protein + integer maxzs + parameter (maxzs=2) +C Maximum number of structures stored for comparison for ZSCORE for each protein + integer maxzs1 + parameter (maxzs1=6) +C Maximum number of proteins for ZSCORE + integer maxprotzs + parameter (maxprotzs=1) +C Maximum number of conf in rmsdbank + integer maxrmsdb + parameter (maxrmsdb=110) +C Maximum number of bankt conformations + integer mxiot + parameter (mxiot=mxio) +c Maximum number of conformations in MCMF + integer maxstr_mcmf + parameter (maxstr_mcmf=800) +c Maximum number of families in MCMF + integer maxfam_p + parameter (maxfam_p=20) +c Maximum number of structures in family in MCMF + integer maxstr_fam + parameter (maxstr_fam=40) +C Maximum number of threads in MCMF + integer maxthread_mcmf + parameter (maxthread_mcmf=10) +C Maximum number of SC local term fitting function coefficiants + integer maxsccoef + parameter (maxsccoef=65) +C Maximum number of terms in SC bond-stretching potential + integer maxbondterm + parameter (maxbondterm=3) diff --git a/source/wham/src/cxread.F.orig b/source/wham/src/cxread.F.orig new file mode 100644 index 0000000..c09d1df --- /dev/null +++ b/source/wham/src/cxread.F.orig @@ -0,0 +1,330 @@ + subroutine cxread(nazwa,ii,jj,kk,ll,mm,iR,ib,iparm,*) + implicit real*8 (a-h,o-z) + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.FREE' + integer MaxTraj + parameter (MaxTraj=2050) + include 'COMMON.CHAIN' + include 'COMMON.INTERACT' + include 'COMMON.NAMES' + include 'COMMON.IOUNITS' + include 'COMMON.HEADER' + include 'COMMON.SBRIDGE' + include 'COMMON.PROTFILES' + include 'COMMON.OBCINKA' + include 'COMMON.FREE' + include 'COMMON.VAR' + include 'COMMON.GEO' + include 'COMMON.PROT' + character*64 nazwa,bprotfile_temp + real*4 rtime,rpotE,ruconst,rt_bath,rprop(maxQ) + double precision time + integer iret,itmp,itraj,ntraj + real xoord(3,maxres2+2),prec + integer nstep(0:MaxTraj-1) + integer ilen + external ilen + integer ii,jj(maxslice),kk(maxslice),ll(maxslice),mm(maxslice) + integer is(MaxSlice),ie(MaxSlice),nrec_slice + double precision ts(MaxSlice),te(MaxSlice),time_slice + integer slice + logical conf_check + call set_slices(is,ie,ts,te,iR,ib,iparm) + + do i=1,nQ + rprop(i)=0.0d0 + enddo + do i=0,MaxTraj-1 + nstep(i)=0 + enddo + ntraj=0 + it=0 + iret=1 +#if (defined(AIX) && !defined(JUBL)) + call xdrfopen_(ixdrf,nazwa, "r", iret) +#else + call xdrfopen(ixdrf,nazwa, "r", iret) +#endif + if (iret.eq.0) return1 + + islice1=1 + call opentmp(islice1,ientout,bprotfile_temp) +c print *,"bumbum" + do while (iret.gt.0) + +#if (defined(AIX) && !defined(JUBL)) +#ifdef DEBUG + write (iout,*) "ii",ii," itraj",itraj," it",it +#endif + call xdrffloat_(ixdrf, rtime, iret) + call xdrffloat_(ixdrf, rpotE, iret) +#ifdef DEBUG + write (iout,*) "rtime",rtime," rpotE",rpotE," iret",iret +#endif + call flush(iout) + call xdrffloat_(ixdrf, ruconst, iret) + call xdrffloat_(ixdrf, rt_bath, iret) + call xdrfint_(ixdrf, nss, iret) +#ifdef DEBUG + write (iout,*) "ruconst",ruconst," rt_bath",rt_bath," nss",nss +#endif + do j=1,nss + call xdrfint_(ixdrf, ihpb(j), iret) + call xdrfint_(ixdrf, jhpb(j), iret) + enddo + call xdrfint_(ixdrf, nprop, iret) + if (umbrella(iparm) .or. read_iset(iparm) .or. hamil_rep) + & call xdrfint(ixdrf, iset, iret) + do i=1,nprop + call xdrffloat_(ixdrf, rprop(i), iret) + enddo +#else +#ifdef DEBUG + write (iout,*) "ii",ii," itraj",itraj," it",it +#endif + call xdrffloat(ixdrf, rtime, iret) + call xdrffloat(ixdrf, rpotE, iret) +#ifdef DEBUG + write (iout,*) "rtime",rtime," rpotE",rpotE," iret",iret +#endif + call flush(iout) + call xdrffloat(ixdrf, ruconst, iret) + call xdrffloat(ixdrf, rt_bath, iret) + call xdrfint(ixdrf, nss, iret) +#ifdef DEBUG + write (iout,*) "ruconst",ruconst," rt_bath",rt_bath," nss",nss +#endif + do j=1,nss + call xdrfint(ixdrf, ihpb(j), iret) + call xdrfint(ixdrf, jhpb(j), iret) + enddo + call xdrfint(ixdrf, nprop, iret) +#ifdef DEBUG + write (iout,*) "nprop",nprop + call flush(iout) +#endif + if (it.gt.0 .and. nprop.ne.nprop_prev) then + write (iout,*) "Warning previous nprop",nprop_prev, + & " current",nprop + nprop=nprop_prev + else + nprop_prev=nprop + endif + if (umbrella(iparm) .or. read_iset(iparm) .or. hamil_rep) + & call xdrfint(ixdrf, iset, iret) + do i=1,nprop + call xdrffloat(ixdrf, rprop(i), iret) + enddo +#ifdef DEBUG + write (iout,*) "rprop",(rprop(i),i=1,nprop) + call flush(iout) +#endif +#endif + if (iret.eq.0) exit + itraj=mod(it,totraj(iR,iparm)) + if (iset.eq.0) iset = 1 + call flush(iout) + it=it+1 + if (itraj.gt.ntraj) ntraj=itraj + nstep(itraj)=nstep(itraj)+1 +c rprop(2)=dsqrt(rprop(2)) +c rprop(3)=dsqrt(rprop(3)) +#ifdef DEBUG + write (iout,*) "umbrella ",umbrella + write (iout,*) rtime,rpotE,rt_bath,nss, + & (ihpb(j),jhpb(j),j=1,nss),(rprop(j),j=1,nprop) + write (iout,*) "nprop",nprop," iset",iset," myparm",myparm + call flush(iout) +#endif + prec=10000.0 + + itmp=0 +#if (defined(AIX) && !defined(JUBL)) + call xdrf3dfcoord_(ixdrf, xoord, itmp, prec, iret) +#else + call xdrf3dfcoord(ixdrf, xoord, itmp, prec, iret) +#endif +#ifdef DEBUG + write (iout,'(10f8.3)') ((xoord(j,i),j=1,3),i=1,itmp) +#endif + if (iret.eq.0) exit + if (itmp .ne. nres + nct - nnt + 1) then + write (iout,*) "Error: inconsistent sizes",itmp,nres+nct-nnt+1 + call flush(iout) + exit + endif + + time=rtime +#ifdef DEBUG + write (iout,*) "calling slice" + call flush(iout) +#endif + islice=slice(nstep(itraj),time,is,ie,ts,te) +#ifdef DEBUG + write (iout,*) "islice",islice + call flush(iout) +#endif + do i=1,nres + do j=1,3 + c(j,i)=xoord(j,i) + enddo + enddo + do i=1,nct-nnt+1 + do j=1,3 + c(j,i+nres+nnt-1)=xoord(j,i+nres) + enddo + enddo + +c write (iout,*) "islice",islice," nslice",nslice, +c & " separate_parset",separate_parset," iset",iset," myparm",myparm +c call flush(iout) + if (islice.gt.0 .and. islice.le.nslice .and. (.not.separate_parset + & .or. iset.eq.myparm)) then + ii=ii+1 + kk(islice)=kk(islice)+1 + mm(islice)=mm(islice)+1 +#ifdef DEBUG + write (iout,*) "islice",islice," kk",kk(islice)," mm",mm(islice) + write (iout,*) "itraj",itraj," nstep",nstep(itraj), + & " iparm",iparm," isampl",isampl(iparm) + call flush(iout) + write (iout,*) "islice",islice," ll",ll(islice)," conf_check ", + & conf_check(ll(islice)+1,1) + call flush(iout) +#endif + if (mod(nstep(itraj),isampl(iparm)).eq.0 .and. + & conf_check(ll(islice)+1,1)) then + if (replica(iparm)) then + rt_bath=1.0d0/(rt_bath*1.987D-3) + do i=1,nT_h(iparm) + if (abs(real(beta_h(i,iparm))-rt_bath).lt.1.0e-4) then + iib = i + goto 22 + endif + enddo + 22 continue + if (i.gt.nT_h(iparm)) then + write (iout,*) "Error - temperature of conformation", + & ii,1.0d0/(rt_bath*1.987D-3), + & " does not match any of the list" + write (iout,*) + & 1.0d0/(rt_bath*1.987D-3), + & (1.0d0/(beta_h(i,iparm)*1.987D-3),i=1,nT_h(iparm)) + call flush(iout) +c exit +c call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE) + ii=ii-1 + kk(islice)=kk(islice)-1 + mm(islice)=mm(islice)-1 + goto 112 + endif + else + iib = ib + endif + + efree=0.0d0 + jj(islice)=jj(islice)+1 + write (iout,*) "islice",islice," jj",jj(islice) + call flush(iout) + if (umbrella(iparm)) then + snk(iset,iib,iparm,islice)=snk(iset,iib,iparm,islice)+1 + else if (hamil_rep) then + snk(1,iib,iparm,islice)=snk(1,iib,iparm,islice)+1 + else + snk(iR,iib,iparm,islice)=snk(iR,iib,iparm,islice)+1 + endif + ll(islice)=ll(islice)+1 +#ifdef DEBUG + write (iout,*) "Writing conformation, record",ll(islice) + write (iout,*) "ib",ib," iib",iib + write (iout,*) "ntraj",ntraj," itraj",itraj, + & " nstep",nstep(itraj) + write (iout,*) "pote",rpotE," time",rtime +c if (replica(iparm)) then +c write (iout,*) "TEMP",1.0d0/(rt_bath*1.987D-3) +c write (iout,*) "TEMP list" +c write (iout,*) +c & (1.0d0/(beta_h(i,iparm)*1.987D-3),i=1,nT_h(iparm)) +c endif + write (iout,*) "iparm",iparm," ib",ib," iR",iR," nQ",nQ +c write (iout,*) "nres",nres," nnt",nnt," nct",nct," nss",nss +c write (iout,*) "length",nres*4+(nct-nnt+1)*4+4+2*nss*4 + call flush(iout) +#endif + if (islice.ne.islice1) then +c write (iout,*) "islice",islice," islice1",islice1 + close(ientout) +c write (iout,*) "Closing file ", +c & bprotfile_temp(:ilen(bprotfile_temp)) + call opentmp(islice,ientout,bprotfile_temp) +c write (iout,*) "Opening file ", +c & bprotfile_temp(:ilen(bprotfile_temp)) + islice1=islice + endif + if (umbrella(iparm)) then + write(ientout,rec=ll(islice)) + & ((xoord(l,k),l=1,3),k=1,nres), + & ((xoord(l,k),l=1,3),k=nres+1,nres+nct-nnt+1), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & rpotE+0.0d0,efree,rmsdev,(rprop(i)+0.0d0,i=1,nQ), + & iset,iib,iparm + else if (hamil_rep) then + write(ientout,rec=ll(islice)) + & ((xoord(l,k),l=1,3),k=1,nres), + & ((xoord(l,k),l=1,3),k=nres+1,nres+nct-nnt+1), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & rpotE+0.0d0,efree,rmsdev,(rprop(i)+0.0d0,i=1,nQ), + & iR,iib,iset + else + write(ientout,rec=ll(islice)) + & ((xoord(l,k),l=1,3),k=1,nres), + & ((xoord(l,k),l=1,3),k=nres+1,nres+nct-nnt+1), + & nss,(ihpb(k),jhpb(k),k=1,nss), + & rpotE+0.0d0,efree,rmsdev,(rprop(i)+0.0d0,i=1,nQ), + & iR,iib,iparm + endif +#ifdef DEBUG + call int_from_cart1(.false.) + write (iout,*) "Writing conformation, record",ll(islice) + write (iout,*) "Cartesian coordinates" + write (iout,'(8f10.5)') ((c(j,i),j=1,3),i=1,nres) + write (iout,'(8f10.5)') ((c(j,i+nres),j=1,3),i=nnt,nct) + write (iout,*) "Internal coordinates" + write (iout,'(8f10.4)') (vbld(k),k=nnt+1,nct) + write (iout,'(8f10.4)') (vbld(k),k=nres+nnt,nres+nct) + write (iout,'(8f10.4)') (rad2deg*theta(k),k=3,nres) + write (iout,'(8f10.4)') (rad2deg*phi(k),k=4,nres) + write (iout,'(8f10.4)') (rad2deg*alph(k),k=2,nres-1) + write (iout,'(8f10.4)') (rad2deg*omeg(k),k=2,nres-1) + write (iout,'(16i5)') nss,(ihpb(k),jhpb(k),k=1,nss) +c write (iout,'(8f10.5)') (rprop(j),j=1,nQ) + write (iout,'(16i5)') iscor + call flush(iout) +#endif + endif + endif + + 112 continue + + enddo + close(ientout) +#if (defined(AIX) && !defined(JUBL)) + call xdrfclose_(ixdrf, iret) +#else + call xdrfclose(ixdrf, iret) +#endif + write (iout,'(i10," trajectories found in file.")') ntraj+1 + write (iout,'(a)') "Numbers of steps in trajectories:" + write (iout,'(8i10)') (nstep(i),i=0,ntraj) + write (iout,*) ii," conformations read from file", + & nazwa(:ilen(nazwa)) + do islice=1,nslice + write (iout,*) mm(islice)," conformations read so far, slice", + & islice + write (iout,*) ll(islice), + & " conformations stored so far, slice",islice + enddo + call flush(iout) + return + end diff --git a/source/wham/src/readrtns.F.orig b/source/wham/src/readrtns.F.orig new file mode 100644 index 0000000..fa86e6f --- /dev/null +++ b/source/wham/src/readrtns.F.orig @@ -0,0 +1,779 @@ + subroutine read_general_data(*) + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" + include "COMMON.TORSION" + include "COMMON.INTERACT" + include "COMMON.IOUNITS" + include "COMMON.TIME1" + include "COMMON.PROT" + include "COMMON.PROTFILES" + include "COMMON.CHAIN" + include "COMMON.NAMES" + include "COMMON.FFIELD" + include "COMMON.ENEPS" + include "COMMON.WEIGHTS" + include "COMMON.FREE" + include "COMMON.CONTROL" + include "COMMON.ENERGIES" + character*800 controlcard + integer i,j,k,ii,n_ene_found + integer ind,itype1,itype2,itypf,itypsc,itypp + integer ilen + external ilen + character*16 ucase + character*16 key + external ucase + + call card_concat(controlcard,.true.) + call readi(controlcard,"N_ENE",n_ene,max_ene) + if (n_ene.gt.max_ene) then + write (iout,*) "Error: parameter out of range: N_ENE",n_ene, + & max_ene + return1 + endif + call readi(controlcard,"NPARMSET",nparmset,1) + separate_parset = index(controlcard,"SEPARATE_PARSET").gt.0 + call readi(controlcard,"IPARMPRINT",iparmprint,1) + write (iout,*) "PARMPRINT",iparmprint + if (nparmset.gt.max_parm) then + write (iout,*) "Error: parameter out of range: NPARMSET", + & nparmset, Max_Parm + return1 + endif + call readi(controlcard,"MAXIT",maxit,5000) + call reada(controlcard,"FIMIN",fimin,1.0d-3) + call readi(controlcard,"ENSEMBLES",ensembles,0) + hamil_rep=index(controlcard,"HAMIL_REP").gt.0 + write (iout,*) "Number of energy parameter sets",nparmset + call multreadi(controlcard,"ISAMPL",isampl,nparmset,1) + write (iout,*) "MaxSlice",MaxSlice + call readi(controlcard,"NSLICE",nslice,1) + call flush(iout) + if (nslice.gt.MaxSlice) then + write (iout,*) "Error: parameter out of range: NSLICE",nslice, + & MaxSlice + return1 + endif + write (iout,*) "Frequency of storing conformations", + & (isampl(i),i=1,nparmset) + write (iout,*) "Maxit",maxit," Fimin",fimin + call readi(controlcard,"NQ",nQ,1) + if (nQ.gt.MaxQ) then + write (iout,*) "Error: parameter out of range: NQ",nq, + & maxq + return1 + endif + indpdb=0 + if (index(controlcard,"CLASSIFY").gt.0) indpdb=1 + call reada(controlcard,"DELTA",delta,1.0d-2) + call readi(controlcard,"EINICHECK",einicheck,2) + call reada(controlcard,"DELTRMS",deltrms,5.0d-2) + call readi(controlcard,"NGRIDT",NGridT,400) + call reada(controlcard,"STARTGRIDT",StartGridT,200.0d0) + call reada(controlcard,"DELTA_T",Delta_T,1.0d0) + call reada(controlcard,"DELTRGY",deltrgy,5.0d-2) + call readi(controlcard,"RESCALE",rescale_mode,1) + check_conf=index(controlcard,"NO_CHECK_CONF").eq.0 + write (iout,*) "delta",delta + write (iout,*) "einicheck",einicheck + write (iout,*) "rescale_mode",rescale_mode + call flush(iout) + bxfile=index(controlcard,"BXFILE").gt.0 + cxfile=index(controlcard,"CXFILE").gt.0 + if (nslice .eq. 1 .and. .not.bxfile .and. .not.cxfile) + & bxfile=.true. + histfile=index(controlcard,"HISTFILE").gt.0 + histout=index(controlcard,"HISTOUT").gt.0 + entfile=index(controlcard,"ENTFILE").gt.0 + zscfile=index(controlcard,"ZSCFILE").gt.0 + with_dihed_constr = index(controlcard,"WITH_DIHED_CONSTR").gt.0 + call readi(controlcard,'CONSTR_DIST',constr_dist,0) + write (iout,*) "with_dihed_constr ",with_dihed_constr, + & " CONSTR_DIST",constr_dist + refstr = index(controlcard,'REFSTR').gt.0 + pdbref = index(controlcard,'PDBREF').gt.0 + call flush(iout) + return + end +c------------------------------------------------------------------------------ + subroutine read_efree(*) +C +C Read molecular data +C + implicit none + include 'DIMENSIONS' + include 'DIMENSIONS.ZSCOPT' + include 'DIMENSIONS.COMPAR' + include 'DIMENSIONS.FREE' + include 'COMMON.IOUNITS' + include 'COMMON.TIME1' + include 'COMMON.SBRIDGE' + include 'COMMON.CONTROL' + include 'COMMON.CHAIN' + include 'COMMON.HEADER' + include 'COMMON.GEO' + include 'COMMON.FREE' + character*320 controlcard,ucase + integer iparm,ib,i,j,npars + integer ilen + external ilen + + if (hamil_rep) then + npars=1 + else + npars=nParmSet + endif + + do iparm=1,npars + + call card_concat(controlcard,.true.) + call readi(controlcard,'NT',nT_h(iparm),1) + write (iout,*) "iparm",iparm," nt",nT_h(iparm) + call flush(iout) + if (nT_h(iparm).gt.MaxT_h) then + write (iout,*) "Error: parameter out of range: NT",nT_h(iparm), + & MaxT_h + return1 + endif + replica(iparm)=index(controlcard,"REPLICA").gt.0 + umbrella(iparm)=index(controlcard,"UMBRELLA").gt.0 + read_iset(iparm)=index(controlcard,"READ_ISET").gt.0 + write (iout,*) "nQ",nQ," nT",nT_h(iparm)," replica ", + & replica(iparm)," umbrella ",umbrella(iparm), + & " read_iset",read_iset(iparm) + call flush(iout) + do ib=1,nT_h(iparm) + call card_concat(controlcard,.true.) + call readi(controlcard,'NR',nR(ib,iparm),1) + if (umbrella(iparm)) then + nRR(ib,iparm)=1 + else + nRR(ib,iparm)=nR(ib,iparm) + endif + if (nR(ib,iparm).gt.MaxR) then + write (iout,*) "Error: parameter out of range: NR", + & nR(ib,iparm),MaxR + return1 + endif + call reada(controlcard,'TEMP',beta_h(ib,iparm),298.0d0) + beta_h(ib,iparm)=1.0d0/(beta_h(ib,iparm)*1.987D-3) + call multreada(controlcard,'FI',f(1,ib,iparm),nR(ib,iparm), + & 0.0d0) + do i=1,nR(ib,iparm) + call card_concat(controlcard,.true.) + call multreada(controlcard,'KH',KH(1,i,ib,iparm),nQ, + & 100.0d0) + call multreada(controlcard,'Q0',Q0(1,i,ib,iparm),nQ, + & 0.0d0) + enddo + enddo + do ib=1,nT_h(iparm) + write (iout,*) "ib",ib," beta_h", + & 1.0d0/(0.001987*beta_h(ib,iparm)) + write (iout,*) "nR",nR(ib,iparm) + write (iout,*) "fi",(f(i,ib,iparm),i=1,nR(ib,iparm)) + do i=1,nR(ib,iparm) + write (iout,*) "i",i," Kh",(Kh(j,i,ib,iparm),j=1,nQ), + & "q0",(q0(j,i,ib,iparm),j=1,nQ) + enddo + call flush(iout) + enddo + + enddo + + if (hamil_rep) then + + do iparm=2,nParmSet + nT_h(iparm)=nT_h(1) + do ib=1,nT_h(iparm) + nR(ib,iparm)=nR(ib,1) + if (umbrella(iparm)) then + nRR(ib,iparm)=1 + else + nRR(ib,iparm)=nR(ib,1) + endif + beta_h(ib,iparm)=beta_h(ib,1) + do i=1,nR(ib,iparm) + f(i,ib,iparm)=f(i,ib,1) + do j=1,nQ + KH(j,i,ib,iparm)=KH(j,i,ib,1) + Q0(j,i,ib,iparm)=Q0(j,i,ib,1) + enddo + enddo + replica(iparm)=replica(1) + umbrella(iparm)=umbrella(1) + read_iset(iparm)=read_iset(1) + enddo + enddo + + endif + + return + end +c----------------------------------------------------------------------------- + subroutine read_protein_data(*) + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" +#ifdef MPI + include "mpif.h" + integer IERROR,ERRCODE,STATUS(MPI_STATUS_SIZE) + include "COMMON.MPI" +#endif + include "COMMON.CHAIN" + include "COMMON.IOUNITS" + include "COMMON.PROT" + include "COMMON.PROTFILES" + include "COMMON.NAMES" + include "COMMON.FREE" + include "COMMON.OBCINKA" + character*64 nazwa + character*16000 controlcard + integer i,ii,ib,iR,iparm,ilen,iroof,nthr,npars + external ilen,iroof + if (hamil_rep) then + npars=1 + else + npars=nparmset + endif + + do iparm=1,npars + +C Read names of files with conformation data. + if (replica(iparm)) then + nthr = 1 + else + nthr = nT_h(iparm) + endif + do ib=1,nthr + do ii=1,nRR(ib,iparm) + write (iout,*) "Parameter set",iparm," temperature",ib, + & " window",ii + call flush(iout) + call card_concat(controlcard,.true.) + write (iout,*) controlcard(:ilen(controlcard)) + call readi(controlcard,"NFILE_BIN",nfile_bin(ii,ib,iparm),0) + call readi(controlcard,"NFILE_ASC",nfile_asc(ii,ib,iparm),0) + call readi(controlcard,"NFILE_CX",nfile_cx(ii,ib,iparm),0) + call readi(controlcard,"REC_START",rec_start(ii,ib,iparm),1) + call readi(controlcard,"REC_END",rec_end(ii,ib,iparm), + & maxstr*isampl(iparm)+rec_start(ii,ib,iparm)-1) + call reada(controlcard,"TIME_START", + & time_start_collect(ii,ib,iparm),0.0d0) + call reada(controlcard,"TIME_END",time_end_collect(ii,ib,iparm), + & 1.0d10) + write (iout,*) "rec_start",rec_start(ii,ib,iparm), + & " rec_end",rec_end(ii,ib,iparm) + write (iout,*) "time_start",time_start_collect(ii,ib,iparm), + & " time_end",time_end_collect(ii,ib,iparm) + call flush(iout) + if (replica(iparm)) then + call readi(controlcard,"TOTRAJ",totraj(ii,iparm),1) + write (iout,*) "Number of trajectories",totraj(ii,iparm) + call flush(iout) + endif + if (nfile_bin(ii,ib,iparm).lt.2 + & .and. nfile_asc(ii,ib,iparm).eq.0 + & .and. nfile_cx(ii,ib,iparm).eq.0) then + write (iout,*) "Error - no action specified!" + return1 + endif + if (nfile_bin(ii,ib,iparm).gt.0) then + call card_concat(controlcard,.false.) + call split_string(controlcard,protfiles(1,1,ii,ib,iparm), + & maxfile_prot,nfile_bin(ii,ib,iparm)) +#ifdef DEBUG + write(iout,*)"nfile_bin",nfile_bin(ii,ib,iparm) + write(iout,*) (protfiles(i,1,ii,ib,iparm), + & i=1,nfile_bin(ii,ib,iparm)) +#endif + endif + if (nfile_asc(ii,ib,iparm).gt.0) then + call card_concat(controlcard,.false.) + call split_string(controlcard,protfiles(1,2,ii,ib,iparm), + & maxfile_prot,nfile_asc(ii,ib,iparm)) +#ifdef DEBUG + write(iout,*) "nfile_asc(ii,ib,iparm)",nfile_asc(ii,ib,iparm) + write(iout,*) (protfiles(i,2,ii,ib,iparm), + & i=1,nfile_asc(ii,ib,iparm)) +#endif + else if (nfile_cx(ii,ib,iparm).gt.0) then + call card_concat(controlcard,.false.) + call split_string(controlcard,protfiles(1,2,ii,ib,iparm), + & maxfile_prot,nfile_cx(ii,ib,iparm)) +#ifdef DEBUG + write(iout,*) "nfile_cx(ii,ib,iparm)",nfile_cx(ii,ib,iparm) + write(iout,*) (protfiles(i,2,ii,ib,iparm), + & i=1,nfile_cx(ii,ib,iparm)) +#endif + endif + call flush(iout) + enddo + enddo + + enddo + + return + end +c------------------------------------------------------------------------------- + subroutine opentmp(islice,iunit,bprotfile_temp) + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" +#ifdef MPI + include "mpif.h" + integer IERROR,ERRCODE,STATUS(MPI_STATUS_SIZE) + include "COMMON.MPI" +#endif + include "COMMON.IOUNITS" + include "COMMON.PROTFILES" + include "COMMON.PROT" + include "COMMON.FREE" + character*64 bprotfile_temp + character*3 liczba,liczba2 + character*2 liczba1 + integer iunit,islice + integer ilen,iroof + external ilen,iroof + logical lerr + + write (liczba1,'(bz,i2.2)') islice + write (liczba,'(bz,i3.3)') me +#ifdef MPI +c write (iout,*) "separate_parset ",separate_parset, +c & " myparm",myparm + if (separate_parset) then + write (liczba2,'(bz,i3.3)') myparm + bprotfile_temp = scratchdir(:ilen(scratchdir))//"/"// + & prefix(:ilen(prefix))//liczba//"_"//liczba2//".xbin.tmp"//liczba1 + open (iunit,file=bprotfile_temp,status="unknown", + & form="unformatted",access="direct",recl=lenrec) + else + bprotfile_temp = scratchdir(:ilen(scratchdir))//"/"// + & prefix(:ilen(prefix))//liczba//".xbin.tmp"//liczba1 + open (iunit,file=bprotfile_temp,status="unknown", + & form="unformatted",access="direct",recl=lenrec) + endif +#else + bprotfile_temp = scratchdir(:ilen(scratchdir))// + & "/"//prefix(:ilen(prefix))//".xbin.tmp"//liczba1 + open (iunit,file=bprotfile_temp,status="unknown", + & form="unformatted",access="direct",recl=lenrec) +#endif +c write (iout,*) "OpenTmp iunit",iunit," bprotfile_temp", +c & bprotfile_temp +c call flush(iout) + return + end +c------------------------------------------------------------------------------- + subroutine read_database(*) + implicit none + include "DIMENSIONS" + include "DIMENSIONS.ZSCOPT" + include "DIMENSIONS.FREE" +#ifdef MPI + include "mpif.h" + integer IERROR,ERRCODE,STATUS(MPI_STATUS_SIZE) + include "COMMON.MPI" +#endif + include "COMMON.CHAIN" + include "COMMON.IOUNITS" + include "COMMON.PROTFILES" + include "COMMON.NAMES" + include "COMMON.VAR" + include "COMMON.GEO" + include "COMMON.ENEPS" + include "COMMON.PROT" + include "COMMON.INTERACT" + include "COMMON.FREE" + include "COMMON.SBRIDGE" + include "COMMON.OBCINKA" + real*4 csingle(3,maxres2) + character*64 nazwa,bprotfile_temp + character*3 liczba + character*2 liczba1 + integer i,j,ii,jj(maxslice),k,kk(maxslice),l, + & ll(maxslice),mm(maxslice),if + integer nrec,nlines,iscor,iunit,islice + double precision energ + integer ilen,iroof + external ilen,iroof + double precision rmsdev,energia(0:max_ene),efree,eini,temp + double precision prop(maxQ) + integer ntot_all(maxslice,0:maxprocs-1) + integer iparm,ib,iib,ir,nprop,nthr,npars + double precision etot,time + integer ixdrf,iret + logical lerr,linit + + lenrec1=12*(nres+nct-nnt+1)+4*(2*nss+2)+24 + lenrec2=12*(nres+nct-nnt+1)+4*(2*nss+2)+24+8*nQ + lenrec=lenrec2+8 + write (iout,*) "lenrec",lenrec," lenrec1",lenrec1, + & " lenrec2",lenrec2 + + write (iout,*) "nparmset",nparmset + if (hamil_rep) then + npars=1 + else + npars=nparmset + endif + do iparm=1,npars + + if (replica(iparm)) then + nthr = 1 + else + nthr = nT_h(iparm) + endif + + do i=1,nQ + prop(i)=0.0d0 + enddo + do islice=1,nslice + ll(islice)=0 + mm(islice)=0 + enddo + + do ib=1,nthr + do iR=1,nRR(ib,iparm) + + write (iout,*) "iparm",iparm," ib",ib," iR",iR," nQ",nQ + do islice=1,nslice + jj(islice)=0 + kk(islice)=0 + enddo + + IF (NFILE_BIN(iR,ib,iparm).GT.0) THEN +c Read conformations from binary DA files (one per batch) and write them to +c a binary DA scratchfile. + write (liczba,'(bz,i3.3)') me + do if=1,nfile_bin(iR,ib,iparm) + nazwa=protfiles(if,1,iR,ib,iparm) + & (:ilen(protfiles(if,1,iR,ib,iparm)))//".bx" + open (ientin,file=nazwa,status="old",form="unformatted", + & access="direct",recl=lenrec2,err=1111) + ii=0 + do islice=1,nslice + call opentmp(islice,ientout,bprotfile_temp) + call bxread(nazwa,ii,jj(islice),kk(islice),ll(islice), + & mm(islice),iR,ib,iparm) + close(ientout) + enddo + close(ientin) + enddo + ENDIF ! NFILE_BIN>0 +c + IF (NFILE_ASC(iR,ib,iparm).GT.0) THEN +c Read conformations from multiple ASCII int files and write them to a binary +c DA scratchfile. + do if=1,nfile_asc(iR,ib,iparm) + nazwa=protfiles(if,2,iR,ib,iparm) + & (:ilen(protfiles(if,2,iR,ib,iparm)))//".x" + open(unit=ientin,file=nazwa,status='old',err=1111) + write(iout,*) "reading ",nazwa(:ilen(nazwa)) + ii=0 + call xread(nazwa,ii,jj,kk,ll,mm,iR,ib,iparm) + enddo ! if + ENDIF + IF (NFILE_CX(iR,ib,iparm).gt.0) THEN +c Read conformations from cx files and write them to a binary +c DA scratchfile. + do if=1,nfile_cx(iR,ib,iparm) + nazwa=protfiles(if,2,iR,ib,iparm) + & (:ilen(protfiles(if,2,iR,ib,iparm)))//".cx" + write(iout,*) "reading ",nazwa(:ilen(nazwa)) + ii=0 + print *,"Calling cxread" + call cxread(nazwa,ii,jj,kk,ll,mm,iR,ib,iparm, + & *1111) + close(ientout) + write (iout,*) "exit cxread" + call flush(iout) + enddo + ENDIF + + do islice=1,nslice + stot(islice)=stot(islice)+jj(islice) + enddo + + enddo + enddo + write (iout,*) "IPARM",iparm + enddo + + if (nslice.eq.1) then +#ifdef MPI + write (liczba,'(bz,i3.3)') me + bprotfile_temp = scratchdir(:ilen(scratchdir))//"/"// + & prefix(:ilen(prefix))//liczba//".xbin.tmp" +#else + bprotfile_temp = scratchdir(:ilen(scratchdir))// + & "/"//prefix(:ilen(prefix))//".xbin.tmp" +#endif + write(iout,*) mm(1)," conformations read",ll(1), + & " conformations written to ", + & bprotfile_temp(:ilen(bprotfile_temp)) + else + do islice=1,nslice + write (liczba1,'(bz,i2.2)') islice +#ifdef MPI + write (liczba,'(bz,i3.3)') me + bprotfile_temp = scratchdir(:ilen(scratchdir))//"/"// + & prefix(:ilen(prefix))//liczba//".xbin.tmp"//liczba1 +#else + bprotfile_temp = scratchdir(:ilen(scratchdir))// + & "/"//prefix(:ilen(prefix))//".xbin.tmp"//liczba1 +#endif + write(iout,*) mm(islice)," conformations read",ll(islice), + & " conformations written to ", + & bprotfile_temp(:ilen(bprotfile_temp)) + enddo + endif + +#ifdef MPI +c Check if everyone has the same number of conformations + call MPI_Allgather(stot(1),maxslice,MPI_INTEGER, + & ntot_all(1,0),maxslice,MPI_INTEGER,MPI_Comm_World,IERROR) + lerr=.false. + do i=0,nprocs-1 + if (i.ne.me) then + do islice=1,nslice + if (stot(islice).ne.ntot_all(islice,i)) then + write (iout,*) "Number of conformations at processor",i, + & " differs from that at processor",me, + & stot(islice),ntot_all(islice,i)," slice",islice + lerr = .true. + endif + enddo + endif + enddo + if (lerr) then + write (iout,*) + write (iout,*) "Numbers of conformations read by processors" + write (iout,*) + do i=0,nprocs-1 + write (iout,'(8i10)') i,(ntot_all(islice,i),islice=1,nslice) + enddo + write (iout,*) "Calculation terminated." + call flush(iout) + return1 + endif + do islice=1,nslice + ntot(islice)=stot(islice) + enddo + return +#endif + 1111 write(iout,*) "Error opening coordinate file ",nazwa(:ilen(nazwa)) + call flush(iout) + return1 + end +c------------------------------------------------------------------------------ + subroutine card_concat(card,to_upper) + implicit none + include 'DIMENSIONS.ZSCOPT' + include "COMMON.IOUNITS" + character*(*) card + character*80 karta,ucase + logical to_upper + integer ilen + external ilen + read (inp,'(a)') karta + if (to_upper) karta=ucase(karta) + card=' ' + do while (karta(80:80).eq.'&') + card=card(:ilen(card)+1)//karta(:79) + read (inp,'(a)') karta + if (to_upper) karta=ucase(karta) + enddo + card=card(:ilen(card)+1)//karta + return + end +c------------------------------------------------------------------------------ + subroutine readi(rekord,lancuch,wartosc,default) + implicit none + character*(*) rekord,lancuch + integer wartosc,default + integer ilen,iread + external ilen + iread=index(rekord,lancuch(:ilen(lancuch))//"=") + if (iread.eq.0) then + wartosc=default + return + endif + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*) wartosc + return + end +c---------------------------------------------------------------------------- + subroutine reada(rekord,lancuch,wartosc,default) + implicit none + character*(*) rekord,lancuch + character*80 aux + double precision wartosc,default + integer ilen,iread + external ilen + iread=index(rekord,lancuch(:ilen(lancuch))//"=") + if (iread.eq.0) then + wartosc=default + return + endif + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*) wartosc + return + end +c---------------------------------------------------------------------------- + subroutine multreadi(rekord,lancuch,tablica,dim,default) + implicit none + integer dim,i + integer tablica(dim),default + character*(*) rekord,lancuch + character*80 aux + integer ilen,iread + external ilen + do i=1,dim + tablica(i)=default + enddo + iread=index(rekord,lancuch(:ilen(lancuch))//"=") + if (iread.eq.0) return + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim) + 10 return + end +c---------------------------------------------------------------------------- + subroutine multreada(rekord,lancuch,tablica,dim,default) + implicit none + integer dim,i + double precision tablica(dim),default + character*(*) rekord,lancuch + character*80 aux + integer ilen,iread + external ilen + do i=1,dim + tablica(i)=default + enddo + iread=index(rekord,lancuch(:ilen(lancuch))//"=") + if (iread.eq.0) return + iread=iread+ilen(lancuch)+1 + read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim) + 10 return + end +c---------------------------------------------------------------------------- + subroutine reads(rekord,lancuch,wartosc,default) + implicit none + character*(*) rekord,lancuch,wartosc,default + character*80 aux + integer ilen,lenlan,lenrec,iread,ireade + external ilen + logical iblnk + external iblnk + lenlan=ilen(lancuch) + lenrec=ilen(rekord) + iread=index(rekord,lancuch(:lenlan)//"=") +c print *,"rekord",rekord," lancuch",lancuch +c print *,"iread",iread," lenlan",lenlan," lenrec",lenrec + if (iread.eq.0) then + wartosc=default + return + endif + iread=iread+lenlan+1 +c print *,"iread",iread +c print *,"|",rekord(iread:iread),"|",iblnk(rekord(iread:iread)) + do while (iread.le.lenrec .and. iblnk(rekord(iread:iread))) + iread=iread+1 +c print *,"|",rekord(iread:iread),"|",iblnk(rekord(iread:iread)) + enddo +c print *,"iread",iread + if (iread.gt.lenrec) then + wartosc=default + return + endif + ireade=iread+1 +c print *,"ireade",ireade + do while (ireade.lt.lenrec .and. + & .not.iblnk(rekord(ireade:ireade))) + ireade=ireade+1 + enddo + wartosc=rekord(iread:ireade) + return + end +c---------------------------------------------------------------------------- + subroutine multreads(rekord,lancuch,tablica,dim,default) + implicit none + integer dim,i + character*(*) rekord,lancuch,tablica(dim),default + character*80 aux + integer ilen,lenlan,lenrec,iread,ireade + external ilen + logical iblnk + external iblnk + do i=1,dim + tablica(i)=default + enddo + lenlan=ilen(lancuch) + lenrec=ilen(rekord) + iread=index(rekord,lancuch(:lenlan)//"=") +c print *,"rekord",rekord," lancuch",lancuch +c print *,"iread",iread," lenlan",lenlan," lenrec",lenrec + if (iread.eq.0) return + iread=iread+lenlan+1 + do i=1,dim +c print *,"iread",iread +c print *,"|",rekord(iread:iread),"|",iblnk(rekord(iread:iread)) + do while (iread.le.lenrec .and. iblnk(rekord(iread:iread))) + iread=iread+1 +c print *,"|",rekord(iread:iread),"|",iblnk(rekord(iread:iread)) + enddo +c print *,"iread",iread + if (iread.gt.lenrec) return + ireade=iread+1 +c print *,"ireade",ireade + do while (ireade.lt.lenrec .and. + & .not.iblnk(rekord(ireade:ireade))) + ireade=ireade+1 + enddo + tablica(i)=rekord(iread:ireade) + iread=ireade+1 + enddo + end +c---------------------------------------------------------------------------- + subroutine split_string(rekord,tablica,dim,nsub) + implicit none + integer dim,nsub,i,ii,ll,kk + character*(*) tablica(dim) + character*(*) rekord + integer ilen + external ilen + do i=1,dim + tablica(i)=" " + enddo + ii=1 + ll = ilen(rekord) + nsub=0 + do i=1,dim +C Find the start of term name + kk = 0 + do while (ii.le.ll .and. rekord(ii:ii).eq." ") + ii = ii+1 + enddo +C Parse the name into TABLICA(i) until blank found + do while (ii.le.ll .and. rekord(ii:ii).ne." ") + kk = kk+1 + tablica(i)(kk:kk)=rekord(ii:ii) + ii = ii+1 + enddo + if (kk.gt.0) nsub=nsub+1 + if (ii.gt.ll) return + enddo + return + end +c-------------------------------------------------------------------------------- + integer function iroof(n,m) + ii = n/m + if (ii*m .lt. n) ii=ii+1 + iroof = ii + return + end -- 1.7.9.5

1uVQURm`2(A9>>B^1@ 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/bin/unres/MD/unres_mchain-ifort_MPICH_GAB-NEWC.exe b/bin/unres/MD/unres_mchain-ifort_MPICH_GAB-NEWC.exe new file mode 100755 index 0000000000000000000000000000000000000000..18c2578d5213604a12c6ebd21ad6b09e552ce70a GIT binary patch literal 6852147 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ⅅM{;*O-xO_8MpYh+gAt^!?75&*mt(I?TCB_3AZf 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